diff --git a/gladeui/glade-signal-editor.c b/gladeui/glade-signal-editor.c
index 6647336..caac7eb 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
@@ -179,6 +181,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 +233,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,14 +251,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);
     }
-  gtk_tree_path_free (tree_path);
+
+  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);
 }
 
 static void
@@ -995,6 +1061,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);
 	
