diff --git a/configure.in b/configure.in
index 6df81b7..067d781 100644
--- a/configure.in
+++ b/configure.in
@@ -602,6 +602,29 @@ AC_SUBST(EXTRA_LIBS)
 AC_SUBST(EXTRA_INCLUDES)
 AC_SUBST(EXTRA_DEPS)
 
+# 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/goffice/Makefile.am b/goffice/Makefile.am
index e8ada78..346ba41 100644
--- a/goffice/Makefile.am
+++ b/goffice/Makefile.am
@@ -129,3 +129,79 @@ embedded-stuff.c: $(top_srcdir)/tools/embedder $(embedded_stuff)
 		COMPRESS $(embedded_stuff_compress) \
 		NOCOMPRESS $(embedded_stuff_raw) \
 		>$(abs_builddir)/$@
+
+
+BUILT_GIRSOURCES = \
+	GOffice-@GOFFICE_API_VER@.gir \
+	GoCanvas-@GOFFICE_API_VER@.gir \
+	GoGraph-@GOFFICE_API_VER@.gir
+
+GOffice-@GOFFICE_API_VER@.gir: list_of_sources
+GOffice-@GOFFICE_API_VER@.gir: libgoffice-@GOFFICE_API_VER@.la
+GOffice-@GOFFICE_API_VER@.gir: $(G_IR_SCANNER) Makefile
+	$(AM_V_GEN) $(G_IR_SCANNER) -v --namespace GOffice --nsversion=1 \
+	    --add-include-path=$(srcdir) --add-include-path=. \
+	    --include=GObject-2.0 \
+	    --include=Gio-2.0 \
+	    --include=libxml2-2.0 \
+	    --include=Gtk-3.0 \
+	    --include=Gsf-1 \
+	    --identifier-prefix="GO" \
+	    --symbol-prefix="go" \
+	    --library=libgoffice-@GOFFICE_API_VER@.la \
+	    --libtool="$(LIBTOOL)" \
+	    --output $@ \
+	    --pkg libgoffice-@GOFFICE_API_VER@ \
+	    -I$(top_srcdir) \
+	    `cat $(srcdir)/list_of_sources`
+
+GoCanvas-@GOFFICE_API_VER@.gir: list_of_sources
+GoCanvas-@GOFFICE_API_VER@.gir: libgoffice-@GOFFICE_API_VER@.la
+GoCanvas-@GOFFICE_API_VER@.gir: $(G_IR_SCANNER) Makefile
+	$(AM_V_GEN) $(G_IR_SCANNER) -v --namespace GoCanvas --nsversion=1 \
+	    --add-include-path=$(srcdir) --add-include-path=. \
+	    --include=GObject-2.0 \
+	    --include=Gio-2.0 \
+	    --include=libxml2-2.0 \
+	    --include=Gtk-3.0 \
+	    --include=Gsf-1 \
+	    --identifier-prefix="Goc" \
+	    --symbol-prefix="goc" \
+	    --library=libgoffice-@GOFFICE_API_VER@.la \
+	    --libtool="$(LIBTOOL)" \
+	    --output $@ \
+	    --pkg libgoffice-@GOFFICE_API_VER@ \
+	    -I$(top_srcdir) \
+	    `cat $(srcdir)/list_of_sources`
+
+GoGraph-@GOFFICE_API_VER@.gir: list_of_sources
+GoGraph-@GOFFICE_API_VER@.gir: libgoffice-@GOFFICE_API_VER@.la
+GoGraph-@GOFFICE_API_VER@.gir: $(G_IR_SCANNER) Makefile
+	$(AM_V_GEN) $(G_IR_SCANNER) -v --namespace GoGraph --nsversion=1 \
+	    --add-include-path=$(srcdir) --add-include-path=. \
+	    --include=GObject-2.0 \
+	    --include=Gio-2.0 \
+	    --include=libxml2-2.0 \
+	    --include=Gtk-3.0 \
+	    --include=Gsf-1 \
+	    --identifier-prefix="Gog" \
+	    --symbol-prefix="gog" \
+	    --library=libgoffice-@GOFFICE_API_VER@.la \
+	    --libtool="$(LIBTOOL)" \
+	    --output $@ \
+	    --pkg libgoffice-@GOFFICE_API_VER@ \
+	    -I$(top_srcdir) \
+	    `cat $(srcdir)/list_of_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/goffice/app/go-cmd-context-impl.h b/goffice/app/go-cmd-context-impl.h
index 9c7dd17..70ebc0c 100644
--- a/goffice/app/go-cmd-context-impl.h
+++ b/goffice/app/go-cmd-context-impl.h
@@ -8,17 +8,19 @@
 G_BEGIN_DECLS
 
 typedef struct {
+	void (*error)		(GOCmdContext *gcc, GError *err);
+	void (*error_info)  	(GOCmdContext *gcc, GOErrorInfo *err);
+	void (*error_info_list) (GOCmdContext *gcc, GSList *errs);
+} GOCmdErrorIFace;
+
+typedef struct {
 	GTypeInterface base;
 
 	char *  (*get_password)		(GOCmdContext *gcc,
 					 char const *filename);
 	void    (*set_sensitive)	(GOCmdContext *gcc,
 					 gboolean sensitive);
-	struct {
-		void (*error)		(GOCmdContext *gcc, GError *err);
-		void (*error_info)  	(GOCmdContext *gcc, GOErrorInfo *err);
-		void (*error_info_list) (GOCmdContext *gcc, GSList *errs);
-	} error;
+	GOCmdErrorIFace error;
 
 	void    (*progress_set)		(GOCmdContext *gcc, double val);
 	void    (*progress_message_set)	(GOCmdContext *gcc, gchar const *msg);
diff --git a/goffice/app/go-doc-impl.h b/goffice/app/go-doc-impl.h
index 5fb0798..b8c1774 100644
--- a/goffice/app/go-doc-impl.h
+++ b/goffice/app/go-doc-impl.h
@@ -37,14 +37,16 @@ struct _GODoc {
 	GHashTable	*imagebuf; /* used when loading/saving images */
 };
 
+struct _GOMetaDataIFace {
+	/* Reload doc statistics and update linked values */
+	void (*update)  (GODoc *doc);
+	void (*changed) (GODoc *doc);
+};
+
 typedef struct {
 	GObjectClass	base;
 
-	struct {
-		/* Reload doc statistics and update linked values */
-		void (*update)  (GODoc *doc);
-		void (*changed) (GODoc *doc);
-	} meta_data;
+	struct _GOMetaDataIFace meta_data;
 } GODocClass;
 
 #define GO_DOC_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST ((k), GO_TYPE_DOC, GODocClass))
diff --git a/goffice/app/go-plugin-loader-module.h b/goffice/app/go-plugin-loader-module.h
index 588aefb..9eace2e 100644
--- a/goffice/app/go-plugin-loader-module.h
+++ b/goffice/app/go-plugin-loader-module.h
@@ -13,14 +13,15 @@ G_BEGIN_DECLS
 #define GO_PLUGIN_LOADER_MODULE_CLASS(k)	(G_TYPE_CHECK_CLASS_CAST ((k), GO_TYPE_PLUGIN_LOADER_MODULE, GOPluginLoaderModuleClass))
 #define GO_IS_PLUGIN_LOADER_MODULE_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), GO_TYPE_PLUGIN_LOADER_MODULE))
 
+typedef void (*GOPluginMethod) (GOPlugin *plugin, GOCmdContext *cc);
 typedef struct {
 	GObject	base;
 
 	gchar *module_file_name;
 	GModule *handle;
 
-	void (*plugin_init)	(GOPlugin *plugin, GOCmdContext *cc);
-	void (*plugin_shutdown) (GOPlugin *plugin, GOCmdContext *cc);
+	GOPluginMethod plugin_init;
+	GOPluginMethod plugin_shutdown;
 } GOPluginLoaderModule;
 typedef GObjectClass GOPluginLoaderModuleClass;
 
diff --git a/goffice/graph/gog-axis-line.c b/goffice/graph/gog-axis-line.c
index 5a0b7ec..f19566d 100644
--- a/goffice/graph/gog-axis-line.c
+++ b/goffice/graph/gog-axis-line.c
@@ -419,7 +419,6 @@ cb_position_toggled (GtkWidget *button, AxisBasePrefs *state)
 	GogAxisBase *axis_base = state->axis_base;
 	GogAxisPosition position;
 	char const *widget_name = gtk_buildable_get_name (GTK_BUILDABLE (button));
-	GSList *lines, *axes, *aptr, *lptr;
 
 	if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)))
 		return;
diff --git a/goffice/graph/gog-plot.h b/goffice/graph/gog-plot.h
index 6989d8c..7ac1c41 100644
--- a/goffice/graph/gog-plot.h
+++ b/goffice/graph/gog-plot.h
@@ -26,9 +26,11 @@
 G_BEGIN_DECLS
 
 typedef struct {
-	struct {
-		double minima, maxima;
-	} val, logical;
+	double minima, maxima;
+} GogPlotBound;
+
+typedef struct {
+	GogPlotBound val, logical;
 	gboolean is_discrete;
 	gboolean center_on_ticks;
 	GOFormat *fmt;
diff --git a/goffice/utils/go-path.c b/goffice/utils/go-path.c
index cdbb33c..91e8508 100644
--- a/goffice/utils/go-path.c
+++ b/goffice/utils/go-path.c
@@ -486,10 +486,10 @@ go_path_rectangle (GOPath *path,
 void
 go_path_interpret (GOPath const		*path,
 		   GOPathDirection 	 direction,
-		   GOPathMoveToFunc 	*move_to,
-		   GOPathLineToFunc 	*line_to,
-		   GOPathCurveToFunc 	*curve_to,
-		   GOPathClosePathFunc 	*close_path,
+		   GOPathMoveToFunc 	 move_to,
+		   GOPathLineToFunc 	 line_to,
+		   GOPathCurveToFunc 	 curve_to,
+		   GOPathClosePathFunc 	 close_path,
 		   void *closure)
 {
 	GOPathDataBuffer *buffer;
@@ -513,17 +513,17 @@ go_path_interpret (GOPath const		*path,
 
 				switch (action) {
 					case GO_PATH_ACTION_MOVE_TO:
-						(*move_to) (closure, &points[0]);
+						move_to (closure, &points[0]);
 						break;
 					case GO_PATH_ACTION_LINE_TO:
-						(*line_to) (closure, &points[0]);
+						line_to (closure, &points[0]);
 						break;
 					case GO_PATH_ACTION_CURVE_TO:
-						(*curve_to) (closure, &points[0], &points[1], &points[2]);
+						curve_to (closure, &points[0], &points[1], &points[2]);
 						break;
 					case GO_PATH_ACTION_CLOSE_PATH:
 					default:
-						(*close_path) (closure);
+						close_path (closure);
 						break;
 				}
 				points += action_n_args[action];
@@ -602,10 +602,10 @@ void
 go_path_to_cairo (GOPath const *path, GOPathDirection direction, cairo_t *cr)
 {
 	go_path_interpret (path, direction,
-			   (GOPathMoveToFunc *) go_path_cairo_move_to,
-			   (GOPathLineToFunc *) go_path_cairo_line_to,
-			   (GOPathCurveToFunc *) go_path_cairo_curve_to,
-			   (GOPathClosePathFunc *) cairo_close_path, cr);
+			   (GOPathMoveToFunc) go_path_cairo_move_to,
+			   (GOPathLineToFunc) go_path_cairo_line_to,
+			   (GOPathCurveToFunc) go_path_cairo_curve_to,
+			   (GOPathClosePathFunc) cairo_close_path, cr);
 }
 
 static void
@@ -644,10 +644,10 @@ GOPath *go_path_copy (GOPath const *path)
 	GOPath *new_path = go_path_new ();
 	new_path->options = path->options;
 	go_path_interpret (path, GO_PATH_DIRECTION_FORWARD,
-			   (GOPathMoveToFunc *) go_path_append_move_to,
-			   (GOPathLineToFunc *) go_path_append_line_to,
-			   (GOPathCurveToFunc *) go_path_append_curve_to,
-			   (GOPathClosePathFunc *) go_path_append_close, new_path);
+			   (GOPathMoveToFunc) go_path_append_move_to,
+			   (GOPathLineToFunc) go_path_append_line_to,
+			   (GOPathCurveToFunc) go_path_append_curve_to,
+			   (GOPathClosePathFunc) go_path_append_close, new_path);
 	return new_path;
 }
 
@@ -662,9 +662,9 @@ GOPath *go_path_copy (GOPath const *path)
 GOPath *go_path_append (GOPath *path1, GOPath const *path2)
 {
 	go_path_interpret (path2, GO_PATH_DIRECTION_FORWARD,
-			   (GOPathMoveToFunc *) go_path_append_move_to,
-			   (GOPathLineToFunc *) go_path_append_line_to,
-			   (GOPathCurveToFunc *) go_path_append_curve_to,
-			   (GOPathClosePathFunc *) go_path_append_close, path1);
+			   (GOPathMoveToFunc) go_path_append_move_to,
+			   (GOPathLineToFunc) go_path_append_line_to,
+			   (GOPathCurveToFunc) go_path_append_curve_to,
+			   (GOPathClosePathFunc) go_path_append_close, path1);
 	return path1;
 }
diff --git a/goffice/utils/go-path.h b/goffice/utils/go-path.h
index 2a14d23..e92192c 100644
--- a/goffice/utils/go-path.h
+++ b/goffice/utils/go-path.h
@@ -51,12 +51,12 @@ typedef struct {
 	double y;
 } GOPathPoint;
 
-typedef void (GOPathMoveToFunc) 	(void *closure, GOPathPoint const *point);
-typedef void (GOPathLineToFunc) 	(void *closure, GOPathPoint const *point);
-typedef void (GOPathCurveToFunc) 	(void *closure, GOPathPoint const *point0,
+typedef void (*GOPathMoveToFunc) 	(void *closure, GOPathPoint const *point);
+typedef void (*GOPathLineToFunc) 	(void *closure, GOPathPoint const *point);
+typedef void (*GOPathCurveToFunc) 	(void *closure, GOPathPoint const *point0,
 					 		GOPathPoint const *point1,
 							GOPathPoint const *point2);
-typedef void (GOPathClosePathFunc) 	(void *closure);
+typedef void (*GOPathClosePathFunc) 	(void *closure);
 
 GType   go_path_get_type (void);
 
@@ -98,10 +98,10 @@ void	go_path_rectangle	(GOPath *path, double x, double y,
 
 void	go_path_interpret	(GOPath const *path,
 				 GOPathDirection direction,
-				 GOPathMoveToFunc *move_to,
-				 GOPathLineToFunc *line_to,
-				 GOPathCurveToFunc *curve_to,
-				 GOPathClosePathFunc *close_path,
+				 GOPathMoveToFunc move_to,
+				 GOPathLineToFunc line_to,
+				 GOPathCurveToFunc curve_to,
+				 GOPathClosePathFunc close_path,
 				 void *closure);
 
 void    go_path_to_cairo	(GOPath const *path,
diff --git a/goffice/utils/go-style.h b/goffice/utils/go-style.h
index 17e9347..8f7de96 100644
--- a/goffice/utils/go-style.h
+++ b/goffice/utils/go-style.h
@@ -77,6 +77,28 @@ typedef struct {
 } GOStyleLine;
 
 typedef struct {
+	GOGradientDirection dir;
+	double brightness; /* < 0 => 2 color */
+} GOStyleGradient;
+
+typedef struct {
+	GOImageType	 type;
+	GOImage	 *image;
+} GOStyleImage;
+
+typedef struct {
+	GOStyleFill	type;
+	gboolean	auto_type;
+	gboolean	auto_fore, auto_back;	/* share between pattern and gradient */
+	gboolean	invert_if_negative;	/* placeholder for XL */
+
+	/* This could all be a union but why bother ? */
+	GOPattern pattern;
+	GOStyleGradient gradient;
+	GOStyleImage image;
+} GOStyleArea;
+
+typedef struct {
 	GOMarker *mark;
 	gboolean auto_shape;
 	gboolean auto_outline_color;
@@ -90,23 +112,7 @@ struct _GOStyle {
 	GOStyleFlag	disable_theming;
 
 	GOStyleLine	line;
-	struct {
-		GOStyleFill	type;
-		gboolean	auto_type;
-		gboolean	auto_fore, auto_back;	/* share between pattern and gradient */
-		gboolean	invert_if_negative;	/* placeholder for XL */
-
-		/* This could all be a union but why bother ? */
-		GOPattern pattern;
-		struct {
-			GOGradientDirection dir;
-			double brightness; /* < 0 => 2 color */
-		} gradient;
-		struct {
-			GOImageType	 type;
-			GOImage	 *image;
-		} image;
-	} fill;
+	GOStyleArea fill;
 	GOStyleMark marker;
 	struct {
 		GOColor		 color;
