diff --git a/GType.xs b/GType.xs
index 8d16b90..c0df705 100644
--- a/GType.xs
+++ b/GType.xs
@@ -1430,16 +1430,16 @@ prop_handler_lookup (GType instance_type,
 	}
 }
 
-static void
-add_properties (GType instance_type, AV * properties)
+static int
+add_properties (GType instance_type, guint propid, AV * properties)
 {
 	GObjectClass *oclass;
-	int propid;
+	int i;
 
 	oclass = g_type_class_ref (instance_type);
 
-	for (propid = 0; propid <= av_len (properties); propid++) {
-		SV * sv = *av_fetch (properties, propid, 1);
+	for (i = 0; i <= av_len (properties); i++) {
+		SV * sv = *av_fetch (properties, i, 1);
 		GParamSpec * pspec = NULL;
 		if (sv_derived_from (sv, "Glib::ParamSpec"))
 			pspec = SvGParamSpec (sv);
@@ -1452,7 +1452,7 @@ add_properties (GType instance_type, AV * properties)
 			if (!svp)
 				croak ("Param description hash at index %d "
 				       "for %s does not contain key pspec",
-				       propid,
+				       i,
 				       gperl_object_package_from_type
 				       			(instance_type));
 			pspec = SvGParamSpec (*svp);
@@ -1464,20 +1464,21 @@ add_properties (GType instance_type, AV * properties)
 			if (svp) setter = *svp;
 
 			prop_handler_install (instance_type,
-			                      propid+1, setter, getter);
+			                      propid, setter, getter);
 
 		} else {
 			croak ("item %d (%s) in property list for %s is "
 			       "neither a Glib::ParamSpec nor a param "
 			       "description hash",
-			       propid, 
+			       i, 
 			       gperl_format_variable_for_output (sv),
 			       gperl_object_package_from_type (instance_type));
 		}
-		g_object_class_install_property (oclass, propid + 1, pspec);
+		g_object_class_install_property (oclass, propid++, pspec);
 	}
 
 	g_type_class_unref (oclass);
+	return propid;
 }
 
 /*
@@ -1523,8 +1524,8 @@ install_overrides (GType type)
 	g_slist_free (types);
 }
 
-static void
-add_interfaces (GType instance_type, AV * interfaces)
+static int
+add_interfaces (GType instance_type, guint propid, AV * interfaces)
 {
 	int i;
 	SV * class_name =
@@ -1556,10 +1557,29 @@ add_interfaces (GType instance_type, AV * interfaces)
 			call_method ("_ADD_INTERFACE", G_VOID|G_DISCARD);
 			LEAVE;
 		}
+
+		/* add interface properties, per "Interface Properties" in
+		   the GObject reference manual */
+		{
+			gpointer iface = g_type_default_interface_ref (interface_type);
+			gpointer oclass = g_type_class_ref (instance_type);
+			guint n_props, j;
+			GParamSpec **props = g_object_interface_list_properties (iface, &n_props);
+			for (j = 0; j < n_props; j++) {
+				GParamSpec *pspec = props[j];
+				g_object_class_override_property (oclass, propid++, pspec->name);
+			}
+
+			g_free (props);
+			g_type_class_unref (oclass);
+			g_type_default_interface_unref (iface);
+		}
+
 		gperl_prepend_isa (SvPV_nolen (class_name), SvPV_nolen (*svp));
 	}
 
 	SvREFCNT_dec (class_name);
+	return propid;
 }
 
 
@@ -2227,6 +2247,16 @@ ALLCAPS methods will automatically be called whenever needed.  Which methods
 exactly depends on the interface -- Gtk2::CellEditable for example uses
 START_EDITING, EDITING_DONE, and REMOVE_WIDGET.
 
+If an interface has properties then they're added to the new class
+automatically, the same as if they were in the C<properties> list
+above.  The pspecs added are of "override" type, targeting the
+interface's pspec object, but it's the underlying pspec which reaches
+C<GET_PROPERTY> and C<SET_PROPERTY>.
+
+There's no way (as yet) to specify individual C<get> / C<set>
+functions for interface properties, they just go to the unified
+C<GET_PROPERTY> and C<SET_PROPERTY>.
+	
 =back
 
 =cut
@@ -2240,6 +2270,7 @@ g_type_register_object (class, parent_package, new_package, ...);
 	GTypeQuery query;
 	GType parent_type, new_type;
 	char * new_type_name;
+	guint propid = 1; /* IDs start from 1 */
     CODE:
 	/* start with a clean slate */
 	memset (&type_info, 0, sizeof (GTypeInfo));
@@ -2293,12 +2324,12 @@ g_type_register_object (class, parent_package, new_package, ...);
 				croak ("signals must be a hash of signalname => signalspec pairs");
 		} else if (strEQ (key, "properties")) {
 			if (gperl_sv_is_array_ref (ST (i+1)))
-				add_properties (new_type, (AV*)SvRV (ST (i+1)));
+				propid = add_properties (new_type, propid, (AV*)SvRV (ST (i+1)));
 			else
 				croak ("properties must be an array of GParamSpecs");
 		} else if (strEQ (key, "interfaces")) {
 			if (gperl_sv_is_array_ref (ST (i+1)))
-				add_interfaces (new_type, (AV*)SvRV (ST (i+1)));
+				propid = add_interfaces (new_type, propid, (AV*)SvRV (ST (i+1)));
 			else
 				croak ("interfaces must be an array of package names");
 		}
