diff --git a/configure.in b/configure.in
index ede0575..a1521d8 100644
--- a/configure.in
+++ b/configure.in
@@ -933,6 +933,29 @@ AC_SUBST(MONO_CFLAGS)
 AC_SUBST(MONO_LIBS)
 ])
 
+# GObject Introspection
+have_introspection=false
+PKG_CHECK_MODULES(INTROSPECTION, gobject-introspection-1.0 >= 0.6.4, have_introspection=true, have_introspection=false)
+AM_CONDITIONAL(HAVE_INTROSPECTION, $have_introspection)
+
+G_IR_SCANNER=
+G_IR_COMPILER=
+G_IR_GENERATE=
+GIRDIR=
+TYPELIBDIR=
+if $have_introspection; then
+   G_IR_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
+   G_IR_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
+   G_IR_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
+   GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0`
+   TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)"
+fi
+AC_SUBST(G_IR_SCANNER)
+AC_SUBST(G_IR_COMPILER)
+AC_SUBST(G_IR_GENERATE)
+AC_SUBST(GIRDIR)
+AC_SUBST(TYPELIBDIR)
+
 dnl **************************************************
 dnl * Config defaults
 dnl **************************************************
diff --git a/src/Makefile.am b/src/Makefile.am
index c485399..c3ed5a6 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -484,3 +484,39 @@ gtkaction_DATA = GNOME_Gnumeric-gtk.xml
 GNOME_Gnumeric-gtk.xml: GNOME_Gnumeric-gtk.xml.in
 	sed -e 's/ _name *=/ name=/' <$<  >$@
 DISTCLEANFILES = GNOME_Gnumeric-gtk.xml
+
+BUILT_GIRSOURCES = Gnm-@GNUMERIC_API_VER@.gir
+
+Gnm-@GNUMERIC_API_VER@.gir: $(libspreadsheet_include_HEADER)
+Gnm-@GNUMERIC_API_VER@.gir: $(libspreadsheet_la_SOURCES)
+Gnm-@GNUMERIC_API_VER@.gir: libspreadsheet.la
+Gnm-@GNUMERIC_API_VER@.gir: $(G_IR_SCANNER) Makefile
+	$(AM_V_GEN) $(G_IR_SCANNER) -v --namespace Gnm --nsversion=1 \
+	    --add-include-path=$(srcdir) --add-include-path=. \
+	    --include=GObject-2.0 \
+	    --include=Gio-2.0 \
+	    --include=libxml2-2.0 \
+	    --include=Gsf-1 \
+	    --include=GOffice-0.10 \
+	    --include=GoGraph-0.10 \
+	    --include=GoCanvas-0.10 \
+	    --library=libspreadsheet.la \
+	    --libtool="$(LIBTOOL)" \
+	    --output $@ \
+	    --pkg libspreadsheet-@GNUMERIC_API_VER@ \
+	    --accept-unprefixed \
+	    -I$(top_srcdir) \
+	    $(libspreadsheet_include_HEADERS) $(libspreadsheet_la_SOURCES)
+
+if HAVE_INTROSPECTION
+
+girdir = $(GIRDIR)
+gir_DATA = $(BUILT_GIRSOURCES)
+
+typelibsdir = $(TYPELIBDIR)
+typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+
+%.typelib: %.gir $(G_IR_COMPILER)
+	$(AM_V_GEN) LD_LIBRARY_PATH=$${LD_LIBRARY_PATH:+$$LD_LIBRARY_PATH:}. $(G_IR_COMPILER) --includedir=$(srcdir) --includedir=. $(G_IR_COMPILER_OPTS) $< -o $(builddir)/$(@F)
+
+endif # HAVE_INTROSPECTION
diff --git a/src/format-template.h b/src/format-template.h
index e1b2d73..c47c22f 100644
--- a/src/format-template.h
+++ b/src/format-template.h
@@ -74,6 +74,13 @@ typedef struct {
 	char *description;
 } FormatTemplateCategory;
 
+typedef struct {
+	gboolean left;
+	gboolean right;
+	gboolean top;
+	gboolean bottom;
+} FormatEdges;
+
 struct _GnmFormatTemplate {
 	FormatTemplateCategory *category;
 	GSList *members;	/* the actual TemplateMembers */
@@ -90,12 +97,7 @@ struct _GnmFormatTemplate {
 	gboolean patterns;
 	gboolean alignment;
 
-	struct {
-		gboolean left;
-		gboolean right;
-		gboolean top;
-		gboolean bottom;
-	} edges;
+	FormatEdges edges;
 
 /* <private> */
 	/* pre-calculate styles */
diff --git a/src/gnm-style-impl.h b/src/gnm-style-impl.h
index 5b3a815..c891df0 100644
--- a/src/gnm-style-impl.h
+++ b/src/gnm-style-impl.h
@@ -11,6 +11,22 @@
 
 G_BEGIN_DECLS
 
+typedef struct {
+	GnmColor *font;
+	GnmColor *back;
+	GnmColor *pattern;
+} GnmStyleColor;
+
+typedef struct {
+	GOString	*name;
+	gboolean	bold;
+	gboolean	italic;
+	GnmUnderline	underline;
+	gboolean	strikethrough;
+	GOFontScript	script;
+	double		size;
+} GnmStyleFontDetails;
+
 struct _GnmStyle {
 	unsigned int	changed;
 	unsigned int	set;
@@ -29,24 +45,12 @@ struct _GnmStyle {
 	PangoContext  *font_context;
 
 /* public */
-	struct {
-		GnmColor *font;
-		GnmColor *back;
-		GnmColor *pattern;
-	}  color;
+	GnmStyleColor  color;
 	GnmBorder	*borders[MSTYLE_BORDER_DIAGONAL - MSTYLE_BORDER_TOP + 1];
 	guint32          pattern;
 
 #warning TODO use GOFont
-	struct {
-		GOString	*name;
-		gboolean	bold;
-		gboolean	italic;
-		GnmUnderline	underline;
-		gboolean	strikethrough;
-		GOFontScript	script;
-		double		size;
-	} font_detail;
+	GnmStyleFontDetails font_detail;
 
 	GOFormat const *format;
 	GnmHAlign	 h_align;
diff --git a/src/parse-util.h b/src/parse-util.h
index 318f196..626f134 100644
--- a/src/parse-util.h
+++ b/src/parse-util.h
@@ -94,6 +94,59 @@ typedef enum {
 	GNM_EXPR_PARSE_UNKNOWN_NAMES_ARE_INVALID	   = 1 << 5
 } GnmExprParseFlags;
 
+typedef struct {
+	/* Called a lot for anything that might be a reference.  */
+	char const *(*range_ref) (GnmRangeRef *res, char const *in,
+				  GnmParsePos const *pp,
+				  GnmConventions const *convs);
+				/* GError **err); */
+
+	/* Called to unescape strings */
+	char const *(*string) (char const *in, GString *target,
+			       GnmConventions const *convs);
+
+	/* Called a lot for anything that might be a function name or
+	 * defined name.  */
+	char const *(*name) (char const *in,
+			     GnmConventions const *convs);
+	/* Returns true if a tentative expression name is legal. */
+	gboolean (*name_validate) (const char *name);
+
+	/* Must return non-NULL, and absorb the args, including the list. */
+	GnmExpr const *(*func) (GnmConventions const *convs,
+			        /* make scope more useful, eg a
+				 * ParsePos * to allow for
+				 * sheet/object specific functions
+				 * */
+				Workbook *scope,
+				char const *name,
+				GnmExprList *args);
+	Workbook *(*external_wb) (GnmConventions const *convs,
+				 Workbook *ref_wb,
+				 char const *unquoted_name);
+} GnmConventionsImport;
+
+typedef struct {
+	int decimal_digits;
+
+	gboolean translated;
+
+	void (*string)	  (GnmConventionsOut *out,
+			   GOString const *str);
+	void (*func)	  (GnmConventionsOut *out,
+			   GnmExprFunction const *func);
+	void (*name)	  (GnmConventionsOut *out,
+			   GnmExprName const *name);
+	void (*cell_ref)  (GnmConventionsOut *out,
+			   GnmCellRef const *cell_ref,
+			   gboolean no_sheetname);
+	void (*range_ref) (GnmConventionsOut *out,
+			   GnmRangeRef const *range_ref);
+
+	GString * (*quote_sheet_name) (GnmConventions const *convs,
+				       char const *name);
+} GnmConventionsExport;
+
 struct _GnmConventions {
 	int ref_count;
 
@@ -144,59 +197,10 @@ struct _GnmConventions {
 	gboolean exp_is_left_associative;
 
 /* Import specific functions ------------------------------------- */
-	struct {
-		/* Called a lot for anything that might be a reference.  */
-		char const *(*range_ref) (GnmRangeRef *res, char const *in,
-					  GnmParsePos const *pp,
-					  GnmConventions const *convs);
-					/* GError **err); */
-
-		/* Called to unescape strings */
-		char const *(*string) (char const *in, GString *target,
-				       GnmConventions const *convs);
-
-		/* Called a lot for anything that might be a function name or
-		 * defined name.  */
-		char const *(*name) (char const *in,
-				     GnmConventions const *convs);
-		/* Returns true if a tentative expression name is legal. */
-		gboolean (*name_validate) (const char *name);
-
-		/* Must return non-NULL, and absorb the args, including the list. */
-		GnmExpr const *(*func) (GnmConventions const *convs,
-				        /* make scope more useful, eg a
-					 * ParsePos * to allow for
-					 * sheet/object specific functions
-					 * */
-					Workbook *scope,
-					char const *name,
-					GnmExprList *args);
-		Workbook *(*external_wb) (GnmConventions const *convs,
-					 Workbook *ref_wb,
-					 char const *unquoted_name);
-	} input;
+	GnmConventionsImport input;
 
 /* Export specific functions ----------------------------------- */
-	struct {
-		int decimal_digits;
-
-		gboolean translated;
-
-		void (*string)	  (GnmConventionsOut *out,
-				   GOString const *str);
-		void (*func)	  (GnmConventionsOut *out,
-				   GnmExprFunction const *func);
-		void (*name)	  (GnmConventionsOut *out,
-				   GnmExprName const *name);
-		void (*cell_ref)  (GnmConventionsOut *out,
-				   GnmCellRef const *cell_ref,
-				   gboolean no_sheetname);
-		void (*range_ref) (GnmConventionsOut *out,
-				   GnmRangeRef const *range_ref);
-
-		GString * (*quote_sheet_name) (GnmConventions const *convs,
-					       char const *name);
-	} output;
+	GnmConventionsExport output;
 };
 GnmConventions *gnm_conventions_new	 (void);
 GnmConventions *gnm_conventions_new_full (unsigned size);
diff --git a/src/print-info.h b/src/print-info.h
index 05a81c1..9eeaadc 100644
--- a/src/print-info.h
+++ b/src/print-info.h
@@ -57,28 +57,42 @@ typedef struct {
 	GArray	*details; /* ordered array of GnmPageBreak  */
 } GnmPageBreaks;
 
+typedef enum {
+	PRINT_SCALE_PERCENTAGE,
+	PRINT_SCALE_FIT_PAGES
+} PrintScaleType;
+
+typedef struct {
+	double x;
+	double y;
+} PrintScalePercent;
+
+typedef struct {
+	int cols;
+	int rows;
+	double y;
+} PrintScaleDim;
+
+typedef struct {
+	PrintScaleType type;
+
+	/* We store separate x and y scales internally, for the
+	* 'fit-to' printing feature. (They are calculated at print-time)
+	* When the user is doing the simple scaling, both these values
+	* will be equal.
+	*/
+	PrintScalePercent percentage;
+
+	PrintScaleDim dim;
+} PrintInfoScaling;
+
+typedef struct {
+	GnmPageBreaks *h,  /* between rows */
+		      *v;  /* between columns */
+} PrintInfoPageBreaks;
+
 struct _PrintInformation {
-	struct {
-		enum {
-			PRINT_SCALE_PERCENTAGE,
-			PRINT_SCALE_FIT_PAGES
-		} type;
-
-		/* We store separate x and y scales internally, for the
-		* 'fit-to' printing feature. (They are calculated at print-time)
-		* When the user is doing the simple scaling, both these values
-		* will be equal.
-		*/
-		struct {
-			double x;
-			double y;
-		} percentage;
-
-		struct { /* zero == use as many as required */
-			int cols;
-			int rows;
-		} dim;
-	} scaling;
+	PrintInfoScaling scaling;
 	double           edge_to_below_header;
 	double           edge_to_above_footer;
         DesiredDisplay   desired_display;
@@ -98,10 +112,7 @@ struct _PrintInformation {
 	GnmPrintCommentPlacementType comment_placement;
 	GnmPrintErrorsType error_display;
 
-	struct {
-		GnmPageBreaks *h,  /* between rows */
-			      *v;  /* between columns */
-	} page_breaks;
+	PrintInfoPageBreaks page_breaks;
 	PrintHF		*header, *footer;
 
 	int		  start_page; /* < 0 implies auto */
diff --git a/src/stf-parse.h b/src/stf-parse.h
index c48cd9d..01115c1 100644
--- a/src/stf-parse.h
+++ b/src/stf-parse.h
@@ -21,22 +21,26 @@ typedef enum {
 } StfTrimType_t;
 
 typedef struct {
+	guchar       min, max;
+} StfCompiledTerminator;
+
+typedef struct {
+	GSList *str;
+	char   *chr;
+	gboolean duplicates;         /* See two text separators as one? */
+} StfSeparator;
+
+typedef struct {
 	StfParseType_t       parsetype;             /* The type of import to do */
 	StfTrimType_t        trim_spaces;           /* Trim spaces in fields? */
 
 	GSList *             terminator;            /* Line terminators */
 	char *               locale;
 
-	struct {
-		guchar       min, max;
-	} compiled_terminator;
+	StfCompiledTerminator compiled_terminator;
 
 	/* CSV related */
-	struct {
-		GSList *str;
-		char   *chr;
-		gboolean duplicates;         /* See two text separators as one? */
-	} sep;
+	StfSeparator sep;
 	gunichar             stringindicator;       /* String indicator */
 	gboolean             indicator_2x_is_single;/* 2 quote chars form a single non-terminating quote */
 	gboolean             trim_seps;             /* Ignore initial seps.  */
diff --git a/src/style-font.h b/src/style-font.h
index 4ef7638..5513827 100644
--- a/src/style-font.h
+++ b/src/style-font.h
@@ -8,14 +8,16 @@
 
 G_BEGIN_DECLS
 
+typedef struct {
+	GOFont const *font;
+	GOFontMetrics *metrics;
+} GnmGOFont;
+
 struct _GnmFont {
 	int	 ref_count;
 	char	*font_name;
 	double	 size_pts;
-	struct {
-		GOFont const *font;
-		GOFontMetrics *metrics;
-	} go;
+	GnmGOFont go;
 	PangoContext *context;
 
 	unsigned int is_bold : 1;
diff --git a/src/undo.c b/src/undo.c
index 2ad3692..5c21f26 100644
--- a/src/undo.c
+++ b/src/undo.c
@@ -42,7 +42,7 @@ static GObjectClass *gnm_undo_colrow_restore_state_group_parent_class;
 static void
 gnm_undo_colrow_restore_state_group_finalize (GObject *o)
 {
-	GNMUndoColrowRestoreStateGroup *ua = (GNMUndoColrowRestoreStateGroup *)o;
+	GnmUndoColrowRestoreStateGroup *ua = (GnmUndoColrowRestoreStateGroup *)o;
 
 	colrow_state_group_destroy (ua->saved_state);
 	ua->saved_state = NULL;
@@ -55,7 +55,7 @@ gnm_undo_colrow_restore_state_group_finalize (GObject *o)
 static void
 gnm_undo_colrow_restore_state_group_undo (GOUndo *u, G_GNUC_UNUSED gpointer data)
 {
-	GNMUndoColrowRestoreStateGroup *ua = (GNMUndoColrowRestoreStateGroup *)u;
+	GnmUndoColrowRestoreStateGroup *ua = (GnmUndoColrowRestoreStateGroup *)u;
 
 	colrow_restore_state_group (ua->sheet, ua->is_cols, ua->selection, ua->saved_state);
 }
@@ -72,7 +72,7 @@ gnm_undo_colrow_restore_state_group_class_init (GObjectClass *gobject_class)
 }
 
 
-GSF_CLASS (GNMUndoColrowRestoreStateGroup, gnm_undo_colrow_restore_state_group,
+GSF_CLASS (GnmUndoColrowRestoreStateGroup, gnm_undo_colrow_restore_state_group,
 	   gnm_undo_colrow_restore_state_group_class_init, NULL, GO_TYPE_UNDO)
 
 /**
@@ -86,7 +86,7 @@ gnm_undo_colrow_restore_state_group_new (Sheet *sheet, gboolean is_cols,
 					ColRowIndexList *selection,
 					ColRowStateGroup *saved_state)
 {
-	GNMUndoColrowRestoreStateGroup *ua = g_object_new (GNM_TYPE_UNDO_COLROW_RESTORE_STATE_GROUP, NULL);
+	GnmUndoColrowRestoreStateGroup *ua = g_object_new (GNM_TYPE_UNDO_COLROW_RESTORE_STATE_GROUP, NULL);
 
 	ua->sheet = sheet;
 	ua->is_cols = is_cols;
@@ -103,7 +103,7 @@ static GObjectClass *gnm_undo_colrow_set_sizes_parent_class;
 static void
 gnm_undo_colrow_set_sizes_finalize (GObject *o)
 {
-	GNMUndoColrowSetSizes *ua = (GNMUndoColrowSetSizes *)o;
+	GnmUndoColrowSetSizes *ua = (GnmUndoColrowSetSizes *)o;
 
 	colrow_index_list_destroy (ua->selection);
 	ua->selection = NULL;
@@ -114,7 +114,7 @@ gnm_undo_colrow_set_sizes_finalize (GObject *o)
 static void
 gnm_undo_colrow_set_sizes_undo (GOUndo *u, G_GNUC_UNUSED gpointer data)
 {
-	GNMUndoColrowSetSizes *ua = (GNMUndoColrowSetSizes *)u;
+	GnmUndoColrowSetSizes *ua = (GnmUndoColrowSetSizes *)u;
 	ColRowStateGroup *group;
 
 	group = colrow_set_sizes (ua->sheet, ua->is_cols, ua->selection, ua->new_size,
@@ -134,7 +134,7 @@ gnm_undo_colrow_set_sizes_class_init (GObjectClass *gobject_class)
 }
 
 
-GSF_CLASS (GNMUndoColrowSetSizes, gnm_undo_colrow_set_sizes,
+GSF_CLASS (GnmUndoColrowSetSizes, gnm_undo_colrow_set_sizes,
 	   gnm_undo_colrow_set_sizes_class_init, NULL, GO_TYPE_UNDO)
 
 /**
@@ -150,7 +150,7 @@ gnm_undo_colrow_set_sizes_new (Sheet *sheet, gboolean is_cols,
 			       ColRowIndexList *selection,
 			       int new_size, GnmRange const *r)
 {
-	GNMUndoColrowSetSizes *ua;
+	GnmUndoColrowSetSizes *ua;
 
 	g_return_val_if_fail (selection != NULL || (r != NULL && new_size == -1), NULL);
 
@@ -191,7 +191,7 @@ static GObjectClass *gnm_undo_filter_set_condition_parent_class;
 static void
 gnm_undo_filter_set_condition_finalize (GObject *o)
 {
-	GNMUndoFilterSetCondition *ua = (GNMUndoFilterSetCondition *)o;
+	GnmUndoFilterSetCondition *ua = (GnmUndoFilterSetCondition *)o;
 
 	gnm_filter_condition_free (ua->cond);
 	ua->cond = NULL;
@@ -220,7 +220,7 @@ cb_filter_set_condition_undo_set_pb (SheetControl *control, char *text)
 static void
 gnm_undo_filter_set_condition_undo (GOUndo *u, G_GNUC_UNUSED gpointer data)
 {
-	GNMUndoFilterSetCondition *ua = (GNMUndoFilterSetCondition *)u;
+	GnmUndoFilterSetCondition *ua = (GnmUndoFilterSetCondition *)u;
 	gint count = 0;
 	char const *format;
 	char *text;
@@ -275,7 +275,7 @@ gnm_undo_filter_set_condition_class_init (GObjectClass *gobject_class)
 }
 
 
-GSF_CLASS (GNMUndoFilterSetCondition, gnm_undo_filter_set_condition,
+GSF_CLASS (GnmUndoFilterSetCondition, gnm_undo_filter_set_condition,
 	   gnm_undo_filter_set_condition_class_init, NULL, GO_TYPE_UNDO)
 
 /**
@@ -291,7 +291,7 @@ gnm_undo_filter_set_condition_new (GnmFilter *filter, unsigned i,
 				   GnmFilterCondition *cond,
 				   gboolean retrieve_from_filter)
 {
-	GNMUndoFilterSetCondition *ua;
+	GnmUndoFilterSetCondition *ua;
 
 	g_return_val_if_fail (filter != NULL, NULL);
 	g_return_val_if_fail (i < filter->fields->len , NULL);
diff --git a/src/undo.h b/src/undo.h
index 1e17e58..9199855 100644
--- a/src/undo.h
+++ b/src/undo.h
@@ -14,15 +14,15 @@ G_BEGIN_DECLS
 /* ------------------------------------------------------------------------- */
 
 #define GNM_TYPE_UNDO_COLROW_RESTORE_STATE_GROUP  (gnm_undo_colrow_restore_state_group_get_type ())
-#define GNM_UNDO_COLROW_RESTORE_STATE_GROUP(o)    (G_TYPE_CHECK_INSTANCE_CAST ((o), GNM_TYPE_UNDO_COLROW_RESTORE_STATE_GROUP, GNMUndoColrowRestoreStateGroup))
+#define GNM_UNDO_COLROW_RESTORE_STATE_GROUP(o)    (G_TYPE_CHECK_INSTANCE_CAST ((o), GNM_TYPE_UNDO_COLROW_RESTORE_STATE_GROUP, GnmUndoColrowRestoreStateGroup))
 #define GNM_IS_UNDO_COLROW_RESTORE_STATE_GROUP(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GNM_TYPE_UNDO_COLROW_RESTORE_STATE_GROUP))
 
 GType gnm_undo_colrow_restore_state_group_get_type (void);
 
-typedef struct _GNMUndoColrowRestoreStateGroup GNMUndoColrowRestoreStateGroup;
-typedef struct _GNMUndoColrowRestoreStateGroupClass GNMUndoColrowRestoreStateGroupClass;
+typedef struct _GnmUndoColrowRestoreStateGroup GnmUndoColrowRestoreStateGroup;
+typedef struct _GnmUndoColrowRestoreStateGroupClass GnmUndoColrowRestoreStateGroupClass;
 
-struct _GNMUndoColrowRestoreStateGroup {
+struct _GnmUndoColrowRestoreStateGroup {
 	GOUndo base;
 	Sheet *sheet;
 	gboolean is_cols;
@@ -30,7 +30,7 @@ struct _GNMUndoColrowRestoreStateGroup {
 	ColRowStateGroup *saved_state;
 };
 
-struct _GNMUndoColrowRestoreStateGroupClass {
+struct _GnmUndoColrowRestoreStateGroupClass {
 	GOUndoClass base;
 };
 
@@ -41,15 +41,15 @@ GOUndo *gnm_undo_colrow_restore_state_group_new (Sheet *sheet, gboolean is_cols,
 /* ------------------------------------------------------------------------- */
 
 #define GNM_TYPE_UNDO_COLROW_SET_SIZES  (gnm_undo_colrow_set_sizes_get_type ())
-#define GNM_UNDO_COLROW_SET_SIZES(o)    (G_TYPE_CHECK_INSTANCE_CAST ((o), GNM_TYPE_UNDO_COLROW_SET_SIZES, GNMUndoColrowSetSizes))
+#define GNM_UNDO_COLROW_SET_SIZES(o)    (G_TYPE_CHECK_INSTANCE_CAST ((o), GNM_TYPE_UNDO_COLROW_SET_SIZES, GnmUndoColrowSetSizes))
 #define GNM_IS_UNDO_COLROW_SET_SIZES(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GNM_TYPE_UNDO_COLROW_SET_SIZES))
 
 GType gnm_undo_colrow_set_sizes_get_type (void);
 
-typedef struct _GNMUndoColrowSetSizes GNMUndoColrowSetSizes;
-typedef struct _GNMUndoColrowSetSizesClass GNMUndoColrowSetSizesClass;
+typedef struct _GnmUndoColrowSetSizes GnmUndoColrowSetSizes;
+typedef struct _GnmUndoColrowSetSizesClass GnmUndoColrowSetSizesClass;
 
-struct _GNMUndoColrowSetSizes {
+struct _GnmUndoColrowSetSizes {
 	GOUndo base;
 	Sheet *sheet;
 	gboolean is_cols;
@@ -57,7 +57,7 @@ struct _GNMUndoColrowSetSizes {
 	int new_size, from, to;
 };
 
-struct _GNMUndoColrowSetSizesClass {
+struct _GnmUndoColrowSetSizesClass {
 	GOUndoClass base;
 };
 
@@ -68,22 +68,22 @@ GOUndo *gnm_undo_colrow_set_sizes_new (Sheet *sheet, gboolean is_cols,
 /* ------------------------------------------------------------------------- */
 
 #define GNM_TYPE_UNDO_FILTER_SET_CONDITION  (gnm_undo_filter_set_condition_get_type ())
-#define GNM_UNDO_FILTER_SET_CONDITION(o)    (G_TYPE_CHECK_INSTANCE_CAST ((o), GNM_TYPE_UNDO_FILTER_SET_CONDITION, GNMUndoFilterSetCondition))
+#define GNM_UNDO_FILTER_SET_CONDITION(o)    (G_TYPE_CHECK_INSTANCE_CAST ((o), GNM_TYPE_UNDO_FILTER_SET_CONDITION, GnmUndoFilterSetCondition))
 #define GNM_IS_UNDO_FILTER_SET_CONDITION(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GNM_TYPE_UNDO_FILTER_SET_CONDITION))
 
 GType gnm_undo_filter_set_condition_get_type (void);
 
-typedef struct _GNMUndoFilterSetCondition GNMUndoFilterSetCondition;
-typedef struct _GNMUndoFilterSetConditionClass GNMUndoFilterSetConditionClass;
+typedef struct _GnmUndoFilterSetCondition GnmUndoFilterSetCondition;
+typedef struct _GnmUndoFilterSetConditionClass GnmUndoFilterSetConditionClass;
 
-struct _GNMUndoFilterSetCondition {
+struct _GnmUndoFilterSetCondition {
 	GOUndo base;
 	GnmFilter *filter;
 	unsigned i;
 	GnmFilterCondition *cond;
 };
 
-struct _GNMUndoFilterSetConditionClass {
+struct _GnmUndoFilterSetConditionClass {
 	GOUndoClass base;
 };
 
diff --git a/src/workbook-control-priv.h b/src/workbook-control-priv.h
index a529292..13db885 100644
--- a/src/workbook-control-priv.h
+++ b/src/workbook-control-priv.h
@@ -14,6 +14,28 @@ struct _WorkbookControl {
 
 	gulong clipboard_changed_signal;
 };
+
+typedef struct {
+	void (*add)	(WorkbookControl *wbc, SheetView *sv);
+	void (*remove)	(WorkbookControl *wbc, Sheet *sheet);
+	void (*focus)   (WorkbookControl *wbc, Sheet *sheet);
+	void (*remove_all) (WorkbookControl *wbc);
+	
+} WbcSheetManager;
+
+typedef struct {
+	void (*truncate)(WorkbookControl *wbc, int n, gboolean is_undo);
+	void (*pop)	(WorkbookControl *wbc, gboolean is_undo);
+	void (*push)	(WorkbookControl *wbc, gboolean is_undo,
+			 char const *text, gpointer key);
+	void (*labels)	(WorkbookControl *wbc,
+				 char const *undo, char const *redo);
+} WbcUndoRedo;
+
+typedef struct {
+	void (*update)      (WorkbookControl *wbc, int flags);
+} WbcMenuState;
+
 typedef struct {
 	GODocControlClass base;
 
@@ -28,23 +50,9 @@ typedef struct {
 	void (*edit_finish)	    (WorkbookControl *wbc, gboolean accept);
 	void (*selection_descr_set) (WorkbookControl *wbc, char const *text);
 	void (*update_action_sensitivity)  (WorkbookControl *wbc);
-	struct {
-		void (*add)	(WorkbookControl *wbc, SheetView *sv);
-		void (*remove)	(WorkbookControl *wbc, Sheet *sheet);
-		void (*focus)   (WorkbookControl *wbc, Sheet *sheet);
-		void (*remove_all) (WorkbookControl *wbc);
-	} sheet;
-	struct {
-		void (*truncate)(WorkbookControl *wbc, int n, gboolean is_undo);
-		void (*pop)	(WorkbookControl *wbc, gboolean is_undo);
-		void (*push)	(WorkbookControl *wbc, gboolean is_undo,
-				 char const *text, gpointer key);
-		void (*labels)	(WorkbookControl *wbc,
-				 char const *undo, char const *redo);
-	} undo_redo;
-	struct {
-		void (*update)      (WorkbookControl *wbc, int flags);
-	} menu_state;
+	WbcSheetManager sheet;
+	WbcUndoRedo undo_redo;
+	WbcMenuState menu_state;
 
 	gboolean (*claim_selection)      (WorkbookControl *wbc);
 	void	 (*paste_from_selection) (WorkbookControl *wbc,
