---
 docs/reference/denemo/denemo-sections.txt |  4 --
 src/command/keyresponses.c                |  4 +-
 src/core/kbd-custom.c                     | 63 ++++++++++-------------
 src/core/kbd-custom.h                     |  2 -
 src/ui/kbd-interface.c                    |  2 -
 5 files changed, 28 insertions(+), 47 deletions(-)

diff --git a/docs/reference/denemo/denemo-sections.txt b/docs/reference/denemo/denemo-sections.txt
index fae0ef05f..2dedc4f98 100644
--- a/docs/reference/denemo/denemo-sections.txt
+++ b/docs/reference/denemo/denemo-sections.txt
@@ -745,9 +745,6 @@ free_jack_ports
 <SECTION>
 <FILE>kbd-custom</FILE>
 MASK_FILTER
-dnm_sanitize_key_event
-dnm_hyper_sanitize_key_event
-dnm_meta_sanitize_key_state
 isModifier
 dnm_accelerator_parse
 dnm_accelerator_name
@@ -804,7 +801,6 @@ command_has_binding
 add_keybinding_for_name
 add_keybinding_for_command
 update_all_labels
-dnm_clean_event
 add_twokeybinding_to_idx
 command_row_init
 keymap_get_command_row
diff --git a/src/command/keyresponses.c b/src/command/keyresponses.c
index 23543a911..e8cf23614 100644
--- a/src/command/keyresponses.c
+++ b/src/command/keyresponses.c
@@ -178,7 +178,7 @@ process_key_event (GdkEventKey * event, gchar * perform_command ())
     if (state || ((event->keyval == GDK_Caps_Lock) || (event->keyval == GDK_Num_Lock)))
       set_cursor_for (state);   // MUST LOOK AHEAD to state after keypress HERE CATCH modifiers and set the cursor for them.....
   }
-  dnm_clean_event (event);
+  dnm_sanitize_key_state (event);
   static guint last_keyval;
   gboolean repeated_key =  (event->keyval==last_keyval);
   last_keyval = event->keyval;
@@ -343,7 +343,7 @@ scorearea_keypress_event (GtkWidget * widget, GdkEventKey * event)
   //g_debug("State eored %x\n", (lock_mask(event->keyval)^event->state));
   if (divert_key_event && !isModifier (event) && divert_key_id == Denemo.project->id)
     {
-      dnm_clean_event (event);
+      dnm_sanitize_key_state (event);
       *divert_key_event = event;
       //g_object_ref(event); FIXME do we need to keep it around?
       gtk_main_quit ();
diff --git a/src/core/kbd-custom.c b/src/core/kbd-custom.c
index 53424527c..e0ccda216 100644
--- a/src/core/kbd-custom.c
+++ b/src/core/kbd-custom.c
@@ -140,39 +140,13 @@ get_or_create_command(gchar* name){
   return command;
 }
 
-
-void
-dnm_clean_event (GdkEventKey * event)
-{ 
-  if (!Denemo.prefs.strictshortcuts)
-    {
-      guint ret = event->keyval;
-      if (ret >= 'A' && ret <= 'Z')
-        ret += ('a' - 'A');
-#ifdef G_OS_WIN32
-      else
-        if (event->hardware_keycode>47 && event->hardware_keycode<58)
-          {
-            ret = event->hardware_keycode;
-          }
-#else
-      else
-        if (event->hardware_keycode>9 && event->hardware_keycode<20)
-          {
-            ret = 39 + event->hardware_keycode;
-            if (ret==58)
-              ret = 48;
-          }
-#endif
-      event->keyval = ret;
-    }
-  //g_print("Hardware key %d Key val has been cleaned to %d -> %s\n", event->hardware_keycode, event->keyval, gdk_keyval_name(event->keyval));
-}
-
-
-/* Returns the state of the event after removing the modifiers consumed by the
- * system and unwanted modifiers. Use this before doing anything based on the
- * (keyval, state) pair in an event handler.
+/* If Denemo.prefs.strictshortcuts is set, returns the state of the event after
+ * removing the modifiers consumed by the system and unwanted modifiers.
+ * Otherwise, returns the group 0, level 0 value of the key according to GDK.
+ * That is, all uppercase ASCII letters modified by shift become lowercase, and
+ * all number keys stick to the first level (i.e., the number, not the symbol).
+ * Use this before doing anything based on the (keyval, state) pair in an event 
+ * handler.
  */
 guint
 dnm_sanitize_key_state (GdkEventKey * event)
@@ -180,10 +154,26 @@ dnm_sanitize_key_state (GdkEventKey * event)
   guint ret = event->state;
   if (!Denemo.prefs.strictshortcuts)
     {
-      return ret;
+	// Declare variables for GDK return
+	gint n_entries;
+	GdkKeymapKey * keys = NULL;
+	guint * keyvals = NULL;
+
+	// Pass the event's hardware_keycode into GDK and get all matching
+	// key values
+	if (gdk_keymap_get_entries_for_keycode (gdk_keymap_get_default (),
+		event->hardware_keycode, &keys, &keyvals, &n_entries))
+	{
+	    // Take the level 0 key value and store it back in the event
+	    event->keyval = keyvals[0];
+	    g_free(keys);
+	    g_free(keyvals);
+	}
+
+	// Return unmodified event->state
+        return ret;
     }
 
-#if 1
   GdkModifierType consumed;
   /* We want to ignore irrelevant modifiers like ScrollLock */
 
@@ -192,7 +182,7 @@ dnm_sanitize_key_state (GdkEventKey * event)
   ret &= ~consumed;
   /* removing other unwanted modifiers from event->state */
   ret &= (GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK | GDK_MOD2_MASK | GDK_MOD3_MASK | GDK_MOD4_MASK | GDK_MOD5_MASK /*    these make numlock required to be off for example */ );
-#endif
+
   return ret;
 }
 
@@ -1348,7 +1338,6 @@ keymap_accel_quick_edit_snooper (GtkWidget * grab_widget, GdkEventKey * event, D
   //If the KeyEvent is only a modifier, stop processing here
   if (isModifier (event))
     return TRUE;
-  dnm_clean_event (event);
   modifiers = dnm_sanitize_key_state (event);
   keyval = event->keyval;
 
diff --git a/src/core/kbd-custom.h b/src/core/kbd-custom.h
index 14d359d39..f32c2ebf1 100644
--- a/src/core/kbd-custom.h
+++ b/src/core/kbd-custom.h
@@ -35,7 +35,6 @@ typedef struct _keyboard_dialog_data
   gint first_modifiers;
 } keyboard_dialog_data;
 
-guint dnm_sanitize_key_event (GdkEventKey * event);
 gboolean isModifier (GdkEventKey * event);
 
 //adapted from gtk because we want to allow uppercase accelerator through
@@ -151,7 +150,6 @@ gint add_keybinding_for_name (gchar * name, gchar * binding);
 gint add_keybinding_for_command (gint idx, gchar * binding);
 
 void update_all_labels (keymap * the_keymap);
-void dnm_clean_event (GdkEventKey * event);
 gint add_twokeybinding_to_idx (keymap * the_keymap, gint first_keyval, GdkModifierType first_state, gint keyval, GdkModifierType state, guint command_id, ListPosition pos);
 
 void command_row_init(command_row *command);
diff --git a/src/ui/kbd-interface.c b/src/ui/kbd-interface.c
index 566a5e258..f92d2441c 100644
--- a/src/ui/kbd-interface.c
+++ b/src/ui/kbd-interface.c
@@ -76,7 +76,6 @@ capture_add_binding (GtkWidget * widget, GdkEventKey * event, gpointer user_data
   //get the shortcut
   if (isModifier (event))
     return TRUE;
-  dnm_clean_event (event);
   modifiers = dnm_sanitize_key_state (event);
   gchar *name = dnm_accelerator_name (event->keyval, event->state);
   if (!strcmp(name, "VoidSymbol"))
@@ -161,7 +160,6 @@ capture_look_binding (GtkWidget * widget, GdkEventKey * event, gpointer user_dat
   //get the shortcut
   if (isModifier (event))
     return TRUE;
-  dnm_clean_event (event);
   modifiers = dnm_sanitize_key_state (event);
 
   //look for the keybinding
