Index: glib/pyglib.c
===================================================================
--- glib/pyglib.c	(revision 934)
+++ glib/pyglib.c	(working copy)
@@ -496,7 +496,67 @@
     return PyFloat_FromDouble(ret);
 }
 
+/**
+ * pyglib_pylist_from_glist:
+ * @list: a GList to build a Python list from
+ * @pointer_to_object: function transforming list data to Python objects
+ *
+ * The transformer must create a new Python objects or return a new
+ * reference to existing object.
+ *
+ * Returns: a new Python list
+ */
+PyObject *
+pyglib_pylist_from_glist(GList *list,
+			 PyGLibPointerToPyObjectFunc pointer_to_object)
+{
+    PyObject *result = PyList_New(list ? g_list_length(list) : 0);
+    int k;
 
+    if (!result)
+	return NULL;
+
+    for (k = 0; list; ++k, list = list->next) {
+	PyObject *item = pointer_to_object(list->data);
+	if (PyList_SetItem(result, k, item) == -1) {
+	    Py_DECREF(result);
+	    return NULL;
+	}
+    }
+
+    return result;
+}
+
+/**
+ * pyglib_convert_glist_to_pylist:
+ * @list: a GList to build a Python list from
+ * @pointer_to_object: function transforming list data to Python objects
+ * @free_item: function to free a C object (e.g. g_free)
+ * @user_data: optional second argument for free_item
+ *
+ * The transformer must create a new Python objects or return a new
+ * reference to existing object.  GList will get freed regardless of
+ * whether Python list was successfully built or not.
+ *
+ * Returns: a new Python list
+ */
+PyObject *
+pyglib_convert_glist_to_pylist(GList *list,
+			       PyGLibPointerToPyObjectFunc pointer_to_object,
+			       GFunc free_item,
+			       gpointer user_data)
+{
+    PyObject *result = pyglib_pylist_from_glist(list, pointer_to_object);
+
+    if (list) {
+	g_list_foreach(list, free_item, user_data);
+	g_list_free(list);
+    }
+
+    return result;
+}
+
+
 /****** Private *****/
 
 /**
Index: glib/pyglib.h
===================================================================
--- glib/pyglib.h	(revision 934)
+++ glib/pyglib.h	(working copy)
@@ -29,6 +29,7 @@
 G_BEGIN_DECLS
 
 typedef void (*PyGLibThreadBlockFunc) (void);
+typedef PyObject * (*PyGLibPointerToPyObjectFunc) (gpointer data);
 
 void pyglib_init(void);
 void pyglib_init_internal(PyObject *api);
@@ -49,6 +50,14 @@
 PyObject * pyglib_option_group_new(GOptionGroup *group);
 GOptionGroup * pyglib_option_group_transfer_group(PyObject *self);
 PyObject * pyglib_float_from_timeval(GTimeVal timeval);
+PyObject * pyglib_pylist_from_glist
+            (GList *list,
+	     PyGLibPointerToPyObjectFunc pointer_to_object);
+PyObject * pyglib_convert_glist_to_pylist
+            (GList *list,
+	     PyGLibPointerToPyObjectFunc pointer_to_object,
+	     GFunc free_item,
+	     gpointer user_data);
 
 #define pyglib_begin_allow_threads		\
     G_STMT_START {                              \
Index: gio/gio.override
===================================================================
--- gio/gio.override	(revision 934)
+++ gio/gio.override	(working copy)
@@ -289,3 +289,13 @@
 
     return ret;
 }
+%%
+override g_content_types_get_registered noargs
+static PyObject *
+_wrap_g_content_types_get_registered(PyObject *self)
+{
+    return pyglib_convert_glist_to_pylist(g_content_types_get_registered(),
+					  (PyGLibPointerToPyObjectFunc) PyString_FromString,
+					  (GFunc) g_free,
+					  NULL);
+}
