diff --git a/clutter/clutter-container.c b/clutter/clutter-container.c
index 63b4eab47..3f2296da6 100644
--- a/clutter/clutter-container.c
+++ b/clutter/clutter-container.c
@@ -449,7 +449,10 @@ clutter_container_get_children (ClutterContainer *container)
  * @callback: a function to be called for each child
  * @user_data: data to be passed to the function, or %NULL
  *
- * Calls @callback for each child of @container.
+ * Calls @callback for each child of @container that was added
+ * by the application (with clutter_container_add_actor()). Does
+ * not iterate over "internal" children that are part of the
+ * container's own implementation, if any.
  *
  * Since: 0.4
  */
@@ -473,6 +476,41 @@ clutter_container_foreach (ClutterContainer *container,
   iface->foreach (container, callback, user_data);
 }
 
+/**
+ * clutter_container_foreach_with_internals:
+ * @container: a #ClutterContainer
+ * @callback: a function to be called for each child
+ * @user_data: data to be passed to the function, or %NULL
+ *
+ * Calls @callback for each child of @container, including "internal"
+ * children built in to the container itself that were never added
+ * by the application.
+ *
+ * Since: 1.0
+ */
+void
+clutter_container_foreach_with_internals (ClutterContainer *container,
+                                          ClutterCallback   callback,
+                                          gpointer          user_data)
+{
+  ClutterContainerIface *iface;
+
+  g_return_if_fail (CLUTTER_IS_CONTAINER (container));
+  g_return_if_fail (callback != NULL);
+
+  iface = CLUTTER_CONTAINER_GET_IFACE (container);
+  if (!iface->foreach)
+    {
+      CLUTTER_CONTAINER_WARN_NOT_IMPLEMENTED (container, "foreach");
+      return;
+    }
+
+  if (iface->foreach_with_internals != NULL)
+    iface->foreach_with_internals (container, callback, user_data);
+  else
+    iface->foreach (container, callback, user_data);
+}
+
 /**
  * clutter_container_raise_child:
  * @container: a #ClutterContainer
diff --git a/clutter/clutter-container.h b/clutter/clutter-container.h
index 68cbd71fd..dc1a60151 100644
--- a/clutter/clutter-container.h
+++ b/clutter/clutter-container.h
@@ -90,6 +90,10 @@ struct _ClutterContainerIface
                              ClutterCallback   callback,
                              gpointer          user_data);
 
+  void (* foreach_with_internals) (ClutterContainer *container,
+                                   ClutterCallback   callback,
+                                   gpointer          user_data);
+
   /* child stacking */
   void (* raise)            (ClutterContainer *container,
                              ClutterActor     *actor,
@@ -137,20 +141,22 @@ void          clutter_container_remove_actor     (ClutterContainer *container,
 void          clutter_container_remove_valist    (ClutterContainer *container,
                                                   ClutterActor     *first_actor,
                                                   va_list           var_args);
-GList *       clutter_container_get_children     (ClutterContainer *container);
-void          clutter_container_foreach          (ClutterContainer *container,
-                                                  ClutterCallback   callback,
-                                                  gpointer          user_data);
-ClutterActor *clutter_container_find_child_by_name (ClutterContainer *container,
-                                                    const gchar      *child_name);
-void          clutter_container_raise_child        (ClutterContainer *container,
-                                                    ClutterActor     *actor,
-                                                    ClutterActor     *sibling);
-void          clutter_container_lower_child        (ClutterContainer *container,
-                                                    ClutterActor     *actor,
-                                                    ClutterActor     *sibling);
-void          clutter_container_sort_depth_order   (ClutterContainer *container);
-
+GList *       clutter_container_get_children           (ClutterContainer *container);
+void          clutter_container_foreach                (ClutterContainer *container,
+                                                        ClutterCallback   callback,
+                                                        gpointer          user_data);
+void          clutter_container_foreach_with_internals (ClutterContainer *container,
+                                                        ClutterCallback   callback,
+                                                        gpointer          user_data);
+ClutterActor *clutter_container_find_child_by_name     (ClutterContainer *container,
+                                                        const gchar      *child_name);
+void          clutter_container_raise_child            (ClutterContainer *container,
+                                                        ClutterActor     *actor,
+                                                        ClutterActor     *sibling);
+void          clutter_container_lower_child            (ClutterContainer *container,
+                                                        ClutterActor     *actor,
+                                                        ClutterActor     *sibling);
+void          clutter_container_sort_depth_order       (ClutterContainer *container);
 
 
 GParamSpec *      clutter_container_class_find_child_property   (GObjectClass     *klass,