diff --git a/gladeui/glade-signal-editor.c b/gladeui/glade-signal-editor.c
index 6647336..8ab2e73 100644
--- a/gladeui/glade-signal-editor.c
+++ b/gladeui/glade-signal-editor.c
@@ -66,6 +66,8 @@ struct _GladeSignalEditorPrivate
   GtkTreeViewColumn* column_after;
 
   GtkCellRenderer* renderer_userdata;
+  
+  GtkListStore* handler_completion_store;
 };
 
 enum
@@ -74,6 +76,12 @@ enum
   LAST_SIGNAL
 };
 
+enum
+{
+  PROP_0,
+  PROP_HANDLER_COMPLETION
+};
+
 static guint glade_signal_editor_signals[LAST_SIGNAL] = { 0 };
 
 /* Utils */
@@ -179,6 +187,51 @@ on_handler_edited (GtkCellRendererText* renderer,
 }
 
 static void
+glade_signal_editor_handler_store_update (GladeSignalEditor *editor,
+					  const gchar *signal_name,
+					  GtkListStore *store)
+{
+  GladeSignalEditorPrivate *priv = editor->priv;
+
+  const gchar *handlers[] = {"gtk_widget_show",
+                             "gtk_widget_hide",
+                             "gtk_widget_grab_focus",
+                             "gtk_widget_destroy",
+                             "gtk_true",
+                             "gtk_false",
+                             "gtk_main_quit",
+                             NULL};
+
+  GtkTreeIter tmp_iter;
+  gint i;
+  gchar *handler, *signal, *name;
+
+  name = (gchar *) glade_widget_get_name (priv->widget);
+
+  signal = g_strdup (signal_name);
+  glade_util_replace (signal, '-', '_');
+
+  gtk_list_store_clear (store);
+
+  gtk_list_store_append (store, &tmp_iter);
+  handler = g_strdup_printf ("on_%s_%s", name, signal);
+  gtk_list_store_set (store, &tmp_iter, 0, handler, -1);
+  g_free (handler);
+
+  gtk_list_store_append (store, &tmp_iter);
+  handler = g_strdup_printf ("%s_%s_cb", name, signal);
+  gtk_list_store_set (store, &tmp_iter, 0, handler, -1);
+  g_free (handler);
+
+  g_free (signal);
+  for (i = 0; handlers[i]; i++)
+  {
+    gtk_list_store_append (store, &tmp_iter);
+    gtk_list_store_set (store, &tmp_iter, 0, handlers[i], -1);
+  }
+}
+
+static void
 on_handler_editing_started (GtkCellRenderer* renderer,
                             GtkCellEditable* editable,
                             gchar* path,
@@ -186,6 +239,10 @@ on_handler_editing_started (GtkCellRenderer* renderer,
 {
   GladeSignalEditor* self = GLADE_SIGNAL_EDITOR(user_data);
   GtkTreePath* tree_path = gtk_tree_path_new_from_string (path);
+  GtkEntry *entry = GTK_ENTRY (editable);
+  GtkEntryCompletion *completion;
+  GtkListStore *store =  self->priv->handler_completion_store;
+  const gchar *signal_name = NULL;
 
   /* Remove the <Type here> */
   if (GTK_IS_ENTRY (editable))
@@ -200,13 +257,29 @@ on_handler_editing_started (GtkCellRenderer* renderer,
 			  &iter,
 			  GLADE_SIGNAL_COLUMN_SIGNAL, &signal,
 			  -1);
+      signal_name = glade_signal_get_name (signal);
       dummy = glade_signal_is_dummy (signal);
       if (dummy)
 	{
-	  gtk_entry_set_text (GTK_ENTRY (editable), "");
+	  gtk_entry_set_text (entry, "");
 	}
       g_object_unref (signal);
     }
+
+  if (!signal_name)
+    return;
+
+  glade_signal_editor_handler_store_update (self, signal_name, store);
+
+  completion = gtk_entry_completion_new ();
+  gtk_entry_completion_set_text_column (completion, 0);
+  gtk_entry_completion_set_minimum_key_length (completion, 0);
+  gtk_entry_completion_set_inline_completion (completion, FALSE);
+  gtk_entry_completion_set_inline_selection (completion, TRUE);
+  gtk_entry_completion_set_popup_completion (completion, TRUE);
+  gtk_entry_completion_set_model (completion, GTK_TREE_MODEL (store));
+
+  gtk_entry_set_completion (entry, completion);
   gtk_tree_path_free (tree_path);
 }
 
@@ -373,6 +446,45 @@ glade_signal_editor_devhelp (GtkCellRenderer * cell,
   g_object_unref (signal);
 }
 
+static void
+glade_signal_editor_get_property  (GObject      *object,
+				   guint         prop_id,
+				   GValue *value,
+				   GParamSpec   *pspec)
+{
+  GladeSignalEditor *self = GLADE_SIGNAL_EDITOR (object);
+  GladeSignalEditorPrivate *priv = self->priv;
+
+  switch (prop_id)
+  {
+  case PROP_HANDLER_COMPLETION:
+    g_value_set_object (value, priv->handler_completion_store);
+    break;
+  default:
+    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    break;
+  }
+}
+
+static void
+glade_signal_editor_set_property  (GObject      *object,
+				   guint         prop_id,
+				   const GValue *value,
+				   GParamSpec   *pspec)
+{
+  GladeSignalEditor *self = GLADE_SIGNAL_EDITOR (object);
+
+  switch (prop_id)
+  {
+  case PROP_HANDLER_COMPLETION:
+    glade_signal_editor_set_completion_store (self, g_value_get_object (value));
+    break;
+  default:
+    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+    break;
+  }
+}
+
 /**
  * glade_signal_editor_new:
  *
@@ -468,9 +580,19 @@ glade_signal_editor_enable_dnd (GladeSignalEditor *editor, gboolean enabled)
     }
 }
 
+void
+glade_signal_editor_set_completion_store (GladeSignalEditor *self, GtkListStore *store)
+{
+  g_object_unref (self->priv->handler_completion_store);
+  self->priv->handler_completion_store = store;
+}
+
 static void
 glade_signal_editor_dispose (GObject *object)
 {
+  GladeSignalEditor *self = GLADE_SIGNAL_EDITOR (object);
+  glade_signal_editor_set_completion_store (self, NULL);
+
   G_OBJECT_CLASS (glade_signal_editor_parent_class)->dispose (object);
 }
 
@@ -995,6 +1117,9 @@ glade_signal_editor_init (GladeSignalEditor *self)
 			  G_CALLBACK(glade_signal_editor_drag_begin),
 			  self);
 
+  /* Handler completion */
+  priv->handler_completion_store = gtk_list_store_new (1, G_TYPE_STRING);
+
   /* Emit created signal */
   g_signal_emit_by_name (glade_app_get(), "signal-editor-created", self);
 	
@@ -1009,6 +1134,8 @@ glade_signal_editor_class_init (GladeSignalEditorClass *klass)
   glade_signal_editor_parent_class = g_type_class_peek_parent (klass);
 
   object_class = G_OBJECT_CLASS (klass);
+  object_class->get_property = glade_signal_editor_get_property;
+  object_class->set_property = glade_signal_editor_set_property;
   object_class->dispose = glade_signal_editor_dispose;
 
   g_type_class_add_private (klass, sizeof (GladeSignalEditorPrivate));
@@ -1028,4 +1155,14 @@ glade_signal_editor_class_init (GladeSignalEditorClass *klass)
                     G_TYPE_NONE, 1,
 				    GLADE_TYPE_SIGNAL /* Signal data formatted string */
 				    );
+
+
+  g_object_class_install_property (object_class,
+                                   PROP_HANDLER_COMPLETION,
+                                   g_param_spec_object ("handler-completion",
+	                                                NULL,
+	                                                NULL,
+	                                                GTK_TYPE_TREE_MODEL,
+	                                                G_PARAM_READABLE |
+	                                                G_PARAM_WRITABLE));
 }
diff --git a/gladeui/glade-signal-editor.h b/gladeui/glade-signal-editor.h
index 558e3d2..b72b689 100644
--- a/gladeui/glade-signal-editor.h
+++ b/gladeui/glade-signal-editor.h
@@ -46,6 +46,9 @@ void               glade_signal_editor_construct_signals_list (GladeSignalEditor
 void               glade_signal_editor_load_widget            (GladeSignalEditor *editor, 
 							       GladeWidget       *widget);
 GladeWidget       *glade_signal_editor_get_widget             (GladeSignalEditor *editor);
+void               glade_signal_editor_set_completion_store   (GladeSignalEditor *self,
+                                                               GtkListStore *store);
+
 
 void glade_signal_editor_enable_dnd (GladeSignalEditor *editor, gboolean enabled);
 
