diff --git a/gtk/gtkcontainer.c b/gtk/gtkcontainer.c
index 6bedc86..7e75e47 100644
--- a/gtk/gtkcontainer.c
+++ b/gtk/gtkcontainer.c
@@ -48,6 +48,8 @@ enum {
   REMOVE,
   CHECK_RESIZE,
   SET_FOCUS_CHILD,
+  CHILD_ADDED,
+  CHILD_REMOVED,
   LAST_SIGNAL
 };
 
@@ -291,6 +293,42 @@ gtk_container_class_init (GtkContainerClass *class)
 		  _gtk_marshal_VOID__OBJECT,
 		  G_TYPE_NONE, 1,
 		  GTK_TYPE_WIDGET);
+
+  /**
+   * GtkContainer::child-added:
+   * @container: the container which received the signal
+   * @child: the new #GtkWidget child which is added to the container.
+   *
+   * The ::child-added signal may be emitted when a widget is
+   * added to the container.
+   */
+  container_signals[CHILD_ADDED] =
+    g_signal_new (I_("child-added"),
+                  G_OBJECT_CLASS_TYPE (object_class),
+                  G_SIGNAL_RUN_LAST,
+                  0,
+                  NULL, NULL,
+                  _gtk_marshal_VOID__OBJECT,
+                  G_TYPE_NONE, 1,
+                  GTK_TYPE_WIDGET);
+
+  /**
+   * GtkContainer::child-removed:
+   * @container: the container which received the signal
+   * @child: the #GtkWidget child of @container which was removed.
+   *
+   * The ::child-removed signal may be emitted when a child widget is
+   * removed from a container.
+   */
+  container_signals[CHILD_REMOVED] =
+    g_signal_new (I_("child-removed"),
+                  G_OBJECT_CLASS_TYPE (object_class),
+                  G_SIGNAL_RUN_LAST,
+                  0,
+                  NULL, NULL,
+                  _gtk_marshal_VOID__OBJECT,
+                  G_TYPE_NONE, 1,
+                  GTK_TYPE_WIDGET);
 }
 
 static void
diff --git a/gtk/gtkmenushell.c b/gtk/gtkmenushell.c
index 339738e..9606c52 100644
--- a/gtk/gtkmenushell.c
+++ b/gtk/gtkmenushell.c
@@ -507,6 +507,8 @@ gtk_menu_shell_insert (GtkMenuShell *menu_shell,
 
   if (class->insert)
     class->insert (menu_shell, child, position);
+
+  g_signal_emit_by_name (menu_shell, "child-added", child);
 }
 
 static void
