diff --git a/gtk/gtkcombobox.c b/gtk/gtkcombobox.c
index c5e021f..41fcfd1 100644
--- a/gtk/gtkcombobox.c
+++ b/gtk/gtkcombobox.c
@@ -231,6 +231,8 @@ static void     gtk_combo_box_get_property         (GObject         *object,
 
 static void     gtk_combo_box_state_changed        (GtkWidget        *widget,
 			                            GtkStateType      previous);
+static gboolean gtk_combo_box_key_press_event      (GtkWidget        *widget,
+                                                    GdkEventKey      *event);
 static void     gtk_combo_box_grab_focus           (GtkWidget       *widget);
 static void     gtk_combo_box_style_set            (GtkWidget       *widget,
                                                     GtkStyle        *previous);
@@ -501,6 +503,7 @@ gtk_combo_box_class_init (GtkComboBoxClass *klass)
   widget_class->grab_focus = gtk_combo_box_grab_focus;
   widget_class->style_set = gtk_combo_box_style_set;
   widget_class->state_changed = gtk_combo_box_state_changed;
+  widget_class->key_press_event = gtk_combo_box_key_press_event;
 
   gtk_object_class = (GtkObjectClass *)klass;
   gtk_object_class->destroy = gtk_combo_box_destroy;
@@ -1092,6 +1095,49 @@ gtk_combo_box_state_changed (GtkWidget    *widget,
   gtk_widget_queue_draw (widget);
 }
 
+static gboolean
+gtk_combo_box_jump_to_character (GtkComboBox *combo_box,
+                                 guint        keyval)
+{
+  /* Jump to the column beginning with the typed character */
+  if (GTK_IS_LIST_STORE (combo_box->priv->model)
+    && gtk_tree_model_get_column_type (combo_box->priv->model, 0) == G_TYPE_STRING)
+    {
+      GtkTreeIter iter;
+      gboolean valid;
+
+      valid = gtk_tree_model_get_iter_first (combo_box->priv->model, &iter);
+      while (valid)
+        {
+          gchar *str;
+
+          gtk_tree_model_get (combo_box->priv->model, &iter, 0, &str, -1);
+
+          if (str && g_ascii_tolower (str[0]) == g_ascii_tolower (keyval))
+            {
+              g_free (str);
+              gtk_combo_box_set_active_iter (combo_box, &iter);
+              return TRUE;
+            }
+          g_free (str);
+          valid = gtk_tree_model_iter_next (combo_box->priv->model, &iter);
+        }
+    }
+
+  return FALSE;
+}
+
+static gboolean
+gtk_combo_box_key_press_event (GtkWidget   *widget,
+                               GdkEventKey *event)
+{
+  GtkComboBox *combo_box = GTK_COMBO_BOX (widget);
+
+  if (gtk_combo_box_jump_to_character (combo_box, event->keyval))
+    return TRUE;
+  return FALSE;
+}
+
 static void
 gtk_combo_box_button_state_changed (GtkWidget    *widget,
 				    GtkStateType  previous,
@@ -3971,6 +4017,9 @@ gtk_combo_box_menu_key_press (GtkWidget   *widget,
 {
   GtkComboBox *combo_box = GTK_COMBO_BOX (data);
 
+  if (gtk_combo_box_jump_to_character (combo_box, event->keyval))
+    return TRUE;
+
   if (!gtk_bindings_activate_event (GTK_OBJECT (widget), event))
     {
       /* The menu hasn't managed the
