Index: gtk/gtk.symbols
===================================================================
--- gtk/gtk.symbols	(revision 17514)
+++ gtk/gtk.symbols	(working copy)
@@ -169,6 +169,8 @@ gtk_action_group_add_actions_full
 gtk_action_group_add_action_with_accel
 gtk_action_group_add_radio_actions
 gtk_action_group_add_radio_actions_full
+gtk_action_group_add_recent_actions
+gtk_action_group_add_recent_actions_full
 gtk_action_group_add_toggle_actions
 gtk_action_group_add_toggle_actions_full
 gtk_action_group_get_action
Index: gtk/gtkactiongroup.c
===================================================================
--- gtk/gtkactiongroup.c	(revision 17514)
+++ gtk/gtkactiongroup.c	(working copy)
@@ -913,7 +913,7 @@ gtk_action_group_add_toggle_actions_full
       g_object_unref (action);
     }
 
-    shared_data_unref (shared_data);
+  shared_data_unref (shared_data);
 }
 
 /**
@@ -1028,6 +1028,110 @@ gtk_action_group_add_radio_actions_full 
 }
 
 /**
+ * gtk_action_group_add_recent_actions:
+ * @action_group: the action group
+ * @entries: an array of recent files action descriptions
+ * @n_entries: the number of entries
+ * @user_data: data to pass to the action callbacks
+ *
+ * This is a convenience function to create a number of #GtkRecentActions and
+ * add them to the action group.
+ *
+ * The "item-activated" signals of the actions are connected to the callbacks
+ * and their accel paths are set to 
+ * <literal>&lt;Actions&gt;/<replaceable>group-name</replaceable>/<replaceable>action-name</replaceable></literal>.  
+ * 
+ * Since: 2.12
+ */
+void
+gtk_action_group_add_recent_actions (GtkActionGroup             *action_group,
+				     const GtkRecentActionEntry *entries,
+				     guint                       n_entries,
+				     gpointer                    user_data)
+{
+  gtk_action_group_add_recent_actions_full (action_group, 
+					    entries, n_entries, 
+					    user_data, NULL);
+}
+
+
+/**
+ * gtk_action_group_add_recent_actions_full:
+ * @action_group: the action group
+ * @entries: an array of recent files action descriptions
+ * @n_entries: the number of entries
+ * @user_data: data to pass to the action callbacks
+ * @destroy: destroy notification callback for @user_data
+ *
+ * This variant of gtk_action_group_add_recent_actions() adds a 
+ * #GDestroyNotify callback for @user_data. 
+ * 
+ * Since: 2.12
+ */
+void
+gtk_action_group_add_recent_actions_full (GtkActionGroup             *action_group,
+					  const GtkRecentActionEntry *entries,
+					  guint                       n_entries,
+					  gpointer                    user_data,
+					  GDestroyNotify              destroy)
+{
+  /* Keep this in sync with the other 
+   * gtk_action_group_add_..._actions_full() functions.
+   */
+  guint i;
+  SharedData *shared_data;
+
+  g_return_if_fail (GTK_IS_ACTION_GROUP (action_group));
+
+  shared_data = g_slice_new0 (SharedData);
+  shared_data->ref_count = 1;
+  shared_data->data = user_data;
+  shared_data->destroy = destroy;
+
+  for (i = 0; i < n_entries; i++)
+    {
+      GtkRecentAction *action;
+      const gchar *label;
+      const gchar *tooltip;
+
+      label = gtk_action_group_translate_string (action_group, entries[i].label);
+      tooltip = gtk_action_group_translate_string (action_group, entries[i].tooltip);
+
+      action = gtk_recent_action_new (entries[i].name,
+				      label,
+				      tooltip,
+				      NULL);
+
+      if (entries[i].stock_id) 
+	{
+	  if (gtk_icon_factory_lookup_default (entries[i].stock_id))
+	    g_object_set (action, "stock-id", entries[i].stock_id, NULL);
+	  else
+	    g_object_set (action, "icon-name", entries[i].stock_id, NULL);
+	}
+
+      if (entries[i].callback)
+	{
+	  GClosure *closure;
+
+	  closure = g_cclosure_new (entries[i].callback, user_data, NULL);
+	  g_closure_add_finalize_notifier (closure, shared_data, 
+					   (GClosureNotify)shared_data_unref);
+	  shared_data->ref_count++;
+
+	  g_signal_connect_closure (action, "item-activated", closure, FALSE);
+	}
+	  
+      gtk_action_group_add_action_with_accel (action_group, 
+					      GTK_ACTION (action),
+					      entries[i].accelerator);
+      g_object_unref (action);
+    }
+
+  shared_data_unref (shared_data);
+}
+
+/**
  * gtk_action_group_set_translate_func:
  * @action_group: a #GtkActionGroup
  * @func: a #GtkTranslateFunc
Index: gtk/gtkactiongroup.h
===================================================================
--- gtk/gtkactiongroup.h	(revision 17514)
+++ gtk/gtkactiongroup.h	(working copy)
@@ -48,6 +48,7 @@ typedef struct _GtkActionGroupClass   Gt
 typedef struct _GtkActionEntry        GtkActionEntry;
 typedef struct _GtkToggleActionEntry  GtkToggleActionEntry;
 typedef struct _GtkRadioActionEntry   GtkRadioActionEntry;
+typedef struct _GtkRecentActionEntry  GtkRecentActionEntry;
 
 struct _GtkActionGroup
 {
@@ -103,6 +104,16 @@ struct _GtkRadioActionEntry 
   gint   value; 
 };
 
+struct _GtkRecentActionEntry
+{
+  const gchar *name;
+  const gchar *stock_id;
+  const gchar *label;
+  const gchar *accelerator;
+  const gchar *tooltip;
+  GCallback callback;
+};
+
 GType           gtk_action_group_get_type                (void) G_GNUC_CONST;
 GtkActionGroup *gtk_action_group_new                     (const gchar                *name);
 G_CONST_RETURN gchar *gtk_action_group_get_name          (GtkActionGroup             *action_group);
@@ -136,6 +147,10 @@ void            gtk_action_group_add_rad
 							  gint                        value,
 							  GCallback                   on_change,
 							  gpointer                    user_data);
+void            gtk_action_group_add_recent_actions      (GtkActionGroup             *action_group,
+							  const GtkRecentActionEntry *entries,
+							  guint                       n_entries,
+							  gpointer                    user_data);
 void            gtk_action_group_add_actions_full        (GtkActionGroup             *action_group,
 							  const GtkActionEntry       *entries,
 							  guint                       n_entries,
@@ -153,6 +168,11 @@ void            gtk_action_group_add_rad
 							  GCallback                   on_change,
 							  gpointer                    user_data,
 							  GDestroyNotify              destroy);
+void            gtk_action_group_add_recent_actions_full (GtkActionGroup             *action_group,
+							  const GtkRecentActionEntry *entries,
+							  guint                       n_entries,
+							  gpointer                    user_data,
+							  GDestroyNotify              destroy);
 void            gtk_action_group_set_translate_func      (GtkActionGroup             *action_group,
 							  GtkTranslateFunc            func,
 							  gpointer                    data,
