diff --git a/gtk/gtkaboutdialog.c b/gtk/gtkaboutdialog.c
index 6d916b6..df173d2 100644
--- a/gtk/gtkaboutdialog.c
+++ b/gtk/gtkaboutdialog.c
@@ -122,6 +122,12 @@ static const gchar *gtk_license_urls[] = {
   "http://opensource.org/licenses/artistic-license-2.0.php"
 };
 
+struct _CreditSection
+{
+  gchar *heading;
+  gchar **people;
+};
+
 struct _GtkAboutDialogPrivate 
 {
   gchar *name;
@@ -137,6 +143,9 @@ struct _GtkAboutDialogPrivate
   gchar **documenters;
   gchar **artists;
 
+
+  GList *credit_sections;
+
   gint credits_page;
   gint license_page;
 
@@ -163,6 +172,8 @@ struct _GtkAboutDialogPrivate
   guint wrap_license : 1;
 };
 
+
+
 #define GTK_ABOUT_DIALOG_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_ABOUT_DIALOG, GtkAboutDialogPrivate))
 
 
@@ -561,6 +572,7 @@ update_credits_button_visibility (GtkAboutDialog *about)
   show = (priv->authors != NULL ||
           priv->documenters != NULL ||
           priv->artists != NULL ||
+          priv->credit_sections != NULL ||
          (priv->translator_credits != NULL &&
           strcmp (priv->translator_credits, "translator_credits") &&
           strcmp (priv->translator_credits, "translator-credits")));
@@ -653,6 +665,8 @@ gtk_about_dialog_init (GtkAboutDialog *about)
   priv->documenters = NULL;
   priv->artists = NULL;
 
+  priv->credit_sections = NULL;
+
   priv->hand_cursor = gdk_cursor_new (GDK_HAND2);
   priv->regular_cursor = gdk_cursor_new (GDK_XTERM);
   priv->hovering_over_link = FALSE;
@@ -794,6 +808,8 @@ gtk_about_dialog_finalize (GObject *object)
   g_strfreev (priv->documenters);
   g_strfreev (priv->artists);
 
+  g_list_free_full (priv->credit_sections, NULL);
+
   g_slist_foreach (priv->visited_links, (GFunc)g_free, NULL);
   g_slist_free (priv->visited_links);
 
@@ -2393,6 +2409,17 @@ create_credits_page (GtkAboutDialog *about)
   if (priv->artists != NULL)
     add_credits_section (about, GTK_GRID (grid), &row, _("Artwork by"), priv->artists);
 
+  if (priv->credit_sections != NULL)
+    {
+      GList *cs = NULL;
+      CreditSection *section = NULL;
+      for (cs = g_list_first (priv->credit_sections); cs; cs = g_list_next (cs))
+	{
+	  section = (CreditSection *)(cs->data);
+	  add_credits_section (about, GTK_GRID (grid), &row, section->heading, section->people);
+	}
+    }
+
   gtk_widget_show_all (sw);
 }
 
@@ -2627,3 +2654,28 @@ gtk_about_dialog_get_license_type (GtkAboutDialog *about)
 
   return about->priv->license_type;
 }
+
+
+void
+gtk_about_dialog_add_credits (GtkAboutDialog *about,
+                              const gchar     *section_name,
+                              const gchar    **people)
+{
+
+  GtkAboutDialogPrivate *priv;
+
+  g_return_if_fail (GTK_IS_ABOUT_DIALOG (about));
+
+  priv = about->priv;
+
+  CreditSection *new_entry = g_slice_new (CreditSection);
+  new_entry->heading = g_strdup ((gchar *)section_name);
+  new_entry->people = g_strdupv ((gchar **)people);
+
+
+  priv->credit_sections = g_list_append (priv->credit_sections, new_entry);
+
+  update_credits_button_visibility (about);
+
+}
+
diff --git a/gtk/gtkaboutdialog.h b/gtk/gtkaboutdialog.h
index 68c24d7..791922e 100644
--- a/gtk/gtkaboutdialog.h
+++ b/gtk/gtkaboutdialog.h
@@ -43,6 +43,7 @@ G_BEGIN_DECLS
 typedef struct _GtkAboutDialog        GtkAboutDialog;
 typedef struct _GtkAboutDialogClass   GtkAboutDialogClass;
 typedef struct _GtkAboutDialogPrivate GtkAboutDialogPrivate;
+typedef struct _CreditSection         CreditSection;
 
 /**
  * GtkLicense:
@@ -159,6 +160,9 @@ void                   gtk_about_dialog_set_logo               (GtkAboutDialog
 const gchar *          gtk_about_dialog_get_logo_icon_name     (GtkAboutDialog  *about);
 void                   gtk_about_dialog_set_logo_icon_name     (GtkAboutDialog  *about,
                                                                 const gchar     *icon_name);
+void                  gtk_about_dialog_add_credits             (GtkAboutDialog  *about,
+                                                                const gchar     *section_name,
+                                                                const gchar    **people);
 
 G_END_DECLS
 
