[DRE-commits] [ruby-gnome2] 20/31: New upstream version 3.0.9

Daisuke Higuchi dai at moszumanska.debian.org
Mon Oct 10 13:40:19 UTC 2016


This is an automated email from the git hooks/post-receive script.

dai pushed a commit to branch exp/debian
in repository ruby-gnome2.

commit 5f0b7e1eb7cd13a0304dc8412cf73e3d44ba73be
Author: HIGUCHI Daisuke (VDR dai) <dai at debian.org>
Date:   Sun Oct 9 21:56:57 2016 +0900

    New upstream version 3.0.9
---
 NEWS                                               |  411 +++
 README.md                                          |    6 +-
 Rakefile                                           |   93 +-
 build/Vagrantfile                                  |   12 +-
 build/build-windows.sh                             |    5 +-
 clutter-gstreamer/lib/clutter-gst.rb               |    6 +-
 clutter-gstreamer/test/run-test.rb                 |    9 +
 clutter-gtk/lib/clutter-gtk.rb                     |    6 +-
 clutter-gtk/sample/events.rb                       |    2 +-
 clutter-gtk/sample/test.rb                         |    2 +-
 clutter-gtk/sample/window-test.rb                  |    4 +-
 clutter-gtk/sample/window-test2.rb                 |    2 +-
 clutter-gtk/test/run-test.rb                       |    7 +
 clutter/Rakefile                                   |    2 +-
 clutter/lib/clutter.rb                             |    6 +-
 clutter/sample/bin-layout.rb                       |    2 +-
 clutter/sample/image-content.rb                    |    2 +-
 clutter/sample/pan-action.rb                       |    2 +-
 clutter/test/run-test.rb                           |    7 +-
 extconf.rb                                         |    1 +
 gdk3/Rakefile                                      |    3 +-
 gdk3/lib/gdk3/deprecated.rb                        |   10 +-
 gdk3/test/test-gdk-cursor.rb                       |    2 +-
 gdk_pixbuf2-no-gi/COPYING.LIB                      |  502 ++++
 {gdk_pixbuf2 => gdk_pixbuf2-no-gi}/README          |    0
 {gdk_pixbuf2 => gdk_pixbuf2-no-gi}/Rakefile        |    0
 .../ext/gdk_pixbuf2/depend                         |    0
 .../ext/gdk_pixbuf2/extconf.rb                     |    0
 .../ext/gdk_pixbuf2/gdk_pixbuf2.def                |    0
 .../ext/gdk_pixbuf2/rbgdk-pixbuf-format.c          |    0
 .../ext/gdk_pixbuf2/rbgdk-pixbuf-loader.c          |    0
 .../ext/gdk_pixbuf2/rbgdk-pixbuf.c                 |    0
 .../ext/gdk_pixbuf2/rbgdk-pixbuf.h                 |    0
 .../ext/gdk_pixbuf2/rbgdk-pixbuf2conversions.h     |    0
 .../ext/gdk_pixbuf2/rbgdk-pixbuf2private.h         |    0
 .../ext/gdk_pixbuf2/rbgdk-pixbufanimation.c        |    0
 .../ext/gdk_pixbuf2/rbgdk-pixbufanimationiter.c    |    0
 .../ext/gdk_pixbuf2/rbgdk-pixbufsimpleanim.c       |    0
 .../ext/gdk_pixbuf2/rbgdk-pixdata.c                |    0
 {gdk_pixbuf2 => gdk_pixbuf2-no-gi}/extconf.rb      |    0
 .../lib/gdk_pixbuf2.rb                             |    0
 {gdk_pixbuf2 => gdk_pixbuf2-no-gi}/sample/anim.rb  |    0
 .../sample/composite.rb                            |    0
 {gdk_pixbuf2 => gdk_pixbuf2-no-gi}/sample/flip.rb  |    0
 gdk_pixbuf2-no-gi/sample/floppybuddy.gif           |  Bin 0 -> 5216 bytes
 .../sample/format.rb                               |    0
 gdk_pixbuf2-no-gi/sample/gnome-foot.png            |  Bin 0 -> 2916 bytes
 .../sample/inline.rb                               |    0
 .../sample/loader.rb                               |    0
 .../sample/pixdata.rb                              |    0
 .../sample/rotate.rb                               |    0
 {gdk_pixbuf2 => gdk_pixbuf2-no-gi}/sample/save.rb  |    0
 {gdk_pixbuf2 => gdk_pixbuf2-no-gi}/sample/scale.rb |    0
 .../sample/simpleanim.rb                           |    0
 {gdk_pixbuf2 => gdk_pixbuf2-no-gi}/sample/utils.rb |    0
 {gdk_pixbuf2 => gdk_pixbuf2-no-gi}/sample/xpm.rb   |    0
 .../test/gdk_pixbuf2-test-utils.rb                 |    0
 .../test/run-test.rb                               |    0
 .../test/test-version.rb                           |    0
 gdk_pixbuf2/{README => README.md}                  |    9 +-
 gdk_pixbuf2/Rakefile                               |    2 +-
 gdk_pixbuf2/lib/gdk_pixbuf2.rb                     |   80 +-
 gdk_pixbuf2/lib/gdk_pixbuf2/deprecated.rb          |  160 ++
 .../lib/gdk_pixbuf2/loader.rb                      |   47 +-
 .../gdk_pixbuf2/pixbuf-loader.rb}                  |   12 +-
 gdk_pixbuf2/lib/gdk_pixbuf2/pixbuf.rb              |  282 ++
 .../lib/gdk_pixbuf2/version.rb                     |   22 +-
 gdk_pixbuf2/sample/anim.rb                         |    4 +-
 gdk_pixbuf2/sample/composite.rb                    |   52 +-
 gdk_pixbuf2/sample/flip.rb                         |    4 +-
 gdk_pixbuf2/sample/format.rb                       |    6 +-
 gdk_pixbuf2/sample/loader.rb                       |    6 +-
 gdk_pixbuf2/sample/rotate.rb                       |    8 +-
 gdk_pixbuf2/sample/save.rb                         |    6 +-
 gdk_pixbuf2/sample/scale.rb                        |   20 +-
 gdk_pixbuf2/sample/simpleanim.rb                   |   14 +-
 gdk_pixbuf2/sample/utils.rb                        |   11 +-
 gdk_pixbuf2/sample/xpm.rb                          |   18 +-
 gdk_pixbuf2/test/fixture/floppybuddy.gif           |  Bin 0 -> 5216 bytes
 gdk_pixbuf2/test/fixture/gnome-logo-icon.png       |  Bin 0 -> 3090 bytes
 gdk_pixbuf2/test/fixture/image.gresource           |  Bin 0 -> 3338 bytes
 gdk_pixbuf2/test/fixture/image.gresource.xml       |    6 +
 gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb         |   11 +
 gdk_pixbuf2/test/run-test.rb                       |    9 +-
 .../test/test-animation.rb                         |   19 +-
 .../arg-info.rb => gdk_pixbuf2/test/test-loader.rb |   20 +-
 gdk_pixbuf2/test/test-pixbuf.rb                    |  334 +++
 gio2/lib/gio2.rb                                   |   21 +-
 gio2/lib/gio2/application-command-line.rb          |    5 -
 gio2/lib/gio2/loader.rb                            |    9 +-
 glib2/Rakefile                                     |    4 +-
 glib2/ext/glib2/extconf.rb                         |    1 -
 glib2/ext/glib2/rbglib-variant-type.c              |    6 +-
 glib2/ext/glib2/rbglib-variant.c                   |   28 +-
 glib2/ext/glib2/rbglib.c                           |   38 -
 glib2/ext/glib2/rbglib.h                           |    4 +-
 glib2/ext/glib2/rbglib_convert.c                   |   12 +-
 glib2/ext/glib2/rbglib_matchinfo.c                 |    4 +
 glib2/ext/glib2/rbglib_regex.c                     |   13 +-
 glib2/ext/glib2/rbgobj_object.c                    |  122 +-
 glib2/ext/glib2/rbgobj_signal.c                    |   13 +-
 glib2/ext/glib2/rbgobj_type.c                      |    8 +-
 glib2/ext/glib2/rbgobject.c                        |    6 -
 glib2/ext/glib2/rbgprivate.h                       |    4 -
 glib2/ext/glib2/rbgutil.c                          |    2 -
 glib2/ext/glib2/rbgutil.h                          |    4 +-
 glib2/lib/glib2.rb                                 |    7 +
 glib2/lib/gnome2/rake/external-package.rb          |  120 +-
 glib2/lib/gnome2/rake/package-task.rb              |   66 +-
 glib2/lib/gnome2/rake/windows-binary-build-task.rb |  680 ++---
 .../gnome2/rake/windows-binary-download-task.rb    |  299 +-
 glib2/lib/mkmf-gnome2.rb                           |   41 +-
 glib2/test/test-binding.rb                         |  223 +-
 glib2/test/test_glib2.rb                           |   27 +-
 gnumeric/COPYING.LIB                               |  502 ++++
 gnumeric/README.md                                 |   25 +
 {vte3 => gnumeric}/Rakefile                        |   33 +-
 vte3/lib/vte3.rb => gnumeric/lib/gnm.rb            |   18 +-
 gnumeric/lib/gnm/loader.rb                         |   59 +
 .../lib/gnumeric.rb                                |    7 +-
 gnumeric/test/fixtures/hello.gnumeric              |  Bin 0 -> 1803 bytes
 .../test/gnumeric-test-utils.rb                    |    9 +-
 {clutter => gnumeric}/test/run-test.rb             |   49 +-
 gnumeric/test/test-convert.rb                      |   35 +
 gobject-introspection/Rakefile                     |    2 +-
 .../ext/gobject-introspection/rb-gi-argument.c     |   95 +-
 .../gobject-introspection/rb-gi-function-info.c    |   30 +-
 .../lib/gobject-introspection/arg-info.rb          |    7 +
 .../lib/gobject-introspection/callable-info.rb     |   79 +-
 .../lib/gobject-introspection/collection-reader.rb |   13 +-
 .../lib/gobject-introspection/loader.rb            |   61 +-
 goffice/COPYING.LIB                                |  502 ++++
 goffice/README.md                                  |   25 +
 {vte3 => goffice}/Rakefile                         |   64 +-
 vte3/lib/vte3.rb => goffice/lib/goffice.rb         |   15 +-
 goffice/lib/goffice/loader.rb                      |   89 +
 .../arg-info.rb => goffice/lib/goffice/version.rb  |   22 +-
 .../patches/libxslt-1.1.28-add-mkdir-fallback.diff |   11 +
 .../test/goffice-test-utils.rb                     |    7 +-
 {clutter => goffice}/test/run-test.rb              |   47 +-
 .../test/test-data-scalar-str.rb                   |   11 +-
 gsf/COPYING.LIB                                    |  502 ++++
 gsf/README.md                                      |   25 +
 {vte3 => gsf}/Rakefile                             |   29 +-
 gio2/lib/gio2.rb => gsf/lib/gsf.rb                 |   18 +-
 .../lib/gsf/input.rb                               |   14 +-
 gsf/lib/gsf/loader.rb                              |   57 +
 .../test/gsf-test-utils.rb                         |    6 +-
 {gdk_pixbuf2 => gsf}/test/run-test.rb              |   27 +-
 .../test/test-input-stdio.rb                       |   13 +-
 gstreamer/Rakefile                                 |   28 +-
 .../gst-plugins-bad-1.8.0-add-missing-lole32.diff  |   12 -
 gtk2/sample/gtk-demo/appwindow.rb                  |    4 +-
 gtk2/sample/gtk-demo/cairo-clip-image.rb           |    2 +-
 gtk2/sample/gtk-demo/cairo-image.rb                |    2 +-
 gtk2/sample/gtk-demo/iconview.rb                   |    6 +-
 gtk2/sample/gtk-demo/images.rb                     |    6 +-
 gtk2/sample/gtk-demo/pixbufs.rb                    |   16 +-
 gtk2/sample/gtk-demo/stock_browser.rb              |    2 +-
 gtk2/sample/gtk-demo/textview.rb                   |    4 +-
 gtk2/sample/misc/aboutdialog.rb                    |    2 +-
 gtk2/sample/misc/combobox.rb                       |    2 +-
 gtk2/sample/misc/iconview.rb                       |    4 +-
 gtk2/sample/misc/itemfactory.rb                    |    2 +-
 gtk2/sample/misc/itemfactory2.rb                   |    2 +-
 gtk2/sample/misc/to_drawable.rb                    |    4 +-
 gtk2/sample/misc/treeview.rb                       |    2 +-
 gtk2/test/test_gdk_pixbuf.rb                       |   12 +-
 gtk3/ext/gtk3/rb-gtk3.c                            |   17 +
 gtk3/lib/gtk3/container.rb                         |    7 -
 gtk3/lib/gtk3/deprecated.rb                        |    6 +-
 gtk3/lib/gtk3/image.rb                             |   14 +-
 gtk3/lib/gtk3/loader.rb                            |   16 +-
 gtk3/lib/gtk3/text-buffer.rb                       |   45 +-
 gtk3/lib/gtk3/text-view.rb                         |   53 +
 gtk3/lib/gtk3/tree-model.rb                        |    5 +
 gtk3/lib/gtk3/tree-view.rb                         |   25 +
 gtk3/lib/gtk3/widget.rb                            |    5 -
 gtk3/sample/gtk-demo/TODO                          |   16 +-
 gtk3/sample/gtk-demo/application.ui                |  163 +-
 gtk3/sample/gtk-demo/appmenu.ui                    |   19 +
 gtk3/sample/gtk-demo/assistant.rb                  |    1 +
 gtk3/sample/gtk-demo/css_accordion.css             |   16 +-
 gtk3/sample/gtk-demo/css_accordion.rb              |    4 +-
 gtk3/sample/gtk-demo/css_basics.css                |    2 +-
 gtk3/sample/gtk-demo/css_basics.rb                 |    4 +-
 gtk3/sample/gtk-demo/css_multiplebgs.rb            |    4 +-
 gtk3/sample/gtk-demo/css_pixbufs.css               |    4 +-
 gtk3/sample/gtk-demo/css_pixbufs.rb                |    4 +-
 gtk3/sample/gtk-demo/css_shadows.css               |   10 +-
 gtk3/sample/gtk-demo/css_shadows.rb                |    4 +-
 gtk3/sample/gtk-demo/cssview.css                   |   10 +-
 .../data/16x16/gtk3-demo-symbolic.symbolic.png     |  Bin 0 -> 324 bytes
 gtk3/sample/gtk-demo/data/16x16/gtk3-demo.png      |  Bin 0 -> 874 bytes
 .../data/22x22/gtk3-demo-symbolic.symbolic.png     |  Bin 0 -> 437 bytes
 gtk3/sample/gtk-demo/data/22x22/gtk3-demo.png      |  Bin 0 -> 1281 bytes
 .../data/24x24/gtk3-demo-symbolic.symbolic.png     |  Bin 0 -> 465 bytes
 gtk3/sample/gtk-demo/data/24x24/gtk3-demo.png      |  Bin 0 -> 1374 bytes
 .../data/256x256/gtk3-demo-symbolic.symbolic.png   |  Bin 0 -> 3937 bytes
 gtk3/sample/gtk-demo/data/256x256/gtk3-demo.png    |  Bin 0 -> 18667 bytes
 .../data/32x32/gtk3-demo-symbolic.symbolic.png     |  Bin 0 -> 581 bytes
 gtk3/sample/gtk-demo/data/32x32/gtk3-demo.png      |  Bin 0 -> 1748 bytes
 .../data/48x48/gtk3-demo-symbolic.symbolic.png     |  Bin 0 -> 854 bytes
 gtk3/sample/gtk-demo/data/48x48/gtk3-demo.png      |  Bin 0 -> 2640 bytes
 .../data/512x512/gtk3-demo-symbolic.symbolic.png   |  Bin 0 -> 7594 bytes
 gtk3/sample/gtk-demo/data/512x512/gtk3-demo.png    |  Bin 0 -> 42374 bytes
 gtk3/sample/gtk-demo/data/source.svg               | 2886 ++++++++++++++++++++
 gtk3/sample/gtk-demo/data/symbolic-source.svg      |   29 +
 gtk3/sample/gtk-demo/demo.gresource.xml            |   21 +-
 gtk3/sample/gtk-demo/demo.ui                       |    1 +
 gtk3/sample/gtk-demo/font_features.rb              |    2 +-
 gtk3/sample/gtk-demo/main.rb                       |    4 +-
 gtk3/sample/gtk-demo/main.ui                       |   54 +-
 gtk3/sample/gtk-demo/markup.rb                     |   61 +-
 gtk3/sample/gtk-demo/markup.txt                    |    4 +-
 gtk3/sample/gtk-demo/org.gtk.Demo.gschema.xml      |    9 +
 gtk3/sample/gtk-demo/pixbufs.rb                    |  250 +-
 gtk3/sample/gtk-demo/reset.css                     |   59 +-
 gtk3/sample/gtk-demo/rotated_text.rb               |  174 +-
 gtk3/sample/gtk-demo/shortcuts-boxes.ui            |  167 ++
 gtk3/sample/gtk-demo/shortcuts-builder.ui          |  547 ++++
 gtk3/sample/gtk-demo/shortcuts-clocks.ui           |  166 ++
 gtk3/sample/gtk-demo/shortcuts-gedit.ui            |  172 ++
 gtk3/sample/gtk-demo/shortcuts.ui                  |   65 +
 gtk3/sample/gtk-demo/stack.ui                      |   10 +-
 gtk3/sample/gtk-demo/textscroll.rb                 |  106 +
 gtk3/sample/gtk-demo/theming.ui                    |   80 +-
 gtk3/sample/gtk-demo/theming_style_classes.rb      |    9 +-
 gtk3/sample/gtk-demo/transparent.rb                |  143 +
 gtk3/sample/misc/aboutdialog.rb                    |    2 +-
 gtk3/sample/misc/bindings.rb                       |   51 +-
 gtk3/sample/misc/combobox.rb                       |    2 +-
 gtk3/sample/misc/dnd.rb                            |    6 +-
 gtk3/sample/misc/icons-theme-viewer.rb             |    2 +-
 gtk3/sample/misc/iconview.rb                       |    4 +-
 gtk3/sample/misc/textbuffer-serialize.rb           |   32 +-
 gtk3/sample/misc/to-drawable.rb                    |    4 +-
 gtk3/sample/misc/tooltips.rb                       |    1 +
 gtk3/sample/misc/treeview.rb                       |    2 +-
 gtk3/sample/tutorial/README.md                     |   36 +-
 gtk3/test/test-gtk-clipboard.rb                    |    2 +-
 gtk3/test/test-gtk-combo-box.rb                    |    4 +-
 gtk3/test/test-gtk-icon-view.rb                    |    4 +-
 gtk3/test/test-gtk-image.rb                        |    2 +-
 gtk3/test/test-gtk-list-store.rb                   |   12 +-
 gtk3/test/test-gtk-text-view.rb                    |   64 +
 gtk3/test/test-gtk-tree-path.rb                    |    4 +-
 gtk3/test/test-gtk-tree-view.rb                    |   97 +
 gtk3/test/test-gtk-window.rb                       |    4 +-
 gtk3/test/test-pango-context.rb                    |   56 +
 gtksourceview3/Rakefile                            |    2 +-
 pango/Rakefile                                     |    6 +-
 pango/ext/pango/rbpangoattribute.c                 |    7 +
 pango/ext/pango/rbpangoattrlist.c                  |    4 +-
 pango/ext/pango/rbpangocontext.c                   |   63 +-
 pango/ext/pango/rbpangoglyphinfo.c                 |   10 +-
 pango/test/test-context.rb                         |  113 +
 poppler/Rakefile                                   |    2 +-
 poppler/ext/poppler/extconf.rb                     |    2 +-
 poppler/ext/poppler/rbpoppler-page.c               |   18 +-
 poppler/sample/pdf2.rb                             |    2 +-
 poppler/test/run-test.rb                           |    8 +-
 poppler/test/test_page.rb                          |    9 +
 rsvg2/Rakefile                                     |    2 +-
 rsvg2/sample/svg2.rb                               |    2 +-
 run-test.rb                                        |    1 +
 travis-before-script.sh                            |    4 +
 vte3/Rakefile                                      |    2 +-
 vte3/lib/vte3.rb                                   |   23 +-
 269 files changed, 10911 insertions(+), 1886 deletions(-)

diff --git a/NEWS b/NEWS
index ba0a661..56201bf 100644
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,417 @@
 
 = NEWS
 
+== Ruby-GNOME2 3.0.9: 2016-08-12
+
+=== Changes
+
+==== All
+
+  * Update Realease date in NEWS.
+  * Use the latest Rubies.
+  * Readme: update ruby versions supported.
+    [Patch by cedlemo]
+  * travis: install experimental gems dependent packages for GSF and GOffice.
+    [patch by Hiroshi Hatake]
+  * add GSF, GOffice and Gnumeric in the main Rakefile.
+    [patch by cedlemo]
+  * ignore no-GI version of gdk_pixbuf2 in main run-test.rb and in the main extconf.rb.
+  * remove conditionnal macro based on HAVE_RUBY_ENCODING_H.
+  * clean code in main Rakefile.
+  * define top level windows:version:update in main Rakefile.
+
+==== Ruby/GIO2
+
+  * Improvements
+  * Fixes
+    * remove needless lazy initialization.
+    * follow GI API improvement.
+
+==== Ruby/GLIB2
+
+  * Improvements
+    * support for GLib 2.30 on CentOS 6.
+      [ruby-list:50310][5.5]
+      [ruby-list:50316][5.5]
+    * add GLib 2.30 check.
+    * add GLib 2.34 check.
+    * support customizing signal callback.
+    * support (({GObject#bind_property_full})).
+      [patch by cedlemo]
+    * clean code and style issue.
+    * fix GC bug that alive proc may be GC-ed.
+  * Fixes
+    * windows: improve rake.
+      * split g-ir-compiler args.
+      * add debug option as comment.
+      * fix wrong define location.
+      * use predicate style.
+    * fix wrong function in rbglib-variant.c.
+    * bump version.
+    * use SPDX format for license.
+    * homebrew:
+      * add workaround for libffi.pc isn't found on OS X.
+      * enable libffi workaround for gi.
+    * remove checks for old Ruby.
+    * Ruby 2.1 or later has (({rb_str_new_cstr})).
+    * set UTF-8 encoding to (({GLIB.XXX_to_utf8})) return value.
+    * remove unused variables in rbglib_convert.c.
+      [patch by cedlemo]
+    * support Ruby 2.4 Integer unification.
+      [patch Hiroshi Hatake]
+    * gnome2 rake add windows:version:update task.
+    * gnome2 rake reduce too much update.
+    * gnome2 rake accept the latest version isn't found case.
+    * gnome2 rake ignore development series.
+    * windows: update dependencies.
+      * support :freedesktop download site.
+      * support :freedesktop_gstreamer download site.
+      * ignore development version in :freedesktop_gstreamer.
+
+==== Ruby/GStreamer
+
+  * Improvements
+  * Fixes
+    * windows: improve rake file.
+      * update patches.
+      * follow file name change.
+      * specify x86_64 as arch for 64bit Windows.
+      * stop splitting g-ir-compiler args by default.
+      * fix typo.
+    * windows: update dependencies.
+      * use :freedesktop_gstreamer download_site.
+      * update external packages.
+
+==== Ruby/Poppler
+
+  * Improvements
+  * Fixes
+    * windows: improve rake file.
+      * use https.
+    * add missing Makefile existence check.
+    * segmentation fault in (({Poppler::Page#text_layout})).
+      [patch by YAMAMOTO Masayuki]
+    * use (({GdkPixbuf::Pixbuf})) form in sample files.
+      [patch by cedlemo]
+    * remove needless gdk_pixbuf2 build dependency.
+    * add missing make file existence check in run-test.rb.
+
+==== Ruby/GObjectIntrospection
+
+  * Improvements
+    * support dispatching by Flags and Enums.
+      [GitHub#745][Reported by Mamoru TASAKA]
+    * cache results of methods of (({GI::CallableInfo})).
+      [GitHub#749][Reported by rafagf1]
+    * cache collection reader result.
+      [GitHub#749][Reported by rafagf1]
+    * reduce needless function call.
+      [GitHub#749][Reported by rafagf1]
+    * cache (({GI::AgInfo#gclosure?})).
+    * add (({GI::Loader#rubyish_class_name})).
+      [patch by cedlemo]
+    * accept on_XXX as predicate method name.
+    * support gslist of structure values as return value.
+      [patch by cedlemo]
+    * make constant name easy to customize.
+ * Fixes
+    * fix a typo in loader.rb.
+    * fix a bug that int32[] returns wrong values.
+      [GitHub#758][reported by TASAKA]
+    * don't return array length output argument for return value.
+    * windows: update dependencies.
+
+==== Ruby/GDK3
+
+  * Improvements
+  * Fixes
+    * windows:
+      * support symbolic icons.
+        [GitHub#750][Abby Archer]
+    * use (({GdkPixbuf::Pixbuf})) form in gdk3 library and test files.
+      [patch by cedlemo]
+    * Rake file update GTK+ version.
+
+==== Ruby/GTK3
+
+  * Improvements
+    * update gtk-demo textscroll.
+      [patch by cedlemo]
+    * update gtk-demo data files to Gtk 3.20.
+      [patch by cedlemo]
+    * cache (({Gtk::TreeModel#get_column_type})).
+      [GitHub#749][Reported by rafagf1]
+    * update gtk-demo main.rb to Gtk 3.20.
+      [patch by cedlemo]
+    * update theming_style_classes gtk demo to 3.20.
+      [patch by cedlemo]
+    * update assistant gtk demo to 3.20.
+      [patch by cedlemo]
+    * update css related gtk demos to 3.20.
+      [patch by cedlemo]
+    * update markup gtk demo to 3.20.
+      [patch by cedlemo]
+    * update font-features demo to 3.20.
+      [patch by cedlemo]
+    * make (({Gtk::TreeView#expand_row})) rubyish.
+    * support "row-collapsed" and "row-expanded" signals for (({Gtk::TreeView})).
+      [GitHub#762][Reported Eric Cunningham]
+    * update misc sample bindings.rb to Gtk 3.20.
+      [patch by cedlemo]
+    * update rotated text gtk demo.
+      [patch by cedlemo]
+    * update pixbufs gtk demo.
+      [patch by cedlemo]
+    * hide "found" return value from (({Gtk::TextView#get_iter_at_XXX})).
+      [GitHub#794][Reported by Miguel Hernández]
+    * add (({Gtk::TextView#get_iter_at}))
+  * Fixes
+    * guard text marks from GC.
+      [GitHub#743][Reported by cedlemo]
+    * fix a bug that GC-ed (({Gtk::TextTag})) may be reused.
+    * relax condition in test for (({Gtk::ListStore})).
+    * use GTK+ version check in test for (({Gtk::Image})).
+    * fix issue in the gtk3 tutorial.
+      [patch from Renich Bon Ciric]
+    * follow (({Gtk::TextBuffer#select_bounds})) API change.
+      [GitHub#794][Reported by Miguel Hernandez]
+    * (({Gtk::TextView#get_iter_at*})) return nil when not found.
+      [GitHub#794][Reported by Miguel Hernandez]
+    * fix typo at gtk-demo.
+      [patch by tSU_RooT]
+    * use (({GdkPixbuf::Pixbuf})) form in gtk-demo files.
+      [patch by cedlemo]
+    * use (({GdkPixbuf::Pixbuf})) form in sample misc files.
+      [patch by cedlemo]
+    * use (({GdkPixbuf::Pixbuf})) form in test files.
+      [patch by cedlemo]
+    * gtk3 sample: follow (({Gtk::TextBuffer#select_bounds})) API change.
+      [GitHub#794][Reported by Miguel Hernández]
+    * (({Gtk::TextView#get_iter_at*})) return nil when not found.
+      [GitHub#794][Reported by Miguel Hernández]
+    * fix wrong method used in order to set window size in tutorial samples.
+      [patch by Renich Bon Ciric]
+    * fix label in ((#Gtk::TextView})) tests.
+    * fix typo at gtk-demo.
+      [patch by tSU_RooT]
+    * update all samples, tests, demo, tutorial to use (({GdkPixbuf#Pixbuf})).
+      [patch by cedlemo]
+    * add gtk3 demo transparent.rb.
+      [patch by cedlemo]
+    * update sample with (({Gtk::SeclectionData})) API changes.
+      [patch by cedlemo]
+    * lib and tests follow GI API improvement.
+    * test omit on old GTK+.
+    * require more newer GTK+ version for (({Gtk::TextView})) test.
+
+==== Ruby/Pango
+
+  * Improvements
+    * add tests for (({Pango::Context})).
+      [patch by cedlemo]
+    * improve tests for (({Pango::Context})).
+    * implement (({Pango::Context#set_chape_renderer})).
+    * add (({Pango::AttrShape#data})).
+      [GitHub#766][Reported by cedlemo]
+  * Fixes
+    * fix error with MACRO usage in rbpangoattrlist.c.
+      [patch by cedlemo]
+    * fix a bug that (({Pango#GlyphGeometry#geometry=})) does nothing.
+    * fix GC related problem in rbpangocontext.c.
+    * windows: update external packages.
+
+==== Ruby/GSF
+
+  * Improvements
+    * start GSF module.
+      [patch by cedlemo]
+  * Fixes
+    * follow GI API improvement.
+    * windows: fix external package name.
+    * windows: update external packages.
+
+==== Ruby/GOffice
+
+  * Improvements
+    * start GOffice module.
+      [patch by cedlemo]
+    * support version.
+  * Fixes
+    * add tests for GOffice.
+    * use (({GI::Loader#rubyish_class_nme})) in loader.rb.
+      [patch by cedlemo]
+    * add rules in order to fix issues when building objects.
+      [patch by cedlemo]
+    * add availability check in tests.
+    * fix condition issue in test.
+    * make some tests omitted when run by Travis CI.
+    * windows: update external packages.
+
+==== Ruby/Gnumeric
+
+  * Improvements
+    * start Gnumeric module.
+      [patch by cedlemo]
+  * Fixes
+    * add missing dependency in run-test.rb.
+    * use (({GI::Loader#rubyish_class_nme})) in loader.rb.
+      [patch by cedlemo]
+    * add rules in order to fix issues when building objects.
+      [patch by cedlemo]
+    * travis : add gnumeric as package to install instead of relying on dep.
+      [patch by cedlemo]
+    * improve renaming rules for C structures to ruby Class in GI loader.
+      [patch by cedlemo]
+    * add rules in order to avoid 2 objects information beeing reloaded.
+      [patch by cedlemo]
+    * windows: fix external package version.
+
+==== Ruby/GdkPixbuf2
+  * Improvements
+    * replace C implementation with one based on GObject-Introspection.
+      [patch by cedlemo]
+    * implement backward compatibility for (({GdkPixbuf::Pixbuf.new})).
+      [patch by cedlemo]
+    * add rubyish methods.
+    * add (({GdkPixbuf::Pixbuf#composite!})).
+    * implement rubyish methods:
+       * (({GdkPixbuf#dup}))
+       * (({GdkPixbuf#fill!}))
+       * (({GdkPixbuf#rotate}))
+       * (({GdkPixbuf#saturate_and_pixelate}))
+       * (({GdkPixbuf#save}))
+       * (({GdkPixbuf#scale}))
+       * (({GdkPixbuf#scale!}))
+    * support version information.
+    * support options in (({GdkPixbuf::Pixbuf#composite})) and (({GdkPixbuf::Pixbuf#composite!})).
+  * Fixes
+    * remove needless lazy initialization.
+    * improve tests.
+    * add deprecated message for backward compatibility.
+    * add tests for (({GdkPixbuf::Pixbuf#new})).
+      [patch by cedlemo]
+    * add tests for (({GdkPixbuf::Pixbuf#dup})) and (({GdkPixbuf::Pixbuf#fill!})).
+      [patch by cedlemo]
+    * ignore no-gi version of gdk_pixbuf2 in run-test.rb and extconf.rb.
+    * add tests for (({GdkPixbuf::Pixbuf#rotate})) and (({GdkPixbuf::Pixbuf#new})).
+      [patch by cedlemo]
+    * update and fix issues in the samples.
+      [patch by cedlemo]
+    * improve gdk_pixbuf2 libs and tests style, and add missing copyright header.
+    * add missing GObjectIntrospection dependency in tests.
+    * add backward compatibility between the old Gdk::Pixbuf and GdkPixbuf::Pixbuf.
+    * supports running on different directory for gdk_pixbuf2 samples.
+    * add (({PixbufLoader#last_write})).
+    * add tests for (({GdkPixbuf#new})).
+      [patch by cedlemo]
+    * add tests for (({GdkPixbuf#new})) with :file and :scale parameters.
+      [patch by cedlemo]
+    * add tests for (({GdkPixbuf#new})) from subpixbuf.
+      [patch by cedlemo]
+    * add backward compatibily for (({GdkPixbuf::Pixbuf#new})) and (({GdkPixbuf::Pixbuf#new_subpixbuf})).
+    * simplify and improve tests.
+    * use warn and raise instead of puts messages.
+    * add test for (({GdkPixbuf::Pixbuf#dup})).
+      [patch by cedlemo]
+    * add test for (({GdkPixbuf::Pixbuf#new})) from data.
+      [patch by cedlemo]
+    * add test for (({GdkPixbuf::Pixbuf#fill!})).
+      [patch by cedlemo]
+    * clean (({GdkPixbuf::Pixbuf#fill!})) tests.
+    * add test for (({GdkPixbuf::Pixbuf#new})) from bytes.
+      [patch by cedlemo]
+    * clean (({GdkPixbuf::Pixbuf#new})) tests.
+    * add (({GdkPixbuf::Pixbuf#rotate})) tests.
+      [patch by cedlemo]
+    * clean (({GdkPixbuf::Pixbuf#rotate})) tests.
+    * add (({GdkPixbuf#new})) from resource test.
+     [patch by cedlemo]
+    * add (({GdkPixbuf::Pixbuf#new})) from resource at scale tests.
+      [patch by cedlemo]
+    * clean (({GdkPixbuf::Pixbuf#new})) tests.
+    * update sample with the GdkPixbuf::Pixbuf form.
+    * add deprecated hook for (({GdkPixbuf::PixbufFormat#signature})).
+    * add tests for (({GdkPixbuf::Pixbuf#saturate_and_pixelate})).
+      [patch by cedlemo]
+    * keep backward compatibility for (({Gdk::PixbufError})).
+
+==== Ruby/VTE3
+
+  * Improvements
+  * Fixes
+    * remove needless lazy load.
+    * windows: update external package.
+
+==== Ruby/GTK2
+
+  * Improvements
+  * Fixes
+    * use (({GdkPixbuf::Pixbuf})) form in library, test and sample files.
+      [patch by cedlemo]
+
+==== Ruby/RSVG2
+
+  * Improvements
+  * Fixes
+    * use (({GdkPixbuf::Pixbuf})) form in library, test and sample files.
+      [patch by cedlemo]
+    * windows: update external packages.
+
+==== Ruby/Clutter
+
+  * Improvements
+  * Fixes
+    * use (({GdkPixbuf::Pixbuf})) form in library, test and sample files.
+      [patch by cedlemo]
+    * windows update version.
+
+==== Ruby/ClutterGtk
+
+  * Improvements
+  * Fixes
+    * use (({GdkPixbuf::Pixbuf})) form in library, test and sample files.
+      [patch by cedlemo]
+    * Fix issue with initialization of (({Gtk::IconView})) without hash argument.
+      [patch by cedlemo]
+
+==== Ruby/ClutterGstreamer
+
+  * Improvements
+  * Fixes
+    * add missing gdk_pixbuf2 dependency in tests.
+
+==== Ruby/GtkSourceView3
+
+  * Improvements
+  * Fixes
+    * windows: update dependencies.
+
+==== Ruby/GSF
+
+  * Added.
+
+==== Ruby/GOffice
+
+  * Added.
+
+==== Ruby/Gnumeric
+
+  * Added.
+
+==== Thanks
+
+  * Mamoru TASAKA
+  * rafagf1
+  * 5.5
+  * Abby Archer
+  * Eric Cunningham
+  * Hiroshi Hatake
+  * Renich Bon Ciric
+  * Miguel Hernández
+  * tSU_RooT
+  * YAMAMOTO Masayuki
+  * cedlemo
+
 == Ruby-GNOME2 3.0.8: 2016-04-03
 
 It's a release that improves GTK+ 3 support.
diff --git a/README.md b/README.md
index 8dd69b1..7ce0eee 100644
--- a/README.md
+++ b/README.md
@@ -5,7 +5,7 @@
 ## Ruby-GNOME2 -- Ruby bindings for GNOME
 
 This is a set of bindings for the GNOME 2.x and 3.x libraries to use
-from Ruby 2.0.0, 2.1 and 2.2.
+from Ruby 2.1, 2.2 and 2.3.
 
 ## Release packages
 
@@ -50,7 +50,9 @@ from Ruby 2.0.0, 2.1 and 2.2.
 
 ### Experimental / Incomplete:
 
-* ...
+* Ruby/GSF:             GSF 1.14.0 or later
+* Ruby/GOffice:         GOffice 0.10 or later
+* Ruby/Gnumeric:        Gnumeric 1.12 or later
 
 ## Install
 
diff --git a/Rakefile b/Rakefile
index 8ccecbc..eaaf5a5 100644
--- a/Rakefile
+++ b/Rakefile
@@ -91,6 +91,44 @@ def change_environment_variable(variables)
   end
 end
 
+gtk2_base_name = "ruby-gtk2"
+gtk3_base_name = "ruby-gtk3"
+gnome2_base_name = "ruby-gnome2-all"
+
+gtk2_packages = [
+  "glib2",
+  "gobject-introspection",
+  "gio2",
+  "atk",
+  "pango",
+  "gdk_pixbuf2",
+  "gtk2",
+]
+gtk3_packages = gtk2_packages - ["gtk2"] + [
+  "cairo-gobject",
+  "gdk3",
+  "gtk3",
+]
+gnome2_packages = gtk2_packages + gtk3_packages + [
+  "gstreamer",
+  "gtksourceview2",
+  "poppler",
+  "rsvg2",
+  "vte",
+  "vte3",
+  "gtksourceview3",
+  "clutter",
+  "clutter-gtk",
+  "clutter-gstreamer",
+  "webkit-gtk",
+  "webkit-gtk2",
+  "webkit2-gtk",
+  "gsf",
+  "goffice",
+  "gnumeric"
+]
+gnome2_packages = gnome2_packages.uniq
+
 desc "configure all packages"
 task :configure do
   ruby("extconf.rb")
@@ -125,6 +163,18 @@ namespace :windows do
 
   desc "build all packages for Windows"
   task :build => build_tasks
+
+  namespace :version do
+    desc "update all external packages for Windows"
+    task :update do
+      gnome2_packages.each do |package|
+        next if package == "gtk2"
+        chdir(package) do
+          ruby("-S", "rake", "windows:version:update")
+        end
+      end
+    end
+  end
 end
 
 desc "clean all packages"
@@ -142,41 +192,6 @@ task :test => [:build] do
   ruby("run-test.rb")
 end
 
-gtk2_base_name = "ruby-gtk2"
-gtk3_base_name = "ruby-gtk3"
-gnome2_base_name = "ruby-gnome2-all"
-
-gtk2_packages = [
-  "glib2",
-  "gobject-introspection",
-  "gio2",
-  "atk",
-  "pango",
-  "gdk_pixbuf2",
-  "gtk2",
-]
-gtk3_packages = gtk2_packages - ["gtk2"] + [
-  "cairo-gobject",
-  "gdk3",
-  "gtk3",
-]
-gnome2_packages = gtk2_packages + gtk3_packages + [
-  "gstreamer",
-  "gtksourceview2",
-  "poppler",
-  "rsvg2",
-  "vte",
-  "vte3",
-  "gtksourceview3",
-  "clutter",
-  "clutter-gtk",
-  "clutter-gstreamer",
-  "webkit-gtk",
-  "webkit-gtk2",
-  "webkit2-gtk",
-]
-gnome2_packages = gnome2_packages.uniq
-
 namespace :dist do
   base_files = ["AUTHORS", "COPYING.LIB", "NEWS",
                 "README.md", "Rakefile",
@@ -196,7 +211,7 @@ namespace :dist do
     package(gnome2_base_name, base_files + gnome2_packages)
   end
 
-  ruby_versions = ["2.1.10", "2.2.4", "2.3.0"]
+  ruby_versions = ["2.1.10", "2.2.5", "2.3.1"]
   namespace :test do
     ruby_base_url = "ftp://ftp.ruby-lang.org/pub/ruby"
     ruby_versions.each do |ruby_version|
@@ -388,6 +403,8 @@ namespace :gem do
       "webkit-gtk",
       "webkit-gtk2",
       "webkit2-gtk",
+      "goffice",
+      "gnumeric",
     ]
     windows_gnome2_packages = gnome2_packages - windows_unsupported_packages
 
@@ -480,7 +497,9 @@ namespace :gem do
     task :push do
       windows_gnome2_packages.each do |package|
         ruby("-S", "gem", "push",
-             *Dir.glob(File.join(package, "pkg", "*-#{version}-x86-mingw32.gem")))
+             File.join("build", "pkg", "#{package}-#{version}-x86-mingw32.gem"))
+        ruby("-S", "gem", "push",
+             File.join("build", "pkg", "#{package}-#{version}-x64-mingw32.gem"))
       end
     end
   end
diff --git a/build/Vagrantfile b/build/Vagrantfile
index ca809f2..cb89890 100644
--- a/build/Vagrantfile
+++ b/build/Vagrantfile
@@ -23,7 +23,17 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
                         :privileged => false,
                         :path => "build-#{target}.sh")
       config.vm.provider("virtualbox") do |virtual_box|
-        virtual_box.cpus = (ENV["N_CPUS"] || 1).to_i
+        system_n_cpus = 1
+        if File.exist?("/proc/cpuinfo")
+          system_n_cpus = File.readlines("/proc/cpuinfo").grep(/^processor/).size
+        end
+        if system_n_cpus > 1
+          vm_n_cpus = system_n_cpus / 2
+        else
+          vm_n_cpus = 1
+        end
+        virtual_box.cpus = (ENV["N_CPUS"] || vm_n_cpus).to_i
+        virtual_box.memory = (ENV["VM_MEMORY"] || 1024).to_i
       end
     end
   end
diff --git a/build/build-windows.sh b/build/build-windows.sh
index d0edcdb..c2dd9c1 100755
--- a/build/build-windows.sh
+++ b/build/build-windows.sh
@@ -3,8 +3,8 @@
 export LANG=C
 export DEBIAN_FRONTEND=noninteractive
 
-ruby_versions="2.1.10 2.2.4 2.3.0"
-export RUBY_CC_VERSION="2.1.10:2.2.4:2.3.0"
+ruby_versions="2.1.10 2.2.4 2.3.1"
+export RUBY_CC_VERSION="2.1.10:2.2.4:2.3.1"
 
 N_CPUS=$(grep '^processor' /proc/cpuinfo | wc -l)
 export MAKE_N_JOBS=${N_CPUS}
@@ -46,6 +46,7 @@ if [ ! -f ~/setup.timestamp ]; then
     libgdk-pixbuf2.0-dev \
     gobject-introspection \
     libgtk2.0-bin \
+    gtk-3-examples \
     flex \
     bison \
     gperf \
diff --git a/clutter-gstreamer/lib/clutter-gst.rb b/clutter-gstreamer/lib/clutter-gst.rb
index c5c5324..61c8137 100644
--- a/clutter-gstreamer/lib/clutter-gst.rb
+++ b/clutter-gstreamer/lib/clutter-gst.rb
@@ -57,12 +57,12 @@ module ClutterGst
 
   self.load_version = nil
 
+  class InitError < StandardError
+  end
+
   class Loader < GObjectIntrospection::Loader
     NAMESPACE = "ClutterGst"
 
-    class InitError < StandardError
-    end
-
     def initialize(base_module, init_arguments)
       super(base_module)
       @init_arguments = init_arguments
diff --git a/clutter-gstreamer/test/run-test.rb b/clutter-gstreamer/test/run-test.rb
index 1e32fa2..cff6726 100755
--- a/clutter-gstreamer/test/run-test.rb
+++ b/clutter-gstreamer/test/run-test.rb
@@ -24,6 +24,7 @@ ruby_gnome2_base = File.expand_path(ruby_gnome2_base)
 glib_base = File.join(ruby_gnome2_base, "glib2")
 cairo_gobject_base = File.join(ruby_gnome2_base, "cairo-gobject")
 gobject_introspection_base = File.join(ruby_gnome2_base, "gobject-introspection")
+gdk_pixbuf2_base = File.join(ruby_gnome2_base, "gdk_pixbuf2")
 clutter_base = File.join(ruby_gnome2_base, "clutter")
 gstreamer_base = File.join(ruby_gnome2_base, "gstreamer")
 clutter_gstreamer_base = File.join(ruby_gnome2_base, "clutter-gstreamer")
@@ -32,6 +33,7 @@ modules = [
   [glib_base, "glib2"],
   [cairo_gobject_base, "cairo-gobject"],
   [gobject_introspection_base, "gobject-introspection"],
+  [gdk_pixbuf2_base, "gdk_pixbuf2"],
   [clutter_base, "clutter"],
   [gstreamer_base, "gstreamer"],
   [clutter_gstreamer_base, "clutter-gst"],
@@ -66,4 +68,11 @@ rescue GLib::Error
   exit(true)
 end
 
+begin
+  Clutter.init
+rescue Clutter::InitError
+  puts("Omit because initialization is failed: #{$!.message}")
+  exit(true)
+end
+
 exit Test::Unit::AutoRunner.run(true, File.join(clutter_gstreamer_base, "test"))
diff --git a/clutter-gtk/lib/clutter-gtk.rb b/clutter-gtk/lib/clutter-gtk.rb
index a8b3e58..71e1967 100644
--- a/clutter-gtk/lib/clutter-gtk.rb
+++ b/clutter-gtk/lib/clutter-gtk.rb
@@ -50,10 +50,10 @@ module ClutterGtk
     end
   end
 
-  class Loader < GObjectIntrospection::Loader
-    class InitError < StandardError
-    end
+  class InitError < StandardError
+  end
 
+  class Loader < GObjectIntrospection::Loader
     NAMESPACE = "GtkClutter"
 
     def initialize(base_module, init_arguments)
diff --git a/clutter-gtk/sample/events.rb b/clutter-gtk/sample/events.rb
index 475fd24..67b509b 100755
--- a/clutter-gtk/sample/events.rb
+++ b/clutter-gtk/sample/events.rb
@@ -90,7 +90,7 @@ clutter_embed.signal_connect("leave-notify-event") do |widget|
 end
 
 # Create the main texture that the spin buttons manipulate
-pixbuf = Gdk::Pixbuf.new(File.expand_path("redhand.png", File.dirname(__FILE__)));
+pixbuf = GdkPixbuf::Pixbuf.new(:file => File.expand_path("redhand.png", File.dirname(__FILE__)));
 hand = ClutterGtk::Texture.new
 hand.from_pixbuf = pixbuf
 stage.add_child(hand)
diff --git a/clutter-gtk/sample/test.rb b/clutter-gtk/sample/test.rb
index f6643a2..964edb6 100755
--- a/clutter-gtk/sample/test.rb
+++ b/clutter-gtk/sample/test.rb
@@ -34,7 +34,7 @@ RADIUS        = 150
 fade_p        = false
 fullscreen_p  = false
 
-pixbuf = Gdk::Pixbuf.new(File.expand_path("redhand.png", File.dirname(__FILE__)))
+pixbuf = GdkPixbuf::Pixbuf.new(:file => File.expand_path("redhand.png", File.dirname(__FILE__)))
 
 window = Gtk::Window.new
 window.set_default_size(WINDOW_WIDTH, WINDOW_HEIGHT)
diff --git a/clutter-gtk/sample/window-test.rb b/clutter-gtk/sample/window-test.rb
index 0b67997..b11c9cf 100755
--- a/clutter-gtk/sample/window-test.rb
+++ b/clutter-gtk/sample/window-test.rb
@@ -36,7 +36,7 @@ window.set_default_size(400, 300)
 
 NAME_COLUMN   = 0
 PIXBUF_COLUMN = 1
-store = Gtk::ListStore.new(String, Gdk::Pixbuf)
+store = Gtk::ListStore.new(String, GdkPixbuf::Pixbuf)
 theme = Gtk::IconTheme.default
 [
   "devhelp",
@@ -53,7 +53,7 @@ theme = Gtk::IconTheme.default
   iter[1] = pixbuf
 end
 
-icon_view = Gtk::IconView.new(store)
+icon_view = Gtk::IconView.new(:model => store)
 icon_view.text_column = NAME_COLUMN
 icon_view.pixbuf_column = PIXBUF_COLUMN
 
diff --git a/clutter-gtk/sample/window-test2.rb b/clutter-gtk/sample/window-test2.rb
index 8a487d8..c4aeb70 100755
--- a/clutter-gtk/sample/window-test2.rb
+++ b/clutter-gtk/sample/window-test2.rb
@@ -59,7 +59,7 @@ add_button = lambda do |stock_id, row|
       allocation = image.allocation
 
       # replace the icon itself
-      blank = Gdk::Pixbuf.new(:colorspace => :rgb,
+      blank = GdkPixbuf::Pixbuf.new(:colorspace => :rgb,
                               :has_alpha =>  true,
                               :bits_per_sample => 8,
                               :width => allocation.width,
diff --git a/clutter-gtk/test/run-test.rb b/clutter-gtk/test/run-test.rb
index 743774d..b2401e3 100755
--- a/clutter-gtk/test/run-test.rb
+++ b/clutter-gtk/test/run-test.rb
@@ -76,6 +76,13 @@ rescue GLib::Error
   exit(true)
 end
 
+begin
+  ClutterGtk.init
+rescue ClutterGtk::InitError
+  puts("Omit because initialization is failed: #{$!.message}")
+  exit(true)
+end
+
 # exclude sample/test-*
 clutter_gtk_test_base = File.join(clutter_gtk_base, "test")
 exit Test::Unit::AutoRunner.run(true, clutter_gtk_test_base)
diff --git a/clutter/Rakefile b/clutter/Rakefile
index 179b8ce..6dde4a7 100644
--- a/clutter/Rakefile
+++ b/clutter/Rakefile
@@ -95,7 +95,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
       :name => "json-glib",
       :download_site => :gnome,
       :label => "JSON-GLib",
-      :version => "1.2.0",
+      :version => "1.2.2",
       :compression_method => "xz",
       :windows => {
         :configure_args => [
diff --git a/clutter/lib/clutter.rb b/clutter/lib/clutter.rb
index 8df36f7..c82f9ee 100644
--- a/clutter/lib/clutter.rb
+++ b/clutter/lib/clutter.rb
@@ -67,10 +67,10 @@ module Clutter
     end
   end
 
-  class Loader < GObjectIntrospection::Loader
-    class InitError < StandardError
-    end
+  class InitError < StandardError
+  end
 
+  class Loader < GObjectIntrospection::Loader
     NAMESPACE = "Clutter"
 
     def initialize(base_module, init_arguments)
diff --git a/clutter/sample/bin-layout.rb b/clutter/sample/bin-layout.rb
index da9ea6e..c8b5a87 100755
--- a/clutter/sample/bin-layout.rb
+++ b/clutter/sample/bin-layout.rb
@@ -118,7 +118,7 @@ box.signal_connect("transitions-completed") do |actor|
   canvas.set_size(actor.width, actor.height)
 end
 
-pixbuf = Gdk::Pixbuf.new(File.expand_path("redhand.png", File.dirname(__FILE__)))
+pixbuf = GdkPixbuf::Pixbuf.new(:file => File.expand_path("redhand.png", File.dirname(__FILE__)))
 image = Clutter::Image.new
 image.set_data(pixbuf.pixels,
                pixbuf.has_alpha? ? :rgba_8888 : :rgb_888,
diff --git a/clutter/sample/image-content.rb b/clutter/sample/image-content.rb
index 811668f..84a780a 100755
--- a/clutter/sample/image-content.rb
+++ b/clutter/sample/image-content.rb
@@ -48,7 +48,7 @@ box.margin_left = 12
 box.add_constraint(Clutter::BindConstraint.new(stage, :size, 0.0))
 stage.add_child(box)
 
-pixbuf = Gdk::Pixbuf.new(File.expand_path("redhand.png", File.dirname(__FILE__)))
+pixbuf = GdkPixbuf::Pixbuf.new(:file => File.expand_path("redhand.png", File.dirname(__FILE__)))
 image = Clutter::Image.new
 image.set_data(pixbuf.pixels,
                pixbuf.has_alpha? ? :rgba_8888 : :rgb_888,
diff --git a/clutter/sample/pan-action.rb b/clutter/sample/pan-action.rb
index 52356aa..87cba77 100755
--- a/clutter/sample/pan-action.rb
+++ b/clutter/sample/pan-action.rb
@@ -38,7 +38,7 @@ scroll.add_constraint(Clutter::BindConstraint.new(stage, :size, 0))
 content = Clutter::Actor.new
 content.set_size(720, 720)
 
-pixbuf = Gdk::Pixbuf.new(File.expand_path("redhand.png", File.dirname(__FILE__)))
+pixbuf = GdkPixbuf::Pixbuf.new(:file => File.expand_path("redhand.png", File.dirname(__FILE__)))
 image = Clutter::Image.new
 image.set_data(pixbuf.pixels,
                pixbuf.has_alpha? ? :rgba_8888 : :rgb_888,
diff --git a/clutter/test/run-test.rb b/clutter/test/run-test.rb
index 84f6c82..d4f54a9 100755
--- a/clutter/test/run-test.rb
+++ b/clutter/test/run-test.rb
@@ -60,6 +60,11 @@ rescue GLib::Error
   exit(true)
 end
 
-Clutter.init
+begin
+  Clutter.init
+rescue Clutter::InitError
+  puts("Omit because initialization is failed: #{$!.message}")
+  exit(true)
+end
 
 exit Test::Unit::AutoRunner.run(true, File.join(clutter_base, "test"))
diff --git a/extconf.rb b/extconf.rb
index dda9490..79ec930 100644
--- a/extconf.rb
+++ b/extconf.rb
@@ -24,6 +24,7 @@ priorlibs = [
 ]
 
 unsupported_libraries = [
+  "gdk_pixbuf2-no-gi",
   "gdk3-no-gi",
   "gtk3-no-gi",
   "gtksourceview3-no-gi",
diff --git a/gdk3/Rakefile b/gdk3/Rakefile
index 0b74d95..786d354 100644
--- a/gdk3/Rakefile
+++ b/gdk3/Rakefile
@@ -59,7 +59,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
       :name => "gtk+",
       :download_site => :gnome,
       :label => "GTK+",
-      :version => "3.20.2",
+      :version => "3.20.8",
       :compression_method => "xz",
       :windows => {
         :configure_args => [
@@ -92,6 +92,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
       :version => "3.20",
       :compression_method => "xz",
       :windows => {
+        :use_gobject_introspection => false,
         :configure_args => [],
         :build_concurrently => false,
         :built_file => "share/icons/Adwaita/index.theme",
diff --git a/gdk3/lib/gdk3/deprecated.rb b/gdk3/lib/gdk3/deprecated.rb
index 77c5116..6048c38 100644
--- a/gdk3/lib/gdk3/deprecated.rb
+++ b/gdk3/lib/gdk3/deprecated.rb
@@ -18,7 +18,7 @@ module Gdk
   extend GLib::Deprecatable
   define_deprecated_enums :GrabStatus, 'GRAB'
   define_deprecated_enums :Status
-  define_deprecated_const :Image, :raise => "Use 'Gdk::Pixbuf' or 'Cairo::Surface' instead."
+  define_deprecated_const :Image, :raise => "Use 'GdkPixbuf::Pixbuf' or 'Cairo::Surface' instead."
   define_deprecated_const :Colormap, :raise => "Use 'Gdk::Visual' instead."
   define_deprecated_const :Input, :raise => "Use 'GLib::IOChannel' instead."
   define_deprecated_const :X11, 'GdkX11'
@@ -143,10 +143,10 @@ module Gdk
     define_deprecated_method :initialize, :raise => "Use 'Gdk::Window#create_similar_surface'."
     define_deprecated_singleton_method :create_from_data, :raise => "Use 'Cairo::ImageSurface.new'."
     define_deprecated_singleton_method :create_from_xbm, :raise => "Use 'Cairo::ImageSurface.new'."
-    define_deprecated_singleton_method :create_from_xpm, :raise => "Use 'Gdk::Pixbuf.new'."
-    define_deprecated_singleton_method :create_from_xpm_d, :raise => "Use 'Gdk::Pixbuf.new'."
-    define_deprecated_singleton_method :colormap_create_from_xpm, :raise => "Use 'Gdk::Pixbuf.new'."
-    define_deprecated_singleton_method :colormap_create_from_xpm_d, :raise => "Use 'Gdk::Pixbuf.new'."
+    define_deprecated_singleton_method :create_from_xpm, :raise => "Use 'GdkPixbuf::Pixbuf.new'."
+    define_deprecated_singleton_method :create_from_xpm_d, :raise => "Use 'GdkPixbuf::Pixbuf.new'."
+    define_deprecated_singleton_method :colormap_create_from_xpm, :raise => "Use 'GdkPixbuf::Pixbuf.new'."
+    define_deprecated_singleton_method :colormap_create_from_xpm_d, :raise => "Use 'GdkPixbuf::Pixbuf.new'."
     define_deprecated_singleton_method :foreign_new, :raise => "Don't use this method."
     define_deprecated_singleton_method :lookup, :raise => "Don't use this method."
   end
diff --git a/gdk3/test/test-gdk-cursor.rb b/gdk3/test/test-gdk-cursor.rb
index 8f8e596..93b3b88 100644
--- a/gdk3/test/test-gdk-cursor.rb
+++ b/gdk3/test/test-gdk-cursor.rb
@@ -24,7 +24,7 @@ class TestGdkCursor < Test::Unit::TestCase
     end
 
     test "pixbuf" do
-      pixbuf = Gdk::Pixbuf.new(:file => fixture_path("ruby-gnome2-logo.png"))
+      pixbuf = GdkPixbuf::Pixbuf.new(:file => fixture_path("ruby-gnome2-logo.png"))
       cursor = Gdk::Cursor.new(pixbuf, 0, 0)
       assert_equal(Gdk::CursorType::CURSOR_IS_PIXMAP, cursor.cursor_type)
     end
diff --git a/gdk_pixbuf2-no-gi/COPYING.LIB b/gdk_pixbuf2-no-gi/COPYING.LIB
new file mode 100644
index 0000000..4362b49
--- /dev/null
+++ b/gdk_pixbuf2-no-gi/COPYING.LIB
@@ -0,0 +1,502 @@
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+

+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+

+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+

+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+

+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+

+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+

+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+

+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+

+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+

+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/gdk_pixbuf2/README b/gdk_pixbuf2-no-gi/README
similarity index 100%
copy from gdk_pixbuf2/README
copy to gdk_pixbuf2-no-gi/README
diff --git a/gdk_pixbuf2/Rakefile b/gdk_pixbuf2-no-gi/Rakefile
similarity index 100%
copy from gdk_pixbuf2/Rakefile
copy to gdk_pixbuf2-no-gi/Rakefile
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/depend b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/depend
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/depend
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/depend
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/extconf.rb b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/extconf.rb
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/extconf.rb
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/extconf.rb
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/gdk_pixbuf2.def b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/gdk_pixbuf2.def
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/gdk_pixbuf2.def
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/gdk_pixbuf2.def
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf-format.c b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf-format.c
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf-format.c
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf-format.c
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf-loader.c b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf-loader.c
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf-loader.c
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf-loader.c
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf.c b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf.c
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf.c
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf.c
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf.h b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf.h
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf.h
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf.h
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf2conversions.h b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf2conversions.h
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf2conversions.h
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf2conversions.h
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf2private.h b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf2private.h
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbuf2private.h
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbuf2private.h
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbufanimation.c b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbufanimation.c
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbufanimation.c
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbufanimation.c
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbufanimationiter.c b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbufanimationiter.c
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbufanimationiter.c
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbufanimationiter.c
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbufsimpleanim.c b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbufsimpleanim.c
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixbufsimpleanim.c
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixbufsimpleanim.c
diff --git a/gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixdata.c b/gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixdata.c
similarity index 100%
rename from gdk_pixbuf2/ext/gdk_pixbuf2/rbgdk-pixdata.c
rename to gdk_pixbuf2-no-gi/ext/gdk_pixbuf2/rbgdk-pixdata.c
diff --git a/gdk_pixbuf2/extconf.rb b/gdk_pixbuf2-no-gi/extconf.rb
similarity index 100%
rename from gdk_pixbuf2/extconf.rb
rename to gdk_pixbuf2-no-gi/extconf.rb
diff --git a/gdk_pixbuf2/lib/gdk_pixbuf2.rb b/gdk_pixbuf2-no-gi/lib/gdk_pixbuf2.rb
similarity index 100%
copy from gdk_pixbuf2/lib/gdk_pixbuf2.rb
copy to gdk_pixbuf2-no-gi/lib/gdk_pixbuf2.rb
diff --git a/gdk_pixbuf2/sample/anim.rb b/gdk_pixbuf2-no-gi/sample/anim.rb
similarity index 100%
copy from gdk_pixbuf2/sample/anim.rb
copy to gdk_pixbuf2-no-gi/sample/anim.rb
diff --git a/gdk_pixbuf2/sample/composite.rb b/gdk_pixbuf2-no-gi/sample/composite.rb
similarity index 100%
copy from gdk_pixbuf2/sample/composite.rb
copy to gdk_pixbuf2-no-gi/sample/composite.rb
diff --git a/gdk_pixbuf2/sample/flip.rb b/gdk_pixbuf2-no-gi/sample/flip.rb
similarity index 100%
copy from gdk_pixbuf2/sample/flip.rb
copy to gdk_pixbuf2-no-gi/sample/flip.rb
diff --git a/gdk_pixbuf2-no-gi/sample/floppybuddy.gif b/gdk_pixbuf2-no-gi/sample/floppybuddy.gif
new file mode 100644
index 0000000..ac986c8
Binary files /dev/null and b/gdk_pixbuf2-no-gi/sample/floppybuddy.gif differ
diff --git a/gdk_pixbuf2/sample/format.rb b/gdk_pixbuf2-no-gi/sample/format.rb
similarity index 100%
copy from gdk_pixbuf2/sample/format.rb
copy to gdk_pixbuf2-no-gi/sample/format.rb
diff --git a/gdk_pixbuf2-no-gi/sample/gnome-foot.png b/gdk_pixbuf2-no-gi/sample/gnome-foot.png
new file mode 100644
index 0000000..0476658
Binary files /dev/null and b/gdk_pixbuf2-no-gi/sample/gnome-foot.png differ
diff --git a/gdk_pixbuf2/sample/inline.rb b/gdk_pixbuf2-no-gi/sample/inline.rb
similarity index 100%
rename from gdk_pixbuf2/sample/inline.rb
rename to gdk_pixbuf2-no-gi/sample/inline.rb
diff --git a/gdk_pixbuf2/sample/loader.rb b/gdk_pixbuf2-no-gi/sample/loader.rb
similarity index 100%
copy from gdk_pixbuf2/sample/loader.rb
copy to gdk_pixbuf2-no-gi/sample/loader.rb
diff --git a/gdk_pixbuf2/sample/pixdata.rb b/gdk_pixbuf2-no-gi/sample/pixdata.rb
similarity index 100%
rename from gdk_pixbuf2/sample/pixdata.rb
rename to gdk_pixbuf2-no-gi/sample/pixdata.rb
diff --git a/gdk_pixbuf2/sample/rotate.rb b/gdk_pixbuf2-no-gi/sample/rotate.rb
similarity index 100%
copy from gdk_pixbuf2/sample/rotate.rb
copy to gdk_pixbuf2-no-gi/sample/rotate.rb
diff --git a/gdk_pixbuf2/sample/save.rb b/gdk_pixbuf2-no-gi/sample/save.rb
similarity index 100%
copy from gdk_pixbuf2/sample/save.rb
copy to gdk_pixbuf2-no-gi/sample/save.rb
diff --git a/gdk_pixbuf2/sample/scale.rb b/gdk_pixbuf2-no-gi/sample/scale.rb
similarity index 100%
copy from gdk_pixbuf2/sample/scale.rb
copy to gdk_pixbuf2-no-gi/sample/scale.rb
diff --git a/gdk_pixbuf2/sample/simpleanim.rb b/gdk_pixbuf2-no-gi/sample/simpleanim.rb
similarity index 100%
copy from gdk_pixbuf2/sample/simpleanim.rb
copy to gdk_pixbuf2-no-gi/sample/simpleanim.rb
diff --git a/gdk_pixbuf2/sample/utils.rb b/gdk_pixbuf2-no-gi/sample/utils.rb
similarity index 100%
copy from gdk_pixbuf2/sample/utils.rb
copy to gdk_pixbuf2-no-gi/sample/utils.rb
diff --git a/gdk_pixbuf2/sample/xpm.rb b/gdk_pixbuf2-no-gi/sample/xpm.rb
similarity index 100%
copy from gdk_pixbuf2/sample/xpm.rb
copy to gdk_pixbuf2-no-gi/sample/xpm.rb
diff --git a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb b/gdk_pixbuf2-no-gi/test/gdk_pixbuf2-test-utils.rb
similarity index 100%
copy from gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
copy to gdk_pixbuf2-no-gi/test/gdk_pixbuf2-test-utils.rb
diff --git a/gdk_pixbuf2/test/run-test.rb b/gdk_pixbuf2-no-gi/test/run-test.rb
similarity index 100%
copy from gdk_pixbuf2/test/run-test.rb
copy to gdk_pixbuf2-no-gi/test/run-test.rb
diff --git a/gdk_pixbuf2/test/test-version.rb b/gdk_pixbuf2-no-gi/test/test-version.rb
similarity index 100%
rename from gdk_pixbuf2/test/test-version.rb
rename to gdk_pixbuf2-no-gi/test/test-version.rb
diff --git a/gdk_pixbuf2/README b/gdk_pixbuf2/README.md
similarity index 72%
rename from gdk_pixbuf2/README
rename to gdk_pixbuf2/README.md
index 83e0c14..9ae8a79 100644
--- a/gdk_pixbuf2/README
+++ b/gdk_pixbuf2/README.md
@@ -10,7 +10,7 @@ Requirements
 
 Install
 -------
-   0. install ruby-1.9.x or later, GTK+, Ruby/GLib2 and Ruby/GTK2.
+   0. install ruby-2.1.x or later, GTK+, Ruby/GLib2 and Ruby/GTK2.
    1. ruby extconf.rb
    2. make
    3. su
@@ -18,12 +18,13 @@ Install
 
 Copying
 -------
-   Copyright (c) 2002-2005 Ruby-GNOME2 Project Team
+   Copyright (c) 2002-2016 Ruby-GNOME2 Project Team
 
    This program is free software.
    You can distribute/modify this program under the terms of
    the GNU LESSER GENERAL PUBLIC LICENSE Version 2.1.
 
-Project Website
----------------
+Project Websites
+----------------
    http://ruby-gnome2.sourceforge.jp/
+   https://github.com/ruby-gnome2/ruby-gnome2
diff --git a/gdk_pixbuf2/Rakefile b/gdk_pixbuf2/Rakefile
index 7e32f75..6556817 100644
--- a/gdk_pixbuf2/Rakefile
+++ b/gdk_pixbuf2/Rakefile
@@ -1,6 +1,6 @@
 # -*- ruby -*-
 #
-# Copyright (C) 2011-2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
diff --git a/gdk_pixbuf2/lib/gdk_pixbuf2.rb b/gdk_pixbuf2/lib/gdk_pixbuf2.rb
index 401fdf4..3fbf8ad 100644
--- a/gdk_pixbuf2/lib/gdk_pixbuf2.rb
+++ b/gdk_pixbuf2/lib/gdk_pixbuf2.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2002-2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -14,80 +14,22 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
-require "glib2"
+require "gobject-introspection"
+require "gio2"
 
 base_dir = Pathname.new(__FILE__).dirname.dirname.expand_path
 vendor_dir = base_dir + "vendor" + "local"
 vendor_bin_dir = vendor_dir + "bin"
 GLib.prepend_dll_path(vendor_bin_dir)
+vendor_girepository_dir = vendor_dir + "lib" + "girepository-1.0"
+GObjectIntrospection.prepend_typelib_path(vendor_girepository_dir)
 
-if vendor_dir.exist?
-  require "cairo"
-end
+require "gdk_pixbuf2/loader"
 
-begin
-  major, minor, _ = RUBY_VERSION.split(/\./)
-  require "#{major}.#{minor}/gdk_pixbuf2.so"
-rescue LoadError
-  require "gdk_pixbuf2.so"
-end
+module GdkPixbuf
+  LOG_DOMAIN = "GdkPixbuf"
+  GLib::Log.set_log_domain(LOG_DOMAIN)
 
-if vendor_dir.exist?
-  begin
-    require "gobject-introspection"
-    vendor_girepository_dir = vendor_dir + "lib" + "girepository-1.0"
-    GObjectIntrospection.prepend_typelib_path(vendor_girepository_dir)
-  rescue LoadError
-  end
+  loader = Loader.new(self)
+  loader.load("GdkPixbuf")
 end
-
-module Gdk
-  class PixbufLoader
-    def self.open(type = nil, mime_type = false)
-      loader = Gdk::PixbufLoader.new(type, mime_type)
-      if block_given?
-        begin
-          yield(loader)
-        ensure
-          loader.close
-        end
-      end
-      loader
-    end
-  end
-
-  class Pixbuf
-    LOG_DOMAIN = "GdkPixbuf"
-
-    class << self
-      def cairo_available?
-        if Gdk.respond_to?(:cairo_available?)
-          Gdk.cairo_available?
-        else
-          false
-        end
-      end
-    end
-
-    module Version
-      MAJOR = Gdk::Pixbuf::MAJOR
-      MINOR = Gdk::Pixbuf::MINOR
-      MICRO = Gdk::Pixbuf::MICRO
-      STRING = "#{MAJOR}.#{MINOR}.#{MICRO}"
-
-      class << self
-        def or_later?(major, minor, micro=nil)
-          micro ||= 0
-          version = [
-            MAJOR,
-            MINOR,
-            MICRO,
-          ]
-          (version <=> [major, minor, micro]) >= 0
-        end
-      end
-    end
-  end
-end
-
-GLib::Log.set_log_domain(Gdk::Pixbuf::LOG_DOMAIN)
diff --git a/gdk_pixbuf2/lib/gdk_pixbuf2/deprecated.rb b/gdk_pixbuf2/lib/gdk_pixbuf2/deprecated.rb
new file mode 100644
index 0000000..08f92ff
--- /dev/null
+++ b/gdk_pixbuf2/lib/gdk_pixbuf2/deprecated.rb
@@ -0,0 +1,160 @@
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+module GdkPixbuf
+  class Pixbuf
+    extend GLib::Deprecatable
+
+    define_deprecated_enums "Colorspace", "COLORSPACE"
+    define_deprecated_enums "InterpType", "INTERP"
+    define_deprecated_enums "PixbufRotation", "ROTATE"
+
+    class << self
+      def new(*args, &block)
+        if args[0].is_a?(Pixbuf)
+          message = "#{caller[0]}: #{self}.new(pixbuf, ...) is deprecated. "
+          message << "Use pixbuf.new_subpixbuf(...)  instead."
+          warn(message)
+          args[0].new_subpixbuf(*args[1..-1])
+        elsif args.size == 1 and args[0].is_a?(Hash)
+          options = args[0]
+          src_pixbuf = options[:src_pixbuf]
+          if src_pixbuf
+            message = "#{caller[0]}: "
+            message << "#{self}.new(:src_pixbuf => pixbuf, ...) is deprecated. "
+            message << "Use pixbuf.new_subpixbuf(...)  instead."
+            warn(message)
+            src_pixbuf.new_subpixbuf(options[:src_x],
+                                     options[:src_y],
+                                     options[:width],
+                                     options[:height])
+          else
+            super
+          end
+        else
+          super
+        end
+      end
+    end
+
+    define_deprecated_method_by_hash_args :composite,
+                                          "dest_width, " +
+                                            "dest_height, " +
+                                            "interpolation_type, " +
+                                            "overall_alpha, " +
+                                            "check_size, " +
+                                            "color1, " +
+                                            "color2",
+                                          ":dest_width => dest_width, " +
+                                            ":dest_height => dest_height, " +
+                                            ":interpolation_type => interpolation_type, " +
+                                            ":overall_alpha => overall_alpha, " +
+                                            ":check_size => check_size, " +
+                                            ":color1 => color1, " +
+                                            ":color2 => color2" do |*args|
+      [
+        :dest_width => args[1],
+        :dest_height => args[2],
+        :interpolation_type => args[3],
+        :overall_alpha => args[4],
+        :check_size => args[5],
+        :color1 => args[6],
+        :color2 => args[7],
+      ]
+    end
+
+    define_deprecated_method_by_hash_args :composite!,
+                                          "source, " +
+                                            "dest_x, " +
+                                            "dest_y, " +
+                                            "dest_width, " +
+                                            "dest_height, " +
+                                            "offset_x, " +
+                                            "offset_y, " +
+                                            "scale_x, " +
+                                            "scale_y, " +
+                                            "interpolation_type, " +
+                                            "overall_alpha, " +
+                                            "check_x=0, " +
+                                            "check_y=0, " +
+                                            "check_size=nil, " +
+                                            "color1=0x999999, " +
+                                            "color2=0xdddddd",
+                                          "source, " +
+                                            ":dest_x => dest_x, " +
+                                            ":dest_y => dest_y, " +
+                                            ":dest_width => dest_width, " +
+                                            ":dest_height => dest_height, " +
+                                            ":offset_x => offset_x, " +
+                                            ":offset_y => offset_y, " +
+                                            ":scale_x => scale_x, " +
+                                            ":scale_y => scale_y, " +
+                                            ":interpolation_type => interpolation_type, " +
+                                            ":overall_alpha => overall_alpha, " +
+                                            ":check_x => check_x, " +
+                                            ":check_y => check_y, " +
+                                            ":check_size => check_size, " +
+                                            ":color1 => color1, " +
+                                            ":color2 => color2",
+                                          1 do |*args|
+      [
+        args[1],
+        :dest_x => args[2],
+        :dest_y => args[3],
+        :dest_width => args[4],
+        :dest_height => args[5],
+        :offset_x => args[6],
+        :offset_y => args[7],
+        :scale_x => args[8],
+        :scale_y => args[9],
+        :interpolation_type => args[10],
+        :overall_alpha => args[11],
+        :check_x => args[12],
+        :check_y => args[13],
+        :check_size => args[14],
+        :color1 => args[15],
+        :color2 => args[16],
+      ]
+    end
+  end
+
+  class PixbufFormat
+    extend GLib::Deprecatable
+
+    define_deprecated_method "domain", :raise => "Don't use this method anymore."
+    define_deprecated_method "signature", :raise => "Don't use this method anymore."
+  end
+
+  class Pixdata
+    extend GLib::Deprecatable
+
+    unless respond_to?(:from_pixbuf)
+      define_deprecated_singleton_method :from_pixbuf,
+                                         :raise => "Use Gio::Resource instead"
+    end
+  end
+end
+
+module Gdk
+  extend GLib::Deprecatable
+
+  define_deprecated_const :Pixbuf, "GdkPixbuf::Pixbuf"
+  define_deprecated_const :PixbufAnimation, "GdkPixbuf::PixbufAnimation"
+  define_deprecated_const :PixbufLoader, "GdkPixbuf::PixbufLoader"
+  define_deprecated_const :PixbufSimpleAnim, "GdkPixbuf::PixbufSimpleAnim"
+  define_deprecated_const :Pixdata, "GdkPixbuf::Pixdata"
+  define_deprecated_const :PixbufError, "GdkPixbuf::PixbufError"
+end
diff --git a/gio2/lib/gio2/application-command-line.rb b/gdk_pixbuf2/lib/gdk_pixbuf2/loader.rb
similarity index 51%
copy from gio2/lib/gio2/application-command-line.rb
copy to gdk_pixbuf2/lib/gdk_pixbuf2/loader.rb
index c739064..2812747 100644
--- a/gio2/lib/gio2/application-command-line.rb
+++ b/gdk_pixbuf2/lib/gdk_pixbuf2/loader.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -14,23 +14,38 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
-module Gio
-  class ApplicationCommandLine
-    def initialize(properties=nil)
-      if properties
-        arguments = properties[:arguments]
-        if arguments and !arguments.is_a?(GLib::Variant)
-          arguments = GLib::Variant.new(arguments,
-                                        GLib::VariantType::BYTESTRING_ARRAY)
-          properties = properties.merge(:arguments => arguments)
-        end
-      end
-      super(properties)
+require "English"
+
+module GdkPixbuf
+  class Loader < GObjectIntrospection::Loader
+    private
+    def pre_load(repository, namespace)
+    end
+
+    def post_load(repository, namespace)
+      require_libraries
     end
 
-    alias_method :arguments_raw, :arguments
-    def arguments
-      arguments_raw[0]
+    def require_libraries
+      require "gdk_pixbuf2/pixbuf"
+      require "gdk_pixbuf2/pixbuf-loader"
+
+      require "gdk_pixbuf2/deprecated"
+
+      require "gdk_pixbuf2/version"
+    end
+
+    def initialize_post(object)
+      super
+      return unless object.is_a?(GLib::Object)
+      self.class.reference_gobject(object, :sink => true)
+    end
+
+    def define_constant(name, info)
+      if /PIXBUF_/ =~ name
+        name = $POSTMATCH
+      end
+      super(name, info)
     end
   end
 end
diff --git a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb b/gdk_pixbuf2/lib/gdk_pixbuf2/pixbuf-loader.rb
similarity index 82%
copy from gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
copy to gdk_pixbuf2/lib/gdk_pixbuf2/pixbuf-loader.rb
index fdb6ee3..2650900 100644
--- a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
+++ b/gdk_pixbuf2/lib/gdk_pixbuf2/pixbuf-loader.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -14,7 +14,11 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
-require "test-unit"
-
-module GdkPixbufTestUtils
+module GdkPixbuf
+  class PixbufLoader
+    def last_write(data)
+      write(data)
+      close
+    end
+  end
 end
diff --git a/gdk_pixbuf2/lib/gdk_pixbuf2/pixbuf.rb b/gdk_pixbuf2/lib/gdk_pixbuf2/pixbuf.rb
new file mode 100644
index 0000000..ab18289
--- /dev/null
+++ b/gdk_pixbuf2/lib/gdk_pixbuf2/pixbuf.rb
@@ -0,0 +1,282 @@
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+module GdkPixbuf
+  class Pixbuf
+    alias_method :initialize_raw, :initialize
+
+    def initialize(*args)
+      case args.size
+      when 1
+        case args[0]
+        when Hash
+          initialize_with_hash(args[0])
+        when String
+          message = "#{caller[0]}: #{self.class}.new(path) is deprecated. "
+          message << "Use #{self.class}.new(:file => path) instead."
+          warn message
+          initialize_raw(args[0])
+        when Array
+          message = "#{caller[0]}: #{self.class}.new(xpm) is deprecated. "
+          message << "Use #{self.class}.new(:xpm => xpm) instead."
+          warn message
+          initialize_new_from_xpm_data(args[0])
+        else
+          raise ArgumentError, "must be options: #{args[0].inspect}"
+        end
+      when 2
+        message = "#{caller[0]}: "
+        message << "#{self.class}.new(data, copy_pixels) is deprecated. "
+        message << "Use Gio::Resource instead."
+        warn message
+        initialize_from_inline(*args)
+      when 3
+        message = "#{caller[0]}: "
+        message << "#{self.class}.new(path, width, height) is deprecated. "
+        message << "Use #{self.class}.new(:file => path, :width => width, "
+        message << ":height => height) instead."
+        warn message
+        initialize_new_from_file_at_size(*args)
+      when 4
+        message = "#{caller[0]}: "
+        message << "#{self.class}.new(path, width, height, "
+        message << "preserve_aspect_ratio) is deprecated. "
+        message << "Use #{self.class}.new(:file => path, :width => width, "
+        message << ":height => height, "
+        message << ":preserve_aspect_ratio => preserve_aspect_ratio) instead."
+        warn message
+        initialize_new_from_file_at_scale(*args)
+      when 5
+        message = "#{caller[0]}: "
+        message << "#{self.class}.new(colorspace, has_alpha, bits_per_sample, "
+        message << "width, height) is deprecated."
+        message << "Use #{self.class}.new(:colorspace => colorspace, "
+        message << ":has_alpha => has_alpha, "
+        message << ":bits_per_sample => bits_per_sample, "
+        message << ":width => width, "
+        message << ":height => height) instead."
+        warn message
+        initialize_new(*args)
+      when 7
+        message = "#{caller[0]}: "
+        message << "#{self.class}.new(data, colorspace, has_alpha, "
+        message << "bits_per_sample, width, height) is deprecated."
+        message << "Use #{self.class}.new(:data => data, "
+        message << ":colorspace => colorspace, "
+        message << ":has_alpha => has_alpha, "
+        message << ":bits_per_sample => bits_per_sample, "
+        message << ":width => width, "
+        message << ":height => height) instead."
+        warn message
+        initialize_new_from_data(*args)
+      else
+        super
+      end
+    end
+
+    def initialize_with_hash(options)
+      colorspace = options[:colorspace] || GdkPixbuf::Colorspace::RGB
+      has_alpha = options[:has_alpha]
+      has_alpha = false if has_alpha.nil?
+      bits_per_sample = options[:bits_per_sample] || 8
+      row_stride = options[:row_stride] || 0
+      data = options[:data] || nil
+      bytes = options[:bytes] || nil
+      xpm = options[:xpm] || nil
+      file = options[:file] || nil
+      # stream = options[:stream] || nil
+      resource = options[:resource] || nil
+      width = options[:width] || nil
+      height = options[:height] || nil
+      size = true if width && height
+      scale = options[:scale] || nil
+      preserve_aspect_ratio = options[:preserve_aspect_ratio]
+      preserve_aspect_ratio = true if preserve_aspect_ratio.nil?
+
+      if file && size && scale
+        initialize_new_from_file_at_scale(file, width, height,
+                                          preserve_aspect_ratio)
+      elsif file && size && !scale
+        initialize_new_from_file_at_size(file, width, height)
+      elsif file && !size
+        initialize_new_from_file(file)
+      elsif resource && size && scale
+        initialize_new_from_resource_at_scale(resource, width, height,
+                                              preserve_aspect_ratio)
+      elsif resource && !scale
+        initialize_new_from_resource(resource)
+      elsif data && size
+        initialize_new_from_data(data, colorspace, has_alpha, bits_per_sample,
+                                 width, height, row_stride)
+      elsif bytes && size
+         initialize_new_from_bytes(bytes, colorspace, has_alpha, bits_per_sample,
+                                   width, height, row_stride)
+
+      elsif xpm
+        initialize_new_from_xpm_data(xpm)
+      elsif size
+        initialize_raw(colorspace, has_alpha, bits_per_sample, width, height)
+      else
+        message =
+          "must specify :file, :resource, :data, :bytes, :xpm, :width or :height"
+        raise ArgumentError, message
+      end
+      # https://developer.gnome.org/gdk-pixbuf/2.33/gdk-pixbuf-Image-Data-in-Memory.html
+      #	gdk_pixbuf_new                                  done
+      #	gdk_pixbuf_new_from_bytes                       done
+      #	gdk_pixbuf_new_from_data                        done
+      #	gdk_pixbuf_new_from_xpm_data                    done
+      #	gdk_pixbuf_new_subpixbuf
+      #	https://developer.gnome.org/gdk-pixbuf/2.33/gdk-pixbuf-File-Loading.html
+      #	gdk_pixbuf_new_from_file                        done
+      # gdk_pixbuf_new_from_file_at_size                done
+      #	gdk_pixbuf_new_from_file_at_scale               done
+      #	gdk_pixbuf_get_file_info
+      #	gdk_pixbuf_get_file_info_async
+      # gdk_pixbuf_get_file_info_finish
+      #	gdk_pixbuf_new_from_resource                    done
+      #	gdk_pixbuf_new_from_resource_at_scale           done
+      #	gdk_pixbuf_new_from_stream
+      # gdk_pixbuf_new_from_stream_async
+      #	gdk_pixbuf_new_from_stream_finish
+      #	gdk_pixbuf_new_from_stream_at_scale
+      #	gdk_pixbuf_new_from_stream_at_scale_async
+    end
+    private :initialize_with_hash
+
+    def dup
+      copy
+    end
+
+    def fill!(pixel)
+      fill(pixel)
+    end
+
+    def rotate(angle)
+      rotate_simple(angle)
+    end
+
+    alias_method :saturate_and_pixelate_raw, :saturate_and_pixelate
+    def saturate_and_pixelate(saturation, pixelate)
+      dest = dup
+      saturate_and_pixelate_raw(dest, saturation, pixelate)
+      dest
+    end
+
+    # TODO: test
+    # TODO: Improve API by Hash
+    def save(filename, type, options={})
+      keys = []
+      values = []
+      options.each do |key, value|
+        keys << key
+        values << value
+      end
+      savev(filename, type, keys, values)
+    end
+
+    alias_method :scale_raw, :scale
+    # TODO: test
+    # TODO: Improve API by Hash
+    def scale(*args)
+      case args.size
+      when 2, 3
+        width, height, interp_type = args
+        interp_type ||= :bilinear
+        scale_simple(width, height, interp_type)
+      else
+        scale_raw(*args)
+      end
+    end
+
+    # TODO: test
+    # TODO: Improve API by Hash
+    def scale!(source, *args)
+      if args.size == 8
+        args << :bilinear
+      end
+      source.scale_raw(self, *args)
+    end
+
+    alias_method :composite_raw, :composite
+    def composite(options)
+      destination = options[:destination] || options[:dest]
+      dest_x = options[:destination_x] || options[:dest_x] || 0
+      dest_y = options[:destination_y] || options[:dest_y] || 0
+      dest_width = options[:destination_width] || options[:dest_width]
+      dest_height = options[:destination_height] || options[:dest_height]
+
+      destination ||= Pixbuf.new(colorspace,
+                                 has_alpha?,
+                                 bits_per_sample,
+                                 dest_x + dest_width,
+                                 dest_y + dest_height)
+      destination.composite!(self, options)
+      destination
+    end
+
+    def composite!(source, options)
+      dest_x = options[:destination_x] || options[:dest_x] || 0
+      dest_y = options[:destination_y] || options[:dest_y] || 0
+      dest_width = options[:destination_width] || options[:dest_width]
+      dest_height = options[:destination_height] || options[:dest_height]
+      offset_x = options[:offset_x] || 0.0
+      offset_y = options[:offset_y] || 0.0
+      scale_x = options[:scale_x] || (dest_width / source.width.to_f)
+      scale_y = options[:scale_y] || (dest_height / source.height.to_f)
+      interpolation_type = options[:interpolation_type] ||
+        options[:interp_type] ||
+        :bilinear
+      overall_alpha = options[:overall_alpha] || 255
+      check_x = options[:check_x] || 0
+      check_y = options[:check_y] || 0
+      check_size = options[:check_size]
+      color1 = options[:color1] || 0x999999
+      color2 = options[:color2] || 0xdddddd
+
+      if check_size
+        source.composite_color(self,
+                               dest_x,
+                               dest_y,
+                               dest_width,
+                               dest_height,
+                               offset_x,
+                               offset_y,
+                               scale_x,
+                               scale_y,
+                               interpolation_type,
+                               overall_alpha,
+                               check_x,
+                               check_y,
+                               check_size,
+                               color1,
+                               color2)
+      else
+        source.composite_raw(self,
+                             dest_x,
+                             dest_y,
+                             dest_width,
+                             dest_height,
+                             offset_x,
+                             offset_y,
+                             scale_x,
+                             scale_y,
+                             interpolation_type,
+                             overall_alpha)
+      end
+    end
+  end
+end
diff --git a/gobject-introspection/lib/gobject-introspection/arg-info.rb b/gdk_pixbuf2/lib/gdk_pixbuf2/version.rb
similarity index 68%
copy from gobject-introspection/lib/gobject-introspection/arg-info.rb
copy to gdk_pixbuf2/lib/gdk_pixbuf2/version.rb
index 88d785d..9f557ea 100644
--- a/gobject-introspection/lib/gobject-introspection/arg-info.rb
+++ b/gdk_pixbuf2/lib/gdk_pixbuf2/version.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -14,14 +14,20 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
-module GObjectIntrospection
-  class ArgInfo
-    def gclosure?
-      type_info = type
-      return false if type_info.tag != TypeTag::INTERFACE
+module GdkPixbuf
+  module Version
+    STRING = [MAJOR, MINOR, MICRO].join(".")
 
-      struct_info = type_info.interface
-      struct_info.gtype.name == "GClosure"
+    class << self
+      def or_later?(major, minor, micro=nil)
+        micro ||= 0
+        version = [
+          MAJOR,
+          MINOR,
+          MICRO,
+        ]
+        (version <=> [major, minor, micro]) >= 0
+      end
     end
   end
 end
diff --git a/gdk_pixbuf2/sample/anim.rb b/gdk_pixbuf2/sample/anim.rb
old mode 100644
new mode 100755
index f6be93d..0ef1e14
--- a/gdk_pixbuf2/sample/anim.rb
+++ b/gdk_pixbuf2/sample/anim.rb
@@ -2,7 +2,7 @@
 =begin
   anim.rb - Ruby/GdkPixbuf sample script.
 
-  Copyright (c) 2002-2006 Ruby-GNOME2 Project Team
+  Copyright (c) 2002-2016 Ruby-GNOME2 Project Team
   This program is licenced under the same licence as Ruby-GNOME2.
 
   $Id: anim.rb,v 1.5 2006/06/17 14:38:08 mutoh Exp $
@@ -16,7 +16,7 @@ w.signal_connect('delete-event') do
 end
 
 box = Gtk::VBox.new
-src =  Gdk::PixbufAnimation.new("floppybuddy.gif")
+src =  GdkPixbuf::PixbufAnimation.new(File.join(__dir__, "floppybuddy.gif"))
 box.pack_start(Gtk::Image.new(src))
 p src.width
 p src.height
diff --git a/gdk_pixbuf2/sample/composite.rb b/gdk_pixbuf2/sample/composite.rb
old mode 100644
new mode 100755
index 77b45aa..414699d
--- a/gdk_pixbuf2/sample/composite.rb
+++ b/gdk_pixbuf2/sample/composite.rb
@@ -2,7 +2,7 @@
 =begin
   composite.rb - Ruby/GdkPixbuf sample script.
 
-  Copyright (c) 2002-2006 Ruby-GNOME2 Project Team
+  Copyright (c) 2002-2016 Ruby-GNOME2 Project Team
   This program is licenced under the same licence as Ruby-GNOME2.
 
   $Id: composite.rb,v 1.6 2006/06/17 14:38:08 mutoh Exp $
@@ -16,23 +16,53 @@ unless filename
   exit(1)
 end
 
-src =  Gdk::Pixbuf.new(filename)
+src =  GdkPixbuf::Pixbuf.new(:file => filename)
 
 vbox = Gtk::VBox.new
 
-dst = src.composite(100, 100, Gdk::Pixbuf::INTERP_HYPER,
-		200, 32, 0xFF0000, 0x00FF00)
+dst = src.composite(:dest_width  => 100,
+                    :dest_height => 100,
+                    :interp_type => :hyper,
+                    :overall_alpha => 255,
+                    :check_size => 32,
+                    :color1 => 0xFF0000,
+                    :color2 => 0x00FF00)
 vbox.pack_start(Gtk::Image.new(dst))
 
-dst = Gdk::Pixbuf.new(Gdk::Pixbuf::COLORSPACE_RGB, true, 8, 200, 200)
-dst.composite!(src, 0, 0, 200, 200, 0, 0, 1.8, 1.8,
-              Gdk::Pixbuf::INTERP_HYPER, 200)
+dst = GdkPixbuf::Pixbuf.new(:colorspace => :rgb,
+                            :has_alpha => true,
+                            :bits_per_sample => 8,
+                            :width =>200,
+                            :height => 200)
+dst.composite!(src,
+               :dest_width => 200,
+               :dest_height => 200,
+               :scale_x => 1.8,
+               :scale_y => 1.8,
+               :interp_type => :hyper,
+               :overall_alpha => 200)
 vbox.pack_start(Gtk::Image.new(dst))
 
-dst = Gdk::Pixbuf.new(Gdk::Pixbuf::COLORSPACE_RGB, true, 8, 200, 200)
-dst.composite!(src, 10, 10, 180, 180, 15, 15, 3, 2, 
-              Gdk::Pixbuf::INTERP_BILINEAR, 200, 100, 100, 16, 
-              0x999999, 0xdddddd)
+dst = GdkPixbuf::Pixbuf.new(:colorspace => :rgb,
+                            :has_alpha => true,
+                            :bits_per_sample => 8,
+                            :width =>200,
+                            :height => 200)
+dst.composite!(src,
+               :dest_x => 10,
+               :dest_y => 10,
+               :dest_width => 180,
+               :dest_height => 180,
+               :offset_x => 15,
+               :offset_y => 15,
+               :scale_x => 3,
+               :scale_y => 2,
+               :overall_alpha => 200,
+               :check_x => 100,
+               :check_y => 100,
+               :check_size => 16,
+               :color1 => 0x999999,
+               :color2 => 0xdddddd)
 vbox.pack_start(Gtk::Image.new(dst))
 
 window = Gtk::Window.new.add(vbox)
diff --git a/gdk_pixbuf2/sample/flip.rb b/gdk_pixbuf2/sample/flip.rb
index 2391452..f56fecb 100644
--- a/gdk_pixbuf2/sample/flip.rb
+++ b/gdk_pixbuf2/sample/flip.rb
@@ -2,7 +2,7 @@
 =begin
   flip.rb - Ruby/GdkPixbuf sample script.
 
-  Copyright (c) 2005,2006 Ruby-GNOME2 Project Team
+  Copyright (c) 2005-2016 Ruby-GNOME2 Project Team
   This program is licenced under the same licence as Ruby-GNOME2.
 
   $Id: flip.rb,v 1.3 2006/06/17 14:38:08 mutoh Exp $
@@ -25,7 +25,7 @@ end
 
 vbox = Gtk::VBox.new
 
-src =  Gdk::Pixbuf.new(filename)
+src =  GdkPixbuf::Pixbuf.new(:file => filename)
 vbox.add(Gtk::Image.new(src))
 
 # Horizontal
diff --git a/gdk_pixbuf2/sample/format.rb b/gdk_pixbuf2/sample/format.rb
index 5a41141..c459b72 100644
--- a/gdk_pixbuf2/sample/format.rb
+++ b/gdk_pixbuf2/sample/format.rb
@@ -2,7 +2,7 @@
 =begin
   format.rb - Ruby/GdkPixbuf sample script.
 
-  Copyright (c) 2004-2006 Ruby-GNOME2 Project Team
+  Copyright (c) 2004-2016 Ruby-GNOME2 Project Team
   This program is licenced under the same licence as Ruby-GNOME2.
 
   $Id: format.rb,v 1.4 2006/06/17 14:38:08 mutoh Exp $
@@ -22,14 +22,12 @@ unless filename
   exit(1)
 end
 
-puts fileinfo = Gdk::Pixbuf.get_file_info(filename)[0]
+puts fileinfo = GdkPixbuf::Pixbuf.get_file_info(filename)[0]
 puts "name = #{fileinfo.name}"
 puts "description = #{fileinfo.description}"
 puts "mime_types = #{fileinfo.mime_types.inspect}"
 puts "extensions = #{fileinfo.extensions.inspect}"
 puts "writable = #{fileinfo.writable?}"
-puts "domain = #{fileinfo.domain}"
-puts "signature = #{fileinfo.signature.inspect}"
 
 if Gtk.check_version?(2, 6, 0)
   puts "Since 2.6 --- "
diff --git a/gdk_pixbuf2/sample/loader.rb b/gdk_pixbuf2/sample/loader.rb
old mode 100644
new mode 100755
index dcc797b..60f1c1b
--- a/gdk_pixbuf2/sample/loader.rb
+++ b/gdk_pixbuf2/sample/loader.rb
@@ -2,15 +2,15 @@
 =begin
   loader.rb - Ruby/GdkPixbuf sample script.
 
-  Copyright (c) 2003,2006: Ruby-GNOME2 Project Team
+  Copyright (c) 2003-2016: Ruby-GNOME2 Project Team
   This program is licenced under the same licence as Ruby-GNOME2.
 
   $Id: loader.rb,v 1.3 2006/06/17 14:38:08 mutoh Exp $
 =end
 require 'gtk2'
 
-loader = Gdk::PixbufLoader.new
-File.open("gnome-foot.png","rb") { |f|
+loader = GdkPixbuf::PixbufLoader.new
+File.open(File.join(__dir__, "gnome-foot.png"), "rb") { |f|
   loader.last_write(f.read)
 }
 pixbuf = loader.pixbuf
diff --git a/gdk_pixbuf2/sample/rotate.rb b/gdk_pixbuf2/sample/rotate.rb
index ea131e9..6fbd02d 100644
--- a/gdk_pixbuf2/sample/rotate.rb
+++ b/gdk_pixbuf2/sample/rotate.rb
@@ -2,7 +2,7 @@
 =begin
   rotate.rb - Ruby/GdkPixbuf sample script.
 
-  Copyright (c) 2005,2006 Ruby-GNOME2 Project Team
+  Copyright (c) 2005-2016 Ruby-GNOME2 Project Team
   This program is licenced under the same licence as Ruby-GNOME2.
 
   $Id: rotate.rb,v 1.3 2006/06/17 14:38:08 mutoh Exp $
@@ -25,13 +25,13 @@ end
 
 vbox = Gtk::VBox.new
 
-src =  Gdk::Pixbuf.new(filename)
+src =  GdkPixbuf::Pixbuf.new(:file => filename)
 vbox.add(Gtk::Image.new(src))
 
-dst = src.rotate(Gdk::Pixbuf::ROTATE_COUNTERCLOCKWISE)
+dst = src.rotate(:counterclockwise)
 vbox.add(Gtk::Image.new(dst))
 
-dst2 = src.rotate(Gdk::Pixbuf::ROTATE_UPSIDEDOWN)
+dst2 = src.rotate(:upsidedown)
 vbox.add(Gtk::Image.new(dst2))
 
 window = Gtk::Window.new
diff --git a/gdk_pixbuf2/sample/save.rb b/gdk_pixbuf2/sample/save.rb
index 7fd6f5c..8ae3f04 100644
--- a/gdk_pixbuf2/sample/save.rb
+++ b/gdk_pixbuf2/sample/save.rb
@@ -2,7 +2,7 @@
 =begin
   save.rb - Ruby/GdkPixbuf sample script.
 
-  Copyright (c) 2002-2006 Ruby-GNOME2 Project Team
+  Copyright (c) 2002-2016 Ruby-GNOME2 Project Team
   This program is licenced under the same licence as Ruby-GNOME2.
 
   $Id: save.rb,v 1.5 2006/06/17 14:38:08 mutoh Exp $
@@ -17,9 +17,9 @@ if ! from or ! to
   exit(1)
 end
 
-src =  Gdk::Pixbuf.new(from)
+src =  GdkPixbuf::Pixbuf.new(from)
 
-dst = src.scale(300, 300, Gdk::Pixbuf::INTERP_HYPER)
+dst = src.scale(300, 300, :hyper)
 # This doesn't work ....
 #dst.save(to, "jpeg", {:quality => 100})
 dst.save(to, "png")
diff --git a/gdk_pixbuf2/sample/scale.rb b/gdk_pixbuf2/sample/scale.rb
index 4200ec7..cdb1fa7 100644
--- a/gdk_pixbuf2/sample/scale.rb
+++ b/gdk_pixbuf2/sample/scale.rb
@@ -2,7 +2,7 @@
 =begin
   scale.rb - Ruby/GdkPixbuf sample script.
 
-  Copyright (c) 2002-2006 Ruby-GNOME2 Project Team
+  Copyright (c) 2002-2016 Ruby-GNOME2 Project Team
   This program is licenced under the same licence as Ruby-GNOME2.
 
   $Id: scale.rb,v 1.10 2006/06/17 14:38:08 mutoh Exp $
@@ -18,20 +18,28 @@ end
 
 vbox = Gtk::VBox.new
 
-src =  Gdk::Pixbuf.new(filename)
+src =  GdkPixbuf::Pixbuf.new(:file => filename)
 vbox.add(Gtk::Image.new(src))
 
-dst = src.scale(200, 200, Gdk::Pixbuf::INTERP_NEAREST)
+dst = src.scale(200, 200, :nearest)
 dst.scale!(src, 60, 60, 90, 90, -50, 50, 6, 3)
 vbox.add(Gtk::Image.new(dst))
 
-dst2 = Gdk::Pixbuf.new(Gdk::Pixbuf::COLORSPACE_RGB, true, 8, 200, 200)
+dst2 = GdkPixbuf::Pixbuf.new(:colorspace => :rgb,
+                             :has_alpha =>true,
+                             :bits_per_sample => 8,
+                             :width => 200,
+                             :height => 200)
 dst2.scale!(src, 0, 0, 100, 100, 0, 0, 1.5, 1.5)
 
 vbox.add(Gtk::Image.new(dst2))
 
-dst3 = Gdk::Pixbuf.new(Gdk::Pixbuf::COLORSPACE_RGB, true, 8, 200, 200)
-dst3.scale!(src, 0, 0, 200, 200, 0, 0, 5, 3,  Gdk::Pixbuf::INTERP_HYPER)
+dst3 = GdkPixbuf::Pixbuf.new(:colorspace => :rgb,
+                             :has_alpha =>true,
+                             :bits_per_sample => 8,
+                             :width => 200,
+                             :height => 200)
+dst3.scale!(src, 0, 0, 200, 200, 0, 0, 5, 3, :hyper)
 vbox.add(Gtk::Image.new(dst3))
 
 window = Gtk::Window.new
diff --git a/gdk_pixbuf2/sample/simpleanim.rb b/gdk_pixbuf2/sample/simpleanim.rb
index 3f86911..e4fa526 100644
--- a/gdk_pixbuf2/sample/simpleanim.rb
+++ b/gdk_pixbuf2/sample/simpleanim.rb
@@ -1,10 +1,10 @@
 #!/usr/bin/env ruby
 =begin
   simpleanim.rb - Ruby/GdkPixbuf sample script for Gdk::PixbufSimpleAnim.
-  
+
   Inspired by http://mail.gnome.org/archives/gtk-perl-list/2005-September/msg00110.html
 
-  Copyright (c) 2002-2006 Ruby-GNOME2 Project Team
+  Copyright (c) 2002-2016 Ruby-GNOME2 Project Team
   This program is licenced under the same licence as Ruby-GNOME2.
 
   $Id: simpleanim.rb,v 1.2 2006/06/17 14:38:08 mutoh Exp $
@@ -14,13 +14,19 @@ require 'gtk2'
 
 $stdout.sync = true
 
-simple_anim = Gdk::PixbufSimpleAnim.new(64, 64, 24)
+simple_anim = GdkPixbuf::PixbufSimpleAnim.new(64, 64, 24)
 store_pixels = []
 
 print 'generating frames'
 for red in 0 .. 126
     store_pixels << pixels = ([ 4*(63-red).abs, 0, 0 ] * (64*64)).pack('C*')
-    pixbuf = Gdk::Pixbuf.new(pixels, Gdk::Pixbuf::COLORSPACE_RGB, false, 8, 64, 64, 64*3)
+    pixbuf = GdkPixbuf::Pixbuf.new(:data => pixels,
+                                   :colorspace => :rgb,
+                                   :has_alpha =>false,
+                                   :bits_per_sample => 8,
+                                   :width => 64,
+                                   :height => 64,
+                                   :row_stride => 64*3)
     simple_anim.add_frame(pixbuf)
     print '.'
 end
diff --git a/gdk_pixbuf2/sample/utils.rb b/gdk_pixbuf2/sample/utils.rb
index 4237740..16c7eb3 100644
--- a/gdk_pixbuf2/sample/utils.rb
+++ b/gdk_pixbuf2/sample/utils.rb
@@ -2,7 +2,7 @@
 =begin
   utils.rb - Ruby/GdkPixbuf sample script.
 
-  Copyright (c) 2002-2006 Ruby-GNOME2 Project Team
+  Copyright (c) 2002-2016 Ruby-GNOME2 Project Team
   This program is licenced under the same licence as Ruby-GNOME2.
 
   $Id: utils.rb,v 1.4 2006/06/17 14:38:08 mutoh Exp $
@@ -16,15 +16,18 @@ unless filename
   exit(1)
 end
 
-src =  Gdk::Pixbuf.new(filename)
+src =  GdkPixbuf::Pixbuf.new(:file => filename)
 
 vbox = Gtk::VBox.new
 
 dst = src.add_alpha(true, 0, 0, 0)
 vbox.pack_start(Gtk::Image.new(dst))
 
-dst = Gdk::Pixbuf.new(Gdk::Pixbuf::COLORSPACE_RGB, true, 8, 
-                      src.width + 20, src.height + 30)
+dst = GdkPixbuf::Pixbuf.new(:colorspace => :rgb,
+                            :has_alpha => true,
+                            :bits_per_sample => 8, 
+                            :width => src.width + 20,
+                            :height => src.height + 30)
 src.copy_area(0, 0, src.width / 2, src.height / 2, dst, 10, 20)
 vbox.pack_start(Gtk::Image.new(dst))
 
diff --git a/gdk_pixbuf2/sample/xpm.rb b/gdk_pixbuf2/sample/xpm.rb
index 019db18..8beaa8e 100644
--- a/gdk_pixbuf2/sample/xpm.rb
+++ b/gdk_pixbuf2/sample/xpm.rb
@@ -2,7 +2,7 @@
 =begin
   xpm.rb - Ruby/GdkPixbuf sample script.
 
-  Copyright (c) 2002-2006 Ruby-GNOME2 Project Team
+  Copyright (c) 2002-2016 Ruby-GNOME2 Project Team
   This program is licenced under the same licence as Ruby-GNOME2.
 
   $Id: xpm.rb,v 1.5 2006/06/17 14:38:08 mutoh Exp $
@@ -11,11 +11,11 @@
 require 'gtk2'
 
 r_xpm = [
-      "10 10 3 1", 
-      "   c None", 
-      ".  c #FE0B0B", 
-      "+  c #FFFFFF", 
-      "+.......++",   
+      "10 10 3 1",
+      "   c None",
+      ".  c #FE0B0B",
+      "+  c #FFFFFF",
+      "+.......++",
       "+..    ..+",
       "+..    ..+",
       "+..   ...+",
@@ -24,15 +24,15 @@ r_xpm = [
       "+..++..+++",
       "+..++...++",
       "+..+++...+",
-      "+..++++..+"]     
+      "+..++++..+"]
 
 w = Gtk::Window.new
 w.signal_connect('delete-event') do
   Gtk.main_quit
 end
 
-src =  Gdk::Pixbuf.new(r_xpm)
-dst = src.scale(300, 300, Gdk::Pixbuf::INTERP_HYPER)
+src =  GdkPixbuf::Pixbuf.new(:xpm => r_xpm)
+dst = src.scale(300, 300, :hyper)
 
 w.add(Gtk::Image.new(dst))
 w.show_all
diff --git a/gdk_pixbuf2/test/fixture/floppybuddy.gif b/gdk_pixbuf2/test/fixture/floppybuddy.gif
new file mode 100644
index 0000000..ac986c8
Binary files /dev/null and b/gdk_pixbuf2/test/fixture/floppybuddy.gif differ
diff --git a/gdk_pixbuf2/test/fixture/gnome-logo-icon.png b/gdk_pixbuf2/test/fixture/gnome-logo-icon.png
new file mode 100644
index 0000000..06721a9
Binary files /dev/null and b/gdk_pixbuf2/test/fixture/gnome-logo-icon.png differ
diff --git a/gdk_pixbuf2/test/fixture/image.gresource b/gdk_pixbuf2/test/fixture/image.gresource
new file mode 100644
index 0000000..dbef512
Binary files /dev/null and b/gdk_pixbuf2/test/fixture/image.gresource differ
diff --git a/gdk_pixbuf2/test/fixture/image.gresource.xml b/gdk_pixbuf2/test/fixture/image.gresource.xml
new file mode 100644
index 0000000..62b7313
--- /dev/null
+++ b/gdk_pixbuf2/test/fixture/image.gresource.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+  <gresource prefix="/org/ruby/gnome">
+    <file>gnome-logo-icon.png</file>
+  </gresource>
+</gresources>
diff --git a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb b/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
index fdb6ee3..744676b 100644
--- a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
+++ b/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
@@ -17,4 +17,15 @@
 require "test-unit"
 
 module GdkPixbufTestUtils
+  private
+  def only_version(major, minor, micro=nil)
+    micro ||= 0
+    unless GdkPixbuf::Version.or_later?(major, minor, micro)
+      omit("Require GdkPixbuf >= #{major}.#{minor}.#{micro}")
+    end
+  end
+
+  def fixture_path(*components)
+    File.join(File.dirname(__FILE__), "fixture", *components)
+  end
 end
diff --git a/gdk_pixbuf2/test/run-test.rb b/gdk_pixbuf2/test/run-test.rb
index 17082d2..8786cbd 100755
--- a/gdk_pixbuf2/test/run-test.rb
+++ b/gdk_pixbuf2/test/run-test.rb
@@ -1,6 +1,6 @@
 #!/usr/bin/env ruby
 #
-# Copyright (C) 2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -20,14 +20,17 @@ ruby_gnome2_base = File.join(File.dirname(__FILE__), "..", "..")
 ruby_gnome2_base = File.expand_path(ruby_gnome2_base)
 
 glib_base = File.join(ruby_gnome2_base, "glib2")
+gobject_introspection_base = File.join(ruby_gnome2_base, "gobject-introspection")
 gdk_pixbuf2_base = File.join(ruby_gnome2_base, "gdk_pixbuf2")
 
 modules = [
   [glib_base, "glib2"],
-  [gdk_pixbuf2_base, "gdk_pixbuf2"]
+  [gobject_introspection_base, "gobject-introspection"],
+  [gdk_pixbuf2_base, "gdk_pixbuf2"],
 ]
 modules.each do |target, module_name|
-  if system("which make > /dev/null")
+  makefile = File.join(target, "Makefile")
+  if File.exist?(makefile) and system("which make > /dev/null")
     `make -C #{target.dump} > /dev/null` or exit(false)
   end
   $LOAD_PATH.unshift(File.join(target, "ext", module_name))
diff --git a/gobject-introspection/lib/gobject-introspection/arg-info.rb b/gdk_pixbuf2/test/test-animation.rb
similarity index 67%
copy from gobject-introspection/lib/gobject-introspection/arg-info.rb
copy to gdk_pixbuf2/test/test-animation.rb
index 88d785d..5628822 100644
--- a/gobject-introspection/lib/gobject-introspection/arg-info.rb
+++ b/gdk_pixbuf2/test/test-animation.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -14,14 +14,17 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
-module GObjectIntrospection
-  class ArgInfo
-    def gclosure?
-      type_info = type
-      return false if type_info.tag != TypeTag::INTERFACE
+class TestAnimationIter < Test::Unit::TestCase
+  include GdkPixbufTestUtils
 
-      struct_info = type_info.interface
-      struct_info.gtype.name == "GClosure"
+  setup do
+    @animation = GdkPixbuf::PixbufAnimation.new(fixture_path("floppybuddy.gif"))
+    @iter = @animation.get_iter
+  end
+
+  test("#on_currently_loading_frame?") do
+    assert do
+      not @iter.on_currently_loading_frame?
     end
   end
 end
diff --git a/gobject-introspection/lib/gobject-introspection/arg-info.rb b/gdk_pixbuf2/test/test-loader.rb
similarity index 67%
copy from gobject-introspection/lib/gobject-introspection/arg-info.rb
copy to gdk_pixbuf2/test/test-loader.rb
index 88d785d..e7f09ea 100644
--- a/gobject-introspection/lib/gobject-introspection/arg-info.rb
+++ b/gdk_pixbuf2/test/test-loader.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -14,14 +14,18 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
-module GObjectIntrospection
-  class ArgInfo
-    def gclosure?
-      type_info = type
-      return false if type_info.tag != TypeTag::INTERFACE
+class TestLoader < Test::Unit::TestCase
+  include GdkPixbufTestUtils
 
-      struct_info = type_info.interface
-      struct_info.gtype.name == "GClosure"
+  setup do
+    @loader = GdkPixbuf::PixbufLoader.new
+  end
+
+  test("#last_write") do
+    assert_nil(@loader.pixbuf)
+    File.open(fixture_path("gnome-logo-icon.png"), "rb") do |png|
+      @loader.last_write(png.read)
     end
+    assert_not_nil(@loader.pixbuf)
   end
 end
diff --git a/gdk_pixbuf2/test/test-pixbuf.rb b/gdk_pixbuf2/test/test-pixbuf.rb
new file mode 100644
index 0000000..e5ee874
--- /dev/null
+++ b/gdk_pixbuf2/test/test-pixbuf.rb
@@ -0,0 +1,334 @@
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+class TestPixbuf < Test::Unit::TestCase
+  include GdkPixbufTestUtils
+
+  sub_test_case(".new") do
+    def r_xpm
+      [
+       "10 10 3 1",
+       "   c None",
+       ".  c #FE0B0B",
+       "+  c #FFFFFF",
+       "+.......++",
+       "+..    ..+",
+       "+..    ..+",
+       "+..   ...+",
+       "+.......++",
+       "+.....++++",
+       "+..++..+++",
+       "+..++...++",
+       "+..+++...+",
+        "+..++++..+",
+      ]
+    end
+
+    sub_test_case("legacy form") do
+      test "basic" do
+        colorspace =  GdkPixbuf::Colorspace::RGB
+        width = 100
+        height = 100
+        has_alpha = true
+        bits_per_sample = 8
+        pixbuf = GdkPixbuf::Pixbuf.new(colorspace,
+                                       has_alpha,
+                                       bits_per_sample,
+                                       width,
+                                       height)
+        assert_equal(colorspace, pixbuf.colorspace)
+        assert_equal(width, pixbuf.width)
+        assert_equal(height, pixbuf.height)
+        assert_equal(has_alpha, pixbuf.has_alpha?)
+        assert_equal(bits_per_sample, pixbuf.bits_per_sample)
+      end
+
+      test "file" do
+        pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+        assert_equal(GdkPixbuf::Colorspace::RGB, pixbuf.colorspace)
+      end
+
+      test "xpm" do
+        pixbuf = GdkPixbuf::Pixbuf.new(r_xpm)
+        assert_equal(GdkPixbuf::Colorspace::RGB, pixbuf.colorspace)
+      end
+
+      test "file: size" do
+        pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"),
+                                                    32, 48)
+        assert_equal(GdkPixbuf::Colorspace::RGB, pixbuf.colorspace)
+        assert_equal(32, pixbuf.width)
+        assert_equal(32, pixbuf.height)
+      end
+
+      test "file: scale" do
+        pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"),
+                                                    32, 48, false)
+        assert_equal(GdkPixbuf::Colorspace::RGB, pixbuf.colorspace)
+        assert_equal(32, pixbuf.width)
+        assert_equal(48, pixbuf.height)
+      end
+
+      test "subpixbuf" do
+        src_pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+        pixbuf = GdkPixbuf::Pixbuf.new(src_pixbuf, 0, 0, 32, 32)
+        assert_equal(GdkPixbuf::Colorspace::RGB, pixbuf.colorspace)
+        assert_equal(32, pixbuf.width)
+        assert_equal(32, pixbuf.height)
+      end
+
+      test "data" do
+        src_pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+        data = src_pixbuf.pixels.pack("C*")
+        pixbuf = GdkPixbuf::Pixbuf.new(data,
+                                       src_pixbuf.colorspace,
+                                       src_pixbuf.has_alpha?,
+                                       src_pixbuf.bits_per_sample,
+                                       src_pixbuf.width,
+                                       src_pixbuf.height,
+                                       src_pixbuf.rowstride,
+                                       )
+        assert_equal(src_pixbuf.pixels, pixbuf.pixels)
+      end
+    end
+
+    sub_test_case("Hash form") do
+      test "basic" do
+        colorspace =  GdkPixbuf::Colorspace::RGB
+        width = 100
+        height = 100
+        has_alpha = true
+        bits_per_sample = 8
+        pixbuf = GdkPixbuf::Pixbuf.new(:colorspace => colorspace,
+                                       :has_alpha => has_alpha,
+                                       :width => width,
+                                       :height => height,
+                                       :bits_per_sample => bits_per_sample)
+        assert_equal(colorspace, pixbuf.colorspace)
+        assert_equal(width, pixbuf.width)
+        assert_equal(height, pixbuf.height)
+        assert_equal(has_alpha, pixbuf.has_alpha?)
+        assert_equal(bits_per_sample, pixbuf.bits_per_sample)
+      end
+
+      test "file" do
+        filename = fixture_path("gnome-logo-icon.png")
+        pixbuf = GdkPixbuf::Pixbuf.new(:file => filename)
+        assert_equal(GdkPixbuf::Colorspace::RGB, pixbuf.colorspace)
+      end
+
+      test "xpm" do
+        pixbuf = GdkPixbuf::Pixbuf.new(:xpm => r_xpm)
+        assert_equal(GdkPixbuf::Colorspace::RGB, pixbuf.colorspace)
+      end
+
+      test "file: size" do
+        filename = fixture_path("gnome-logo-icon.png")
+        pixbuf = GdkPixbuf::Pixbuf.new(:file => filename,
+                                       :width => 32,
+                                       :height => 48)
+        assert_equal(GdkPixbuf::Colorspace::RGB, pixbuf.colorspace)
+        assert_equal(32, pixbuf.width)
+        assert_equal(32, pixbuf.height)
+      end
+
+      test "file: scale" do
+        filename = fixture_path("gnome-logo-icon.png")
+        pixbuf = GdkPixbuf::Pixbuf.new(:file => filename,
+                                       :width => 32,
+                                       :height => 48,
+                                       :scale => true,
+                                       :preserve_aspect_ratio => false)
+        assert_equal(GdkPixbuf::Colorspace::RGB, pixbuf.colorspace)
+        assert_equal(32, pixbuf.width)
+        assert_equal(48, pixbuf.height)
+      end
+
+      test "subpixbuf" do
+        src_pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+        pixbuf = GdkPixbuf::Pixbuf.new(:src_pixbuf => src_pixbuf,
+                                       :src_x => 0,
+                                       :src_y => 0,
+                                       :width => 32,
+                                       :height => 32)
+        assert_equal(GdkPixbuf::Colorspace::RGB, pixbuf.colorspace)
+        assert_equal(32, pixbuf.width)
+        assert_equal(32, pixbuf.height)
+      end
+
+      test "data" do
+        src_pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+        data = src_pixbuf.pixels.pack("C*")
+        pixbuf = GdkPixbuf::Pixbuf.new(:data => data,
+                                       :colorspace => src_pixbuf.colorspace,
+                                       :has_alpha => src_pixbuf.has_alpha?,
+                                       :bits_per_sample => src_pixbuf.bits_per_sample,
+                                       :width => src_pixbuf.width,
+                                       :height => src_pixbuf.height,
+                                       :row_stride => src_pixbuf.rowstride,
+                                       )
+        assert_equal(src_pixbuf.pixels, pixbuf.pixels)
+      end
+
+      test "bytes" do
+        only_version(2, 32)
+        src_pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+        bytes = src_pixbuf.pixels.flatten.pack("C*")
+        pixbuf = GdkPixbuf::Pixbuf.new(:bytes => bytes,
+                                       :colorspace => src_pixbuf.colorspace,
+                                       :has_alpha => src_pixbuf.has_alpha?,
+                                       :bits_per_sample => src_pixbuf.bits_per_sample,
+                                       :width => src_pixbuf.width,
+                                       :height => src_pixbuf.height,
+                                       :row_stride => src_pixbuf.rowstride,
+                                       )
+        assert_equal(src_pixbuf.pixels, pixbuf.pixels)
+      end
+
+      test "resource" do
+        src_pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+        resource = Gio::Resource.load(fixture_path("image.gresource"))
+        Gio::Resources.register(resource)
+        begin
+          resource_path = "/org/ruby/gnome/gnome-logo-icon.png"
+          pixbuf = GdkPixbuf::Pixbuf.new(:resource => resource_path)
+          assert_equal(src_pixbuf.pixels, pixbuf.pixels)
+        ensure
+          Gio::Resources.unregister(resource)
+        end
+      end
+
+      test "resource: scale" do
+        resource = Gio::Resource.load(fixture_path("image.gresource"))
+        Gio::Resources.register(resource)
+        begin
+          resource_path = "/org/ruby/gnome/gnome-logo-icon.png"
+          pixbuf = GdkPixbuf::Pixbuf.new(:resource => resource_path,
+                                         :width => 32,
+                                         :height => 48,
+                                         :scale => true,
+                                         :preserve_aspect_ratio => false)
+          assert_equal([
+                         GdkPixbuf::Colorspace::RGB,
+                         32,
+                         48,
+                       ],
+                       [
+                         pixbuf.colorspace,
+                         pixbuf.width,
+                         pixbuf.height,
+                       ])
+        ensure
+          Gio::Resources.unregister(resource)
+        end
+      end
+    end
+
+    def test_new_subpixbuf
+      src_pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+      pixbuf = src_pixbuf.new_subpixbuf(0, 0, 32, 32)
+      assert_equal(GdkPixbuf::Colorspace::RGB, pixbuf.colorspace)
+      assert_equal(32, pixbuf.width)
+      assert_equal(32, pixbuf.height)
+    end
+  end
+
+  def test_dup
+    pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+    assert_equal(pixbuf.pixels, pixbuf.dup.pixels)
+  end
+
+  def test_fill!
+    filename = fixture_path("gnome-logo-icon.png")
+    pixbuf = GdkPixbuf::Pixbuf.new(:file => filename)
+    pixbuf.fill!(0xffffffff)
+    assert_equal([0xff] * (pixbuf.rowstride * pixbuf.height),
+                 pixbuf.pixels)
+  end
+
+  def test_rotate
+    pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+    inverted_pixbuf = pixbuf.rotate(:upsidedown)
+    assert_not_equal(pixbuf.pixels, inverted_pixbuf.pixels)
+    inverted_twice_pixbuf = inverted_pixbuf.rotate(:upsidedown)
+    assert_equal(pixbuf.pixels, inverted_twice_pixbuf.pixels)
+  end
+
+  sub_test_case("saturate_and_pixelate") do
+    # Based on the function gdk_pixbuf_saturate_and_pixelate
+    # in gdk-pixbuf-util.c
+    def saturate_and_pixelate_pixels(pixbuf, saturation, pixelate)
+      alpha = pixbuf.has_alpha?
+      width = pixbuf.width
+      height = pixbuf.height
+      pixels = pixbuf.pixels
+      dest_pix = []
+      dark_factor = 0.7
+      height.times do |i|
+        width.times do |k|
+          j =((i ) * width + k) * 4
+          intens = intensity(pixels[j + 0], pixels[j + 1], pixels[j + 2])
+          if pixelate == true && ( (i + k) % 2 == 0)
+            dest_pix << (intens / 2 + 127).floor
+            dest_pix << (intens / 2 + 127).floor
+            dest_pix << (intens / 2 + 127).floor
+          elsif pixelate == true
+            dest_pix << clamp_uchar(saturate(pixels[j + 0],
+                                    saturation, intens) * dark_factor).floor
+            dest_pix << clamp_uchar(saturate(pixels[j + 1],
+                                    saturation, intens) * dark_factor).floor
+            dest_pix << clamp_uchar(saturate(pixels[j + 2],
+                                    saturation, intens) * dark_factor).floor
+          else
+            dest_pix << clamp_uchar(saturate(pixels[j + 0], saturation, intens)).floor
+            dest_pix << clamp_uchar(saturate(pixels[j + 1], saturation, intens)).floor
+            dest_pix << clamp_uchar(saturate(pixels[j + 2], saturation, intens)).floor
+          end
+          dest_pix << pixels[j + 3] if alpha
+        end
+      end
+      dest_pix
+    end
+
+    def saturate(value, saturation, intensity)
+      (1.0 - saturation) * intensity + saturation * (1.0 * value)
+    end
+
+    def clamp_uchar(x)
+      [0, x, 255].sort[1]
+    end
+
+    def intensity(r, g, b)
+      (r * 0.30 + g * 0.59 + b * 0.11).floor
+    end
+
+    test "no modifications" do
+      src_pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+      pixbuf = src_pixbuf.saturate_and_pixelate(1, false)
+      assert_equal(src_pixbuf.pixels, pixbuf.pixels)
+    end
+
+    test "normal usage" do
+      src_pixbuf = GdkPixbuf::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+      pixbuf = src_pixbuf.saturate_and_pixelate(0, true)
+      ref = saturate_and_pixelate_pixels(src_pixbuf, 0, true)
+      assert_equal(ref, pixbuf.pixels, ref.size)
+      pixbuf = src_pixbuf.saturate_and_pixelate(0.5, true)
+      ref = saturate_and_pixelate_pixels(src_pixbuf, 0.5, true)
+      assert_equal(ref, pixbuf.pixels)
+    end
+  end
+end
diff --git a/gio2/lib/gio2.rb b/gio2/lib/gio2.rb
index c15b978..06842ed 100644
--- a/gio2/lib/gio2.rb
+++ b/gio2/lib/gio2.rb
@@ -35,23 +35,6 @@ module Gio
   class Error < StandardError
   end
 
-  class << self
-    def const_missing(name)
-      init
-      if const_defined?(name)
-        const_get(name)
-      else
-        super
-      end
-    end
-
-    def init
-      class << self
-        remove_method(:init)
-        remove_method(:const_missing)
-      end
-      loader = Loader.new(self)
-      loader.load("Gio")
-    end
-  end
+  loader = Loader.new(self)
+  loader.load("Gio")
 end
diff --git a/gio2/lib/gio2/application-command-line.rb b/gio2/lib/gio2/application-command-line.rb
index c739064..bf9b31c 100644
--- a/gio2/lib/gio2/application-command-line.rb
+++ b/gio2/lib/gio2/application-command-line.rb
@@ -27,10 +27,5 @@ module Gio
       end
       super(properties)
     end
-
-    alias_method :arguments_raw, :arguments
-    def arguments
-      arguments_raw[0]
-    end
   end
 end
diff --git a/gio2/lib/gio2/loader.rb b/gio2/lib/gio2/loader.rb
index d324359..c7e5b5d 100644
--- a/gio2/lib/gio2/loader.rb
+++ b/gio2/lib/gio2/loader.rb
@@ -102,8 +102,6 @@ module Gio
     def load_function_info(info)
       name = info.name
       case name
-      when "init"
-        # ignore
       when /\Acontent_type_/
         load_function_info_content_type(info)
       when "content_types_get_registered"
@@ -228,13 +226,12 @@ module Gio
       end
     end
 
-    def error_class_name(info)
-      name = info.name
-      case name
+    def rubyish_class_name(info)
+      case info.name
       when /Enum\z/
         $PREMATCH
       else
-        name
+        super
       end
     end
 
diff --git a/glib2/Rakefile b/glib2/Rakefile
index 03c6546..e0fd1d7 100644
--- a/glib2/Rakefile
+++ b/glib2/Rakefile
@@ -85,7 +85,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
       :name => "glib",
       :download_site => :gnome,
       :label => "GLib",
-      :version => "2.48.0",
+      :version => "2.48.1",
       :compression_method => "xz",
       :windows => {
         :need_autoreconf => true,
@@ -168,7 +168,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
       :name => "glib-networking",
       :download_site => :gnome,
       :label => "glib-networking",
-      :version => "2.48.0",
+      :version => "2.48.2",
       :compression_method => "xz",
       :windows => {
         :configure_args => [
diff --git a/glib2/ext/glib2/extconf.rb b/glib2/ext/glib2/extconf.rb
index ada704c..357d4c0 100644
--- a/glib2/ext/glib2/extconf.rb
+++ b/glib2/ext/glib2/extconf.rb
@@ -47,7 +47,6 @@ have_func("ruby_set_current_source", ruby_header)
 have_func("rb_thread_call_without_gvl", ruby_header)
 have_func("ruby_native_thread_p", ruby_header)
 have_func("rb_thread_call_with_gvl", ruby_header)
-have_func("rb_str_new_cstr", ruby_header)
 have_func("rb_gc_register_mark_object", ruby_header)
 have_func("rb_exc_new_str", ruby_header)
 
diff --git a/glib2/ext/glib2/rbglib-variant-type.c b/glib2/ext/glib2/rbglib-variant-type.c
index 70e7979..4173f7b 100644
--- a/glib2/ext/glib2/rbglib-variant-type.c
+++ b/glib2/ext/glib2/rbglib-variant-type.c
@@ -1,6 +1,6 @@
 /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
 /*
- *  Copyright (C) 2015  Ruby-GNOME2 Project Team
+ *  Copyright (C) 2015-2016  Ruby-GNOME2 Project Team
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Lesser General Public
@@ -286,10 +286,14 @@ Init_glib_variant_type(void)
         DEF_TYPE(DICT_ENTRY);
         DEF_TYPE(DICTIONARY);
         DEF_TYPE(STRING_ARRAY);
+#  if GLIB_CHECK_VERSION(2, 30, 0)
         DEF_TYPE(OBJECT_PATH_ARRAY);
+#  endif
         DEF_TYPE(BYTESTRING);
         DEF_TYPE(BYTESTRING_ARRAY);
+#  if GLIB_CHECK_VERSION(2, 30, 0)
         DEF_TYPE(VARDICT);
+#  endif
 
 #undef DEF_TYPE
     }
diff --git a/glib2/ext/glib2/rbglib-variant.c b/glib2/ext/glib2/rbglib-variant.c
index 1a33005..80081ba 100644
--- a/glib2/ext/glib2/rbglib-variant.c
+++ b/glib2/ext/glib2/rbglib-variant.c
@@ -1,6 +1,6 @@
 /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
 /*
- *  Copyright (C) 2015  Ruby-GNOME2 Project Team
+ *  Copyright (C) 2015-2016  Ruby-GNOME2 Project Team
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Lesser General Public
@@ -174,9 +174,7 @@ rg_ruby_to_variant(VALUE rb_value, VALUE rb_variant_type)
     } else if (g_variant_type_equal(variant_type, G_VARIANT_TYPE_VARIANT)) {
         return g_variant_new_variant(rbg_variant_from_ruby(rb_value));
     } else if (g_variant_type_equal(variant_type,
-                                    G_VARIANT_TYPE_STRING_ARRAY) ||
-               g_variant_type_equal(variant_type,
-                                    G_VARIANT_TYPE_OBJECT_PATH_ARRAY)) {
+                                    G_VARIANT_TYPE_STRING_ARRAY)) {
         const gchar **strings;
         gssize length;
         if (NIL_P(rb_value)) {
@@ -192,11 +190,27 @@ rg_ruby_to_variant(VALUE rb_value, VALUE rb_variant_type)
                 strings[i] = RVAL2CSTR_ACCEPT_NIL(rb_string);
             }
         }
-        if (g_variant_type_equal(variant_type, G_VARIANT_TYPE_STRING_ARRAY)) {
-            return g_variant_new_strv(strings, length);
+        return g_variant_new_strv(strings, length);
+#if GLIB_CHECK_VERSION(2, 30, 0)
+    } else if (g_variant_type_equal(variant_type,
+                                    G_VARIANT_TYPE_OBJECT_PATH_ARRAY)) {
+        const gchar **paths;
+        gssize length;
+        if (NIL_P(rb_value)) {
+            paths = NULL;
+            length = 0;
         } else {
-            return g_variant_new_objv(strings, length);
+            gssize i;
+
+            length = RARRAY_LEN(rb_value);
+            paths = ALLOCA_N(const gchar *, length);
+            for (i = 0; i < length; i++) {
+                VALUE rb_path = RARRAY_PTR(rb_value)[i];
+                paths[i] = RVAL2CSTR_ACCEPT_NIL(rb_path);
+            }
         }
+        return g_variant_new_objv(paths, length);
+#endif
     } else if (g_variant_type_equal(variant_type, G_VARIANT_TYPE_ARRAY)) {
         int i;
         GVariantBuilder builder;
diff --git a/glib2/ext/glib2/rbglib.c b/glib2/ext/glib2/rbglib.c
index f435d94..688acca 100644
--- a/glib2/ext/glib2/rbglib.c
+++ b/glib2/ext/glib2/rbglib.c
@@ -34,10 +34,8 @@ rbg_rval2cstr(VALUE *str)
 {
     StringValue(*str);
 
-#ifdef HAVE_RUBY_ENCODING_H
     if (rb_enc_get(*str) != rb_utf8_encoding())
         *str = rb_str_export_to_enc(*str, rb_utf8_encoding());
-#endif
 
     return StringValueCStr(*str);
 }
@@ -142,11 +140,7 @@ rbg_cstr2rval_len(const gchar *str, gsize len)
     if (str == NULL)
         return Qnil;
 
-#ifdef HAVE_RUBY_ENCODING_H
     return rb_external_str_new_with_enc(str, len, rb_utf8_encoding());
-#else
-    return rb_str_new(str, len);
-#endif
 }
 
 struct rbg_cstr2rval_len_free_args {
@@ -185,7 +179,6 @@ rbg_cstr2rval_with_encoding(const gchar *str, const gchar *encoding)
     return str != NULL ? CSTR2RVAL_LEN_ENC(str, strlen(str), encoding) : Qnil;
 }
 
-#ifdef HAVE_RUBY_ENCODING_H
 VALUE
 rbg_cstr2rval_len_with_encoding(const gchar *str, gsize len,
                                 const gchar *encoding)
@@ -198,17 +191,6 @@ rbg_cstr2rval_len_with_encoding(const gchar *str, gsize len,
                                             rb_enc_find(encoding) :
                                             rb_utf8_encoding());
 }
-#else
-VALUE
-rbg_cstr2rval_len_with_encoding(const gchar *str, gsize len,
-                                G_GNUC_UNUSED const gchar *encoding)
-{
-    if (str == NULL)
-        return Qnil;
-
-    return rb_str_new(str, len);
-}
-#endif
 
 static VALUE
 rbg_cstr2rval_free_body(VALUE str)
@@ -238,11 +220,8 @@ rbg_cstr2rval_with_free(gchar *str)
     return rbg_cstr2rval_free(str);
 }
 
-#ifdef HAVE_RUBY_ENCODING_H
 static rb_encoding *filename_encoding_if_not_utf8;
-#endif
 
-#ifdef HAVE_RUBY_ENCODING_H
 static VALUE
 rbg_filename_to_ruby_body(VALUE filename)
 {
@@ -267,12 +246,10 @@ rbg_filename_to_ruby_ensure(VALUE filename)
 
     return Qnil;
 }
-#endif
 
 VALUE
 rbg_filename_to_ruby(const gchar *filename)
 {
-#ifdef HAVE_RUBY_ENCODING_H
     gchar *filename_utf8;
     gsize written;
     GError *error = NULL;
@@ -289,15 +266,11 @@ rbg_filename_to_ruby(const gchar *filename)
 
     return rb_ensure(rbg_filename_to_ruby_body, (VALUE)filename_utf8,
                      rbg_filename_to_ruby_ensure, (VALUE)filename_utf8);
-#else
-    return CSTR2RVAL(filename);
-#endif
 }
 
 VALUE
 rbg_filename_to_ruby_free(gchar *filename)
 {
-#ifdef HAVE_RUBY_ENCODING_H
     gchar *filename_utf8;
     gsize written;
 
@@ -318,15 +291,11 @@ rbg_filename_to_ruby_free(gchar *filename)
 
     return rb_ensure(rbg_filename_to_ruby_body, (VALUE)filename_utf8,
                      rbg_filename_to_ruby_ensure, (VALUE)filename_utf8);
-#else
-    return CSTR2RVAL_FREE(filename);
-#endif
 }
 
 gchar *
 rbg_filename_from_ruby(VALUE filename)
 {
-#ifdef HAVE_RUBY_ENCODING_H
     gchar *retval;
     gsize written;
     GError *error = NULL;
@@ -345,9 +314,6 @@ rbg_filename_from_ruby(VALUE filename)
         RAISE_GERROR(error);
 
     return retval;
-#else
-    return g_strdup(RVAL2CSTR(filename));
-#endif
 }
 
 struct rval2strv_args {
@@ -1013,9 +979,7 @@ extern void Init_glib2(void);
 void
 Init_glib2(void)
 {
-#ifdef HAVE_RUBY_ENCODING_H
     const gchar **filename_charsets;
-#endif
 
     id_inspect = rb_intern("inspect");
 
@@ -1096,7 +1060,6 @@ Init_glib2(void)
     rb_define_const(RG_TARGET_NAMESPACE, "SEARCHPATH_SEPARATOR", CSTR2RVAL(G_SEARCHPATH_SEPARATOR_S));
 
     /* discover and store glib filename encoding */
-#ifdef HAVE_RUBY_ENCODING_H
     if (g_get_filename_charsets(&filename_charsets)
         || filename_charsets == NULL
         || filename_charsets[0] == NULL
@@ -1108,7 +1071,6 @@ Init_glib2(void)
     } else {
         filename_encoding_if_not_utf8 = rb_enc_find(filename_charsets[0]);
     }
-#endif
 
 /* Don't implement them.
 #define     G_DIR_SEPARATOR_S
diff --git a/glib2/ext/glib2/rbglib.h b/glib2/ext/glib2/rbglib.h
index 917c636..316aff9 100644
--- a/glib2/ext/glib2/rbglib.h
+++ b/glib2/ext/glib2/rbglib.h
@@ -1,6 +1,6 @@
 /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
 /*
- *  Copyright (C) 2002-2015  Ruby-GNOME2 Project Team
+ *  Copyright (C) 2002-2016  Ruby-GNOME2 Project Team
  *  Copyright (C) 2002,2003  Masahiro Sakai
  *
  *  This library is free software; you can redistribute it and/or
@@ -36,7 +36,7 @@ extern "C" {
 
 #define RBGLIB_MAJOR_VERSION 3
 #define RBGLIB_MINOR_VERSION 0
-#define RBGLIB_MICRO_VERSION 8
+#define RBGLIB_MICRO_VERSION 9
 
 #ifndef RB_ZALLOC
 #  ifdef ZALLOC
diff --git a/glib2/ext/glib2/rbglib_convert.c b/glib2/ext/glib2/rbglib_convert.c
index 478a32d..cb99e48 100644
--- a/glib2/ext/glib2/rbglib_convert.c
+++ b/glib2/ext/glib2/rbglib_convert.c
@@ -1,6 +1,6 @@
 /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
 /*
- *  Copyright (C) 2011  Ruby-GNOME2 Project Team
+ *  Copyright (C) 2011-2016  Ruby-GNOME2 Project Team
  *  Copyright (C) 2009  Ruby-GNOME2 Project Team
  *  Copyright (C) 2002,2003 KUBO Takehiro
  *
@@ -49,7 +49,6 @@ static VALUE
 rg_s_locale_to_utf8(G_GNUC_UNUSED VALUE self, VALUE str)
 {
     GError *err = NULL;
-    VALUE s = Qnil;
     gchar* ret;
     gsize written;
 
@@ -59,9 +58,7 @@ rg_s_locale_to_utf8(G_GNUC_UNUSED VALUE self, VALUE str)
 
     if (err != NULL)
         RAISE_GERROR(err);
-    s = rb_str_new(ret, written);
-    g_free(ret);
-    return s;
+    return CSTR2RVAL_LEN_FREE(ret, written);
 }
 
 static VALUE
@@ -87,7 +84,6 @@ static VALUE
 rg_s_filename_to_utf8(G_GNUC_UNUSED VALUE self, VALUE str)
 {
     GError *err = NULL;
-    VALUE s = Qnil;
     gchar* ret;
     gsize written;
 
@@ -97,9 +93,7 @@ rg_s_filename_to_utf8(G_GNUC_UNUSED VALUE self, VALUE str)
 
     if (err != NULL)
         RAISE_GERROR(err);
-    s = rb_str_new(ret, written);
-    g_free(ret);
-    return s;
+    return CSTR2RVAL_LEN_FREE(ret, written);
 }
 
 static VALUE
diff --git a/glib2/ext/glib2/rbglib_matchinfo.c b/glib2/ext/glib2/rbglib_matchinfo.c
index 9ea4648..7b6e698 100644
--- a/glib2/ext/glib2/rbglib_matchinfo.c
+++ b/glib2/ext/glib2/rbglib_matchinfo.c
@@ -22,6 +22,7 @@
 #define RG_TARGET_NAMESPACE cMatchInfo
 #define _SELF(s) ((GMatchInfo*)RVAL2BOXED(s, G_TYPE_MATCH_INFO))
 
+#if GLIB_CHECK_VERSION(2, 30, 0)
 static VALUE
 rg_regex(VALUE self)
 {
@@ -157,10 +158,12 @@ rg_expand_references(VALUE self, VALUE rb_string)
 
     return CSTR2RVAL_FREE(expanded_string);
 }
+#endif
 
 void
 Init_glib_matchinfo(void)
 {
+#if GLIB_CHECK_VERSION(2, 30, 0)
     VALUE RG_TARGET_NAMESPACE;
 
     RG_TARGET_NAMESPACE = G_DEF_CLASS(G_TYPE_MATCH_INFO, "MatchInfo", mGLib);
@@ -176,4 +179,5 @@ Init_glib_matchinfo(void)
     RG_DEF_METHOD(fetch_all, 0);
     RG_DEF_METHOD(next, 0);
     RG_DEF_METHOD(expand_references, 1);
+#endif
 }
diff --git a/glib2/ext/glib2/rbglib_regex.c b/glib2/ext/glib2/rbglib_regex.c
index be2fa81..05ceec3 100644
--- a/glib2/ext/glib2/rbglib_regex.c
+++ b/glib2/ext/glib2/rbglib_regex.c
@@ -136,6 +136,7 @@ rg_split(gint argc, VALUE *argv, VALUE self)
     return STRV2RVAL_FREE(strings);
 }
 
+#if GLIB_CHECK_VERSION(2, 30, 0)
 static VALUE
 rg_match(gint argc, VALUE *argv, VALUE self)
 {
@@ -190,6 +191,7 @@ rg_match(gint argc, VALUE *argv, VALUE self)
     rb_iv_set(rb_match_info, "@string", rb_frozen_string);
     return rb_match_info;
 }
+#endif
 
 static VALUE
 rg_max_backref(VALUE self)
@@ -203,6 +205,7 @@ rg_capture_count(VALUE self)
     return INT2NUM(g_regex_get_capture_count(_SELF(self)));
 }
 
+#if GLIB_CHECK_VERSION(2, 34, 0)
 static VALUE
 rg_has_cr_or_lf_p(VALUE self)
 {
@@ -214,6 +217,7 @@ rg_max_lookbehind(VALUE self)
 {
     return INT2NUM(g_regex_get_max_lookbehind(_SELF(self)));
 }
+#endif
 
 static VALUE
 rg_string_number(VALUE self, VALUE string)
@@ -221,6 +225,7 @@ rg_string_number(VALUE self, VALUE string)
     return INT2NUM(g_regex_get_string_number(_SELF(self), RVAL2CSTR(string)));
 }
 
+#if GLIB_CHECK_VERSION(2, 30, 0)
 static VALUE
 rg_match_all(gint argc, VALUE *argv, VALUE self)
 {
@@ -418,7 +423,7 @@ rg_replace(gint argc, VALUE *argv, VALUE self)
 
     return CSTR2RVAL_FREE(modified_string);
 }
-
+#endif
 
 static VALUE
 rg_s_escape_string(G_GNUC_UNUSED VALUE self, VALUE string)
@@ -466,14 +471,20 @@ Init_glib_regex(void)
     RG_DEF_METHOD(compile_flags, 0);
     RG_DEF_METHOD(match_flags, 0);
     RG_DEF_METHOD(split, -1);
+#if GLIB_CHECK_VERSION(2, 30, 0)
     RG_DEF_METHOD(match, -1);
+#endif
     RG_DEF_METHOD(max_backref, 0);
     RG_DEF_METHOD(capture_count, 0);
+#if GLIB_CHECK_VERSION(2, 34, 0)
     RG_DEF_METHOD_P(has_cr_or_lf, 0);
     RG_DEF_METHOD(max_lookbehind, 0);
+#endif
     RG_DEF_METHOD(string_number, 1);
+#if GLIB_CHECK_VERSION(2, 30, 0)
     RG_DEF_METHOD(match_all, -1);
     RG_DEF_METHOD(replace, -1);
+#endif
 
     RG_DEF_SMETHOD(escape_string, 1);
     RG_DEF_SMETHOD(check_replacement, 1);
diff --git a/glib2/ext/glib2/rbgobj_object.c b/glib2/ext/glib2/rbgobj_object.c
index c2d3794..c51bad7 100644
--- a/glib2/ext/glib2/rbgobj_object.c
+++ b/glib2/ext/glib2/rbgobj_object.c
@@ -302,7 +302,7 @@ rbgobj_gobject_new(GType gtype, VALUE params_hash)
         size_t param_size;
         struct param_setup_arg arg;
 
-        param_size = NUM2INT(rb_funcall(params_hash, rb_intern("length"), 0)); 
+        param_size = NUM2INT(rb_funcall(params_hash, rb_intern("length"), 0));
 
         arg.param_size = param_size;
         arg.gclass = G_OBJECT_CLASS(g_type_class_ref(gtype));
@@ -621,19 +621,97 @@ rg_type_name(VALUE self)
 }
 
 #if GLIB_CHECK_VERSION(2, 26, 0)
+typedef struct {
+    VALUE transform_from_callback;
+    VALUE transform_to_callback;
+    VALUE self;
+} RGBindPropertyCallbackData;
+
+static gboolean
+rg_bind_property_transform_to_callback(G_GNUC_UNUSED GBinding *binding,
+                                       const GValue *from_value,
+                                       GValue *to_value,
+                                       gpointer user_data)
+{
+    RGBindPropertyCallbackData *data = (RGBindPropertyCallbackData *)user_data;
+    VALUE proc;
+    VALUE rb_from_value;
+    VALUE rb_to_value;
+
+    proc = data->transform_to_callback;
+    if (NIL_P(proc))
+        return FALSE;
+
+    rb_from_value = rbgobj_gvalue_to_rvalue(from_value);
+    rb_to_value = rbgobj_gvalue_to_rvalue(to_value);
+    rb_to_value = rb_funcall(proc, rb_intern("call"), 1, rb_from_value);
+    rbgobj_rvalue_to_gvalue(rb_to_value, to_value);
+    return TRUE;
+}
+
+static gboolean
+rg_bind_property_transform_from_callback(G_GNUC_UNUSED GBinding *binding,
+                                         const GValue *from_value,
+                                         GValue *to_value,
+                                         gpointer user_data)
+{
+    RGBindPropertyCallbackData *data = (RGBindPropertyCallbackData *)user_data;
+    VALUE proc;
+    VALUE rb_from_value;
+    VALUE rb_to_value;
+
+    proc = data->transform_from_callback;
+    if (NIL_P(proc))
+        return FALSE;
+
+    rb_from_value = rbgobj_gvalue_to_rvalue(from_value);
+    rb_to_value = rbgobj_gvalue_to_rvalue(to_value);
+    rb_to_value = rb_funcall(proc, rb_intern("call"), 1, rb_from_value);
+    rbgobj_rvalue_to_gvalue(rb_to_value, to_value);
+    return TRUE;
+}
+
+static void
+rg_destroy_bind_property_full_data(gpointer user_data)
+{
+    RGBindPropertyCallbackData *data = (RGBindPropertyCallbackData *)user_data;
+
+    if (!NIL_P(data->transform_to_callback))
+        G_CHILD_REMOVE(data->self, data->transform_to_callback);
+
+    if (!NIL_P(data->transform_from_callback))
+        G_CHILD_REMOVE(data->self, data->transform_from_callback);
+
+    xfree(data);
+}
+
 static VALUE
-rg_bind_property(VALUE self,
-                 VALUE rb_source_property,
-                 VALUE rb_target,
-                 VALUE rb_target_property,
-                 VALUE rb_flags)
+rg_bind_property(gint argc, VALUE *argv, VALUE self)
 {
+    VALUE rb_source_property;
+    VALUE rb_target;
+    VALUE rb_target_property;
+    VALUE rb_flags;
+    VALUE rb_options;
+    VALUE rb_transform_to;
+    VALUE rb_transform_from;
+
     gpointer source;
     const gchar *source_property;
     gpointer target;
     const gchar *target_property;
     GBindingFlags flags;
     GBinding *binding;
+    GBindingTransformFunc transform_to = NULL;
+    GBindingTransformFunc transform_from = NULL;
+
+    rb_scan_args(argc, argv, "41", &rb_source_property, &rb_target,
+                 &rb_target_property, &rb_flags, &rb_options);
+
+    rbg_scan_options(rb_options,
+                     "transform_to", &rb_transform_to,
+                     "transform_from", &rb_transform_from,
+                     NULL);
 
     source = RVAL2GOBJ(self);
     source_property = RVAL2CSTR(rb_source_property);
@@ -641,9 +719,33 @@ rg_bind_property(VALUE self,
     target_property = RVAL2CSTR(rb_target_property);
     flags = RVAL2GBINDINGFLAGS(rb_flags);
 
-    binding = g_object_bind_property(source, source_property,
-                                     target, target_property,
-                                     flags);
+    if (!NIL_P(rb_transform_to)) {
+        G_CHILD_ADD(self, rb_transform_to);
+        transform_to = rg_bind_property_transform_to_callback;
+    }
+
+    if (!NIL_P(rb_transform_from)) {
+        G_CHILD_ADD(self, rb_transform_from);
+        transform_from = rg_bind_property_transform_from_callback;
+    }
+
+    if (transform_to || transform_from) {
+        RGBindPropertyCallbackData *data;
+        data = (RGBindPropertyCallbackData *)xmalloc(sizeof(RGBindPropertyCallbackData));
+        data->self = self;
+        data->transform_to_callback = rb_transform_to;
+        data->transform_from_callback = rb_transform_from;
+        binding = g_object_bind_property_full(source, source_property,
+                                              target, target_property,
+                                              flags, transform_to,
+                                              transform_from,
+                                              (gpointer)data,
+                                              rg_destroy_bind_property_full_data);
+    } else {
+        binding = g_object_bind_property(source, source_property,
+                                         target, target_property,
+                                         flags);
+    }
 
     return GOBJ2RVAL(binding);
 }
@@ -882,7 +984,7 @@ Init_gobject_gobject(void)
     RG_DEF_METHOD(type_name, 0);
 
 #if GLIB_CHECK_VERSION(2, 26, 0)
-    RG_DEF_METHOD(bind_property, 4);
+    RG_DEF_METHOD(bind_property, -1);
     G_DEF_CLASS(G_TYPE_BINDING_FLAGS, "BindingFlags", mGLib);
 #endif
 
diff --git a/glib2/ext/glib2/rbgobj_signal.c b/glib2/ext/glib2/rbgobj_signal.c
index 48b664e..22787b3 100644
--- a/glib2/ext/glib2/rbgobj_signal.c
+++ b/glib2/ext/glib2/rbgobj_signal.c
@@ -309,7 +309,18 @@ gobj_sig_connect_impl(gboolean after, int argc, VALUE *argv, VALUE self)
     if (!g_signal_parse_name(sig_name, CLASS2GTYPE(CLASS_OF(self)), &signal_id, &detail, TRUE))
         rb_raise(eNoSignalError, "no such signal: %s", sig_name);
 
-    func = rb_block_proc();
+    {
+        ID id_create_signal_handler;
+        const char *normalized_signal_name;
+
+        CONST_ID(id_create_signal_handler, "create_signal_handler");
+        normalized_signal_name = g_signal_name(signal_id);
+        func = rb_funcall(self,
+                          rb_intern("create_signal_handler"),
+                          2,
+                          rb_str_new_cstr(normalized_signal_name),
+                          rb_block_proc());
+    }
     rclosure = g_rclosure_new(func, rest, 
                               rbgobj_get_signal_func(signal_id));
     g_rclosure_attach((GClosure *)rclosure, self);
diff --git a/glib2/ext/glib2/rbgobj_type.c b/glib2/ext/glib2/rbgobj_type.c
index 81e89d4..a8a8009 100644
--- a/glib2/ext/glib2/rbgobj_type.c
+++ b/glib2/ext/glib2/rbgobj_type.c
@@ -399,8 +399,9 @@ init_typemap(void)
     gtype_to_cinfo = g_hash_table_new(g_direct_hash, g_direct_equal);
     rb_global_variable(&klass_to_cinfo);
     klass_to_cinfo = rb_hash_new();
-
+#ifndef RUBY_INTEGER_UNIFICATION
     _register_fundamental_klass_to_gtype(rb_cFixnum, G_TYPE_LONG);
+#endif
     _register_fundamental_klass_to_gtype(rb_cFloat, G_TYPE_DOUBLE);
     _register_fundamental_klass_to_gtype(rb_cInteger, G_TYPE_LONG);
     _register_fundamental_klass_to_gtype(rb_cString, G_TYPE_STRING);
@@ -420,8 +421,13 @@ init_typemap(void)
     _register_fundamental_gtype_to_klass(G_TYPE_UINT64, rb_cInteger);
     _register_fundamental_gtype_to_klass(G_TYPE_INT, rb_cInteger);
     _register_fundamental_gtype_to_klass(G_TYPE_LONG, rb_cInteger);
+#ifdef RUBY_INTEGER_UNIFICATION
+    _register_fundamental_gtype_to_klass(G_TYPE_CHAR, rb_cInteger);
+    _register_fundamental_gtype_to_klass(G_TYPE_UCHAR, rb_cInteger);
+#else
     _register_fundamental_gtype_to_klass(G_TYPE_CHAR, rb_cFixnum);
     _register_fundamental_gtype_to_klass(G_TYPE_UCHAR, rb_cFixnum);
+#endif
     _register_fundamental_gtype_to_klass(G_TYPE_STRING, rb_cString);
     _register_fundamental_gtype_to_klass(G_TYPE_ULONG, rb_cInteger);
     _register_fundamental_gtype_to_klass(G_TYPE_NONE, rb_cNilClass);
diff --git a/glib2/ext/glib2/rbgobject.c b/glib2/ext/glib2/rbgobject.c
index a822d42..c20bd37 100644
--- a/glib2/ext/glib2/rbgobject.c
+++ b/glib2/ext/glib2/rbgobject.c
@@ -321,14 +321,8 @@ rbgobj_define_property_accessors(VALUE klass)
             g_string_append_printf(source,
                 "def set_%s(val); set_property('%s', val); end\n",
                 prop_name, pspec->name);
-#ifdef HAVE_NODE_ATTRASGN
             g_string_append_printf(source, "alias %s= set_%s\n",
                                    prop_name, prop_name);
-#else
-            g_string_append_printf(source,
-                "def %s=(val); set_property('%s', val); val; end\n",
-                prop_name, pspec->name);
-#endif
         }
 
         g_free(buf);
diff --git a/glib2/ext/glib2/rbgprivate.h b/glib2/ext/glib2/rbgprivate.h
index 15d5d5c..57f9636 100644
--- a/glib2/ext/glib2/rbgprivate.h
+++ b/glib2/ext/glib2/rbgprivate.h
@@ -27,10 +27,6 @@
 #  define rb_errinfo() (ruby_errinfo)
 #endif
 
-#ifndef HAVE_RB_STR_NEW_CSTR
-#  define rb_str_new_cstr(c_string) rb_str_new2(c_string)
-#endif
-
 #ifndef HAVE_RB_EXC_NEW_STR
 #  define rb_exc_new_str(klass, message) rb_exc_new3(klass, message)
 #endif
diff --git a/glib2/ext/glib2/rbgutil.c b/glib2/ext/glib2/rbgutil.c
index cee70fb..eabec1c 100644
--- a/glib2/ext/glib2/rbgutil.c
+++ b/glib2/ext/glib2/rbgutil.c
@@ -116,10 +116,8 @@ rbgutil_generic_gtype(VALUE self)
 VALUE
 rbgutil_string_set_utf8_encoding(VALUE string)
 {
-#ifdef HAVE_RUBY_ENCODING_H
     if (!NIL_P(string))
         rb_enc_associate(string, rb_utf8_encoding());
-#endif
     return string;
 }
 
diff --git a/glib2/ext/glib2/rbgutil.h b/glib2/ext/glib2/rbgutil.h
index 7634adb..d00c04f 100644
--- a/glib2/ext/glib2/rbgutil.h
+++ b/glib2/ext/glib2/rbgutil.h
@@ -24,9 +24,7 @@
 
 #include <glib-object.h>
 #include "ruby.h"
-#ifdef HAVE_RUBY_ENCODING_H
-#  include <ruby/encoding.h>
-#endif
+#include <ruby/encoding.h>
 #include "rbglib.h"
 #include "rbgutil_list.h"
 #include "rbgutildeprecated.h"
diff --git a/glib2/lib/glib2.rb b/glib2/lib/glib2.rb
index fee7fad..6a211da 100644
--- a/glib2/lib/glib2.rb
+++ b/glib2/lib/glib2.rb
@@ -126,6 +126,13 @@ module GLib
     end
   end
 
+  class Instantiatable
+    private
+    def create_signal_handler(signal_name, callback)
+      callback
+    end
+  end
+
   class Type
 
     def decendants
diff --git a/glib2/lib/gnome2/rake/external-package.rb b/glib2/lib/gnome2/rake/external-package.rb
index 3b03f85..70c3850 100644
--- a/glib2/lib/gnome2/rake/external-package.rb
+++ b/glib2/lib/gnome2/rake/external-package.rb
@@ -16,6 +16,8 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
+require "open-uri"
+
 module GNOME2
   module Rake
     class ExternalPackage < Struct.new(:name,
@@ -97,13 +99,32 @@ module GNOME2
         super || []
       end
 
+      def latest_version
+        case download_site
+        when :gnome
+          latest_version_gnome
+        when :freedesktop
+          latest_version_freedesktop
+        when :freedesktop_gstreamer
+          latest_version_freedesktop_gstreamer
+        else
+          nil
+        end
+      end
+
       private
       def download_site_base_url
         case download_site
         when :gnome
-          base_url = "http://ftp.gnome.org/pub/gnome/sources"
+          base_url = gnome_base_url
           release_series = version.gsub(/\A(\d+\.\d+)(?:[^\d].*)?\z/, '\1')
           base_url << "/#{name}/#{release_series}"
+        when :freedesktop
+          base_url = freedesktop_base_url
+          base_url << "/#{name}/release"
+        when :freedesktop_gstreamer
+          base_url = freedesktop_gstreamer_base_url
+          base_url << "/#{name}"
         when :gnu
           base_url = "http://ftp.gnu.org/pub/gnu/#{name}"
         else
@@ -112,6 +133,96 @@ module GNOME2
         base_url
       end
 
+      def gnome_base_url
+        "http://ftp.gnome.org/pub/gnome/sources"
+      end
+
+      def freedesktop_base_url
+        "https://www.freedesktop.org/software"
+      end
+
+      def freedesktop_gstreamer_base_url
+        "https://gstreamer.freedesktop.org/src"
+      end
+
+      def sort_versions(versions)
+        versions.sort_by do |version|
+          version.split(".").collect(&:to_i)
+        end
+      end
+
+      def latest_version_gnome
+        base_url = "#{gnome_base_url}/#{name}"
+        minor_versions = []
+        open(base_url) do |index|
+          index.read.scan(/<a (.+?)>/) do |content,|
+            case content
+            when /href="(\d+(?:\.\d+)*)\/?"/
+              minor_version = $1
+              next if development_minor_version_gnome?(minor_version)
+              minor_versions << minor_version
+            end
+          end
+        end
+        return nil if minor_versions.empty?
+
+        latest_minor_version = sort_versions(minor_versions).last
+        versions = []
+        open("#{base_url}/#{latest_minor_version}") do |index|
+          index.read.scan(/<a (.+?)>/) do |content,|
+            case content
+            when /href="#{Regexp.escape(name)}-
+                        (\d+(?:\.\d+)*)
+                        \.tar\.#{Regexp.escape(compression_method)}"/x
+              versions << $1
+            end
+          end
+        end
+        sort_versions(versions).last
+      end
+
+      def development_minor_version_gnome?(minor_version)
+        minor_version.split(".").last.to_i.odd?
+      end
+
+      def latest_version_freedesktop
+        base_url = "#{freedesktop_base_url}/#{name}/release"
+        versions = []
+        open(base_url) do |index|
+          index.read.scan(/<a (.+?)>/) do |content,|
+            case content
+            when /href="#{Regexp.escape(name)}-
+                        (\d+(?:\.\d+)*)
+                        \.tar\.#{Regexp.escape(compression_method)}"/x
+              versions << $1
+            end
+          end
+        end
+        sort_versions(versions).last
+      end
+
+      def latest_version_freedesktop_gstreamer
+        base_url = "#{freedesktop_gstreamer_base_url}/#{name}"
+        versions = []
+        open(base_url) do |index|
+          index.read.scan(/<a (.+?)>/) do |content,|
+            case content
+            when /href="#{Regexp.escape(name)}-
+                        (\d+(?:\.\d+)*)
+                        \.tar\.#{Regexp.escape(compression_method)}"/x
+              version = $1
+              next if development_version_freedesktop_gstreamer?(version)
+              versions << version
+            end
+          end
+        end
+        sort_versions(versions).last
+      end
+
+      def development_version_freedesktop_gstreamer?(version)
+        version.split(".")[1].to_i.odd?
+      end
+
       class WindowsConfiguration < Struct.new(:build,
                                               :include_paths,
                                               :library_paths,
@@ -124,7 +235,8 @@ module GNOME2
                                               :need_autoreconf,
                                               :build_concurrently,
                                               :use_cc_environment_variable,
-                                              :gobject_introspection_compiler_split_args)
+                                              :gobject_introspection_compiler_split_args,
+                                              :use_gobject_introspection)
         def initialize(properties)
           super()
           properties.each do |key, value|
@@ -183,6 +295,10 @@ module GNOME2
         def gobject_introspection_compiler_split_args?
           gobject_introspection_compiler_split_args
         end
+
+        def use_gobject_introspection?
+          use_gobject_introspection.nil? ? true : use_gobject_introspection
+        end
       end
 
       class NativeConfiguration < Struct.new(:build,
diff --git a/glib2/lib/gnome2/rake/package-task.rb b/glib2/lib/gnome2/rake/package-task.rb
index 9988e44..e4d0e5e 100644
--- a/glib2/lib/gnome2/rake/package-task.rb
+++ b/glib2/lib/gnome2/rake/package-task.rb
@@ -93,6 +93,10 @@ module GNOME2
         @package.external_packages = packages
       end
 
+      def windows_binary_build_task
+        @windows_binary_build_task ||= WindowsBinaryBuildTask.new(@package)
+      end
+
       private
       def initialize_variables
         @summary = ""
@@ -133,7 +137,7 @@ module GNOME2
                                              "{sample,test}/**/*"]
           files.existing!
           s.files                 = files
-          s.required_ruby_version = @required_ruby_version || ">= 1.9.3"
+          s.required_ruby_version = @required_ruby_version || ">= 2.1.0"
           s.post_install_message  = @post_install_message
           @dependency_configuration.apply(s)
         end
@@ -161,6 +165,7 @@ module GNOME2
         define_windows_extension_task
         define_windows_download_task
         define_windows_build_task
+        define_windows_version_update_task
       end
 
       def so_base_name
@@ -214,11 +219,66 @@ module GNOME2
       end
 
       def define_windows_download_task
-        GNOME2WindowsBinaryDownloadTask.new(@package)
+        task = WindowsBinaryDownloadTask.new(@package)
+        task.define
       end
 
       def define_windows_build_task
-        GNOME2WindowsBinaryBuildTask.new(@package)
+        windows_binary_build_task.define
+      end
+
+      def define_windows_version_update_task
+        namespace :windows do
+          namespace :version do
+            task_names = []
+            namespace :update do
+              @package.external_packages.each do |package|
+                task_names << package.name
+                task package.name do
+                  latest_version = package.latest_version || package.version
+                  if package.version != latest_version
+                    update_package_version(package, latest_version)
+                  end
+                end
+              end
+            end
+
+            full_task_names = task_names.collect do |name|
+              "windows:version:update:#{name}"
+            end
+            desc "Update Windows package versions"
+            task :update => full_task_names
+          end
+        end
+      end
+
+      def update_package_version(package, latest_version)
+        rakefile_path = ::Rake.application.rakefile
+        rakefile_content = File.read(rakefile_path)
+        updated_rakefile_content = ""
+        in_package = false
+        escaped_name = Regexp.escape(package.name)
+        escaped_version = Regexp.escape(package.version)
+        rakefile_content.each_line do |line|
+          case line
+          when /:name => "#{escaped_name}",/
+            in_package = true
+            updated_rakefile_content << line
+          when /:version => "#{escaped_version}",/
+            if in_package
+              updated_rakefile_content << line.gsub(/#{escaped_version}/,
+                                                    latest_version)
+              in_package = false
+            else
+              updated_rakefile_content << line
+            end
+          else
+            updated_rakefile_content << line
+          end
+        end
+        File.open(rakefile_path, "w") do |rakefile|
+          rakefile.write(updated_rakefile_content)
+        end
       end
 
       def define_package_tasks
diff --git a/glib2/lib/gnome2/rake/windows-binary-build-task.rb b/glib2/lib/gnome2/rake/windows-binary-build-task.rb
index f5cc0fc..874f6d4 100644
--- a/glib2/lib/gnome2/rake/windows-binary-build-task.rb
+++ b/glib2/lib/gnome2/rake/windows-binary-build-task.rb
@@ -5,340 +5,346 @@
 require "open-uri"
 require "pathname"
 
-class GNOME2WindowsBinaryBuildTask
-  include Rake::DSL
-
-  def initialize(package)
-    @package = package
-    define
-  end
-
-  private
-  def define
-    namespace :windows do
-      namespace :builder do
-        task :before
-        define_build_tasks
-        build_tasks = build_packages.collect do |package|
-          "windows:builder:build:#{package.name}"
-        end
-        task :build => build_tasks
-        task :after
-      end
-      desc "Build Windows binaries"
-      task :build => ["windows:builder:before",
-                      "windows:builder:build",
-                      "windows:builder:after"]
-    end
-  end
-
-  def define_build_tasks
-    namespace :build do
-      prepare_task_names = []
-      namespace :prepare do
-        prepare_task_names << "pkg_config"
-        task :pkg_config do
-          depended_packages = @package.windows.build_dependencies
-          use_packages = [@package.name] + depended_packages
-          pkg_config_path = use_packages.collect do |package|
-            "../#{package}/#{@package.windows.relative_binary_dir}/lib/pkgconfig"
-          end
-          ENV["PKG_CONFIG_PATH"] = pkg_config_path.collect do |path|
-            File.expand_path(path)
-          end.join(":")
-          ENV["PKG_CONFIG_LIBDIR"] = rcairo_windows_pkgconfig_path
-        end
-
-        prepare_task_names << "pkg_config_for_build"
-        task :pkg_config_for_build do
-          # XXX: Is it needless?
-          # ENV["PKG_CONFIG_FOR_BUILD"] = "env - pkg-config"
-        end
-      end
-
-      full_prepare_task_names = prepare_task_names.collect do |name|
-        "windows:builder:build:prepare:#{name}"
-      end
-      task :prepare => full_prepare_task_names
-
-      build_packages.each do |package|
-        namespace package.name do
-          task :before
-          download_task = "source:downloader:download:#{package.name}"
-          built_file = package.windows.built_file
-          if built_file
-            built_file = dist_dir + built_file
-            file built_file.to_s do
-              Rake::Task["windows:builder:build:prepare"].invoke
-              Rake::Task[download_task].invoke
-              build_package_task_body(package)
-            end
-            task :build => built_file.to_s
-          else
-            task :build => [:prepare, download_task] do
-              build_package_task_body(package)
-            end
-          end
-          task :after
-        end
-
-        prefix = "windows:builder:build:#{package.name}"
-        desc "Build #{package.label} and install it into #{dist_dir}."
-        task package.name => [
-          "#{prefix}:before",
-          "#{prefix}:build",
-          "#{prefix}:after",
-        ]
-      end
-    end
-  end
-
-  def build_package_task_body(package)
-    package_tmp_dir = @package.tmp_dir + "windows" + package.name
-    rm_rf(package_tmp_dir)
-    mkdir_p(package_tmp_dir)
-
-    tar_full_path = @package.download_dir + package.archive_base_name
-    Dir.chdir(package_tmp_dir.to_s) do
-      sh("tar", "xf", tar_full_path.to_s)
-    end
-
-    package_dir_path =
-      package_tmp_dir + package.base_name + package.base_dir_in_package
-    Dir.chdir(package_dir_path.to_s) do
-      package.windows.patches.each do |patch|
-        sh("patch -p1 < #{@package.patches_dir}/#{patch}")
-      end
-      if File.exist?("configure")
-        configure(package)
-      else
-        cmake(package)
-      end
-      common_make_args = []
-      common_make_args << "MAKE=make"
-      common_make_args << "GLIB_COMPILE_SCHEMAS=glib-compile-schemas"
-      if package.windows.use_cc_environment_variable?
-        common_make_args << cc_env(package)
-      end
-      add_gobject_introspection_make_args(package, common_make_args)
-      build_make_args = common_make_args.dup
-      install_make_args = common_make_args.dup
-      if package.windows.build_concurrently?
-        make_n_jobs = ENV["MAKE_N_JOBS"]
-        build_make_args << "-j#{make_n_jobs}" if make_n_jobs
-      end
-      ENV["GREP_OPTIONS"] = "--text"
-      # ENV["GI_SCANNER_DEBUG"] = "save-temps"
-      # build_make_args << "--debug"
-      # build_make_args << "V=1"
-      sh("nice", "make", *build_make_args) or exit(false)
-      sh("make", "install", *install_make_args) or exit(false)
-
-      package_license_dir = license_dir + package.name
-      mkdir_p(package_license_dir)
-      package_license_files = ["AUTHORS", "COPYING", "COPYING.LIB"]
-      package_license_files = package_license_files.reject do |file|
-        not File.exist?(file)
-      end
-      cp(package_license_files, package_license_dir)
-      bundled_packages = package.bundled_packages
-      bundled_packages.each do |bundled_package|
-        bundled_package_license_dir = license_dir + bundled_package[:name]
-        mkdir_p(bundled_package_license_dir)
-        license_files = bundled_package[:license_files].collect do |file|
-          File.join(bundled_package[:path], file)
-        end
-        cp(license_files, bundled_package_license_dir)
-      end
-    end
-  end
-
-  def configure(package)
-    sh("./autogen.sh") if package.windows.need_autogen?
-    sh("autoreconf", "--install", "--force") if package.windows.need_autoreconf?
-    sh("./configure",
-       cc_env(package),
-       dlltool_env,
-       "CPPFLAGS=#{cppflags(package)}",
-       "LDFLAGS=#{ldflags(package)}",
-       "--prefix=#{dist_dir}",
-       "--host=#{@package.windows.build_host}",
-       *package.windows.configure_args) or exit(false)
-  end
-
-  def cmake(package)
-    sh("cmake",
-       ".",
-       "-DCMAKE_INSTALL_PREFIX=#{dist_dir}",
-       "-DCMAKE_SYSTEM_NAME=Windows",
-       "-DCMAKE_SYSTEM_PROCESSOR=#{@package.windows.build_architecture}",
-       "-DCMAKE_C_COMPILER=#{cc(package)}",
-       "-DCMAKE_CXX_COMPILER=#{cxx(package)}",
-       *package.windows.cmake_args) or exit(false)
-  end
-
-  def cc_env(package)
-    "CC=#{cc(package)}"
-  end
-
-  def dlltool_env
-    "DLLTOOL=#{dlltool}"
-  end
-
-  def build_packages
-    packages = @package.external_packages.select do |package|
-      package.windows.build?
-    end
-    # For backward compatibility
-    packages + @package.windows.build_packages
-  end
-
-  def dist_dir
-    @package.windows.absolute_binary_dir
-  end
-
-  def license_dir
-    dist_dir + "share" + "license"
-  end
-
-  def glib2_binary_base_dir
-    @package.glib2_root_dir + "vendor" + "local"
-  end
-
-  def glib2_include_path
-    "#{glib2_binary_base_dir}/include"
-  end
-
-  def glib2_lib_path
-    "#{glib2_binary_base_dir}/lib"
-  end
-
-  def rcairo_windows_dir
-    suffix = @package.windows.build_architecture_suffix
-    @package.project_root_dir.parent + "rcairo.#{suffix}"
-  end
-
-  def rcairo_windows_binary_base_dir
-    rcairo_windows_dir + "vendor" + "local"
-  end
-
-  def rcairo_windows_pkgconfig_path
-    "#{rcairo_windows_binary_base_dir}/lib/pkgconfig"
-  end
-
-  def rcairo_windows_include_path
-    "#{rcairo_windows_binary_base_dir}/include"
-  end
-
-  def rcairo_windows_lib_path
-    "#{rcairo_windows_binary_base_dir}/lib"
-  end
-
-  def cc(package)
-    cc_command_line = [
-      "#{@package.windows.build_host}-gcc",
-      *package.windows.cc_args,
-    ]
-    cc_command_line.compact.join(" ")
-  end
-
-  def cxx(package)
-    cxx_command_line = [
-      "#{@package.windows.build_host}-g++",
-    ]
-    cxx_command_line.compact.join(" ")
-  end
-
-  def dlltool
-    "#{@package.windows.build_host}-dlltool"
-  end
-
-  def cppflags(package)
-    include_paths = package.windows.include_paths
-    if @package.windows.build_dependencies.include?("glib2")
-      include_paths += [glib2_include_path]
-    end
-    include_paths += [
-      rcairo_windows_include_path,
-      dist_dir + 'include',
-    ]
-    cppflags = include_paths.collect do |path|
-      "-I#{path}"
-    end
-    cppflags.join(" ")
-  end
-
-  def ldflags(package)
-    library_paths = package.windows.library_paths
-    if @package.windows.build_dependencies.include?("glib2")
-      library_paths += [glib2_lib_path]
-    end
-    library_paths += [
-      rcairo_windows_lib_path,
-      dist_dir + 'lib',
-    ]
-    ldflags = library_paths.collect do |path|
-      "-L#{path}"
-    end
-    ldflags.join(" ")
-  end
-
-  def cmake_root_paths
-    paths = [
-      "/usr/#{@package.windows.build_host}",
-      rcairo_windows_binary_base_dir.to_path,
-    ]
-    @package.windows.build_dependencies.each do |package|
-      paths << "#{@package.project_root_dir}/#{package}/vendor/local"
-    end
-    paths
-  end
-
-  def add_gobject_introspection_make_args(package, common_make_args)
-    unless @package.windows.build_dependencies.include?("gobject-introspection")
-      return
-    end
-
-    g_ir_scanner = "#{@package.project_root_dir}/gobject-introspection/"
-    g_ir_scanner << "#{@package.native.relative_binary_dir}/bin/g-ir-scanner"
-    introspection_scanner = "INTROSPECTION_SCANNER=#{g_ir_scanner}"
-    common_make_args << introspection_scanner
-
-
-    dependencies = [
-      "gobject-introspection",
-      @package.name,
-    ]
-    dependencies += @package.windows.gobject_introspection_dependencies
-
-    compute_base_dir = lambda do |dependent_package|
-      "#{@package.project_root_dir}/#{dependent_package}/vendor/local"
-    end
-
-    gi_base_dir = compute_base_dir.call("gobject-introspection")
-    introspection_compiler = "INTROSPECTION_COMPILER="
-    introspection_compiler << "#{gi_base_dir}/bin/g-ir-compiler.exe"
-    introspection_compiler_args = ""
-    dependencies.each do |dependent_package|
-      gir_dir = "#{compute_base_dir.call(dependent_package)}/share/gir-1.0"
-      introspection_compiler_args << " --includedir=#{gir_dir}"
-    end
-    if package.windows.gobject_introspection_compiler_split_args?
-      common_make_args << introspection_compiler
-      common_make_args <<
-        "INTROSPECTION_COMPILER_ARGS=#{introspection_compiler_args}"
-      common_make_args <<
-        "INTROSPECTION_COMPILER_OPTS=#{introspection_compiler_args}"
-    else
-      introspection_compiler << " #{introspection_compiler_args}"
-      common_make_args << introspection_compiler
-    end
-
-    common_make_args << dlltool_env
-
-    data_dirs = dependencies.collect do |dependent_package|
-      "#{compute_base_dir.call(dependent_package)}/share"
-    end
-    common_make_args << "XDG_DATA_DIRS=#{data_dirs.join(File::PATH_SEPARATOR)}"
-  end
-end
+module GNOME2
+  module Rake
+    class WindowsBinaryBuildTask
+      include ::Rake::DSL
+
+       def initialize(package)
+         @package = package
+       end
+
+       def define
+         namespace :windows do
+           namespace :builder do
+             task :before
+             define_build_tasks
+             build_tasks = build_packages.collect do |package|
+               "windows:builder:build:#{package.name}"
+             end
+             task :build => build_tasks
+             task :after
+           end
+           desc "Build Windows binaries"
+           task :build => ["windows:builder:before",
+                           "windows:builder:build",
+                           "windows:builder:after"]
+         end
+       end
+
+       def rcairo_windows_binary_base_dir
+         rcairo_windows_dir + "vendor" + "local"
+       end
+
+       private
+       def define_build_tasks
+         namespace :build do
+           prepare_task_names = []
+           namespace :prepare do
+             prepare_task_names << "pkg_config"
+             task :pkg_config do
+               depended_packages = @package.windows.build_dependencies
+               use_packages = [@package.name] + depended_packages
+               pkg_config_path = use_packages.collect do |package|
+                 "../#{package}/#{@package.windows.relative_binary_dir}/lib/pkgconfig"
+               end
+               ENV["PKG_CONFIG_PATH"] = pkg_config_path.collect do |path|
+                 File.expand_path(path)
+               end.join(":")
+               ENV["PKG_CONFIG_LIBDIR"] = rcairo_windows_pkgconfig_path
+             end
+
+             prepare_task_names << "pkg_config_for_build"
+             task :pkg_config_for_build do
+               # XXX: Is it needless?
+               # ENV["PKG_CONFIG_FOR_BUILD"] = "env - pkg-config"
+             end
+           end
+
+           full_prepare_task_names = prepare_task_names.collect do |name|
+             "windows:builder:build:prepare:#{name}"
+           end
+           task :prepare => full_prepare_task_names
+
+           build_packages.each do |package|
+             namespace package.name do
+               task :before
+               download_task = "source:downloader:download:#{package.name}"
+               built_file = package.windows.built_file
+               if built_file
+                 built_file = dist_dir + built_file
+                 file built_file.to_s do
+                   ::Rake::Task["windows:builder:build:prepare"].invoke
+                   ::Rake::Task[download_task].invoke
+                   build_package_task_body(package)
+                 end
+                 task :build => built_file.to_s
+               else
+                 task :build => [:prepare, download_task] do
+                   build_package_task_body(package)
+                 end
+               end
+               task :after
+             end
+
+             prefix = "windows:builder:build:#{package.name}"
+             desc "Build #{package.label} and install it into #{dist_dir}."
+             task package.name => [
+               "#{prefix}:before",
+               "#{prefix}:build",
+               "#{prefix}:after",
+             ]
+           end
+         end
+       end
+
+       def build_package_task_body(package)
+         package_tmp_dir = @package.tmp_dir + "windows" + package.name
+         rm_rf(package_tmp_dir)
+         mkdir_p(package_tmp_dir)
+
+         tar_full_path = @package.download_dir + package.archive_base_name
+         Dir.chdir(package_tmp_dir.to_s) do
+           sh("tar", "xf", tar_full_path.to_s)
+         end
+
+         package_dir_path =
+           package_tmp_dir + package.base_name + package.base_dir_in_package
+         Dir.chdir(package_dir_path.to_s) do
+           package.windows.patches.each do |patch|
+             sh("patch -p1 < #{@package.patches_dir}/#{patch}")
+           end
+           if File.exist?("configure")
+             configure(package)
+           else
+             cmake(package)
+           end
+           common_make_args = []
+           common_make_args << "MAKE=make"
+           common_make_args << "GLIB_COMPILE_SCHEMAS=glib-compile-schemas"
+           if package.windows.use_cc_environment_variable?
+             common_make_args << cc_env(package)
+           end
+           add_gobject_introspection_make_args(package, common_make_args)
+           build_make_args = common_make_args.dup
+           install_make_args = common_make_args.dup
+           if package.windows.build_concurrently?
+             make_n_jobs = ENV["MAKE_N_JOBS"]
+             build_make_args << "-j#{make_n_jobs}" if make_n_jobs
+           end
+           ENV["GREP_OPTIONS"] = "--text"
+           # ENV["GI_SCANNER_DEBUG"] = "save-temps"
+           # build_make_args << "--debug"
+           # build_make_args << "V=1"
+           sh("nice", "make", *build_make_args) or exit(false)
+           sh("make", "install", *install_make_args) or exit(false)
+
+           package_license_dir = license_dir + package.name
+           mkdir_p(package_license_dir)
+           package_license_files = ["AUTHORS", "COPYING", "COPYING.LIB"]
+           package_license_files = package_license_files.reject do |file|
+             not File.exist?(file)
+           end
+           cp(package_license_files, package_license_dir)
+           bundled_packages = package.bundled_packages
+           bundled_packages.each do |bundled_package|
+             bundled_package_license_dir = license_dir + bundled_package[:name]
+             mkdir_p(bundled_package_license_dir)
+             license_files = bundled_package[:license_files].collect do |file|
+               File.join(bundled_package[:path], file)
+             end
+             cp(license_files, bundled_package_license_dir)
+           end
+         end
+       end
+
+       def configure(package)
+         sh("./autogen.sh") if package.windows.need_autogen?
+         sh("autoreconf", "--install", "--force") if package.windows.need_autoreconf?
+         sh("./configure",
+            cc_env(package),
+            dlltool_env,
+            "CPPFLAGS=#{cppflags(package)}",
+            "LDFLAGS=#{ldflags(package)}",
+            "--prefix=#{dist_dir}",
+            "--host=#{@package.windows.build_host}",
+            *package.windows.configure_args) or exit(false)
+       end
+
+       def cmake(package)
+         sh("cmake",
+            ".",
+            "-DCMAKE_INSTALL_PREFIX=#{dist_dir}",
+            "-DCMAKE_SYSTEM_NAME=Windows",
+            "-DCMAKE_SYSTEM_PROCESSOR=#{@package.windows.build_architecture}",
+            "-DCMAKE_C_COMPILER=#{cc(package)}",
+            "-DCMAKE_CXX_COMPILER=#{cxx(package)}",
+            *package.windows.cmake_args) or exit(false)
+       end
+
+       def cc_env(package)
+         "CC=#{cc(package)}"
+       end
+
+       def dlltool_env
+         "DLLTOOL=#{dlltool}"
+       end
+
+       def build_packages
+         packages = @package.external_packages.select do |package|
+           package.windows.build?
+         end
+         # For backward compatibility
+         packages + @package.windows.build_packages
+       end
+
+       def dist_dir
+         @package.windows.absolute_binary_dir
+       end
+
+       def license_dir
+         dist_dir + "share" + "license"
+       end
+
+       def glib2_binary_base_dir
+         @package.glib2_root_dir + "vendor" + "local"
+       end
+
+       def glib2_include_path
+         "#{glib2_binary_base_dir}/include"
+       end
+
+       def glib2_lib_path
+         "#{glib2_binary_base_dir}/lib"
+       end
+
+       def rcairo_windows_dir
+         suffix = @package.windows.build_architecture_suffix
+         @package.project_root_dir.parent + "rcairo.#{suffix}"
+       end
+
+       def rcairo_windows_pkgconfig_path
+         "#{rcairo_windows_binary_base_dir}/lib/pkgconfig"
+       end
+
+       def rcairo_windows_include_path
+         "#{rcairo_windows_binary_base_dir}/include"
+       end
+
+       def rcairo_windows_lib_path
+         "#{rcairo_windows_binary_base_dir}/lib"
+       end
+
+       def cc(package)
+         cc_command_line = [
+           "#{@package.windows.build_host}-gcc",
+           *package.windows.cc_args,
+         ]
+         cc_command_line.compact.join(" ")
+       end
+
+       def cxx(package)
+         cxx_command_line = [
+           "#{@package.windows.build_host}-g++",
+         ]
+         cxx_command_line.compact.join(" ")
+       end
+
+       def dlltool
+         "#{@package.windows.build_host}-dlltool"
+       end
+
+       def cppflags(package)
+         include_paths = package.windows.include_paths
+         if @package.windows.build_dependencies.include?("glib2")
+           include_paths += [glib2_include_path]
+         end
+         include_paths += [
+           rcairo_windows_include_path,
+           dist_dir + 'include',
+         ]
+         cppflags = include_paths.collect do |path|
+           "-I#{path}"
+         end
+         cppflags.join(" ")
+       end
+
+       def ldflags(package)
+         library_paths = package.windows.library_paths
+         if @package.windows.build_dependencies.include?("glib2")
+           library_paths += [glib2_lib_path]
+         end
+         library_paths += [
+           rcairo_windows_lib_path,
+           dist_dir + 'lib',
+         ]
+         ldflags = library_paths.collect do |path|
+           "-L#{path}"
+         end
+         ldflags.join(" ")
+       end
+
+       def cmake_root_paths
+         paths = [
+           "/usr/#{@package.windows.build_host}",
+           rcairo_windows_binary_base_dir.to_path,
+         ]
+         @package.windows.build_dependencies.each do |package|
+           paths << "#{@package.project_root_dir}/#{package}/vendor/local"
+         end
+         paths
+       end
+
+       def add_gobject_introspection_make_args(package, common_make_args)
+         return unless use_gobject_introspection?(package)
+
+         g_ir_scanner = "#{@package.project_root_dir}/gobject-introspection/"
+         g_ir_scanner << "#{@package.native.relative_binary_dir}/bin/g-ir-scanner"
+         introspection_scanner = "INTROSPECTION_SCANNER=#{g_ir_scanner}"
+         common_make_args << introspection_scanner
+
+
+         dependencies = [
+           "gobject-introspection",
+           @package.name,
+         ]
+         dependencies += @package.windows.gobject_introspection_dependencies
+
+         compute_base_dir = lambda do |dependent_package|
+           "#{@package.project_root_dir}/#{dependent_package}/vendor/local"
+         end
+
+         gi_base_dir = compute_base_dir.call("gobject-introspection")
+         introspection_compiler = "INTROSPECTION_COMPILER="
+         introspection_compiler << "#{gi_base_dir}/bin/g-ir-compiler.exe"
+         introspection_compiler_args = ""
+         dependencies.each do |dependent_package|
+           gir_dir = "#{compute_base_dir.call(dependent_package)}/share/gir-1.0"
+           introspection_compiler_args << " --includedir=#{gir_dir}"
+         end
+         if package.windows.gobject_introspection_compiler_split_args?
+           common_make_args << introspection_compiler
+           common_make_args <<
+             "INTROSPECTION_COMPILER_ARGS=#{introspection_compiler_args}"
+           common_make_args <<
+             "INTROSPECTION_COMPILER_OPTS=#{introspection_compiler_args}"
+         else
+           introspection_compiler << " #{introspection_compiler_args}"
+           common_make_args << introspection_compiler
+         end
+
+         common_make_args << dlltool_env
+
+         data_dirs = dependencies.collect do |dependent_package|
+           "#{compute_base_dir.call(dependent_package)}/share"
+         end
+         common_make_args << "XDG_DATA_DIRS=#{data_dirs.join(File::PATH_SEPARATOR)}"
+       end
+
+       def use_gobject_introspection?(package)
+         return false unless package.windows.use_gobject_introspection?
+         @package.windows.build_dependencies.include?("gobject-introspection")
+       end
+     end
+   end
+ end
diff --git a/glib2/lib/gnome2/rake/windows-binary-download-task.rb b/glib2/lib/gnome2/rake/windows-binary-download-task.rb
index 4d1fbd1..418bb5f 100644
--- a/glib2/lib/gnome2/rake/windows-binary-download-task.rb
+++ b/glib2/lib/gnome2/rake/windows-binary-download-task.rb
@@ -6,174 +6,177 @@ require 'open-uri'
 require 'rubygems'
 require 'mechanize'
 
-class GNOME2WindowsBinaryDownloadTask
-  include Rake::DSL
-
-  URL_BASE = "http://ftp.gnome.org/pub/gnome/binaries"
-  def initialize(package)
-    @package = package
-    define
-  end
+module GNOME2
+  module Rake
+    class WindowsBinaryDownloadTask
+      include ::Rake::DSL
+
+      URL_BASE = "http://ftp.gnome.org/pub/gnome/binaries"
+      def initialize(package)
+        @package = package
+      end
 
-  private
-  def define
-    namespace :windows do
-      namespace :downloader do
-        task :before
-
-        download_tasks = []
-        namespace :download do
-          directory dist_dir.to_s
-          task :prepare => [dist_dir.to_s]
-
-          packages.each do |package|
-            desc "download #{package}"
-            task package => [:prepare] do
-              download_package(package)
+      def define
+        namespace :windows do
+          namespace :downloader do
+            task :before
+
+            download_tasks = []
+            namespace :download do
+              directory dist_dir.to_s
+              task :prepare => [dist_dir.to_s]
+
+              packages.each do |package|
+                desc "download #{package}"
+                task package => [:prepare] do
+                  download_package(package)
+                end
+                download_tasks << package
+              end
+
+              dependencies.each do |dependency|
+                name, version = dependency
+                desc "download #{name}"
+                task name => [:prepare] do
+                  download_dependency(dependency)
+                end
+                download_tasks << name
+              end
             end
-            download_tasks << package
-          end
 
-          dependencies.each do |dependency|
-            name, version = dependency
-            desc "download #{name}"
-            task name => [:prepare] do
-              download_dependency(dependency)
+            download_tasks = download_tasks.collect do |task|
+              "windows:downloader:download:#{task}"
             end
-            download_tasks << name
-          end
-        end
+            desc "download Windows binaries into #{dist_dir}"
+            task :download => download_tasks
 
-        download_tasks = download_tasks.collect do |task|
-          "windows:downloader:download:#{task}"
+            task :after
+          end
+          desc "download Windows binaries"
+          task :download => ["windows:downloader:before",
+                             "windows:downloader:download",
+                             "windows:downloader:after"]
         end
-        desc "download Windows binaries into #{dist_dir}"
-        task :download => download_tasks
+      end
 
-        task :after
+      private
+      def dist_dir
+        @package.windows.absolute_binary_dir
       end
-      desc "download Windows binaries"
-      task :download => ["windows:downloader:before",
-                         "windows:downloader:download",
-                         "windows:downloader:after"]
-    end
-  end
 
-  def dist_dir
-    @package.windows.absolute_binary_dir
-  end
+      def packages
+        @package.windows.packages
+      end
 
-  def packages
-    @package.windows.packages
-  end
+      def dependencies
+        @package.windows.dependencies
+      end
 
-  def dependencies
-    @package.windows.dependencies
-  end
+      def build_architecture_suffix
+        @package.windows.build_architecture_suffix
+      end
 
-  def build_architecture_suffix
-    @package.windows.build_architecture_suffix
-  end
+      def download_package(package)
+        suffix = build_architecture_suffix
+        version_page_url = "#{URL_BASE}/#{suffix}/#{package}"
+        version_page = agent.get(version_page_url)
+        latest_version_link = version_page.links.sort_by do |link|
+          if /\A(\d+\.\d+)\/\z/ =~ link.href
+            $1.split(/\./).collect {|component| component.to_i}
+          else
+            [-1]
+          end
+        end.last
+
+        escaped_package = Regexp.escape(package)
+        latest_version_page = latest_version_link.click
+        latest_version = latest_version_page.links.collect do |link|
+          case link.href
+          when /#{escaped_package}_([\d\.\-]+)_#{suffix}\.zip\z/,
+               /#{escaped_package}-([\d\.\-]+)-#{suffix}\.zip\z/, # old
+               /#{escaped_package}-([\d\.\-]+)\.zip\z/ # old
+            version = $1
+            normalized_version = version.split(/[\.\-]/).collect do |component|
+              component.to_i
+            end
+            [normalized_version, version]
+          else
+            [[-1], nil]
+          end
+        end.sort_by do |normalized_version, version|
+          normalized_version
+        end.last[1]
 
-  def download_package(package)
-    suffix = build_architecture_suffix
-    version_page_url = "#{URL_BASE}/#{suffix}/#{package}"
-    version_page = agent.get(version_page_url)
-    latest_version_link = version_page.links.sort_by do |link|
-      if /\A(\d+\.\d+)\/\z/ =~ link.href
-        $1.split(/\./).collect {|component| component.to_i}
-      else
-        [-1]
-      end
-    end.last
-
-    escaped_package = Regexp.escape(package)
-    latest_version_page = latest_version_link.click
-    latest_version = latest_version_page.links.collect do |link|
-      case link.href
-      when /#{escaped_package}_([\d\.\-]+)_#{suffix}\.zip\z/,
-           /#{escaped_package}-([\d\.\-]+)-#{suffix}\.zip\z/, # old
-           /#{escaped_package}-([\d\.\-]+)\.zip\z/ # old
-        version = $1
-        normalized_version = version.split(/[\.\-]/).collect do |component|
-          component.to_i
+        if latest_version.nil?
+          raise "can't find package: <#{package}>:<#{version_page_url}>"
+        end
+        escaped_latest_version = Regexp.escape(latest_version)
+        latest_version_page.links.each do |link|
+          case link.href
+          when /#{escaped_package}(?:-dev)?_#{escaped_latest_version}_#{suffix}\.zip\z/,
+               /#{escaped_package}(?:-dev)?-#{escaped_latest_version}-#{suffix}\.zip\z/, # old
+               /#{escaped_package}(?:-dev)?-#{escaped_latest_version}\.zip\z/ # old
+            click_zip_link(link)
+          end
         end
-        [normalized_version, version]
-      else
-        [[-1], nil]
       end
-    end.sort_by do |normalized_version, version|
-      normalized_version
-    end.last[1]
 
-    if latest_version.nil?
-      raise "can't find package: <#{package}>:<#{version_page_url}>"
-    end
-    escaped_latest_version = Regexp.escape(latest_version)
-    latest_version_page.links.each do |link|
-      case link.href
-      when /#{escaped_package}(?:-dev)?_#{escaped_latest_version}_#{suffix}\.zip\z/,
-           /#{escaped_package}(?:-dev)?-#{escaped_latest_version}-#{suffix}\.zip\z/, # old
-           /#{escaped_package}(?:-dev)?-#{escaped_latest_version}\.zip\z/ # old
-        click_zip_link(link)
+      def download_dependency(dependency)
+        suffix = build_architecture_suffix
+        dependency_version = "any"
+        dependency_version_re = /[\d\.\-]+/
+        if dependency.is_a?(Array)
+          dependency, dependency_version = dependency
+          dependency_version_re = /#{Regexp.escape(dependency_version)}/
+        end
+        escaped_dependency = Regexp.escape(dependency)
+        dependencies_url = "#{URL_BASE}/dependencies"
+        dependencies_page = agent.get(dependencies_url)
+        latest_version = dependencies_page.links.collect do |link|
+          case link.href
+          when /\A#{escaped_dependency}_(#{dependency_version_re})_#{suffix}\.zip\z/
+            version = $1
+            [version.split(/[\.\-]/).collect {|component| component.to_i}, version]
+          else
+            [[-1], nil]
+          end
+        end.sort_by do |normalized_version, version|
+          normalized_version
+        end.last[1]
+
+        if latest_version.nil?
+          message = "can't find dependency package: " +
+            "<#{dependency}>(#{dependency_version}):<#{dependencies_url}>"
+          raise message
+        end
+        escaped_latest_version = Regexp.escape(latest_version)
+        dependencies_page.links.each do |link|
+          case link.href
+          when /\A#{escaped_dependency}(?:-dev)?_#{escaped_latest_version}_#{suffix}\.zip\z/
+            click_zip_link(link)
+          end
+        end
       end
-    end
-  end
 
-  def download_dependency(dependency)
-    suffix = build_architecture_suffix
-    dependency_version = "any"
-    dependency_version_re = /[\d\.\-]+/
-    if dependency.is_a?(Array)
-      dependency, dependency_version = dependency
-      dependency_version_re = /#{Regexp.escape(dependency_version)}/
-    end
-    escaped_dependency = Regexp.escape(dependency)
-    dependencies_url = "#{URL_BASE}/dependencies"
-    dependencies_page = agent.get(dependencies_url)
-    latest_version = dependencies_page.links.collect do |link|
-      case link.href
-      when /\A#{escaped_dependency}_(#{dependency_version_re})_#{suffix}\.zip\z/
-        version = $1
-        [version.split(/[\.\-]/).collect {|component| component.to_i}, version]
-      else
-        [[-1], nil]
+      private
+      def agent
+        @agent ||= Mechanize.new
       end
-    end.sort_by do |normalized_version, version|
-      normalized_version
-    end.last[1]
-
-    if latest_version.nil?
-      message = "can't find dependency package: " +
-        "<#{dependency}>(#{dependency_version}):<#{dependencies_url}>"
-      raise message
-    end
-    escaped_latest_version = Regexp.escape(latest_version)
-    dependencies_page.links.each do |link|
-      case link.href
-      when /\A#{escaped_dependency}(?:-dev)?_#{escaped_latest_version}_#{suffix}\.zip\z/
-        click_zip_link(link)
-      end
-    end
-  end
-
-  private
-  def agent
-    @agent ||= Mechanize.new
-  end
 
-  def click_zip_link(link)
-    zip = link.click
-    Dir.chdir(dist_dir) do
-      open(zip.filename, "wb") do |file|
-        file.print(zip.body)
-      end
-      system("unzip", "-o", zip.filename)
-      Dir.glob("lib/pkgconfig/*.pc") do |pc_path|
-        pc = File.read(pc_path)
-        pc = pc.gsub(/\Aprefix=.+$/) {"prefix=#{dist_dir}"}
-        File.open(pc_path, "w") do |pc_file|
-          pc_file.print(pc)
+      def click_zip_link(link)
+        zip = link.click
+        Dir.chdir(dist_dir) do
+          open(zip.filename, "wb") do |file|
+            file.print(zip.body)
+          end
+          system("unzip", "-o", zip.filename)
+          Dir.glob("lib/pkgconfig/*.pc") do |pc_path|
+            pc = File.read(pc_path)
+            pc = pc.gsub(/\Aprefix=.+$/) {"prefix=#{dist_dir}"}
+            File.open(pc_path, "w") do |pc_file|
+              pc_file.print(pc)
+            end
+          end
         end
       end
     end
diff --git a/glib2/lib/mkmf-gnome2.rb b/glib2/lib/mkmf-gnome2.rb
index eab9b62..5091190 100644
--- a/glib2/lib/mkmf-gnome2.rb
+++ b/glib2/lib/mkmf-gnome2.rb
@@ -151,8 +151,16 @@ def find_gem_spec(package)
   end
 end
 
+def setup_homebrew_libffi
+  return unless package_platform == :homebrew
+
+  PKGConfig.add_path("/usr/local/opt/libffi/lib/pkgconfig")
+end
+
 #add_depend_package("glib2", "ext/glib2", "/...../ruby-gnome2")
 def add_depend_package(target_name, target_srcdir, top_srcdir, options={})
+  setup_homebrew_libffi if target_name == "gobject-introspection"
+
   gem_spec = find_gem_spec(target_name)
   if gem_spec
     target_source_dir = File.join(gem_spec.full_gem_path, "ext/#{target_name}")
@@ -410,34 +418,6 @@ def make_version_header(app_name, pkgname, dir = "src")
       out.close
 end
 
-def check_ruby_func
-  #Other options
-  ruby_header = "ruby.h"
-  have_func("rb_define_alloc_func", ruby_header) # for ruby-1.8
-  have_func("rb_block_proc", ruby_header) # for ruby-1.8
-
-  STDOUT.print("checking for new allocation framework... ") # for ruby-1.7
-  if Object.respond_to? :allocate
-    STDOUT.print "yes\n"
-    $defs << "-DHAVE_OBJECT_ALLOCATE"
-  else
-    STDOUT.print "no\n"
-  end
-
-  STDOUT.print("checking for attribute assignment... ") # for ruby-1.7
-  STDOUT.flush
-  if defined? try_compile and try_compile <<SRC
-#include "ruby.h"
-#include "node.h"
-int node_attrasgn = (int)NODE_ATTRASGN;
-SRC
-    STDOUT.print "yes\n"
-    $defs << "-DHAVE_NODE_ATTRASGN"
-  else
-    STDOUT.print "no\n"
-  end
-end
-
 def add_obj(name)
   ensure_objs
   $objs << name unless $objs.index(name)
@@ -617,6 +597,9 @@ def required_pkg_config_package(package_info, native_package_info=nil)
   else
     required_package_info = [package_info]
   end
+  if required_package_info.include?("gobject-introspection-1.0")
+    setup_homebrew_libffi
+  end
   return true if PKGConfig.have_package(*required_package_info)
 
   native_package_info ||= {}
@@ -635,8 +618,6 @@ end
 add_include_path.call("sitearchdir")
 add_include_path.call("vendorarchdir")
 
-check_ruby_func
-
 if /mingw/ =~ RUBY_PLATFORM
   $ruby.gsub!('\\', '/')
 end
diff --git a/glib2/test/test-binding.rb b/glib2/test/test-binding.rb
index 60b9edc..6cbc93f 100644
--- a/glib2/test/test-binding.rb
+++ b/glib2/test/test-binding.rb
@@ -16,82 +16,173 @@
 
 class TestGLibBinding < Test::Unit::TestCase
   include GLibTestUtils
+  sub_test_case "bind_property" do
+    class DataObjectDefault < GLib::Object
+      type_register
 
-  class DataObject < GLib::Object
-    type_register
-
-    install_property(GLib::Param::Int.new("source", # name
-                                          "Source", # nick
-                                          "The source data", # blurb
-                                          0,     # min
-                                          100,   # max
-                                          0,     # default
-                                          GLib::Param::READABLE |
-                                          GLib::Param::WRITABLE))
-    install_property(GLib::Param::Int.new("target", # name
-                                          "Target", # nick
-                                          "The target data", # blurb
-                                          0,     # min
-                                          100,   # max
-                                          0,     # default
-                                          GLib::Param::READABLE |
-                                          GLib::Param::WRITABLE))
-
-    attr_reader :source, :target
-    def initialize
-      @source = 0
-      @target = 0
-      super
-    end
-
-    def source=(value)
-      @source = value
-      notify("source")
-    end
-
-    def target=(value)
-      @target = value
-      notify("target")
+      install_property(GLib::Param::Int.new("source", # name
+                                            "Source", # nick
+                                            "The source data", # blurb
+                                            0,     # min
+                                            100,   # max
+                                            0,     # default
+                                            GLib::Param::READABLE |
+                                            GLib::Param::WRITABLE))
+      install_property(GLib::Param::Int.new("target", # name
+                                            "Target", # nick
+                                            "The target data", # blurb
+                                            0,     # min
+                                            100,   # max
+                                            0,     # default
+                                            GLib::Param::READABLE |
+                                            GLib::Param::WRITABLE))
+
+      attr_reader :source, :target
+      def initialize
+        @source = 0
+        @target = 0
+        super
+      end
+
+      def source=(value)
+        @source = value
+        notify("source")
+      end
+
+      def target=(value)
+        @target = value
+        notify("target")
+      end
     end
-  end
 
-  setup do
-    only_glib_version(2, 26, 0)
-  end
+    setup do
+      only_glib_version(2, 26, 0)
+    end
 
-  setup do
-    @source = DataObject.new
-    @target = DataObject.new
-    @binding = @source.bind_property("source", @target, "target", :default)
-  end
+    setup do
+      @source = DataObjectDefault.new
+      @target = DataObjectDefault.new
+      @binding = @source.bind_property("source", @target, "target", :default)
+    end
 
-  test "#source" do
-    assert_equal(@source, @binding.source)
-  end
+    test "#source" do
+      assert_equal(@source, @binding.source)
+    end
 
-  test "#source_property" do
-    assert_equal("source", @binding.source_property)
-  end
+    test "#source_property" do
+      assert_equal("source", @binding.source_property)
+    end
 
-  test "#target" do
-    assert_equal(@target, @binding.target)
-  end
+    test "#target" do
+      assert_equal(@target, @binding.target)
+    end
 
-  test "#target_property" do
-    assert_equal("target", @binding.target_property)
-  end
+    test "#target_property" do
+      assert_equal("target", @binding.target_property)
+    end
 
-  test "#flags" do
-    assert_equal(GLib::BindingFlags::DEFAULT, @binding.flags)
+    test "#flags" do
+      assert_equal(GLib::BindingFlags::DEFAULT, @binding.flags)
+    end
+
+    test "#unbind" do
+      only_glib_version(2, 38, 0)
+      assert_equal(0, @target.target)
+      @source.source = 10
+      assert_equal(10, @target.target)
+      @binding.unbind
+      @source.source = 20
+      assert_equal(10, @target.target)
+    end
   end
+  sub_test_case "bind_property_full" do
+    class DataObjectBidir < GLib::Object
+      type_register
+
+      install_property(GLib::Param::Int.new("source", # name
+                                            "Source", # nick
+                                            "The source data", # blurb
+                                            0,     # min
+                                            100,   # max
+                                            0,     # default
+                                            GLib::Param::READABLE |
+                                            GLib::Param::WRITABLE))
+      install_property(GLib::Param::String.new("target", # name
+                                               "Target", # nick
+                                               "The target data", # blurb
+                                               "",     # default
+                                               GLib::Param::READABLE |
+                                               GLib::Param::WRITABLE))
+
+      attr_reader :source, :target
+      def initialize
+        @source = 0
+        @target = "nan"
+        super
+      end
 
-  test "#unbind" do
-    only_glib_version(2, 38, 0)
-    assert_equal(0, @target.target)
-    @source.source = 10
-    assert_equal(10, @target.target)
-    @binding.unbind
-    @source.source = 20
-    assert_equal(10, @target.target)
+      def source=(value)
+        @source = value
+        notify("source")
+      end
+
+      def target=(value)
+        @target = value
+        notify("target")
+      end
+    end
+
+    setup do
+      only_glib_version(2, 26, 0)
+    end
+
+    setup do
+      @source = DataObjectBidir.new
+      @target = DataObjectBidir.new
+      transform_to_callback = proc do |source_value|
+        source_value.to_s
+      end
+
+      transform_from_callback = proc do |target_value|
+        target_value.to_i
+      end
+
+      @binding = @source.bind_property("source", @target, "target",
+                                       :bidirectional,
+                                       :transform_to => transform_to_callback,
+                                       :transform_from => transform_from_callback)
+    end
+
+    test "#source" do
+      assert_equal(@source, @binding.source)
+    end
+
+    test "#source_property" do
+      assert_equal("source", @binding.source_property)
+    end
+
+    test "#target" do
+      assert_equal(@target, @binding.target)
+    end
+
+    test "#target_property" do
+      assert_equal("target", @binding.target_property)
+    end
+
+    test "#flags" do
+      assert_equal(GLib::BindingFlags::BIDIRECTIONAL, @binding.flags)
+    end
+
+    test "#unbind" do
+      only_glib_version(2, 38, 0)
+      assert_equal("nan", @target.target)
+      @source.source = 10
+      assert_equal("10", @target.target)
+      @target.target = "30"
+      assert_equal(30, @source.source)
+      @binding.unbind
+      @source.source = 20
+      assert_equal("30", @target.target)
+    end
   end
 end
diff --git a/glib2/test/test_glib2.rb b/glib2/test/test_glib2.rb
index 8ea0c80..a092e11 100755
--- a/glib2/test/test_glib2.rb
+++ b/glib2/test/test_glib2.rb
@@ -61,16 +61,31 @@ class TestGLib < Test::Unit::TestCase
     assert_equal(GLib.convert(utf8, "UTF-8", "UTF-8"), utf8)
     assert_equal(GLib.convert(utf8, "EUC-JP", "UTF-8"), euc)
     assert_equal(GLib.convert(utf8, "SHIFT_JIS", "UTF-8"), sjis)
+  end
+
+  def tet_locale_to_utf8
+    assert_equal(Encoding::UTF8,
+                 GLib.locale_to_utf8("ascii").encoding)
+  end
+
+  def tet_locale_from_utf8
+    assert_equal(Encoding::ASCII_8BIT,
+                 GLib.locale_from_utf8("ascii").encoding)
+  end
+
+  def tet_filename_to_utf8
+    assert_equal(Encoding::UTF8,
+                 GLib.filename_to_utf8("ascii.txt").encoding)
+  end
+
+  def tet_filename_from_utf8
+    assert_equal(Encoding::ASCII_8BIT,
+                 GLib.filename_from_utf8("ascii.txt").encoding)
+  end
 
-    # rb_define_module_function(mGLib, "locale_to_utf8", rbglib_m_locale_to_utf8, 1);
-    # rb_define_module_function(mGLib, "locale_from_utf8", rbglib_m_locale_from_utf8, 1);
-    # rb_define_module_function(mGLib, "filename_to_utf8", rbglib_m_filename_to_utf8, 1);
-    # rb_define_module_function(mGLib, "filename_from_utf8", rbglib_m_filename_from_utf8, 1);
-    # 
     # rb_define_module_function(mGLib, "filename_to_uri", rbglib_m_filename_to_uri, -1);
     # rb_define_module_function(mGLib, "filename_from_uri", rbglib_m_filename_from_uri, 1);
 
-  end
 
   def test_messages
     #rb_define_module_function(mGLog, "set_handler", rbglib_m_log_set_handler, 2);
diff --git a/gnumeric/COPYING.LIB b/gnumeric/COPYING.LIB
new file mode 100644
index 0000000..4362b49
--- /dev/null
+++ b/gnumeric/COPYING.LIB
@@ -0,0 +1,502 @@
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+

+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+

+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+

+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+

+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+

+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+

+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+

+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+

+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+

+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/gnumeric/README.md b/gnumeric/README.md
new file mode 100644
index 0000000..4ca9653
--- /dev/null
+++ b/gnumeric/README.md
@@ -0,0 +1,25 @@
+# Ruby/Gnumeric
+
+Ruby/Gnumeric is a Ruby binding of Gnumeric.
+
+## Requirements
+
+* Ruby/GOffice in
+  [Ruby-GNOME2](http://ruby-gnome2.sourceforge.jp/)
+* [Gnunmeric](http://www.gnumeric.org/)
+
+## Install
+
+    gem install gnumeric
+
+## License
+
+Copyright (c) 2016 Ruby-GNOME2 Project Team
+
+This program is free software. You can distribute/modify this program
+under the terms of the GNU LESSER GENERAL PUBLIC LICENSE Version 2.1.
+
+## Project Websites
+
+*   http://ruby-gnome2.sourceforge.jp/
+*   https://github.com/ruby-gnome2/ruby-gnome2
diff --git a/vte3/Rakefile b/gnumeric/Rakefile
similarity index 69%
copy from vte3/Rakefile
copy to gnumeric/Rakefile
index 03798d5..3d3eafc 100644
--- a/vte3/Rakefile
+++ b/gnumeric/Rakefile
@@ -1,6 +1,6 @@
 # -*- ruby -*-
 #
-# Copyright (C) 2011-2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -20,41 +20,30 @@ $LOAD_PATH.unshift("./../glib2/lib")
 require 'gnome2/rake/package-task'
 
 package_task = GNOME2::Rake::PackageTask.new do |package|
-  package.summary = "Ruby/VTE is a Ruby binding of VTE."
-  package.description = "Ruby/VTE is a Ruby binding of VTE."
-  package.dependency.gem.runtime = ["gtk3", "gobject-introspection"]
+  package.summary = "Ruby/Gnumeric is a Ruby binding of Gnumeric."
+  package.description = "Ruby/Gnumeric is a Ruby binding of Gnumeric."
+  package.dependency.gem.runtime = ["goffice", "gobject-introspection"]
   package.windows.packages = []
-  package.windows.dependencies = []
+  package.windows.dependencies = ["libxml2"]
   package.windows.build_dependencies = [
-    "glib2",
-    "gio2",
-    "atk",
-    "pango",
-    "gdk_pixbuf2",
-    "gdk3",
+    "goffice",
     "gobject-introspection",
   ]
   package.windows.gobject_introspection_dependencies = [
-    "gio2",
-    "atk",
-    "pango",
-    "gdk_pixbuf2",
-    "gdk3",
+    "gio2"
   ]
   package.external_packages = [
     {
-      :name => "vte",
+      :name => "gnumeric",
       :download_site => :gnome,
-      :label => "vte",
-      :version => "0.44.0",
+      :label => "gnumeric",
+      :version => "1.12.31",
       :compression_method => "xz",
       :windows => {
         :configure_args => [
-          "--disable-vala",
         ],
         :patches => [
-        ],
-        :need_autoreconf => true,
+        ]
       },
     },
   ]
diff --git a/vte3/lib/vte3.rb b/gnumeric/lib/gnm.rb
similarity index 84%
copy from vte3/lib/vte3.rb
copy to gnumeric/lib/gnm.rb
index bf72a0a..d39f7d3 100644
--- a/vte3/lib/vte3.rb
+++ b/gnumeric/lib/gnm.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2014  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -15,7 +15,7 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
 require "gobject-introspection"
-require "gtk3"
+require "goffice"
 
 base_dir = Pathname.new(__FILE__).dirname.dirname.expand_path
 vendor_dir = base_dir + "vendor" + "local"
@@ -24,10 +24,10 @@ GLib.prepend_dll_path(vendor_bin_dir)
 vendor_girepository_dir = vendor_dir + "lib" + "girepository-1.0"
 GObjectIntrospection.prepend_typelib_path(vendor_girepository_dir)
 
-require "vte3/loader"
+require "gnm/loader"
 
-module Vte
-  LOG_DOMAIN = "Vte"
+module Gnm
+  LOG_DOMAIN = "Gnumeric"
   GLib::Log.set_log_domain(LOG_DOMAIN)
 
   class Error < StandardError
@@ -48,9 +48,13 @@ module Vte
         remove_method(:init)
         remove_method(:const_missing)
       end
-      Gtk.init if Gtk.respond_to?(:init)
+      GOffice.init if GOffice.respond_to?(:init)
       loader = Loader.new(self)
-      loader.load("Vte")
+      loader.load("Gnm")
+      init
+      class << self
+        remove_method(:init)
+      end
     end
   end
 end
diff --git a/gnumeric/lib/gnm/loader.rb b/gnumeric/lib/gnm/loader.rb
new file mode 100644
index 0000000..9f58c88
--- /dev/null
+++ b/gnumeric/lib/gnm/loader.rb
@@ -0,0 +1,59 @@
+# Copyright (C) 2016 Ruby-GNOME2 Project Team
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+module Gnm
+  class Loader < GObjectIntrospection::Loader
+    private
+    def pre_load(repository, namespace)
+    end
+
+    def post_load(repository, namespace)
+      require_libraries
+    end
+
+    def require_libraries
+    end
+
+    def load_enum_value(value_info, enum_module)
+      name = case value_info.name.upcase
+      when /\A3D_NAME\z/
+        "NAME_3D"
+      else
+        value_info.name.upcase
+      end
+      enum_module.const_set(name, value_info.value)
+    end
+
+    def initialize_post(object)
+      super
+      return unless object.is_a?(GLib::Object)
+      self.class.reference_gobject(object, :sink => true)
+    end
+
+    def rubyish_class_name(info)
+      name = info.name.gsub(/Class\z/, "")
+      case name
+      when /\A.*_t\z/
+        name.gsub(/_t\z/, "").split("_").map do |component|
+          component[0] = component[0].upcase
+          component
+        end.join
+      else
+        name
+      end
+    end
+  end
+end
diff --git a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb b/gnumeric/lib/gnumeric.rb
similarity index 88%
copy from gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
copy to gnumeric/lib/gnumeric.rb
index fdb6ee3..d2c0b96 100644
--- a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
+++ b/gnumeric/lib/gnumeric.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -14,7 +14,4 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
-require "test-unit"
-
-module GdkPixbufTestUtils
-end
+require "gnm"
diff --git a/gnumeric/test/fixtures/hello.gnumeric b/gnumeric/test/fixtures/hello.gnumeric
new file mode 100644
index 0000000..a5ece0b
Binary files /dev/null and b/gnumeric/test/fixtures/hello.gnumeric differ
diff --git a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb b/gnumeric/test/gnumeric-test-utils.rb
similarity index 80%
copy from gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
copy to gnumeric/test/gnumeric-test-utils.rb
index fdb6ee3..9ae83d6 100644
--- a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
+++ b/gnumeric/test/gnumeric-test-utils.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -14,7 +14,12 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
+require "tempfile"
+
 require "test-unit"
 
-module GdkPixbufTestUtils
+module GnumericTestUtils
+  def fixture_file(*components)
+    File.join(__dir__, "fixtures", *components)
+  end
 end
diff --git a/clutter/test/run-test.rb b/gnumeric/test/run-test.rb
similarity index 65%
copy from clutter/test/run-test.rb
copy to gnumeric/test/run-test.rb
index 84f6c82..e3c7525 100755
--- a/clutter/test/run-test.rb
+++ b/gnumeric/test/run-test.rb
@@ -1,6 +1,6 @@
 #!/usr/bin/env ruby
 #
-# Copyright (C) 2012-2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -20,18 +20,33 @@ ruby_gnome2_base = File.join(File.dirname(__FILE__), "..", "..")
 ruby_gnome2_base = File.expand_path(ruby_gnome2_base)
 
 glib_base = File.join(ruby_gnome2_base, "glib2")
+atk_base = File.join(ruby_gnome2_base, "atk")
+pango_base = File.join(ruby_gnome2_base, "pango")
+gdk_pixbuf_base = File.join(ruby_gnome2_base, "gdk_pixbuf2")
 cairo_gobject_base = File.join(ruby_gnome2_base, "cairo-gobject")
 gobject_introspection_base = File.join(ruby_gnome2_base, "gobject-introspection")
-pango_base = File.join(ruby_gnome2_base, "pango")
-clutter_base = File.join(ruby_gnome2_base, "clutter")
+gio2_base = File.join(ruby_gnome2_base, "gio2")
+gdk3_base = File.join(ruby_gnome2_base, "gdk3")
+gtk3_base = File.join(ruby_gnome2_base, "gtk3")
+gsf_base = File.join(ruby_gnome2_base, "gsf")
+goffice_base = File.join(ruby_gnome2_base, "goffice")
+gnumeric_base = File.join(ruby_gnome2_base, "gnumeric")
 
 modules = [
   [glib_base, "glib2"],
+  [atk_base, "atk"],
+  [pango_base, "pango"],
   [cairo_gobject_base, "cairo-gobject"],
+  [gdk_pixbuf_base, "gdk_pixbuf2"],
   [gobject_introspection_base, "gobject-introspection"],
-  [pango_base, "pango"],
-  [clutter_base, "clutter"],
+  [gio2_base, "gio2"],
+  [gdk3_base, "gdk3"],
+  [gtk3_base, "gtk3"],
+  [gsf_base, "gsf"],
+  [goffice_base, "goffice"],
+  [gnumeric_base, "gnumeric"]
 ]
+
 modules.each do |target, module_name|
   makefile = File.join(target, "Makefile")
   if File.exist?(makefile) and system("which make > /dev/null")
@@ -41,25 +56,9 @@ modules.each do |target, module_name|
   $LOAD_PATH.unshift(File.join(target, "lib"))
 end
 
-$LOAD_PATH.unshift(File.join(glib_base, "test"))
-require "glib-test-init"
-
-$LOAD_PATH.unshift(File.join(gobject_introspection_base, "test"))
-require "gobject-introspection-test-utils"
-
-$LOAD_PATH.unshift(File.join(clutter_base, "test"))
-require "clutter-test-utils"
-
-require "clutter"
-
-repository = GObjectIntrospection::Repository.default
-begin
-  repository.require(Clutter::Loader::NAMESPACE)
-rescue GLib::Error
-  puts("Omit because typelib file doesn't exist: #{$!.message}")
-  exit(true)
-end
+$LOAD_PATH.unshift(File.join(gnumeric_base, "test"))
+require "gnumeric-test-utils"
 
-Clutter.init
+require "gnumeric"
 
-exit Test::Unit::AutoRunner.run(true, File.join(clutter_base, "test"))
+exit Test::Unit::AutoRunner.run(true, File.join(gnumeric_base, "test"))
diff --git a/gnumeric/test/test-convert.rb b/gnumeric/test/test-convert.rb
new file mode 100644
index 0000000..6d109ad
--- /dev/null
+++ b/gnumeric/test/test-convert.rb
@@ -0,0 +1,35 @@
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+class ConvertTest < Test::Unit::TestCase
+  include GnumericTestUtils
+
+  test ".gnumeric -> .csv" do
+    # TODO: Improve API
+    input_path = fixture_file("hello.gnumeric")
+    output = Tempfile.new(["test-gnumeric", ".csv"])
+    command_context = Gnm::CmdContextStderr.new
+    Gnm.plugins_init(command_context)
+    io_context = GOffice::IOContext.new(command_context)
+    view = Gnm::WorkbookView.new("file://#{input_path}",
+                                 nil,
+                                 io_context,
+                                 "utf-8")
+    saver = GOffice::FileSaver.for_file_name(output.path)
+    Gnm.wb_view_save_as(view, saver, "file://#{output.path}", command_context)
+    assert_equal("hello\n", File.read(output.path))
+  end
+end
diff --git a/gobject-introspection/Rakefile b/gobject-introspection/Rakefile
index 4c701ce..faa59e3 100644
--- a/gobject-introspection/Rakefile
+++ b/gobject-introspection/Rakefile
@@ -32,7 +32,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
       :name => "glib",
       :download_site => :gnome,
       :label => "GLib",
-      :version => "2.48.0",
+      :version => "2.48.1",
       :compression_method => "xz",
       :windows => {
         :build => false,
diff --git a/gobject-introspection/ext/gobject-introspection/rb-gi-argument.c b/gobject-introspection/ext/gobject-introspection/rb-gi-argument.c
index 319df93..de8c75f 100644
--- a/gobject-introspection/ext/gobject-introspection/rb-gi-argument.c
+++ b/gobject-introspection/ext/gobject-introspection/rb-gi-argument.c
@@ -1,6 +1,6 @@
 /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
 /*
- *  Copyright (C) 2012-2015  Ruby-GNOME2 Project Team
+ *  Copyright (C) 2012-2016  Ruby-GNOME2 Project Team
  *
  *  This library is free software; you can redistribute it and/or
  *  modify it under the terms of the GNU Lesser General Public
@@ -191,7 +191,7 @@ array_c_to_ruby_sized(gconstpointer *elements,
     case GI_TYPE_TAG_INT32:
         g_base_info_unref(element_type_info);
         {
-            const gint8 *numbers = (const gint8 *)elements;
+            const gint32 *numbers = (const gint32 *)elements;
             for (i = 0; i < n_elements; i++) {
                 rb_ary_push(rb_array, INT2NUM(numbers[i]));
             }
@@ -946,6 +946,86 @@ rb_gi_argument_to_ruby_glist(GIArgument *argument, GITypeInfo *type_info)
 }
 
 static VALUE
+rb_gi_argument_to_ruby_gslist_interface(GIArgument *argument,
+                                        G_GNUC_UNUSED GITypeInfo *type_info,
+                                        GITypeInfo *element_type_info)
+{
+    VALUE rb_argument = Qnil;
+    GIBaseInfo *interface_info;
+    GIInfoType interface_type;
+    const gchar *interface_name;
+    GType gtype;
+
+    interface_info = g_type_info_get_interface(element_type_info);
+    interface_type = g_base_info_get_type(interface_info);
+    interface_name = g_info_type_to_string(interface_type);
+    gtype = g_registered_type_info_get_g_type(interface_info);
+
+    switch (interface_type) {
+    case GI_INFO_TYPE_INVALID:
+    case GI_INFO_TYPE_FUNCTION:
+    case GI_INFO_TYPE_CALLBACK:
+        g_base_info_unref(interface_info);
+        g_base_info_unref(element_type_info);
+        rb_raise(rb_eNotImpError,
+                 "TODO: GIArgument(GSList)[interface(%s)](%s) -> Ruby",
+                 interface_name,
+                 g_type_name(gtype));
+        break;
+    case GI_INFO_TYPE_STRUCT:
+        if (gtype == G_TYPE_NONE) {
+            GSList *node;
+            rb_argument = rb_ary_new();
+            for (node = argument->v_pointer; node; node = g_slist_next(node)) {
+                rb_ary_push(rb_argument,
+                            interface_struct_to_ruby(node->data,
+                                                     FALSE,
+                                                     element_type_info,
+                                                     interface_info));
+            }
+        } else {
+            rb_argument = BOXEDGLIST2RVAL(argument->v_pointer, gtype);
+        }
+        break;
+    case GI_INFO_TYPE_BOXED:
+        rb_argument = BOXEDGLIST2RVAL(argument->v_pointer, gtype);
+        break;
+    case GI_INFO_TYPE_ENUM:
+    case GI_INFO_TYPE_FLAGS:
+    case GI_INFO_TYPE_OBJECT:
+    case GI_INFO_TYPE_INTERFACE:
+        rb_argument = GOBJGLIST2RVAL(argument->v_pointer);
+        break;
+    case GI_INFO_TYPE_CONSTANT:
+    case GI_INFO_TYPE_INVALID_0:
+    case GI_INFO_TYPE_UNION:
+    case GI_INFO_TYPE_VALUE:
+    case GI_INFO_TYPE_SIGNAL:
+    case GI_INFO_TYPE_VFUNC:
+    case GI_INFO_TYPE_PROPERTY:
+    case GI_INFO_TYPE_FIELD:
+    case GI_INFO_TYPE_ARG:
+    case GI_INFO_TYPE_TYPE:
+    case GI_INFO_TYPE_UNRESOLVED:
+        g_base_info_unref(interface_info);
+        g_base_info_unref(element_type_info);
+        rb_raise(rb_eNotImpError,
+                 "TODO: GIArgument(GSList)[interface(%s)](%s) -> Ruby",
+                 interface_name,
+                 g_type_name(gtype));
+        break;
+    default:
+        g_assert_not_reached();
+        break;
+    }
+
+    g_base_info_unref(interface_info);
+    g_base_info_unref(element_type_info);
+
+    return rb_argument;
+}
+
+static VALUE
 rb_gi_argument_to_ruby_gslist(GIArgument *argument, GITypeInfo *type_info)
 {
     VALUE rb_argument;
@@ -954,7 +1034,6 @@ rb_gi_argument_to_ruby_gslist(GIArgument *argument, GITypeInfo *type_info)
 
     element_type_info = g_type_info_get_param_type(type_info, 0);
     element_type_tag = g_type_info_get_tag(element_type_info);
-    g_base_info_unref(element_type_info);
 
     switch (element_type_tag) {
     case GI_TYPE_TAG_VOID:
@@ -970,34 +1049,42 @@ rb_gi_argument_to_ruby_gslist(GIArgument *argument, GITypeInfo *type_info)
     case GI_TYPE_TAG_FLOAT:
     case GI_TYPE_TAG_DOUBLE:
     case GI_TYPE_TAG_GTYPE:
+        g_base_info_unref(element_type_info);
         rb_raise(rb_eNotImpError,
                  "TODO: GIArgument(GSList)[%s] -> Ruby",
                  g_type_tag_to_string(element_type_tag));
         break;
     case GI_TYPE_TAG_UTF8:
+        g_base_info_unref(element_type_info);
         rb_argument = CSTRGSLIST2RVAL(argument->v_pointer);
         break;
     case GI_TYPE_TAG_FILENAME:
+        g_base_info_unref(element_type_info);
         rb_argument = FILENAMEGSLIST2RVAL(argument->v_pointer);
         break;
     case GI_TYPE_TAG_ARRAY:
+        g_base_info_unref(element_type_info);
         rb_raise(rb_eNotImpError,
                  "TODO: GIArgument(GSList)[%s] -> Ruby",
                  g_type_tag_to_string(element_type_tag));
         break;
     case GI_TYPE_TAG_INTERFACE:
-        rb_argument = GOBJGSLIST2RVAL(argument->v_pointer);
+        rb_argument = rb_gi_argument_to_ruby_gslist_interface(argument,
+                                                              type_info,
+                                                              element_type_info);
         break;
     case GI_TYPE_TAG_GLIST:
     case GI_TYPE_TAG_GSLIST:
     case GI_TYPE_TAG_GHASH:
     case GI_TYPE_TAG_ERROR:
     case GI_TYPE_TAG_UNICHAR:
+        g_base_info_unref(element_type_info);
         rb_raise(rb_eNotImpError,
                  "TODO: GIArgument(GSList)[%s] -> Ruby",
                  g_type_tag_to_string(element_type_tag));
         break;
     default:
+        g_base_info_unref(element_type_info);
         g_assert_not_reached();
         break;
     }
diff --git a/gobject-introspection/ext/gobject-introspection/rb-gi-function-info.c b/gobject-introspection/ext/gobject-introspection/rb-gi-function-info.c
index 1621dca..402d124 100644
--- a/gobject-introspection/ext/gobject-introspection/rb-gi-function-info.c
+++ b/gobject-introspection/ext/gobject-introspection/rb-gi-function-info.c
@@ -215,6 +215,29 @@ fill_metadata_array(GPtrArray *args_metadata)
 }
 
 static void
+fill_metadata_array_from_callable_info(GPtrArray *args_metadata,
+                                       GICallableInfo *info)
+{
+    GITypeInfo return_type_info;
+    RBGIArgMetadata *array_length_metadata;
+    gint array_length_index = -1;
+
+    g_callable_info_load_return_type(info, &return_type_info);
+    if (g_type_info_get_tag(&return_type_info) != GI_TYPE_TAG_ARRAY) {
+        return;
+    }
+
+    array_length_index = g_type_info_get_array_length(&return_type_info);
+    if (array_length_index == -1) {
+        return;
+    }
+
+    array_length_metadata = g_ptr_array_index(args_metadata, array_length_index);
+    array_length_metadata->array_length_p = TRUE;
+    array_length_metadata->rb_arg_index = -1;
+}
+
+static void
 fill_metadata_rb_arg_index(GPtrArray *args_metadata)
 {
     guint i;
@@ -251,10 +274,11 @@ fill_metadata_rb_arg_index(GPtrArray *args_metadata)
 }
 
 static void
-fill_metadata(GPtrArray *args_metadata)
+fill_metadata(GPtrArray *args_metadata, GICallableInfo *info)
 {
     fill_metadata_callback(args_metadata);
     fill_metadata_array(args_metadata);
+    fill_metadata_array_from_callable_info(args_metadata, info);
     fill_metadata_rb_arg_index(args_metadata);
 }
 
@@ -866,7 +890,7 @@ ffi_closure_callback(G_GNUC_UNUSED ffi_cif *cif,
                        in_args,
                        out_args,
                        args_metadata);
-    fill_metadata(args_metadata);
+    fill_metadata(args_metadata, callback->callback_info);
     arguments_from_raw_data(callback->callback_info,
                             raw_args,
                             in_args,
@@ -1071,7 +1095,7 @@ arguments_from_ruby(GICallableInfo *info, VALUE self, VALUE rb_arguments,
     gint i, n_args;
 
     allocate_arguments(info, in_args, out_args, args_metadata);
-    fill_metadata(args_metadata);
+    fill_metadata(args_metadata, info);
 
     n_args = g_callable_info_get_n_args(info);
     for (i = 0; i < n_args; i++) {
diff --git a/gobject-introspection/lib/gobject-introspection/arg-info.rb b/gobject-introspection/lib/gobject-introspection/arg-info.rb
index 88d785d..7abeee1 100644
--- a/gobject-introspection/lib/gobject-introspection/arg-info.rb
+++ b/gobject-introspection/lib/gobject-introspection/arg-info.rb
@@ -17,6 +17,13 @@
 module GObjectIntrospection
   class ArgInfo
     def gclosure?
+      @gclosure_p ||= nil
+      return @gclosure_p unless @gclosure_p.nil?
+      @gclosure_p = compute_gclosure?
+    end
+
+    private
+    def compute_gclosure?
       type_info = type
       return false if type_info.tag != TypeTag::INTERFACE
 
diff --git a/gobject-introspection/lib/gobject-introspection/callable-info.rb b/gobject-introspection/lib/gobject-introspection/callable-info.rb
index 8254e29..564ece5 100644
--- a/gobject-introspection/lib/gobject-introspection/callable-info.rb
+++ b/gobject-introspection/lib/gobject-introspection/callable-info.rb
@@ -23,6 +23,48 @@ module GObjectIntrospection
     collection_reader("args")
 
     def in_args
+      @in_args ||= compute_in_args
+    end
+
+    def required_in_args
+      @required_in_args ||= in_args.reject do |arg|
+        arg.may_be_null?
+      end
+    end
+
+    def n_in_args
+      in_args.size
+    end
+
+    def n_required_in_args
+      required_in_args.size
+    end
+
+    def require_callback?
+      args.any? do |arg|
+        arg.direction == Direction::IN and
+          arg.scope != ScopeType::INVALID and
+          !arg.may_be_null?
+      end
+    end
+
+    def out_args
+      @out_args ||= args.find_all do |arg|
+        case arg.direction
+        when Direction::OUT, Direction::INOUT
+          true
+        else
+          false
+        end
+      end
+    end
+
+    def n_out_args
+      out_args.size
+    end
+
+    private
+    def compute_in_args
       array_length_indexes = []
       callback_indexes = []
       closure_indexes = []
@@ -61,42 +103,5 @@ module GObjectIntrospection
         end
       end
     end
-
-    def required_in_args
-      in_args.reject do |arg|
-        arg.may_be_null?
-      end
-    end
-
-    def n_in_args
-      in_args.size
-    end
-
-    def n_required_in_args
-      required_in_args.size
-    end
-
-    def require_callback?
-      args.any? do |arg|
-        arg.direction == Direction::IN and
-          arg.scope != ScopeType::INVALID and
-          !arg.may_be_null?
-      end
-    end
-
-    def out_args
-      args.find_all do |arg|
-        case arg.direction
-        when Direction::OUT, Direction::INOUT
-          true
-        else
-          false
-        end
-      end
-    end
-
-    def n_out_args
-      out_args.size
-    end
   end
 end
diff --git a/gobject-introspection/lib/gobject-introspection/collection-reader.rb b/gobject-introspection/lib/gobject-introspection/collection-reader.rb
index d6b3b2c..9620dcf 100644
--- a/gobject-introspection/lib/gobject-introspection/collection-reader.rb
+++ b/gobject-introspection/lib/gobject-introspection/collection-reader.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2012  Ruby-GNOME2 Project Team
+# Copyright (C) 2012-2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -24,9 +24,16 @@ module GObjectIntrospection
         singular = name.sub(/s\z/, "")
       end
       getter = "get_#{singular}"
+      cache_name = "@#{name}"
       define_method(name) do
-        send(n_getter).times.collect do |i|
-          send(getter, i)
+        if instance_variable_defined?(cache_name)
+          instance_variable_get(cache_name)
+        else
+          collection = send(n_getter).times.collect do |i|
+            send(getter, i)
+          end
+          instance_variable_set(cache_name, collection)
+          collection
         end
       end
     end
diff --git a/gobject-introspection/lib/gobject-introspection/loader.rb b/gobject-introspection/lib/gobject-introspection/loader.rb
index 549ae47..db1d0d2 100644
--- a/gobject-introspection/lib/gobject-introspection/loader.rb
+++ b/gobject-introspection/lib/gobject-introspection/loader.rb
@@ -121,11 +121,12 @@ module GObjectIntrospection
     end
 
     def define_struct(info, options={})
+      name = rubyish_class_name(info)
       if info.gtype == GLib::Type::NONE
-        klass = self.class.define_struct(info.size, info.name, @base_module,
+        klass = self.class.define_struct(info.size, name, @base_module,
                                          :parent => options[:parent])
       else
-        klass = self.class.define_class(info.gtype, info.name, @base_module,
+        klass = self.class.define_class(info.gtype, name, @base_module,
                                         :parent => options[:parent],
                                         :size   => info.size)
       end
@@ -136,7 +137,7 @@ module GObjectIntrospection
     def load_struct_info(info)
       case info.name
       when /Class\z/
-        base_class_name = $PREMATCH
+        base_class_name = rubyish_class_name(info)
         method_infos = info.methods.find_all do |method_info|
           method_info.is_a?(MethodInfo)
         end
@@ -169,26 +170,18 @@ module GObjectIntrospection
 
     def define_enum(info)
       self.class.define_class(info.gtype,
-                              enum_class_name(info),
+                              rubyish_class_name(info),
                               @base_module)
     end
 
-    def enum_class_name(info)
-      info.name
-    end
-
     def define_error(info)
       self.class.define_error(info.error_domain,
-                              error_class_name(info),
+                              rubyish_class_name(info),
                               @base_module,
                               :parent => error_parent_class(info),
                               :gtype => info.gtype)
     end
 
-    def error_class_name(info)
-      info.name
-    end
-
     def error_parent_class(info)
       nil
     end
@@ -199,7 +192,7 @@ module GObjectIntrospection
         info.values.each do |value_info|
           load_enum_value(value_info, enum_module)
         end
-        @base_module.const_set(info.name, enum_module)
+        @base_module.const_set(rubyish_class_name(info), enum_module)
       else
         if info.error_domain
           define_error(info)
@@ -219,7 +212,7 @@ module GObjectIntrospection
         info.values.each do |value_info|
           load_flag_value(value_info, flags_module)
         end
-        @base_module.const_set(info.name, flags_module)
+        @base_module.const_set(rubyish_class_name(info), flags_module)
       else
         self.class.define_class(info.gtype, flags_class_name(info), @base_module)
       end
@@ -230,7 +223,9 @@ module GObjectIntrospection
     end
 
     def load_object_info(info)
-      klass = self.class.define_class(info.gtype, info.name, @base_module)
+      klass = self.class.define_class(info.gtype,
+                                      rubyish_class_name(info),
+                                      @base_module)
       load_fields(info, klass)
       load_methods(info, klass)
     end
@@ -414,7 +409,9 @@ module GObjectIntrospection
         when InfoType::STRUCT
           match_argument_interface_struct?(arg_info, interface, argument)
         when InfoType::OBJECT,
-             InfoType::INTERFACE
+             InfoType::INTERFACE,
+             InfoType::FLAGS,
+             InfoType::ENUM
           argument.is_a?(interface.gtype.to_class)
         else
           # TODO
@@ -468,7 +465,7 @@ module GObjectIntrospection
           else
             name
           end
-        when /\A(?:has|use|can|in|.*_is)_/
+        when /\A(?:has|use|can|in|on|.*_is)_/
           "#{name}?"
         when "exists"
           "exist?"
@@ -504,6 +501,21 @@ module GObjectIntrospection
       end
     end
 
+    def rubyish_class_name(info)
+      name = info.name
+      case info
+      when StructInfo
+        case name
+        when /Class\z/
+          $PREMATCH
+        else
+          name
+        end
+      else
+        name
+      end
+    end
+
     def should_unlock_gvl?(function_info, klass)
       false
     end
@@ -537,10 +549,11 @@ module GObjectIntrospection
         validate_arguments(info, "#{klass}\##{method_name}", arguments)
         [arguments, block]
       end
+      require_callback_p = info.require_callback?
       klass.__send__(:define_method, method_name) do |*arguments, &block|
         arguments = [self] + arguments if function_info_p
         arguments, block = prepare.call(arguments, &block)
-        if block.nil? and info.require_callback?
+        if block.nil? and require_callback_p
           to_enum(method_name, *arguments)
         else
           options = {
@@ -577,12 +590,18 @@ module GObjectIntrospection
 
     def load_interface_info(info)
       interface_module =
-        self.class.define_interface(info.gtype, info.name, @base_module)
+        self.class.define_interface(info.gtype,
+                                    rubyish_class_name(info),
+                                    @base_module)
       load_methods(info, interface_module)
     end
 
     def load_constant_info(info)
-      @base_module.const_set(info.name, info.value)
+      define_constant(info.name, info)
+    end
+
+    def define_constant(name, info)
+      @base_module.const_set(name, info.value)
     end
 
     def load_union_info(info)
diff --git a/goffice/COPYING.LIB b/goffice/COPYING.LIB
new file mode 100644
index 0000000..4362b49
--- /dev/null
+++ b/goffice/COPYING.LIB
@@ -0,0 +1,502 @@
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+

+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+

+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+

+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+

+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+

+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+

+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+

+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+

+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+

+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/goffice/README.md b/goffice/README.md
new file mode 100644
index 0000000..9228672
--- /dev/null
+++ b/goffice/README.md
@@ -0,0 +1,25 @@
+# Ruby/GOffice
+
+Ruby/GOffice is a Ruby binding of GOffice.
+
+## Requirements
+
+* Ruby/GTK3 and Ruby/GSF in
+  [Ruby-GNOME2](http://ruby-gnome2.sourceforge.jp/)
+* [GOffice](https://developer.gnome.org/goffice/)
+
+## Install
+
+    gem install goffice
+
+## License
+
+Copyright (c) 2016 Ruby-GNOME2 Project Team
+
+This program is free software. You can distribute/modify this program
+under the terms of the GNU LESSER GENERAL PUBLIC LICENSE Version 2.1.
+
+## Project Websites
+
+*   http://ruby-gnome2.sourceforge.jp/
+*   https://github.com/ruby-gnome2/ruby-gnome2
diff --git a/vte3/Rakefile b/goffice/Rakefile
similarity index 50%
copy from vte3/Rakefile
copy to goffice/Rakefile
index 03798d5..ffcf4a7 100644
--- a/vte3/Rakefile
+++ b/goffice/Rakefile
@@ -1,6 +1,6 @@
 # -*- ruby -*-
 #
-# Copyright (C) 2011-2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -20,43 +20,59 @@ $LOAD_PATH.unshift("./../glib2/lib")
 require 'gnome2/rake/package-task'
 
 package_task = GNOME2::Rake::PackageTask.new do |package|
-  package.summary = "Ruby/VTE is a Ruby binding of VTE."
-  package.description = "Ruby/VTE is a Ruby binding of VTE."
-  package.dependency.gem.runtime = ["gtk3", "gobject-introspection"]
+  package.summary = "Ruby/GOFFICE is a Ruby binding of GOFFICE."
+  package.description = "Ruby/GOFFICE is a Ruby binding of GOFFICE."
+  package.dependency.gem.runtime = ["gsf", "gobject-introspection", "gtk3"]
   package.windows.packages = []
   package.windows.dependencies = []
   package.windows.build_dependencies = [
     "glib2",
-    "gio2",
+    "cairo-gobject",
     "atk",
     "pango",
     "gdk_pixbuf2",
     "gdk3",
+    "rsvg2",
+    "gsf",
     "gobject-introspection",
   ]
   package.windows.gobject_introspection_dependencies = [
-    "gio2",
-    "atk",
-    "pango",
-    "gdk_pixbuf2",
     "gdk3",
+    "rsvg2",
+    "gsf",
   ]
+  # rcairo_windows_binary_base_dir =
+  #   package.windows_binary_build_task.rcairo_windows_binary_base_dir
   package.external_packages = [
-    {
-      :name => "vte",
-      :download_site => :gnome,
-      :label => "vte",
-      :version => "0.44.0",
-      :compression_method => "xz",
-      :windows => {
-        :configure_args => [
-          "--disable-vala",
-        ],
-        :patches => [
-        ],
-        :need_autoreconf => true,
-      },
-    },
+    # {
+    #   :name => "libxslt",
+    #   :version => "1.1.28",
+    #   :download_base_url => "ftp://xmlsoft.org/libxslt",
+    #   :compression_method => "gz",
+    #   :windows => {
+    #     :built_file => "bin/libxslt-1.dll",
+    #     :configure_args => [
+    #       "--with-libxml-prefix=#{rcairo_windows_binary_base_dir}",
+    #       "--without-python",
+    #     ],
+    #     :patches => [
+    #       "libxslt-1.1.28-add-mkdir-fallback.diff",
+    #     ],
+    #   },
+    # },
+    # {
+    #   :name => "goffice",
+    #   :download_site => :gnome,
+    #   :label => "goffice",
+    #   :version => "0.10.31",
+    #   :compression_method => "xz",
+    #   :windows => {
+    #     :configure_args => [
+    #     ],
+    #     :patches => [
+    #     ],
+    #   },
+    # },
   ]
 end
 package_task.define
diff --git a/vte3/lib/vte3.rb b/goffice/lib/goffice.rb
similarity index 87%
copy from vte3/lib/vte3.rb
copy to goffice/lib/goffice.rb
index bf72a0a..86f0f14 100644
--- a/vte3/lib/vte3.rb
+++ b/goffice/lib/goffice.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2014  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -16,6 +16,7 @@
 
 require "gobject-introspection"
 require "gtk3"
+require "gsf"
 
 base_dir = Pathname.new(__FILE__).dirname.dirname.expand_path
 vendor_dir = base_dir + "vendor" + "local"
@@ -24,10 +25,10 @@ GLib.prepend_dll_path(vendor_bin_dir)
 vendor_girepository_dir = vendor_dir + "lib" + "girepository-1.0"
 GObjectIntrospection.prepend_typelib_path(vendor_girepository_dir)
 
-require "vte3/loader"
+require "goffice/loader"
 
-module Vte
-  LOG_DOMAIN = "Vte"
+module GOffice 
+  LOG_DOMAIN = "GOffice"
   GLib::Log.set_log_domain(LOG_DOMAIN)
 
   class Error < StandardError
@@ -50,7 +51,11 @@ module Vte
       end
       Gtk.init if Gtk.respond_to?(:init)
       loader = Loader.new(self)
-      loader.load("Vte")
+      loader.load("GOffice")
+      init
+      class << self
+        remove_method(:init)
+      end
     end
   end
 end
diff --git a/goffice/lib/goffice/loader.rb b/goffice/lib/goffice/loader.rb
new file mode 100644
index 0000000..2970329
--- /dev/null
+++ b/goffice/lib/goffice/loader.rb
@@ -0,0 +1,89 @@
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+module GOffice
+  class Loader < GObjectIntrospection::Loader
+    private
+    def pre_load(repository, namespace)
+    end
+
+    def post_load(repository, namespace)
+      define_version(repository, namespace)
+      require_libraries
+    end
+
+    def define_version(repository, namespace)
+      major, minor, micro = repository.get_version(namespace).split(".")
+      @base_module.const_set("MAJOR", Integer(major))
+      @base_module.const_set("MINOR", Integer(minor))
+      micro = Integer(micro) unless micro.nil?
+      @base_module.const_set("MICRO", micro)
+    end
+
+    def require_libraries
+      require "goffice/version"
+    end
+
+    def load_enum_value(value_info, enum_module)
+      name = case value_info.name.upcase
+      when /\A30E_360\z/
+        "EUR_30_360"
+      when /\A30EP_360\z/
+        "EP_30_360"
+      else
+        value_info.name.upcase
+      end
+      enum_module.const_set(name, value_info.value)
+    end
+
+    def initialize_post(object)
+      super
+      return unless object.is_a?(GLib::Object)
+      self.class.reference_gobject(object, :sink => true)
+    end
+
+    def load_info(info)
+      case info.name
+      when "_SearchReplace"
+        return
+      when "gViewAllocation"
+        return
+      else
+        super
+      end
+    end
+
+    def rubyish_class_name(info)
+      name = info.name.gsub(/Class\z/, "")
+      case name
+      when /\A3DRotationSel\z/
+        "Rotation3DSel"
+      when /\Ag(\d*[A-Z]\w*)\z/
+        "Graph#{Object::Regexp.last_match[1]}"
+      when /\Ac(\d*[A-Z]\w*)\z/
+        "Canvas#{Object::Regexp.last_match[1]}"
+      when /\Ago_regression_stat_t\z/
+        "RegressionStatT"
+      when /\Ago_regression_stat_tl\z/
+        "RegressionStatTl"
+      when /\A\_(.*)\z/
+        Object::Regexp.last_match[1]
+      else
+        name
+      end
+    end
+  end
+end
diff --git a/gobject-introspection/lib/gobject-introspection/arg-info.rb b/goffice/lib/goffice/version.rb
similarity index 67%
copy from gobject-introspection/lib/gobject-introspection/arg-info.rb
copy to goffice/lib/goffice/version.rb
index 88d785d..a560cd0 100644
--- a/gobject-introspection/lib/gobject-introspection/arg-info.rb
+++ b/goffice/lib/goffice/version.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -14,14 +14,20 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
-module GObjectIntrospection
-  class ArgInfo
-    def gclosure?
-      type_info = type
-      return false if type_info.tag != TypeTag::INTERFACE
+module GOffice
+  module Version
+    STRING = [MAJOR, MINOR, MICRO].compact.join(".")
 
-      struct_info = type_info.interface
-      struct_info.gtype.name == "GClosure"
+    class << self
+      def or_later?(major, minor, micro=nil)
+        micro ||= 0
+        version = [
+          MAJOR,
+          MINOR,
+          MICRO,
+        ].compact
+        (version <=> [major, minor, micro]) >= 0
+      end
     end
   end
 end
diff --git a/goffice/patches/libxslt-1.1.28-add-mkdir-fallback.diff b/goffice/patches/libxslt-1.1.28-add-mkdir-fallback.diff
new file mode 100644
index 0000000..456509a
--- /dev/null
+++ b/goffice/patches/libxslt-1.1.28-add-mkdir-fallback.diff
@@ -0,0 +1,11 @@
+diff -ru libxslt-1.1.28.orig/libxslt/security.c libxslt-1.1.28/libxslt/security.c
+--- libxslt-1.1.28.orig/libxslt/security.c	2012-09-12 14:58:14.000000000 +0900
++++ libxslt-1.1.28/libxslt/security.c	2013-12-28 19:25:13.615751850 +0900
+@@ -39,6 +39,7 @@
+ #ifndef INVALID_FILE_ATTRIBUTES
+ #define INVALID_FILE_ATTRIBUTES ((DWORD)-1)
+ #endif
++#define mkdir(path, mode) mkdir(path)
+ #endif
+ 
+ #ifndef HAVE_STAT
diff --git a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb b/goffice/test/goffice-test-utils.rb
similarity index 82%
copy from gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
copy to goffice/test/goffice-test-utils.rb
index fdb6ee3..d95c858 100644
--- a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
+++ b/goffice/test/goffice-test-utils.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -16,5 +16,8 @@
 
 require "test-unit"
 
-module GdkPixbufTestUtils
+module GOfficeTestUtils
+  def omit_on_travis_ci
+    omit("This test can't be run on Travis CI") if ENV["CI"]
+  end
 end
diff --git a/clutter/test/run-test.rb b/goffice/test/run-test.rb
similarity index 68%
copy from clutter/test/run-test.rb
copy to goffice/test/run-test.rb
index 84f6c82..46ace56 100755
--- a/clutter/test/run-test.rb
+++ b/goffice/test/run-test.rb
@@ -1,6 +1,6 @@
 #!/usr/bin/env ruby
 #
-# Copyright (C) 2012-2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -20,18 +20,31 @@ ruby_gnome2_base = File.join(File.dirname(__FILE__), "..", "..")
 ruby_gnome2_base = File.expand_path(ruby_gnome2_base)
 
 glib_base = File.join(ruby_gnome2_base, "glib2")
+atk_base = File.join(ruby_gnome2_base, "atk")
+pango_base = File.join(ruby_gnome2_base, "pango")
+gdk_pixbuf_base = File.join(ruby_gnome2_base, "gdk_pixbuf2")
 cairo_gobject_base = File.join(ruby_gnome2_base, "cairo-gobject")
 gobject_introspection_base = File.join(ruby_gnome2_base, "gobject-introspection")
-pango_base = File.join(ruby_gnome2_base, "pango")
-clutter_base = File.join(ruby_gnome2_base, "clutter")
+gio2_base = File.join(ruby_gnome2_base, "gio2")
+gdk3_base = File.join(ruby_gnome2_base, "gdk3")
+gsf_base = File.join(ruby_gnome2_base, "gsf")
+gtk3_base = File.join(ruby_gnome2_base, "gtk3")
+goffice_base = File.join(ruby_gnome2_base, "goffice")
 
 modules = [
   [glib_base, "glib2"],
+  [atk_base, "atk"],
+  [pango_base, "pango"],
   [cairo_gobject_base, "cairo-gobject"],
+  [gdk_pixbuf_base, "gdk_pixbuf2"],
   [gobject_introspection_base, "gobject-introspection"],
-  [pango_base, "pango"],
-  [clutter_base, "clutter"],
+  [gio2_base, "gio2"],
+  [gdk3_base, "gdk3"],
+  [gtk3_base, "gtk3"],
+  [gsf_base, "gsf"],
+  [goffice_base, "goffice"]
 ]
+
 modules.each do |target, module_name|
   makefile = File.join(target, "Makefile")
   if File.exist?(makefile) and system("which make > /dev/null")
@@ -41,25 +54,9 @@ modules.each do |target, module_name|
   $LOAD_PATH.unshift(File.join(target, "lib"))
 end
 
-$LOAD_PATH.unshift(File.join(glib_base, "test"))
-require "glib-test-init"
-
-$LOAD_PATH.unshift(File.join(gobject_introspection_base, "test"))
-require "gobject-introspection-test-utils"
-
-$LOAD_PATH.unshift(File.join(clutter_base, "test"))
-require "clutter-test-utils"
-
-require "clutter"
-
-repository = GObjectIntrospection::Repository.default
-begin
-  repository.require(Clutter::Loader::NAMESPACE)
-rescue GLib::Error
-  puts("Omit because typelib file doesn't exist: #{$!.message}")
-  exit(true)
-end
+$LOAD_PATH.unshift(File.join(goffice_base, "test"))
+require "goffice-test-utils"
 
-Clutter.init
+require "goffice"
 
-exit Test::Unit::AutoRunner.run(true, File.join(clutter_base, "test"))
+exit Test::Unit::AutoRunner.run(true, File.join(goffice_base, "test"))
diff --git a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb b/goffice/test/test-data-scalar-str.rb
similarity index 75%
copy from gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
copy to goffice/test/test-data-scalar-str.rb
index fdb6ee3..724c09c 100644
--- a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
+++ b/goffice/test/test-data-scalar-str.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -14,7 +14,12 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
-require "test-unit"
+class DataScalarStrTest < Test::Unit::TestCase
+  include GOfficeTestUtils
 
-module GdkPixbufTestUtils
+  test ".new" do
+    omit_on_travis_ci
+    data = GOffice::DataScalarStr.new("XXX")
+    assert_equal("XXX", data.str)
+  end
 end
diff --git a/gsf/COPYING.LIB b/gsf/COPYING.LIB
new file mode 100644
index 0000000..4362b49
--- /dev/null
+++ b/gsf/COPYING.LIB
@@ -0,0 +1,502 @@
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+                            Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+

+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+

+                  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+

+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+

+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+

+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+

+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+

+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+

+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+                            NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+                     END OF TERMS AND CONDITIONS
+

+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/gsf/README.md b/gsf/README.md
new file mode 100644
index 0000000..eb44d6e
--- /dev/null
+++ b/gsf/README.md
@@ -0,0 +1,25 @@
+# Ruby/GSF
+
+Ruby/GSF is a Ruby binding of GSF which is needed by GOffice.
+
+## Requirements
+
+* Ruby/GIO2 in
+  [Ruby-GNOME2](http://ruby-gnome2.sourceforge.jp/)
+* [GSF](https://developer.gnome.org/gsf/)
+
+## Install
+
+    gem install gsf
+
+## License
+
+Copyright (c) 2016 Ruby-GNOME2 Project Team
+
+This program is free software. You can distribute/modify this program
+under the terms of the GNU LESSER GENERAL PUBLIC LICENSE Version 2.1.
+
+## Project Websites
+
+*   http://ruby-gnome2.sourceforge.jp/
+*   https://github.com/ruby-gnome2/ruby-gnome2
diff --git a/vte3/Rakefile b/gsf/Rakefile
similarity index 72%
copy from vte3/Rakefile
copy to gsf/Rakefile
index 03798d5..9cdeabd 100644
--- a/vte3/Rakefile
+++ b/gsf/Rakefile
@@ -1,6 +1,6 @@
 # -*- ruby -*-
 #
-# Copyright (C) 2011-2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -20,41 +20,34 @@ $LOAD_PATH.unshift("./../glib2/lib")
 require 'gnome2/rake/package-task'
 
 package_task = GNOME2::Rake::PackageTask.new do |package|
-  package.summary = "Ruby/VTE is a Ruby binding of VTE."
-  package.description = "Ruby/VTE is a Ruby binding of VTE."
-  package.dependency.gem.runtime = ["gtk3", "gobject-introspection"]
+  package.summary = "Ruby/GSF is a Ruby binding of GSF."
+  package.description = "Ruby/GSF is a Ruby binding of GSF."
+  package.dependency.gem.runtime = ["gio2", "gobject-introspection"]
   package.windows.packages = []
-  package.windows.dependencies = []
+  package.windows.dependencies = ["libxml2"]
   package.windows.build_dependencies = [
     "glib2",
     "gio2",
-    "atk",
-    "pango",
-    "gdk_pixbuf2",
-    "gdk3",
+    "cairo-gobject",
     "gobject-introspection",
   ]
   package.windows.gobject_introspection_dependencies = [
     "gio2",
-    "atk",
-    "pango",
-    "gdk_pixbuf2",
-    "gdk3",
+    "cairo-gobject",
   ]
   package.external_packages = [
     {
-      :name => "vte",
+      :name => "libgsf",
       :download_site => :gnome,
-      :label => "vte",
-      :version => "0.44.0",
+      :label => "gsf",
+      :version => "1.14.39",
       :compression_method => "xz",
       :windows => {
         :configure_args => [
-          "--disable-vala",
         ],
         :patches => [
         ],
-        :need_autoreconf => true,
+        :built_file => "bin/libgsf-win32-1-114.dll",
       },
     },
   ]
diff --git a/gio2/lib/gio2.rb b/gsf/lib/gsf.rb
similarity index 87%
copy from gio2/lib/gio2.rb
copy to gsf/lib/gsf.rb
index c15b978..0d1ac44 100644
--- a/gio2/lib/gio2.rb
+++ b/gsf/lib/gsf.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2013-2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -15,7 +15,7 @@
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
 require "gobject-introspection"
-require "glib2"
+require "gio2"
 
 base_dir = Pathname.new(__FILE__).dirname.dirname.expand_path
 vendor_dir = base_dir + "vendor" + "local"
@@ -24,17 +24,12 @@ GLib.prepend_dll_path(vendor_bin_dir)
 vendor_girepository_dir = vendor_dir + "lib" + "girepository-1.0"
 GObjectIntrospection.prepend_typelib_path(vendor_girepository_dir)
 
-require "gio2/loader"
+require "gsf/loader"
 
-module Gio
-  LOG_DOMAIN = "Gio"
+module Gsf
+  LOG_DOMAIN = "Gsf"
   GLib::Log.set_log_domain(LOG_DOMAIN)
 
-  Version = GLib::Version
-
-  class Error < StandardError
-  end
-
   class << self
     def const_missing(name)
       init
@@ -50,8 +45,9 @@ module Gio
         remove_method(:init)
         remove_method(:const_missing)
       end
+      Gio.init if Gio.respond_to?(:init)
       loader = Loader.new(self)
-      loader.load("Gio")
+      loader.load("Gsf")
     end
   end
 end
diff --git a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb b/gsf/lib/gsf/input.rb
similarity index 76%
copy from gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
copy to gsf/lib/gsf/input.rb
index fdb6ee3..a79d838 100644
--- a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
+++ b/gsf/lib/gsf/input.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -14,7 +14,13 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
-require "test-unit"
-
-module GdkPixbufTestUtils
+module Gsf
+  class Input
+    alias_method :read_raw, :read
+    def read(size=nil)
+      size ||= remaining
+      bytes = read_raw(size)
+      bytes.pack("C*")
+    end
+  end
 end
diff --git a/gsf/lib/gsf/loader.rb b/gsf/lib/gsf/loader.rb
new file mode 100644
index 0000000..93a2fc3
--- /dev/null
+++ b/gsf/lib/gsf/loader.rb
@@ -0,0 +1,57 @@
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+module Gsf
+  class Loader < GObjectIntrospection::Loader
+    private
+    def load_function_info(info)
+      name = info.name
+      case name
+      when "init"
+        # ignore
+      else
+        super
+      end
+    end
+
+    def load_enum_value(value_info, enum_module)
+      # TODO: Add constant name rename feature to
+      # gobject-introspection and use it.
+      if value_info.name == "2nd"
+        enum_module.const_set("SECOND", value_info.value)
+      else
+        super
+      end
+    end
+
+    def pre_load(repository, namespace)
+    end
+
+    def post_load(repository, namespace)
+      require_libraries
+    end
+
+    def require_libraries
+      require "gsf/input"
+    end
+
+    def initialize_post(object)
+      super
+      return unless object.is_a?(GLib::Object)
+      self.class.reference_gobject(object, :sink => true)
+    end
+  end
+end
diff --git a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb b/gsf/test/gsf-test-utils.rb
similarity index 89%
copy from gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
copy to gsf/test/gsf-test-utils.rb
index fdb6ee3..b3ee055 100644
--- a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
+++ b/gsf/test/gsf-test-utils.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -14,7 +14,9 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
+require "tempfile"
+
 require "test-unit"
 
-module GdkPixbufTestUtils
+module GsfTestUtils
 end
diff --git a/gdk_pixbuf2/test/run-test.rb b/gsf/test/run-test.rb
similarity index 65%
copy from gdk_pixbuf2/test/run-test.rb
copy to gsf/test/run-test.rb
index 17082d2..63144c5 100755
--- a/gdk_pixbuf2/test/run-test.rb
+++ b/gsf/test/run-test.rb
@@ -1,6 +1,6 @@
 #!/usr/bin/env ruby
 #
-# Copyright (C) 2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -19,27 +19,28 @@
 ruby_gnome2_base = File.join(File.dirname(__FILE__), "..", "..")
 ruby_gnome2_base = File.expand_path(ruby_gnome2_base)
 
-glib_base = File.join(ruby_gnome2_base, "glib2")
-gdk_pixbuf2_base = File.join(ruby_gnome2_base, "gdk_pixbuf2")
+gobject_introspection_base = File.join(ruby_gnome2_base, "gobject-introspection")
+gio2_base = File.join(ruby_gnome2_base, "gio2")
+gsf_base = File.join(ruby_gnome2_base, "gsf")
 
 modules = [
-  [glib_base, "glib2"],
-  [gdk_pixbuf2_base, "gdk_pixbuf2"]
+  [gobject_introspection_base, "gobject-introspection"],
+  [gio2_base, "gio2"],
+  [gsf_base, "gsf"]
 ]
+
 modules.each do |target, module_name|
-  if system("which make > /dev/null")
+  makefile = File.join(target, "Makefile")
+  if File.exist?(makefile) and system("which make > /dev/null")
     `make -C #{target.dump} > /dev/null` or exit(false)
   end
   $LOAD_PATH.unshift(File.join(target, "ext", module_name))
   $LOAD_PATH.unshift(File.join(target, "lib"))
 end
 
-$LOAD_PATH.unshift(File.join(glib_base, "test"))
-require "glib-test-init"
-
-$LOAD_PATH.unshift(File.join(gdk_pixbuf2_base, "test"))
-require "gdk_pixbuf2-test-utils"
+$LOAD_PATH.unshift(File.join(gsf_base, "test"))
+require "gsf-test-utils"
 
-require "gdk_pixbuf2"
+require "gsf"
 
-exit Test::Unit::AutoRunner.run(true, File.join(gdk_pixbuf2_base, "test"))
+exit Test::Unit::AutoRunner.run(true, File.join(gsf_base, "test"))
diff --git a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb b/gsf/test/test-input-stdio.rb
similarity index 72%
copy from gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
copy to gsf/test/test-input-stdio.rb
index fdb6ee3..b22776d 100644
--- a/gdk_pixbuf2/test/gdk_pixbuf2-test-utils.rb
+++ b/gsf/test/test-input-stdio.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -14,7 +14,12 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
-require "test-unit"
-
-module GdkPixbufTestUtils
+class InputStdioTest < Test::Unit::TestCase
+  test ".new" do
+    file = Tempfile.new("test-input-stdio")
+    file.write("hello")
+    file.close
+    input = Gsf::InputStdio.new(file.path)
+    assert_equal("hello", input.read)
+  end
 end
diff --git a/gstreamer/Rakefile b/gstreamer/Rakefile
index 7058bea..e55a797 100644
--- a/gstreamer/Rakefile
+++ b/gstreamer/Rakefile
@@ -29,7 +29,6 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
     "glib2", "atk", "pango", "gdk_pixbuf2", "gtk2", "gobject-introspection",
   ]
   xiph_download_url_base = "http://downloads.xiph.org/releases"
-  freedesktop_download_url_base = "https://gstreamer.freedesktop.org/src"
   sf_net_download_url_base = "http://downloads.sourceforge.net/project"
   libmad_version = "0.15.1b"
   package.external_packages = [
@@ -48,7 +47,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
       :name => "sqlite-autoconf",
       :download_base_url => "http://www.sqlite.org/2016",
       :label => "SQLite",
-      :version => "3120000",
+      :version => "3140100",
       :compression_method => "gz",
       :windows => {
         :configure_args => [],
@@ -59,7 +58,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
       :name => "libsoup",
       :download_site => :gnome,
       :label => "libsoup",
-      :version => "2.54.0.1",
+      :version => "2.54.1",
       :compression_method => "xz",
       :windows => {
         :configure_args => [
@@ -143,9 +142,9 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
     },
     {
       :name => "gstreamer",
-      :download_base_url => "#{freedesktop_download_url_base}/gstreamer",
+      :download_site => :freedesktop_gstreamer,
       :label => "GStreamer",
-      :version => "1.8.0",
+      :version => "1.8.2",
       :compression_method => "xz",
       :windows => {
         :cc_args => "-std=gnu99",
@@ -163,9 +162,9 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
     },
     {
       :name => "gst-plugins-base",
-      :download_base_url => "#{freedesktop_download_url_base}/gst-plugins-base",
+      :download_site => :freedesktop_gstreamer,
       :label => "GStreamer plugins (base)",
-      :version => "1.8.0",
+      :version => "1.8.2",
       :compression_method => "xz",
       :windows => {
         :configure_args => [
@@ -184,9 +183,9 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
     },
     {
       :name => "gst-plugins-good",
-      :download_base_url => "#{freedesktop_download_url_base}/gst-plugins-good",
+      :download_site => :freedesktop_gstreamer,
       :label => "GStreamer plugins (good)",
-      :version => "1.8.0",
+      :version => "1.8.2",
       :compression_method => "xz",
       :windows => {
         :configure_args => [
@@ -198,9 +197,9 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
     },
     {
       :name => "gst-plugins-bad",
-      :download_base_url => "#{freedesktop_download_url_base}/gst-plugins-bad",
+      :download_site => :freedesktop_gstreamer,
       :label => "GStreamer plugins (bad)",
-      :version => "1.8.0",
+      :version => "1.8.2",
       :compression_method => "xz",
       :windows => {
         :configure_args => ["--disable-librfb"],
@@ -211,14 +210,13 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
         :gobject_introspection_compiler_split_args => true,
         :patches => [
           "gst-plugins-bad-1.8.0-use-only-I.diff",
-          "gst-plugins-bad-1.8.0-add-missing-lole32.diff",
         ],
         :built_file => "lib/gstreamer-1.0/libgstmxf.dll",
       },
     },
     # {
     #   :name => "gst-plugins-ugly",
-    #   :download_base_url => "#{freedesktop_download_url_base}/gst-plugins-ugly",
+    #   :download_site => :freedesktop_gstreamer,
     #   :label => "GStreamer plugins (ugly)",
     #   :version => "1.8.0",
     #   :compression_method => "xz",
@@ -229,9 +227,9 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
     # },
     {
       :name => "gst-libav",
-      :download_base_url => "#{freedesktop_download_url_base}/gst-libav",
+      :download_site => :freedesktop_gstreamer,
       :label => "GStreamer libav",
-      :version => "1.8.0",
+      :version => "1.8.2",
       :compression_method => "xz",
       :windows => {
         :configure_args => [
diff --git a/gstreamer/patches/gst-plugins-bad-1.8.0-add-missing-lole32.diff b/gstreamer/patches/gst-plugins-bad-1.8.0-add-missing-lole32.diff
deleted file mode 100644
index a921745..0000000
--- a/gstreamer/patches/gst-plugins-bad-1.8.0-add-missing-lole32.diff
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -ru gst-plugins-bad-1.8.0.orig/sys/directsound/Makefile.am gst-plugins-bad-1.8.0/sys/directsound/Makefile.am
---- gst-plugins-bad-1.8.0.orig/sys/directsound/Makefile.am	2015-04-13 15:56:11.000000000 +0900
-+++ gst-plugins-bad-1.8.0/sys/directsound/Makefile.am	2016-04-03 17:42:06.389387506 +0900
-@@ -5,7 +5,7 @@
- 	$(GST_PLUGINS_BASE_CFLAGS) $(DIRECTX_CFLAGS)
- libgstdirectsoundsrc_la_LIBADD = \
- 	$(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_API_VERSION) \
--	$(DIRECTX_LDFLAGS) $(DIRECTSOUND_LIBS)
-+	$(DIRECTX_LDFLAGS) $(DIRECTSOUND_LIBS) -lole32
- libgstdirectsoundsrc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
- libgstdirectsoundsrc_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
- 
diff --git a/gtk2/sample/gtk-demo/appwindow.rb b/gtk2/sample/gtk-demo/appwindow.rb
index 7b84547..d7e2e70 100644
--- a/gtk2/sample/gtk-demo/appwindow.rb
+++ b/gtk2/sample/gtk-demo/appwindow.rb
@@ -184,7 +184,7 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 Boston, MA 02111-1307, USA.
 ]
 
-      transparent = Gdk::Pixbuf.new(Demo.find_file("gtk-logo-rgb.gif")).add_alpha(true, 0xff, 0xff, 0xff)
+      transparent = GdkPixbuf::Pixbuf.new(:file => Demo.find_file("gtk-logo-rgb.gif")).add_alpha(true, 0xff, 0xff, 0xff)
       
       Gtk::AboutDialog.set_email_hook {|about, link|
 	puts "send mail to #{link}"
@@ -222,7 +222,7 @@ Boston, MA 02111-1307, USA.
       factory.add_default
 
       filename = Demo.find_file('gtk-logo-rgb.gif')
-      pixbuf = Gdk::Pixbuf.new(filename)
+      pixbuf = GdkPixbuf::Pixbuf.new(:file => filename)
 
       transparent = pixbuf.add_alpha(true, 0xff, 0xff, 0xff)
 
diff --git a/gtk2/sample/gtk-demo/cairo-clip-image.rb b/gtk2/sample/gtk-demo/cairo-clip-image.rb
index b949e07..9fe1e9c 100644
--- a/gtk2/sample/gtk-demo/cairo-clip-image.rb
+++ b/gtk2/sample/gtk-demo/cairo-clip-image.rb
@@ -23,7 +23,7 @@ module Demo
         
         cr.new_path
         
-        loader = Gdk::PixbufLoader.new
+        loader = GdkPixbuf::PixbufLoader.new
         File.open("background.jpg", "rb") do |f|
           loader.last_write(f.read)
         end
diff --git a/gtk2/sample/gtk-demo/cairo-image.rb b/gtk2/sample/gtk-demo/cairo-image.rb
index b102989..8827d6b 100644
--- a/gtk2/sample/gtk-demo/cairo-image.rb
+++ b/gtk2/sample/gtk-demo/cairo-image.rb
@@ -18,7 +18,7 @@ module Demo
 
     def draw(cr)
       cr.save do
-        loader = Gdk::PixbufLoader.new
+        loader = GdkPixbuf::PixbufLoader.new
         File.open("background.jpg", "rb") do |f|
           loader.last_write(f.read)
         end
diff --git a/gtk2/sample/gtk-demo/iconview.rb b/gtk2/sample/gtk-demo/iconview.rb
index cb2ac9c..b385b37 100644
--- a/gtk2/sample/gtk-demo/iconview.rb
+++ b/gtk2/sample/gtk-demo/iconview.rb
@@ -37,10 +37,10 @@ puts path
 
     def initialize
       super('Gtk::IconView demo')
-      @file_pixbuf = Gdk::Pixbuf.new(Demo.find_file("gnome-fs-regular.png"))
-      @folder_pixbuf = Gdk::Pixbuf.new(Demo.find_file("gnome-fs-directory.png"))
+      @file_pixbuf = GdkPixbuf::Pixbuf.new(:file => Demo.find_file("gnome-fs-regular.png"))
+      @folder_pixbuf = GdkPixbuf::Pixbuf.new(:file => Demo.find_file("gnome-fs-directory.png"))
 
-      @store = Gtk::ListStore.new(String, String, TrueClass, Gdk::Pixbuf)
+      @store = Gtk::ListStore.new(String, String, TrueClass, GdkPixbuf::Pixbuf)
       @parent = "/"
 
       @store.set_default_sort_func do |a, b|
diff --git a/gtk2/sample/gtk-demo/images.rb b/gtk2/sample/gtk-demo/images.rb
index e0edb91..642590a 100644
--- a/gtk2/sample/gtk-demo/images.rb
+++ b/gtk2/sample/gtk-demo/images.rb
@@ -6,7 +6,7 @@
 = Images
 
 Gtk::Image is used to display an image; the image can be in a number of formats.
-Typically, you load an image into a Gdk::Pixbuf, then display the pixbuf.
+Typically, you load an image into a GdkPixbuf::Pixbuf, then display the pixbuf.
 
 This demo code shows some of the more obscure cases, in the simple
 case a call to Gtk::Image.new is all you need.
@@ -55,7 +55,7 @@ module Demo
       pixbuf = nil
       begin
 	filename = Demo.find_file('gtk-logo-rgb.gif')
-	pixbuf = Gdk::Pixbuf.new(filename)
+	pixbuf = GdkPixbuf::Pixbuf.new(:file => filename)
       rescue
 	# This code shows off error handling. You can just use
 	# Gtk::Image.new instead if you don't want to report
@@ -159,7 +159,7 @@ module Demo
 	  @pixbuf_loader = nil
 	end
 	
-	@pixbuf_loader = Gdk::PixbufLoader.new
+	@pixbuf_loader = GdkPixbuf::PixbufLoader.new
 	
 	@pixbuf_loader.signal_connect('area_prepared') do |loader|
 	  pixbuf = loader.pixbuf
diff --git a/gtk2/sample/gtk-demo/pixbufs.rb b/gtk2/sample/gtk-demo/pixbufs.rb
index b3616cb..1e15dd0 100644
--- a/gtk2/sample/gtk-demo/pixbufs.rb
+++ b/gtk2/sample/gtk-demo/pixbufs.rb
@@ -5,7 +5,7 @@
 =begin
 = Pixbufs
 
-A Gdk::Pixbuf represents an image, normally in RGB or RGBA format.
+A GdkPixbuf::Pixbuf represents an image, normally in RGB or RGBA format.
 Pixbufs are normally used to load files from disk and perform
 image scaling.
 
@@ -51,9 +51,11 @@ module Demo
 
 	set_size_request(@background.width, @background.height)
 
-	@frame = Gdk::Pixbuf.new(Gdk::Pixbuf::COLORSPACE_RGB,
-				 false, 8,
-				 @background.width, @background.height)
+	@frame = GdkPixbuf::Pixbuf.new(:colorspace => :rgb,
+				                        :has_alpha => false,
+                                :bits_per_sample => 8,
+                                :width => @background.width,
+                                :height => @background.height)
 
 	@da = Gtk::DrawingArea.new
 
@@ -96,12 +98,12 @@ module Demo
       # in the location where the file is installed.
       #
       filename = Demo.find_file(BACKGROUND_NAME)
-      @background = Gdk::Pixbuf.new(filename)
+      @background = GdkPixbuf::Pixbuf.new(:file => filename)
 
       IMAGE_NAMES.each_with_index do |basename, i|
 	filename = Demo.find_file(basename)
 
-	@images[i] = Gdk::Pixbuf.new(filename)
+	@images[i] = GdkPixbuf::Pixbuf.new(:file => filename)
       end
     end
 
@@ -154,7 +156,7 @@ module Demo
         dest = r1.intersect(r2)
         if dest
           @frame.composite!(image, dest.x, dest.y, dest.width, dest.height,
-                            xpos, ypos, k, k, Gdk::Pixbuf::INTERP_NEAREST,
+                            xpos, ypos, k, k, :nearest,
                             if (i & 1) == 1
                               [
                                 127,
diff --git a/gtk2/sample/gtk-demo/stock_browser.rb b/gtk2/sample/gtk-demo/stock_browser.rb
index ae29c0e..c813099 100644
--- a/gtk2/sample/gtk-demo/stock_browser.rb
+++ b/gtk2/sample/gtk-demo/stock_browser.rb
@@ -147,7 +147,7 @@ module Demo
 	    # Make the result the proper size for our thumbnail
 	    w, h = Gtk::IconSize.lookup(size)
 
-	    scaled = info.small_icon.scale(w, h, Gdk::Pixbuf::INTERP_BILINEAR)
+	    scaled = info.small_icon.scale(w, h, GdkPixbuf::Pixbuf::INTERP_BILINEAR)
 	    info.small_icon = scaled
 	  end
 
diff --git a/gtk2/sample/gtk-demo/textview.rb b/gtk2/sample/gtk-demo/textview.rb
index a948712..0f8debb 100644
--- a/gtk2/sample/gtk-demo/textview.rb
+++ b/gtk2/sample/gtk-demo/textview.rb
@@ -188,14 +188,14 @@ module Demo
       # 
 
       filename = Demo.find_file("gtk-logo-rgb.gif")
-      pixbuf = Gdk::Pixbuf.new(filename) if filename
+      pixbuf = GdkPixbuf::Pixbuf.new(:file => filename) if filename
 
       unless pixbuf
 	$stderr.print "Failed to load image file gtk-logo-rgb.gif\n"
 	exit 1
       end
 
-      scaled = pixbuf.scale(32, 32, Gdk::Pixbuf::INTERP_BILINEAR)
+      scaled = pixbuf.scale(32, 32, :bilinear)
       pixbuf = scaled
 
       ##
diff --git a/gtk2/sample/misc/aboutdialog.rb b/gtk2/sample/misc/aboutdialog.rb
index 812ffe8..cbcfcb4 100644
--- a/gtk2/sample/misc/aboutdialog.rb
+++ b/gtk2/sample/misc/aboutdialog.rb
@@ -31,7 +31,7 @@ a.comments  = "This is a sample script for Gtk::AboutDialog"
 a.copyright = "Copyright (C) 2005 Ruby-GNOME2 Project"
 a.documenters = ["Documenter 1 <no1 at foo.bar.com>", "Documenter 2 <no2 at foo.bar.com>"]
 a.license   = "This program is licenced under the same licence as Ruby-GNOME2."
-a.logo      = Gdk::Pixbuf.new("gnome-logo-icon.png")
+a.logo      = GdkPixbuf::Pixbuf.new(:file => "gnome-logo-icon.png")
 a.program_name = "Gtk::AboutDialog sample"
 a.translator_credits = "Translator 1\nTranslator 2\n"
 a.version   = "1.0.0"
diff --git a/gtk2/sample/misc/combobox.rb b/gtk2/sample/misc/combobox.rb
index 23242bd..4aefe9b 100644
--- a/gtk2/sample/misc/combobox.rb
+++ b/gtk2/sample/misc/combobox.rb
@@ -35,7 +35,7 @@ end
 #
 # Icon and text
 #
-model = Gtk::ListStore.new(Gdk::Pixbuf, String)
+model = Gtk::ListStore.new(GdkPixbuf::Pixbuf, String)
 [[Gtk::Stock::QUIT, "quit"],
  [Gtk::Stock::CANCEL, "cancel"],
  [Gtk::Stock::OK, "ok"]].each do |stock, name|
diff --git a/gtk2/sample/misc/iconview.rb b/gtk2/sample/misc/iconview.rb
index 5c06c4e..ef2625d 100644
--- a/gtk2/sample/misc/iconview.rb
+++ b/gtk2/sample/misc/iconview.rb
@@ -13,7 +13,7 @@ require 'gtk2'
 TEXT_COLUMN   = 0
 PIXBUF_COLUMN = 1
 
-model = Gtk::ListStore.new(String, Gdk::Pixbuf)
+model = Gtk::ListStore.new(String, GdkPixbuf::Pixbuf)
 
 iv = Gtk::IconView.new(model)
 
@@ -23,7 +23,7 @@ iv.pixbuf_column = PIXBUF_COLUMN
 Dir.glob("../gtk-demo/gnome*.png").each do |f|
   iter = model.append
   iter[TEXT_COLUMN]   = File.basename(f)
-  iter[PIXBUF_COLUMN] = Gdk::Pixbuf.new(f)
+  iter[PIXBUF_COLUMN] = GdkPixbuf::Pixbuf.new(:file => f)
 end
 
 iv.signal_connect("item_activated") do |iv, path|
diff --git a/gtk2/sample/misc/itemfactory.rb b/gtk2/sample/misc/itemfactory.rb
index 71629b5..1bcfc40 100644
--- a/gtk2/sample/misc/itemfactory.rb
+++ b/gtk2/sample/misc/itemfactory.rb
@@ -56,7 +56,7 @@ ifp.create_items([
                    ["/_Misc", "<LastBranch>"],
                    ["/_Misc/Tearoff", "<Tearoff>"],
                    ["/_Misc/Title", "<Title>"],
-                   ["/_Misc/Image", "<ImageItem>", "", Gdk::Pixbuf.new("gnome-logo-icon.png"), cal_misc, 1],
+                   ["/_Misc/Image", "<ImageItem>", "", GdkPixbuf::Pixbuf.new(:file => "gnome-logo-icon.png"), cal_misc, 1],
                    ["/_Misc/Separator", "<Separator>"],
                    ["/_Misc/Item", "<Item>", nil, nil, cal_misc, 2]
                  ])
diff --git a/gtk2/sample/misc/itemfactory2.rb b/gtk2/sample/misc/itemfactory2.rb
index 64dd337..7fc3b17 100644
--- a/gtk2/sample/misc/itemfactory2.rb
+++ b/gtk2/sample/misc/itemfactory2.rb
@@ -60,7 +60,7 @@ ifp.create_item("/_Misc", "<LastBranch>")
 ifp.create_item("/_Misc/Tearoff", "<Tearoff>")
 ifp.create_item("/_Misc/Title", "<Title>")
 ifp.create_item("/_Misc/Seperator", "<Separator>")
-ifp.create_item("/_Misc/Image", "<ImageItem>", "", Gdk::Pixbuf.new("gnome-logo-icon.png")) do 
+ifp.create_item("/_Misc/Image", "<ImageItem>", "", GdkPixbuf::Pixbuf.new(:file => "gnome-logo-icon.png")) do 
   p "ImageItem"
 end
 
diff --git a/gtk2/sample/misc/to_drawable.rb b/gtk2/sample/misc/to_drawable.rb
index 46844f8..8a2cfa3 100644
--- a/gtk2/sample/misc/to_drawable.rb
+++ b/gtk2/sample/misc/to_drawable.rb
@@ -1,6 +1,6 @@
 #!/usr/bin/env ruby
 =begin
-  to_drawable.rb - Gdk::Pixbuf(GDK methods) sample script.
+  to_drawable.rb - GdkPixbuf::Pixbuf(GDK methods) sample script.
 
   Copyright (c) 2002-2006 Ruby-GNOME2 Project Team 
   This program is licenced under the same licence as Ruby-GNOME2.
@@ -16,7 +16,7 @@ unless filename
   exit(1)
 end
 
-pixbuf = Gdk::Pixbuf.new(filename)
+pixbuf = GdkPixbuf::Pixbuf.new(:file => filename)
 
 w = Gtk::Window.new("Drawable sample")
 w.realize
diff --git a/gtk2/sample/misc/treeview.rb b/gtk2/sample/misc/treeview.rb
index de0257c..59bcd19 100644
--- a/gtk2/sample/misc/treeview.rb
+++ b/gtk2/sample/misc/treeview.rb
@@ -13,7 +13,7 @@ require 'gtk2'
 window = Gtk::Window.new("Gtk::TreeView sample")
 
 # Create data
-model = Gtk::TreeStore.new(String, String, Gdk::Color, Float, Gdk::Pixbuf)
+model = Gtk::TreeStore.new(String, String, Gdk::Color, Float, GdkPixbuf::Pixbuf)
 
 # column 1
 root_iter = model.append(nil)
diff --git a/gtk2/test/test_gdk_pixbuf.rb b/gtk2/test/test_gdk_pixbuf.rb
index 3c80a3b..9a91360 100644
--- a/gtk2/test/test_gdk_pixbuf.rb
+++ b/gtk2/test/test_gdk_pixbuf.rb
@@ -23,12 +23,12 @@ class TestGdkPixbuf < Test::Unit::TestCase
     width, height = gdk_window.size
 
     assert_nothing_raised do
-      Gdk::Pixbuf.from_drawable(colormap,
-                                gdk_window,
-                                src_x,
-                                src_y,
-                                width,
-                                height)
+      GdkPixbuf::Pixbuf.from_drawable(colormap,
+                                      gdk_window,
+                                      src_x,
+                                      src_y,
+                                      width,
+                                      height)
     end
   end
 end
diff --git a/gtk3/ext/gtk3/rb-gtk3.c b/gtk3/ext/gtk3/rb-gtk3.c
index ddb2fb9..3fd43d5 100644
--- a/gtk3/ext/gtk3/rb-gtk3.c
+++ b/gtk3/ext/gtk3/rb-gtk3.c
@@ -575,6 +575,21 @@ rb_gtk3_ui_manager_mark(gpointer object)
 }
 #endif
 
+static void
+rb_gtk3_text_tag_table_mark_body(GtkTextTag *tag, gpointer data)
+{
+    rbgobj_gc_mark_instance(tag);
+}
+
+static void
+rb_gtk3_text_tag_table_mark(gpointer object)
+{
+    GtkTextTagTable *table;
+
+    table = GTK_TEXT_TAG_TABLE(object);
+    gtk_text_tag_table_foreach(table, rb_gtk3_text_tag_table_mark_body, NULL);
+}
+
 void
 rbgtk3_class_init_func(gpointer g_class, G_GNUC_UNUSED gpointer class_data)
 {
@@ -614,6 +629,8 @@ Init_gtk3(void)
 #ifndef RB_GTK_UI_MANAGER_IS_DEPRECATED
     rbgobj_register_mark_func(GTK_TYPE_UI_MANAGER, rb_gtk3_ui_manager_mark);
 #endif
+    rbgobj_register_mark_func(GTK_TYPE_TEXT_TAG_TABLE,
+                              rb_gtk3_text_tag_table_mark);
 
     rbgtk3_cell_layout_init();
     rbgtk3_container_init();
diff --git a/gtk3/lib/gtk3/container.rb b/gtk3/lib/gtk3/container.rb
index 9c203c0..48d1b62 100644
--- a/gtk3/lib/gtk3/container.rb
+++ b/gtk3/lib/gtk3/container.rb
@@ -16,13 +16,6 @@
 
 module Gtk
   class Container
-    class << self
-      alias_method :child_properties_raw, :child_properties
-      def child_properties
-        child_properties_raw[0]
-      end
-    end
-
     include Enumerable
 
     alias_method :add_raw, :add
diff --git a/gtk3/lib/gtk3/deprecated.rb b/gtk3/lib/gtk3/deprecated.rb
index 4ad295b..9cb737c 100644
--- a/gtk3/lib/gtk3/deprecated.rb
+++ b/gtk3/lib/gtk3/deprecated.rb
@@ -297,7 +297,7 @@ module Gtk
       case icon
       when Symbol
         context.set_icon(:stock_id => icon, :hot_x => hot_x, :hot_y => hot_y)
-      when Gdk::Pixbuf
+      when GdkPixbuf::Pixbuf
         context.set_icon(:pixbuf => icon, :hot_x => hot_x, :hot_y => hot_y)
       when Gtk::Widget
         context.set_icon(:widget => icon, :hot_x => hot_x, :hot_y => hot_y)
@@ -523,7 +523,7 @@ module Gtk
         end
       when Symbol
         [{:stock => image, :size => size}]
-      when Gdk::Pixbuf
+      when GdkPixbuf::Pixbuf
         [{:pixbuf => image}]
       when Gtk::IconSet
         [{:icon_set => image, :size => size}]
@@ -531,7 +531,7 @@ module Gtk
         [{:icon => image, :size => size}]
       else
         message =
-          "Image must be String, Symbol, Gdk::Pixbuf, Gtk::IconSet or " +
+          "Image must be String, Symbol, GdkPixbuf::Pixbuf, Gtk::IconSet or " +
           "Gio::Icon: #{image.inspect}"
         raise ArgumentError, message
       end
diff --git a/gtk3/lib/gtk3/image.rb b/gtk3/lib/gtk3/image.rb
index d31492c..8a748bc 100644
--- a/gtk3/lib/gtk3/image.rb
+++ b/gtk3/lib/gtk3/image.rb
@@ -21,7 +21,7 @@ module Gtk
     # given.
     #
     # @param Hash{Symbol => Gtk::Stock, String, Gtk::IconSet, Gio::Icon,
-    #                       Gdk::Pixbuf, Gdk::PixbufAnimation, Cairo::Surface,
+    #                       GdkPixbuf::Pixbuf, GdkPixbuf::PixbufAnimation, Cairo::Surface,
     #                       Fixnum}
     #
     # @example Create an empty image.
@@ -45,18 +45,18 @@ module Gtk
     #   icon = Gio::ThemedIcon.new 'gtk-open'
     #   image = Gtk::Image.new :icon => icon, :size => :dialog
     #
-    # @example Create an image from a Gdk::Pixbuf.
-    #   pixbuf = Gdk::Pixbuf.new 'path/to/the/image.png'
+    # @example Create an image from a GdkPixbuf::Pixbuf.
+    #   pixbuf = GdkPixbuf::Pixbuf.new(:file => 'path/to/the/image.png')
     #   image = Gtk::Image.new :pixbuf => pixbuf
     #
     # @example Create an image from an Gtk::IconSet, that itself is created
-    #          from a Gdk::Pixbuf.
-    #   pixbuf = Gdk::Pixbuf.new 'path/to/the/image.png'
+    #          from a GdkPixbuf::Pixbuf.
+    #   pixbuf = GdkPixbuf::Pixbuf.new(:file => 'path/to/the/image.png')
     #   iconSet = Gtk::IconSet.new pixbuf
     #   image = Gtk::Image.new :icon_set => iconSet, :size => :dialog
     #
-    # @example Create an image from a Gdk::PixbufAnimation
-    #   pixAnim = Gdk::PixbufAnimation.new 'anim.gif'
+    # @example Create an image from a GdkPixbuf::PixbufAnimation
+    #   pixAnim = GdkPixbuf::PixbufAnimation.new 'anim.gif'
     #   image = Gtk::Image.new :animation => pixAnim
     #
     # @example Create an image from a file in a resource file
diff --git a/gtk3/lib/gtk3/loader.rb b/gtk3/lib/gtk3/loader.rb
index 0d64819..d195b33 100644
--- a/gtk3/lib/gtk3/loader.rb
+++ b/gtk3/lib/gtk3/loader.rb
@@ -1,4 +1,4 @@
-# Copyright (C) 2014-2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2014-2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -142,6 +142,7 @@ module Gtk
       require "gtk3/text-buffer"
       require "gtk3/text-iter"
       require "gtk3/text-tag-table"
+      require "gtk3/text-view"
       require "gtk3/toggle-action"
       require "gtk3/toggle-button"
       require "gtk3/tool-button"
@@ -239,10 +240,15 @@ module Gtk
       end
     end
 
-    def enum_class_name(info)
-      case info.name
-      when /\ARc/
-        "RC#{$POSTMATCH}"
+    def rubyish_class_name(info)
+      case info
+      when GObjectIntrospection::EnumInfo
+        case info.name
+        when /\ARc/
+          "RC#{$POSTMATCH}"
+        else
+          super
+        end
       else
         super
       end
diff --git a/gtk3/lib/gtk3/text-buffer.rb b/gtk3/lib/gtk3/text-buffer.rb
index c94659b..5d8f555 100644
--- a/gtk3/lib/gtk3/text-buffer.rb
+++ b/gtk3/lib/gtk3/text-buffer.rb
@@ -29,6 +29,37 @@ module Gtk
       tag
     end
 
+    alias_method :add_mark_raw, :add_mark
+    def add_mark(mark, where)
+      @marks ||= {}
+      add_mark_raw(mark, where)
+      mark_name = mark.name
+      @marks[mark_name] = mark if mark_name
+    end
+
+    alias_method :create_mark_raw, :create_mark
+    def create_mark(name, where, options={})
+      if options == true or options == false
+        options = {:left_gravity => options}
+      end
+      left_gravity = options[:left_gravity]
+      left_gravity = true if left_gravity.nil?
+      @marks ||= {}
+      if name.nil?
+        create_mark_raw(name, where, left_gravity)
+      else
+        @marks[name] = create_mark_raw(name, where, left_gravity)
+      end
+    end
+
+    alias_method :delete_mark_raw, :delete_mark
+    def delete_mark(mark)
+      @marks ||= {}
+      mark_name = mark.name
+      delete_mark_raw(mark)
+      @marks.delete(mark_name) if mark_name
+    end
+
     # prevent collision with deprecated methods.
     alias_method :get_iter_at_line_offset_raw,  :get_iter_at_line_offset
     alias_method :get_iter_at_line_index_raw,   :get_iter_at_line_index
@@ -99,7 +130,7 @@ module Gtk
         insert_interactive(iter, target, default_editable)
       else
         case target
-        when Gdk::Pixbuf
+        when GdkPixbuf::Pixbuf
           insert_pixbuf_raw(iter, target)
         when TextChildAnchor
           insert_text_child_anchor_raw(iter, target)
@@ -148,19 +179,9 @@ module Gtk
       end
     end
 
-    alias_method :serialize_formats_raw, :serialize_formats
-    def serialize_formats
-      serialize_formats_raw[0]
-    end
-
-    alias_method :deserialize_formats_raw, :deserialize_formats
-    def deserialize_formats
-      deserialize_formats_raw[0]
-    end
-
     alias_method :serialize_raw, :serialize
     def serialize(*arguments)
-      serialize_raw(*arguments)[0].pack("C*")
+      serialize_raw(*arguments).pack("C*")
     end
 
     alias_method :selection_bounds_raw, :selection_bounds
diff --git a/gtk3/lib/gtk3/text-view.rb b/gtk3/lib/gtk3/text-view.rb
new file mode 100644
index 0000000..0335102
--- /dev/null
+++ b/gtk3/lib/gtk3/text-view.rb
@@ -0,0 +1,53 @@
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+module Gtk
+  class TextView
+    def get_iter_at(options)
+      location = options[:location]
+      position = options[:position]
+
+      if location
+        get_iter_at_location(*location)
+      elsif position
+        get_iter_at_position(*position)
+      else
+        message = "must specify :location or :position: #{options.inspect}"
+        raise ArgumentError, message
+      end
+    end
+
+    alias_method :get_iter_at_location_raw, :get_iter_at_location
+    def get_iter_at_location(x, y)
+      found, iter = get_iter_at_location_raw(x, y)
+      if found
+        iter
+      else
+        nil
+      end
+    end
+
+    alias_method :get_iter_at_position_raw, :get_iter_at_position
+    def get_iter_at_position(x, y)
+      found, iter, trailing = get_iter_at_position_raw(x, y)
+      if found
+        [iter, trailing]
+      else
+        nil
+      end
+    end
+  end
+end
diff --git a/gtk3/lib/gtk3/tree-model.rb b/gtk3/lib/gtk3/tree-model.rb
index 78a4d85..0437d92 100644
--- a/gtk3/lib/gtk3/tree-model.rb
+++ b/gtk3/lib/gtk3/tree-model.rb
@@ -100,6 +100,11 @@ module Gtk
       set(iter, columns, _values)
     end
 
+    alias_method :get_column_type_raw, :get_column_type
+    def get_column_type(index)
+      (@column_types ||= {})[index] ||= get_column_type_raw(index)
+    end
+
     private
     def setup_iter(iter)
       iter.model = self
diff --git a/gtk3/lib/gtk3/tree-view.rb b/gtk3/lib/gtk3/tree-view.rb
index 5492f4d..b3c9771 100644
--- a/gtk3/lib/gtk3/tree-view.rb
+++ b/gtk3/lib/gtk3/tree-view.rb
@@ -61,5 +61,30 @@ module Gtk
         raise ArgumentError, "wrong number of arguments (#{args.size} for 2..4)"
       end
     end
+
+    alias_method :expand_row_raw, :expand_row
+    def expand_row(path, options={})
+      if options == true or options == false
+        open_all = options
+      else
+        open_all = options[:open_all]
+        open_all = true if open_all.nil?
+      end
+
+      expand_row_raw(path, open_all)
+    end
+
+    private
+    def create_signal_handler(signal_name, callback)
+      case signal_name
+      when "row-collapsed", "row-expanded"
+        lambda do |tree_view, iter, path, *extra_args|
+          iter.model = tree_view.model
+          callback.call(tree_view, iter, path, *extra_args)
+        end
+      else
+        super
+      end
+    end
   end
 end
diff --git a/gtk3/lib/gtk3/widget.rb b/gtk3/lib/gtk3/widget.rb
index d23a03e..848ddff 100644
--- a/gtk3/lib/gtk3/widget.rb
+++ b/gtk3/lib/gtk3/widget.rb
@@ -50,11 +50,6 @@ module Gtk
         end
       end
 
-      alias_method :style_properties_raw, :style_properties
-      def style_properties
-        style_properties_raw[0]
-      end
-
       alias_method :set_connect_func_raw, :set_connect_func
       def set_connect_func(&block)
         set_connect_func_raw do |*args|
diff --git a/gtk3/sample/gtk-demo/TODO b/gtk3/sample/gtk-demo/TODO
index 3b13529..e36ae20 100644
--- a/gtk3/sample/gtk-demo/TODO
+++ b/gtk3/sample/gtk-demo/TODO
@@ -1,6 +1,10 @@
 # C version (3.19.1) versus Ruby version
 
-C version             Ruby version    Updated
+# Ruby version : is there already a ruby version of the demo
+# Updated 3.19 : if there is a ruby version is it udapted to 3.19
+# Changed? 3.20: does this demo has changed with version 3.20
+#
+C version             Ruby version    Updated 3.20
 application.c           no              no
 assistant.c             ok              ok
 builder.c               ok              ok
@@ -25,6 +29,7 @@ expander.c              ok              ok
 filtermodel.c           ok              ok
 flowbox.c               no              no
 font_features.c         ok              ok
+foreigndrawing          no              no
 gestures.c              no              no
 glarea.c                no              no
 headerbar.c             ok              ok
@@ -45,11 +50,11 @@ overlay.c               ok              ok
 overlay2.c              ok              ok
 panes.c                 ok              ok
 pickers.c               ok              ok
-pixbufs.c               ok              no
+pixbufs.c               ok              ok
 popover.c               ok              ok
 printing.c              ok              ok
 revealer.c              ok              ok
-rotated_text.c          ok              no
+rotated_text.c          ok              ok
 scale.c                 ok              ok
 search_entry.c          no              no
 search_entry2.c         ok              ok
@@ -60,11 +65,11 @@ spinbutton.c            no              no
 spinner.c               ok              ok
 stack.c                 ok              ok
 textmask.c              ok              ok
-textscroll.c            no              no
+textscroll.c            ok              ok
 textview.c              ok              no
 theming_style_classes.c ok              ok
 toolpalette.c           no              no
-transparent.c           no              no
+transparent.c           ok              ok
 tree_store.c            ok              no
 
 # Ruby version
@@ -72,4 +77,3 @@ Check all the ruby demos that doesn't correspond to a C version.
 
 # Demo that are not to be done
 pagesetup.c
-
diff --git a/gtk3/sample/gtk-demo/application.ui b/gtk3/sample/gtk-demo/application.ui
index b3d8753..1ff1b4b 100644
--- a/gtk3/sample/gtk-demo/application.ui
+++ b/gtk3/sample/gtk-demo/application.ui
@@ -1,100 +1,123 @@
 <?xml version="1.0"?>
 <interface>
-  <object class="GtkGrid" id="grid">
+  <template class="DemoApplicationWindow" parent="GtkApplicationWindow">
+    <property name="title" translatable="yes">Application Class</property>
+    <property name="default-width">200</property>
+    <property name="default-height">200</property>
+    <property name="icon-name">document-open</property>
     <child>
-      <object class="GtkToolbar" id="toolbar">
-        <property name="hexpand">1</property>
-        <style>
-          <class name="primary-toolbar"/>
-        </style>
-        <child>
-          <object class="GtkMenuToolButton" id="menutool">
-            <property name="icon-name">document-open</property>
-          </object>
-        </child>
+      <object class="GtkGrid">
+        <property name="visible">1</property>
         <child>
-          <object class="GtkToolButton" id="quit">
-            <property name="icon-name">application-exit</property>
-            <property name="action-name">app.quit</property>
+          <object class="GtkToolbar">
+            <property name="visible">1</property>
+            <property name="hexpand">1</property>
+            <style>
+              <class name="primary-toolbar"/>
+            </style>
+            <child>
+              <object class="GtkMenuToolButton" id="menutool">
+                <property name="visible">1</property>
+                <property name="icon-name">document-open</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkToolButton">
+                <property name="visible">1</property>
+                <property name="icon-name">application-exit</property>
+                <property name="action-name">app.quit</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkSeparatorToolItem">
+                <property name="visible">1</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkToolButton">
+                <property name="visible">1</property>
+                <property name="icon-name">applications-other</property>
+                <property name="action-name">win.logo</property>
+              </object>
+            </child>
           </object>
+          <packing>
+            <property name="left-attach">0</property>
+            <property name="top-attach">0</property>
+          </packing>
         </child>
         <child>
-          <object class="GtkSeparatorToolItem" id="sep"/>
-        </child>
-        <child>
-          <object class="GtkToolButton" id="logo">
-            <property name="icon-name">applications-other</property>
-            <property name="action-name">win.logo</property>
-          </object>
-        </child>
-      </object>
-      <packing>
-        <property name="left-attach">0</property>
-        <property name="top-attach">0</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkInfoBar" id="infobar">
-        <property name="no-show-all">1</property>
-        <property name="hexpand">1</property>
-        <child internal-child="content_area">
-          <object class="GtkBox" id="content_area">
-            <child>
-              <object class="GtkLabel" id="message">
-                <property name="visible">1</property>
-                <property name="hexpand">1</property>
+          <object class="GtkInfoBar" id="infobar">
+            <property name="no-show-all">1</property>
+            <property name="hexpand">1</property>
+            <child internal-child="content_area">
+              <object class="GtkBox" id="content_area">
+                <child>
+                  <object class="GtkLabel" id="message">
+                    <property name="visible">1</property>
+                    <property name="hexpand">1</property>
+                  </object>
+                </child>
+              </object>
+            </child>
+            <child internal-child="action_area">
+              <object class="GtkBox">
+                <child>
+                  <object class="GtkButton">
+                    <property name="visible">1</property>
+                    <property name="valign">center</property>
+                    <property name="label" translatable="yes">_OK</property>
+                    <property name="use_underline">1</property>
+                    <signal name="clicked" handler="clicked_cb"/>
+                  </object>
+                </child>
               </object>
             </child>
           </object>
+          <packing>
+            <property name="left-attach">0</property>
+            <property name="top-attach">1</property>
+          </packing>
         </child>
-        <child internal-child="action_area">
-          <object class="GtkBox" id="action_area">
+        <child>
+          <object class="GtkScrolledWindow">
+            <property name="visible">1</property>
+            <property name="shadow-type">in</property>
             <child>
-              <object class="GtkButton" id="button">
+              <object class="GtkTextView">
                 <property name="visible">1</property>
-                <property name="valign">center</property>
-                <property name="label" translatable="yes">_OK</property>
-                <property name="use_underline">1</property>
+                <property name="hexpand">1</property>
+                <property name="vexpand">1</property>
+                <property name="buffer">buffer</property>
               </object>
             </child>
           </object>
+          <packing>
+            <property name="left-attach">0</property>
+            <property name="top-attach">2</property>
+          </packing>
         </child>
-      </object>
-      <packing>
-        <property name="left-attach">0</property>
-        <property name="top-attach">1</property>
-      </packing>
-    </child>
-    <child>
-      <object class="GtkScrolledWindow" id="sw">
-        <property name="shadow-type">in</property>
         <child>
-          <object class="GtkTextView" id="contents">
+          <object class="GtkStatusbar" id="status">
             <property name="hexpand">1</property>
-            <property name="vexpand">1</property>
+            <property name="visible">1</property>
           </object>
+          <packing>
+            <property name="left-attach">0</property>
+            <property name="top-attach">3</property>
+          </packing>
         </child>
       </object>
-      <packing>
-        <property name="left-attach">0</property>
-        <property name="top-attach">2</property>
-      </packing>
     </child>
-    <child>
-      <object class="GtkStatusbar" id="status">
-        <property name="hexpand">1</property>
-        <property name="visible">1</property>
-      </object>
-      <packing>
-        <property name="left-attach">0</property>
-        <property name="top-attach">3</property>
-      </packing>
-    </child>
-  </object>
+  </template>
   <menu id="toolmenu">
     <item>
       <attribute name="label">File1</attribute>
       <attribute name="action">win.file1</attribute>
     </item>
   </menu>
+  <object class="GtkTextBuffer" id="buffer">
+    <signal name="changed" handler="update_statusbar"/>
+    <signal name="mark-set" handler="mark_set_callback"/>
+  </object>
 </interface>
diff --git a/gtk3/sample/gtk-demo/appmenu.ui b/gtk3/sample/gtk-demo/appmenu.ui
new file mode 100644
index 0000000..d52693b
--- /dev/null
+++ b/gtk3/sample/gtk-demo/appmenu.ui
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <!-- interface-requires gtk+ 3.10 -->
+  <menu id="appmenu">
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">About</attribute>
+        <attribute name="action">app.about</attribute>
+      </item>
+    </section>
+    <section>
+      <item>
+        <attribute name="label" translatable="yes">_Quit</attribute>
+        <attribute name="action">app.quit</attribute>
+        <attribute name="accel"><Primary>q</attribute>
+      </item>
+    </section>
+  </menu>
+</interface>
diff --git a/gtk3/sample/gtk-demo/assistant.rb b/gtk3/sample/gtk-demo/assistant.rb
index 5ec588e..6dd2071 100644
--- a/gtk3/sample/gtk-demo/assistant.rb
+++ b/gtk3/sample/gtk-demo/assistant.rb
@@ -60,6 +60,7 @@ module AssistantDemo
 
     entry = Gtk::Entry.new
     entry.activates_default = true
+    entry.valign = :center
     box.pack_start(entry, :expand => true, :fill => true, :padding => 0)
 
     entry.signal_connect "changed" do |widget|
diff --git a/gtk3/sample/gtk-demo/css_accordion.css b/gtk3/sample/gtk-demo/css_accordion.css
index 957999a..ef28451 100644
--- a/gtk3/sample/gtk-demo/css_accordion.css
+++ b/gtk3/sample/gtk-demo/css_accordion.css
@@ -7,7 +7,7 @@
     font: Cantarell 20px;
 }
 
-GtkWindow {
+window {
     background: linear-gradient(153deg, #151515, #151515 5px, transparent 5px) 0 0,
                 linear-gradient(333deg, #151515, #151515 5px, transparent 5px) 10px 5px,
                 linear-gradient(153deg, #222, #222 5px, transparent 5px) 0 5px,
@@ -18,7 +18,7 @@ GtkWindow {
     background-size: 20px 20px;
 }
 
-.button {
+button {
     color: black;
     background-color: #bbb;
     border-style: solid;
@@ -28,25 +28,25 @@ GtkWindow {
     padding: 12px 4px;
 }
 
-.button:first-child {
+button:first-child {
     border-radius: 5px 0 0 5px;
 }
 
-.button:last-child {
+button:last-child {
     border-radius: 0 5px 5px 0;
     border-width: 2px;
 }
 
-.button:hover {
+button:hover {
     padding: 12px 48px;
     background-color: #4870bc;
 }
 
-.button *:hover {
+button *:hover {
     color: white;
 }
 
-.button:hover:active,
-.button:active {
+button:hover:active,
+button:active {
     background-color: #993401;
 }
diff --git a/gtk3/sample/gtk-demo/css_accordion.rb b/gtk3/sample/gtk-demo/css_accordion.rb
index 9628f9d..13b2c61 100644
--- a/gtk3/sample/gtk-demo/css_accordion.rb
+++ b/gtk3/sample/gtk-demo/css_accordion.rb
@@ -1,8 +1,8 @@
-# Copyright (c) 2015 Ruby-GNOME2 Project Team
+# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team
 # This program is licenced under the same licence as Ruby-GNOME2.
 #
 =begin
-= CSS Theming/CSS Accordion
+= Theming/CSS Accordion
 
 A simple accordion demo written using CSS transitions and multiple backgrounds
 =end
diff --git a/gtk3/sample/gtk-demo/css_basics.css b/gtk3/sample/gtk-demo/css_basics.css
index 62dba7a..0b3365f 100644
--- a/gtk3/sample/gtk-demo/css_basics.css
+++ b/gtk3/sample/gtk-demo/css_basics.css
@@ -16,7 +16,7 @@
 }
 
 /* Make sure selections are visible */
-:selected {
+selection {
   background-color: darkGreen;
   color: black;
 }
diff --git a/gtk3/sample/gtk-demo/css_basics.rb b/gtk3/sample/gtk-demo/css_basics.rb
index c6c529b..614e594 100644
--- a/gtk3/sample/gtk-demo/css_basics.rb
+++ b/gtk3/sample/gtk-demo/css_basics.rb
@@ -1,8 +1,8 @@
-# Copyright (c) 2015 Ruby-GNOME2 Project Team
+# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team
 # This program is licenced under the same licence as Ruby-GNOME2.
 #
 =begin
-= CSS Theming/CSS Basics
+= Theming/CSS Basics
 
 Gtk themes are written using CSS. Every widget is build of multiple items
 that you can style very similarly to a regular website.
diff --git a/gtk3/sample/gtk-demo/css_multiplebgs.rb b/gtk3/sample/gtk-demo/css_multiplebgs.rb
index 8b9e783..a9a733f 100644
--- a/gtk3/sample/gtk-demo/css_multiplebgs.rb
+++ b/gtk3/sample/gtk-demo/css_multiplebgs.rb
@@ -1,8 +1,8 @@
-# Copyright (c) 2015 Ruby-GNOME2 Project Team
+# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team
 # This program is licenced under the same licence as Ruby-GNOME2.
 #
 =begin
-=  CSS Theming/Multiple Backgrounds
+=  Theming/Multiple Backgrounds
 
  Gtk themes are written using CSS. Every widget is build of multiple items
  that you can style very similarly to a regular website.
diff --git a/gtk3/sample/gtk-demo/css_pixbufs.css b/gtk3/sample/gtk-demo/css_pixbufs.css
index 226525c..e6d33b0 100644
--- a/gtk3/sample/gtk-demo/css_pixbufs.css
+++ b/gtk3/sample/gtk-demo/css_pixbufs.css
@@ -50,7 +50,7 @@
     100% { background-size: 12px, 96px, 12px, 96px, 12px, 96px, 12px, 96px, auto }
 }
 
-GtkWindow {
+window {
     background-image: url("resource://css_pixbufs/apple-red.png"),
                       url("resource://css_pixbufs/gnome-applets.png"),
                       url("resource://css_pixbufs/gnome-calendar.png"),
@@ -66,7 +66,7 @@ GtkWindow {
 }
 
 /* Make the text editor has a nice style */
-.view, .scrollbar, .pane-separator {
+.view, scrollbar, separator {
   color: black;
   background-color: rgba(255,255,255,0.5);
 }
diff --git a/gtk3/sample/gtk-demo/css_pixbufs.rb b/gtk3/sample/gtk-demo/css_pixbufs.rb
index 0d7a3f6..56bfbf8 100644
--- a/gtk3/sample/gtk-demo/css_pixbufs.rb
+++ b/gtk3/sample/gtk-demo/css_pixbufs.rb
@@ -1,8 +1,8 @@
-# Copyright (c) 2015 Ruby-GNOME2 Project Team
+# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team
 # This program is licenced under the same licence as Ruby-GNOME2.
 #
 =begin
-=  CSS Theming/Animated Backgrounds
+=  Theming/Animated Backgrounds
 
  This demo is done in honour of the Pixbufs demo further down.
  It is done exclusively with CSS as the background of the window.
diff --git a/gtk3/sample/gtk-demo/css_shadows.css b/gtk3/sample/gtk-demo/css_shadows.css
index 6e6b21a..ca7a041 100644
--- a/gtk3/sample/gtk-demo/css_shadows.css
+++ b/gtk3/sample/gtk-demo/css_shadows.css
@@ -19,7 +19,7 @@
   background-size: 29px, 59px, 73px, 109px;
 }
 
-.button {
+button {
   color: black;
   padding: 10px;
   border-radius: 5px;
@@ -27,17 +27,17 @@
   border: 1px transparent solid;
 }
 
-.button:hover {
+button:hover {
   text-shadow: 3px 3px 5px alpha(black, 0.75);
-  icon-shadow: 3px 3px 5px alpha(black, 0.75);
+  -gtk-icon-shadow: 3px 3px 5px alpha(black, 0.75);
   box-shadow: 3px 3px 5px alpha(black, 0.5) inset;
   border: solid 1px alpha(black, 0.75);
 }
 
-.button:active {
+button:active {
   padding: 11px 9px 9px 11px;
   text-shadow: 1px 1px 2.5px alpha(black, 0.6);
-  icon-shadow: 1px 1px 2.5px alpha(black, 0.6);
+  -gtk-icon-shadow: 1px 1px 2.5px alpha(black, 0.6);
 }
 
 
diff --git a/gtk3/sample/gtk-demo/css_shadows.rb b/gtk3/sample/gtk-demo/css_shadows.rb
index e42cf99..50835d2 100644
--- a/gtk3/sample/gtk-demo/css_shadows.rb
+++ b/gtk3/sample/gtk-demo/css_shadows.rb
@@ -1,8 +1,8 @@
-# Copyright (c) 2015 Ruby-GNOME2 Project Team
+# Copyright (c) 2015-2016 Ruby-GNOME2 Project Team
 # This program is licenced under the same licence as Ruby-GNOME2.
 #
 =begin
-=  CSS Theming/Shadows
+=  Theming/Shadows
 
  This demo shows how to use CSS shadows.
 =end
diff --git a/gtk3/sample/gtk-demo/cssview.css b/gtk3/sample/gtk-demo/cssview.css
index 5060c39..a3675c9 100644
--- a/gtk3/sample/gtk-demo/cssview.css
+++ b/gtk3/sample/gtk-demo/cssview.css
@@ -10,12 +10,12 @@
   background-color: #4a90d9;
 }
 
-.scrollbar.trough,
+scrollbar trough,
 .scrollbars-junction {
   background-color: alpha(white, 0.80);
 }
 
-.scrollbar.slider {
+scrollbar slider {
   border-width: 3px;
   border-style: solid;
   border-radius: 10px;
@@ -24,11 +24,11 @@
   background-color: #999;
 }
 
-.scrollbar.slider:prelight {
+scrollbar slider:hover {
   background-color: #555;
 }
 
-.pane-separator {
+paned separator {
   background-color: alpha(white, 0.80);
   background-image: linear-gradient(transparent, transparent 1px, #999 1px, #999 4px, transparent 4px);
   background-size: 40px auto;
@@ -36,6 +36,6 @@
   background-position: center;
 }
 
-.pane-separator:prelight {
+paned separator:hover {
   background-image: linear-gradient(transparent, transparent 1px, #555 1px, #555 4px, transparent 4px);
 }
diff --git a/gtk3/sample/gtk-demo/data/16x16/gtk3-demo-symbolic.symbolic.png b/gtk3/sample/gtk-demo/data/16x16/gtk3-demo-symbolic.symbolic.png
new file mode 100644
index 0000000..945c632
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/16x16/gtk3-demo-symbolic.symbolic.png differ
diff --git a/gtk3/sample/gtk-demo/data/16x16/gtk3-demo.png b/gtk3/sample/gtk-demo/data/16x16/gtk3-demo.png
new file mode 100644
index 0000000..604e6c5
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/16x16/gtk3-demo.png differ
diff --git a/gtk3/sample/gtk-demo/data/22x22/gtk3-demo-symbolic.symbolic.png b/gtk3/sample/gtk-demo/data/22x22/gtk3-demo-symbolic.symbolic.png
new file mode 100644
index 0000000..dbe69aa
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/22x22/gtk3-demo-symbolic.symbolic.png differ
diff --git a/gtk3/sample/gtk-demo/data/22x22/gtk3-demo.png b/gtk3/sample/gtk-demo/data/22x22/gtk3-demo.png
new file mode 100644
index 0000000..9bf42e8
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/22x22/gtk3-demo.png differ
diff --git a/gtk3/sample/gtk-demo/data/24x24/gtk3-demo-symbolic.symbolic.png b/gtk3/sample/gtk-demo/data/24x24/gtk3-demo-symbolic.symbolic.png
new file mode 100644
index 0000000..21d0ac1
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/24x24/gtk3-demo-symbolic.symbolic.png differ
diff --git a/gtk3/sample/gtk-demo/data/24x24/gtk3-demo.png b/gtk3/sample/gtk-demo/data/24x24/gtk3-demo.png
new file mode 100644
index 0000000..7136592
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/24x24/gtk3-demo.png differ
diff --git a/gtk3/sample/gtk-demo/data/256x256/gtk3-demo-symbolic.symbolic.png b/gtk3/sample/gtk-demo/data/256x256/gtk3-demo-symbolic.symbolic.png
new file mode 100644
index 0000000..ef5305d
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/256x256/gtk3-demo-symbolic.symbolic.png differ
diff --git a/gtk3/sample/gtk-demo/data/256x256/gtk3-demo.png b/gtk3/sample/gtk-demo/data/256x256/gtk3-demo.png
new file mode 100644
index 0000000..2a59889
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/256x256/gtk3-demo.png differ
diff --git a/gtk3/sample/gtk-demo/data/32x32/gtk3-demo-symbolic.symbolic.png b/gtk3/sample/gtk-demo/data/32x32/gtk3-demo-symbolic.symbolic.png
new file mode 100644
index 0000000..d212a0f
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/32x32/gtk3-demo-symbolic.symbolic.png differ
diff --git a/gtk3/sample/gtk-demo/data/32x32/gtk3-demo.png b/gtk3/sample/gtk-demo/data/32x32/gtk3-demo.png
new file mode 100644
index 0000000..9d046bb
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/32x32/gtk3-demo.png differ
diff --git a/gtk3/sample/gtk-demo/data/48x48/gtk3-demo-symbolic.symbolic.png b/gtk3/sample/gtk-demo/data/48x48/gtk3-demo-symbolic.symbolic.png
new file mode 100644
index 0000000..93fa6b7
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/48x48/gtk3-demo-symbolic.symbolic.png differ
diff --git a/gtk3/sample/gtk-demo/data/48x48/gtk3-demo.png b/gtk3/sample/gtk-demo/data/48x48/gtk3-demo.png
new file mode 100644
index 0000000..d351788
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/48x48/gtk3-demo.png differ
diff --git a/gtk3/sample/gtk-demo/data/512x512/gtk3-demo-symbolic.symbolic.png b/gtk3/sample/gtk-demo/data/512x512/gtk3-demo-symbolic.symbolic.png
new file mode 100644
index 0000000..7746398
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/512x512/gtk3-demo-symbolic.symbolic.png differ
diff --git a/gtk3/sample/gtk-demo/data/512x512/gtk3-demo.png b/gtk3/sample/gtk-demo/data/512x512/gtk3-demo.png
new file mode 100644
index 0000000..d6d38cb
Binary files /dev/null and b/gtk3/sample/gtk-demo/data/512x512/gtk3-demo.png differ
diff --git a/gtk3/sample/gtk-demo/data/source.svg b/gtk3/sample/gtk-demo/data/source.svg
new file mode 100644
index 0000000..b2eafd9
--- /dev/null
+++ b/gtk3/sample/gtk-demo/data/source.svg
@@ -0,0 +1,2886 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   height="300"
+   id="svg11300"
+   inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png"
+   inkscape:export-xdpi="90.000000"
+   inkscape:export-ydpi="90.000000"
+   inkscape:output_extension="org.inkscape.output.svg.inkscape"
+   inkscape:version="0.48.4 r9939"
+   sodipodi:docname="gtk3-demo.svg"
+   sodipodi:version="0.32"
+   style="display:inline;enable-background:new"
+   version="1.0"
+   width="400">
+  <metadata
+     id="metadata150">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:creator>
+          <cc:Agent>
+            <dc:title>Jakub Steiner</dc:title>
+          </cc:Agent>
+        </dc:creator>
+        <dc:title />
+        <dc:contributor>
+          <cc:Agent>
+            <dc:title>Lapo Calamandrei</dc:title>
+          </cc:Agent>
+        </dc:contributor>
+        <dc:subject>
+          <rdf:Bag>
+            <rdf:li>optical</rdf:li>
+            <rdf:li>media</rdf:li>
+            <rdf:li>cd</rdf:li>
+            <rdf:li>dvd</rdf:li>
+          </rdf:Bag>
+        </dc:subject>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview
+     bordercolor="#666666"
+     borderopacity="0.25490196"
+     fill="#f57900"
+     gridtolerance="12"
+     guidetolerance="13"
+     height="300px"
+     id="base"
+     inkscape:current-layer="layer6"
+     inkscape:cx="-181.38052"
+     inkscape:cy="86.438237"
+     inkscape:document-units="px"
+     inkscape:grid-bbox="true"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:showpageshadow="false"
+     inkscape:snap-bbox="true"
+     inkscape:snap-nodes="false"
+     inkscape:window-height="1374"
+     inkscape:window-width="2560"
+     inkscape:window-x="0"
+     inkscape:window-y="27"
+     inkscape:zoom="1"
+     objecttolerance="7"
+     pagecolor="#ffffff"
+     showgrid="false"
+     stroke="#ef2929"
+     width="400px"
+     showguides="true"
+     inkscape:guide-bbox="true"
+     inkscape:window-maximized="1">
+    <inkscape:grid
+       enabled="true"
+       id="grid5883"
+       spacingx="1px"
+       spacingy="1px"
+       type="xygrid"
+       visible="true"
+       empspacing="4" />
+  </sodipodi:namedview>
+  <defs
+     id="defs3">
+    <inkscape:path-effect
+       is_visible="true"
+       id="path-effect13049"
+       effect="spiro" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect13045"
+       is_visible="true" />
+    <inkscape:path-effect
+       is_visible="true"
+       id="path-effect13041"
+       effect="spiro" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect13037"
+       is_visible="true" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect13033"
+       is_visible="true" />
+    <inkscape:path-effect
+       is_visible="true"
+       id="path-effect13029"
+       effect="spiro" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect13025"
+       is_visible="true" />
+    <inkscape:path-effect
+       is_visible="true"
+       id="path-effect13021"
+       effect="spiro" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect13017"
+       is_visible="true" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect12179"
+       is_visible="true" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect12082"
+       is_visible="true" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect12062"
+       is_visible="true" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect12058"
+       is_visible="true" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect11284"
+       is_visible="true" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect10766"
+       is_visible="true" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect1920"
+       is_visible="true" />
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect22436"
+       is_visible="true" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient22426">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop22428" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop22430" />
+    </linearGradient>
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect22396"
+       is_visible="true" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3448">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop3450" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop3452" />
+    </linearGradient>
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect3446"
+       is_visible="true" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient3436">
+      <stop
+         style="stop-color:#fcaf3e;stop-opacity:1;"
+         offset="0"
+         id="stop3438" />
+      <stop
+         style="stop-color:#df8604;stop-opacity:1"
+         offset="1"
+         id="stop3440" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2952">
+      <stop
+         style="stop-color:#c3571f;stop-opacity:1"
+         offset="0"
+         id="stop2954" />
+      <stop
+         style="stop-color:#e17843;stop-opacity:0;"
+         offset="1"
+         id="stop2956" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2762">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop2764" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1"
+         id="stop2766" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2646">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop2648" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop2650" />
+    </linearGradient>
+    <inkscape:path-effect
+       effect="spiro"
+       id="path-effect2620"
+       is_visible="true" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5679">
+      <stop
+         style="stop-color:#ff7215;stop-opacity:1"
+         offset="0"
+         id="stop5681" />
+      <stop
+         style="stop-color: rgb(252, 175, 62); stop-opacity: 0;"
+         offset="1"
+         id="stop5683" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5669">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop5671" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop5673" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5625">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop5627" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop5629" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5505">
+      <stop
+         id="stop5507"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="0.5"
+         id="stop5509" />
+      <stop
+         id="stop5511"
+         offset="1"
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5495">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0.21327014"
+         offset="0"
+         id="stop5497" />
+      <stop
+         id="stop5499"
+         offset="0.5"
+         style="stop-color:#ffffff;stop-opacity:0.49803922;" />
+      <stop
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 0;"
+         offset="1"
+         id="stop5501" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5110">
+      <stop
+         style="stop-color:#000000;stop-opacity:0.4"
+         offset="0"
+         id="stop5112" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1"
+         id="stop5114" />
+    </linearGradient>
+    <linearGradient
+       y2="14.2033"
+       x2="35.391201"
+       y1="32.4165"
+       x1="12.2744"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4573">
+      <stop
+         id="stop4575"
+         style="stop-color:#babdb6;stop-opacity:1"
+         offset="0" />
+      <stop
+         offset="0.25"
+         style="stop-color:#d9d9d9;stop-opacity:1;"
+         id="stop4577" />
+      <stop
+         id="stop4579"
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0.5" />
+      <stop
+         offset="1"
+         style="stop-color:#888a85;stop-opacity:1"
+         id="stop4581" />
+    </linearGradient>
+    <linearGradient
+       y2="14.2033"
+       y1="32.4165"
+       x2="35.391201"
+       x1="12.2744"
+       id="linearGradient4237"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#FBFBFB"
+         offset="0"
+         id="stop4239" />
+      <stop
+         style="stop-color:#B6B6B6"
+         offset="0.5"
+         id="stop4241" />
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:1"
+         offset="1"
+         id="stop4243" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3435"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop3437"
+         offset="0.0000000"
+         style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+      <stop
+         id="stop3439"
+         offset="1.0000000"
+         style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3394"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop3396"
+         offset="0.0000000"
+         style="stop-color:#fff307;stop-opacity:1.0000000;" />
+      <stop
+         id="stop3398"
+         offset="0.50000000"
+         style="stop-color:#166eff;stop-opacity:1.0000000;" />
+      <stop
+         id="stop3400"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3406"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop3408"
+         offset="0.0000000"
+         style="stop-color:#b307ff;stop-opacity:0.82178217;" />
+      <stop
+         id="stop3410"
+         offset="1.0000000"
+         style="stop-color:#f0ff8b;stop-opacity:0.64356434;" />
+      <stop
+         id="stop3412"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5844"
+       gradientUnits="userSpaceOnUse"
+       x1="12.2744"
+       y1="32.4165"
+       x2="35.391201"
+       y2="14.2033">
+      <stop
+         offset="0"
+         style="stop-color:#fbfbfb;stop-opacity:0;"
+         id="stop5846" />
+      <stop
+         id="stop5848"
+         style="stop-color:#e8e8e8;stop-opacity:0;"
+         offset="0.30952382" />
+      <stop
+         offset="0.46209913"
+         style="stop-color:#ffffff;stop-opacity:1;"
+         id="stop5850" />
+      <stop
+         id="stop5859"
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0.54616135" />
+      <stop
+         id="stop5852"
+         style="stop-color:#e3e3e3;stop-opacity:0;"
+         offset="0.71428573" />
+      <stop
+         offset="1"
+         style="stop-color:#d1d1d1;stop-opacity:0;"
+         id="stop5854" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5956">
+      <stop
+         id="stop5958"
+         offset="0"
+         style="stop-color:#e6e6e6;stop-opacity:1;" />
+      <stop
+         style="stop-color:#404040;stop-opacity:0.52525252;"
+         offset="0.5"
+         id="stop5964" />
+      <stop
+         id="stop5960"
+         offset="1"
+         style="stop-color:#ededed;stop-opacity:0.78823531;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6117">
+      <stop
+         id="stop6119"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop6121"
+         offset="1"
+         style="stop-color:#333333;stop-opacity:0.26262626;" />
+    </linearGradient>
+    <linearGradient
+       y2="14.2033"
+       x2="35.391201"
+       y1="32.4165"
+       x1="12.2744"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient5724">
+      <stop
+         id="stop5726"
+         style="stop-color:#f5f5f5;stop-opacity:1;"
+         offset="0" />
+      <stop
+         offset="0.5"
+         style="stop-color:#ffffff;stop-opacity:0;"
+         id="stop5728" />
+      <stop
+         id="stop5730"
+         style="stop-color:#d9d9d9;stop-opacity:1;"
+         offset="0.75" />
+      <stop
+         offset="1"
+         style="stop-color:#e8e8e8;stop-opacity:0;"
+         id="stop5732" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5753">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="0"
+         id="stop5755" />
+      <stop
+         id="stop5761"
+         offset="0.5"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0.75"
+         id="stop5763" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop5757" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4359">
+      <path
+         style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="M 383.15625,310 C 380.25513,310.02465 377.31331,310.15721 374.375,310.40625 C 311.69083,315.7191 265.09339,370.94084 270.40625,433.625 C 275.71911,496.3092 330.94082,542.90663 393.625,537.59375 C 456.30917,532.28089 502.90662,477.05917 497.59375,414.375 C 492.52994,354.62912 442.14563,309.49854 383.15625,310 z M 384,388 C 403.872,388.00001 420,404.128 420,424 C 420,443.872 403.872,460 384,460 C 364.12801,460 348,443.872 348,424 C 348,404.128 364.128,388 384,388 z"
+         id="path4361" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath5197">
+      <g
+         transform="matrix(-4.519923e-2,-0.998978,0.998978,-4.519923e-2,316.33904,0.34975)"
+         id="g5199">
+        <text
+           xml:space="preserve"
+           style="font-size:6px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;font-family:Impact;-inkscape-font-specification:Impact Bold"
+           id="text5201"
+           sodipodi:linespacing="125%"
+           transform="translate(0,-330)"
+           x="88.68774"
+           y="-177.16786">Tango Media. Only capable of holding freely licensed content. Explodes in hard drives when trying to store proprietary software.</text>
+        <path
+           style="fill:#000000;fill-rule:nonzero;stroke:none;stroke-miterlimit:4;stroke-opacity:1;display:inline;enable-background:new"
+           d="M 144,-279 C 81.365681,-279 31,-228.63428 31,-166 C 31,-103.3657 81.365691,-53 144,-53 C 206.63423,-53.00001 257,-103.36571 257,-166 C 257,-228.63427 206.63424,-279 144,-279 z M 144,-214 C 170.496,-214 192,-192.496 192,-166 C 192,-139.504 170.496,-118 144,-118 C 117.504,-118.00001 95.999996,-139.504 95.999996,-166 C 96.000006,-192.496 117.504,-214 144,-214 z"
+           id="path5205" />
+      </g>
+    </clipPath>
+    <linearGradient
+       y2="42.813938"
+       x2="32.309113"
+       y1="46.229389"
+       x1="32.556377"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient1469"
+       xlink:href="#linearGradient2498"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="34.307499"
+       x2="32.511002"
+       y1="11.1885"
+       x1="14.9966"
+       gradientUnits="userSpaceOnUse"
+       id="aigrd1-6">
+      <stop
+         id="stop3034-6"
+         style="stop-color: rgb(235, 235, 235);"
+         offset="0" />
+      <stop
+         id="stop3036-4"
+         style="stop-color: rgb(255, 255, 255);"
+         offset="0.5" />
+      <stop
+         id="stop3038-9"
+         style="stop-color: rgb(235, 235, 235);"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       y2="14.2033"
+       x2="35.391201"
+       y1="32.4165"
+       x1="12.2744"
+       gradientUnits="userSpaceOnUse"
+       id="aigrd2-6">
+      <stop
+         id="stop3043-8"
+         style="stop-color: rgb(251, 251, 251);"
+         offset="0" />
+      <stop
+         id="stop3045-9"
+         style="stop-color: rgb(182, 182, 182);"
+         offset="0.5" />
+      <stop
+         id="stop3047-2"
+         style="stop-color: rgb(228, 228, 228);"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4236-9">
+      <stop
+         id="stop4238-2"
+         offset="0"
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 0;" />
+      <stop
+         id="stop4240-0"
+         offset="1.0000000"
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 0.60396;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2421">
+      <stop
+         id="stop2423"
+         offset="0"
+         style="stop-color: rgb(245, 121, 0); stop-opacity: 1;" />
+      <stop
+         style="stop-color: rgb(245, 121, 0); stop-opacity: 1;"
+         offset="0.33333334"
+         id="stop2437" />
+      <stop
+         id="stop2425"
+         offset="1"
+         style="stop-color: rgb(206, 92, 0); stop-opacity: 1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2490">
+      <stop
+         id="stop2492"
+         offset="0"
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 0.738281;" />
+      <stop
+         id="stop2494"
+         offset="1"
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2498"
+       inkscape:collect="always">
+      <stop
+         id="stop2500"
+         offset="0"
+         style="stop-color: rgb(206, 92, 0);" />
+      <stop
+         id="stop2502"
+         offset="1"
+         style="stop-color: rgb(245, 121, 0);" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5821">
+      <stop
+         style="stop-color:#f3d09c;stop-opacity:1"
+         offset="0"
+         id="stop5823" />
+      <stop
+         style="stop-color:#e78221;stop-opacity:1"
+         offset="1"
+         id="stop5825" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6016"
+       id="radialGradient6317"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1273876,-0.07262356,0.03283417,0.5061061,-15.126596,94.990248)"
+       cx="67.131371"
+       cy="199.40643"
+       fx="67.131371"
+       fy="199.40643"
+       r="55.921093" />
+    <linearGradient
+       id="linearGradient6016">
+      <stop
+         id="stop6020"
+         offset="0"
+         style="stop-color:#000000;stop-opacity:0;" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="0.5"
+         id="stop6054" />
+      <stop
+         id="stop6018"
+         offset="1"
+         style="stop-color:#000000;stop-opacity:1;" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath6069">
+      <path
+         style="fill:#9db029;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block"
+         d="m 273.29692,48.665497 c 0,0 -130.66434,-9.858649 -130.66434,-9.858649 L 116.21736,169.22225 c -9.23859,-5.31235 -33.790951,-9.59854 -49.480102,-9.50756 -27.276396,0.15818 -48.916422,10.81607 -48.475101,23.6374 0.441322,12.82132 22.873124,23.18139 50.149525,23.02322 25.77572,-0.14948 49.845828,-9.00109 51.691458,-20.85605 L 143.69896,71.672145 c 0,0 116.86507,5.728523 116.86507,5.728523 L 240.66029,177.58293 c -59.8807,-21.26165 -95.64677,2.00187 -95.20544,14.82319 0.44132,12. [...]
+         id="path6071"
+         sodipodi:nodetypes="cccccccccccccc" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4933">
+      <path
+         style="color:#000000;fill:#f57900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.2674925;marker:none;visibility:visible;display:inline;overflow:visible"
+         d="m 23.461731,22.506139 c 0,1.644577 -0.551831,3.034662 -2.902033,2.973157 -2.28621,-0.05983 -2.998404,-1.416364 -3.047314,-2.979308 -0.0282,-0.924199 -0.448771,-4.4116 4.03064,-6.925454 -1.479411,2.513854 1.918707,5.287026 1.918707,6.931605 z"
+         id="path4935"
+         sodipodi:nodetypes="czscc" />
+    </clipPath>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath5024">
+      <path
+         style="fill:#f57900;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:block"
+         d="m 105.34425,31.00775 -0.5,134.89807 c -10.19391,-3.45371 -35.35077,-2.85656 -50.86945,0.33875 -26.98001,5.55521 -46.31271,20.43475 -43.35318,33.09551 2.95954,12.66076 27.21146,18.52246 54.19148,12.96725 25.49564,-5.24958 47.59017,-18.81406 47.08547,-30.96656 l 0.96771,-117.86646 c 47.00266,0 34.49688,35.56847 74.85559,35.56847 -30.26906,1.828 -20.58605,-67.806 -82.37762,-68.03503 z"
+         id="path5026"
+         sodipodi:nodetypes="ccccccccc" />
+    </clipPath>
+    <linearGradient
+       id="linearGradient2522-7">
+      <stop
+         id="stop2524-2"
+         offset="0"
+         style="stop-color: rgb(187, 83, 0); stop-opacity: 1;" />
+      <stop
+         id="stop2526-4"
+         offset="1"
+         style="stop-color: rgb(206, 92, 0); stop-opacity: 0;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2773-5">
+      <stop
+         id="stop2775-8"
+         offset="0"
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 0;" />
+      <stop
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 0;"
+         offset="0.83333331"
+         id="stop1465-9" />
+      <stop
+         id="stop2777-5"
+         offset="1"
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 1;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5625"
+       id="linearGradient5631"
+       x1="159.00543"
+       y1="216.25502"
+       x2="157.50327"
+       y2="198.58092"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath5645">
+      <path
+         d="m -70,190.5 a 106.5,82.5 0 1 1 -213,0 106.5,82.5 0 1 1 213,0 z"
+         sodipodi:ry="82.5"
+         sodipodi:rx="106.5"
+         sodipodi:cy="190.5"
+         sodipodi:cx="-176.5"
+         id="path5647"
+         style="color:#000000;fill:#fcaf3e;fill-opacity:1;fill-rule:evenodd;stroke:#f54d00;stroke-width:1.04322076;stroke-opacity:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new"
+         sodipodi:type="arc" />
+    </clipPath>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5669"
+       id="radialGradient5675"
+       cx="-108"
+       cy="182.35294"
+       fx="-108"
+       fy="182.35294"
+       r="13"
+       gradientTransform="matrix(1,0,0,0.46153846,0,102.30769)"
+       gradientUnits="userSpaceOnUse" />
+    <inkscape:perspective
+       id="perspective6244"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective6266"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective6288"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective6310"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective6332"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective6354"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       id="linearGradient5956-1">
+      <stop
+         id="stop5958-9"
+         offset="0"
+         style="stop-color:#e6e6e6;stop-opacity:1;" />
+      <stop
+         style="stop-color:#404040;stop-opacity:0.52525252;"
+         offset="0.5"
+         id="stop5964-6" />
+      <stop
+         id="stop5960-4"
+         offset="1"
+         style="stop-color:#ededed;stop-opacity:0.78823531;" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath4359-8">
+      <path
+         inkscape:connector-curvature="0"
+         style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="m 383.15625,310 c -2.90112,0.0247 -5.84294,0.15721 -8.78125,0.40625 C 311.69083,315.7191 265.09339,370.94084 270.40625,433.625 275.71911,496.3092 330.94082,542.90663 393.625,537.59375 456.30917,532.28089 502.90662,477.05917 497.59375,414.375 492.52994,354.62912 442.14563,309.49854 383.15625,310 z M 384,388 c 19.872,10e-6 36,16.128 36,36 0,19.872 -16.128,36 -36,36 -19.87199,0 -36,-16.128 -36,-36 0,-19.872 16.128,-36 36,-36 z"
+         id="path4361-0" />
+    </clipPath>
+    <linearGradient
+       y2="14.2033"
+       x2="35.391201"
+       y1="32.4165"
+       x1="12.2744"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient4573-8">
+      <stop
+         id="stop4575-1"
+         style="stop-color:#babdb6;stop-opacity:1"
+         offset="0" />
+      <stop
+         offset="0.25"
+         style="stop-color:#d9d9d9;stop-opacity:1;"
+         id="stop4577-0" />
+      <stop
+         id="stop4579-2"
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0.5" />
+      <stop
+         offset="1"
+         style="stop-color:#888a85;stop-opacity:1"
+         id="stop4581-2" />
+    </linearGradient>
+    <linearGradient
+       y2="14.2033"
+       x2="35.391201"
+       y1="32.4165"
+       x1="12.2744"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient5724-9">
+      <stop
+         id="stop5726-7"
+         style="stop-color:#f5f5f5;stop-opacity:1;"
+         offset="0" />
+      <stop
+         offset="0.5"
+         style="stop-color:#ffffff;stop-opacity:0;"
+         id="stop5728-5" />
+      <stop
+         id="stop5730-6"
+         style="stop-color:#d9d9d9;stop-opacity:1;"
+         offset="0.75" />
+      <stop
+         offset="1"
+         style="stop-color:#e8e8e8;stop-opacity:0;"
+         id="stop5732-4" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient6117-6">
+      <stop
+         id="stop6119-3"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop6121-7"
+         offset="1"
+         style="stop-color:#333333;stop-opacity:0.26262626;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1081">
+      <stop
+         id="stop1083"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop1085"
+         offset="1"
+         style="stop-color:#333333;stop-opacity:0.26262626;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1088">
+      <stop
+         id="stop1090"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop1092"
+         offset="1"
+         style="stop-color:#333333;stop-opacity:0.26262626;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1095">
+      <stop
+         id="stop1097"
+         offset="0"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         id="stop1099"
+         offset="1"
+         style="stop-color:#333333;stop-opacity:0.26262626;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5753-9">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="0"
+         id="stop5755-7" />
+      <stop
+         id="stop5761-4"
+         offset="0.5"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0.75"
+         id="stop5763-9" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop5757-1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient1118">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="0"
+         id="stop1120" />
+      <stop
+         id="stop1122"
+         offset="0.5"
+         style="stop-color:#ffffff;stop-opacity:1;" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0.75"
+         id="stop1124" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop1126" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5110-7">
+      <stop
+         style="stop-color:#000000;stop-opacity:0.4"
+         offset="0"
+         id="stop5112-0" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1"
+         id="stop5114-6" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath5197-0">
+      <g
+         transform="matrix(-0.04519923,-0.998978,0.998978,-0.04519923,316.33904,0.34975)"
+         id="g5199-8">
+        <text
+           xml:space="preserve"
+           style="font-size:6px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;fill:#000000;fill-opacity:1;stroke:none;font-family:Impact;-inkscape-font-specification:Impact Bold"
+           id="text5201-5"
+           sodipodi:linespacing="125%"
+           transform="translate(0,-330)"
+           x="106.65373"
+           y="-177.97882">Tango Media. Only capable of holding freely licensed content. Explodes in hard drives when trying to store proprietary software.</text>
+        <path
+           inkscape:connector-curvature="0"
+           style="fill:#000000;fill-rule:nonzero;stroke:none;display:inline;enable-background:new"
+           d="m 144,-279 c -62.634319,0 -113,50.36572 -113,113 0,62.6343 50.365691,113 113,113 62.63423,-1e-5 113,-50.36571 113,-113 0,-62.63427 -50.36576,-113 -113,-113 z m 0,65 c 26.496,0 48,21.504 48,48 0,26.496 -21.504,48 -48,48 -26.496,-1e-5 -48.000004,-21.504 -48.000004,-48 1e-5,-26.496 21.504004,-48 48.000004,-48 z"
+           id="path5205-3" />
+      </g>
+    </clipPath>
+    <filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter3474-9">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="2.2600695"
+         id="feGaussianBlur3476-4" />
+    </filter>
+    <linearGradient
+       y2="14.2033"
+       y1="32.4165"
+       x2="35.391201"
+       x1="12.2744"
+       id="linearGradient4237-1"
+       gradientUnits="userSpaceOnUse">
+      <stop
+         style="stop-color:#FBFBFB"
+         offset="0"
+         id="stop4239-5" />
+      <stop
+         style="stop-color:#B6B6B6"
+         offset="0.5"
+         id="stop4241-4" />
+      <stop
+         style="stop-color:#eeeeec;stop-opacity:1"
+         offset="1"
+         id="stop4243-1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5844-5"
+       gradientUnits="userSpaceOnUse"
+       x1="12.2744"
+       y1="32.4165"
+       x2="35.391201"
+       y2="14.2033">
+      <stop
+         offset="0"
+         style="stop-color:#fbfbfb;stop-opacity:0;"
+         id="stop5846-5" />
+      <stop
+         id="stop5848-4"
+         style="stop-color:#e8e8e8;stop-opacity:0;"
+         offset="0.30952382" />
+      <stop
+         offset="0.46209913"
+         style="stop-color:#ffffff;stop-opacity:1;"
+         id="stop5850-9" />
+      <stop
+         id="stop5859-8"
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0.54616135" />
+      <stop
+         id="stop5852-3"
+         style="stop-color:#e3e3e3;stop-opacity:0;"
+         offset="0.71428573" />
+      <stop
+         offset="1"
+         style="stop-color:#d1d1d1;stop-opacity:0;"
+         id="stop5854-8" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3394-5"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop3396-2"
+         offset="0.0000000"
+         style="stop-color:#fff307;stop-opacity:1.0000000;" />
+      <stop
+         id="stop3398-2"
+         offset="0.50000000"
+         style="stop-color:#166eff;stop-opacity:1.0000000;" />
+      <stop
+         id="stop3400-2"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3406-7"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop3408-0"
+         offset="0.0000000"
+         style="stop-color:#b307ff;stop-opacity:0.82178217;" />
+      <stop
+         id="stop3410-3"
+         offset="1.0000000"
+         style="stop-color:#f0ff8b;stop-opacity:0.64356434;" />
+      <stop
+         id="stop3412-4"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3435-6"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop3437-3"
+         offset="0.0000000"
+         style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+      <stop
+         id="stop3439-6"
+         offset="1.0000000"
+         style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient1167"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop1169"
+         offset="0.0000000"
+         style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+      <stop
+         id="stop1171"
+         offset="1.0000000"
+         style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient1174"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop1176"
+         offset="0.0000000"
+         style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+      <stop
+         id="stop1178"
+         offset="1.0000000"
+         style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2730">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop2732" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop2734" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2730"
+       id="linearGradient3510"
+       gradientUnits="userSpaceOnUse"
+       x1="163.4375"
+       y1="148.21875"
+       x2="179"
+       y2="77" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5625"
+       id="linearGradient1704"
+       gradientUnits="userSpaceOnUse"
+       x1="159.00543"
+       y1="216.25502"
+       x2="157.50327"
+       y2="198.58092" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5625"
+       id="linearGradient1714"
+       gradientUnits="userSpaceOnUse"
+       x1="159.00543"
+       y1="216.25502"
+       x2="157.50327"
+       y2="198.58092" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient6016"
+       id="radialGradient1736"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.1273876,-0.07262356,0.03283417,0.5061061,-15.126596,94.990248)"
+       cx="67.131371"
+       cy="199.40643"
+       fx="67.131371"
+       fy="199.40643"
+       r="55.921093" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath2510">
+      <path
+         sodipodi:nodetypes="ccssscccc"
+         id="path2512"
+         d="m 201.09656,416.5043 -0.5,134.89807 c -10.19391,-3.45371 -21.0687,-2.87794 -30.24939,-1.69678 -19.48847,2.50733 -36.39656,11.71607 -33.39087,22.93345 2.73921,10.22288 21.25214,14.56977 48.04719,8.18172 8.93827,-2.13092 21.73788,-7.66457 22.64739,-13.98344 l 0.96771,-117.86646 c 47.00266,0 34.49688,35.56847 74.85559,35.56847 -30.26906,1.828 -20.58605,-67.806 -82.37762,-68.03503 z"
+         style="fill:none;stroke:#000000;stroke-width:1;stroke-opacity:1;marker:none;visibility:visible;display:block"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter2530">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.3145457"
+         id="feGaussianBlur2532" />
+    </filter>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5314-4"
+       id="radialGradient5320-7"
+       cx="156.5"
+       cy="258"
+       fx="156.5"
+       fy="258"
+       r="89.5"
+       gradientTransform="matrix(1,0,0,0.2122905,0,203.22905)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient5314-4">
+      <stop
+         style="stop-color:#2e3436;stop-opacity:1;"
+         offset="0"
+         id="stop5316-1" />
+      <stop
+         style="stop-color:#2e3436;stop-opacity:0;"
+         offset="1"
+         id="stop5318-6" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath2626">
+      <path
+         sodipodi:nodetypes="ccczzs"
+         id="path2628"
+         d="m 13.438424,13.355863 c 1.530009,2.06226 7.728822,7.396424 10.988415,10.988743 l 0.02709,-16.5291315 c 1.3e-5,-1.3112616 -1.574459,-1.6407193 -4.128882,-1.6406941 -2.467865,2.43e-5 -3.679033,0.6281048 -5.886798,2.6042469 -1.999519,1.7897437 -2.269426,2.8655817 -0.999831,4.5768357 z"
+         style="color:#000000;fill:none;stroke:#000000;stroke-width:0.34132761;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter2642">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.59907852"
+         id="feGaussianBlur2644" />
+    </filter>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2762"
+       id="radialGradient2774"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.1889619,9.5604788e-8,-7.7861589e-8,1.7827147,8.3227222,119.87469)"
+       cx="-4.7158127"
+       cy="-152.43588"
+       fx="-4.7158127"
+       fy="-152.43588"
+       r="51.25" />
+    <mask
+       maskUnits="userSpaceOnUse"
+       id="mask2770">
+      <rect
+         style="color:#000000;fill:url(#radialGradient2774);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="rect2772"
+         width="102.5"
+         height="137.25"
+         x="-120.25"
+         y="-224" />
+    </mask>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2762-8">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop2764-2" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1"
+         offset="1"
+         id="stop2766-0" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath2940">
+      <path
+         style="color:#000000;fill:none;stroke:#e17843;stroke-width:0.54435194;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+         d="M 45.485011,24.650406 C 45.489502,36.169162 36.087252,45.514052 24.497845,45.509535 12.908437,45.505018 3.4988962,36.152795 3.4944046,24.634039 3.489913,13.115282 12.892164,3.770392 24.481571,3.7749093 c 11.589407,0.00452 20.998948,9.3567397 21.00344,20.8754967 z"
+         id="path2942"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter2964">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.52548081"
+         id="feGaussianBlur2966" />
+    </filter>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3436"
+       id="radialGradient3442"
+       cx="-157.99718"
+       cy="189.70802"
+       fx="-157.99718"
+       fy="189.70802"
+       r="11.162659"
+       gradientTransform="matrix(1,0,0,1.6589031,0,-120.43148)"
+       gradientUnits="userSpaceOnUse" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3448"
+       id="radialGradient3454"
+       cx="-169.79938"
+       cy="186.50612"
+       fx="-169.79938"
+       fy="186.50612"
+       r="4.866712"
+       gradientTransform="matrix(2.7798583,0,0,8.3915425,302.21884,-1371.4749)"
+       gradientUnits="userSpaceOnUse" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath6015">
+      <path
+         sodipodi:nodetypes="ccczzs"
+         id="path6017"
+         d="m 24.58135,8.5262881 0,15.7773249 11.19494,-11.15627 C 36.717617,12.206016 36.012089,10.650914 34.178268,8.8170923 32.406587,7.0454117 31.086217,6.626796 28.082662,6.46047 25.362414,6.3098322 24.58135,6.9905478 24.58135,8.5262881 z"
+         style="color:#000000;fill:none;stroke:#ae561c;stroke-width:0.34849483;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2646-60">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop2648-6" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop2650-6" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath2626-7">
+      <path
+         sodipodi:nodetypes="ccczzs"
+         id="path2628-7"
+         d="m 13.438424,13.355863 c 1.530009,2.06226 7.728822,7.396424 10.988415,10.988743 l 0.02709,-16.5291315 c 1.3e-5,-1.3112616 -1.574459,-1.6407193 -4.128882,-1.6406941 -2.467865,2.43e-5 -3.679033,0.6281048 -5.886798,2.6042469 -1.999519,1.7897437 -2.269426,2.8655817 -0.999831,4.5768357 z"
+         style="color:#000000;fill:none;stroke:#000000;stroke-width:0.34132761;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter2642-1">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.59907852"
+         id="feGaussianBlur2644-6" />
+    </filter>
+    <radialGradient
+       r="5.8939619"
+       fy="9.6037779"
+       fx="17.519264"
+       cy="9.6037779"
+       cx="17.519264"
+       gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient6038"
+       xlink:href="#linearGradient2646-60"
+       inkscape:collect="always" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath6449">
+      <path
+         style="color:#000000;fill:none;stroke:#ae561c;stroke-width:0.34849483;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+         d="m 8.8040241,24.696408 c 2.5788719,0.382055 10.8583649,-0.238784 15.7773249,0 L 12.734773,12.811161 c -0.941327,-0.941326 -2.308165,-0.04753 -4.1419858,1.786288 -1.7716806,1.771681 -2.1902964,3.09205 -2.3566221,6.095606 -0.1506379,2.720248 0.4279227,3.686326 2.567859,4.003353 z"
+         id="path6451"
+         sodipodi:nodetypes="ccczzs"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient2646-4">
+      <stop
+         style="stop-color:#000000;stop-opacity:1;"
+         offset="0"
+         id="stop2648-7" />
+      <stop
+         style="stop-color:#000000;stop-opacity:0;"
+         offset="1"
+         id="stop2650-79" />
+    </linearGradient>
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath2626-9">
+      <path
+         sodipodi:nodetypes="ccczzs"
+         id="path2628-1"
+         d="m 13.438424,13.355863 c 1.530009,2.06226 7.728822,7.396424 10.988415,10.988743 l 0.02709,-16.5291315 c 1.3e-5,-1.3112616 -1.574459,-1.6407193 -4.128882,-1.6406941 -2.467865,2.43e-5 -3.679033,0.6281048 -5.886798,2.6042469 -1.999519,1.7897437 -2.269426,2.8655817 -0.999831,4.5768357 z"
+         style="color:#000000;fill:none;stroke:#000000;stroke-width:0.34132761;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
+         inkscape:connector-curvature="0" />
+    </clipPath>
+    <filter
+       color-interpolation-filters="sRGB"
+       inkscape:collect="always"
+       id="filter2642-4">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.59907852"
+         id="feGaussianBlur2644-63" />
+    </filter>
+    <radialGradient
+       r="5.8939619"
+       fy="9.6037779"
+       fx="17.519264"
+       cy="9.6037779"
+       cx="17.519264"
+       gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+       gradientUnits="userSpaceOnUse"
+       id="radialGradient6472"
+       xlink:href="#linearGradient2646-4"
+       inkscape:collect="always" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2762-8"
+       id="radialGradient6587"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.0101777,-0.18624006,0.18650749,2.149352,61.479867,166.11438)"
+       cx="-29.586737"
+       cy="-167.494"
+       fx="-29.586737"
+       fy="-167.494"
+       r="51.25" />
+    <mask
+       maskUnits="userSpaceOnUse"
+       id="mask6583">
+      <rect
+         transform="matrix(0.99990965,0.01344185,0.01330504,0.99991148,0,0)"
+         style="color:#000000;fill:url(#radialGradient6587);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         id="rect6585"
+         width="133.43913"
+         height="180.5154"
+         x="-126.05099"
+         y="-252.44954" />
+    </mask>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2646"
+       id="radialGradient6729"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+       cx="17.519264"
+       cy="9.6037779"
+       fx="17.519264"
+       fy="9.6037779"
+       r="5.8939618" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2646-60"
+       id="radialGradient6731"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+       cx="22.352484"
+       cy="10.509538"
+       fx="22.352484"
+       fy="10.509538"
+       r="5.8939619" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2646-4"
+       id="radialGradient6733"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+       cx="14.04755"
+       cy="17.795752"
+       fx="14.04755"
+       fy="17.795752"
+       r="5.8939619" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5679"
+       id="linearGradient6735"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.965926,-0.258819,0.258819,0.965926,-5.53158,7.18046)"
+       x1="21.436686"
+       y1="13.453218"
+       x2="21.436686"
+       y2="25.460827" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5495"
+       id="linearGradient6737"
+       gradientUnits="userSpaceOnUse"
+       x1="24.061403"
+       y1="14.889434"
+       x2="25.633825"
+       y2="25.486128" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2952"
+       id="radialGradient6741"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.5567194,0.04900204,-0.04885231,1.5469314,-12.675068,-3.4935024)"
+       cx="17.013964"
+       cy="7.9955516"
+       fx="17.013964"
+       fy="7.9955516"
+       r="20.995305" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2952"
+       id="radialGradient6743"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.5567194,0.04900204,-0.04885231,1.5469314,-12.675068,-3.4935024)"
+       cx="28.948936"
+       cy="5.7242703"
+       fx="28.948936"
+       fy="5.7242703"
+       r="20.995305" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="aigrd2"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop3043"
+         offset="0"
+         style="stop-color:#FBFBFB" />
+      <stop
+         id="stop3045"
+         offset="0.5"
+         style="stop-color:#B6B6B6" />
+      <stop
+         id="stop3047"
+         offset="1"
+         style="stop-color:#E4E4E4" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4236">
+      <stop
+         id="stop4238"
+         offset="0.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.32673267;" />
+      <stop
+         id="stop4240"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.60396039;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient7295">
+      <stop
+         id="stop7297"
+         offset="0.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.32673267;" />
+      <stop
+         id="stop7299"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.60396039;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3394-56"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop3396-9"
+         offset="0.0000000"
+         style="stop-color:#fff307;stop-opacity:1.0000000;" />
+      <stop
+         id="stop3398-6"
+         offset="0.50000000"
+         style="stop-color:#166eff;stop-opacity:1.0000000;" />
+      <stop
+         id="stop3400-3"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3406-71"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop3408-8"
+         offset="0.0000000"
+         style="stop-color:#b307ff;stop-opacity:0.82178217;" />
+      <stop
+         id="stop3410-8"
+         offset="1.0000000"
+         style="stop-color:#f0ff8b;stop-opacity:0.64356434;" />
+      <stop
+         id="stop3412-9"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3421"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop3423"
+         offset="0.0000000"
+         style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+      <stop
+         id="stop3427"
+         offset="1.0000000"
+         style="stop-color:#b8c04c;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3435-7"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop3437-2"
+         offset="0.0000000"
+         style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+      <stop
+         id="stop3439-7"
+         offset="1.0000000"
+         style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7320"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop7322"
+         offset="0.0000000"
+         style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+      <stop
+         id="stop7324"
+         offset="1.0000000"
+         style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient7327"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop7329"
+         offset="0.0000000"
+         style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+      <stop
+         id="stop7331"
+         offset="1.0000000"
+         style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2646"
+       id="radialGradient7707"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+       cx="17.519264"
+       cy="9.6037779"
+       fx="17.519264"
+       fy="9.6037779"
+       r="5.8939618" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2646-60"
+       id="radialGradient7709"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+       cx="22.352484"
+       cy="10.509538"
+       fx="22.352484"
+       fy="10.509538"
+       r="5.8939619" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2646-4"
+       id="radialGradient7711"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+       cx="14.04755"
+       cy="17.795752"
+       fx="14.04755"
+       fy="17.795752"
+       r="5.8939619" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5679"
+       id="linearGradient7713"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.965926,-0.258819,0.258819,0.965926,-5.53158,7.18046)"
+       x1="21.436686"
+       y1="13.453218"
+       x2="21.436686"
+       y2="25.460827" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5495"
+       id="linearGradient7715"
+       gradientUnits="userSpaceOnUse"
+       x1="24.061403"
+       y1="14.889434"
+       x2="25.633825"
+       y2="25.486128" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2952"
+       id="radialGradient7721"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.5567194,0.04900204,-0.04885231,1.5469314,-12.675068,-3.4935024)"
+       cx="28.948936"
+       cy="5.7242703"
+       fx="28.948936"
+       fy="5.7242703"
+       r="20.995305" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2646"
+       id="radialGradient7761"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+       cx="17.519264"
+       cy="9.6037779"
+       fx="17.519264"
+       fy="9.6037779"
+       r="5.8939618" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2646-60"
+       id="radialGradient7763"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+       cx="22.352484"
+       cy="10.509538"
+       fx="22.352484"
+       fy="10.509538"
+       r="5.8939619" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2646-4"
+       id="radialGradient7765"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+       cx="14.04755"
+       cy="17.795752"
+       fx="14.04755"
+       fy="17.795752"
+       r="5.8939619" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5679"
+       id="linearGradient7767"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.965926,-0.258819,0.258819,0.965926,-5.53158,7.18046)"
+       x1="21.436686"
+       y1="13.453218"
+       x2="21.436686"
+       y2="25.460827" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5495"
+       id="linearGradient7769"
+       gradientUnits="userSpaceOnUse"
+       x1="24.061403"
+       y1="14.889434"
+       x2="25.633825"
+       y2="25.486128" />
+    <linearGradient
+       id="linearGradient2421-6">
+      <stop
+         id="stop2423-1"
+         offset="0"
+         style="stop-color: rgb(245, 121, 0); stop-opacity: 1;" />
+      <stop
+         style="stop-color: rgb(245, 121, 0); stop-opacity: 1;"
+         offset="0.33333334"
+         id="stop2437-3" />
+      <stop
+         id="stop2425-6"
+         offset="1"
+         style="stop-color: rgb(206, 92, 0); stop-opacity: 1;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2490-1">
+      <stop
+         id="stop2492-0"
+         offset="0"
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 0.738281;" />
+      <stop
+         id="stop2494-7"
+         offset="1"
+         style="stop-color: rgb(255, 255, 255); stop-opacity: 0;" />
+    </linearGradient>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2646"
+       id="radialGradient22335"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+       cx="17.519264"
+       cy="9.6037779"
+       fx="17.519264"
+       fy="9.6037779"
+       r="5.8939618" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2646-60"
+       id="radialGradient22337"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+       cx="22.352484"
+       cy="10.509538"
+       fx="22.352484"
+       fy="10.509538"
+       r="5.8939619" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2646-4"
+       id="radialGradient22339"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(2.9512095,0.13333868,-0.07565088,1.5394254,-33.45722,-10.578592)"
+       cx="14.04755"
+       cy="17.795752"
+       fx="14.04755"
+       fy="17.795752"
+       r="5.8939619" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5679"
+       id="linearGradient22341"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.965926,-0.258819,0.258819,0.965926,-5.53158,7.18046)"
+       x1="21.436686"
+       y1="13.453218"
+       x2="21.436686"
+       y2="25.460827" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5495"
+       id="linearGradient22343"
+       gradientUnits="userSpaceOnUse"
+       x1="24.061403"
+       y1="14.889434"
+       x2="25.633825"
+       y2="25.486128" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2952"
+       id="radialGradient22347"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.5567194,0.04900204,-0.04885231,1.5469314,-12.675068,-3.4935024)"
+       cx="17.013964"
+       cy="7.9955516"
+       fx="17.013964"
+       fy="7.9955516"
+       r="20.995305" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient2952"
+       id="radialGradient22349"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(1.5567194,0.04900204,-0.04885231,1.5469314,-12.675068,-3.4935024)"
+       cx="28.948936"
+       cy="5.7242703"
+       fx="28.948936"
+       fy="5.7242703"
+       r="20.995305" />
+    <clipPath
+       clipPathUnits="userSpaceOnUse"
+       id="clipPath22418">
+      <path
+         d="m -157.5,164.25 c -6.39361,3.53188 -11.46767,9.39092 -14.0625,16.21875 -1.42692,3.75469 -2.1098,7.95217 -1,11.8125 0.73069,2.54163 2.23501,4.86361 4.3125,6.5 2.0775,1.6364 4.69966,2.5506 7.34375,2.5 3.05625,-0.0585 6.08319,-1.45178 8.0625,-3.78125 1.97931,-2.32948 2.88713,-5.55437 2.34375,-8.5625 -0.37317,-2.06583 -1.38717,-3.96997 -2.5,-5.75 -1.11283,-1.78003 -2.34656,-3.49531 -3.28125,-5.375 -2.06881,-4.16042 -2.51197,-9.09969 -1.21875,-13.5625 z"
+         inkscape:href="#path2453-1"
+         id="path22420"
+         style="color:#000000;fill:none;stroke:#000000;stroke-width:0.8175624;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible"
+         xlink:href="#path2453-1"
+         inkscape:original="M -157.5 164.25 C -163.89361 167.78188 -168.96767 173.64092 -171.5625 180.46875 C -172.98942 184.22344 -173.6723 188.42092 -172.5625 192.28125 C -171.83181 194.82288 -170.32749 197.14486 -168.25 198.78125 C -166.17251 200.41764 -163.55034 201.33186 -160.90625 201.28125 C -157.85 201.22275 -154.82306 199.82948 -152.84375 197.5 C -150.86444 195.17052 -149.95662 191.94563 -150.5 188.9375 C -150.87317 186.87167 -151.88717 184.96753 -153 183.1875 C -154.11283 181.4 [...]
+         inkscape:radius="0"
+         sodipodi:type="inkscape:offset" />
+    </clipPath>
+    <filter
+       inkscape:collect="always"
+       id="filter22422"
+       x="-0.11209149"
+       width="1.224183"
+       y="-0.068917568"
+       height="1.1378351">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.0634338"
+         id="feGaussianBlur22424" />
+    </filter>
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient22426"
+       id="radialGradient22432"
+       cx="-160.5031"
+       cy="192.8199"
+       fx="-160.5031"
+       fy="192.8199"
+       r="11.384634"
+       gradientTransform="matrix(4.4078935,4.3997187e-7,-2.6986351e-7,2.7036492,546.97752,-322.19946)"
+       gradientUnits="userSpaceOnUse" />
+    <inkscape:perspective
+       id="perspective12277"
+       inkscape:persp3d-origin="14.502729 : 10.331991 : 1"
+       inkscape:vp_z="29.005459 : 15.497986 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 15.497986 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="aigrd1"
+       x1="14.9966"
+       x2="32.511002"
+       y1="11.1885"
+       y2="34.307499">
+      <stop
+         id="stop3034"
+         offset="0"
+         style="stop-color:#EBEBEB" />
+      <stop
+         id="stop3036"
+         offset="0.5"
+         style="stop-color:#FFFFFF" />
+      <stop
+         id="stop3038"
+         offset="1"
+         style="stop-color:#EBEBEB" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="aigrd2-2"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop3043-1"
+         offset="0"
+         style="stop-color:#FBFBFB" />
+      <stop
+         id="stop3045-3"
+         offset="0.5"
+         style="stop-color:#B6B6B6" />
+      <stop
+         id="stop3047-3"
+         offset="1"
+         style="stop-color:#E4E4E4" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4236-95">
+      <stop
+         id="stop4238-3"
+         offset="0.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.32673267;" />
+      <stop
+         id="stop4240-2"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.60396039;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient23325">
+      <stop
+         id="stop23327"
+         offset="0.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.32673267;" />
+      <stop
+         id="stop23329"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.60396039;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3394-59"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop3396-26"
+         offset="0.0000000"
+         style="stop-color:#fff307;stop-opacity:1.0000000;" />
+      <stop
+         id="stop3398-7"
+         offset="0.50000000"
+         style="stop-color:#166eff;stop-opacity:1.0000000;" />
+      <stop
+         id="stop3400-5"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3406-6"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop3408-3"
+         offset="0.0000000"
+         style="stop-color:#b307ff;stop-opacity:0.82178217;" />
+      <stop
+         id="stop3410-1"
+         offset="1.0000000"
+         style="stop-color:#f0ff8b;stop-opacity:0.64356434;" />
+      <stop
+         id="stop3412-7"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3421-9"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop3423-5"
+         offset="0.0000000"
+         style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+      <stop
+         id="stop3427-2"
+         offset="1.0000000"
+         style="stop-color:#b8c04c;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3435-8"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop3437-9"
+         offset="0.0000000"
+         style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+      <stop
+         id="stop3439-2"
+         offset="1.0000000"
+         style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient23354"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop23356"
+         offset="0.0000000"
+         style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+      <stop
+         id="stop23358"
+         offset="1.0000000"
+         style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient23361"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop23363"
+         offset="0.0000000"
+         style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+      <stop
+         id="stop23365"
+         offset="1.0000000"
+         style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <inkscape:perspective
+       id="perspective12483"
+       inkscape:persp3d-origin="10.999997 : 18.969167 : 1"
+       inkscape:vp_z="21.999994 : 28.453751 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 28.453751 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="aigrd2-64"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop3043-7"
+         offset="0"
+         style="stop-color:#FBFBFB" />
+      <stop
+         id="stop3045-6"
+         offset="0.5"
+         style="stop-color:#B6B6B6" />
+      <stop
+         id="stop3047-4"
+         offset="1"
+         style="stop-color:#E4E4E4" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient4236-2">
+      <stop
+         id="stop4238-37"
+         offset="0.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.32673267;" />
+      <stop
+         id="stop4240-00"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.60396039;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient23440">
+      <stop
+         id="stop23442"
+         offset="0.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.32673267;" />
+      <stop
+         id="stop23444"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.60396039;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3394-7"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop3396-0"
+         offset="0.0000000"
+         style="stop-color:#fff307;stop-opacity:1.0000000;" />
+      <stop
+         id="stop3398-66"
+         offset="0.50000000"
+         style="stop-color:#166eff;stop-opacity:1.0000000;" />
+      <stop
+         id="stop3400-38"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3406-1"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop3408-34"
+         offset="0.0000000"
+         style="stop-color:#b307ff;stop-opacity:0.82178217;" />
+      <stop
+         id="stop3410-14"
+         offset="1.0000000"
+         style="stop-color:#f0ff8b;stop-opacity:0.64356434;" />
+      <stop
+         id="stop3412-8"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3421-6"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop3423-8"
+         offset="0.0000000"
+         style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+      <stop
+         id="stop3427-7"
+         offset="1.0000000"
+         style="stop-color:#b8c04c;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3435-5"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop3437-1"
+         offset="0.0000000"
+         style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+      <stop
+         id="stop3439-9"
+         offset="1.0000000"
+         style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient23473"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop23475"
+         offset="0"
+         style="stop-color:#FBFBFB" />
+      <stop
+         id="stop23477"
+         offset="0.5"
+         style="stop-color:#B6B6B6" />
+      <stop
+         id="stop23479"
+         offset="1"
+         style="stop-color:#E4E4E4" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient23482"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop23484"
+         offset="0.0000000"
+         style="stop-color:#fff307;stop-opacity:1.0000000;" />
+      <stop
+         id="stop23486"
+         offset="0.50000000"
+         style="stop-color:#166eff;stop-opacity:1.0000000;" />
+      <stop
+         id="stop23488"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient23491"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop23493"
+         offset="0.0000000"
+         style="stop-color:#b307ff;stop-opacity:0.82178217;" />
+      <stop
+         id="stop23495"
+         offset="1.0000000"
+         style="stop-color:#f0ff8b;stop-opacity:0.64356434;" />
+      <stop
+         id="stop23497"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient23500"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop23502"
+         offset="0.0000000"
+         style="stop-color:#ffffff;stop-opacity:1.0000000;" />
+      <stop
+         id="stop23504"
+         offset="1.0000000"
+         style="stop-color:#b8c04c;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient23507"
+       x1="12.2744"
+       x2="35.391201"
+       y1="32.4165"
+       y2="14.2033">
+      <stop
+         id="stop23509"
+         offset="0.0000000"
+         style="stop-color:#ffffc8;stop-opacity:1.0000000;" />
+      <stop
+         id="stop23511"
+         offset="1.0000000"
+         style="stop-color:#9a91ef;stop-opacity:0.0000000;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient23522">
+      <stop
+         id="stop23524"
+         offset="0.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.32673267;" />
+      <stop
+         id="stop23526"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.60396039;" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient23529">
+      <stop
+         id="stop23531"
+         offset="0.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.32673267;" />
+      <stop
+         id="stop23533"
+         offset="1.0000000"
+         style="stop-color:#ffffff;stop-opacity:0.60396039;" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5679"
+       id="linearGradient12741"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.965926,-0.258819,0.258819,0.965926,-5.53158,7.18046)"
+       x1="21.436686"
+       y1="13.453218"
+       x2="21.436686"
+       y2="25.460827" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5495"
+       id="linearGradient12743"
+       gradientUnits="userSpaceOnUse"
+       x1="24.061403"
+       y1="14.889434"
+       x2="25.633825"
+       y2="25.486128" />
+    <inkscape:perspective
+       id="perspective12757"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <radialGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient12181-5"
+       id="radialGradient12187-8"
+       cx="326.8168"
+       cy="85.207542"
+       fx="326.8168"
+       fy="85.207542"
+       r="1.63605"
+       gradientTransform="matrix(3.0221026,-0.84080995,1.7034055,6.1225092,-806.00011,-158.76002)"
+       gradientUnits="userSpaceOnUse" />
+    <linearGradient
+       inkscape:collect="always"
+       id="linearGradient12181-5">
+      <stop
+         style="stop-color:#ffffff;stop-opacity:1;"
+         offset="0"
+         id="stop12183-3" />
+      <stop
+         style="stop-color:#ffffff;stop-opacity:0;"
+         offset="1"
+         id="stop12185-2" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5679"
+       id="linearGradient13007"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.965926,-0.258819,0.258819,0.965926,-5.53158,7.18046)"
+       x1="21.436686"
+       y1="13.453218"
+       x2="21.436686"
+       y2="25.460827" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5495"
+       id="linearGradient13009"
+       gradientUnits="userSpaceOnUse"
+       x1="24.061403"
+       y1="14.889434"
+       x2="25.633825"
+       y2="25.486128" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5679"
+       id="linearGradient13217"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.965926,-0.258819,0.258819,0.965926,-5.53158,7.18046)"
+       x1="21.436686"
+       y1="13.453218"
+       x2="21.436686"
+       y2="25.460827" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient5495"
+       id="linearGradient13219"
+       gradientUnits="userSpaceOnUse"
+       x1="24.061403"
+       y1="14.889434"
+       x2="25.633825"
+       y2="25.486128" />
+    <inkscape:perspective
+       id="perspective13291"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective13357"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <inkscape:perspective
+       id="perspective13357-6"
+       inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+       inkscape:vp_z="1 : 0.5 : 1"
+       inkscape:vp_y="0 : 1000 : 0"
+       inkscape:vp_x="0 : 0.5 : 1"
+       sodipodi:type="inkscape:persp3d" />
+    <filter
+       inkscape:collect="always"
+       id="filter8384">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="2.9447791"
+         id="feGaussianBlur8386" />
+    </filter>
+    <filter
+       inkscape:collect="always"
+       id="filter8402"
+       x="-0.10574768"
+       width="1.2114954"
+       y="-0.0970362"
+       height="1.1940724">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="8.8343373"
+         id="feGaussianBlur8404" />
+    </filter>
+    <filter
+       inkscape:collect="always"
+       id="filter17718">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="0.98945784"
+         id="feGaussianBlur17720" />
+    </filter>
+    <filter
+       inkscape:collect="always"
+       id="filter17771">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.623996"
+         id="feGaussianBlur17773" />
+    </filter>
+    <filter
+       inkscape:collect="always"
+       id="filter17787">
+      <feGaussianBlur
+         inkscape:collect="always"
+         stdDeviation="1.2991968"
+         id="feGaussianBlur17789" />
+    </filter>
+  </defs>
+  <g
+     id="layer1"
+     inkscape:groupmode="layer"
+     inkscape:label="artwork:media-optical"
+     style="display:inline">
+    <g
+       id="layer6"
+       inkscape:groupmode="layer"
+       inkscape:label="baseplate"
+       style="display:none">
+      <rect
+         height="48"
+         id="rect6284"
+         inkscape:label="48x48"
+         style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         width="48"
+         x="296"
+         y="50" />
+      <rect
+         height="32"
+         id="rect6592"
+         inkscape:label="32x32"
+         style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         width="32"
+         x="303"
+         y="126" />
+      <rect
+         height="22"
+         id="rect6749"
+         inkscape:label="22x22"
+         style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         width="22"
+         x="303"
+         y="177" />
+      <rect
+         height="16"
+         id="rect6833"
+         inkscape:label="16x16"
+         style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         width="16"
+         x="303"
+         y="219" />
+      <rect
+         height="24"
+         id="rect8104"
+         inkscape:label="24x24"
+         style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         width="24"
+         x="302"
+         y="176" />
+      <rect
+         height="256"
+         id="rect6282"
+         inkscape:label="256x256"
+         style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         width="256"
+         x="16"
+         y="36"
+         inkscape:export-filename="/home/lapo/Scrivania/cd.png"
+         inkscape:export-xdpi="90"
+         inkscape:export-ydpi="90" />
+      <text
+         id="context"
+         inkscape:label="context"
+         style="font-size:18.30070686px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;enable-background:new;font-family:Bitstream Vera Sans"
+         x="20.970737"
+         xml:space="preserve"
+         y="21.513618"><tspan
+           id="tspan2716"
+           sodipodi:role="line"
+           x="20.970737"
+           y="21.513618">apps</tspan></text>
+      <text
+         id="icon-name"
+         inkscape:label="icon-name"
+         sodipodi:linespacing="125%"
+         style="font-size:18.30070686px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;display:inline;enable-background:new;font-family:Droid Sans;-inkscape-font-specification:Droid Sans Bold"
+         x="191.97073"
+         xml:space="preserve"
+         y="21.513618"><tspan
+           id="tspan3023"
+           sodipodi:role="line"
+           x="191.97073"
+           y="21.513618">gtk3-demo</tspan></text>
+      <path
+         style="opacity:0.4510002;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         d="m 16,36 0,256 18,0 220,0 18,0 0,-18 0,-238 -18,0 0,238 -220,0 0,-238 -18,0 z"
+         id="rect10603"
+         inkscape:connector-curvature="0" />
+      <rect
+         inkscape:export-ydpi="90"
+         inkscape:export-xdpi="90"
+         inkscape:export-filename="/home/lapo/Scrivania/cd.png"
+         y="38.816284"
+         x="-538"
+         width="512"
+         style="fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+         inkscape:label="256x256"
+         id="rect17807"
+         height="512" />
+    </g>
+    <g
+       inkscape:groupmode="layer"
+       id="layer2"
+       inkscape:label="hires">
+      <g
+         id="g17679"
+         transform="matrix(1.011355,0,0,1.011355,0.4017933,-4.910467)">
+        <path
+           style="opacity:0.53469388;fill:#000000;fill-opacity:1;stroke:none;display:inline;filter:url(#filter8402);enable-background:new"
+           d="m 40.5,90 5,119.5 72,68 115,-48 L 241,109 155.5,59 z"
+           id="path8388"
+           inkscape:connector-curvature="0" />
+        <path
+           inkscape:connector-curvature="0"
+           id="path7588"
+           d="m 40.5,89 5,119.5 72,68 115,-48 L 241,108 155.5,58 z"
+           style="opacity:0.53469388;fill:#000000;fill-opacity:1;stroke:none;display:inline;filter:url(#filter8384);enable-background:new" />
+        <g
+           transform="matrix(2.270162,0,0,2.270162,-4.2860217,19.388834)"
+           id="layer1-2"
+           style="display:inline;enable-background:new">
+          <path
+             inkscape:connector-curvature="0"
+             d="M 20.88413,30.82696 53.816977,55.527708 107.33282,39.060543 70.587303,17.177763 20.88413,30.82696 z"
+             id="path6976"
+             style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.12364459;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+          <path
+             inkscape:connector-curvature="0"
+             d="m 22.94243,82.287118 -2.0583,-51.460158 32.932847,24.700748 0,55.577152 L 22.94243,82.287118 z"
+             id="path6978"
+             style="fill:#e40000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.12364459;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+          <path
+             inkscape:connector-curvature="0"
+             d="m 53.816977,111.10486 49.399213,-20.58416 4.11663,-51.460157 -53.515843,16.467165 0,55.577152 z"
+             id="path6980"
+             style="fill:#7fe719;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.12364459;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+          <path
+             inkscape:connector-curvature="0"
+             d="M 23.216626,81.319479 70.48573,67.361442 103.38422,90.444516"
+             id="path6982"
+             style="fill:none;stroke:#ffffff;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+          <path
+             inkscape:connector-curvature="0"
+             d="m 70.434539,17.875593 0,49.109284"
+             id="path6984"
+             style="fill:#babdb6;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        </g>
+      </g>
+      <g
+         transform="matrix(2.02271,0,0,2.02271,-569.19642,-43.00464)"
+         id="g17809">
+        <path
+           inkscape:connector-curvature="0"
+           id="path17811"
+           d="m 40.5,90 5,119.5 72,68 115,-48 L 241,109 155.5,59 z"
+           style="opacity:0.53469388;fill:#000000;fill-opacity:1;stroke:none;display:inline;filter:url(#filter8402);enable-background:new" />
+        <path
+           style="opacity:0.53469388;fill:#000000;fill-opacity:1;stroke:none;display:inline;filter:url(#filter8384);enable-background:new"
+           d="m 40.5,89 5,119.5 72,68 115,-48 L 241,108 155.5,58 z"
+           id="path17813"
+           inkscape:connector-curvature="0" />
+        <g
+           style="display:inline;enable-background:new"
+           id="g17815"
+           transform="matrix(2.270162,0,0,2.270162,-4.2860217,19.388834)">
+          <path
+             style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.12364459;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+             id="path17817"
+             d="M 20.88413,30.82696 53.816977,55.527708 107.33282,39.060543 70.587303,17.177763 20.88413,30.82696 z"
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:#e40000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.12364459;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+             id="path17819"
+             d="m 22.94243,82.287118 -2.0583,-51.460158 32.932847,24.700748 0,55.577152 L 22.94243,82.287118 z"
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:#7fe719;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.12364459;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+             id="path17821"
+             d="m 53.816977,111.10486 49.399213,-20.58416 4.11663,-51.460157 -53.515843,16.467165 0,55.577152 z"
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:none;stroke:#ffffff;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+             id="path17823"
+             d="M 23.216626,81.319479 70.48573,67.361442 103.38422,90.444516"
+             inkscape:connector-curvature="0" />
+          <path
+             style="fill:#babdb6;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+             id="path17825"
+             d="m 70.434539,17.875593 0,49.109284"
+             inkscape:connector-curvature="0" />
+        </g>
+      </g>
+    </g>
+    <g
+       inkscape:groupmode="layer"
+       id="layer3"
+       inkscape:label="lowres">
+      <g
+         id="g17722">
+        <path
+           sodipodi:nodetypes="ccccccc"
+           inkscape:connector-curvature="0"
+           id="path17708"
+           d="m 300,59.999999 0.0625,22.437501 15.5,13.3125 23.5,-8.875 L 339,63.999999 322.75,53.937499 z"
+           style="opacity:0.47346939;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter17718)" />
+        <g
+           transform="matrix(0.45064623,0,0,0.45064623,290.98476,45.227875)"
+           id="layer1-2-2"
+           style="display:inline;enable-background:new">
+          <path
+             sodipodi:nodetypes="ccccc"
+             inkscape:connector-curvature="0"
+             d="M 20.88413,30.82696 54.307319,56.487484 105.37145,40.041227 67.841387,18.256516 z"
+             id="path6976-8"
+             style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.12364459;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+          <path
+             sodipodi:nodetypes="ccccc"
+             inkscape:connector-curvature="0"
+             d="M 21.177198,81.306434 20.88413,30.82696 l 33.487606,26.019146 0.03365,52.905504 z"
+             id="path6978-0"
+             style="fill:#e40000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.12364459;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+          <path
+             sodipodi:nodetypes="ccccc"
+             inkscape:connector-curvature="0"
+             d="M 54.510426,109.71796 105.3737,89.932289 105.37145,39.845091 54.510426,56.250725 z"
+             id="path6980-8"
+             style="fill:#7fe719;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.12364459;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+          <path
+             sodipodi:nodetypes="ccc"
+             inkscape:connector-curvature="0"
+             d="M 23.216626,81.319479 67.249471,66.8711 103.38422,90.444516"
+             id="path6982-2"
+             style="fill:none;stroke:#ffffff;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+          <path
+             inkscape:connector-curvature="0"
+             d="m 67.198295,17.973661 0,49.109284"
+             id="path6984-5"
+             style="fill:#babdb6;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        </g>
+      </g>
+      <g
+         id="g17731"
+         transform="matrix(0.6583064,0,0,0.6583064,108.76773,93.275532)">
+        <path
+           style="opacity:0.55510203999999996;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter17787)"
+           d="m 300,60.805598 0.0625,22.437501 15.5,13.3125 23.5,-8.875 L 339,64.805598 322.75,54.743098 z"
+           id="path17733"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccccc" />
+        <g
+           style="display:inline;enable-background:new"
+           id="g17735"
+           transform="matrix(0.45064623,0,0,0.45064623,290.98476,45.227875)">
+          <path
+             style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:3.22592115;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+             id="path17737"
+             d="M 20.88413,30.82696 54.307319,56.487484 105.37145,40.041227 67.841387,18.256516 z"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccccc" />
+          <path
+             style="fill:#e40000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:3.22592115;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+             id="path17739"
+             d="M 21.177198,81.306434 20.88413,30.82696 l 33.487606,26.019146 0.03365,52.905504 z"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccccc" />
+          <path
+             style="fill:#7fe719;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:3.22592115;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+             id="path17741"
+             d="M 54.510426,109.71796 105.3737,89.932289 105.37145,39.845091 54.510426,56.250725 z"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccccc" />
+          <path
+             style="fill:none;stroke:#ffffff;stroke-width:1.89881182;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+             id="path17743"
+             d="M 23.216626,81.319479 67.249471,66.8711 103.38422,90.444516"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccc" />
+          <path
+             style="fill:#babdb6;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.89881182;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+             id="path17745"
+             d="m 67.198295,17.973661 0,49.109284"
+             inkscape:connector-curvature="0" />
+        </g>
+      </g>
+      <g
+         transform="matrix(0.52497154,0,0,0.5249716,146.75519,148.48904)"
+         id="g17747">
+        <path
+           sodipodi:nodetypes="ccccccc"
+           inkscape:connector-curvature="0"
+           id="path17749"
+           d="m 300,60.336735 0.0625,22.437501 15.5,13.3125 23.5,-8.875 L 339,64.336735 322.75,54.274235 z"
+           style="opacity:0.61632649;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter17771)" />
+        <g
+           transform="matrix(0.45064623,0,0,0.45064623,290.98476,45.227875)"
+           id="g17751"
+           style="display:inline;enable-background:new">
+          <path
+             sodipodi:nodetypes="ccccc"
+             inkscape:connector-curvature="0"
+             d="M 20.88413,30.82696 54.307319,56.487484 105.37145,40.041227 67.841387,18.256516 z"
+             id="path17753"
+             style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:4.04525661;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+          <path
+             sodipodi:nodetypes="ccccc"
+             inkscape:connector-curvature="0"
+             d="M 21.177198,81.306434 20.88413,30.82696 l 33.487606,26.019146 0.03365,52.905504 z"
+             id="path17755"
+             style="fill:#e40000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:4.04525661;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+          <path
+             sodipodi:nodetypes="ccccc"
+             inkscape:connector-curvature="0"
+             d="M 54.510426,109.71796 105.3737,89.932289 105.37145,39.845091 54.510426,56.250725 z"
+             id="path17757"
+             style="fill:#7fe719;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:4.04525661;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" />
+          <path
+             sodipodi:nodetypes="ccc"
+             inkscape:connector-curvature="0"
+             d="M 23.216626,81.319479 67.249471,66.8711 103.38422,90.444516"
+             id="path17759"
+             style="fill:none;stroke:#ffffff;stroke-width:2.3810811;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+          <path
+             inkscape:connector-curvature="0"
+             d="m 67.198295,17.973661 0,49.109284"
+             id="path17761"
+             style="fill:#babdb6;fill-rule:evenodd;stroke:#ffffff;stroke-width:2.3810811;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+        </g>
+      </g>
+      <g
+         id="g17791"
+         transform="matrix(0.34145959,0,0,0.34145962,201.89299,201.3414)">
+        <path
+           style="opacity:0.61632649;fill:#000000;fill-opacity:1;stroke:none;filter:url(#filter17771)"
+           d="m 300,60.336735 0.0625,22.437501 15.5,13.3125 23.5,-8.875 L 339,64.336735 322.75,54.274235 z"
+           id="path17793"
+           inkscape:connector-curvature="0"
+           sodipodi:nodetypes="ccccccc" />
+        <g
+           style="display:inline;enable-background:new"
+           id="g17795"
+           transform="matrix(0.45064623,0,0,0.45064623,290.98476,45.227875)">
+          <path
+             style="fill:#729fcf;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:6.21931458;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+             id="path17797"
+             d="M 20.88413,30.82696 54.307319,56.487484 105.37145,40.041227 67.841387,18.256516 z"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccccc" />
+          <path
+             style="fill:#e40000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:6.21931458;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+             id="path17799"
+             d="M 21.177198,81.306434 20.88413,30.82696 l 33.487606,26.019146 0.03365,52.905504 z"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccccc" />
+          <path
+             style="fill:#7fe719;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:6.21931458;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
+             id="path17801"
+             d="M 54.510426,109.71796 105.3737,89.932289 105.37145,39.845091 54.510426,56.250725 z"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccccc" />
+          <path
+             style="fill:none;stroke:#ffffff;stroke-width:3.66075492;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+             id="path17803"
+             d="M 23.216626,81.319479 67.249471,66.8711 103.38422,90.444516"
+             inkscape:connector-curvature="0"
+             sodipodi:nodetypes="ccc" />
+          <path
+             style="fill:#babdb6;fill-rule:evenodd;stroke:#ffffff;stroke-width:3.66075492;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+             id="path17805"
+             d="m 67.198295,17.973661 0,49.109284"
+             inkscape:connector-curvature="0" />
+        </g>
+      </g>
+    </g>
+  </g>
+  <g
+     inkscape:groupmode="layer"
+     id="layer4"
+     inkscape:label="clipshadow"
+     style="display:none">
+    <rect
+       height="256"
+       id="rect6282-0"
+       inkscape:label="256x256"
+       style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       width="256"
+       x="16"
+       y="36"
+       inkscape:export-filename="/home/lapo/Scrivania/cd.png"
+       inkscape:export-xdpi="90"
+       inkscape:export-ydpi="90" />
+  </g>
+</svg>
diff --git a/gtk3/sample/gtk-demo/data/symbolic-source.svg b/gtk3/sample/gtk-demo/data/symbolic-source.svg
new file mode 100644
index 0000000..36fa0ff
--- /dev/null
+++ b/gtk3/sample/gtk-demo/data/symbolic-source.svg
@@ -0,0 +1,29 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='gtk3-demo-symbolic.svg' height='16.000015' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' inkscape:version='0.48.5 r10040' version='1.1' w [...]
+  <metadata id='metadata90'>
+    <rdf:RDF>
+      <cc:Work rdf:about=''>
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+        <dc:title>Gnome Symbolic Icon Theme</dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-12.5126' inkscape:cy='-0.73412416' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape: [...]
+    <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-182.99998px' originy='-251.99998px' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+  </sodipodi:namedview>
+  <title id='title9167'>Gnome Symbolic Icon Theme</title>
+  <defs id='defs7386'>
+    <linearGradient id='linearGradient7212' osb:paint='solid'>
+      <stop id='stop7214' offset='0' style='stop-color:#000000;stop-opacity:1;'/>
+    </linearGradient>
+  </defs>
+  <g inkscape:groupmode='layer' id='layer9' inkscape:label='apps' style='display:inline' transform='translate(-424.00018,35)'>
+    
+    <rect height='8.0000048' id='rect7866' style='opacity:0.3;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.39999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(0.83205029,0.5547002,0,1,0,0)' width='7.2111053' x='510.78668' y='-314.33347'/>
+    <rect height='8.0000086' id='rect7868' style='opacity:0.5;color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.39999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new' transform='matrix(-0.86824295,0.49613928,0,1,0,0)' width='8.0622425' x='-505.61908' y='219.8575'/>
+    <path inkscape:connector-curvature='0' d='m 431.53145,-28 -5.875,-3.65625 6.8125,-3.34375 6.03125,3 z' id='path7870' sodipodi:nodetypes='ccccc' style='color:#000000;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.39999998;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new'/>
+  </g>
+</svg>
diff --git a/gtk3/sample/gtk-demo/demo.gresource.xml b/gtk3/sample/gtk-demo/demo.gresource.xml
index ca927ef..577f25f 100644
--- a/gtk3/sample/gtk-demo/demo.gresource.xml
+++ b/gtk3/sample/gtk-demo/demo.gresource.xml
@@ -2,11 +2,13 @@
 <gresources>
   <gresource prefix="/ui">
     <file preprocess="xml-stripblanks">main.ui</file>
+    <file preprocess="xml-stripblanks">appmenu.ui</file>
   </gresource>
-  <gresource prefix="/application">
+  <!--  <gresource prefix="/application_demo">
+    <file>application.c</file>
     <file>application.ui</file>
     <file>menus.ui</file>
-  </gresource>
+  </gresource>-->
   <gresource prefix="/builder">
     <file>demo.ui</file>
   </gresource>
@@ -91,6 +93,13 @@
   <gresource prefix="/stack">
     <file>stack.ui</file>
   </gresource>
+  <gresource prefix="/shortcuts">
+    <file>shortcuts.ui</file>
+    <file>shortcuts-builder.ui</file>
+    <file>shortcuts-gedit.ui</file>
+    <file>shortcuts-clocks.ui</file>
+    <file>shortcuts-boxes.ui</file>
+  </gresource>
   <gresource prefix="/revealer">
     <file>revealer.ui</file>
   </gresource>
@@ -110,8 +119,8 @@
     <file>gnu-keys.png</file>
   </gresource>
   <gresource prefix="/sources">
-<!--    <file>application.rb</file>
-    <file>assistant.rb</file> 
+<!--    <file>application_demo.rb</file>
+    <file>assistant.rb</file>
     <file>builder.rb</file>
     <file>button_box.rb</file>
     <file>changedisplay.rb</file>
@@ -133,6 +142,7 @@
     <file>expander.rb</file>
     <file>filtermodel.rb</file>
     <file>flowbox.rb</file>
+    <file>foreigndrawing.rb</file>
     <file>font_features.rb</file>
     <file>gestures.rb</file>
     <file>glarea.rb</file>
@@ -163,6 +173,7 @@
     <file>scale.rb</file>
     <file>search_entry.rb</file>
     <file>search_entry2.rb</file>
+    <file>shortcuts.rb</file>
     <file>sizegroup.rb</file>
     <file>sidebar.rb</file>
     <file>stack.rb</file>
@@ -191,7 +202,7 @@
     <file>glarea-fragment.glsl</file>
     <file>glarea-vertex.glsl</file>
   </gresource>
-  <gresource prefix="/font-features">
+  <gresource prefix="/font_features">
     <file>font-features.ui</file>
   </gresource>
   <gresource prefix="/spinbutton">
diff --git a/gtk3/sample/gtk-demo/demo.ui b/gtk3/sample/gtk-demo/demo.ui
index f14eb2e..bbed319 100644
--- a/gtk3/sample/gtk-demo/demo.ui
+++ b/gtk3/sample/gtk-demo/demo.ui
@@ -78,6 +78,7 @@
                         <property name="visible">1</property>
                         <property name="label" translatable="yes">Save _As</property>
                         <property name="use-underline">1</property>
+                        <accelerator key="s" modifiers="primary | shift-mask" signal="activate"/>
                       </object>
                     </child>
                     <child>
diff --git a/gtk3/sample/gtk-demo/font_features.rb b/gtk3/sample/gtk-demo/font_features.rb
index e37741a..2d5a70d 100644
--- a/gtk3/sample/gtk-demo/font_features.rb
+++ b/gtk3/sample/gtk-demo/font_features.rb
@@ -10,7 +10,7 @@
 =end
 module FontFeaturesDemo
   def self.run_demo(main_window)
-    builder = Gtk::Builder.new(:resource => "/font-features/font-features.ui")
+    builder = Gtk::Builder.new(:resource => "/font_features/font-features.ui")
     window = builder["window"]
     label = builder["label"]
     settings = builder["settings"]
diff --git a/gtk3/sample/gtk-demo/main.rb b/gtk3/sample/gtk-demo/main.rb
index 2981eac..b257356 100755
--- a/gtk3/sample/gtk-demo/main.rb
+++ b/gtk3/sample/gtk-demo/main.rb
@@ -438,7 +438,7 @@ class Demo < Gtk::Application
   def fontify(start_iter = @source_buffer.start_iter,
                 end_iter = @source_buffer.end_iter)
     str = @source_buffer.get_text(start_iter, end_iter, true)
-    tokenizer = RubyTokonizer.new
+    tokenizer = RubyTokenizer.new
     tokenizer.tokenize(str, start_iter.offset) do |tag, start, last|
       @source_buffer.apply_tag(tag.to_s,
                                @source_buffer.get_iter_at(:offset => start),
@@ -446,7 +446,7 @@ class Demo < Gtk::Application
     end
   end
 
-  class RubyTokonizer
+  class RubyTokenizer
     RESERVED_WORDS = %w(begin end module class def if then else
                         while unless do case when require yield)
     RESERVED_WORDS_PATTERN = Regexp.compile(/(^|\s+)(#{RESERVED_WORDS.collect do |pat| Regexp.quote(pat) end.join("|")})(\s+|$)/)
diff --git a/gtk3/sample/gtk-demo/main.ui b/gtk3/sample/gtk-demo/main.ui
index 03493d7..f284a1a 100644
--- a/gtk3/sample/gtk-demo/main.ui
+++ b/gtk3/sample/gtk-demo/main.ui
@@ -1,31 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <!-- interface-requires gtk+ 3.10 -->
-  <menu id="appmenu">
-    <section>
-      <item>
-        <attribute name="label" translatable="yes">About</attribute>
-        <attribute name="action">app.about</attribute>
-      </item>
-    </section>
-    <section>
-      <item>
-        <attribute name="label" translatable="yes">_Quit</attribute>
-        <attribute name="action">app.quit</attribute>
-        <attribute name="accel"><Primary>q</attribute>
-      </item>
-    </section>
-  </menu>
   <object class="GtkTreeStore" id="treestore">
     <columns>
-      <!-- column-name NAME
-      <column type="gchararray"/> -->
       <!-- column-name TITLE -->
       <column type="gchararray"/>
       <!-- column-name FILENAME -->
       <column type="gchararray"/>
-      <!-- column-name FUNC
-      <column type="gpointer"/> -->
       <!-- column-name STYLE -->
       <column type="gint"/>
     </columns>
@@ -41,7 +22,7 @@
         <property name="visible">1</property>
         <property name="show-close-button">1</property>
         <child>
-          <object class="GtkButton" id="run_button">
+          <object class="GtkButton">
             <property name="visible">1</property>
             <property name="valign">center</property>
             <property name="can_focus">1</property>
@@ -50,7 +31,7 @@
               <class name="text-button"/>
             </style>
             <child>
-              <object class="GtkLabel" id="run_label">
+              <object class="GtkLabel">
                 <property name="visible">1</property>
                 <property name="label" translatable="yes">Run</property>
               </object>
@@ -60,21 +41,18 @@
       </object>
     </child>
     <child>
-      <object class="GtkBox" id="box1">
+      <object class="GtkBox">
         <property name="visible">1</property>
         <child>
           <object class="GtkFrame">
             <property name="visible">1</property>
             <child>
-              <object class="GtkScrolledWindow" id="scrolledwindow">
+              <object class="GtkScrolledWindow">
                 <property name="width_request">120</property>
                 <property name="visible">1</property>
                 <property name="can_focus">1</property>
                 <property name="hscrollbar_policy">never</property>
                 <property name="min_content_width">150</property>
-                <style>
-                  <class name="sidebar"/>
-                </style>
                 <child>
                   <object class="GtkTreeView" id="treeview">
                     <property name="visible">1</property>
@@ -87,15 +65,19 @@
                       </object>
                     </child>
                     <child>
-                      <object class="GtkTreeViewColumn" id="treeviewcolumn0">
-                        <property name="title" translatable="yes">column</property>
+                      <object class="GtkTreeViewColumn">
                         <child>
-                          <object class="GtkCellRendererText" id="cellrenderertext0"/>
+                          <object class="GtkCellRendererText"/>
                           <attributes>
                             <attribute name="style">2</attribute>
                             <attribute name="text">0</attribute>
                           </attributes>
                         </child>
+                        <child>
+                          <object class="GtkCellRendererText">
+                            <property name="text">  </property>
+                          </object>
+                        </child>
                       </object>
                     </child>
                   </object>
@@ -112,7 +94,7 @@
             <property name="enable_popup">1</property>
             <property name="show_border">0</property>
             <child>
-              <object class="GtkScrolledWindow" id="info-scrolledwindow">
+              <object class="GtkScrolledWindow">
                 <property name="visible">1</property>
                 <property name="can_focus">1</property>
                 <child>
@@ -121,8 +103,8 @@
                     <property name="can_focus">1</property>
                     <property name="left-margin">20</property>
                     <property name="right-margin">20</property>
-                    <!-- TODO                   <property name="top-margin">20</property>
-                    <property name="bottom-margin">20</property>-->
+                    <property name="top-margin">20</property>
+                    <property name="bottom-margin">20</property>
                     <property name="pixels_above_lines">2</property>
                     <property name="pixels_below_lines">2</property>
                     <property name="editable">0</property>
@@ -136,7 +118,7 @@
               </packing>
             </child>
             <child type="tab">
-              <object class="GtkLabel" id="label1">
+              <object class="GtkLabel">
                 <property name="visible">1</property>
                 <property name="label" translatable="yes">_Info</property>
                 <property name="use_underline">1</property>
@@ -156,8 +138,8 @@
                     <property name="can_focus">1</property>
                     <property name="left-margin">20</property>
                     <property name="right-margin">20</property>
-                    <!--  TODO                  <property name="top-margin">20</property>
-                    <property name="bottom-margin">20</property> -->
+                    <property name="top-margin">20</property>
+                    <property name="bottom-margin">20</property>
                     <property name="editable">0</property>
                     <property name="cursor_visible">0</property>
                   </object>
@@ -169,7 +151,7 @@
               </packing>
             </child>
             <child type="tab">
-              <object class="GtkLabel" id="label2">
+              <object class="GtkLabel">
                 <property name="visible">1</property>
                 <property name="label" translatable="yes">Source</property>
               </object>
diff --git a/gtk3/sample/gtk-demo/markup.rb b/gtk3/sample/gtk-demo/markup.rb
index 643826e..2c33e15 100644
--- a/gtk3/sample/gtk-demo/markup.rb
+++ b/gtk3/sample/gtk-demo/markup.rb
@@ -17,25 +17,70 @@ module MarkupDemo
     window.screen = main_window.screen
     window.set_default_size(450, 450)
 
-    window.set_title("Markup")
+    stack = Gtk::Stack.new
+    stack.show
+    window.add(stack)
+
+    show_source = Gtk::CheckButton.new("Source")
+    show_source.valign = :center
+
+    header = Gtk::HeaderBar.new
+    header.pack_start(show_source)
+    header.show_close_button = true
+    header.show_all
+    window.titlebar = header
+
+    window.title = "Markup"
 
     view = Gtk::TextView.new
-    view.set_wrap_mode(:word)
-    view.set_left_margin(10)
-    view.set_right_margin(10)
+    view.wrap_mode = :word
+    view.left_margin = 10
+    view.right_margin = 10
 
     sw = Gtk::ScrolledWindow.new(nil, nil)
-    sw.set_policy(:never, :automatic)
+    sw.set_policy(:automatic, :automatic)
 
-    window.add(sw)
     sw.add(view)
+    sw.show_all
+
+    stack.add_named(sw, "formatted")
+
+    view2 = Gtk::TextView.new
+    view2.wrap_mode = :word
+    view2.left_margin = 10
+    view2.right_margin = 10
+
+    sw = Gtk::ScrolledWindow.new(nil, nil)
+    sw.set_policy(:automatic, :automatic)
+
+    sw.add(view2)
+    sw.show_all
+
+    stack.add_named(sw, "source")
 
     markup = Gio::Resources.lookup_data("/markup/markup.txt", 0)
-    
+
+    show_source.signal_connect "toggled" do |button|
+      if button.active?
+        stack.visible_child_name = "source"
+      else
+        buffer = view2.buffer
+        markup = buffer.get_text(buffer.start_iter,
+                                 buffer.end_iter,
+                                 false)
+        buffer = view.buffer
+        buffer.insert_markup(buffer.start_iter, markup, -1)
+        stack.visible_child_name = "formatted"
+      end
+    end
+
     buffer = view.buffer
     buffer.insert_markup(buffer.start_iter, markup, -1)
 
-    sw.show_all
+    buffer = view2.buffer
+    buffer.insert(buffer.start_iter, markup)
+
+    stack.show
 
     if !window.visible?
       window.show_all
diff --git a/gtk3/sample/gtk-demo/markup.txt b/gtk3/sample/gtk-demo/markup.txt
index feece2c..92da324 100644
--- a/gtk3/sample/gtk-demo/markup.txt
+++ b/gtk3/sample/gtk-demo/markup.txt
@@ -1,9 +1,9 @@
 
 Text sizes: <span size="xx-small">tiny</span> <span size="x-small">very small</span> <span size="small">small</span> <span size="medium">normal</span> <span size="large">large</span> <span size="x-large">very large</span> <span size="xx-large">huge</span>
 
-Text <span color="gray">c<span color="green">o</span>l<span color="tomato">o</span>rs</span>
+Text <span color="gray">c<span color="green">o</span>l<span color="tomato">o</span>rs</span> and <span background="pink">backgrounds</span>
 
-Colorful <span underline="low" underline-color="blue"><span underline="double" underline-color="red">under</span>lines</span>
+Colorful <span underline="low" underline-color="blue"><span underline="double" underline-color="red">under</span>lines</span> and <span background="pink"><span underline="error">mo</span><span underline="error" underline-color="green">re</span></span>
 
 Colorful <span strikethrough="true" strikethrough-color="magenta">strikethroughs</span>
 
diff --git a/gtk3/sample/gtk-demo/org.gtk.Demo.gschema.xml b/gtk3/sample/gtk-demo/org.gtk.Demo.gschema.xml
index 33e12aa..93be088 100644
--- a/gtk3/sample/gtk-demo/org.gtk.Demo.gschema.xml
+++ b/gtk3/sample/gtk-demo/org.gtk.Demo.gschema.xml
@@ -12,6 +12,15 @@
     <key name='color' enum='org.gtk.Demo.Color'>
       <default>'red'</default>
     </key>
+    <key name='window-size' type='(ii)'>
+      <default>(-1, -1)</default>
+    </key>
+    <key name='maximized' type='b'>
+      <default>false</default>
+    </key>
+    <key name='fullscreen' type='b'>
+      <default>false</default>
+    </key>
   </schema>
 
 </schemalist>
diff --git a/gtk3/sample/gtk-demo/pixbufs.rb b/gtk3/sample/gtk-demo/pixbufs.rb
index 6cb386a..2428953 100644
--- a/gtk3/sample/gtk-demo/pixbufs.rb
+++ b/gtk3/sample/gtk-demo/pixbufs.rb
@@ -1,167 +1,127 @@
-# Copyright (c) 2003-2014 Ruby-GNOME2 Project Team
+# Copyright (c) 2016 Ruby-GNOME2 Project Team
 # This program is licenced under the same licence as Ruby-GNOME2.
 #
-# $Id: pixbufs.rb,v 1.5 2005/02/12 23:02:43 kzys Exp $
 =begin
-= Pixbufs
+=  Pixbufs
 
-A Gdk::Pixbuf represents an image, normally in RGB or RGBA format.
-Pixbufs are normally used to load files from disk and perform
-image scaling.
+ A GdkPixbuf represents an image, normally in RGB or RGBA format.
+ Pixbufs are normally used to load files from disk and perform
+ image scaling.
 
-This demo is not all that educational, but looks cool. It was written
-by Extreme Pixbuf Hacker Federico Mena Quintero. It also shows
-off how to use Gtk::DrawingArea to do a simple animation.
+ This demo is not all that educational, but looks cool. It was written
+ by Extreme Pixbuf Hacker Federico Mena Quintero. It also shows
+ off how to use GtkDrawingArea to do a simple animation.
 
-Look at the Image demo for additional pixbuf usage examples.
+ Look at the Image demo for additional pixbuf usage examples.
 =end
-
-require "common"
-
-module Demo
-  class Pixbufs < BasicWindow
-    FRAME_DELAY = 50
-
-    BACKGROUND_NAME = "background.jpg"
-
-    IMAGE_NAMES = [
-      "apple-red.png",
-      "gnome-applets.png",
-      "gnome-calendar.png",
-      "gnome-foot.png",
-      "gnome-gmush.png",
-      "gnome-gimp.png",
-      "gnome-gsame.png",
-      "gnu-keys.png",
-      "ruby-gnome2-logo.png",
-    ]
-
-    CYCLE_LEN = 60
-    def initialize
-      super("Pixbufs")
-      set_resizable(false)
-
-      @background = nil
-      @frame = nil
-      @frame_num = 0
-      @images = []
-
-      begin
-        load_pixbufs
-
-        set_size_request(@background.width, @background.height)
-
-        @frame = Gdk::Pixbuf.new(Gdk::Pixbuf::COLORSPACE_RGB,
-                                 false, 8,
-                                 @background.width, @background.height)
-
-        @da = Gtk::DrawingArea.new
-
-        @da.signal_connect("draw") do |w, e|
-          draw_cb(w, e)
-        end
-
-        add(@da)
-
-        timeout_id = GLib::Timeout.add(FRAME_DELAY) do
-          timeout
-        end
-        signal_connect("destroy") do
-          GLib::Source.remove(timeout_id)
-        end
-      rescue
-        message = "Failed to load an image: #{$!.message}"
-        dialog = Gtk::MessageDialog.new(:parent       => self,
-                                        :flags        => :destroy_with_parent,
-                                        :type         => :error,
-                                        :buttons_type => :close,
-                                        :message      => message)
-
-        dialog.signal_connect("response") do
-          dialog.destroy
-        end
-
-        dialog.show
-      end
+module PixbufsDemo
+  IMAGES_NAMES = %w(/pixbufs/apple-red.png /pixbufs/gnome-applets.png
+                    /pixbufs/gnome-calendar.png /pixbufs/gnome-foot.png
+                    /pixbufs/gnome-gmush.png /pixbufs/gnome-gimp.png
+                    /pixbufs/gnome-gsame.png /pixbufs/gnu-keys.png)
+  N_IMAGES = IMAGES_NAMES.size
+  BACKGROUND_NAME = "/pixbufs/background.jpg"
+  CYCLE_TIME = 3_000_000
+
+  def self.run_demo(main_window)
+    window = Gtk::Window.new(:toplevel)
+    window.screen = main_window.screen
+    window.resizable = false
+
+    background_pixbuf = load_pixbuf(window, BACKGROUND_NAME)
+    other_pixbufs = []
+    IMAGES_NAMES.each do |img|
+      other_pixbufs << load_pixbuf(window, img)
     end
 
-    def load_pixbufs
-      # Loads the images for the demo
+    width = background_pixbuf.width
+    height = background_pixbuf.height
+    window.set_size_request(width, height)
 
-      if @background
-        return # already loaded earlier
-      end
+    frame = GdkPixbuf::Pixbuf.new(:colorspace => :rgb,
+                                 :has_alpha => false,
+                                 :bits_per_sample => 8,
+                                 :width => width, :height => height)
 
-      # demo_find_file() looks in the the current directory first,
-      # so you can run gtk-demo without installing GTK, then looks
-      # in the location where the file is installed.
-      #
-      filename = Demo.find_file(BACKGROUND_NAME)
-      @background = Gdk::Pixbuf.new(filename)
+    da = Gtk::DrawingArea.new
+    da.signal_connect "draw" do |_widget, cr|
+      cr.set_source_pixbuf(frame, 0, 0)
+      cr.paint
+      true
+    end
+    window.add(da)
+    start_time = 0
+    da.add_tick_callback do |_widget, frame_clock|
+      background_pixbuf.copy_area(0, 0, width, height, frame, 0, 0)
+      start_time = frame_clock.frame_time if start_time == 0
+      current_time = frame_clock.frame_time
+      f = ((current_time - start_time) % CYCLE_TIME) / Float(CYCLE_TIME)
+      xmid = width / 2
+      ymid = height / 2
+      radius = [xmid, ymid].min / 2
+      N_IMAGES.times do |i|
+        ang = 2 * Math::PI * i / N_IMAGES - f * 2 * Math::PI
+        iw = other_pixbufs[i].width
+        ih = other_pixbufs[i].height
+
+        r = radius + (radius / 3) * Math.sin(f * 2 * Math::PI)
+
+        xpos = (xmid + r * Math.cos(ang) - iw / 2 + 0.5).floor
+        ypos = (ymid + r * Math.sin(ang) - ih / 2 + 0.5).floor
+        k = (i & 1) ? Math.sin(f * 2 * Math::PI) : Math.cos(f * 2 * Math::PI)
+        k = 2.0 * k * k
+        k = [0.25, k].max
+
+        r1 = Gdk::Rectangle.new(xpos, ypos, iw * k, iw * k)
+        r2 = Gdk::Rectangle.new(0, 0, width, height)
 
-      IMAGE_NAMES.each_with_index do |basename, i|
-        filename = Demo.find_file(basename)
+        dest = r1.intersect(r2)
+        next unless dest
+        frame.composite!(other_pixbufs[i], dest.x, dest.y, dest.width,
+                         dest.height, xpos, ypos, k, k,
+                         :nearest,
+                         if (i & 1) == 1
+                           [
+                             127, (255 * Math.sin(f * 2.0 * Math::PI)).abs
+                           ].max
+                         else
+                           [
+                             127, (255 * Math.cos(f * 2.0 * Math::PI)).abs
+                           ].max
+                         end)
 
-        @images[i] = Gdk::Pixbuf.new(filename)
       end
+      da.queue_draw
+      GLib::Source::CONTINUE
     end
 
-    def draw_cb(widget, cairo_context)
-      cairo_context.set_source_pixbuf(@frame)
-      cairo_context.paint
-      true
+    if !window.visible?
+      window.show_all
+    else
+      window.destroy
     end
+    window
+  end
 
-    # Timeout handler to regenerate the frame
-    def timeout
-      @background.copy_area(0, 0, @background.width, @background.height,
-                           @frame, 0, 0)
-
-      f = Float(@frame_num % CYCLE_LEN) / CYCLE_LEN;
-
-      xmid = @background.width  / 2.0
-      ymid = @background.height / 2.0
-
-      radius = [xmid, ymid].min / 2.0
-
-      @images.each_with_index do |image, i|
-        ang = 2.0 * Math::PI * Float(i) / IMAGE_NAMES.length - f * 2.0 * Math::PI
-
-        r = radius + (radius / 3.0) * Math.sin(f * 2.0 * Math::PI)
-
-        xpos = (xmid + r * Math.cos(ang) - image.width  / 2.0 + 0.5).floor
-        ypos = (ymid + r * Math.sin(ang) - image.height / 2.0 + 0.5).floor
-
-        k = if (i & 1) == 1
-              Math.sin(f * 2.0 * Math::PI)
-            else
-              Math.cos(f * 2.0 * Math::PI)
-            end
-        k = [0.25, 2.0 * k * k].max
-
-        r1 = Gdk::Rectangle.new(xpos, ypos, image.width * k, image.height * k)
-        r2 = Gdk::Rectangle.new(0, 0, @background.width, @background.height)
+  def self.show_message_dialog_on(window, error)
+    message = "Failed to load an image: #{error.message}"
+    dialog = Gtk::MessageDialog.new(:parent => window,
+                                    :flags => :destroy_with_parent,
+                                    :type => :error,
+                                    :buttons => :close,
+                                    :message => message)
+    dialog.signal_connect("response", &:destroy)
+    dialog.show
+  end
 
-        dest = r1.intersect(r2)
-        if dest
-          @frame.composite!(image, dest.x, dest.y, dest.width, dest.height,
-                            xpos, ypos, k, k, Gdk::Pixbuf::INTERP_NEAREST,
-                            if (i & 1) == 1
-                              [
-                                127,
-                                (255 * Math.sin(f * 2.0 * Math::PI)).abs,
-                              ].max
-                            else
-                              [
-                                127,
-                                (255 * Math.cos(f * 2.0 * Math::PI)).abs,
-                              ].max
-                            end)
-        end
-      end
-      @da.queue_draw
-      @frame_num += 1
-      true
+  def self.load_pixbuf(window, image_name)
+    begin
+      # Is it OK? should we implement gdk_pixbuf_new_from_resource instead?
+      #Gtk::Image.new(:resource => image_name).pixbuf
+      GdkPixbuf::Pixbuf.new(:resource => image_name)
+    rescue StandardError => e
+      show_message_dialog_on(window, e)
+      window.destroy
     end
   end
 end
diff --git a/gtk3/sample/gtk-demo/reset.css b/gtk3/sample/gtk-demo/reset.css
index 1c27a8e..7af3e7f 100644
--- a/gtk3/sample/gtk-demo/reset.css
+++ b/gtk3/sample/gtk-demo/reset.css
@@ -7,62 +7,5 @@
  */
 
 * {
-  color: inherit;
-  font-size: inherit;
-  background-color: initial;
-  font-family: inherit;
-  font-style: inherit;
-  font-variant: inherit;
-  font-weight: inherit;
-  text-shadow: inherit;
-  icon-shadow: inherit;
-  box-shadow: initial;
-  margin-top: initial;
-  margin-left: initial;
-  margin-bottom: initial;
-  margin-right: initial;
-  padding-top: initial;
-  padding-left: initial;
-  padding-bottom: initial;
-  padding-right: initial;
-  border-top-style: initial;
-  border-top-width: initial;
-  border-left-style: initial;
-  border-left-width: initial;
-  border-bottom-style: initial;
-  border-bottom-width: initial;
-  border-right-style: initial;
-  border-right-width: initial;
-  border-top-left-radius: initial;
-  border-top-right-radius: initial;
-  border-bottom-right-radius: initial;
-  border-bottom-left-radius: initial;
-  outline-style: initial;
-  outline-width: initial;
-  outline-offset: initial;
-  background-clip: initial;
-  background-origin: initial;
-  background-size: initial;
-  background-position: initial;
-  border-top-color: initial;
-  border-right-color: initial;
-  border-bottom-color: initial;
-  border-left-color: initial;
-  outline-color:  initial;
-  background-repeat: initial;
-  background-image: initial;
-  border-image-source: initial;
-  border-image-repeat: initial;
-  border-image-slice: initial;
-  border-image-width: initial;
-  transition-property: initial;
-  transition-duration: initial;
-  transition-timing-function: initial;
-  transition-delay: initial;
-  engine: initial;
-  gtk-key-bindings: initial;
-
-  -GtkWidget-focus-line-width: 0;
-  -GtkWidget-focus-padding: 0;
-  -GtkNotebook-initial-gap: 0;
+  all: unset;
 }
diff --git a/gtk3/sample/gtk-demo/rotated_text.rb b/gtk3/sample/gtk-demo/rotated_text.rb
index 01b2d23..83e6099 100644
--- a/gtk3/sample/gtk-demo/rotated_text.rb
+++ b/gtk3/sample/gtk-demo/rotated_text.rb
@@ -1,72 +1,136 @@
-# Copyright (c) 2005-2014  Ruby-GNOME2 Project Team
+# Copyright (c) 2016 Ruby-GNOME2 Project Team
 # This program is licenced under the same licence as Ruby-GNOME2.
 #
-# $Id: rotated_text.rb,v 1.2 2005/03/05 15:01:16 mutoh Exp $
 =begin
-= Rotated Text
+=  Pango/Rotated Text
 
-This demo shows how to use Cairo and Pango to draw rotated and transformed text.
+ This demo shows how to use PangoCairo to draw rotated and transformed
+ text. The right pane shows a rotated GtkLabel widget.
+
+ In both cases, a custom PangoCairo shape renderer is installed to draw
+ a red heard using cairo drawing operations instead of the Unicode heart
+ character.
 =end
-require "common"
-
-module Demo
-  class RotatedText < BasicWindow
-    RADIUS = 150
-    N_WORDS = 10
-    FONT = "Sans Bold 27"
-
-    def initialize
-      super("Rotated Text")
-
-      drawing_area = Gtk::DrawingArea.new
-      add(drawing_area)
-      drawing_area.override_background_color(:normal, Gdk::RGBA.new(1.0,
-                                                                    1.0,
-                                                                    1.0,
-                                                                    0.0))
-
-      drawing_area.signal_connect("draw") do |_drawing_area, cairo_context|
-        cairo_context.set_source_rgb(1.0, 1.0, 1.0)
-        cairo_context.paint
-        cairo_context.save do
-          width, height = size
-          cairo_context.scale(width.to_f / (RADIUS * 2),
-                              height.to_f / (RADIUS * 2))
-          draw_text(cairo_context)
-        end
-      end
-    end
+module RotatedTextDemo
+  HEART = "♥"
+  RADIUS = 150
+  N_WORDS = 5
+  FONT = "Serif 18"
+  TEXT = "I ♥ GTK+"
 
-    private
-    def draw_text(cairo_context)
-      # Center coordinates on the middle of the region we are drawing
-      cairo_context.translate(RADIUS, RADIUS)
+  def self.run_demo(main_window)
+    window = Gtk::Window.new(:toplevel)
+    window.screen = main_window.screen
+    window.title = "Rotated Text"
+    window.set_default_size(4 * RADIUS, 2 * RADIUS)
 
-      # Create a PangoLayout, set the font and text
-      layout = cairo_context.create_pango_layout
+    box = Gtk::Box.new(:horizontal, 0)
+    box.homogeneous = true
+    window.add(box)
 
-      layout.text = "Text"
-      layout.font_description = Pango::FontDescription.new(FONT)
+    # Add adrawing area
+    drawing_area = Gtk::DrawingArea.new
+    box.add(drawing_area)
+    drawing_area.style_context.add_class("view")
 
-      # Draw the layout N_WORDS times in a circle
-      N_WORDS.times do |i|
-        angle = (360.0 * i) / N_WORDS
+    drawing_area.signal_connect "draw" do |widget, cr|
+      # Create a cairo context and set up a transformation matrix so that the
+      # user space coordinates for the centered square where we draw are
+      # [-RADIUS, RADIUS], [-RADIUS, RADIUS].
+      # We first center, then change the scale.
+      width = widget.allocated_width
+      height = widget.allocated_width
+      device_radius = [width, height].min / 2
+      cr.translate(device_radius + (width - 2 * device_radius) / 2,
+                   device_radius + (height - 2 * device_radius) / 2)
+      cr.scale(device_radius / RADIUS, device_radius / RADIUS)
+
+      # Create a subtle gradient source and use it
+      pattern = Cairo::LinearPattern.new(-RADIUS, -RADIUS, RADIUS, RADIUS)
+      pattern.add_color_stop_rgb(0, 0.5, 0, 0)
+      pattern.add_color_stop_rgb(1, 0, 0, 0.5)
+      cr.set_source(pattern)
 
-        cairo_context.save do
-          # Gradient from red at angle == 60 to blue at angle == 240
-          red = (1 + Math.cos((angle - 60) * Math::PI / 180.0)) / 2
-          cairo_context.set_source_rgb(red, 0.0, 1.0 - red)
+      # Create a PangoContext and set up our shape renderer
+      context = widget.create_pango_context
+      context.set_shape_renderer do |cairo, attr, do_path|
+        fancy_shape_renderer(cairo, attr, do_path)
+      end
 
-          cairo_context.rotate(angle * Math::PI / 180.0)
+      # Create a PangoLayout, set the text, font and attributes
+      layout = Pango::Layout.new(context)
+      layout.text = TEXT
+      desc = Pango::FontDescription.new(FONT)
+      layout.font_description = desc
 
-          # Inform Pango to re-layout the text with the new transformation
-          cairo_context.update_pango_layout(layout)
+      attrs = create_fancy_attr_list_for_layout(layout)
+      layout.attributes = attrs
 
-          width, height = layout.size
-          cairo_context.move_to(-(width / Pango::SCALE) / 2, -RADIUS)
-          cairo_context.show_pango_layout(layout)
-        end
+      # Draw the layout N_WORDS times in a circle
+      N_WORDS.times do
+        # inform Pango to re-layout the text with the new transformation matrix
+        cr.update_pango_layout(layout)
+        w, = layout.pixel_size
+        cr.move_to(- w / 2, - RADIUS * 0.9)
+        cr.show_pango_layout(layout)
+        cr.rotate(Math::PI * 2 / N_WORDS)
       end
+
+      false
+    end
+
+    # And a label
+    label = Gtk::Label.new(TEXT)
+    box.add(label)
+    label.angle = 45
+
+    # Set up fancy stuff on the label
+    layout = label.layout
+    layout.context.set_shape_renderer do |cr, attr, do_path|
+      fancy_shape_renderer(cr, attr, do_path)
     end
+
+    layout.attributes = create_fancy_attr_list_for_layout(layout)
+
+    if !window.visible?
+      window.show_all
+    else
+      window.destroy
+    end
+    window
+  end
+
+  def self.fancy_shape_renderer(cr, attr, do_path)
+    x, y = cr.current_point
+    cr.translate(x, y)
+    cr.scale(attr.ink_rect.width / Pango::SCALE,
+             attr.ink_rect.height / Pango::SCALE)
+
+    if attr.data == HEART
+      cr.move_to(0.5, 0)
+      cr.line_to(0.9, -0.4)
+      cr.curve_to(1.1, -0.8, 0.5, -0.9, 0.5, -0.5)
+      cr.curve_to(0.5, -0.9, -0.1, -0.8, 0.1, -0.4)
+      cr.close_path
+    end
+
+    unless do_path
+      cr.set_source_rgb(1, 0, 0)
+      cr.fill
+    end
+  end
+
+  def self.create_fancy_attr_list_for_layout(layout)
+    metrics = layout.context.get_metrics(layout.font_description)
+    ascent = metrics.ascent
+    logical_rect = Pango::Rectangle.new(0, -ascent, ascent, ascent)
+    ink_rect = logical_rect.dup
+
+    attrs = Pango::AttrList.new
+    attr = Pango::AttrShape.new(ink_rect, logical_rect, HEART)
+    attr.start_index = TEXT[0, TEXT.index(HEART)].bytesize
+    attr.end_index = attr.start_index + HEART.bytesize
+    attrs.insert(attr)
+    attrs
   end
 end
diff --git a/gtk3/sample/gtk-demo/shortcuts-boxes.ui b/gtk3/sample/gtk-demo/shortcuts-boxes.ui
new file mode 100644
index 0000000..6bcaf8a
--- /dev/null
+++ b/gtk3/sample/gtk-demo/shortcuts-boxes.ui
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <!-- interface-requires gtk+ 3.17 -->
+
+  <object class="GtkShortcutsWindow" id="shortcuts-boxes">
+    <property name="modal">1</property>
+    
+    <child>
+      <object class="GtkShortcutsSection">
+        <property name="visible">1</property>
+        <property name="section-name">shortcuts</property>
+        <property name="max-height">12</property>
+
+        <!-- Overview shortcuts -->
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">Overview</property>
+            <property name="view">overview</property>
+
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator">F1</property>
+                <property name="title" translatable="yes">Help</property>
+              </object>
+            </child>
+
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><Ctrl>n</property>
+                <property name="title" translatable="yes">Create a new box</property>
+              </object>
+            </child>
+
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><Ctrl>f</property>
+                <property name="title" translatable="yes">Search</property>
+              </object>
+            </child>
+
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><Ctrl>k</property>
+                <property name="title" translatable="yes">Keyboard shortcuts</property>
+              </object>
+            </child>
+
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><Ctrl>q</property>
+                <property name="title" translatable="yes">Close Window/Quit Boxes</property>
+              </object>
+            </child>
+          </object>
+        </child>
+
+        <!-- Wizard and Properties shortcuts -->
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">Box Creation and Properties</property>
+            <property name="view">wizard</property>
+
+            <!-- LTR -->
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="direction">ltr</property>
+                <property name="accelerator"><Alt>Right</property>
+                <property name="title" translatable="yes">Switch to the next page</property>
+              </object>
+            </child>
+
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="direction">ltr</property>
+                <property name="accelerator"><Alt>Left</property>
+                <property name="title" translatable="yes">Switch to the previous page</property>
+              </object>
+            </child>
+
+            <!-- RTL -->
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="direction">rtl</property>
+                <property name="accelerator"><Alt>Left</property>
+                <property name="title" translatable="yes">Switch to the next page</property>
+              </object>
+            </child>
+
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="direction">rtl</property>
+                <property name="accelerator"><Alt>Right</property>
+                <property name="title" translatable="yes">Switch to the previous page</property>
+              </object>
+            </child>
+          </object>
+        </child>
+
+        <!-- Display shortcuts -->
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">Box Display</property>
+            <property name="view">display</property>
+
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator">Control_L+Alt_L</property>
+                <property name="title" translatable="yes">Grab/Ungrab keyboard</property>
+              </object>
+            </child>
+
+            <!-- LTR -->
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="direction">ltr</property>
+                <property name="accelerator"><Alt>Left</property>
+                <property name="title" translatable="yes">Back to overview</property>
+              </object>
+            </child>
+
+            <!-- RTL -->
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="direction">rtl</property>
+                <property name="accelerator"><Alt>Right</property>
+                <property name="title" translatable="yes">Back to overview</property>
+              </object>
+            </child>
+
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><Ctrl>q</property>
+                <property name="title" translatable="yes">Close window/Quit Boxes</property>
+              </object>
+            </child>
+
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator">F11</property>
+                <property name="title" translatable="yes">Fullscreen/Restore from fullscreen</property>
+              </object>
+            </child>
+          </object>
+        </child>
+
+      </object>
+    </child>
+  </object>
+
+</interface>
diff --git a/gtk3/sample/gtk-demo/shortcuts-builder.ui b/gtk3/sample/gtk-demo/shortcuts-builder.ui
new file mode 100644
index 0000000..20ed760
--- /dev/null
+++ b/gtk3/sample/gtk-demo/shortcuts-builder.ui
@@ -0,0 +1,547 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <!-- interface-requires gtk+ 3.17 -->
+
+  <object class="GtkShortcutsWindow" id="shortcuts-builder">
+    <property name="modal">1</property>
+    <child>
+      <object class="GtkShortcutsSection">
+        <property name="visible">1</property>
+        <property name="section-name">editor</property>
+        <property name="title" translatable="yes">Editor Shortcuts</property>
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">General</property>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="title" translatable="yes">Global Search</property>
+                <property name="accelerator"><ctrl>period</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="title" translatable="yes">Preferences</property>
+                <property name="accelerator"><ctrl>comma</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="title" translatable="yes">Command Bar</property>
+                <property name="accelerator"><ctrl>Return</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="title" translatable="yes">Terminal</property>
+                <property name="accelerator"><ctrl><shift>t</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="title" translatable="yes">Keyboard Shortcuts</property>
+                <property name="accelerator"><ctrl><shift>question</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">Panels</property>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="title" translatable="yes">Toggle left panel</property>
+                <property name="accelerator">F9</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="title" translatable="yes">Toggle right panel</property>
+                <property name="accelerator"><shift>F9</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="title" translatable="yes">Toggle bottom panel</property>
+                <property name="accelerator"><ctrl>F9</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">Touchpad gestures</property>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="shortcut-type">gesture-two-finger-swipe-right</property>
+                <property name="title" translatable="yes">Switch to the next document</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="shortcut-type">gesture-two-finger-swipe-left</property>
+                <property name="title" translatable="yes">Switch to the previous document</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">Files</property>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>n</property>
+                <property name="title" translatable="yes">Create new document</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>o</property>
+                <property name="title" translatable="yes">Open a document</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>s</property>
+                <property name="title" translatable="yes">Save the document</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>w</property>
+                <property name="title" translatable="yes">Close the document</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl><alt>Page_Down</property>
+                <property name="title" translatable="yes">Switch to the next document</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl><alt>Page_Up</property>
+                <property name="title" translatable="yes">Switch to the previous document</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">Find and replace</property>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>f</property>
+                <property name="title" translatable="yes">Find</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>g</property>
+                <property name="title" translatable="yes">Find the next match</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl><shift>g</property>
+                <property name="title" translatable="yes">Find the previous match</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl><shift>k</property>
+                <property name="title" translatable="yes">Clear highlight</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">Copy and Paste</property>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>c</property>
+                <property name="title" translatable="yes">Copy selected text to clipboard</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>x</property>
+                <property name="title" translatable="yes">Cut selected text to clipboard</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>v</property>
+                <property name="title" translatable="yes">Paste text from clipboard</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">Undo and Redo</property>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>z</property>
+                <property name="title" translatable="yes">Undo previous command</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl><shift>z</property>
+                <property name="title" translatable="yes">Redo previous command</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">Editing</property>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl><shift>a</property>
+                <property name="title" translatable="yes">Increment number at cursor</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl><shift>x</property>
+                <property name="title" translatable="yes">Decrement number at cursor</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>j</property>
+                <property name="title" translatable="yes">Join selected lines</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>space</property>
+                <property name="title" translatable="yes">Show completion window</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator">Insert</property>
+                <property name="title" translatable="yes">Toggle overwrite</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl><alt>i</property>
+                <property name="title" translatable="yes">Reindent line</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">Navigation</property>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><alt>n</property>
+                <property name="title" translatable="yes">Move to next error in file</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><alt>p</property>
+                <property name="title" translatable="yes">Move to previous error in file</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><shift><alt>Left</property>
+                <property name="title" translatable="yes">Move to previous edit location</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><shift><alt>Right</property>
+                <property name="title" translatable="yes">Move to next edit location</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><alt>period</property>
+                <property name="title" translatable="yes">Jump to definition of symbol</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><alt><shift>Up</property>
+                <property name="title" translatable="yes">Move sectionport up within the file</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><alt><shift>Down</property>
+                <property name="title" translatable="yes">Move sectionport down within the file</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><alt><shift>End</property>
+                <property name="title" translatable="yes">Move sectionport to end of file</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><alt><shift>Home</property>
+                <property name="title" translatable="yes">Move sectionport to beginning of file</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>percent</property>
+                <property name="title" translatable="yes">Move to matching bracket</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">Selections</property>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>a</property>
+                <property name="title" translatable="yes">Select all</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>backslash</property>
+                <property name="title" translatable="yes">Unselect all</property>
+              </object>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+    <child>
+      <object class="GtkShortcutsSection">
+        <property name="visible">1</property>
+        <property name="section-name">terminal</property>
+        <property name="title" translatable="yes">Terminal Shortcuts</property>
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">General</property>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="title" translatable="yes">Global Search</property>
+                <property name="accelerator"><ctrl>period</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="title" translatable="yes">Preferences</property>
+                <property name="accelerator"><ctrl>comma</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="title" translatable="yes">Command Bar</property>
+                <property name="accelerator"><ctrl>Return</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="title" translatable="yes">Terminal</property>
+                <property name="accelerator"><ctrl><shift>t</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="title" translatable="yes">Keyboard Shortcuts</property>
+                <property name="accelerator"><ctrl><shift>question</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">Copy and Paste</property>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl><shift>c</property>
+                <property name="title" translatable="yes">Copy selected text to clipboard</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl><shift>v</property>
+                <property name="title" translatable="yes">Paste text from clipboard</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">Switching</property>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><alt>1...9</property>
+                <property name="title" translatable="yes">Switch to n-th tab</property>
+              </object>
+            </child>
+          </object>
+        </child>
+
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">All gestures</property>
+
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="shortcut-type">gesture-pinch</property>
+                <property name="title" translatable="yes">A stock pinch gesture</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="shortcut-type">gesture-stretch</property>
+                <property name="title" translatable="yes">A stock stretch gesture</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="shortcut-type">gesture-rotate-clockwise</property>
+                <property name="title" translatable="yes">A stock rotation gesture</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="shortcut-type">gesture-rotate-counterclockwise</property>
+                <property name="title" translatable="yes">A stock rotation gesture</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="shortcut-type">gesture-two-finger-swipe-left</property>
+                <property name="title" translatable="yes">A stock swipe gesture</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="shortcut-type">gesture-two-finger-swipe-right</property>
+                <property name="title" translatable="yes">A stock swipe gesture</property>
+              </object>
+            </child>
+
+          </object>
+        </child>
+
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">'Special' combinations</property>
+
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator">t+t</property>
+                <property name="title" translatable="yes">You want tea ?</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><shift><ctrl></property>
+                <property name="title" translatable="yes">Shift Control</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>&<ctrl></property>
+                <property name="title" translatable="yes">Control Control</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator">Control_L&Control_R</property>
+                <property name="title" translatable="yes">Left and right control</property>
+              </object>
+            </child>
+
+          </object>
+        </child>
+
+      </object>
+    </child>
+  </object>
+
+</interface>
diff --git a/gtk3/sample/gtk-demo/shortcuts-clocks.ui b/gtk3/sample/gtk-demo/shortcuts-clocks.ui
new file mode 100644
index 0000000..5d31a9b
--- /dev/null
+++ b/gtk3/sample/gtk-demo/shortcuts-clocks.ui
@@ -0,0 +1,166 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <!-- interface-requires gtk+ 3.17 -->
+
+  <object class="GtkShortcutsWindow" id="shortcuts-clocks">
+    <property name="modal">1</property>
+    <child>
+      <object class="GtkShortcutsSection">
+        <property name="visible">1</property>
+        <property name="section-name">shortcuts</property>
+        <property name="max-height">10</property>
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">General</property>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>Page_Down</property>
+                <property name="title" translatable="yes">Go to the next section</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>Page_Up</property>
+                <property name="title" translatable="yes">Go to the previous section</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><alt>Q</property>
+                <property name="title" translatable="yes">Quit</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><alt>Right</property>
+                <property name="direction">ltr</property>
+                <property name="title" translatable="yes">Forward</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>Left</property>
+                <property name="direction">ltr</property>
+                <property name="title" translatable="yes">Back</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><alt>Left</property>
+                <property name="direction">rtl</property>
+                <property name="title" translatable="yes">Forward</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>Right</property>
+                <property name="direction">rtl</property>
+                <property name="title" translatable="yes">Back</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="view">world</property>
+            <property name="title" translatable="yes">World Clocks</property>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>N</property>
+                <property name="title" translatable="yes">Add a world clock</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>S</property>
+                <property name="title" translatable="yes">Select world clocks</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="view">alarm</property>
+            <property name="title" translatable="yes">Alarm</property>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>N</property>
+                <property name="title" translatable="yes">Add an alarm</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>S</property>
+                <property name="title" translatable="yes">Select alarms</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="view">stopwatch</property>
+            <property name="title" translatable="yes">Stopwatch</property>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator">Return space</property>
+                <property name="title" translatable="yes">Start / Stop / Continue</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator">L</property>
+                <property name="title" translatable="yes">Lap</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator">Delete</property>
+                <property name="title" translatable="yes">Reset</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="view">timer</property>
+            <property name="title" translatable="yes">Timer</property>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator">Return space</property>
+                <property name="title" translatable="yes">Start / Stop / Pause</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator">Delete</property>
+                <property name="title" translatable="yes">Reset</property>
+              </object>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+  </object>
+
+</interface>
diff --git a/gtk3/sample/gtk-demo/shortcuts-gedit.ui b/gtk3/sample/gtk-demo/shortcuts-gedit.ui
new file mode 100644
index 0000000..acb30d0
--- /dev/null
+++ b/gtk3/sample/gtk-demo/shortcuts-gedit.ui
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <!-- interface-requires gtk+ 3.17 -->
+
+  <object class="GtkShortcutsWindow" id="shortcuts-gedit">
+    <property name="modal">1</property>
+    <child>
+      <object class="GtkShortcutsSection">
+        <property name="visible">1</property>
+        <property name="section-name">shortcuts</property>
+        <property name="max-height">12</property>
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">Touchpad gestures</property>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="shortcut-type">gesture-two-finger-swipe-right</property>
+                <property name="title" translatable="yes">Switch to the next document</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="shortcut-type">gesture-two-finger-swipe-left</property>
+                <property name="title" translatable="yes">Switch to the previous document</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">Documents</property>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>N</property>
+                <property name="title" translatable="yes">Create new document</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>O</property>
+                <property name="title" translatable="yes">Open a document</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>S</property>
+                <property name="title" translatable="yes">Save the document</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>W</property>
+                <property name="title" translatable="yes">Close the document</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl><Alt>Page_Down</property>
+                <property name="title" translatable="yes">Switch to the next document</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl><Alt>Page_Up</property>
+                <property name="title" translatable="yes">Switch to the previous document</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">Find and Replace</property>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>F</property>
+                <property name="title" translatable="yes">Find</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>G</property>
+                <property name="title" translatable="yes">Find the next match</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl><Shift>G</property>
+                <property name="title" translatable="yes">Find the previous match</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>H</property>
+                <property name="title" translatable="yes">Find and Replace</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl><Shift>K</property>
+                <property name="title" translatable="yes">Clear highlight</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>I</property>
+                <property name="title" translatable="yes">Go to line</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">Tools</property>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><shift>F7</property>
+                <property name="title" translatable="yes">Check spelling</property>
+              </object>
+            </child>
+          </object>
+        </child>
+        <child>
+          <object class="GtkShortcutsGroup">
+            <property name="visible">1</property>
+            <property name="title" translatable="yes">Miscellaneous</property>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator">F11</property>
+                <property name="title" translatable="yes">Fullscreen on / off</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator"><ctrl>P</property>
+                <property name="title" translatable="yes">Print the document</property>
+              </object>
+            </child>
+            <child>
+              <object class="GtkShortcutsShortcut">
+                <property name="visible">1</property>
+                <property name="accelerator">Insert</property>
+                <property name="title" translatable="yes">Toggle insert / overwrite</property>
+              </object>
+            </child>
+          </object>
+        </child>
+      </object>
+    </child>
+  </object>
+
+</interface>
diff --git a/gtk3/sample/gtk-demo/shortcuts.ui b/gtk3/sample/gtk-demo/shortcuts.ui
new file mode 100644
index 0000000..cb64e1e
--- /dev/null
+++ b/gtk3/sample/gtk-demo/shortcuts.ui
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+  <!-- interface-requires gtk+ 3.17 -->
+
+  <object class="GtkWindow" id="window1">
+    <property name="title" translatable="yes">Shortcuts</property>
+    <child>
+      <object class="GtkBox">
+        <property name="visible">1</property>
+        <property name="orientation">vertical</property>
+        <property name="margin">50</property>
+        <property name="spacing">10</property>
+        <child>
+          <object class="GtkButton">
+            <property name="visible">1</property>
+            <property name="label">Builder</property>
+            <signal name="clicked" handler="builder_shortcuts" swapped="1" object="window1"/>
+          </object>
+        </child>
+        <child>
+          <object class="GtkButton">
+            <property name="visible">1</property>
+            <property name="label">GEdit</property>
+            <signal name="clicked" handler="gedit_shortcuts" swapped="1" object="window1"/>
+          </object>
+        </child>
+        <child>
+          <object class="GtkButton">
+            <property name="visible">1</property>
+            <property name="label">Clocks - All</property>
+            <signal name="clicked" handler="clocks_shortcuts" swapped="1" object="window1"/>
+          </object>
+        </child>
+        <child>
+          <object class="GtkButton">
+            <property name="visible">1</property>
+            <property name="label">Clocks - Stopwatch</property>
+            <signal name="clicked" handler="clocks_shortcuts_stopwatch" swapped="1" object="window1"/>
+          </object>
+        </child>
+        <child>
+          <object class="GtkButton">
+            <property name="visible">1</property>
+            <property name="label">Boxes</property>
+            <signal name="clicked" handler="boxes_shortcuts" swapped="1" object="window1"/>
+          </object>
+        </child>
+        <child>
+          <object class="GtkButton">
+            <property name="visible">1</property>
+            <property name="label">Boxes - Wizard</property>
+            <signal name="clicked" handler="boxes_shortcuts_wizard" swapped="1" object="window1"/>
+          </object>
+        </child>
+        <child>
+          <object class="GtkButton">
+            <property name="visible">1</property>
+            <property name="label">Boxes - Display</property>
+            <signal name="clicked" handler="boxes_shortcuts_display" swapped="1" object="window1"/>
+          </object>
+        </child>
+      </object>
+    </child>
+  </object>
+</interface>
diff --git a/gtk3/sample/gtk-demo/stack.ui b/gtk3/sample/gtk-demo/stack.ui
index ed67261..1383f41 100644
--- a/gtk3/sample/gtk-demo/stack.ui
+++ b/gtk3/sample/gtk-demo/stack.ui
@@ -4,10 +4,10 @@
   <object class="GtkWindow" id="window1">
     <property name="title" translatable="yes">Stack</property>
     <child>
-      <object class="GtkGrid" id="grid1">
+      <object class="GtkGrid">
         <property name="visible">1</property>
         <child>
-          <object class="GtkStackSwitcher" id="switcher">
+          <object class="GtkStackSwitcher">
             <property name="visible">1</property>
             <property name="stack">stack</property>
             <property name="halign">center</property>
@@ -23,7 +23,7 @@
             <property name="can_focus">1</property>
             <property name="transition-type">crossfade</property>
             <child>
-              <object class="GtkImage" id="image1">
+              <object class="GtkImage">
                 <property name="visible">1</property>
                 <property name="margin-top">20</property>
                 <property name="margin-bottom">20</property>
@@ -35,7 +35,7 @@
               </packing>
             </child>
             <child>
-              <object class="GtkCheckButton" id="checkbutton1">
+              <object class="GtkCheckButton">
                 <property name="label" translatable="yes">Page 2</property>
                 <property name="visible">1</property>
                 <property name="can_focus">1</property>
@@ -49,7 +49,7 @@
               </packing>
             </child>
             <child>
-              <object class="GtkSpinner" id="spinner1">
+              <object class="GtkSpinner">
                 <property name="visible">1</property>
                 <property name="halign">center</property>
                 <property name="valign">center</property>
diff --git a/gtk3/sample/gtk-demo/textscroll.rb b/gtk3/sample/gtk-demo/textscroll.rb
new file mode 100644
index 0000000..9d2c8f4
--- /dev/null
+++ b/gtk3/sample/gtk-demo/textscroll.rb
@@ -0,0 +1,106 @@
+# Copyright (c) 2016 Ruby-GNOME2 Project Team
+# This program is licenced under the same licence as Ruby-GNOME2.
+#
+=begin
+=  Text View/Automatic Scrolling
+
+ This example demonstrates how to use the gravity of
+ GtkTextMarks to keep a text view scrolled to the bottom
+ while appending text.
+=end
+module TextscrollDemo
+  def self.run_demo(main_window)
+    window = Gtk::Window.new(:toplevel)
+    window.screen = main_window.screen
+
+    window.set_default_size(600, 400)
+
+    hbox = Gtk::Box.new(:horizontal, 6)
+    hbox.homogeneous = true
+    window.add(hbox)
+
+    create_text_view(hbox, true)
+    create_text_view(hbox, false)
+
+    if !window.visible?
+      window.show_all
+    else
+      window.destroy
+    end
+    window
+  end
+
+  def self.create_text_view(hbox, to_end)
+    swindow = Gtk::ScrolledWindow.new
+    hbox.pack_start(swindow, :fill => true, :expand => true, :padding => 0)
+    textview = Gtk::TextView.new
+    swindow.add(textview)
+    timeout = setup_scroll(textview, to_end)
+    textview.signal_connect("destroy") { GLib::Source.remove(timeout) }
+  end
+
+  def self.setup_scroll(textview, to_end)
+    buffer = textview.buffer
+    end_iter = buffer.end_iter
+    count = 0
+    if to_end
+      # If we want to scroll to the end, including horizontal scrolling,
+      # then we just create a mark with right gravity at the end of the
+      # buffer. It will stay at the end unless explicitly moved with
+      # gtk_text_buffer_move_mark.
+      buffer.create_mark("end", end_iter, false)
+
+      # add scrolling timeout
+      return GLib::Timeout.add(50) do # scroll to end
+        count += 1
+        # Get "end" mark. It's located at the end of buffer because
+        # of right gravity
+        mark = buffer.get_mark("end")
+        mark_iter = buffer.get_iter_at(:mark => mark)
+        # and insert some text at its position, the iter will be
+        # revalidated after insertion to point to the end of inserted text
+        buffer.insert(mark_iter, "\n")
+        buffer.insert(mark_iter, " " * count)
+        buffer.insert(mark_iter, "Scroll to end scroll to end scroll" +
+                                 " to end scroll to end #{count}")
+        # Now scroll the end mark onscreen.
+        textview.scroll_mark_onscreen(mark)
+
+        # Emulate typewriter behavior, shift to the left if we
+        # are far enough to the right.
+        count = 0 if count > 150
+        GLib::Source::CONTINUE
+      end
+    else
+      # If we want to scroll to the bottom, but not scroll horizontally,
+      # then an end mark won't do the job. Just create a mark so we can
+      # use it with gtk_text_view_scroll_mark_onscreen, we'll position it
+      # explicitly when needed. Use left gravity so the mark stays where
+      # we put it after inserting new text.
+      buffer.create_mark("scroll", end_iter, true)
+      return GLib::Timeout.add(100) do # scroll to bottom
+        count += 1
+        # Get end iterator
+        end_iter = buffer.end_iter
+        # and insert some text at it, the iter will be revalidated
+        # after insertion to point to the end of inserted text
+        buffer.insert(end_iter, "\n")
+        buffer.insert(end_iter, " " * count)
+        buffer.insert(end_iter,"Scroll to bottom scroll to bottom scroll" +
+                                  " to bottom scroll to bottom #{count}")
+        # Move the iterator to the beginning of line, so we don't scroll
+        # in horizontal direction
+        end_iter.line_offset = 0
+        # and place the mark at iter. the mark will stay there after we
+        # insert some text at the end because it has left gravity.
+        mark = buffer.get_mark("scroll")
+        buffer.move_mark(mark, end_iter)
+        # Scroll the mark onscreen.
+        textview.scroll_mark_onscreen(mark)
+        # Shift text back if we got enough to the right.
+        count = 0 if count > 40
+        GLib::Source::CONTINUE
+      end
+    end
+  end
+end
diff --git a/gtk3/sample/gtk-demo/theming.ui b/gtk3/sample/gtk-demo/theming.ui
index d3a6e21..617a2f7 100644
--- a/gtk3/sample/gtk-demo/theming.ui
+++ b/gtk3/sample/gtk-demo/theming.ui
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <object class="GtkGrid" id="grid">
-    <property name="row-spacing">6</property>
+    <property name="row-spacing">10</property>
     <property name="orientation">vertical</property>
     <child>
-      <object class="GtkToolbar" id="toolbar1">
+      <object class="GtkToolbar">
         <property name="visible">1</property>
         <property name="hexpand">1</property>
         <property name="show-arrow">0</property>
@@ -12,7 +12,7 @@
           <class name="primary-toolbar"/>
         </style>
         <child>
-          <object class="GtkToggleToolButton" id="toolbutton1">
+          <object class="GtkToggleToolButton">
             <property name="use_action_appearance">0</property>
             <property name="visible">1</property>
             <property name="use_action_appearance">0</property>
@@ -26,7 +26,7 @@
           </packing>
         </child>
         <child>
-          <object class="GtkToggleToolButton" id="toolbutton2">
+          <object class="GtkToggleToolButton">
             <property name="use_action_appearance">0</property>
             <property name="visible">1</property>
             <property name="use_action_appearance">0</property>
@@ -41,7 +41,7 @@
           </packing>
         </child>
         <child>
-          <object class="GtkToggleToolButton" id="toolbutton3">
+          <object class="GtkToggleToolButton">
             <property name="use_action_appearance">0</property>
             <property name="visible">1</property>
             <property name="sensitive">0</property>
@@ -55,7 +55,7 @@
           </packing>
         </child>
         <child>
-          <object class="GtkToggleToolButton" id="toolbutton5">
+          <object class="GtkToggleToolButton">
             <property name="use_action_appearance">0</property>
             <property name="visible">1</property>
             <property name="label" translatable="yes">Raised</property>
@@ -71,7 +71,7 @@
           </packing>
         </child>
         <child>
-          <object class="GtkToggleToolButton" id="toolbutton6">
+          <object class="GtkToggleToolButton">
             <property name="use_action_appearance">0</property>
             <property name="visible">1</property>
             <property name="label" translatable="yes">Raised Active</property>
@@ -88,7 +88,7 @@
           </packing>
         </child>
         <child>
-          <object class="GtkToggleToolButton" id="toolbutton4">
+          <object class="GtkToggleToolButton">
             <property name="use_action_appearance">0</property>
             <property name="visible">1</property>
             <property name="sensitive">0</property>
@@ -103,7 +103,7 @@
           </packing>
         </child>
         <child>
-          <object class="GtkToolItem" id="toolitementry">
+          <object class="GtkToolItem">
             <property name="use_action_appearance">0</property>
             <property name="visible">1</property>
             <child>
@@ -118,7 +118,7 @@
           </object>
         </child>
         <child>
-          <object class="GtkToolItem" id="toolitemswitch">
+          <object class="GtkToolItem">
             <property name="use_action_appearance">0</property>
             <property name="visible">1</property>
             <child>
@@ -132,7 +132,7 @@
       </object>
     </child>
     <child>
-      <object class="GtkBox" id="box1">
+      <object class="GtkBox">
         <property name="visible">1</property>
         <property name="valign">center</property>
         <property name="halign">center</property>
@@ -140,7 +140,7 @@
           <class name="linked"/>
         </style>
         <child>
-          <object class="GtkButton" id="button1">
+          <object class="GtkButton">
             <property name="label" translatable="yes">Hi, I am a button</property>
             <property name="use_action_appearance">0</property>
             <property name="visible">1</property>
@@ -150,8 +150,8 @@
           </object>
         </child>
         <child>
-          <object class="GtkButton" id="button2">
-            <property name="label" translatable="yes">And I'm another button</property>
+          <object class="GtkButton">
+            <property name="label" translatable="yes">And I'm another button</property>
             <property name="use_action_appearance">0</property>
             <property name="visible">1</property>
             <property name="can_focus">1</property>
@@ -163,7 +163,7 @@
           </packing>
         </child>
         <child>
-          <object class="GtkButton" id="button3">
+          <object class="GtkButton">
             <property name="label" translatable="yes">This is a button party!</property>
             <property name="use_action_appearance">0</property>
             <property name="visible">1</property>
@@ -178,15 +178,16 @@
       </object>
     </child>
     <child>
-      <object class="GtkToolbar" id="itoolbar1">
+      <object class="GtkToolbar">
         <property name="visible">1</property>
         <property name="hexpand">1</property>
         <property name="icon_size">1</property>
+        <property name="toolbar-style">icons</property>
         <style>
           <class name="inline-toolbar"/>
         </style>
         <child>
-          <object class="GtkToggleToolButton" id="itoolbutton1">
+          <object class="GtkToggleToolButton">
             <property name="use_action_appearance">0</property>
             <property name="visible">1</property>
             <property name="use_action_appearance">0</property>
@@ -199,7 +200,7 @@
           </packing>
         </child>
         <child>
-          <object class="GtkToggleToolButton" id="itoolbutton2">
+          <object class="GtkToggleToolButton">
             <property name="use_action_appearance">0</property>
             <property name="visible">1</property>
             <property name="use_action_appearance">0</property>
@@ -212,7 +213,7 @@
           </packing>
         </child>
         <child>
-          <object class="GtkToggleToolButton" id="itoolbutton3">
+          <object class="GtkToggleToolButton">
             <property name="use_action_appearance">0</property>
             <property name="visible">1</property>
             <property name="use_action_appearance">0</property>
@@ -226,7 +227,7 @@
           </packing>
         </child>
         <child>
-          <object class="GtkToggleToolButton" id="itoolbutton4">
+          <object class="GtkToggleToolButton">
             <property name="use_action_appearance">0</property>
             <property name="visible">1</property>
             <property name="use_action_appearance">0</property>
@@ -240,7 +241,7 @@
           </packing>
         </child>
         <child>
-          <object class="GtkToggleToolButton" id="itoolbutton5">
+          <object class="GtkToggleToolButton">
             <property name="use_action_appearance">0</property>
             <property name="visible">1</property>
             <property name="sensitive">0</property>
@@ -254,7 +255,7 @@
           </packing>
         </child>
         <child>
-          <object class="GtkToggleToolButton" id="itoolbutton6">
+          <object class="GtkToggleToolButton">
             <property name="use_action_appearance">0</property>
             <property name="visible">1</property>
             <property name="sensitive">0</property>
@@ -270,5 +271,40 @@
         </child>
       </object>
     </child>
+    <child>
+      <object class="GtkBox">
+        <property name="visible">1</property>
+        <property name="spacing">10</property>
+        <property name="orientation">horizontal</property>
+        <child>
+          <object class="GtkButton">
+            <property name="visible">1</property>
+            <property name="label">Plain</property>
+            <property name="halign">end</property>
+          </object>
+          <packing>
+            <property name="expand">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkButton">
+            <property name="visible">1</property>
+            <property name="label">Destructive</property>
+            <style>
+              <class name="destructive-action"/>
+            </style>
+          </object>
+        </child>
+        <child>
+          <object class="GtkButton">
+            <property name="visible">1</property>
+            <property name="label">Suggested</property>
+            <style>
+              <class name="suggested-action"/>
+            </style>
+          </object>
+        </child>
+      </object>
+    </child>
   </object>
 </interface>
diff --git a/gtk3/sample/gtk-demo/theming_style_classes.rb b/gtk3/sample/gtk-demo/theming_style_classes.rb
index 27dfbbf..f6de92d 100644
--- a/gtk3/sample/gtk-demo/theming_style_classes.rb
+++ b/gtk3/sample/gtk-demo/theming_style_classes.rb
@@ -4,7 +4,7 @@
 # This is licensed under the terms of the GNU Lesser General Public
 # License, version 2.1 or (at your option) later.
 #
-# Copyright (C) 2014-2015  Ruby-GNOME2 Project Team
+# Copyright (C) 2014-2016  Ruby-GNOME2 Project Team
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -20,7 +20,7 @@
 # License along with this library; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 =begin
-= CSS Theming/Style Classes
+= Theming/Style Classes
 
 GTK+ uses CSS for theming. Style classes can be associated
 with widgets to inform the theme about intended rendering.
@@ -34,8 +34,9 @@ module ThemingStyleClassesDemo
   def self.run_demo(main_window)
     window = Gtk::Window.new(:toplevel)
     window.screen = main_window.screen
-    window.set_title("Style Classes")
-    window.set_border_width(12)
+    window.title = "Style Classes"
+    window.resizable = false
+    window.border_width = 12
 
     builder = Gtk::Builder.new(:resource => "/theming_style_classes/theming.ui")
     grid = builder["grid"]
diff --git a/gtk3/sample/gtk-demo/transparent.rb b/gtk3/sample/gtk-demo/transparent.rb
new file mode 100644
index 0000000..868440f
--- /dev/null
+++ b/gtk3/sample/gtk-demo/transparent.rb
@@ -0,0 +1,143 @@
+# Copyright (c) 2016 Ruby-GNOME2 Project Team
+# This program is licenced under the same licence as Ruby-GNOME2.
+#
+=begin
+=  Overlay/Transparency
+
+ Use transparent background on GdkWindows to create a shadow effect on a GtkOverlay widget.
+=end
+module TransparentDemo
+  SHADOW_OFFSET_X = 7
+  SHADOW_OFFSET_Y = 7
+  SHADOW_RADIUS = 5
+
+  def self.run_demo(main_window)
+    window = Gtk::Window.new(:toplevel)
+    window.screen = main_window.screen
+    window.set_default_size(450, 450)
+    window.title = "Transparency"
+    window.border_width = 0
+
+    view = Gtk::TextView.new
+    sw = Gtk::ScrolledWindow.new
+    sw.set_policy(:automatic, :automatic)
+    sw.add(view)
+
+    overlay = Gtk::Overlay.new
+    overlay.add(sw)
+    window.add(overlay)
+
+    entry = Gtk::Entry.new
+    css = <<-CSS
+    * { border-width: 0px #{SHADOW_OFFSET_X}px #{SHADOW_OFFSET_Y}px 0px; }
+    CSS
+    provider = Gtk::CssProvider.new
+    provider.load_from_data(css)
+    style_context = entry.style_context
+    style_context.add_provider(provider,
+                               Gtk::StyleProvider::PRIORITY_APPLICATION)
+    entry.signal_connect "draw" do |widget, cr|
+      allocation = widget.allocation
+      rect = [allocation.x + SHADOW_OFFSET_X,
+              allocation.y + SHADOW_OFFSET_Y,
+              allocation.width - SHADOW_OFFSET_X,
+              allocation.height - SHADOW_OFFSET_Y
+             ]
+      draw_shadow_box(cr, rect, SHADOW_RADIUS, 0.4)
+      false
+    end
+
+    overlay.add_overlay(entry)
+    entry.valign = :center
+    entry.halign = :start
+    overlay.show_all
+
+    if !window.visible?
+      window.show_all
+    else
+      window.destroy
+    end
+    window
+  end
+
+  def self.draw_shadow_box(cr, rect, radius, transparency)
+    x0 = rect[0]
+    x1 = rect[0] + radius
+    x2 = rect[0] + rect[2] - radius
+    x3 = rect[0] + rect[2]
+
+    y0 = rect[1]
+    y1 = rect[1] + radius
+    y2 = rect[1] + rect[3] - radius
+    y3 = rect[1] + rect[3]
+
+    # Fill non-border part
+    cr.set_source_rgba(0, 0, 0, transparency)
+    cr.rectangle(x1, y1, x2 - x1, y2 - y1)
+
+    # Upper border
+    pattern = Cairo::LinearPattern.new(0, y0, 0, y1)
+    pattern.add_color_stop_rgba(0.0, 0.0, 0.0, 0.0)
+    pattern.add_color_stop_rgba(1.0, 0.0, 0.0, transparency)
+
+    cr.set_source(pattern)
+    cr.rectangle(x1, y0, x2 - x1, y1 - y0)
+    cr.fill
+
+    # Bottom border
+    pattern = Cairo::LinearPattern.new(0, y2, 0, y3)
+    pattern.add_color_stop_rgba(0.0, 0.0, 0.0, transparency)
+    pattern.add_color_stop_rgba(1.0, 0.0, 0.0, 0.0)
+    cr.set_source(pattern)
+    cr.rectangle(x1, y2, x2 - x1, y3 - y2)
+    cr.fill
+
+    # Left border
+    pattern = Cairo::LinearPattern.new(x0, 0, x1, 0)
+    pattern.add_color_stop_rgba(0.0, 0.0, 0.0, 0.0)
+    pattern.add_color_stop_rgba(1.0, 0.0, 0.0, transparency)
+    cr.set_source(pattern)
+    cr.rectangle(x0, y1, x1 - x0, y2 - y1)
+    cr.fill
+
+    # Right border
+    pattern = Cairo::LinearPattern.new(x2, 0, x3, 0)
+    pattern.add_color_stop_rgba(0.0, 0.0, 0.0, transparency)
+    pattern.add_color_stop_rgba(1.0, 0.0, 0.0, 0.0)
+    cr.set_source(pattern)
+    cr.rectangle(x2, y1, x3 - x2, y2 - y1)
+    cr.fill
+
+    # NW corner
+    pattern = Cairo::RadialPattern.new(x1, y1, 0, x1, y1, radius)
+    pattern.add_color_stop_rgba(0.0, 0.0, 0.0, transparency)
+    pattern.add_color_stop_rgba(1.0, 0.0, 0.0, 0.0)
+    cr.set_source(pattern)
+    cr.rectangle(x0, y0, x1 - x0, y1 - y0)
+    cr.fill
+
+    # NE corner
+    pattern = Cairo::RadialPattern.new(x2, y1, 0, x2, y1, radius)
+    pattern.add_color_stop_rgba(0.0, 0.0, 0.0, transparency)
+    pattern.add_color_stop_rgba(1.0, 0.0, 0.0, 0.0)
+    cr.set_source(pattern)
+    cr.rectangle(x2, y0, x3 - x2, y1 - y0)
+    cr.fill
+
+    # SW corner
+    pattern = Cairo::RadialPattern.new(x1, y2, 0, x1, y2, radius)
+    pattern.add_color_stop_rgba(0.0, 0.0, 0.0, transparency)
+    pattern.add_color_stop_rgba(1.0, 0.0, 0.0, 0.0)
+    cr.set_source(pattern)
+    cr.rectangle(x0, y2, x1 - x0, y3 - y2)
+    cr.fill
+
+    # SE corner
+    pattern = Cairo::RadialPattern.new(x2, y2, 0, x2, y2, radius)
+    pattern.add_color_stop_rgba(0.0, 0.0, 0.0, transparency)
+    pattern.add_color_stop_rgba(1.0, 0.0, 0.0, 0.0)
+    cr.set_source(pattern)
+    cr.rectangle(x2, y2, x3 - x2, y3 - y2)
+    cr.fill
+  end
+end
diff --git a/gtk3/sample/misc/aboutdialog.rb b/gtk3/sample/misc/aboutdialog.rb
index 7bee790..1cfd89a 100755
--- a/gtk3/sample/misc/aboutdialog.rb
+++ b/gtk3/sample/misc/aboutdialog.rb
@@ -19,7 +19,7 @@ a.comments  = "This is a sample script for Gtk::AboutDialog"
 a.copyright = "Copyright (C) 2005 Ruby-GNOME2 Project"
 a.documenters = ["Documenter 1 <no1 at foo.bar.com>", "Documenter 2 <no2 at foo.bar.com>"]
 a.license   = "This program is licenced under the same licence as Ruby-GNOME2."
-a.logo      = Gdk::Pixbuf.new(File.join(__dir__, "gnome-logo-icon.png"))
+a.logo = GdkPixbuf::Pixbuf.new(:file => File.join(__dir__, "gnome-logo-icon.png"))
 a.program_name = "Gtk::AboutDialog sample"
 a.translator_credits = "Translator 1\nTranslator 2\n"
 a.version   = "1.0.0"
diff --git a/gtk3/sample/misc/bindings.rb b/gtk3/sample/misc/bindings.rb
index ad91c9d..1508f57 100644
--- a/gtk3/sample/misc/bindings.rb
+++ b/gtk3/sample/misc/bindings.rb
@@ -50,22 +50,43 @@ window = Gtk::Window.new
 window.name = "pager_window"
 
 css_provider = Gtk::CssProvider.new
-css_provider.load(:data => <<CSS) 
- at binding-set MoveCursor {
-  bind "<Control>j" { "move-cursor" (display-lines, 1, 0) };
-  bind "<Control>k" { "move-cursor" (display-lines, -1, 0) };
-  bind "<Control>l" { "move-cursor" (buffer-ends, 1, 0) };
-  bind "<Control>m" { "move-cursor" (buffer-ends, -1, 0) };
-}
-GtkTextView {
-  -GtkWidget-cursor-color: green;
-  -GtkWidget-aspect-ratio: 1.0;
-  font: 20 Sans;
-  color: #aaa;
-  background-color: #333 ;
-  gtk-key-bindings: MoveCursor;
-}
+
+if Gtk::Version.or_later?(3, 20, 0)
+  css_provider.load(:data => <<CSS)
+  @binding-set MoveCursor {
+    bind "<Control>j" { "move-cursor" (display-lines, 1, 0) };
+    bind "<Control>k" { "move-cursor" (display-lines, -1, 0) };
+    bind "<Control>l" { "move-cursor" (buffer-ends, 1, 0) };
+    bind "<Control>m" { "move-cursor" (buffer-ends, -1, 0) };
+  }
+  textview {
+    caret-color: green;
+    -GtkWidget-aspect-ratio: 1.0;
+    font: 20 Sans;
+    color: #aaa;
+    background-color: #333 ;
+    -gtk-key-bindings: MoveCursor;
+  }
+CSS
+else
+  css_provider.load(:data => <<CSS)
+  @binding-set MoveCursor {
+    bind "<Control>j" { "move-cursor" (display-lines, 1, 0) };
+    bind "<Control>k" { "move-cursor" (display-lines, -1, 0) };
+    bind "<Control>l" { "move-cursor" (buffer-ends, 1, 0) };
+    bind "<Control>m" { "move-cursor" (buffer-ends, -1, 0) };
+  }
+  GtkTextView {
+    -GtkWidget-cursor-color: green;
+    -GtkWidget-aspect-ratio: 1.0;
+    font: 20 Sans;
+    color: #aaa;
+    background-color: #333 ;
+    gtk-key-bindings: MoveCursor;
+  }
 CSS
+end
+
 hbox = Gtk::Box.new(:horizontal)
 
 hbox.add(button1 = Gtk::Button.new(:label => "Ctrl + l"))
diff --git a/gtk3/sample/misc/combobox.rb b/gtk3/sample/misc/combobox.rb
index d4354be..6561b6d 100644
--- a/gtk3/sample/misc/combobox.rb
+++ b/gtk3/sample/misc/combobox.rb
@@ -32,7 +32,7 @@ end
 #
 # Icon and text
 #
-model = Gtk::ListStore.new(Gdk::Pixbuf, String)
+model = Gtk::ListStore.new(GdkPixbuf::Pixbuf, String)
 [[Gtk::Stock::QUIT, "quit"],
  [Gtk::Stock::CANCEL, "cancel"],
  [Gtk::Stock::OK, "ok"]].each do |stock, name|
diff --git a/gtk3/sample/misc/dnd.rb b/gtk3/sample/misc/dnd.rb
index caad2d1..bfd10f7 100644
--- a/gtk3/sample/misc/dnd.rb
+++ b/gtk3/sample/misc/dnd.rb
@@ -2,7 +2,7 @@
   dnd.rb - Drag and Drop sample script.
 
   Copyright (C) 2002-2015 Masao Mutoh
-  Copyright (c) 2002-2015 Ruby-GNOME2 Project Team
+  Copyright (c) 2002-2016 Ruby-GNOME2 Project Team
   This program is licenced under the same licence as Ruby-GNOME2.
 =end
 
@@ -44,9 +44,9 @@ class DestWindow < Gtk::Window
       context.targets.each do |target|
         if target.name == "test" ||
            selection_data.type == Gdk::Selection::TYPE_STRING
-          data_len = selection_data.data[1]
+          data_len = selection_data.data.size
           puts "drag-data-received signal:"
-          puts selection_data.data[0].pack("C#{data_len}")
+          puts selection_data.data.pack("C#{data_len}")
           puts selection_data.text
         else
           next
diff --git a/gtk3/sample/misc/icons-theme-viewer.rb b/gtk3/sample/misc/icons-theme-viewer.rb
index d509108..abf0ad5 100644
--- a/gtk3/sample/misc/icons-theme-viewer.rb
+++ b/gtk3/sample/misc/icons-theme-viewer.rb
@@ -9,7 +9,7 @@
 require "gtk3"
 
 def fill_model(icons)
-  model = Gtk::ListStore.new(String, Gdk::Pixbuf)
+  model = Gtk::ListStore.new(String, GdkPixbuf::Pixbuf)
   icons.each do |icon|
     pixbuf = Gtk::IconTheme.default.load_icon(icon, 32, 0)
     iter = model.append
diff --git a/gtk3/sample/misc/iconview.rb b/gtk3/sample/misc/iconview.rb
index beb63e8..ce49fe1 100644
--- a/gtk3/sample/misc/iconview.rb
+++ b/gtk3/sample/misc/iconview.rb
@@ -11,7 +11,7 @@ require "gtk3"
 TEXT_COLUMN   = 0
 PIXBUF_COLUMN = 1
 
-model = Gtk::ListStore.new(String, Gdk::Pixbuf)
+model = Gtk::ListStore.new(String, GdkPixbuf::Pixbuf)
 
 iv = Gtk::IconView.new
 iv.set_model(model)
@@ -21,7 +21,7 @@ iv.pixbuf_column = PIXBUF_COLUMN
 Dir.glob("#{File.expand_path(File.dirname(__FILE__))}/../gtk-demo/gnome*.png").each do |f|
   iter = model.append
   iter[TEXT_COLUMN]   = File.basename(f)
-  iter[PIXBUF_COLUMN] = Gdk::Pixbuf.new(f)
+  iter[PIXBUF_COLUMN] = GdkPixbuf::Pixbuf.new(:file => f)
 end
 
 iv.signal_connect("item_activated") do |iv, path|
diff --git a/gtk3/sample/misc/textbuffer-serialize.rb b/gtk3/sample/misc/textbuffer-serialize.rb
old mode 100644
new mode 100755
index 0cb760e..4b586a3
--- a/gtk3/sample/misc/textbuffer-serialize.rb
+++ b/gtk3/sample/misc/textbuffer-serialize.rb
@@ -84,16 +84,18 @@ button_color = Gtk::ToolButton.new(:icon_widget => nil, :label => "Color the reg
 button_color.signal_connect "clicked" do 
   dialog = Gtk::ColorChooserDialog.new(:title => "Color the region", :parent => window)
   if dialog.run == Gtk::ResponseType::OK
-    bounds = buffer.selection_bounds # returns an array [Gtk::TextIter, Gtk::TextIter]
-    rgba = dialog.rgba
-    color = Gdk::Color.new(rgba.red*65535, rgba.green*65535, rgba.blue*65535)
-    tag_name = color.to_s 
-    unless tag = buffer.tag_table.lookup(tag_name)
-      tag = Gtk::TextTag.new(tag_name)
-      tag.set_foreground_gdk(color)
+    bounds = buffer.selection_bounds # returns an array [Gtk::TextIter, Gtk::TextIter] or nil
+    if bounds
+      rgba = dialog.rgba
+      color = Gdk::Color.new(rgba.red*65535, rgba.green*65535, rgba.blue*65535)
+      tag_name = color.to_s 
+      unless tag = buffer.tag_table.lookup(tag_name)
+        tag = Gtk::TextTag.new(tag_name)
+        tag.set_foreground_gdk(color)
+      end
+      buffer.tag_table.add(tag)
+      buffer.apply_tag(tag, bounds[0], bounds[1])
     end
-    buffer.tag_table.add(tag)
-    buffer.apply_tag(tag, bounds[0], bounds[1])
   end
   dialog.destroy  
 end
@@ -103,12 +105,14 @@ button_font.signal_connect "clicked" do
   dialog = Gtk::FontChooserDialog.new(:label => "Set font to the region", :parent => window)
   if dialog.run == Gtk::ResponseType::OK
     bounds = buffer.selection_bounds
-    font = dialog.font
-    unless tag = buffer.tag_table.lookup(font)
-      tag = Gtk::TextTag.new(font).set_font(font)
+    if bounds
+      font = dialog.font
+      unless tag = buffer.tag_table.lookup(font)
+        tag = Gtk::TextTag.new(font).set_font(font)
+      end
+      buffer.tag_table.add(tag)
+      buffer.apply_tag(tag, bounds[0], bounds[1])
     end
-    buffer.tag_table.add(tag)
-    buffer.apply_tag(tag, bounds[0], bounds[1])
   end
   dialog.destroy  
 end
diff --git a/gtk3/sample/misc/to-drawable.rb b/gtk3/sample/misc/to-drawable.rb
index fead54c..7aaec4f 100755
--- a/gtk3/sample/misc/to-drawable.rb
+++ b/gtk3/sample/misc/to-drawable.rb
@@ -1,6 +1,6 @@
 #!/usr/bin/env ruby
 =begin
-  to_drawable.rb - Gdk::Pixbuf(GDK methods) sample script.
+  to_drawable.rb - GdkPixbuf::Pixbuf(GDK methods) sample script.
 
   Copyright (c) 2002-2015 Ruby-GNOME2 Project Team
   This program is licenced under the same licence as Ruby-GNOME2.
@@ -13,7 +13,7 @@ filename = "#{File.expand_path(File.dirname(__FILE__))}/gnome-logo-icon.png"
 window = Gtk::Window.new("Drawable sample")
 window.set_border_width(10)
 
-pixbuf = Gdk::Pixbuf.new(filename)
+pixbuf = GdkPixbuf::Pixbuf.new(:file => filename)
 
 drawing_area = Gtk::DrawingArea.new
 window.add(drawing_area)
diff --git a/gtk3/sample/misc/tooltips.rb b/gtk3/sample/misc/tooltips.rb
index 61bd8a6..96bc94b 100755
--- a/gtk3/sample/misc/tooltips.rb
+++ b/gtk3/sample/misc/tooltips.rb
@@ -41,6 +41,7 @@ def textview_query_tooltip(textview, keyboard_tip, x, y, tooltip, tag)
   else
     bx, by = textview.window_to_buffer_coords(Gtk::TextWindowType::TEXT, x, y)
     iter, = textview.get_iter_at_position(bx, by)
+    return false if iter.nil?
   end
   if iter.has_tag?(tag)
     tooltip.text = 'Tooltip on text tag'
diff --git a/gtk3/sample/misc/treeview.rb b/gtk3/sample/misc/treeview.rb
index dcd29b6..6b2d370 100644
--- a/gtk3/sample/misc/treeview.rb
+++ b/gtk3/sample/misc/treeview.rb
@@ -10,7 +10,7 @@ require "gtk3"
 window = Gtk::Window.new("Gtk::TreeView sample")
 
 # Create data
-model = Gtk::TreeStore.new(String, String, Gdk::RGBA, Float, Gdk::Pixbuf)
+model = Gtk::TreeStore.new(String, String, Gdk::RGBA, Float, GdkPixbuf::Pixbuf)
 
 # column 1
 root_iter = model.append(nil)
diff --git a/gtk3/sample/tutorial/README.md b/gtk3/sample/tutorial/README.md
index 0b9422c..8212b72 100644
--- a/gtk3/sample/tutorial/README.md
+++ b/gtk3/sample/tutorial/README.md
@@ -16,7 +16,7 @@ Here is the most basic example that illustrate the principles of widget hierarch
 require "gtk3"
 
 window = Gtk::Window.new("First example")
-window.set_request_size(400, 400)
+window.set_size_request(400, 400)
 window.set_border_width(10)
 
 button = Gtk::Button.new(:label => "Say hello")
@@ -157,7 +157,7 @@ app.signal_connect "activate" do |application|
   window.set_title("Window")
   window.set_border_width(10)
 
-  # Here we construct the container that is going pack our buttons 
+  # Here we construct the container that is going pack our buttons
   grid = Gtk::Grid.new
 
   # Pack the container in the window
@@ -281,7 +281,7 @@ Here is the "builder.ui" file that describes the interface:
 The usage of the `Gtk::Builder` is really easy, we just create an instance from the
 file "builder.ui" with `Gtk::Builder.new(:file => builder_file)`. Then you can access every widget or part of the interface thanks to its name: `window = builder.get_object("window")`. Note that `Gtk::Builder` can also be used to construct objects that are not widgets, such as tree models, adjustments, etc.
 
-The XML definition of the interface can be loaded from a file, a string or a path in a gresource binary. More informations related to this XML definition can be found [here](https://developer.gnome.org/gtk3/stable/GtkBuilder.html#BUILDER-UI). Those files are generally built with [glade](https://glade.gnome.org/). 
+The XML definition of the interface can be loaded from a file, a string or a path in a gresource binary. More informations related to this XML definition can be found [here](https://developer.gnome.org/gtk3/stable/GtkBuilder.html#BUILDER-UI). Those files are generally built with [glade](https://glade.gnome.org/).
 
 
 ## Building applications
@@ -296,7 +296,7 @@ require "gtk3"
 class ExampleAppWindow < Gtk::ApplicationWindow
 
   def open(file)
-    
+
   end
 end
 
@@ -318,7 +318,7 @@ class ExampleApp < Gtk::Application
       end
 
       files.each { |file| win.open(file) }
-        
+
       win.present
     end
   end
@@ -393,7 +393,7 @@ Here is the "window.ui" file that contains the template of the window:
 ```
 Unlike regular interface descriptions, in template XML descriptions, a`<template>` tag is expected as a direct child of the toplevel `<interface>` tag. Yhe `<template>` tag must specify the "*class*" attribute which must be the class name of the widget. Optionally, the "*parent*" attribute may be specified to indicate the direct parent class (superclass).
 
-More informations can be found in the part [building composite widgets from template XML](https://developer.gnome.org/gtk3/stable/GtkWidget.html#GtkWidget.description) of the `Gtk::Widget` documentation. 
+More informations can be found in the part [building composite widgets from template XML](https://developer.gnome.org/gtk3/stable/GtkWidget.html#GtkWidget.description) of the `Gtk::Widget` documentation.
 
 #### Link a template to a custom class widget.
 
@@ -411,7 +411,7 @@ class ExampleAppWindow < Gtk::ApplicationWindow
   end
 
   def open(file)
-    
+
   end
 end
 ```
@@ -482,7 +482,7 @@ This new way to access the stack widget is used in the following code. We have p
 ```ruby
 class ExampleAppWindow < Gtk::ApplicationWindow
   def open(file)
-    
+
   end
 end
 
@@ -500,7 +500,7 @@ class ExampleApp < Gtk::Application
       end
 
       files.each { |file| win.open(file) }
-        
+
       win.present
     end
   end
@@ -526,14 +526,14 @@ def open(file)
   view.buffer.text = stream.read
 end
 ```
-Each file is opened and loaded in a `Gtk::TextView` with 
+Each file is opened and loaded in a `Gtk::TextView` with
 
 ```ruby
   stream = file.read
   view.buffer.text = stream.read
 ```
 
-We get the basename, of the file in argument, that will be used as title for each tab of the stack widget: 
+We get the basename, of the file in argument, that will be used as title for each tab of the stack widget:
 
 ```
 stack.add_titled(scrolled, basename, basename)
@@ -611,7 +611,7 @@ application.add_action(action)
 
 #### Add accelerators for action.
 
-An accelerator is just a keys combination that acts as a shortcut for an action. 
+An accelerator is just a keys combination that acts as a shortcut for an action.
 
 ```ruby
 quit_accels = ["<Ctrl>Q"]
@@ -655,7 +655,7 @@ We are going to use `Gio::Settings` to store our preferences. `Gio::Settings` re
 </schemalist>
 ```
 
-Before we can make use of this schema in our application, we need to compile it into the binary form that `Gio::Settings` expects. 
+Before we can make use of this schema in our application, we need to compile it into the binary form that `Gio::Settings` expects.
 
 ```ruby
 system("glib-compile-schemas", data_path)
@@ -670,12 +670,12 @@ Gio::SettingsSchemaSource.new(data_path,
                               false)
 
 ```
-This is the corresponding method to the function [g_settings_schema_source_new_from_directory](https://developer.gnome.org/gio/stable/gio-GSettingsSchema-GSettingsSchemaSource.html#g-settings-schema-source-new-from-directory). 
+This is the corresponding method to the function [g_settings_schema_source_new_from_directory](https://developer.gnome.org/gio/stable/gio-GSettingsSchema-GSettingsSchemaSource.html#g-settings-schema-source-new-from-directory).
 
 As an alternative, our schema  can just be loaded by using the `GSETTINGS_SCHEMA_DIR` environment variable.
 
 ```ruby
-ENV["GSETTINGS_SCHEMA_DIR"] = data_path 
+ENV["GSETTINGS_SCHEMA_DIR"] = data_path
 ```
 More informations on the use of gschemas can be found [here](https://developer.gnome.org/gio/stable/gio-GSettingsSchema-GSettingsSchemaSource.html)
 
@@ -842,11 +842,11 @@ def open(file)
   stream = file.read
   buffer = view.buffer
   buffer.text = stream.read
-  tag = buffer.create_tag() 
+  tag = buffer.create_tag()
   @settings.bind("font", tag, "font", Gio::SettingsBindFlags::DEFAULT)
   buffer.apply_tag(tag, buffer.start_iter, buffer.end_iter)
 end
-``` 
+```
 
 ### Adding a search bar
 https://developer.gnome.org/gtk3/stable/ch01s04.html#id-1.2.3.12.10
@@ -1297,4 +1297,4 @@ Our application already uses a `Gtk::HeaderBar`, but so far it still gets a 'nor
 </interface>
 ```
 
-A small extra bonus of using a header bar is that we get a fallback application menu for free. 
+A small extra bonus of using a header bar is that we get a fallback application menu for free.
diff --git a/gtk3/test/test-gtk-clipboard.rb b/gtk3/test/test-gtk-clipboard.rb
index 4906a2b..8167eee 100644
--- a/gtk3/test/test-gtk-clipboard.rb
+++ b/gtk3/test/test-gtk-clipboard.rb
@@ -66,7 +66,7 @@ class TestGtkClipboard < Test::Unit::TestCase
       received_image = image
       loop.quit
     end
-    image = Gdk::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+    image = GdkPixbuf::Pixbuf.new(:file => fixture_path("gnome-logo-icon.png"))
     @clipboard.image = image
     loop.run
 
diff --git a/gtk3/test/test-gtk-combo-box.rb b/gtk3/test/test-gtk-combo-box.rb
index 280208d..1adb47f 100644
--- a/gtk3/test/test-gtk-combo-box.rb
+++ b/gtk3/test/test-gtk-combo-box.rb
@@ -27,7 +27,7 @@ class TestGtkComboBox < Test::Unit::TestCase
       end
 
       test ":model" do
-        model = Gtk::ListStore.new(Gdk::Pixbuf, String)
+        model = Gtk::ListStore.new(GdkPixbuf::Pixbuf, String)
         combo_box = Gtk::ComboBox.new(:entry => true, :model => model)
         assert do
           combo_box.has_entry?
@@ -55,7 +55,7 @@ class TestGtkComboBox < Test::Unit::TestCase
       end
 
       test ":model" do
-        model = Gtk::ListStore.new(Gdk::Pixbuf, String)
+        model = Gtk::ListStore.new(GdkPixbuf::Pixbuf, String)
         combo_box = Gtk::ComboBox.new(:model => model)
         assert do
           not combo_box.has_entry?
diff --git a/gtk3/test/test-gtk-icon-view.rb b/gtk3/test/test-gtk-icon-view.rb
index 9d31631..f66cb8b 100644
--- a/gtk3/test/test-gtk-icon-view.rb
+++ b/gtk3/test/test-gtk-icon-view.rb
@@ -41,7 +41,7 @@ class TestGtkIconView < Test::Unit::TestCase
   class TestGetCellRect < self
     def setup
       only_gtk_version(3, 6, 0)
-      model = Gtk::ListStore.new(String, Gdk::Pixbuf)
+      model = Gtk::ListStore.new(String, GdkPixbuf::Pixbuf)
       iter = model.append
       model.set_values(iter, ["label", nil])
       @path = iter.path
@@ -53,7 +53,7 @@ class TestGtkIconView < Test::Unit::TestCase
     end
 
     def test_not_found
-      indices, _ = @path.indices
+      indices = @path.indices
       not_found_path = Gtk::TreePath.new
       not_found_path.append_index(indices.last + 1)
       assert_nil(@icon_view.get_cell_rect(not_found_path))
diff --git a/gtk3/test/test-gtk-image.rb b/gtk3/test/test-gtk-image.rb
index 8820768..ca1ca22 100644
--- a/gtk3/test/test-gtk-image.rb
+++ b/gtk3/test/test-gtk-image.rb
@@ -40,13 +40,13 @@ class TestGtkImage < Test::Unit::TestCase
     end
 
     test "resource" do
+      only_gtk_version(3, 18, 0)
       resource = Gio::Resource.load(fixture_path("image.gresource"))
       Gio::Resources.register(resource)
       begin
         resource_path = "/org/ruby/gnome/gnome-logo-icon.png"
         image = Gtk::Image.new(:resource => resource_path,
                                :size => :dialog)
-        omit("GTK+ 3.16 doesn't support getting resource path. See GitHub#461.")
         assert_equal(resource_path,
                      image.resource)
       ensure
diff --git a/gtk3/test/test-gtk-list-store.rb b/gtk3/test/test-gtk-list-store.rb
index 11c6648..4268df3 100644
--- a/gtk3/test/test-gtk-list-store.rb
+++ b/gtk3/test/test-gtk-list-store.rb
@@ -194,20 +194,26 @@ class TestGtkListStore < Test::Unit::TestCase
     test "iter" do
       GC.start
       n_iterators = count_objects(Gtk::TreeIter)
-      50.times do |i|
+      n_items = 50
+      n_iterators_created = 100
+      n_iterators_for_remove = 1
+
+      n_items.times do |i|
         iter = @store.append
         iter[ID] = i
         iter[NAME] = i.to_s
       end
-      100.times do
+      n_iterators_created.times do
         @store.iter_first
       end
       iter = @store.iter_first
       while @store.remove(iter); end
       assert_equal(0, @store.to_enum(:each).to_a.size)
+
       GC.start
       assert do
-        count_objects(Gtk::TreeIter) <= n_iterators + 1
+        count_objects(Gtk::TreeIter) <
+          (n_iterators + n_items + n_iterators_created + n_iterators_for_remove)
       end
     end
 
diff --git a/gtk3/test/test-gtk-text-view.rb b/gtk3/test/test-gtk-text-view.rb
new file mode 100644
index 0000000..0001116
--- /dev/null
+++ b/gtk3/test/test-gtk-text-view.rb
@@ -0,0 +1,64 @@
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+class TestGtkTextView < Test::Unit::TestCase
+  include GtkTestUtils
+
+  sub_test_case "instance methods" do
+    def setup
+      only_gtk_version(3, 14)
+      @text_buffer = Gtk::TextBuffer.new
+      @text_buffer.text = "Hello"
+      @text_view = Gtk::TextView.new(@text_buffer)
+    end
+
+    sub_test_case "#get_iter_at" do
+      test ":location" do
+        iter = @text_view.get_iter_at(:location => [0, 0])
+        assert_equal("H", iter.char)
+      end
+
+      test ":position" do
+        iter, trailing = @text_view.get_iter_at(:position => [0, 0])
+        assert_equal(["H", 0],
+                     [iter.char, trailing])
+      end
+    end
+
+    sub_test_case "#get_iter_at_location" do
+      test "found" do
+        iter = @text_view.get_iter_at_location(0, 0)
+        assert_equal("H", iter.char)
+      end
+
+      test "not found" do
+        assert_nil(@text_view.get_iter_at_location(100, 0))
+      end
+    end
+
+    sub_test_case "#get_iter_at_position" do
+      test "found" do
+        iter, trailing = @text_view.get_iter_at_position(0, 0)
+        assert_equal(["H", 0],
+                     [iter.char, trailing])
+      end
+
+      test "not found" do
+        assert_nil(@text_view.get_iter_at_position(100, 0))
+      end
+    end
+  end
+end
diff --git a/gtk3/test/test-gtk-tree-path.rb b/gtk3/test/test-gtk-tree-path.rb
index 489133b..75d6be0 100644
--- a/gtk3/test/test-gtk-tree-path.rb
+++ b/gtk3/test/test-gtk-tree-path.rb
@@ -30,9 +30,7 @@ class TestGtkTreePath < Test::Unit::TestCase
   end
 
   def test_indices
-    indices, depth = tree_path("2").indices
-    assert_equal([[2], 1],
-                 [indices, depth])
+    assert_equal([2], tree_path("2").indices)
   end
 
   def test_down!
diff --git a/gtk3/test/test-gtk-tree-view.rb b/gtk3/test/test-gtk-tree-view.rb
index e02a2d3..94b67c2 100644
--- a/gtk3/test/test-gtk-tree-view.rb
+++ b/gtk3/test/test-gtk-tree-view.rb
@@ -87,6 +87,67 @@ class TestGtkTreeView < Test::Unit::TestCase
                    normalized_data)
     end
 
+    sub_test_case "#expand_row" do
+      setup do
+        @parent = @store.append(nil)
+        @parent[0] = "parent"
+        @child = @store.append(@parent)
+        @child[0] = "child"
+        @grand_child = @store.append(@child)
+        @grand_child[0] = "grand child"
+      end
+
+      test "default" do
+        @view.expand_row(@parent.path)
+        assert do
+          @view.row_expanded?(@parent.path)
+        end
+        assert do
+          @view.row_expanded?(@child.path)
+        end
+      end
+
+      test "true" do
+        @view.expand_row(@parent.path, true)
+        assert do
+          @view.row_expanded?(@parent.path)
+        end
+        assert do
+          @view.row_expanded?(@child.path)
+        end
+      end
+
+      test "false" do
+        @view.expand_row(@parent.path, false)
+        assert do
+          @view.row_expanded?(@parent.path)
+        end
+        assert do
+          not @view.row_expanded?(@child.path)
+        end
+      end
+
+      test ":open_all => true" do
+        @view.expand_row(@parent.path, :open_all => true)
+        assert do
+          @view.row_expanded?(@parent.path)
+        end
+        assert do
+          @view.row_expanded?(@child.path)
+        end
+      end
+
+      test ":open_all => false" do
+        @view.expand_row(@parent.path, :open_all => false)
+        assert do
+          @view.row_expanded?(@parent.path)
+        end
+        assert do
+          not @view.row_expanded?(@child.path)
+        end
+      end
+    end
+
     test "#row_expanded?" do
       parent = @store.append(nil)
       parent[0] = "Hello"
@@ -129,4 +190,40 @@ class TestGtkTreeView < Test::Unit::TestCase
       end
     end
   end
+
+  sub_test_case "signal" do
+    def setup
+      @store = Gtk::TreeStore.new(String)
+      @view = Gtk::TreeView.new(@store)
+
+      root = @store.append(nil)
+      root[0] = "root"
+      child = @store.append(root)
+      child[0] = "child"
+      grand_child = @store.append(child)
+      grand_child[0] = "grand child"
+    end
+
+    test "row-collapsed" do
+      @view.expand_all
+
+      values = []
+      @view.signal_connect("row-collapsed") do |_, iter, path|
+        values << iter[0]
+      end
+      @view.collapse_row(Gtk::TreePath.new("0:0"))
+      assert_equal(["child"], values)
+    end
+
+    test "row-expanded" do
+      @view.collapse_all
+
+      values = []
+      @view.signal_connect("row-expanded") do |_, iter, path|
+        values << iter[0]
+      end
+      @view.expand_row(Gtk::TreePath.new("0"))
+      assert_equal(["root", "child"], values)
+    end
+  end
 end
diff --git a/gtk3/test/test-gtk-window.rb b/gtk3/test/test-gtk-window.rb
index bda69ca..6f23f8b 100644
--- a/gtk3/test/test-gtk-window.rb
+++ b/gtk3/test/test-gtk-window.rb
@@ -26,8 +26,8 @@ class TestGtkWindow < Test::Unit::TestCase
       @window.icon = fixture_path("gnome-logo-icon.png")
     end
 
-    test "Gdk::Pixbuf" do
-      icon = Gdk::Pixbuf.new(fixture_path("gnome-logo-icon.png"))
+    test "GdkPixbuf::Pixbuf" do
+      icon = GdkPixbuf::Pixbuf.new(:file => fixture_path("gnome-logo-icon.png"))
       @window.icon = icon
     end
   end
diff --git a/gtk3/test/test-pango-context.rb b/gtk3/test/test-pango-context.rb
new file mode 100644
index 0000000..589e74b
--- /dev/null
+++ b/gtk3/test/test-pango-context.rb
@@ -0,0 +1,56 @@
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+class TestPangoContext < Test::Unit::TestCase
+  include GtkTestUtils
+
+  def test_set_shape_renderer
+    text = "this is a test"
+    label = Gtk::Label.new(text)
+    layout = label.layout
+
+    last_block_arguments = nil
+    layout.context.set_shape_renderer do |cr, attr, do_path|
+      last_block_arguments = [cr.class, attr.class, do_path]
+    end
+
+    metrics = layout.context.get_metrics(layout.font_description)
+    ascent = metrics.ascent
+    logical_rect = Pango::Rectangle.new(0, -ascent, ascent, ascent)
+    ink_rect = logical_rect.dup
+    attrs = Pango::AttrList.new
+    attr = Pango::AttrShape.new(ink_rect, logical_rect, "a")
+    attr.start_index = text[0, text.index("a")].bytesize
+    attr.end_index = attr.start_index + "a".bytesize
+    attrs.insert(attr)
+    label.attributes = attrs
+
+    window = Gtk::Window.new
+    window.signal_connect("destroy") do
+      Gtk.main_quit
+    end
+    window.add(label)
+    GLib::Timeout.add(1000) do
+      window.destroy
+      GLib::Source::REMOVE
+    end
+    window.show_all
+    Gtk.main
+
+    assert_equal([Cairo::Context, Pango::AttrShape, false],
+                 last_block_arguments)
+  end
+end
diff --git a/gtksourceview3/Rakefile b/gtksourceview3/Rakefile
index 18a54df..803ab6d 100644
--- a/gtksourceview3/Rakefile
+++ b/gtksourceview3/Rakefile
@@ -44,7 +44,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
       :name => "gtksourceview",
       :download_site => :gnome,
       :label => "GtkSourceView",
-      :version => "3.20.1",
+      :version => "3.20.4",
       :compression_method => "xz",
       :windows => {
         :configure_args => [
diff --git a/pango/Rakefile b/pango/Rakefile
index e5603f3..e841cf8 100644
--- a/pango/Rakefile
+++ b/pango/Rakefile
@@ -48,9 +48,9 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
     },
     {
       :name => "harfbuzz",
-      :download_base_url => "https://www.freedesktop.org/software/harfbuzz/release",
+      :download_site => :freedesktop,
       :label => "HarfBuzz",
-      :version => "1.2.4",
+      :version => "1.3.0",
       :compression_method => "bz2",
       :windows => {
         :configure_args => [
@@ -64,7 +64,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
       :name => "pango",
       :download_site => :gnome,
       :label => "pango",
-      :version => "1.40.0",
+      :version => "1.40.1",
       :compression_method => "xz",
       :windows => {
         :configure_args => [
diff --git a/pango/ext/pango/rbpangoattribute.c b/pango/ext/pango/rbpangoattribute.c
index b9a9436..4976222 100644
--- a/pango/ext/pango/rbpangoattribute.c
+++ b/pango/ext/pango/rbpangoattribute.c
@@ -229,6 +229,12 @@ attr_shape_value(VALUE self)
     return rb_ary_new3(2, attr_shape_ink_rect(self), attr_shape_logical_rect(self));
 }
 
+static VALUE
+attr_shape_data(VALUE self)
+{
+    return (VALUE)(((PangoAttrShape *)RVAL2ATTR(self))->data);
+}
+
 /*
  * Initialize methods
  */
@@ -464,6 +470,7 @@ Init_pango_attribute(VALUE mPango)
     rbg_define_method(tmpklass, "ink_rect", attr_shape_ink_rect, 0);
     rbg_define_method(tmpklass, "logical_rect", attr_shape_logical_rect, 0);
     rbg_define_method(tmpklass, "value", attr_shape_value, 0);
+    rbg_define_method(tmpklass, "data", attr_shape_data, 0);
     MAKE_ATTR(PANGO_ATTR_SCALE, AttrScale, pattrfloat, 1);
     /* PangoScale */
     rb_define_const(tmpklass, "XX_SMALL", rb_float_new(PANGO_SCALE_XX_SMALL));
diff --git a/pango/ext/pango/rbpangoattrlist.c b/pango/ext/pango/rbpangoattrlist.c
index a563fb6..a3c095e 100644
--- a/pango/ext/pango/rbpangoattrlist.c
+++ b/pango/ext/pango/rbpangoattrlist.c
@@ -1,6 +1,6 @@
 /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
 /*
- *  Copyright (C) 2011  Ruby-GNOME2 Project Team
+ *  Copyright (C) 2011-2016 Ruby-GNOME2 Project Team
  *  Copyright (C) 2002-2005 Masao Mutoh 
  *
  *  This library is free software; you can redistribute it and/or
@@ -64,7 +64,7 @@ rg_splice(VALUE self, VALUE other, VALUE pos, VALUE len)
 static gboolean
 filter_func(PangoAttribute *attr, gpointer data)
 {
-    return CBOOL2RVAL(rb_funcall((VALUE)data, id_call, 1, ATTR2RVAL(attr)));
+    return RVAL2CBOOL(rb_funcall((VALUE)data, id_call, 1, ATTR2RVAL(attr)));
 }
 
 static VALUE
diff --git a/pango/ext/pango/rbpangocontext.c b/pango/ext/pango/rbpangocontext.c
index d935295..f90695f 100644
--- a/pango/ext/pango/rbpangocontext.c
+++ b/pango/ext/pango/rbpangocontext.c
@@ -1,6 +1,6 @@
 /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
 /*
- *  Copyright (C) 2011  Ruby-GNOME2 Project Team
+ *  Copyright (C) 2011-2016 Ruby-GNOME2 Project Team
  *  Copyright (C) 2002-2005 Masao Mutoh
  *
  *  This library is free software; you can redistribute it and/or
@@ -21,6 +21,8 @@
 
 #include "rbpangoprivate.h"
 
+static ID id_call;
+
 #define RG_TARGET_NAMESPACE cContext
 #define _SELF(self) (RVAL2PANGOCONTEXT(self))
 
@@ -33,26 +35,26 @@ rg_itemize(int argc, VALUE *argv, VALUE self)
     rb_scan_args(argc, argv, "42", &arg1, &arg2, &arg3, &arg4, &arg5, &arg6);
 
     if (TYPE(arg1) == T_STRING) {
-        list = pango_itemize(_SELF(self), 
-                             RVAL2CSTR(arg1),      /* text */ 
-                             NUM2INT(arg2),        /* start_index */ 
+        list = pango_itemize(_SELF(self),
+                             RVAL2CSTR(arg1),      /* text */
+                             NUM2INT(arg2),        /* start_index */
                              NUM2INT(arg3),        /* length */
                              RVAL2PANGOATTRLIST(arg4), /* attrs */
                              NIL_P(arg5) ? NULL : RVAL2PANGOATTRITERATOR(arg5)); /* cached_iter */
     } else {
 #ifdef HAVE_PANGO_ITEMIZE_WITH_BASE_DIR
-        list = pango_itemize_with_base_dir(_SELF(self), 
+        list = pango_itemize_with_base_dir(_SELF(self),
                                            RVAL2PANGODIRECTION(arg1), /* base_dir */
-                                           RVAL2CSTR(arg2),      /* text */ 
-                                           NUM2INT(arg3),        /* start_index */ 
+                                           RVAL2CSTR(arg2),      /* text */
+                                           NUM2INT(arg3),        /* start_index */
                                            NUM2INT(arg4),        /* length */
                                            RVAL2PANGOATTRLIST(arg5), /* attrs */
                                            NIL_P(arg6) ? NULL : RVAL2PANGOATTRITERATOR(arg6)); /* cached_iter */
 #else
         rb_warn("Pango::Context#itemize(base_dir, text, start_index, length, attrs, cached_iter) isn't supported on this environment.");
-        list = pango_itemize(_SELF(self), 
-                             RVAL2CSTR(arg1),      /* text */ 
-                             NUM2INT(arg2),        /* start_index */ 
+        list = pango_itemize(_SELF(self),
+                             RVAL2CSTR(arg1),      /* text */
+                             NUM2INT(arg2),        /* start_index */
                              NUM2INT(arg3),        /* length */
                              RVAL2PANGOATTRLIST(arg4), /* attrs */
                              NIL_P(arg5) ? NULL : RVAL2PANGOATTRITERATOR(arg5)); /* cached_iter */
@@ -111,7 +113,7 @@ rg_language(VALUE self)
 static VALUE
 rg_set_language(VALUE self, VALUE lang)
 {
-    pango_context_set_language(_SELF(self), 
+    pango_context_set_language(_SELF(self),
                                RVAL2PANGOLANGUAGE(lang));
     return self;
 }
@@ -167,7 +169,7 @@ rg_matrix(VALUE self)
 static VALUE
 rg_set_matrix(VALUE self, VALUE matrix)
 {
-    pango_context_set_matrix(_SELF(self), 
+    pango_context_set_matrix(_SELF(self),
                              RVAL2PANGOMATRIX(matrix));
     return self;
 }
@@ -192,8 +194,8 @@ rg_get_metrics(int argc, VALUE *argv, VALUE self)
 
     rb_scan_args(argc, argv, "11", &desc, &lang);
 
-    return PANGOFONTMETRICS2RVAL(pango_context_get_metrics(_SELF(self), 
-                                                           RVAL2PANGOFONTDESCRIPTION(desc), 
+    return PANGOFONTMETRICS2RVAL(pango_context_get_metrics(_SELF(self),
+                                                           RVAL2PANGOFONTDESCRIPTION(desc),
                                                            NIL_P(lang) ? NULL : RVAL2PANGOLANGUAGE(lang)));
 }
 
@@ -253,6 +255,36 @@ rg_resolution(VALUE self)
 {
     return rb_float_new(pango_cairo_context_get_resolution(_SELF(self)));
 }
+
+static void
+shape_renderer_callback(cairo_t *cr,
+                        PangoAttrShape *attr,
+                        gboolean do_path,
+                        gpointer data)
+{
+    VALUE rb_cr;
+    VALUE rb_attr;
+    VALUE rb_do_path;
+    VALUE rb_callback;
+
+    rb_cr = CRCONTEXT2RVAL(cr);
+    rb_attr = ATTR2RVAL((PangoAttribute *)attr);
+    rb_do_path = CBOOL2RVAL(do_path);
+    rb_callback = (VALUE)data;
+    rb_funcall(rb_callback, id_call, 3, rb_cr, rb_attr, rb_do_path);
+}
+
+static VALUE
+rg_set_shape_renderer(VALUE self)
+{
+    VALUE func = rb_block_proc();
+    rb_iv_set(self, "@shape_renderer", func);
+    pango_cairo_context_set_shape_renderer(_SELF(self),
+                                           shape_renderer_callback,
+                                           (gpointer)func,
+                                           NULL);
+    return self;
+}
 #endif
 
 static VALUE
@@ -267,6 +299,8 @@ Init_pango_context(VALUE mPango)
 {
     VALUE RG_TARGET_NAMESPACE = G_DEF_CLASS(PANGO_TYPE_CONTEXT, "Context", mPango);
 
+    id_call = rb_intern("call");
+
     RG_DEF_METHOD(itemize, -1);
 
 #ifdef PANGO_ENABLE_BACKEND
@@ -298,6 +332,7 @@ Init_pango_context(VALUE mPango)
     RG_DEF_METHOD(font_options, 0);
     RG_DEF_METHOD(set_resolution, 1);
     RG_DEF_METHOD(resolution, 0);
+    RG_DEF_METHOD(set_shape_renderer, 0);
 #endif
 
     /* This will remove 2 or 3 releases later since 0.14.0. */
diff --git a/pango/ext/pango/rbpangoglyphinfo.c b/pango/ext/pango/rbpangoglyphinfo.c
index 0d5269d..f989ab2 100644
--- a/pango/ext/pango/rbpangoglyphinfo.c
+++ b/pango/ext/pango/rbpangoglyphinfo.c
@@ -1,6 +1,6 @@
 /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
 /*
- *  Copyright (C) 2011  Ruby-GNOME2 Project Team
+ *  Copyright (C) 2011-2016  Ruby-GNOME2 Project Team
  *  Copyright (C) 2005  Masao Mutoh
  *
  *  This library is free software; you can redistribute it and/or
@@ -83,11 +83,11 @@ rg_geometry(VALUE self)
 static VALUE
 rg_set_geometry(VALUE self, VALUE width, VALUE x_offset, VALUE y_offset)
 {
-    PangoGlyphGeometry geo = _SELF(self)->geometry;
+    PangoGlyphGeometry *geo = &(_SELF(self)->geometry);
 
-    geo.width = NUM2INT(width);
-    geo.x_offset = NUM2INT(x_offset);
-    geo.y_offset = NUM2INT(y_offset);
+    geo->width = NUM2INT(width);
+    geo->x_offset = NUM2INT(x_offset);
+    geo->y_offset = NUM2INT(y_offset);
 
     return self;
 }
diff --git a/pango/test/test-context.rb b/pango/test/test-context.rb
new file mode 100644
index 0000000..c66e5ac
--- /dev/null
+++ b/pango/test/test-context.rb
@@ -0,0 +1,113 @@
+# Copyright (C) 2016  Ruby-GNOME2 Project Team
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+
+class TestContext < Test::Unit::TestCase
+  include PangoTestUtils
+
+  def setup
+    font_map = Pango::CairoFontMap.default
+    @context = font_map.create_context
+  end
+
+  def test_set_font_map
+    font_map = Pango::CairoFontMap.default
+    @context.font_map = font_map
+    assert_equal(font_map, @context.font_map)
+  end
+
+  def test_set_font_description
+    description = Pango::FontDescription.new("monospace")
+    description.size = 10 * Pango::SCALE
+    @context.font_description = description
+    assert_equal("monospace 10", @context.font_description.to_s)
+  end
+
+  def test_set_language
+    @context.language = Pango::Language.new("fr")
+    assert_equal("fr", @context.language.to_s)
+  end
+
+  def test_set_base_dir
+    @context.base_dir = Pango::Context::DIRECTION_LTR
+    assert_equal(Pango::Context::DIRECTION_LTR, @context.base_dir)
+  end
+
+  def test_set_gravity
+    @context.gravity_hint = Pango::Gravity::HINT_STRONG
+    assert_equal(Pango::Gravity::HINT_STRONG, @context.gravity_hint)
+  end
+
+  def test_set_matrix
+    matrix = Pango::Matrix.new(0.1, 0.2, 0.3, 0.4, 0.5, 0.6)
+    @context.matrix = matrix
+    assert_equal(0.1, @context.matrix.xx)
+    assert_equal(0.2, @context.matrix.xy)
+    assert_equal(0.3, @context.matrix.yx)
+    assert_equal(0.4, @context.matrix.yy)
+    assert_equal(0.5, @context.matrix.x0)
+    assert_equal(0.6, @context.matrix.y0)
+  end
+
+  def test_load_font
+    description = Pango::FontDescription.new("monospace")
+    description.size = 10 * Pango::SCALE
+    font = @context.load_font(description)
+    assert_equal(10,
+                 (font.describe.size.to_f / Pango::SCALE).round)
+  end
+
+  def test_load_fontset
+    description = Pango::FontDescription.new("monospace")
+    description.size = 10 * Pango::SCALE
+    language = Pango::Language.new("fr")
+    fontset = @context.load_fontset(description, language)
+    a_unicode = GLib::UTF8.get_char("a")
+    font = fontset.get_font(a_unicode)
+    assert_equal(10,
+                 (font.describe.size.to_f / Pango::SCALE).round)
+  end
+
+  def test_get_metrics
+    description = Pango::FontDescription.new("monospace")
+    description.size = 10 * Pango::SCALE
+    language = Pango::Language.new("fr")
+    metrics = @context.get_metrics(description, language)
+    assert do
+      metrics.ascent > metrics.descent
+    end
+  end
+
+  def test_families
+    family_names = @context.families.collect(&:name)
+    assert do
+      family_names.include?("Monospace")
+    end
+  end
+
+  def test_font_options
+    options = Cairo::FontOptions.new
+    options.antialias = Cairo::Antialias::BEST
+    @context.font_options = options
+    assert_equal(Cairo::Antialias::BEST,
+                 @context.font_options.antialias)
+  end
+
+  def test_resolution
+    dpi = 72
+    @context.resolution = dpi
+    assert_equal(dpi, @context.resolution)
+  end
+end
diff --git a/poppler/Rakefile b/poppler/Rakefile
index 5ab8012..86e56b2 100644
--- a/poppler/Rakefile
+++ b/poppler/Rakefile
@@ -49,7 +49,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
       :name => "sqlite-autoconf",
       :download_base_url => "http://www.sqlite.org/2016",
       :label => "SQLite",
-      :version => "3120000",
+      :version => "3140100",
       :compression_method => "gz",
       :windows => {
         :configure_args => [],
diff --git a/poppler/ext/poppler/extconf.rb b/poppler/ext/poppler/extconf.rb
index 756f105..a9e2291 100644
--- a/poppler/ext/poppler/extconf.rb
+++ b/poppler/ext/poppler/extconf.rb
@@ -30,7 +30,7 @@ rescue LoadError
   require 'mkmf-gnome2'
 end
 
-["glib2", "atk", "gdk_pixbuf2"].each do |package|
+["glib2", "atk"].each do |package|
   directory = "#{package}#{version_suffix}"
   build_dir = "#{directory}/tmp/#{RUBY_PLATFORM}/#{package}/#{RUBY_VERSION}"
   add_depend_package(package, "#{directory}/ext/#{package}",
diff --git a/poppler/ext/poppler/rbpoppler-page.c b/poppler/ext/poppler/rbpoppler-page.c
index 12219d0..c4cc437 100644
--- a/poppler/ext/poppler/rbpoppler-page.c
+++ b/poppler/ext/poppler/rbpoppler-page.c
@@ -205,17 +205,17 @@ rg_text_layout(VALUE self)
     guint n_rectangles;
 
     if (poppler_page_get_text_layout(SELF(self), &rectangles, &n_rectangles)) {
-        VALUE *rb_list, *p;
-        VALUE ary;
+        VALUE rb_rectangles;
         guint i;
-        rb_list = p = ALLOC_N(VALUE, n_rectangles);
-        for (i = 0; i < n_rectangles; i++, p++) {
-            *p = POPPLERRECTANGLE2RVAL(&rectangles[i]);
+
+        rb_rectangles = rb_ary_new2(n_rectangles);
+        for (i = 0; i < n_rectangles; i++) {
+            rb_ary_push(rb_rectangles,
+                        POPPLERRECTANGLE2RVAL(&(rectangles[i])));
         }
-        ary = rb_ary_new4(n_rectangles, rb_list);
-        free(rb_list);
-        free(rectangles);
-        return ary;
+        g_free(rectangles);
+
+        return rb_rectangles;
     } else {
         return Qnil;
     }
diff --git a/poppler/sample/pdf2.rb b/poppler/sample/pdf2.rb
index 2db8405..9b493f0 100755
--- a/poppler/sample/pdf2.rb
+++ b/poppler/sample/pdf2.rb
@@ -115,7 +115,7 @@ def to_pixbuf_with_cairo(input, page_number, scale, rotate)
   temp = Tempfile.new("pdf2")
   cr.target.write_to_png(temp.path)
   cr.target.finish
-  Gdk::Pixbuf.new(temp.path)
+  GdkPixbuf::Pixbuf.new(:file => temp.path)
 end
 
 unless Poppler.cairo_available?
diff --git a/poppler/test/run-test.rb b/poppler/test/run-test.rb
index a6413ec..c0028ab 100755
--- a/poppler/test/run-test.rb
+++ b/poppler/test/run-test.rb
@@ -15,10 +15,12 @@ require 'glib-test-init'
  [pango_dir, "pango"],
  [glib_dir, "glib2"],
  [base_dir, "poppler"]].each do |dir, module_name|
-  if have_make
-    system("cd #{dir.dump} && make > /dev/null") or exit(false)
+  if File.exist?(File.join(dir, "Makefile"))
+    if have_make
+      system("cd #{dir.dump} && make > /dev/null") or exit(false)
+    end
+    $LOAD_PATH.unshift(File.join(dir, "ext", module_name))
   end
-  $LOAD_PATH.unshift(File.join(dir, "ext", module_name))
   $LOAD_PATH.unshift(File.join(dir, "lib"))
 end
 require "poppler"
diff --git a/poppler/test/test_page.rb b/poppler/test/test_page.rb
index bc187a5..01ffc84 100644
--- a/poppler/test/test_page.rb
+++ b/poppler/test/test_page.rb
@@ -30,6 +30,15 @@ class TestPage < Test::Unit::TestCase
     assert_kind_of(Poppler::Annotation, mapping.annotation)
   end
 
+  def test_text_layout
+    only_poppler_version(0, 16, 0)
+    document = Poppler::Document.new(form_pdf)
+    page = document[0]
+    layout = page.text_layout
+    assert_equal([60, 31, 79, 60],
+                 layout[0].to_a.collect(&:round))
+  end
+
   private
   def find_first_image_mapping(document)
     document.each do |page|
diff --git a/rsvg2/Rakefile b/rsvg2/Rakefile
index cea234f..37f74a8 100644
--- a/rsvg2/Rakefile
+++ b/rsvg2/Rakefile
@@ -57,7 +57,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
       :name => "librsvg",
       :download_site => :gnome,
       :label => "librsvg",
-      :version => "2.40.13",
+      :version => "2.40.16",
       :compression_method => "xz",
       :windows => {
         :configure_args => [
diff --git a/rsvg2/sample/svg2.rb b/rsvg2/sample/svg2.rb
index bd1fc5f..3f1bb56 100644
--- a/rsvg2/sample/svg2.rb
+++ b/rsvg2/sample/svg2.rb
@@ -38,7 +38,7 @@ def to_pixbuf_with_cairo(input, ratio)
   temp = Tempfile.new("svg2")
   cr.target.write_to_png(temp.path)
   cr.target.finish
-  Gdk::Pixbuf.new(temp.path)
+  GdkPixbuf::Pixbuf.new(:file => temp.path)
 end
 
 def to_pixbuf(input, ratio)
diff --git a/run-test.rb b/run-test.rb
index 061dc1b..ce70d9f 100755
--- a/run-test.rb
+++ b/run-test.rb
@@ -28,6 +28,7 @@ Pathname.glob((base_dir + "*").to_s) do |dir|
 end
 
 ignored_modules = [
+  "gdk_pixbuf2-no-gi",
   "gstreamer-no-gi",
   "gdk3-no-gi",
   "gtk3-no-gi",
diff --git a/travis-before-script.sh b/travis-before-script.sh
index d3a5ce4..2305bd2 100755
--- a/travis-before-script.sh
+++ b/travis-before-script.sh
@@ -34,5 +34,9 @@ sudo apt-get install -qq -y \
     gir1.2-webkit-1.0 \
     gir1.2-webkit-3.0 \
     gir1.2-webkit2-3.0 \
+    gir1.2-gsf-1 \
+    gir1.2-goffice-0.10 \
+    gir1.2-gnumeric\
+    gnumeric\
     gnome-icon-theme \
     dbus-x11
diff --git a/vte3/Rakefile b/vte3/Rakefile
index 03798d5..5657924 100644
--- a/vte3/Rakefile
+++ b/vte3/Rakefile
@@ -46,7 +46,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
       :name => "vte",
       :download_site => :gnome,
       :label => "vte",
-      :version => "0.44.0",
+      :version => "0.44.2",
       :compression_method => "xz",
       :windows => {
         :configure_args => [
diff --git a/vte3/lib/vte3.rb b/vte3/lib/vte3.rb
index bf72a0a..c3f8137 100644
--- a/vte3/lib/vte3.rb
+++ b/vte3/lib/vte3.rb
@@ -33,24 +33,7 @@ module Vte
   class Error < StandardError
   end
 
-  class << self
-    def const_missing(name)
-      init
-      if const_defined?(name)
-        const_get(name)
-      else
-        super
-      end
-    end
-
-    def init
-      class << self
-        remove_method(:init)
-        remove_method(:const_missing)
-      end
-      Gtk.init if Gtk.respond_to?(:init)
-      loader = Loader.new(self)
-      loader.load("Vte")
-    end
-  end
+  Gtk.init if Gtk.respond_to?(:init)
+  loader = Loader.new(self)
+  loader.load("Vte")
 end

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ruby-extras/ruby-gnome2.git



More information about the Pkg-ruby-extras-commits mailing list