diff --git a/INSTALL b/INSTALL
index 2550dab..a1e89e1 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,11 +1,13 @@
 Installation Instructions
 *************************
 
-Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
-2006, 2007, 2008, 2009 Free Software Foundation, Inc.
+Copyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation,
+Inc.
 
-   This file is free documentation; the Free Software Foundation gives
-unlimited permission to copy, distribute and modify it.
+   Copying and distribution of this file, with or without modification,
+are permitted in any medium without royalty provided the copyright
+notice and this notice are preserved.  This file is offered as-is,
+without warranty of any kind.
 
 Basic Installation
 ==================
@@ -13,7 +15,11 @@ Basic Installation
    Briefly, the shell commands `./configure; make; make install' should
 configure, build, and install this package.  The following
 more-detailed instructions are generic; see the `README' file for
-instructions specific to this package.
+instructions specific to this package.  Some packages provide this
+`INSTALL' file but do not implement all of the features documented
+below.  The lack of an optional feature in a given package is not
+necessarily a bug.  More recommendations for GNU packages can be found
+in *note Makefile Conventions: (standards)Makefile Conventions.
 
    The `configure' shell script attempts to guess correct values for
 various system-dependent variables used during compilation.  It uses
@@ -42,7 +48,7 @@ may remove or edit it.
 you want to change it or regenerate `configure' using a newer version
 of `autoconf'.
 
-The simplest way to compile this package is:
+   The simplest way to compile this package is:
 
   1. `cd' to the directory containing the package's source code and type
      `./configure' to configure the package for your system.
@@ -53,12 +59,22 @@ The simplest way to compile this package is:
   2. Type `make' to compile the package.
 
   3. Optionally, type `make check' to run any self-tests that come with
-     the package.
+     the package, generally using the just-built uninstalled binaries.
 
   4. Type `make install' to install the programs and any data files and
-     documentation.
-
-  5. You can remove the program binaries and object files from the
+     documentation.  When installing into a prefix owned by root, it is
+     recommended that the package be configured and built as a regular
+     user, and only the `make install' phase executed with root
+     privileges.
+
+  5. Optionally, type `make installcheck' to repeat any self-tests, but
+     this time using the binaries in their final installed location.
+     This target does not install anything.  Running this target as a
+     regular user, particularly if the prior `make install' required
+     root privileges, verifies that the installation completed
+     correctly.
+
+  6. You can remove the program binaries and object files from the
      source code directory by typing `make clean'.  To also remove the
      files that `configure' created (so you can compile the package for
      a different kind of computer), type `make distclean'.  There is
@@ -67,8 +83,15 @@ The simplest way to compile this package is:
      all sorts of other programs in order to regenerate files that came
      with the distribution.
 
-  6. Often, you can also type `make uninstall' to remove the installed
-     files again.
+  7. Often, you can also type `make uninstall' to remove the installed
+     files again.  In practice, not all packages have tested that
+     uninstallation works correctly, even though it is required by the
+     GNU Coding Standards.
+
+  8. Some packages, particularly those that use Automake, provide `make
+     distcheck', which can by used by developers to test that all other
+     targets like `make install' and `make uninstall' work correctly.
+     This target is generally not run by end users.
 
 Compilers and Options
 =====================
@@ -93,7 +116,8 @@ same time, by placing the object files for each architecture in their
 own directory.  To do this, you can use GNU `make'.  `cd' to the
 directory where you want the object files and executables to go and run
 the `configure' script.  `configure' automatically checks for the
-source code in the directory that `configure' is in and in `..'.
+source code in the directory that `configure' is in and in `..'.  This
+is known as a "VPATH" build.
 
    With a non-GNU `make', it is safer to compile the package for one
 architecture at a time in the source code directory.  After you have
@@ -120,7 +144,8 @@ Installation Names
    By default, `make install' installs the package's commands under
 `/usr/local/bin', include files under `/usr/local/include', etc.  You
 can specify an installation prefix other than `/usr/local' by giving
-`configure' the option `--prefix=PREFIX'.
+`configure' the option `--prefix=PREFIX', where PREFIX must be an
+absolute file name.
 
    You can specify separate installation prefixes for
 architecture-specific files and architecture-independent files.  If you
@@ -131,15 +156,46 @@ Documentation and other data files still use the regular prefix.
    In addition, if you use an unusual directory layout you can give
 options like `--bindir=DIR' to specify different values for particular
 kinds of files.  Run `configure --help' for a list of the directories
-you can set and what kinds of files go in them.
+you can set and what kinds of files go in them.  In general, the
+default for these options is expressed in terms of `${prefix}', so that
+specifying just `--prefix' will affect all of the other directory
+specifications that were not explicitly provided.
+
+   The most portable way to affect installation locations is to pass the
+correct locations to `configure'; however, many packages provide one or
+both of the following shortcuts of passing variable assignments to the
+`make install' command line to change installation locations without
+having to reconfigure or recompile.
+
+   The first method involves providing an override variable for each
+affected directory.  For example, `make install
+prefix=/alternate/directory' will choose an alternate location for all
+directory configuration variables that were expressed in terms of
+`${prefix}'.  Any directories that were specified during `configure',
+but not in terms of `${prefix}', must each be overridden at install
+time for the entire installation to be relocated.  The approach of
+makefile variable overrides for each directory variable is required by
+the GNU Coding Standards, and ideally causes no recompilation.
+However, some platforms have known limitations with the semantics of
+shared libraries that end up requiring recompilation when using this
+method, particularly noticeable in packages that use GNU Libtool.
+
+   The second method involves providing the `DESTDIR' variable.  For
+example, `make install DESTDIR=/alternate/directory' will prepend
+`/alternate/directory' before all installation names.  The approach of
+`DESTDIR' overrides is not required by the GNU Coding Standards, and
+does not work on platforms that have drive letters.  On the other hand,
+it does better at avoiding recompilation issues, and works well even
+when some directory options were not specified in terms of `${prefix}'
+at `configure' time.
+
+Optional Features
+=================
 
    If the package supports it, you can cause programs to be installed
 with an extra prefix or suffix on their names by giving `configure' the
 option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
 
-Optional Features
-=================
-
    Some packages pay attention to `--enable-FEATURE' options to
 `configure', where FEATURE indicates an optional part of the package.
 They may also pay attention to `--with-PACKAGE' options, where PACKAGE
@@ -152,6 +208,13 @@ find the X include and library files automatically, but if it doesn't,
 you can use the `configure' options `--x-includes=DIR' and
 `--x-libraries=DIR' to specify their locations.
 
+   Some packages offer the ability to configure how verbose the
+execution of `make' will be.  For these packages, running `./configure
+--enable-silent-rules' sets the default to minimal output, which can be
+overridden with `make V=1'; while running `./configure
+--disable-silent-rules' sets the default to verbose, which can be
+overridden with `make V=0'.
+
 Particular systems
 ==================
 
@@ -163,6 +226,11 @@ order to use an ANSI C compiler:
 
 and if that doesn't work, install pre-built binaries of GCC for HP-UX.
 
+   HP-UX `make' updates targets which have the same time stamps as
+their prerequisites, which makes it generally unusable when shipped
+generated files such as `configure' are involved.  Use GNU `make'
+instead.
+
    On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
 parse its `<wchar.h>' header file.  The option `-nodtk' can be used as
 a workaround.  If GNU CC is not installed, it is therefore recommended
@@ -288,7 +356,7 @@ operates.
      `configure' can determine that directory automatically.
 
 `--prefix=DIR'
-     Use DIR as the installation prefix.  *Note Installation Names::
+     Use DIR as the installation prefix.  *note Installation Names::
      for more details, including other options available for fine-tuning
      the installation locations.
 
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..736b18b 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)
+	$(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)
+	$(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)
+	$(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-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;
