diff --git a/Makefile.am b/Makefile.am
index 7f504936c30a087c9c90f9c9698788bf33f8a397..ac9c1df61a9cabf8cc75ef1bb8b14cf7a066ac8e 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,4 +1,4 @@
-SUBDIRS = src glade
+SUBDIRS = src introspection vapi glade
 EXTRA_DIST = autogen.sh
 ACLOCAL_AMFLAGS = -Im4
 DISTCHECK_CONFIGURE_FLAGS = --enable-introspection
diff --git a/configure.ac b/configure.ac
index 24911cdd22947bdb5aaa490e1cdaa62ad38f8c1d..e9180db3887cdb9c11dfea3bc28b2f58bc9c7d38 100644
--- a/configure.ac
+++ b/configure.ac
@@ -12,6 +12,13 @@ LT_INIT([dlopen])
 
 GOBJECT_INTROSPECTION_CHECK([1.40.0])
 
+m4_ifdef([VAPIGEN_CHECK], [
+VAPIGEN_CHECK([0.48])
+],[
+AM_CONDITIONAL([ENABLE_VAPIGEN], false)
+])
+
+
 m4_ifdef([GTK_DOC_CHECK], [
 GTK_DOC_CHECK([1.31],[--flavour no-tmpl])
 ],[
@@ -38,6 +45,8 @@ AC_CONFIG_FILES([gtknodes.pc])
 
 AC_OUTPUT([Makefile])
 AC_OUTPUT([src/Makefile])
+AC_OUTPUT([introspection/Makefile])
+AC_OUTPUT([vapi/Makefile])
 AC_OUTPUT([examples/Makefile])
 AC_OUTPUT([glade/Makefile])
 AC_OUTPUT([docs/reference/gtknodes/Makefile])
diff --git a/introspection/Makefile.am b/introspection/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..c41e81af26429a0005d98a70647f54b9d1812f77
--- /dev/null
+++ b/introspection/Makefile.am
@@ -0,0 +1,32 @@
+
+INTROSPECTION_GIRS =
+INTROSPECTION_SCANNER_ARGS = --add-include-path=$(top_srcdir)/src --warn-all
+INTROSPECTION_COMPILER_ARGS = --includedir=$(top_srcdir)/src
+
+if HAVE_INTROSPECTION
+include $(INTROSPECTION_MAKEFILE)
+introspection_sources = $(top_srcdir)/src/gtknodesocket.c \
+			$(top_srcdir)/src/gtknodesocket.h \
+			$(top_srcdir)/src/gtknode.c \
+			$(top_srcdir)/src/gtknode.h \
+			$(top_srcdir)/src/gtknodeview.c \
+			$(top_srcdir)/src/gtknodeview.h
+
+GtkNodes-0.1.gir: $(INTROSPECTION_SCANNER) $(top_srcdir)/src/libgtknodes-0.1.la Makefile
+
+GtkNodes_0_1_gir_NAMESPACE = GtkNodes
+GtkNodes_0_1_gir_INCLUDES = GObject-2.0 Gtk-3.0
+GtkNodes_0_1_gir_CFLAGS = $(INCLUDES) -I$(top_srcdir)/src
+GtkNodes_0_1_gir_LIBS = $(top_srcdir)/src/libgtknodes-0.1.la
+GtkNodes_0_1_gir_FILES = $(introspection_sources)
+INTROSPECTION_GIRS += GtkNodes-0.1.gir
+
+girdir = $(datadir)/gir-1.0
+gir_DATA = $(INTROSPECTION_GIRS)
+
+typelibdir = $(libdir)/girepository-1.0
+typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
+
+CLEANFILES = $(gir_DATA) $(typelib_DATA)
+
+endif
diff --git a/src/Makefile.am b/src/Makefile.am
index c60946e66e9e97cba77125a58b0a2626ea6335d6..4b8b05604ac2d374d824e347520423bead9547a1 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -24,34 +24,4 @@ pkginclude_HEADERS = gtknodesocket.h \
 CLEANFILES= $(BUILT_SOURCES)
 
 
--include $(INTROSPECTION_MAKEFILE)
 
-INTROSPECTION_GIRS =
-INTROSPECTION_SCANNER_ARGS = --add-include-path=$(srcdir) --warn-all
-INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir)
-
-if HAVE_INTROSPECTION
-introspection_sources = gtknodesocket.c \
-			gtknodesocket.h \
-			gtknode.c \
-			gtknode.h \
-			gtknodeview.c \
-			gtknodeview.h
-
-GtkNodes-0.1.gir: $(INTROSPECTION_SCANNER) libgtknodes-0.1.la Makefile
-
-GtkNodes_0_1_gir_NAMESPACE = GtkNodes
-GtkNodes_0_1_gir_INCLUDES = GObject-2.0 Gtk-3.0
-GtkNodes_0_1_gir_CFLAGS = $(INCLUDES)
-GtkNodes_0_1_gir_LIBS = libgtknodes-0.1.la
-GtkNodes_0_1_gir_FILES = $(introspection_sources)
-INTROSPECTION_GIRS += GtkNodes-0.1.gir
-
-girdir = $(datadir)/gir-1.0
-gir_DATA = $(INTROSPECTION_GIRS)
-
-typelibdir = $(libdir)/girepository-1.0
-typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
-
-CLEANFILES += $(gir_DATA) $(typelib_DATA)
-endif
diff --git a/vapi/Makefile.am b/vapi/Makefile.am
new file mode 100644
index 0000000000000000000000000000000000000000..8f9abfa155a92c7df942fc33af7a44d75cf38bb0
--- /dev/null
+++ b/vapi/Makefile.am
@@ -0,0 +1,21 @@
+VAPIGEN_VAPIS = libgtknodes.vapi
+
+if ENABLE_VAPIGEN
+
+include $(VAPIGEN_MAKEFILE)
+
+libgtknodes.vapi: $(top_builddir)/introspection/GtkNodes-0.1.gir libgtknodes.deps
+
+libgtknodes_vapi_METADATADIRS = $(srcdir)
+libgtknodes_vapi_FILES = $(top_builddir)/introspection/GtkNodes-0.1.gir
+libgtknodes_vapi_VAPIDIRS = $(builddir)
+libgtknodes_vapi_DEPS = glib-2.0 gio-2.0 gtk+-3.0
+
+vapidir = $(datadir)/vala/vapi
+vapi_DATA = $(VAPIGEN_VAPIS) $(VAPIGEN_VAPIS:.vapi=.deps)
+
+endif
+
+CLEANFILES = $(VAPIGEN_VAPIS)
+EXTRA_DIST = \
+	libgtknodes.deps
diff --git a/vapi/libgtknodes.deps b/vapi/libgtknodes.deps
new file mode 100644
index 0000000000000000000000000000000000000000..82608834b856a1ed15abec1262876d46ca2956e2
--- /dev/null
+++ b/vapi/libgtknodes.deps
@@ -0,0 +1,3 @@
+glib-2.0
+gio-2.0
+gtk+-3.0