diff --git a/examples/book/giomm/application/exampleapplication.cc b/examples/book/giomm/application/exampleapplication.cc
new file mode 100644
index 0000000..f85cc3c
--- /dev/null
+++ b/examples/book/giomm/application/exampleapplication.cc
@@ -0,0 +1,34 @@
+#include "exampleapplication.h"
+#include "examplewindow.h"
+
+ExampleApplication::ExampleApplication(const Glib::ustring& appid, Gio::ApplicationFlags flags)
+: Gtk::Application(appid, flags)
+{
+}
+
+void ExampleApplication::new_window(const Glib::RefPtr<Gio::File>& file)
+{
+  Gtk::Window * window = new ExampleWindow(file);
+  add_window(*window);
+  window->signal_hide().connect(sigc::bind<Gtk::Window *>(sigc::mem_fun(*this,
+      &ExampleApplication::window_hide_cb), window));
+}
+
+void ExampleApplication::window_hide_cb(Gtk::Window * window)
+{
+  delete window;
+}
+
+void ExampleApplication::on_activate()
+{
+  new_window(Glib::RefPtr<Gio::File>(0));
+}
+
+void ExampleApplication::on_open(const Gio::Application::type_vec_files& files,
+    const Glib::ustring& hint)
+{
+  for (unsigned int i = 0; i < files.size(); i++)
+  {
+    new_window(files[i]);
+  }
+}
diff --git a/examples/book/giomm/application/exampleapplication.h b/examples/book/giomm/application/exampleapplication.h
new file mode 100644
index 0000000..439e481
--- /dev/null
+++ b/examples/book/giomm/application/exampleapplication.h
@@ -0,0 +1,21 @@
+#ifndef GTKMM_EXAMPLEAPPLICATION_H
+#define GTKMM_EXAMPLEAPPLICATION_H
+
+#include <gtkmm.h>
+
+class ExampleApplication: public Gtk::Application
+{
+public:
+  ExampleApplication(const Glib::ustring& appid, Gio::ApplicationFlags flags =
+      Gio::APPLICATION_FLAGS_NONE);
+  void new_window(const Glib::RefPtr<Gio::File>& file);
+
+protected:
+  void on_activate();
+  void on_open(const Gio::Application::type_vec_files& files,
+      const Glib::ustring& hint);
+
+  void window_hide_cb(Gtk::Window * window);
+};
+
+#endif /* GTKMM_EXAMPLEAPPLICATION_H */
diff --git a/examples/book/giomm/application/examplewindow.cc b/examples/book/giomm/application/examplewindow.cc
new file mode 100644
index 0000000..8a9c4de
--- /dev/null
+++ b/examples/book/giomm/application/examplewindow.cc
@@ -0,0 +1,36 @@
+#include <iostream>
+
+#include "examplewindow.h"
+
+ExampleWindow::ExampleWindow(const Glib::RefPtr<Gio::File>& file)
+{
+  set_title("Bloatpad");
+
+  add(scrolled);
+  scrolled.add(view);
+
+  if (file)
+  {
+    gchar *contents;
+    gsize length;
+
+    try
+    {
+      if (file->load_contents(contents, length))
+      {
+        Glib::ustring text = Glib::ustring(contents, length);
+
+        Glib::RefPtr<Gtk::TextBuffer> buffer;
+
+        buffer = view.get_buffer();
+        buffer->set_text(text);
+        g_free(contents);
+      }
+    } catch (Glib::Error& e)
+    {
+      std::cerr << e.what() << std::endl;
+    }
+  }
+
+  show_all();
+}
diff --git a/examples/book/giomm/application/examplewindow.h b/examples/book/giomm/application/examplewindow.h
new file mode 100644
index 0000000..854dda8
--- /dev/null
+++ b/examples/book/giomm/application/examplewindow.h
@@ -0,0 +1,16 @@
+#ifndef GTKMM_EXAMPLEWINDOW_H_
+#define GTKMM_EXAMPLEWINDOW_H_
+
+#include <gtkmm.h>
+
+class ExampleWindow: public Gtk::Window
+{
+public:
+  ExampleWindow(const Glib::RefPtr<Gio::File>& file);
+
+private:
+  Gtk::ScrolledWindow scrolled;
+  Gtk::TextView view;
+};
+
+#endif /* GTKMM_EXAMPLEWINDOW_H */
diff --git a/examples/book/giomm/application/main.cc b/examples/book/giomm/application/main.cc
new file mode 100644
index 0000000..f221952
--- /dev/null
+++ b/examples/book/giomm/application/main.cc
@@ -0,0 +1,24 @@
+#include <gtkmm.h>
+#include <iostream>
+
+#include "exampleapplication.h"
+
+void open(const Gio::Application::type_vec_files &files,
+    const Glib::ustring& hint)
+{
+  std::cout << "signal open received" << std::endl;
+}
+
+int main(int argc, char **argv)
+{
+  Gtk::Main kit(argc, argv);
+
+  ExampleApplication bloat_pad("org.gtkmm.Test.bloatpad",
+      Gio::APPLICATION_HANDLES_OPEN);
+
+  bloat_pad.signal_open().connect(sigc::ptr_fun(open));
+
+  int status = bloat_pad.run(argc, argv);
+
+  return status;
+}
