[gnome-builder] builder: modernize GObjects.Use G_DECLARE_FINAL_TYPE() and G_DECLARE_DERIVABLE_TYPE()



commit 9440dc0c27162e8ca268b00f2c495a12da639a26
Author: Dimitris Zenios <dimitris zenios gmail com>
Date:   Fri May 8 16:14:22 2015 +0300

    builder: modernize GObjects.Use G_DECLARE_FINAL_TYPE() and G_DECLARE_DERIVABLE_TYPE()
    
    https://bugzilla.gnome.org/show_bug.cgi?id=749033

 src/commands/gb-command-bar-item.c             |   38 ++--
 src/commands/gb-command-bar-item.h             |   31 +---
 src/commands/gb-command-gaction-provider.c     |    5 +
 src/commands/gb-command-gaction-provider.h     |   35 +---
 src/commands/gb-command-gaction.c              |   54 +++---
 src/commands/gb-command-gaction.h              |   28 +---
 src/commands/gb-command-manager.c              |   28 ++--
 src/commands/gb-command-manager.h              |   27 +---
 src/commands/gb-command-provider.c             |   31 ++--
 src/commands/gb-command-provider.h             |   27 +---
 src/commands/gb-command-result.c               |   49 +++---
 src/commands/gb-command-result.h               |   27 +---
 src/commands/gb-command-vim.c                  |   33 ++--
 src/commands/gb-command-vim.h                  |   31 +---
 src/commands/gb-command.h                      |   19 +--
 src/devhelp/gb-devhelp-document.c              |   62 +++----
 src/devhelp/gb-devhelp-document.h              |   30 +---
 src/devhelp/gb-devhelp-view.c                  |   61 +++----
 src/devhelp/gb-devhelp-view.h                  |   30 +---
 src/dialogs/gb-recent-project-row.c            |    5 -
 src/dialogs/gb-recent-project-row.h            |   17 +--
 src/editor/gb-editor-settings-widget.c         |   79 ++++-----
 src/editor/gb-editor-settings-widget.h         |   26 +---
 src/gd/gd-tagged-entry.c                       |  225 +++++++++++-------------
 src/gd/gd-tagged-entry.h                       |   46 +-----
 src/gedit/gedit-menu-stack-switcher.c          |  146 +++++++---------
 src/gedit/gedit-menu-stack-switcher.h          |   31 +---
 src/html/gb-html-document.c                    |   46 +++---
 src/html/gb-html-document.h                    |   26 +---
 src/nautilus/nautilus-floating-bar.c           |   92 +++++-----
 src/nautilus/nautilus-floating-bar.h           |   27 +---
 src/preferences/gb-preferences-page-git.c      |   62 +++----
 src/preferences/gb-preferences-page-git.h      |   28 +---
 src/preferences/gb-preferences-page-language.c |   90 ++++------
 src/preferences/gb-preferences-page-language.h |   28 +---
 src/preferences/gb-preferences-page.c          |   43 +++--
 src/preferences/gb-preferences-page.h          |   23 +---
 src/tree/gb-tree-builder.c                     |   34 ++--
 src/tree/gb-tree-builder.h                     |   21 +--
 src/tree/gb-tree-node.c                        |   87 +++++-----
 src/tree/gb-tree-node.h                        |   31 +---
 src/tree/gb-tree.c                             |  104 +++++------
 src/tree/gb-tree.h                             |   23 +---
 43 files changed, 721 insertions(+), 1265 deletions(-)
---
diff --git a/src/commands/gb-command-bar-item.c b/src/commands/gb-command-bar-item.c
index de4575b..8587cbd 100644
--- a/src/commands/gb-command-bar-item.c
+++ b/src/commands/gb-command-bar-item.c
@@ -19,17 +19,19 @@
 #include <glib/gi18n.h>
 
 #include "gb-command-bar-item.h"
+#include "gb-widget.h"
 
-struct _GbCommandBarItemPrivate
+struct _GbCommandBarItem
 {
+  GtkBin           parent_instance;
   GbCommandResult *result;
 
-  GtkWidget *command_text;
-  GtkWidget *result_text;
-  GtkWidget *equal_label;
+  GtkWidget       *command_text;
+  GtkWidget       *result_text;
+  GtkWidget       *equal_label;
 };
 
-G_DEFINE_TYPE_WITH_PRIVATE (GbCommandBarItem, gb_command_bar_item, GTK_TYPE_BIN)
+G_DEFINE_TYPE (GbCommandBarItem, gb_command_bar_item, GTK_TYPE_BIN)
 
 enum {
   PROP_0,
@@ -61,7 +63,7 @@ gb_command_bar_item_get_result (GbCommandBarItem *item)
 {
   g_return_val_if_fail (GB_IS_COMMAND_BAR_ITEM (item), NULL);
 
-  return item->priv->result_text;
+  return item->result_text;
 }
 
 static gboolean
@@ -81,21 +83,21 @@ gb_command_bar_item_set_result (GbCommandBarItem *item,
   g_return_if_fail (GB_IS_COMMAND_BAR_ITEM (item));
   g_return_if_fail (GB_IS_COMMAND_RESULT (result));
 
-  if (item->priv->result != result)
+  if (item->result != result)
     {
-      g_clear_object (&item->priv->result);
+      g_clear_object (&item->result);
 
       if (result)
         {
-          item->priv->result = g_object_ref (result);
+          item->result = g_object_ref (result);
           g_object_bind_property (result, "command-text",
-                                  item->priv->command_text, "label",
+                                  item->command_text, "label",
                                   G_BINDING_SYNC_CREATE);
           g_object_bind_property (result, "result-text",
-                                  item->priv->result_text, "label",
+                                  item->result_text, "label",
                                   G_BINDING_SYNC_CREATE);
           g_object_bind_property_full (result, "result-text",
-                                       item->priv->equal_label, "visible",
+                                       item->equal_label, "visible",
                                        G_BINDING_SYNC_CREATE,
                                        string_to_boolean,
                                        NULL, NULL, NULL);
@@ -108,9 +110,9 @@ gb_command_bar_item_set_result (GbCommandBarItem *item,
 static void
 gb_command_bar_item_dispose (GObject *object)
 {
-  GbCommandBarItemPrivate *priv = GB_COMMAND_BAR_ITEM (object)->priv;
+  GbCommandBarItem *self = GB_COMMAND_BAR_ITEM (object);
 
-  g_clear_object (&priv->result);
+  g_clear_object (&self->result);
 
   G_OBJECT_CLASS (gb_command_bar_item_parent_class)->dispose (object);
 }
@@ -166,9 +168,9 @@ gb_command_bar_item_class_init (GbCommandBarItemClass *klass)
   gtk_widget_class_set_template_from_resource (widget_class,
                                                "/org/gnome/builder/ui/gb-command-bar-item.ui");
 
-  gtk_widget_class_bind_template_child_private (widget_class, GbCommandBarItem, command_text);
-  gtk_widget_class_bind_template_child_private (widget_class, GbCommandBarItem, result_text);
-  gtk_widget_class_bind_template_child_private (widget_class, GbCommandBarItem, equal_label);
+  GB_WIDGET_CLASS_BIND (widget_class, GbCommandBarItem, command_text);
+  GB_WIDGET_CLASS_BIND (widget_class, GbCommandBarItem, result_text);
+  GB_WIDGET_CLASS_BIND (widget_class, GbCommandBarItem, equal_label);
 
   gParamSpecs [PROP_RESULT] =
     g_param_spec_object ("result",
@@ -185,7 +187,5 @@ gb_command_bar_item_class_init (GbCommandBarItemClass *klass)
 static void
 gb_command_bar_item_init (GbCommandBarItem *self)
 {
-  self->priv = gb_command_bar_item_get_instance_private (self);
-
   gtk_widget_init_template (GTK_WIDGET (self));
 }
diff --git a/src/commands/gb-command-bar-item.h b/src/commands/gb-command-bar-item.h
index 2aa4d72..ad35d84 100644
--- a/src/commands/gb-command-bar-item.h
+++ b/src/commands/gb-command-bar-item.h
@@ -25,32 +25,11 @@
 
 G_BEGIN_DECLS
 
-#define GB_TYPE_COMMAND_BAR_ITEM            (gb_command_bar_item_get_type())
-#define GB_COMMAND_BAR_ITEM(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_COMMAND_BAR_ITEM, 
GbCommandBarItem))
-#define GB_COMMAND_BAR_ITEM_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_COMMAND_BAR_ITEM, 
GbCommandBarItem const))
-#define GB_COMMAND_BAR_ITEM_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GB_TYPE_COMMAND_BAR_ITEM, 
GbCommandBarItemClass))
-#define GB_IS_COMMAND_BAR_ITEM(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_COMMAND_BAR_ITEM))
-#define GB_IS_COMMAND_BAR_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GB_TYPE_COMMAND_BAR_ITEM))
-#define GB_COMMAND_BAR_ITEM_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GB_TYPE_COMMAND_BAR_ITEM, 
GbCommandBarItemClass))
-
-typedef struct _GbCommandBarItem        GbCommandBarItem;
-typedef struct _GbCommandBarItemClass   GbCommandBarItemClass;
-typedef struct _GbCommandBarItemPrivate GbCommandBarItemPrivate;
-
-struct _GbCommandBarItem
-{
-  GtkBin parent;
-
-  /*< private >*/
-  GbCommandBarItemPrivate *priv;
-};
-
-struct _GbCommandBarItemClass
-{
-  GtkBinClass parent;
-};
-
-GType      gb_command_bar_item_get_type   (void);
+#define GB_TYPE_COMMAND_BAR_ITEM (gb_command_bar_item_get_type())
+
+G_DECLARE_FINAL_TYPE (GbCommandBarItem, gb_command_bar_item,
+                      GB, COMMAND_BAR_ITEM, GtkBin)
+
 GtkWidget *gb_command_bar_item_new        (GbCommandResult  *result);
 GtkWidget *gb_command_bar_item_get_result (GbCommandBarItem *item);
 
diff --git a/src/commands/gb-command-gaction-provider.c b/src/commands/gb-command-gaction-provider.c
index 23ff3f4..5199335 100644
--- a/src/commands/gb-command-gaction-provider.c
+++ b/src/commands/gb-command-gaction-provider.c
@@ -29,6 +29,11 @@
 #include "gb-command-gaction.h"
 #include "gb-view.h"
 
+struct _GbCommandGactionProvider
+{
+  GbCommandProvider parent_instance;
+};
+
 G_DEFINE_TYPE (GbCommandGactionProvider, gb_command_gaction_provider, GB_TYPE_COMMAND_PROVIDER)
 
 /* Set this to 1 to enable the debug helper which prints the
diff --git a/src/commands/gb-command-gaction-provider.h b/src/commands/gb-command-gaction-provider.h
index 1ace8a0..aeb4e50 100644
--- a/src/commands/gb-command-gaction-provider.h
+++ b/src/commands/gb-command-gaction-provider.h
@@ -23,35 +23,12 @@
 
 G_BEGIN_DECLS
 
-#define GB_TYPE_COMMAND_GACTION_PROVIDER            (gb_command_gaction_provider_get_type())
-#define GB_COMMAND_GACTION_PROVIDER(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GB_TYPE_COMMAND_GACTION_PROVIDER, GbCommandGactionProvider))
-#define GB_COMMAND_GACTION_PROVIDER_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GB_TYPE_COMMAND_GACTION_PROVIDER, GbCommandGactionProvider const))
-#define GB_COMMAND_GACTION_PROVIDER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  
GB_TYPE_COMMAND_GACTION_PROVIDER, GbCommandGactionProviderClass))
-#define GB_IS_COMMAND_GACTION_PROVIDER(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
GB_TYPE_COMMAND_GACTION_PROVIDER))
-#define GB_IS_COMMAND_GACTION_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  
GB_TYPE_COMMAND_GACTION_PROVIDER))
-#define GB_COMMAND_GACTION_PROVIDER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  
GB_TYPE_COMMAND_GACTION_PROVIDER, GbCommandGactionProviderClass))
-
-typedef struct _GbCommandGactionProvider        GbCommandGactionProvider;
-typedef struct _GbCommandGactionProviderClass   GbCommandGactionProviderClass;
-typedef struct _GbCommandGactionProviderPrivate GbCommandGactionProviderPrivate;
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GbCommandGactionProvider, g_object_unref)
-
-struct _GbCommandGactionProvider
-{
-  GbCommandProvider parent;
-
-  /*< private >*/
-  GbCommandGactionProviderPrivate *priv;
-};
-
-struct _GbCommandGactionProviderClass
-{
-  GbCommandProviderClass parent;
-};
-
-GType              gb_command_gaction_provider_get_type (void);
-GbCommandProvider *gb_command_gaction_provider_new      (GbWorkbench *workbench);
+#define GB_TYPE_COMMAND_GACTION_PROVIDER (gb_command_gaction_provider_get_type())
+
+G_DECLARE_FINAL_TYPE (GbCommandGactionProvider, gb_command_gaction_provider,
+                      GB, COMMAND_GACTION_PROVIDER, GbCommandProvider)
+
+GbCommandProvider *gb_command_gaction_provider_new (GbWorkbench *workbench);
 
 G_END_DECLS
 
diff --git a/src/commands/gb-command-gaction.c b/src/commands/gb-command-gaction.c
index 90e4a4d..0082469 100644
--- a/src/commands/gb-command-gaction.c
+++ b/src/commands/gb-command-gaction.c
@@ -23,15 +23,16 @@
 
 #include "gb-command-gaction.h"
 
-struct _GbCommandGactionPrivate
+struct _GbCommandGaction
 {
+  GbCommand     parent_instance;
+
   GActionGroup *action_group;
   gchar        *action_name;
   GVariant     *parameters;
 };
 
-G_DEFINE_TYPE_WITH_PRIVATE (GbCommandGaction, gb_command_gaction,
-                            GB_TYPE_COMMAND)
+G_DEFINE_TYPE (GbCommandGaction, gb_command_gaction, GB_TYPE_COMMAND)
 
 enum {
   PROP_0,
@@ -50,10 +51,10 @@ gb_command_gaction_set_action_group (GbCommandGaction *gaction,
   g_return_if_fail (GB_IS_COMMAND_GACTION (gaction));
   g_return_if_fail (G_IS_ACTION_GROUP (action_group));
 
-  if (gaction->priv->action_group != action_group)
+  if (gaction->action_group != action_group)
     {
-      g_clear_object (&gaction->priv->action_group);
-      gaction->priv->action_group = g_object_ref (action_group);
+      g_clear_object (&gaction->action_group);
+      gaction->action_group = g_object_ref (action_group);
     }
 }
 
@@ -63,10 +64,10 @@ gb_command_gaction_set_action_name (GbCommandGaction *gaction,
 {
   g_return_if_fail (GB_IS_COMMAND_GACTION (gaction));
 
-  if (gaction->priv->action_name != action_name)
+  if (gaction->action_name != action_name)
     {
-      g_clear_pointer (&gaction->priv->action_name, g_free);
-      gaction->priv->action_name = g_strdup (action_name);
+      g_clear_pointer (&gaction->action_name, g_free);
+      gaction->action_name = g_strdup (action_name);
     }
 }
 
@@ -76,10 +77,10 @@ gb_command_gaction_set_parameters (GbCommandGaction *gaction,
 {
   g_return_if_fail (GB_IS_COMMAND_GACTION (gaction));
 
-  if (gaction->priv->parameters != variant)
+  if (gaction->parameters != variant)
     {
-      g_clear_pointer (&gaction->priv->parameters, g_variant_unref);
-      gaction->priv->parameters = g_variant_ref (variant);
+      g_clear_pointer (&gaction->parameters, g_variant_unref);
+      gaction->parameters = g_variant_ref (variant);
     }
 }
 
@@ -90,14 +91,14 @@ gb_command_gaction_execute (GbCommand *command)
 
   g_return_val_if_fail (GB_IS_COMMAND_GACTION (self), NULL);
 
-  if (self->priv->action_group &&
-      self->priv->action_name &&
-      g_action_group_has_action (self->priv->action_group,
-                                 self->priv->action_name))
+  if (self->action_group &&
+      self->action_name &&
+      g_action_group_has_action (self->action_group,
+                                 self->action_name))
     {
-      g_action_group_activate_action (self->priv->action_group,
-                                      self->priv->action_name,
-                                      self->priv->parameters);
+      g_action_group_activate_action (self->action_group,
+                                      self->action_name,
+                                      self->parameters);
     }
 
   return NULL;
@@ -106,11 +107,11 @@ gb_command_gaction_execute (GbCommand *command)
 static void
 gb_command_gaction_finalize (GObject *object)
 {
-  GbCommandGactionPrivate *priv = GB_COMMAND_GACTION (object)->priv;
+  GbCommandGaction *self = GB_COMMAND_GACTION (object);
 
-  g_clear_object (&priv->action_group);
-  g_clear_pointer (&priv->action_name, g_free);
-  g_clear_pointer (&priv->parameters, g_variant_unref);
+  g_clear_object (&self->action_group);
+  g_clear_pointer (&self->action_name, g_free);
+  g_clear_pointer (&self->parameters, g_variant_unref);
 
   G_OBJECT_CLASS (gb_command_gaction_parent_class)->finalize (object);
 }
@@ -126,15 +127,15 @@ gb_command_gaction_get_property (GObject    *object,
   switch (prop_id)
     {
     case PROP_ACTION_GROUP:
-      g_value_set_object (value, self->priv->action_group);
+      g_value_set_object (value, self->action_group);
       break;
 
     case PROP_ACTION_NAME:
-      g_value_set_string (value, self->priv->action_name);
+      g_value_set_string (value, self->action_name);
       break;
 
     case PROP_PARAMETERS:
-      g_value_set_variant (value, self->priv->parameters);
+      g_value_set_variant (value, self->parameters);
       break;
 
     default:
@@ -209,5 +210,4 @@ gb_command_gaction_class_init (GbCommandGactionClass *klass)
 static void
 gb_command_gaction_init (GbCommandGaction *self)
 {
-  self->priv = gb_command_gaction_get_instance_private (self);
 }
diff --git a/src/commands/gb-command-gaction.h b/src/commands/gb-command-gaction.h
index 942ad0e..0b94079 100644
--- a/src/commands/gb-command-gaction.h
+++ b/src/commands/gb-command-gaction.h
@@ -23,32 +23,10 @@
 
 G_BEGIN_DECLS
 
-#define GB_TYPE_COMMAND_GACTION            (gb_command_gaction_get_type())
-#define GB_COMMAND_GACTION(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_COMMAND_GACTION, 
GbCommandGaction))
-#define GB_COMMAND_GACTION_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_COMMAND_GACTION, 
GbCommandGaction const))
-#define GB_COMMAND_GACTION_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GB_TYPE_COMMAND_GACTION, 
GbCommandGactionClass))
-#define GB_IS_COMMAND_GACTION(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_COMMAND_GACTION))
-#define GB_IS_COMMAND_GACTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GB_TYPE_COMMAND_GACTION))
-#define GB_COMMAND_GACTION_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GB_TYPE_COMMAND_GACTION, 
GbCommandGactionClass))
+#define GB_TYPE_COMMAND_GACTION (gb_command_gaction_get_type())
 
-typedef struct _GbCommandGaction        GbCommandGaction;
-typedef struct _GbCommandGactionClass   GbCommandGactionClass;
-typedef struct _GbCommandGactionPrivate GbCommandGactionPrivate;
-
-struct _GbCommandGaction
-{
-       GbCommand parent;
-
-       /*< private >*/
-       GbCommandGactionPrivate *priv;
-};
-
-struct _GbCommandGactionClass
-{
-       GbCommandClass parent;
-};
-
-GType gb_command_gaction_get_type (void);
+G_DECLARE_FINAL_TYPE (GbCommandGaction, gb_command_gaction,
+                      GB, COMMAND_GACTION, GbCommand)
 
 G_END_DECLS
 
diff --git a/src/commands/gb-command-manager.c b/src/commands/gb-command-manager.c
index e9d9c3d..896ae7a 100644
--- a/src/commands/gb-command-manager.c
+++ b/src/commands/gb-command-manager.c
@@ -23,12 +23,14 @@
 #include "gb-command-manager.h"
 #include "gb-workbench.h"
 
-struct _GbCommandManagerPrivate
+struct _GbCommandManager
 {
+  GObject    parent_instance;
+
   GPtrArray *providers;
 };
 
-G_DEFINE_TYPE_WITH_PRIVATE (GbCommandManager, gb_command_manager, G_TYPE_OBJECT)
+G_DEFINE_TYPE (GbCommandManager, gb_command_manager, G_TYPE_OBJECT)
 
 GbCommandManager *
 gb_command_manager_new (void)
@@ -70,7 +72,7 @@ on_notify_priority_cb (GbCommandProvider *provider,
   g_return_if_fail (GB_IS_COMMAND_PROVIDER (provider));
   g_return_if_fail (GB_IS_COMMAND_MANAGER (manager));
 
-  g_ptr_array_sort (manager->priv->providers, provider_compare_func);
+  g_ptr_array_sort (manager->providers, provider_compare_func);
 }
 
 void
@@ -84,8 +86,8 @@ gb_command_manager_add_provider (GbCommandManager  *manager,
                            G_CALLBACK (on_notify_priority_cb),
                            manager, 0);
 
-  g_ptr_array_add (manager->priv->providers, g_object_ref (provider));
-  g_ptr_array_sort (manager->priv->providers, provider_compare_func);
+  g_ptr_array_add (manager->providers, g_object_ref (provider));
+  g_ptr_array_sort (manager->providers, provider_compare_func);
 }
 
 GbCommand *
@@ -98,11 +100,11 @@ gb_command_manager_lookup (GbCommandManager *manager,
   g_return_val_if_fail (GB_IS_COMMAND_MANAGER (manager), NULL);
   g_return_val_if_fail (command_text, NULL);
 
-  for (i = 0; i < manager->priv->providers->len; i++)
+  for (i = 0; i < manager->providers->len; i++)
     {
       GbCommandProvider *provider;
 
-      provider = g_ptr_array_index (manager->priv->providers, i);
+      provider = g_ptr_array_index (manager->providers, i);
       ret = gb_command_provider_lookup (provider, command_text);
 
       if (ret)
@@ -131,11 +133,11 @@ gb_command_manager_complete (GbCommandManager *manager,
 
   completions = g_ptr_array_new ();
 
-  for (i = 0; i < manager->priv->providers->len; i++)
+  for (i = 0; i < manager->providers->len; i++)
     {
       GbCommandProvider *provider;
 
-      provider = g_ptr_array_index (manager->priv->providers, i);
+      provider = g_ptr_array_index (manager->providers, i);
       gb_command_provider_complete (provider, completions, initial_command_text);
     }
 
@@ -150,9 +152,9 @@ gb_command_manager_complete (GbCommandManager *manager,
 static void
 gb_command_manager_finalize (GObject *object)
 {
-  GbCommandManagerPrivate *priv = GB_COMMAND_MANAGER (object)->priv;
+  GbCommandManager *self = GB_COMMAND_MANAGER (object);
 
-  g_clear_pointer (&priv->providers, g_ptr_array_unref);
+  g_clear_pointer (&self->providers, g_ptr_array_unref);
 
   G_OBJECT_CLASS (gb_command_manager_parent_class)->finalize (object);
 }
@@ -168,7 +170,5 @@ gb_command_manager_class_init (GbCommandManagerClass *klass)
 static void
 gb_command_manager_init (GbCommandManager *self)
 {
-  self->priv = gb_command_manager_get_instance_private (self);
-
-  self->priv->providers = g_ptr_array_new_with_free_func (g_object_unref);
+  self->providers = g_ptr_array_new_with_free_func (g_object_unref);
 }
diff --git a/src/commands/gb-command-manager.h b/src/commands/gb-command-manager.h
index 0a8740a..c23b425 100644
--- a/src/commands/gb-command-manager.h
+++ b/src/commands/gb-command-manager.h
@@ -26,32 +26,11 @@
 
 G_BEGIN_DECLS
 
-#define GB_TYPE_COMMAND_MANAGER            (gb_command_manager_get_type())
-#define GB_COMMAND_MANAGER(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_COMMAND_MANAGER, 
GbCommandManager))
-#define GB_COMMAND_MANAGER_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_COMMAND_MANAGER, 
GbCommandManager const))
-#define GB_COMMAND_MANAGER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GB_TYPE_COMMAND_MANAGER, 
GbCommandManagerClass))
-#define GB_IS_COMMAND_MANAGER(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_COMMAND_MANAGER))
-#define GB_IS_COMMAND_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GB_TYPE_COMMAND_MANAGER))
-#define GB_COMMAND_MANAGER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GB_TYPE_COMMAND_MANAGER, 
GbCommandManagerClass))
+#define GB_TYPE_COMMAND_MANAGER (gb_command_manager_get_type())
 
-typedef struct _GbCommandManager        GbCommandManager;
-typedef struct _GbCommandManagerClass   GbCommandManagerClass;
-typedef struct _GbCommandManagerPrivate GbCommandManagerPrivate;
+G_DECLARE_FINAL_TYPE (GbCommandManager, gb_command_manager,
+                      GB, COMMAND_MANAGER, GObject)
 
-struct _GbCommandManager
-{
-  GObject parent;
-
-  /*< private >*/
-  GbCommandManagerPrivate *priv;
-};
-
-struct _GbCommandManagerClass
-{
-  GObjectClass parent;
-};
-
-GType              gb_command_manager_get_type     (void);
 GbCommandManager  *gb_command_manager_new          (void);
 GbCommand         *gb_command_manager_lookup       (GbCommandManager  *manager,
                                                     const gchar       *command_text);
diff --git a/src/commands/gb-command-provider.c b/src/commands/gb-command-provider.c
index e43993c..15b4d92 100644
--- a/src/commands/gb-command-provider.c
+++ b/src/commands/gb-command-provider.c
@@ -21,12 +21,12 @@
 #include "gb-command-provider.h"
 #include "gb-workbench.h"
 
-struct _GbCommandProviderPrivate
+typedef struct
 {
   GbWorkbench *workbench;
   GbView      *active_view;
   gint         priority;
-};
+} GbCommandProviderPrivate;
 
 G_DEFINE_TYPE_WITH_PRIVATE (GbCommandProvider, gb_command_provider, G_TYPE_OBJECT)
 
@@ -66,22 +66,22 @@ gb_command_provider_new (GbWorkbench *workbench)
 GbView *
 gb_command_provider_get_active_view (GbCommandProvider *provider)
 {
+  GbCommandProviderPrivate *priv = gb_command_provider_get_instance_private (provider);
+
   g_return_val_if_fail (GB_IS_COMMAND_PROVIDER (provider), NULL);
 
-  return provider->priv->active_view;
+  return priv->active_view;
 }
 
 static void
 gb_command_provider_set_active_view (GbCommandProvider *provider,
                                     GbView             *tab)
 {
-  GbCommandProviderPrivate *priv;
+  GbCommandProviderPrivate *priv = gb_command_provider_get_instance_private (provider);
 
   g_return_if_fail (GB_IS_COMMAND_PROVIDER (provider));
   g_return_if_fail (!tab || GB_IS_VIEW (tab));
 
-  priv = provider->priv;
-
   if (priv->active_view)
     {
       g_object_remove_weak_pointer (G_OBJECT (priv->active_view),
@@ -149,22 +149,22 @@ gb_command_provider_disconnect (GbCommandProvider *provider,
 GbWorkbench *
 gb_command_provider_get_workbench (GbCommandProvider *provider)
 {
+  GbCommandProviderPrivate *priv = gb_command_provider_get_instance_private (provider);
+
   g_return_val_if_fail (GB_IS_COMMAND_PROVIDER (provider), NULL);
 
-  return provider->priv->workbench;
+  return priv->workbench;
 }
 
 static void
 gb_command_provider_set_workbench (GbCommandProvider *provider,
                                    GbWorkbench       *workbench)
 {
-  GbCommandProviderPrivate *priv;
+  GbCommandProviderPrivate *priv = gb_command_provider_get_instance_private (provider);
 
   g_return_if_fail (GB_IS_COMMAND_PROVIDER (provider));
   g_return_if_fail (!workbench || GB_IS_WORKBENCH (workbench));
 
-  priv = provider->priv;
-
   if (priv->workbench != workbench)
     {
       if (priv->workbench)
@@ -191,20 +191,24 @@ gb_command_provider_set_workbench (GbCommandProvider *provider,
 gint
 gb_command_provider_get_priority (GbCommandProvider *provider)
 {
+  GbCommandProviderPrivate *priv = gb_command_provider_get_instance_private (provider);
+
   g_return_val_if_fail (GB_IS_COMMAND_PROVIDER (provider), 0);
 
-  return provider->priv->priority;
+  return priv->priority;
 }
 
 void
 gb_command_provider_set_priority (GbCommandProvider *provider,
                                   gint               priority)
 {
+  GbCommandProviderPrivate *priv = gb_command_provider_get_instance_private (provider);
+
   g_return_if_fail (GB_IS_COMMAND_PROVIDER (provider));
 
-  if (provider->priv->priority != priority)
+  if (priv->priority != priority)
     {
-      provider->priv->priority = priority;
+      priv->priority = priority;
       g_object_notify_by_pspec (G_OBJECT (provider),
                                 gParamSpecs [PROP_PRIORITY]);
     }
@@ -406,5 +410,4 @@ gb_command_provider_class_init (GbCommandProviderClass *klass)
 static void
 gb_command_provider_init (GbCommandProvider *self)
 {
-  self->priv = gb_command_provider_get_instance_private (self);
 }
diff --git a/src/commands/gb-command-provider.h b/src/commands/gb-command-provider.h
index 21c4b12..f1ee95b 100644
--- a/src/commands/gb-command-provider.h
+++ b/src/commands/gb-command-provider.h
@@ -27,40 +27,21 @@
 
 G_BEGIN_DECLS
 
-#define GB_TYPE_COMMAND_PROVIDER            (gb_command_provider_get_type())
-#define GB_COMMAND_PROVIDER(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_COMMAND_PROVIDER, 
GbCommandProvider))
-#define GB_COMMAND_PROVIDER_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_COMMAND_PROVIDER, 
GbCommandProvider const))
-#define GB_COMMAND_PROVIDER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GB_TYPE_COMMAND_PROVIDER, 
GbCommandProviderClass))
-#define GB_IS_COMMAND_PROVIDER(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_COMMAND_PROVIDER))
-#define GB_IS_COMMAND_PROVIDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GB_TYPE_COMMAND_PROVIDER))
-#define GB_COMMAND_PROVIDER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GB_TYPE_COMMAND_PROVIDER, 
GbCommandProviderClass))
+#define GB_TYPE_COMMAND_PROVIDER (gb_command_provider_get_type())
 
-typedef struct _GbCommandProvider        GbCommandProvider;
-typedef struct _GbCommandProviderClass   GbCommandProviderClass;
-typedef struct _GbCommandProviderPrivate GbCommandProviderPrivate;
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GbCommandProvider, g_object_unref)
-
-struct _GbCommandProvider
-{
-  GObject parent;
-
-  /*< private >*/
-  GbCommandProviderPrivate *priv;
-};
+G_DECLARE_DERIVABLE_TYPE (GbCommandProvider, gb_command_provider, GB, COMMAND_PROVIDER, GObject)
 
 struct _GbCommandProviderClass
 {
   GObjectClass parent;
 
-  GbCommand *(*lookup) (GbCommandProvider *provider,
-                        const gchar       *command_text);
+  GbCommand *(*lookup)   (GbCommandProvider *provider,
+                          const gchar       *command_text);
   void       (*complete) (GbCommandProvider *provider,
                           GPtrArray         *completions,
                           const gchar       *command_text);
 };
 
-GType              gb_command_provider_get_type        (void);
 GbCommandProvider *gb_command_provider_new             (GbWorkbench       *workbench);
 GbWorkbench       *gb_command_provider_get_workbench   (GbCommandProvider *provider);
 GbView            *gb_command_provider_get_active_view (GbCommandProvider *provider);
diff --git a/src/commands/gb-command-result.c b/src/commands/gb-command-result.c
index e9f45e6..f44e5c0 100644
--- a/src/commands/gb-command-result.c
+++ b/src/commands/gb-command-result.c
@@ -20,15 +20,17 @@
 
 #include "gb-command-result.h"
 
-struct _GbCommandResultPrivate
+struct _GbCommandResult
 {
-  gchar *command_text;
-  gchar *result_text;
-  guint is_error : 1;
-  guint is_running : 1;
+  GObject  parent_instance;
+
+  gchar   *command_text;
+  gchar   *result_text;
+  guint    is_error : 1;
+  guint    is_running : 1;
 };
 
-G_DEFINE_TYPE_WITH_PRIVATE (GbCommandResult, gb_command_result, G_TYPE_OBJECT)
+G_DEFINE_TYPE (GbCommandResult, gb_command_result, G_TYPE_OBJECT)
 
 enum {
   PROP_0,
@@ -52,7 +54,7 @@ gb_command_result_get_command_text (GbCommandResult *result)
 {
   g_return_val_if_fail (GB_IS_COMMAND_RESULT (result), NULL);
 
-  return result->priv->command_text;
+  return result->command_text;
 }
 
 void
@@ -61,10 +63,10 @@ gb_command_result_set_command_text (GbCommandResult *result,
 {
   g_return_if_fail (GB_IS_COMMAND_RESULT (result));
 
-  if (result->priv->command_text != command_text)
+  if (result->command_text != command_text)
     {
-      g_free (result->priv->command_text);
-      result->priv->command_text = g_strdup (command_text);
+      g_free (result->command_text);
+      result->command_text = g_strdup (command_text);
       g_object_notify_by_pspec (G_OBJECT (result),
                                 gParamSpecs [PROP_COMMAND_TEXT]);
     }
@@ -75,7 +77,7 @@ gb_command_result_get_result_text (GbCommandResult *result)
 {
   g_return_val_if_fail (GB_IS_COMMAND_RESULT (result), NULL);
 
-  return result->priv->result_text;
+  return result->result_text;
 }
 
 void
@@ -84,10 +86,10 @@ gb_command_result_set_result_text (GbCommandResult *result,
 {
   g_return_if_fail (GB_IS_COMMAND_RESULT (result));
 
-  if (result->priv->result_text != result_text)
+  if (result->result_text != result_text)
     {
-      g_free (result->priv->result_text);
-      result->priv->result_text = g_strdup (result_text);
+      g_free (result->result_text);
+      result->result_text = g_strdup (result_text);
       g_object_notify_by_pspec (G_OBJECT (result),
                                 gParamSpecs [PROP_RESULT_TEXT]);
     }
@@ -98,7 +100,7 @@ gb_command_result_get_is_running (GbCommandResult *result)
 {
   g_return_val_if_fail (GB_IS_COMMAND_RESULT (result), FALSE);
 
-  return result->priv->is_running;
+  return result->is_running;
 }
 
 void
@@ -107,9 +109,9 @@ gb_command_result_set_is_running (GbCommandResult *result,
 {
   g_return_if_fail (GB_IS_COMMAND_RESULT (result));
 
-  if (result->priv->is_running != is_running)
+  if (result->is_running != is_running)
     {
-      result->priv->is_running = !!is_running;
+      result->is_running = !!is_running;
       g_object_notify_by_pspec (G_OBJECT (result),
                                 gParamSpecs [PROP_IS_RUNNING]);
     }
@@ -120,7 +122,7 @@ gb_command_result_get_is_error (GbCommandResult *result)
 {
   g_return_val_if_fail (GB_IS_COMMAND_RESULT (result), FALSE);
 
-  return result->priv->is_error;
+  return result->is_error;
 }
 
 void
@@ -129,9 +131,9 @@ gb_command_result_set_is_error (GbCommandResult *result,
 {
   g_return_if_fail (GB_IS_COMMAND_RESULT (result));
 
-  if (result->priv->is_error != is_error)
+  if (result->is_error != is_error)
     {
-      result->priv->is_error = !!is_error;
+      result->is_error = !!is_error;
       g_object_notify_by_pspec (G_OBJECT (result),
                                 gParamSpecs [PROP_IS_ERROR]);
     }
@@ -140,10 +142,10 @@ gb_command_result_set_is_error (GbCommandResult *result,
 static void
 gb_command_result_finalize (GObject *object)
 {
-  GbCommandResultPrivate *priv = GB_COMMAND_RESULT (object)->priv;
+  GbCommandResult *self = GB_COMMAND_RESULT (object);
 
-  g_clear_pointer (&priv->command_text, g_free);
-  g_clear_pointer (&priv->result_text, g_free);
+  g_clear_pointer (&self->command_text, g_free);
+  g_clear_pointer (&self->result_text, g_free);
 
   G_OBJECT_CLASS (gb_command_result_parent_class)->finalize (object);
 }
@@ -257,5 +259,4 @@ gb_command_result_class_init (GbCommandResultClass *klass)
 static void
 gb_command_result_init (GbCommandResult *self)
 {
-  self->priv = gb_command_result_get_instance_private (self);
 }
diff --git a/src/commands/gb-command-result.h b/src/commands/gb-command-result.h
index ab82d1f..a50ebed 100644
--- a/src/commands/gb-command-result.h
+++ b/src/commands/gb-command-result.h
@@ -23,32 +23,11 @@
 
 G_BEGIN_DECLS
 
-#define GB_TYPE_COMMAND_RESULT            (gb_command_result_get_type())
-#define GB_COMMAND_RESULT(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_COMMAND_RESULT, 
GbCommandResult))
-#define GB_COMMAND_RESULT_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_COMMAND_RESULT, 
GbCommandResult const))
-#define GB_COMMAND_RESULT_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GB_TYPE_COMMAND_RESULT, 
GbCommandResultClass))
-#define GB_IS_COMMAND_RESULT(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_COMMAND_RESULT))
-#define GB_IS_COMMAND_RESULT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GB_TYPE_COMMAND_RESULT))
-#define GB_COMMAND_RESULT_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GB_TYPE_COMMAND_RESULT, 
GbCommandResultClass))
+#define GB_TYPE_COMMAND_RESULT (gb_command_result_get_type())
 
-typedef struct _GbCommandResult        GbCommandResult;
-typedef struct _GbCommandResultClass   GbCommandResultClass;
-typedef struct _GbCommandResultPrivate GbCommandResultPrivate;
+G_DECLARE_FINAL_TYPE (GbCommandResult, gb_command_result,
+                      GB, COMMAND_RESULT, GObject)
 
-struct _GbCommandResult
-{
-  GObject parent;
-
-  /*< private >*/
-  GbCommandResultPrivate *priv;
-};
-
-struct _GbCommandResultClass
-{
-  GObjectClass parent;
-};
-
-GType            gb_command_result_get_type         (void);
 GbCommandResult *gb_command_result_new              (void);
 gboolean         gb_command_result_get_is_running   (GbCommandResult *result);
 void             gb_command_result_set_is_running   (GbCommandResult *result,
diff --git a/src/commands/gb-command-vim.c b/src/commands/gb-command-vim.c
index 9ecdbef..bb0981a 100644
--- a/src/commands/gb-command-vim.c
+++ b/src/commands/gb-command-vim.c
@@ -24,13 +24,15 @@
 #include "gb-command-vim.h"
 #include "gb-vim.h"
 
-struct _GbCommandVimPrivate
+struct _GbCommandVim
 {
+  GbCommand      parent_instance;
+
   IdeSourceView *source_view;
   gchar         *command_text;
 };
 
-G_DEFINE_TYPE_WITH_PRIVATE (GbCommandVim, gb_command_vim, GB_TYPE_COMMAND)
+G_DEFINE_TYPE (GbCommandVim, gb_command_vim, GB_TYPE_COMMAND)
 
 enum {
   PROP_0,
@@ -46,7 +48,7 @@ gb_command_vim_get_source_view (GbCommandVim *vim)
 {
   g_return_val_if_fail (GB_IS_COMMAND_VIM (vim), NULL);
 
-  return vim->priv->source_view;
+  return vim->source_view;
 }
 
 static void
@@ -56,7 +58,7 @@ gb_command_vim_set_source_view (GbCommandVim  *vim,
   g_return_if_fail (GB_IS_COMMAND_VIM (vim));
   g_return_if_fail (IDE_IS_SOURCE_VIEW (source_view));
 
-  if (ide_set_weak_pointer (&vim->priv->source_view, source_view))
+  if (ide_set_weak_pointer (&vim->source_view, source_view))
     g_object_notify_by_pspec (G_OBJECT (vim), gParamSpecs [PROP_SOURCE_VIEW]);
 }
 
@@ -65,7 +67,7 @@ gb_command_vim_get_command_text (GbCommandVim *vim)
 {
   g_return_val_if_fail (GB_IS_COMMAND_VIM (vim), NULL);
 
-  return vim->priv->command_text;
+  return vim->command_text;
 }
 
 void
@@ -75,10 +77,10 @@ gb_command_vim_set_command_text (GbCommandVim *vim,
   g_return_if_fail (GB_IS_COMMAND_VIM (vim));
   g_return_if_fail (command_text);
 
-  if (command_text != vim->priv->command_text)
+  if (command_text != vim->command_text)
     {
-      g_free (vim->priv->command_text);
-      vim->priv->command_text = g_strdup (command_text);
+      g_free (vim->command_text);
+      vim->command_text = g_strdup (command_text);
       g_object_notify_by_pspec (G_OBJECT (vim), gParamSpecs [PROP_COMMAND_TEXT]);
     }
 }
@@ -90,14 +92,14 @@ gb_command_vim_execute (GbCommand *command)
 
   g_return_val_if_fail (GB_IS_COMMAND_VIM (self), NULL);
 
-  if (self->priv->source_view)
+  if (self->source_view)
     {
-      GtkSourceView *source_view = (GtkSourceView *)self->priv->source_view;
+      GtkSourceView *source_view = (GtkSourceView *)self->source_view;
       GError *error = NULL;
 
-      IDE_TRACE_MSG ("Executing Vim command: %s", self->priv->command_text);
+      IDE_TRACE_MSG ("Executing Vim command: %s", self->command_text);
 
-      if (!gb_vim_execute (source_view, self->priv->command_text, &error))
+      if (!gb_vim_execute (source_view, self->command_text, &error))
         {
           g_warning ("%s", error->message);
           g_clear_error (&error);
@@ -110,10 +112,10 @@ gb_command_vim_execute (GbCommand *command)
 static void
 gb_command_vim_finalize (GObject *object)
 {
-  GbCommandVimPrivate *priv = GB_COMMAND_VIM (object)->priv;
+  GbCommandVim *self = GB_COMMAND_VIM (object);
 
-  ide_clear_weak_pointer (&priv->source_view);
-  g_clear_pointer (&priv->command_text, g_free);
+  ide_clear_weak_pointer (&self->source_view);
+  g_clear_pointer (&self->command_text, g_free);
 
   G_OBJECT_CLASS (gb_command_vim_parent_class)->finalize (object);
 }
@@ -198,5 +200,4 @@ gb_command_vim_class_init (GbCommandVimClass *klass)
 static void
 gb_command_vim_init (GbCommandVim *self)
 {
-  self->priv = gb_command_vim_get_instance_private (self);
 }
diff --git a/src/commands/gb-command-vim.h b/src/commands/gb-command-vim.h
index f134f38..c173a39 100644
--- a/src/commands/gb-command-vim.h
+++ b/src/commands/gb-command-vim.h
@@ -23,32 +23,11 @@
 
 G_BEGIN_DECLS
 
-#define GB_TYPE_COMMAND_VIM            (gb_command_vim_get_type())
-#define GB_COMMAND_VIM(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_COMMAND_VIM, 
GbCommandVim))
-#define GB_COMMAND_VIM_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_COMMAND_VIM, GbCommandVim 
const))
-#define GB_COMMAND_VIM_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GB_TYPE_COMMAND_VIM, 
GbCommandVimClass))
-#define GB_IS_COMMAND_VIM(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_COMMAND_VIM))
-#define GB_IS_COMMAND_VIM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GB_TYPE_COMMAND_VIM))
-#define GB_COMMAND_VIM_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GB_TYPE_COMMAND_VIM, 
GbCommandVimClass))
-
-typedef struct _GbCommandVim        GbCommandVim;
-typedef struct _GbCommandVimClass   GbCommandVimClass;
-typedef struct _GbCommandVimPrivate GbCommandVimPrivate;
-
-struct _GbCommandVim
-{
-  GbCommand parent;
-
-  /*< private >*/
-  GbCommandVimPrivate *priv;
-};
-
-struct _GbCommandVimClass
-{
-  GbCommandClass parent;
-};
-
-GType gb_command_vim_get_type (void);
+#define GB_TYPE_COMMAND_VIM (gb_command_vim_get_type())
+
+G_DECLARE_FINAL_TYPE (GbCommandVim, gb_command_vim,
+                      GB, COMMAND_VIM, GbCommand)
+
 
 G_END_DECLS
 
diff --git a/src/commands/gb-command.h b/src/commands/gb-command.h
index d667088..1d666ed 100644
--- a/src/commands/gb-command.h
+++ b/src/commands/gb-command.h
@@ -26,24 +26,8 @@
 G_BEGIN_DECLS
 
 #define GB_TYPE_COMMAND            (gb_command_get_type())
-#define GB_COMMAND(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_COMMAND, GbCommand))
-#define GB_COMMAND_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_COMMAND, GbCommand const))
-#define GB_COMMAND_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GB_TYPE_COMMAND, GbCommandClass))
-#define GB_IS_COMMAND(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_COMMAND))
-#define GB_IS_COMMAND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GB_TYPE_COMMAND))
-#define GB_COMMAND_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GB_TYPE_COMMAND, GbCommandClass))
-
-typedef struct _GbCommand        GbCommand;
-typedef struct _GbCommandClass   GbCommandClass;
-typedef struct _GbCommandPrivate GbCommandPrivate;
-
-struct _GbCommand
-{
-  GObject parent;
 
-  /*< private >*/
-  GbCommandPrivate *priv;
-};
+G_DECLARE_DERIVABLE_TYPE (GbCommand, gb_command, GB, COMMAND, GObject)
 
 struct _GbCommandClass
 {
@@ -52,7 +36,6 @@ struct _GbCommandClass
   GbCommandResult *(*execute) (GbCommand *command);
 };
 
-GType            gb_command_get_type (void);
 GbCommand       *gb_command_new      (void);
 GbCommandResult *gb_command_execute  (GbCommand *command);
 
diff --git a/src/devhelp/gb-devhelp-document.c b/src/devhelp/gb-devhelp-document.c
index 83715f2..eb89dba 100644
--- a/src/devhelp/gb-devhelp-document.c
+++ b/src/devhelp/gb-devhelp-document.c
@@ -24,22 +24,20 @@
 #include "gb-devhelp-document.h"
 #include "gb-devhelp-view.h"
 
-struct _GbDevhelpDocumentPrivate
+struct _GbDevhelpDocument
 {
-  DhBookManager *book_manager;
+  GObjectClass    parent_instance;
+
+  DhBookManager  *book_manager;
   DhKeywordModel *model;
-  gchar *title;
-  gchar *uri;
+  gchar          *title;
+  gchar          *uri;
 };
 
 static void gb_document_init (GbDocumentInterface *iface);
 
-G_DEFINE_TYPE_EXTENDED (GbDevhelpDocument,
-                        gb_devhelp_document,
-                        G_TYPE_OBJECT,
-                        0,
-                        G_ADD_PRIVATE (GbDevhelpDocument)
-                        G_IMPLEMENT_INTERFACE (GB_TYPE_DOCUMENT,
+G_DEFINE_TYPE_WITH_CODE (GbDevhelpDocument, gb_devhelp_document, G_TYPE_OBJECT,
+                         G_IMPLEMENT_INTERFACE (GB_TYPE_DOCUMENT,
                                                gb_document_init))
 
 enum {
@@ -67,10 +65,10 @@ gb_devhelp_document_set_title (GbDevhelpDocument *document,
 {
   g_return_if_fail (GB_IS_DEVHELP_DOCUMENT (document));
 
-  if (document->priv->title != title)
+  if (document->title != title)
     {
-      g_clear_pointer (&document->priv->title, g_free);
-      document->priv->title = g_strdup_printf (_("Documentation (%s)"), title);
+      g_clear_pointer (&document->title, g_free);
+      document->title = g_strdup_printf (_("Documentation (%s)"), title);
       g_object_notify (G_OBJECT (document), "title");
     }
 }
@@ -80,7 +78,7 @@ gb_devhelp_document_get_uri (GbDevhelpDocument *document)
 {
   g_return_val_if_fail (GB_IS_DEVHELP_DOCUMENT (document), NULL);
 
-  return document->priv->uri;
+  return document->uri;
 }
 
 void
@@ -90,10 +88,10 @@ gb_devhelp_document_set_uri (GbDevhelpDocument *document,
   g_return_if_fail (GB_IS_DEVHELP_DOCUMENT (document));
   g_return_if_fail (uri);
 
-  if (document->priv->uri != uri)
+  if (document->uri != uri)
     {
-      g_clear_pointer (&document->priv->uri, g_free);
-      document->priv->uri = g_strdup (uri);
+      g_clear_pointer (&document->uri, g_free);
+      document->uri = g_strdup (uri);
       g_object_notify_by_pspec (G_OBJECT (document), gParamSpecs [PROP_URI]);
     }
 }
@@ -102,17 +100,14 @@ void
 gb_devhelp_document_set_search (GbDevhelpDocument *document,
                                 const gchar       *search)
 {
-  GbDevhelpDocumentPrivate *priv;
   GtkTreeIter iter;
 
   g_return_if_fail (GB_IS_DEVHELP_DOCUMENT (document));
 
-  priv = document->priv;
-
   /* TODO: Filter books/language based on project? */
-  dh_keyword_model_filter (priv->model, search, NULL, NULL);
+  dh_keyword_model_filter (document->model, search, NULL, NULL);
 
-  if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->model), &iter))
+  if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (document->model), &iter))
     {
       DhLink *link_ = NULL;
       gchar *name = NULL;
@@ -124,7 +119,7 @@ gb_devhelp_document_set_search (GbDevhelpDocument *document,
        * G_TYPE_POINTER so dh_link_unref() does not need to be called
        * on the resulting structure.
        */
-      gtk_tree_model_get (GTK_TREE_MODEL (priv->model), &iter,
+      gtk_tree_model_get (GTK_TREE_MODEL (document->model), &iter,
                           DH_KEYWORD_MODEL_COL_NAME, &name,
                           DH_KEYWORD_MODEL_COL_LINK, &link_,
                           -1);
@@ -147,8 +142,8 @@ gb_devhelp_document_get_title (GbDocument *document)
 
   g_return_val_if_fail (GB_IS_DEVHELP_DOCUMENT (self), NULL);
 
-  if (self->priv->title)
-    return self->priv->title;
+  if (self->title)
+    return self->title;
 
   return _("Documentation");
 }
@@ -175,10 +170,10 @@ gb_devhelp_document_create_view (GbDocument *document)
 static void
 gb_devhelp_document_constructed (GObject *object)
 {
-  GbDevhelpDocumentPrivate *priv = GB_DEVHELP_DOCUMENT (object)->priv;
+  GbDevhelpDocument *self = GB_DEVHELP_DOCUMENT (object);
 
-  dh_book_manager_populate (priv->book_manager);
-  dh_keyword_model_set_words (priv->model, priv->book_manager);
+  dh_book_manager_populate (self->book_manager);
+  dh_keyword_model_set_words (self->model, self->book_manager);
 
   G_OBJECT_CLASS (gb_devhelp_document_parent_class)->constructed (object);
 }
@@ -186,10 +181,10 @@ gb_devhelp_document_constructed (GObject *object)
 static void
 gb_devhelp_document_finalize (GObject *object)
 {
-  GbDevhelpDocumentPrivate *priv = GB_DEVHELP_DOCUMENT (object)->priv;
+  GbDevhelpDocument *self = GB_DEVHELP_DOCUMENT (object);
 
-  g_clear_pointer (&priv->title, g_free);
-  g_clear_object (&priv->book_manager);
+  g_clear_pointer (&self->title, g_free);
+  g_clear_object (&self->book_manager);
 
   G_OBJECT_CLASS (gb_devhelp_document_parent_class)->finalize (object);
 }
@@ -269,9 +264,8 @@ gb_devhelp_document_class_init (GbDevhelpDocumentClass *klass)
 static void
 gb_devhelp_document_init (GbDevhelpDocument *self)
 {
-  self->priv = gb_devhelp_document_get_instance_private (self);
-  self->priv->book_manager = dh_book_manager_new ();
-  self->priv->model = dh_keyword_model_new ();
+  self->book_manager = dh_book_manager_new ();
+  self->model = dh_keyword_model_new ();
 }
 
 static void
diff --git a/src/devhelp/gb-devhelp-document.h b/src/devhelp/gb-devhelp-document.h
index dc1868f..0993e56 100644
--- a/src/devhelp/gb-devhelp-document.h
+++ b/src/devhelp/gb-devhelp-document.h
@@ -23,32 +23,10 @@
 
 G_BEGIN_DECLS
 
-#define GB_TYPE_DEVHELP_DOCUMENT            (gb_devhelp_document_get_type())
-#define GB_DEVHELP_DOCUMENT(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_DEVHELP_DOCUMENT, 
GbDevhelpDocument))
-#define GB_DEVHELP_DOCUMENT_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_DEVHELP_DOCUMENT, 
GbDevhelpDocument const))
-#define GB_DEVHELP_DOCUMENT_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GB_TYPE_DEVHELP_DOCUMENT, 
GbDevhelpDocumentClass))
-#define GB_IS_DEVHELP_DOCUMENT(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_DEVHELP_DOCUMENT))
-#define GB_IS_DEVHELP_DOCUMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GB_TYPE_DEVHELP_DOCUMENT))
-#define GB_DEVHELP_DOCUMENT_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GB_TYPE_DEVHELP_DOCUMENT, 
GbDevhelpDocumentClass))
-
-typedef struct _GbDevhelpDocument        GbDevhelpDocument;
-typedef struct _GbDevhelpDocumentClass   GbDevhelpDocumentClass;
-typedef struct _GbDevhelpDocumentPrivate GbDevhelpDocumentPrivate;
-
-struct _GbDevhelpDocument
-{
-  GObject parent;
-
-  /*< private >*/
-  GbDevhelpDocumentPrivate *priv;
-};
-
-struct _GbDevhelpDocumentClass
-{
-  GObjectClass parent;
-};
-
-GType              gb_devhelp_document_get_type   (void);
+#define GB_TYPE_DEVHELP_DOCUMENT (gb_devhelp_document_get_type())
+
+G_DECLARE_FINAL_TYPE (GbDevhelpDocument, gb_devhelp_document, GB, DEVHELP_DOCUMENT, GObject)
+
 GbDevhelpDocument *gb_devhelp_document_new        (void);
 void               gb_devhelp_document_set_search (GbDevhelpDocument *document,
                                                    const gchar       *search);
diff --git a/src/devhelp/gb-devhelp-view.c b/src/devhelp/gb-devhelp-view.c
index 02735d0..a8dfee8 100644
--- a/src/devhelp/gb-devhelp-view.c
+++ b/src/devhelp/gb-devhelp-view.c
@@ -24,8 +24,9 @@
 #include "gb-devhelp-view.h"
 #include "gb-widget.h"
 
-struct _GbDevhelpViewPrivate
+struct _GbDevhelpView
 {
+  GbView             parent_instance;
   /* References owned by view */
   GbDevhelpDocument *document;
 
@@ -36,7 +37,7 @@ struct _GbDevhelpViewPrivate
   GtkPaned          *paned;
 };
 
-G_DEFINE_TYPE_WITH_PRIVATE (GbDevhelpView, gb_devhelp_view, GB_TYPE_VIEW)
+G_DEFINE_TYPE (GbDevhelpView, gb_devhelp_view, GB_TYPE_VIEW)
 
 enum {
   PROP_0,
@@ -59,7 +60,7 @@ gb_devhelp_view_get_document (GbView *view)
 {
   g_return_val_if_fail (GB_IS_DEVHELP_VIEW (view), NULL);
 
-  return GB_DOCUMENT (GB_DEVHELP_VIEW (view)->priv->document);
+  return GB_DOCUMENT (GB_DEVHELP_VIEW (view)->document);
 }
 
 static void
@@ -75,10 +76,10 @@ gb_devhelp_view_notify_uri (GbDevhelpView     *view,
   uri = gb_devhelp_document_get_uri (document);
   if (uri)
     {
-      webkit_web_view_load_uri (view->priv->web_view1, uri);
+      webkit_web_view_load_uri (view->web_view1, uri);
 
-      if (view->priv->web_view2 != NULL)
-        webkit_web_view_load_uri (view->priv->web_view2, uri);
+      if (view->web_view2 != NULL)
+        webkit_web_view_load_uri (view->web_view2, uri);
     }
 }
 
@@ -86,26 +87,23 @@ static void
 gb_devhelp_view_set_document (GbDevhelpView     *view,
                               GbDevhelpDocument *document)
 {
-  GbDevhelpViewPrivate *priv;
-
   g_return_if_fail (GB_IS_DEVHELP_VIEW (view));
 
-  priv = view->priv;
 
-  if (priv->document != document)
+  if (view->document != document)
     {
-      if (priv->document)
+      if (view->document)
         {
-          g_signal_handlers_disconnect_by_func (priv->document,
+          g_signal_handlers_disconnect_by_func (view->document,
                                                 G_CALLBACK (gb_devhelp_view_notify_uri),
                                                 view);
-          g_clear_object (&priv->document);
+          g_clear_object (&view->document);
         }
 
       if (document)
         {
-          priv->document = g_object_ref (document);
-          g_signal_connect_object (priv->document,
+          view->document = g_object_ref (document);
+          g_signal_connect_object (view->document,
                                    "notify::uri",
                                    G_CALLBACK (gb_devhelp_view_notify_uri),
                                    view,
@@ -138,30 +136,27 @@ gb_devhelp_view_set_split_view (GbView   *view,
                                 gboolean  split_view)
 {
   GbDevhelpView *self = (GbDevhelpView *)view;
-  GbDevhelpViewPrivate *priv;
 
   g_assert (GB_IS_DEVHELP_VIEW (self));
 
   g_return_if_fail (GB_IS_DEVHELP_VIEW (view));
 
-  priv = self->priv;
-
-  if (split_view && (priv->web_view2 != NULL))
+  if (split_view && (self->web_view2 != NULL))
     return;
 
-  if (!split_view && (priv->web_view2 == NULL))
+  if (!split_view && (self->web_view2 == NULL))
     return;
 
   if (split_view)
     {
-      priv->web_view2 = g_object_new (WEBKIT_TYPE_WEB_VIEW,
+      self->web_view2 = g_object_new (WEBKIT_TYPE_WEB_VIEW,
                                       "visible", TRUE,
                                       NULL);
-      gtk_container_add_with_properties (GTK_CONTAINER (priv->paned), GTK_WIDGET (priv->web_view2),
+      gtk_container_add_with_properties (GTK_CONTAINER (self->paned), GTK_WIDGET (self->web_view2),
                                          "shrink", FALSE,
                                          "resize", TRUE,
                                          NULL);
-      gtk_widget_grab_focus (GTK_WIDGET (priv->web_view2));
+      gtk_widget_grab_focus (GTK_WIDGET (self->web_view2));
 
       gb_devhelp_view_notify_uri (self,
                                   NULL,
@@ -169,20 +164,20 @@ gb_devhelp_view_set_split_view (GbView   *view,
     }
   else
     {
-      GtkWidget *copy = GTK_WIDGET (priv->web_view2);
+      GtkWidget *copy = GTK_WIDGET (self->web_view2);
 
-      priv->web_view2 = NULL;
-      gtk_container_remove (GTK_CONTAINER (priv->paned), copy);
-      gtk_widget_grab_focus (GTK_WIDGET (priv->web_view1));
+      self->web_view2 = NULL;
+      gtk_container_remove (GTK_CONTAINER (self->paned), copy);
+      gtk_widget_grab_focus (GTK_WIDGET (self->web_view1));
     }
 }
 
 static void
 gb_devhelp_view_finalize (GObject *object)
 {
-  GbDevhelpViewPrivate *priv = GB_DEVHELP_VIEW (object)->priv;
+  GbDevhelpView *self = GB_DEVHELP_VIEW (object);
 
-  g_clear_object (&priv->document);
+  g_clear_object (&self->document);
 
   G_OBJECT_CLASS (gb_devhelp_view_parent_class)->finalize (object);
 }
@@ -198,7 +193,7 @@ gb_devhelp_view_get_property (GObject    *object,
   switch (prop_id)
     {
     case PROP_DOCUMENT:
-      g_value_set_object (value, self->priv->document);
+      g_value_set_object (value, self->document);
       break;
 
     default:
@@ -249,8 +244,8 @@ gb_devhelp_view_class_init (GbDevhelpViewClass *klass)
   g_object_class_install_properties (object_class, LAST_PROP, gParamSpecs);
 
   GB_WIDGET_CLASS_TEMPLATE (klass, "gb-devhelp-view.ui");
-  GB_WIDGET_CLASS_BIND_PRIVATE (klass, GbDevhelpView, web_view1);
-  GB_WIDGET_CLASS_BIND_PRIVATE (klass, GbDevhelpView, paned);
+  GB_WIDGET_CLASS_BIND (klass, GbDevhelpView, web_view1);
+  GB_WIDGET_CLASS_BIND (klass, GbDevhelpView, paned);
 
   g_type_ensure (WEBKIT_TYPE_WEB_VIEW);
 }
@@ -258,7 +253,5 @@ gb_devhelp_view_class_init (GbDevhelpViewClass *klass)
 static void
 gb_devhelp_view_init (GbDevhelpView *self)
 {
-  self->priv = gb_devhelp_view_get_instance_private (self);
-
   gtk_widget_init_template (GTK_WIDGET (self));
 }
diff --git a/src/devhelp/gb-devhelp-view.h b/src/devhelp/gb-devhelp-view.h
index 5f09dc2..d2ee3be 100644
--- a/src/devhelp/gb-devhelp-view.h
+++ b/src/devhelp/gb-devhelp-view.h
@@ -24,32 +24,10 @@
 
 G_BEGIN_DECLS
 
-#define GB_TYPE_DEVHELP_VIEW            (gb_devhelp_view_get_type())
-#define GB_DEVHELP_VIEW(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_DEVHELP_VIEW, 
GbDevhelpView))
-#define GB_DEVHELP_VIEW_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_DEVHELP_VIEW, 
GbDevhelpView const))
-#define GB_DEVHELP_VIEW_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GB_TYPE_DEVHELP_VIEW, 
GbDevhelpViewClass))
-#define GB_IS_DEVHELP_VIEW(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_DEVHELP_VIEW))
-#define GB_IS_DEVHELP_VIEW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GB_TYPE_DEVHELP_VIEW))
-#define GB_DEVHELP_VIEW_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GB_TYPE_DEVHELP_VIEW, 
GbDevhelpViewClass))
-
-typedef struct _GbDevhelpView        GbDevhelpView;
-typedef struct _GbDevhelpViewClass   GbDevhelpViewClass;
-typedef struct _GbDevhelpViewPrivate GbDevhelpViewPrivate;
-
-struct _GbDevhelpView
-{
-  GbView parent;
-
-  /*< private >*/
-  GbDevhelpViewPrivate *priv;
-};
-
-struct _GbDevhelpViewClass
-{
-  GbViewClass parent;
-};
-
-GType   gb_devhelp_view_get_type (void);
+#define GB_TYPE_DEVHELP_VIEW (gb_devhelp_view_get_type())
+
+G_DECLARE_FINAL_TYPE (GbDevhelpView, gb_devhelp_view, GB, DEVHELP_VIEW, GbView)
+
 GbView *gb_devhelp_view_new      (GbDevhelpDocument *document);
 
 G_END_DECLS
diff --git a/src/dialogs/gb-recent-project-row.c b/src/dialogs/gb-recent-project-row.c
index 80e14f2..700884a 100644
--- a/src/dialogs/gb-recent-project-row.c
+++ b/src/dialogs/gb-recent-project-row.c
@@ -36,11 +36,6 @@ struct _GbRecentProjectRow
   GtkRevealer    *revealer;
 };
 
-struct _GbRecentProjectRowClass
-{
-  GtkListBoxRowClass parent_class;
-};
-
 enum
 {
   PROP_0,
diff --git a/src/dialogs/gb-recent-project-row.h b/src/dialogs/gb-recent-project-row.h
index 9ad84d4..13245b3 100644
--- a/src/dialogs/gb-recent-project-row.h
+++ b/src/dialogs/gb-recent-project-row.h
@@ -24,18 +24,11 @@
 
 G_BEGIN_DECLS
 
-#define GB_TYPE_RECENT_PROJECT_ROW            (gb_recent_project_row_get_type())
-#define GB_RECENT_PROJECT_ROW(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GB_TYPE_RECENT_PROJECT_ROW, GbRecentProjectRow))
-#define GB_RECENT_PROJECT_ROW_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GB_TYPE_RECENT_PROJECT_ROW, GbRecentProjectRow const))
-#define GB_RECENT_PROJECT_ROW_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  
GB_TYPE_RECENT_PROJECT_ROW, GbRecentProjectRowClass))
-#define GB_IS_RECENT_PROJECT_ROW(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
GB_TYPE_RECENT_PROJECT_ROW))
-#define GB_IS_RECENT_PROJECT_ROW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  
GB_TYPE_RECENT_PROJECT_ROW))
-#define GB_RECENT_PROJECT_ROW_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  
GB_TYPE_RECENT_PROJECT_ROW, GbRecentProjectRowClass))
-
-typedef struct _GbRecentProjectRow      GbRecentProjectRow;
-typedef struct _GbRecentProjectRowClass GbRecentProjectRowClass;
-
-GType           gb_recent_project_row_get_type         (void);
+#define GB_TYPE_RECENT_PROJECT_ROW (gb_recent_project_row_get_type())
+
+G_DECLARE_FINAL_TYPE (GbRecentProjectRow, gb_recent_project_row,
+                      GB, RECENT_PROJECT_ROW, GtkListBoxRow)
+
 GtkWidget      *gb_recent_project_row_new              (IdeProjectInfo     *project_info);
 IdeProjectInfo *gb_recent_project_row_get_project_info (GbRecentProjectRow *self);
 gboolean        gb_recent_project_row_get_selected     (GbRecentProjectRow *self);
diff --git a/src/editor/gb-editor-settings-widget.c b/src/editor/gb-editor-settings-widget.c
index 150a017..ea3c1cb 100644
--- a/src/editor/gb-editor-settings-widget.c
+++ b/src/editor/gb-editor-settings-widget.c
@@ -21,8 +21,10 @@
 #include "gb-editor-settings-widget.h"
 #include "gb-widget.h"
 
-struct _GbEditorSettingsWidgetPrivate
+struct _GbEditorSettingsWidget
 {
+  GtkGrid         parent_instance;
+
   GSettings      *settings;
   gchar          *language;
 
@@ -36,8 +38,7 @@ struct _GbEditorSettingsWidgetPrivate
   GtkCheckButton *trim_trailing_whitespace;
 };
 
-G_DEFINE_TYPE_WITH_PRIVATE (GbEditorSettingsWidget, gb_editor_settings_widget,
-                            GTK_TYPE_GRID)
+G_DEFINE_TYPE (GbEditorSettingsWidget, gb_editor_settings_widget, GTK_TYPE_GRID)
 
 enum {
   PROP_0,
@@ -52,57 +53,53 @@ gb_editor_settings_widget_get_language (GbEditorSettingsWidget *widget)
 {
   g_return_val_if_fail (GB_IS_EDITOR_SETTINGS_WIDGET (widget), NULL);
 
-  return widget->priv->language;
+  return widget->language;
 }
 
 void
 gb_editor_settings_widget_set_language (GbEditorSettingsWidget *widget,
                                         const gchar            *language)
 {
-  GbEditorSettingsWidgetPrivate *priv;
-
   g_return_if_fail (GB_IS_EDITOR_SETTINGS_WIDGET (widget));
 
-  priv = widget->priv;
-
-  if (language != priv->language)
+  if (language != widget->language)
     {
       gchar *path;
 
-      g_free (priv->language);
-      priv->language = g_strdup (language);
+      g_free (widget->language);
+      widget->language = g_strdup (language);
 
-      g_clear_object (&priv->settings);
+      g_clear_object (&widget->settings);
 
       path = g_strdup_printf ("/org/gnome/builder/editor/language/%s/",
                               language);
-      priv->settings = g_settings_new_with_path (
+      widget->settings = g_settings_new_with_path (
         "org.gnome.builder.editor.language", path);
       g_free (path);
 
-      g_settings_bind (priv->settings, "auto-indent",
-                       priv->auto_indent, "active",
+      g_settings_bind (widget->settings, "auto-indent",
+                       widget->auto_indent, "active",
                        G_SETTINGS_BIND_DEFAULT);
-      g_settings_bind (priv->settings, "insert-matching-brace",
-                       priv->insert_matching_brace, "active",
+      g_settings_bind (widget->settings, "insert-matching-brace",
+                       widget->insert_matching_brace, "active",
                        G_SETTINGS_BIND_DEFAULT);
-      g_settings_bind (priv->settings, "insert-spaces-instead-of-tabs",
-                       priv->insert_spaces_instead_of_tabs, "active",
+      g_settings_bind (widget->settings, "insert-spaces-instead-of-tabs",
+                       widget->insert_spaces_instead_of_tabs, "active",
                        G_SETTINGS_BIND_DEFAULT);
-      g_settings_bind (priv->settings, "overwrite-braces",
-                       priv->overwrite_braces, "active",
+      g_settings_bind (widget->settings, "overwrite-braces",
+                       widget->overwrite_braces, "active",
                        G_SETTINGS_BIND_DEFAULT);
-      g_settings_bind (priv->settings, "show-right-margin",
-                       priv->show_right_margin, "active",
+      g_settings_bind (widget->settings, "show-right-margin",
+                       widget->show_right_margin, "active",
                        G_SETTINGS_BIND_DEFAULT);
-      g_settings_bind (priv->settings, "right-margin-position",
-                       priv->right_margin_position, "value",
+      g_settings_bind (widget->settings, "right-margin-position",
+                       widget->right_margin_position, "value",
                        G_SETTINGS_BIND_DEFAULT);
-      g_settings_bind (priv->settings, "tab-width",
-                       priv->tab_width, "value",
+      g_settings_bind (widget->settings, "tab-width",
+                       widget->tab_width, "value",
                        G_SETTINGS_BIND_DEFAULT);
-      g_settings_bind (priv->settings, "trim-trailing-whitespace",
-                       priv->trim_trailing_whitespace, "active",
+      g_settings_bind (widget->settings, "trim-trailing-whitespace",
+                       widget->trim_trailing_whitespace, "active",
                        G_SETTINGS_BIND_DEFAULT);
 
       g_object_notify_by_pspec (G_OBJECT (widget), gParamSpecs [PROP_LANGUAGE]);
@@ -112,10 +109,10 @@ gb_editor_settings_widget_set_language (GbEditorSettingsWidget *widget,
 static void
 gb_editor_settings_widget_finalize (GObject *object)
 {
-  GbEditorSettingsWidgetPrivate *priv = GB_EDITOR_SETTINGS_WIDGET (object)->priv;
+  GbEditorSettingsWidget *self = GB_EDITOR_SETTINGS_WIDGET (object);
 
-  g_clear_pointer (&priv->language, g_free);
-  g_clear_object (&priv->settings);
+  g_clear_pointer (&self->language, g_free);
+  g_clear_object (&self->settings);
 
   G_OBJECT_CLASS (gb_editor_settings_widget_parent_class)->finalize (object);
 }
@@ -168,14 +165,14 @@ gb_editor_settings_widget_class_init (GbEditorSettingsWidgetClass *klass)
   object_class->set_property = gb_editor_settings_widget_set_property;
 
   GB_WIDGET_CLASS_TEMPLATE (klass, "gb-editor-settings-widget.ui");
-  GB_WIDGET_CLASS_BIND_PRIVATE (klass, GbEditorSettingsWidget, auto_indent);
-  GB_WIDGET_CLASS_BIND_PRIVATE (klass, GbEditorSettingsWidget, insert_matching_brace);
-  GB_WIDGET_CLASS_BIND_PRIVATE (klass, GbEditorSettingsWidget, insert_spaces_instead_of_tabs);
-  GB_WIDGET_CLASS_BIND_PRIVATE (klass, GbEditorSettingsWidget, right_margin_position);
-  GB_WIDGET_CLASS_BIND_PRIVATE (klass, GbEditorSettingsWidget, overwrite_braces);
-  GB_WIDGET_CLASS_BIND_PRIVATE (klass, GbEditorSettingsWidget, show_right_margin);
-  GB_WIDGET_CLASS_BIND_PRIVATE (klass, GbEditorSettingsWidget, tab_width);
-  GB_WIDGET_CLASS_BIND_PRIVATE (klass, GbEditorSettingsWidget, trim_trailing_whitespace);
+  GB_WIDGET_CLASS_BIND (klass, GbEditorSettingsWidget, auto_indent);
+  GB_WIDGET_CLASS_BIND (klass, GbEditorSettingsWidget, insert_matching_brace);
+  GB_WIDGET_CLASS_BIND (klass, GbEditorSettingsWidget, insert_spaces_instead_of_tabs);
+  GB_WIDGET_CLASS_BIND (klass, GbEditorSettingsWidget, right_margin_position);
+  GB_WIDGET_CLASS_BIND (klass, GbEditorSettingsWidget, overwrite_braces);
+  GB_WIDGET_CLASS_BIND (klass, GbEditorSettingsWidget, show_right_margin);
+  GB_WIDGET_CLASS_BIND (klass, GbEditorSettingsWidget, tab_width);
+  GB_WIDGET_CLASS_BIND (klass, GbEditorSettingsWidget, trim_trailing_whitespace);
 
   gParamSpecs [PROP_LANGUAGE] =
     g_param_spec_string ("language",
@@ -190,7 +187,5 @@ gb_editor_settings_widget_class_init (GbEditorSettingsWidgetClass *klass)
 static void
 gb_editor_settings_widget_init (GbEditorSettingsWidget *self)
 {
-  self->priv = gb_editor_settings_widget_get_instance_private (self);
-
   gtk_widget_init_template (GTK_WIDGET (self));
 }
diff --git a/src/editor/gb-editor-settings-widget.h b/src/editor/gb-editor-settings-widget.h
index 6dbbba5..c9a402c 100644
--- a/src/editor/gb-editor-settings-widget.h
+++ b/src/editor/gb-editor-settings-widget.h
@@ -24,31 +24,9 @@
 G_BEGIN_DECLS
 
 #define GB_TYPE_EDITOR_SETTINGS_WIDGET            (gb_editor_settings_widget_get_type())
-#define GB_EDITOR_SETTINGS_WIDGET(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GB_TYPE_EDITOR_SETTINGS_WIDGET, GbEditorSettingsWidget))
-#define GB_EDITOR_SETTINGS_WIDGET_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GB_TYPE_EDITOR_SETTINGS_WIDGET, GbEditorSettingsWidget const))
-#define GB_EDITOR_SETTINGS_WIDGET_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  
GB_TYPE_EDITOR_SETTINGS_WIDGET, GbEditorSettingsWidgetClass))
-#define GB_IS_EDITOR_SETTINGS_WIDGET(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
GB_TYPE_EDITOR_SETTINGS_WIDGET))
-#define GB_IS_EDITOR_SETTINGS_WIDGET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  
GB_TYPE_EDITOR_SETTINGS_WIDGET))
-#define GB_EDITOR_SETTINGS_WIDGET_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  
GB_TYPE_EDITOR_SETTINGS_WIDGET, GbEditorSettingsWidgetClass))
 
-typedef struct _GbEditorSettingsWidget        GbEditorSettingsWidget;
-typedef struct _GbEditorSettingsWidgetClass   GbEditorSettingsWidgetClass;
-typedef struct _GbEditorSettingsWidgetPrivate GbEditorSettingsWidgetPrivate;
-
-struct _GbEditorSettingsWidget
-{
-  GtkGrid parent;
-
-  /*< private >*/
-  GbEditorSettingsWidgetPrivate *priv;
-};
-
-struct _GbEditorSettingsWidgetClass
-{
-  GtkGridClass parent;
-};
-
-GType gb_editor_settings_widget_get_type (void);
+G_DECLARE_FINAL_TYPE (GbEditorSettingsWidget, gb_editor_settings_widget,
+                      GB, EDITOR_SETTINGS_WIDGET, GtkGrid)
 
 G_END_DECLS
 
diff --git a/src/gd/gd-tagged-entry.c b/src/gd/gd-tagged-entry.c
index 0ff2234..4dbf397 100644
--- a/src/gd/gd-tagged-entry.c
+++ b/src/gd/gd-tagged-entry.c
@@ -28,7 +28,9 @@
 
 #define BUTTON_INTERNAL_SPACING 6
 
-struct _GdTaggedEntryTagPrivate {
+struct _GdTaggedEntryTag {
+  GObject parent_instance;
+
   GdTaggedEntry *entry;
   GdkWindow *window;
   PangoLayout *layout;
@@ -41,7 +43,9 @@ struct _GdTaggedEntryTagPrivate {
   GtkStateFlags last_button_state;
 };
 
-struct _GdTaggedEntryPrivate {
+struct _GdTaggedEntry {
+  GtkSearchEntry parent_instance;
+
   GList *tags;
 
   GdTaggedEntryTag *in_child;
@@ -109,12 +113,12 @@ gd_tagged_entry_tag_ensure_close_surface (GdTaggedEntryTag *tag,
   gint icon_size;
   gint scale_factor;
 
-  if (tag->priv->close_surface != NULL)
+  if (tag->close_surface != NULL)
     return;
 
   gtk_icon_size_lookup (GTK_ICON_SIZE_MENU,
                         &icon_size, NULL);
-  scale_factor = gtk_widget_get_scale_factor (GTK_WIDGET (tag->priv->entry));
+  scale_factor = gtk_widget_get_scale_factor (GTK_WIDGET (tag->entry));
 
   info = gtk_icon_theme_lookup_icon_for_scale (gtk_icon_theme_get_default (),
                                                "window-close-symbolic",
@@ -123,7 +127,7 @@ gd_tagged_entry_tag_ensure_close_surface (GdTaggedEntryTag *tag,
 
   /* FIXME: we need a fallback icon in case the icon is not found */
   pixbuf = gtk_icon_info_load_symbolic_for_context (info, context, NULL, NULL);
-  tag->priv->close_surface = gdk_cairo_surface_create_from_pixbuf (pixbuf, scale_factor, tag->priv->window);
+  tag->close_surface = gdk_cairo_surface_create_from_pixbuf (pixbuf, scale_factor, tag->window);
 
   g_object_unref (info);
   g_object_unref (pixbuf);
@@ -182,7 +186,7 @@ gd_tagged_entry_tag_panel_get_width (GdTaggedEntry *self)
 
   width = 0;
 
-  for (l = self->priv->tags; l != NULL; l = l->next)
+  for (l = self->tags; l != NULL; l = l->next)
     {
       tag = l->data;
       width += gd_tagged_entry_tag_get_width (tag, self);
@@ -195,11 +199,11 @@ static void
 gd_tagged_entry_tag_ensure_layout (GdTaggedEntryTag *tag,
                                    GdTaggedEntry *entry)
 {
-  if (tag->priv->layout != NULL)
+  if (tag->layout != NULL)
     return;
 
-  tag->priv->layout = pango_layout_new (gtk_widget_get_pango_context (GTK_WIDGET (entry)));
-  pango_layout_set_text (tag->priv->layout, tag->priv->label, -1);
+  tag->layout = pango_layout_new (gtk_widget_get_pango_context (GTK_WIDGET (entry)));
+  pango_layout_set_text (tag->layout, tag->label, -1);
 }
 
 static GtkStateFlags
@@ -208,10 +212,10 @@ gd_tagged_entry_tag_get_state (GdTaggedEntryTag *tag,
 {
   GtkStateFlags state = GTK_STATE_FLAG_NORMAL;
 
-  if (entry->priv->in_child == tag)
+  if (entry->in_child == tag)
     state |= GTK_STATE_FLAG_PRELIGHT;
 
-  if (entry->priv->in_child_active)
+  if (entry->in_child_active)
     state |= GTK_STATE_FLAG_ACTIVE;
 
   return state;
@@ -223,12 +227,12 @@ gd_tagged_entry_tag_get_button_state (GdTaggedEntryTag *tag,
 {
   GtkStateFlags state = GTK_STATE_FLAG_NORMAL;
 
-  if (entry->priv->in_child == tag)
+  if (entry->in_child == tag)
     {
-      if (entry->priv->in_child_button_active)
+      if (entry->in_child_button_active)
         state |= GTK_STATE_FLAG_ACTIVE;
 
-      else if (entry->priv->in_child_button)
+      else if (entry->in_child_button)
         state |= GTK_STATE_FLAG_PRELIGHT;
     }
 
@@ -248,7 +252,7 @@ gd_tagged_entry_tag_get_context (GdTaggedEntryTag *tag,
   path = gtk_widget_path_copy (gtk_widget_get_path (widget));
 
   pos = gtk_widget_path_append_type (path, GD_TYPE_TAGGED_ENTRY);
-  gtk_widget_path_iter_add_class (path, pos, tag->priv->style);
+  gtk_widget_path_iter_add_class (path, pos, tag->style);
 
   gtk_style_context_set_path (retval, path);
 
@@ -269,7 +273,7 @@ gd_tagged_entry_tag_get_width (GdTaggedEntryTag *tag,
   gint scale_factor;
 
   gd_tagged_entry_tag_ensure_layout (tag, entry);
-  pango_layout_get_pixel_size (tag->priv->layout, &layout_width, NULL);
+  pango_layout_get_pixel_size (tag->layout, &layout_width, NULL);
 
   context = gd_tagged_entry_tag_get_context (tag, entry);
   state = gd_tagged_entry_tag_get_state (tag, entry);
@@ -283,10 +287,10 @@ gd_tagged_entry_tag_get_width (GdTaggedEntryTag *tag,
   g_object_unref (context);
 
   button_width = 0;
-  if (entry->priv->button_visible && tag->priv->has_close_button)
+  if (entry->button_visible && tag->has_close_button)
     {
       scale_factor = gtk_widget_get_scale_factor (GTK_WIDGET (entry));
-      button_width = cairo_image_surface_get_width (tag->priv->close_surface) / scale_factor +
+      button_width = cairo_image_surface_get_width (tag->close_surface) / scale_factor +
         BUTTON_INTERNAL_SPACING;
     }
 
@@ -328,9 +332,9 @@ gd_tagged_entry_tag_get_relative_allocations (GdTaggedEntryTag *tag,
   GtkBorder padding, border;
   GtkStateFlags state;
 
-  width = gdk_window_get_width (tag->priv->window);
-  height = gdk_window_get_height (tag->priv->window);
-  scale_factor = gdk_window_get_scale_factor (tag->priv->window);
+  width = gdk_window_get_width (tag->window);
+  height = gdk_window_get_height (tag->window);
+  scale_factor = gdk_window_get_scale_factor (tag->window);
 
   state = gd_tagged_entry_tag_get_state (tag, entry);
   gtk_style_context_get_margin (context, state, &padding);
@@ -351,15 +355,15 @@ gd_tagged_entry_tag_get_relative_allocations (GdTaggedEntryTag *tag,
   gtk_style_context_get_border (context, state, &border);  
 
   gd_tagged_entry_tag_ensure_layout (tag, entry);
-  pango_layout_get_pixel_size (tag->priv->layout, &layout_width, &layout_height);
+  pango_layout_get_pixel_size (tag->layout, &layout_width, &layout_height);
 
   layout_allocation.x += border.left + padding.left;
   layout_allocation.y += (layout_allocation.height - layout_height) / 2;
 
-  if (entry->priv->button_visible && tag->priv->has_close_button)
+  if (entry->button_visible && tag->has_close_button)
     {
-      pix_width = cairo_image_surface_get_width (tag->priv->close_surface) / scale_factor;
-      pix_height = cairo_image_surface_get_height (tag->priv->close_surface) / scale_factor;
+      pix_width = cairo_image_surface_get_width (tag->close_surface) / scale_factor;
+      pix_height = cairo_image_surface_get_height (tag->close_surface) / scale_factor;
     }
   else
     {
@@ -389,7 +393,7 @@ gd_tagged_entry_tag_event_is_button (GdTaggedEntryTag *tag,
   GtkAllocation button_allocation;
   GtkStyleContext *context;
 
-  if (!entry->priv->button_visible || !tag->priv->has_close_button)
+  if (!entry->button_visible || !tag->has_close_button)
     return FALSE;
 
   context = gd_tagged_entry_tag_get_context (tag, entry);
@@ -419,10 +423,10 @@ gd_tagged_entry_tag_get_area (GdTaggedEntryTag      *tag,
   g_return_val_if_fail (GD_IS_TAGGED_ENTRY_TAG (tag), FALSE);
   g_return_val_if_fail (rect != NULL, FALSE);
 
-  gdk_window_get_position (tag->priv->window, &window_x, &window_y);
-  gtk_widget_get_allocation (GTK_WIDGET (tag->priv->entry), &alloc);
-  context = gd_tagged_entry_tag_get_context (tag, tag->priv->entry);
-  gd_tagged_entry_tag_get_relative_allocations (tag, tag->priv->entry, context,
+  gdk_window_get_position (tag->window, &window_x, &window_y);
+  gtk_widget_get_allocation (GTK_WIDGET (tag->entry), &alloc);
+  context = gd_tagged_entry_tag_get_context (tag, tag->entry);
+  gd_tagged_entry_tag_get_relative_allocations (tag, tag->entry, context,
                                                 &background_allocation,
                                                 NULL, NULL);
 
@@ -450,7 +454,7 @@ gd_tagged_entry_tag_draw (GdTaggedEntryTag *tag,
                                                 &button_allocation);
 
   cairo_save (cr);
-  gtk_cairo_transform_to_window (cr, GTK_WIDGET (entry), tag->priv->window);
+  gtk_cairo_transform_to_window (cr, GTK_WIDGET (entry), tag->window);
 
   gtk_style_context_save (context);
 
@@ -465,11 +469,11 @@ gd_tagged_entry_tag_draw (GdTaggedEntryTag *tag,
 
   gtk_render_layout (context, cr,
                      layout_allocation.x, layout_allocation.y,
-                     tag->priv->layout);
+                     tag->layout);
 
   gtk_style_context_restore (context);
 
-  if (!entry->priv->button_visible || !tag->priv->has_close_button)
+  if (!entry->button_visible || !tag->has_close_button)
     goto done;
 
   gtk_style_context_add_class (context, GTK_STYLE_CLASS_BUTTON);
@@ -479,12 +483,12 @@ gd_tagged_entry_tag_draw (GdTaggedEntryTag *tag,
   /* if the state changed since last time we draw the pixbuf,
    * clear and redraw it.
    */
-  if (state != tag->priv->last_button_state)
+  if (state != tag->last_button_state)
     {
-      g_clear_pointer (&tag->priv->close_surface, cairo_surface_destroy);
+      g_clear_pointer (&tag->close_surface, cairo_surface_destroy);
       gd_tagged_entry_tag_ensure_close_surface (tag, context);
 
-      tag->priv->last_button_state = state;
+      tag->last_button_state = state;
     }
 
   gtk_render_background (context, cr,
@@ -495,7 +499,7 @@ gd_tagged_entry_tag_draw (GdTaggedEntryTag *tag,
                          button_allocation.width, button_allocation.height);
 
   gtk_render_icon_surface (context, cr,
-                           tag->priv->close_surface,
+                           tag->close_surface,
                            button_allocation.x, button_allocation.y);
 
 done:
@@ -507,12 +511,12 @@ done:
 static void
 gd_tagged_entry_tag_unrealize (GdTaggedEntryTag *tag)
 {
-  if (tag->priv->window == NULL)
+  if (tag->window == NULL)
     return;
 
-  gdk_window_set_user_data (tag->priv->window, NULL);
-  gdk_window_destroy (tag->priv->window);
-  tag->priv->window = NULL;
+  gdk_window_set_user_data (tag->window, NULL);
+  gdk_window_destroy (tag->window);
+  tag->window = NULL;
 }
 
 static void
@@ -524,7 +528,7 @@ gd_tagged_entry_tag_realize (GdTaggedEntryTag *tag,
   gint attributes_mask;
   gint tag_width, tag_height;
 
-  if (tag->priv->window != NULL)
+  if (tag->window != NULL)
     return;
 
   attributes.window_type = GDK_WINDOW_CHILD;
@@ -542,9 +546,9 @@ gd_tagged_entry_tag_realize (GdTaggedEntryTag *tag,
 
   attributes_mask = GDK_WA_X | GDK_WA_Y;
 
-  tag->priv->window = gdk_window_new (gtk_widget_get_window (widget),
+  tag->window = gdk_window_new (gtk_widget_get_window (widget),
                                 &attributes, attributes_mask);
-  gdk_window_set_user_data (tag->priv->window, widget);
+  gdk_window_set_user_data (tag->window, widget);
 }
 
 static gboolean
@@ -557,7 +561,7 @@ gd_tagged_entry_draw (GtkWidget *widget,
 
   GTK_WIDGET_CLASS (gd_tagged_entry_parent_class)->draw (widget, cr);
 
-  for (l = self->priv->tags; l != NULL; l = l->next)
+  for (l = self->tags; l != NULL; l = l->next)
     {
       tag = l->data;
       gd_tagged_entry_tag_draw (tag, cr, self);
@@ -577,10 +581,10 @@ gd_tagged_entry_map (GtkWidget *widget)
     {
       GTK_WIDGET_CLASS (gd_tagged_entry_parent_class)->map (widget);
 
-      for (l = self->priv->tags; l != NULL; l = l->next)
+      for (l = self->tags; l != NULL; l = l->next)
         {
           tag = l->data;
-          gdk_window_show (tag->priv->window);
+          gdk_window_show (tag->window);
         }
     }
 }
@@ -594,10 +598,10 @@ gd_tagged_entry_unmap (GtkWidget *widget)
 
   if (gtk_widget_get_mapped (widget))
     {
-      for (l = self->priv->tags; l != NULL; l = l->next)
+      for (l = self->tags; l != NULL; l = l->next)
         {
           tag = l->data;
-          gdk_window_hide (tag->priv->window);
+          gdk_window_hide (tag->window);
         }
 
       GTK_WIDGET_CLASS (gd_tagged_entry_parent_class)->unmap (widget);
@@ -613,7 +617,7 @@ gd_tagged_entry_realize (GtkWidget *widget)
 
   GTK_WIDGET_CLASS (gd_tagged_entry_parent_class)->realize (widget);
 
-  for (l = self->priv->tags; l != NULL; l = l->next)
+  for (l = self->tags; l != NULL; l = l->next)
     {
       tag = l->data;
       gd_tagged_entry_tag_realize (tag, self);
@@ -629,7 +633,7 @@ gd_tagged_entry_unrealize (GtkWidget *widget)
 
   GTK_WIDGET_CLASS (gd_tagged_entry_parent_class)->unrealize (widget);
 
-  for (l = self->priv->tags; l != NULL; l = l->next)
+  for (l = self->tags; l != NULL; l = l->next)
     {
       tag = l->data;
       gd_tagged_entry_tag_unrealize (tag);
@@ -670,14 +674,14 @@ gd_tagged_entry_size_allocate (GtkWidget *widget,
     {
       gd_tagged_entry_tag_panel_get_position (self, &x, &y);
 
-      for (l = self->priv->tags; l != NULL; l = l->next)
+      for (l = self->tags; l != NULL; l = l->next)
         {
           GtkBorder margin;
 
           tag = l->data;
           gd_tagged_entry_tag_get_size (tag, self, &width, &height);
           gd_tagged_entry_tag_get_margin (tag, self, &margin);
-          gdk_window_move_resize (tag->priv->window, x, y + margin.top, width, height);
+          gdk_window_move_resize (tag->window, x, y + margin.top, width, height);
 
           x += width;
         }
@@ -709,10 +713,10 @@ gd_tagged_entry_finalize (GObject *obj)
 {
   GdTaggedEntry *self = GD_TAGGED_ENTRY (obj);
 
-  if (self->priv->tags != NULL)
+  if (self->tags != NULL)
     {
-      g_list_free_full (self->priv->tags, g_object_unref);
-      self->priv->tags = NULL;
+      g_list_free_full (self->tags, g_object_unref);
+      self->tags = NULL;
     }
 
   G_OBJECT_CLASS (gd_tagged_entry_parent_class)->finalize (obj);
@@ -725,10 +729,10 @@ gd_tagged_entry_find_tag_by_window (GdTaggedEntry *self,
   GdTaggedEntryTag *tag = NULL, *elem;
   GList *l;
 
-  for (l = self->priv->tags; l != NULL; l = l->next)
+  for (l = self->tags; l != NULL; l = l->next)
     {
       elem = l->data;
-      if (elem->priv->window == window)
+      if (elem->window == window)
         {
           tag = elem;
           break;
@@ -749,7 +753,7 @@ gd_tagged_entry_enter_notify (GtkWidget        *widget,
 
   if (tag != NULL)
     {
-      self->priv->in_child = tag;
+      self->in_child = tag;
       gtk_widget_queue_draw (widget);
     }
 
@@ -762,9 +766,9 @@ gd_tagged_entry_leave_notify (GtkWidget        *widget,
 {
   GdTaggedEntry *self = GD_TAGGED_ENTRY (widget);
 
-  if (self->priv->in_child != NULL)
+  if (self->in_child != NULL)
     {
-      self->priv->in_child = NULL;
+      self->in_child = NULL;
       gtk_widget_queue_draw (widget);
     }
 
@@ -784,8 +788,8 @@ gd_tagged_entry_motion_notify (GtkWidget      *widget,
     {
       gdk_event_request_motions (event);
 
-      self->priv->in_child = tag;
-      self->priv->in_child_button = gd_tagged_entry_tag_event_is_button (tag, self, event->x, event->y);
+      self->in_child = tag;
+      self->in_child_button = gd_tagged_entry_tag_event_is_button (tag, self, event->x, event->y);
       gtk_widget_queue_draw (widget);
 
       return FALSE;
@@ -805,11 +809,11 @@ gd_tagged_entry_button_release_event (GtkWidget *widget,
 
   if (tag != NULL)
     {
-      self->priv->in_child_active = FALSE;
+      self->in_child_active = FALSE;
 
       if (gd_tagged_entry_tag_event_is_button (tag, self, event->x, event->y))
         {
-          self->priv->in_child_button_active = FALSE;
+          self->in_child_button_active = FALSE;
           g_signal_emit (self, signals[SIGNAL_TAG_BUTTON_CLICKED], 0, tag);
         }
       else
@@ -837,9 +841,9 @@ gd_tagged_entry_button_press_event (GtkWidget *widget,
   if (tag != NULL)
     {
       if (gd_tagged_entry_tag_event_is_button (tag, self, event->x, event->y))
-        self->priv->in_child_button_active = TRUE;
+        self->in_child_button_active = TRUE;
       else
-        self->priv->in_child_active = TRUE;
+        self->in_child_active = TRUE;
 
       gtk_widget_queue_draw (widget);
 
@@ -852,8 +856,7 @@ gd_tagged_entry_button_press_event (GtkWidget *widget,
 static void
 gd_tagged_entry_init (GdTaggedEntry *self)
 {
-  self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GD_TYPE_TAGGED_ENTRY, GdTaggedEntryPrivate);
-  self->priv->button_visible = TRUE;
+  self->button_visible = TRUE;
 }
 
 static void
@@ -938,34 +941,27 @@ gd_tagged_entry_class_init (GdTaggedEntryClass *klass)
                           _("Whether the close button should be shown in tags."), TRUE,
                           G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS);
 
-  g_type_class_add_private (klass, sizeof (GdTaggedEntryPrivate));
   g_object_class_install_properties (oclass, NUM_PROPERTIES, properties);
 }
 
 static void
 gd_tagged_entry_tag_init (GdTaggedEntryTag *self)
 {
-  GdTaggedEntryTagPrivate *priv;
-
-  self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GD_TYPE_TAGGED_ENTRY_TAG, GdTaggedEntryTagPrivate);
-  priv = self->priv;
-
-  priv->last_button_state = GTK_STATE_FLAG_NORMAL;
+  self->last_button_state = GTK_STATE_FLAG_NORMAL;
 }
 
 static void
 gd_tagged_entry_tag_finalize (GObject *obj)
 {
   GdTaggedEntryTag *tag = GD_TAGGED_ENTRY_TAG (obj);
-  GdTaggedEntryTagPrivate *priv = tag->priv;
 
-  if (priv->window != NULL)
+  if (tag->window != NULL)
     gd_tagged_entry_tag_unrealize (tag);
 
-  g_clear_object (&priv->layout);
-  g_clear_pointer (&priv->close_surface, cairo_surface_destroy);
-  g_free (priv->label);
-  g_free (priv->style);
+  g_clear_object (&tag->layout);
+  g_clear_pointer (&tag->close_surface, cairo_surface_destroy);
+  g_free (tag->label);
+  g_free (tag->style);
 
   G_OBJECT_CLASS (gd_tagged_entry_tag_parent_class)->finalize (obj);
 }
@@ -1040,7 +1036,6 @@ gd_tagged_entry_tag_class_init (GdTaggedEntryTagClass *klass)
                          _("Style of the tag."), "documents-entry-tag",
                          G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
 
-  g_type_class_add_private (klass, sizeof (GdTaggedEntryTagPrivate));
   g_object_class_install_properties (oclass, NUM_TAG_PROPERTIES, tag_properties);
 }
 
@@ -1055,18 +1050,18 @@ gd_tagged_entry_insert_tag (GdTaggedEntry    *self,
                             GdTaggedEntryTag *tag,
                             gint              position)
 {
-  if (g_list_find (self->priv->tags, tag) != NULL)
+  if (g_list_find (self->tags, tag) != NULL)
     return FALSE;
 
-  tag->priv->entry = self;
+  tag->entry = self;
 
-  self->priv->tags = g_list_insert (self->priv->tags, g_object_ref (tag), position);
+  self->tags = g_list_insert (self->tags, g_object_ref (tag), position);
 
   if (gtk_widget_get_realized (GTK_WIDGET (self)))
     gd_tagged_entry_tag_realize (tag, self);
 
   if (gtk_widget_get_mapped (GTK_WIDGET (self)))
-    gdk_window_show_unraised (tag->priv->window);
+    gdk_window_show_unraised (tag->window);
 
   gtk_widget_queue_resize (GTK_WIDGET (self));
 
@@ -1084,12 +1079,12 @@ gboolean
 gd_tagged_entry_remove_tag (GdTaggedEntry    *self,
                             GdTaggedEntryTag *tag)
 {
-  if (!g_list_find (self->priv->tags, tag))
+  if (!g_list_find (self->tags, tag))
     return FALSE;
 
   gd_tagged_entry_tag_unrealize (tag);
 
-  self->priv->tags = g_list_remove (self->priv->tags, tag);
+  self->tags = g_list_remove (self->tags, tag);
   g_object_unref (tag);
 
   gtk_widget_queue_resize (GTK_WIDGET (self));
@@ -1107,21 +1102,17 @@ void
 gd_tagged_entry_tag_set_label (GdTaggedEntryTag *tag,
                                const gchar *label)
 {
-  GdTaggedEntryTagPrivate *priv;
-
   g_return_if_fail (GD_IS_TAGGED_ENTRY_TAG (tag));
 
-  priv = tag->priv;
-
-  if (g_strcmp0 (priv->label, label) != 0)
+  if (g_strcmp0 (tag->label, label) != 0)
     {
       GtkWidget *entry;
 
-      g_free (priv->label);
-      priv->label = g_strdup (label);
-      g_clear_object (&priv->layout);
+      g_free (tag->label);
+      tag->label = g_strdup (label);
+      g_clear_object (&tag->layout);
 
-      entry = GTK_WIDGET (tag->priv->entry);
+      entry = GTK_WIDGET (tag->entry);
       if (entry)
         gtk_widget_queue_resize (entry);
     }
@@ -1132,28 +1123,24 @@ gd_tagged_entry_tag_get_label (GdTaggedEntryTag *tag)
 {
   g_return_val_if_fail (GD_IS_TAGGED_ENTRY_TAG (tag), NULL);
 
-  return tag->priv->label;
+  return tag->label;
 }
 
 void
 gd_tagged_entry_tag_set_has_close_button (GdTaggedEntryTag *tag,
                                           gboolean has_close_button)
 {
-  GdTaggedEntryTagPrivate *priv;
-
   g_return_if_fail (GD_IS_TAGGED_ENTRY_TAG (tag));
 
-  priv = tag->priv;
-
   has_close_button = has_close_button != FALSE;
-  if (priv->has_close_button != has_close_button)
+  if (tag->has_close_button != has_close_button)
     {
       GtkWidget *entry;
 
-      priv->has_close_button = has_close_button;
-      g_clear_object (&priv->layout);
+      tag->has_close_button = has_close_button;
+      g_clear_object (&tag->layout);
 
-      entry = GTK_WIDGET (priv->entry);
+      entry = GTK_WIDGET (tag->entry);
       if (entry)
         gtk_widget_queue_resize (entry);
     }
@@ -1164,28 +1151,24 @@ gd_tagged_entry_tag_get_has_close_button (GdTaggedEntryTag *tag)
 {
   g_return_val_if_fail (GD_IS_TAGGED_ENTRY_TAG (tag), FALSE);
 
-  return tag->priv->has_close_button;
+  return tag->has_close_button;
 }
 
 void
 gd_tagged_entry_tag_set_style (GdTaggedEntryTag *tag,
                                const gchar *style)
 {
-  GdTaggedEntryTagPrivate *priv;
-
   g_return_if_fail (GD_IS_TAGGED_ENTRY_TAG (tag));
 
-  priv = tag->priv;
-
-  if (g_strcmp0 (priv->style, style) != 0)
+  if (g_strcmp0 (tag->style, style) != 0)
     {
       GtkWidget *entry;
 
-      g_free (priv->style);
-      priv->style = g_strdup (style);
-      g_clear_object (&priv->layout);
+      g_free (tag->style);
+      tag->style = g_strdup (style);
+      g_clear_object (&tag->layout);
 
-      entry = GTK_WIDGET (tag->priv->entry);
+      entry = GTK_WIDGET (tag->entry);
       if (entry)
         gtk_widget_queue_resize (entry);
     }
@@ -1196,7 +1179,7 @@ gd_tagged_entry_tag_get_style (GdTaggedEntryTag *tag)
 {
   g_return_val_if_fail (GD_IS_TAGGED_ENTRY_TAG (tag), NULL);
 
-  return tag->priv->style;
+  return tag->style;
 }
 
 void
@@ -1205,10 +1188,10 @@ gd_tagged_entry_set_tag_button_visible (GdTaggedEntry *self,
 {
   g_return_if_fail (GD_IS_TAGGED_ENTRY (self));
 
-  if (self->priv->button_visible == visible)
+  if (self->button_visible == visible)
     return;
 
-  self->priv->button_visible = visible;
+  self->button_visible = visible;
   gtk_widget_queue_resize (GTK_WIDGET (self));
 
   g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_TAG_BUTTON_VISIBLE]);
@@ -1219,5 +1202,5 @@ gd_tagged_entry_get_tag_button_visible (GdTaggedEntry *self)
 {
   g_return_val_if_fail (GD_IS_TAGGED_ENTRY (self), FALSE);
 
-  return self->priv->button_visible;
+  return self->button_visible;
 }
diff --git a/src/gd/gd-tagged-entry.h b/src/gd/gd-tagged-entry.h
index 87d9da4..f755bc2 100644
--- a/src/gd/gd-tagged-entry.h
+++ b/src/gd/gd-tagged-entry.h
@@ -30,52 +30,15 @@
 G_BEGIN_DECLS
 
 #define GD_TYPE_TAGGED_ENTRY gd_tagged_entry_get_type()
-#define GD_TAGGED_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GD_TYPE_TAGGED_ENTRY, GdTaggedEntry))
-#define GD_TAGGED_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GD_TYPE_TAGGED_ENTRY, 
GdTaggedEntryClass))
-#define GD_IS_TAGGED_ENTRY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GD_TYPE_TAGGED_ENTRY))
-#define GD_IS_TAGGED_ENTRY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GD_TYPE_TAGGED_ENTRY))
-#define GD_TAGGED_ENTRY_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GD_TYPE_TAGGED_ENTRY, 
GdTaggedEntryClass))
 
-typedef struct _GdTaggedEntry GdTaggedEntry;
-typedef struct _GdTaggedEntryClass GdTaggedEntryClass;
-typedef struct _GdTaggedEntryPrivate GdTaggedEntryPrivate;
-
-typedef struct _GdTaggedEntryTag GdTaggedEntryTag;
-typedef struct _GdTaggedEntryTagClass GdTaggedEntryTagClass;
-typedef struct _GdTaggedEntryTagPrivate GdTaggedEntryTagPrivate;
-
-struct _GdTaggedEntry
-{
-  GtkSearchEntry parent;
-
-  GdTaggedEntryPrivate *priv;
-};
-
-struct _GdTaggedEntryClass
-{
-  GtkSearchEntryClass parent_class;
-};
+G_DECLARE_FINAL_TYPE (GdTaggedEntry, gd_tagged_entry,
+                      GD, TAGGED_ENTRY, GtkSearchEntry)
 
 #define GD_TYPE_TAGGED_ENTRY_TAG gd_tagged_entry_tag_get_type()
-#define GD_TAGGED_ENTRY_TAG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GD_TYPE_TAGGED_ENTRY_TAG, 
GdTaggedEntryTag))
-#define GD_TAGGED_ENTRY_TAG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GD_TYPE_TAGGED_ENTRY_TAG, 
GdTaggedEntryTagClass))
-#define GD_IS_TAGGED_ENTRY_TAG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GD_TYPE_TAGGED_ENTRY_TAG))
-#define GD_IS_TAGGED_ENTRY_TAG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GD_TYPE_TAGGED_ENTRY_TAG))
-#define GD_TAGGED_ENTRY_TAG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GD_TYPE_TAGGED_ENTRY_TAG, 
GdTaggedEntryTagClass))
-
-struct _GdTaggedEntryTag
-{
-  GObject parent;
-
-  GdTaggedEntryTagPrivate *priv;
-};
 
-struct _GdTaggedEntryTagClass
-{
-  GObjectClass parent_class;
-};
+G_DECLARE_FINAL_TYPE (GdTaggedEntryTag, gd_tagged_entry_tag,
+                      GD, TAGGED_ENTRY_TAG, GObject)
 
-GType gd_tagged_entry_get_type (void);
 
 GdTaggedEntry *gd_tagged_entry_new (void);
 
@@ -93,7 +56,6 @@ gboolean gd_tagged_entry_add_tag (GdTaggedEntry    *self,
 gboolean gd_tagged_entry_remove_tag (GdTaggedEntry *self,
                                      GdTaggedEntryTag *tag);
 
-GType gd_tagged_entry_tag_get_type (void);
 
 GdTaggedEntryTag *gd_tagged_entry_tag_new (const gchar *label);
 
diff --git a/src/gedit/gedit-menu-stack-switcher.c b/src/gedit/gedit-menu-stack-switcher.c
index 15fc289..d66b409 100644
--- a/src/gedit/gedit-menu-stack-switcher.c
+++ b/src/gedit/gedit-menu-stack-switcher.c
@@ -27,14 +27,16 @@
 #include <gtk/gtk.h>
 #include "gedit-menu-stack-switcher.h"
 
-struct _GeditMenuStackSwitcherPrivate
+struct _GeditMenuStackSwitcher
 {
-  GtkStack *stack;
-  GtkWidget *label;
-  GtkWidget *button_box;
-  GtkWidget *popover;
-  GHashTable *buttons;
-  gboolean in_child_changed;
+  GtkMenuButton  parent_instance;
+
+  GtkStack      *stack;
+  GtkWidget     *label;
+  GtkWidget     *button_box;
+  GtkWidget     *popover;
+  GHashTable    *buttons;
+  gboolean       in_child_changed;
 };
 
 enum {
@@ -42,74 +44,67 @@ enum {
   PROP_STACK
 };
 
-G_DEFINE_TYPE_WITH_PRIVATE (GeditMenuStackSwitcher, gedit_menu_stack_switcher, GTK_TYPE_MENU_BUTTON)
+G_DEFINE_TYPE (GeditMenuStackSwitcher, gedit_menu_stack_switcher, GTK_TYPE_MENU_BUTTON)
 
 static void
 gedit_menu_stack_switcher_init (GeditMenuStackSwitcher *switcher)
 {
-  GeditMenuStackSwitcherPrivate *priv;
   GtkWidget *box;
   GtkWidget *arrow;
   GtkStyleContext *context;
 
-  priv = gedit_menu_stack_switcher_get_instance_private (switcher);
-  switcher->priv = priv;
-
   box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
 
   arrow = gtk_image_new_from_icon_name ("pan-down-symbolic", GTK_ICON_SIZE_BUTTON);
   gtk_box_pack_end (GTK_BOX (box), arrow, FALSE, TRUE, 6);
   gtk_widget_set_valign (arrow, GTK_ALIGN_BASELINE);
 
-  priv->label = gtk_label_new (NULL);
-  gtk_widget_set_valign (priv->label, GTK_ALIGN_BASELINE);
-  gtk_box_pack_start (GTK_BOX (box), priv->label, TRUE, TRUE, 6);
+  switcher->label = gtk_label_new (NULL);
+  gtk_widget_set_valign (switcher->label, GTK_ALIGN_BASELINE);
+  gtk_box_pack_start (GTK_BOX (box), switcher->label, TRUE, TRUE, 6);
 
   // FIXME: this is not correct if this widget becomes more generic
   // and used also outside the header bar, but for now we just want
   // the same style as title labels
-  context = gtk_widget_get_style_context (priv->label);
+  context = gtk_widget_get_style_context (switcher->label);
   gtk_style_context_add_class (context, "title");
 
   gtk_widget_show_all (box);
   gtk_container_add (GTK_CONTAINER (switcher), box);
 
-  priv->popover = gtk_popover_new (GTK_WIDGET (switcher));
-  gtk_popover_set_position (GTK_POPOVER (priv->popover), GTK_POS_BOTTOM);
-  context = gtk_widget_get_style_context (priv->popover);
+  switcher->popover = gtk_popover_new (GTK_WIDGET (switcher));
+  gtk_popover_set_position (GTK_POPOVER (switcher->popover), GTK_POS_BOTTOM);
+  context = gtk_widget_get_style_context (switcher->popover);
   gtk_style_context_add_class (context, "gedit-menu-stack-switcher");
 
-  priv->button_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+  switcher->button_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
 
-  gtk_widget_show (priv->button_box);
+  gtk_widget_show (switcher->button_box);
 
-  gtk_container_add (GTK_CONTAINER (priv->popover), priv->button_box);
+  gtk_container_add (GTK_CONTAINER (switcher->popover), switcher->button_box);
 
-  gtk_menu_button_set_popover (GTK_MENU_BUTTON (switcher), priv->popover);
+  gtk_menu_button_set_popover (GTK_MENU_BUTTON (switcher), switcher->popover);
 
-  priv->buttons = g_hash_table_new (g_direct_hash, g_direct_equal);
+  switcher->buttons = g_hash_table_new (g_direct_hash, g_direct_equal);
 }
 
 static void
 clear_popover (GeditMenuStackSwitcher *switcher)
 {
-  GeditMenuStackSwitcherPrivate *priv = switcher->priv;
-
-  gtk_container_foreach (GTK_CONTAINER (priv->button_box), (GtkCallback) gtk_widget_destroy, switcher);
+  gtk_container_foreach (GTK_CONTAINER (switcher->button_box), (GtkCallback) gtk_widget_destroy, switcher);
 }
 
 static void
 on_button_clicked (GtkWidget              *widget,
                    GeditMenuStackSwitcher *switcher)
 {
-  GeditMenuStackSwitcherPrivate *priv = switcher->priv;
   GtkWidget *child;
 
-  if (!priv->in_child_changed)
+  if (!switcher->in_child_changed)
     {
       child = g_object_get_data (G_OBJECT (widget), "stack-child");
-      gtk_stack_set_visible_child (priv->stack, child);
-      gtk_widget_hide (priv->popover);
+      gtk_stack_set_visible_child (switcher->stack, child);
+      gtk_widget_hide (switcher->popover);
     }
 }
 
@@ -118,18 +113,17 @@ update_button (GeditMenuStackSwitcher *switcher,
                GtkWidget              *widget,
                GtkWidget              *button)
 {
-  GeditMenuStackSwitcherPrivate *priv = switcher->priv;
   GList *children;
 
   /* We get spurious notifications while the stack is being
    * destroyed, so for now check the child actually exists
    */
-  children = gtk_container_get_children (GTK_CONTAINER (priv->stack));
+  children = gtk_container_get_children (GTK_CONTAINER (switcher->stack));
   if (g_list_index (children, widget) >= 0)
     {
       gchar *title;
 
-      gtk_container_child_get (GTK_CONTAINER (priv->stack), widget,
+      gtk_container_child_get (GTK_CONTAINER (switcher->stack), widget,
                                "title", &title,
                                NULL);
 
@@ -137,9 +131,9 @@ update_button (GeditMenuStackSwitcher *switcher,
       gtk_widget_set_visible (button, gtk_widget_get_visible (widget) && (title != NULL));
       gtk_widget_set_size_request (button, 100, -1);
 
-      if (widget == gtk_stack_get_visible_child (priv->stack))
+      if (widget == gtk_stack_get_visible_child (switcher->stack))
         {
-          gtk_label_set_label (GTK_LABEL (priv->label), title);
+          gtk_label_set_label (GTK_LABEL (switcher->label), title);
         }
 
       g_free (title);
@@ -153,10 +147,9 @@ on_title_icon_visible_updated (GtkWidget              *widget,
                                GParamSpec             *pspec,
                                GeditMenuStackSwitcher *switcher)
 {
-  GeditMenuStackSwitcherPrivate *priv = switcher->priv;
   GtkWidget *button;
 
-  button = g_hash_table_lookup (priv->buttons, widget);
+  button = g_hash_table_lookup (switcher->buttons, widget);
   update_button (switcher, widget, button);
 }
 
@@ -165,24 +158,23 @@ on_position_updated (GtkWidget        *widget,
                      GParamSpec       *pspec,
                      GeditMenuStackSwitcher *switcher)
 {
-  GeditMenuStackSwitcherPrivate *priv = switcher->priv;
   GtkWidget *button;
   gint position;
 
-  button = g_hash_table_lookup (priv->buttons, widget);
+  button = g_hash_table_lookup (switcher->buttons, widget);
 
-  gtk_container_child_get (GTK_CONTAINER (priv->stack), widget,
+  gtk_container_child_get (GTK_CONTAINER (switcher->stack), widget,
                            "position", &position,
                            NULL);
 
-  gtk_box_reorder_child (GTK_BOX (priv->button_box), button, position);
+  gtk_box_reorder_child (GTK_BOX (switcher->button_box), button, position);
 }
 
 static void
 add_child (GeditMenuStackSwitcher *switcher,
            GtkWidget              *widget)
 {
-  GeditMenuStackSwitcherPrivate *priv = switcher->priv;
+
   GtkWidget *button;
   GList *group;
 
@@ -192,14 +184,14 @@ add_child (GeditMenuStackSwitcher *switcher,
 
   update_button (switcher, widget, button);
 
-  group = gtk_container_get_children (GTK_CONTAINER (priv->button_box));
+  group = gtk_container_get_children (GTK_CONTAINER (switcher->button_box));
   if (group != NULL)
     {
       gtk_radio_button_join_group (GTK_RADIO_BUTTON (button), GTK_RADIO_BUTTON (group->data));
       g_list_free (group);
     }
 
-  gtk_container_add (GTK_CONTAINER (priv->button_box), button);
+  gtk_container_add (GTK_CONTAINER (switcher->button_box), button);
 
   g_object_set_data (G_OBJECT (button), "stack-child", widget);
   g_signal_connect (button, "clicked", G_CALLBACK (on_button_clicked), switcher);
@@ -208,7 +200,7 @@ add_child (GeditMenuStackSwitcher *switcher,
   g_signal_connect (widget, "child-notify::icon-name", G_CALLBACK (on_title_icon_visible_updated), switcher);
   g_signal_connect (widget, "child-notify::position", G_CALLBACK (on_position_updated), switcher);
 
-  g_hash_table_insert (priv->buttons, widget, button);
+  g_hash_table_insert (switcher->buttons, widget, button);
 }
 
 static void
@@ -221,9 +213,7 @@ foreach_stack (GtkWidget              *widget,
 static void
 populate_popover (GeditMenuStackSwitcher *switcher)
 {
-  GeditMenuStackSwitcherPrivate *priv = switcher->priv;
-
-  gtk_container_foreach (GTK_CONTAINER (priv->stack), (GtkCallback)foreach_stack, switcher);
+  gtk_container_foreach (GTK_CONTAINER (switcher->stack), (GtkCallback)foreach_stack, switcher);
 }
 
 static void
@@ -231,7 +221,6 @@ on_child_changed (GtkWidget              *widget,
                   GParamSpec             *pspec,
                   GeditMenuStackSwitcher *switcher)
 {
-  GeditMenuStackSwitcherPrivate *priv = switcher->priv;
   GtkWidget *child;
   GtkWidget *button;
 
@@ -240,20 +229,20 @@ on_child_changed (GtkWidget              *widget,
     {
       gchar *title;
 
-      gtk_container_child_get (GTK_CONTAINER (priv->stack), child,
+      gtk_container_child_get (GTK_CONTAINER (switcher->stack), child,
                                "title", &title,
                                NULL);
 
-      gtk_label_set_label (GTK_LABEL (priv->label), title);
+      gtk_label_set_label (GTK_LABEL (switcher->label), title);
       g_free (title);
     }
 
-  button = g_hash_table_lookup (priv->buttons, child);
+  button = g_hash_table_lookup (switcher->buttons, child);
   if (button != NULL)
     {
-      priv->in_child_changed = TRUE;
+      switcher->in_child_changed = TRUE;
       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
-      priv->in_child_changed = FALSE;
+      switcher->in_child_changed = FALSE;
     }
 }
 
@@ -270,37 +259,32 @@ on_stack_child_removed (GtkStack               *stack,
                         GtkWidget              *widget,
                         GeditMenuStackSwitcher *switcher)
 {
-  GeditMenuStackSwitcherPrivate *priv = switcher->priv;
   GtkWidget *button;
 
-  button = g_hash_table_lookup (priv->buttons, widget);
-  gtk_container_remove (GTK_CONTAINER (priv->button_box), button);
-  g_hash_table_remove (priv->buttons, widget);
+  button = g_hash_table_lookup (switcher->buttons, widget);
+  gtk_container_remove (GTK_CONTAINER (switcher->button_box), button);
+  g_hash_table_remove (switcher->buttons, widget);
 }
 
 static void
 disconnect_stack_signals (GeditMenuStackSwitcher *switcher)
 {
-  GeditMenuStackSwitcherPrivate *priv = switcher->priv;
-
-  g_signal_handlers_disconnect_by_func (priv->stack, on_stack_child_added, switcher);
-  g_signal_handlers_disconnect_by_func (priv->stack, on_stack_child_removed, switcher);
-  g_signal_handlers_disconnect_by_func (priv->stack, on_child_changed, switcher);
-  g_signal_handlers_disconnect_by_func (priv->stack, disconnect_stack_signals, switcher);
+  g_signal_handlers_disconnect_by_func (switcher->stack, on_stack_child_added, switcher);
+  g_signal_handlers_disconnect_by_func (switcher->stack, on_stack_child_removed, switcher);
+  g_signal_handlers_disconnect_by_func (switcher->stack, on_child_changed, switcher);
+  g_signal_handlers_disconnect_by_func (switcher->stack, disconnect_stack_signals, switcher);
 }
 
 static void
 connect_stack_signals (GeditMenuStackSwitcher *switcher)
 {
-  GeditMenuStackSwitcherPrivate *priv = switcher->priv;
-
-  g_signal_connect (priv->stack, "add",
+  g_signal_connect (switcher->stack, "add",
                     G_CALLBACK (on_stack_child_added), switcher);
-  g_signal_connect (priv->stack, "remove",
+  g_signal_connect (switcher->stack, "remove",
                     G_CALLBACK (on_stack_child_removed), switcher);
-  g_signal_connect (priv->stack, "notify::visible-child",
+  g_signal_connect (switcher->stack, "notify::visible-child",
                     G_CALLBACK (on_child_changed), switcher);
-  g_signal_connect_swapped (priv->stack, "destroy",
+  g_signal_connect_swapped (switcher->stack, "destroy",
                             G_CALLBACK (disconnect_stack_signals), switcher);
 }
 
@@ -308,26 +292,22 @@ void
 gedit_menu_stack_switcher_set_stack (GeditMenuStackSwitcher *switcher,
                                      GtkStack               *stack)
 {
-  GeditMenuStackSwitcherPrivate *priv;
-
   g_return_if_fail (GEDIT_IS_MENU_STACK_SWITCHER (switcher));
   g_return_if_fail (stack == NULL || GTK_IS_STACK (stack));
 
-  priv = switcher->priv;
-
-  if (priv->stack == stack)
+  if (switcher->stack == stack)
     return;
 
-  if (priv->stack)
+  if (switcher->stack)
     {
       disconnect_stack_signals (switcher);
       clear_popover (switcher);
-      g_clear_object (&priv->stack);
+      g_clear_object (&switcher->stack);
     }
 
   if (stack)
     {
-      priv->stack = g_object_ref (stack);
+      switcher->stack = g_object_ref (stack);
       populate_popover (switcher);
       connect_stack_signals (switcher);
     }
@@ -342,7 +322,7 @@ gedit_menu_stack_switcher_get_stack (GeditMenuStackSwitcher *switcher)
 {
   g_return_val_if_fail (GEDIT_IS_MENU_STACK_SWITCHER (switcher), NULL);
 
-  return switcher->priv->stack;
+  return switcher->stack;
 }
 
 static void
@@ -352,12 +332,11 @@ gedit_menu_stack_switcher_get_property (GObject    *object,
                                         GParamSpec *pspec)
 {
   GeditMenuStackSwitcher *switcher = GEDIT_MENU_STACK_SWITCHER (object);
-  GeditMenuStackSwitcherPrivate *priv = switcher->priv;
 
   switch (prop_id)
     {
     case PROP_STACK:
-      g_value_set_object (value, priv->stack);
+      g_value_set_object (value, switcher->stack);
       break;
 
     default:
@@ -400,9 +379,8 @@ static void
 gedit_menu_stack_switcher_finalize (GObject *object)
 {
   GeditMenuStackSwitcher *switcher = GEDIT_MENU_STACK_SWITCHER (object);
-  GeditMenuStackSwitcherPrivate *priv = switcher->priv;
 
-  g_hash_table_destroy (priv->buttons);
+  g_hash_table_destroy (switcher->buttons);
 
   G_OBJECT_CLASS (gedit_menu_stack_switcher_parent_class)->finalize (object);
 }
diff --git a/src/gedit/gedit-menu-stack-switcher.h b/src/gedit/gedit-menu-stack-switcher.h
index e2727de..c0b07b0 100644
--- a/src/gedit/gedit-menu-stack-switcher.h
+++ b/src/gedit/gedit-menu-stack-switcher.h
@@ -26,36 +26,9 @@
 G_BEGIN_DECLS
 
 #define GEDIT_TYPE_MENU_STACK_SWITCHER             (gedit_menu_stack_switcher_get_type())
-#define GEDIT_MENU_STACK_SWITCHER(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj), 
GEDIT_TYPE_MENU_STACK_SWITCHER, GeditMenuStackSwitcher))
-#define GEDIT_MENU_STACK_SWITCHER_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass), 
GEDIT_TYPE_MENU_STACK_SWITCHER, GeditMenuStackSwitcherClass))
-#define GEDIT_IS_MENU_STACK_SWITCHER(obj)          (G_TYPE_CHECK_INSTANCE_TYPE((obj), 
GEDIT_TYPE_MENU_STACK_SWITCHER))
-#define GEDIT_IS_MENU_STACK_SWITCHER_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), 
GEDIT_TYPE_MENU_STACK_SWITCHER))
-#define GEDIT_MENU_STACK_SWITCHER_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS((obj), 
GEDIT_TYPE_MENU_STACK_SWITCHER, GeditMenuStackSwitcherClass))
 
-typedef struct _GeditMenuStackSwitcher        GeditMenuStackSwitcher;
-typedef struct _GeditMenuStackSwitcherClass   GeditMenuStackSwitcherClass;
-typedef struct _GeditMenuStackSwitcherPrivate GeditMenuStackSwitcherPrivate;
-
-struct _GeditMenuStackSwitcher
-{
-  GtkMenuButton parent;
-
-  /*< private >*/
-  GeditMenuStackSwitcherPrivate *priv;
-};
-
-struct _GeditMenuStackSwitcherClass
-{
-  GtkMenuButtonClass parent_class;
-
-  /* Padding for future expansion */
-  void (*_gedit_reserved1) (void);
-  void (*_gedit_reserved2) (void);
-  void (*_gedit_reserved3) (void);
-  void (*_gedit_reserved4) (void);
-};
-
-GType        gedit_menu_stack_switcher_get_type   (void);
+G_DECLARE_FINAL_TYPE (GeditMenuStackSwitcher, gedit_menu_stack_switcher,
+                      GEDIT, MENU_STACK_SWITCHER, GtkMenuButton)
 
 GtkWidget *  gedit_menu_stack_switcher_new           (void);
 
diff --git a/src/html/gb-html-document.c b/src/html/gb-html-document.c
index fed6e8d..c063d3c 100644
--- a/src/html/gb-html-document.c
+++ b/src/html/gb-html-document.c
@@ -27,8 +27,10 @@
 #include "gb-html-document.h"
 #include "gb-html-view.h"
 
-struct _GbHtmlDocumentPrivate
+struct _GbHtmlDocument
 {
+  GObject                  parent_instance;
+
   GtkTextBuffer           *buffer;
   gchar                   *title;
   GbHtmlDocumentTransform  transform;
@@ -36,10 +38,9 @@ struct _GbHtmlDocumentPrivate
 
 static void gb_html_document_init_document (GbDocumentInterface *iface);
 
-G_DEFINE_TYPE_EXTENDED (GbHtmlDocument, gb_html_document, G_TYPE_OBJECT, 0,
-                        G_ADD_PRIVATE (GbHtmlDocument)
-                        G_IMPLEMENT_INTERFACE (GB_TYPE_DOCUMENT,
-                                               gb_html_document_init_document))
+G_DEFINE_TYPE_WITH_CODE (GbHtmlDocument, gb_html_document, G_TYPE_OBJECT,
+                         G_IMPLEMENT_INTERFACE (GB_TYPE_DOCUMENT,
+                                                gb_html_document_init_document))
 
 enum {
   PROP_0,
@@ -66,7 +67,7 @@ gb_html_document_set_transform_func (GbHtmlDocument          *document,
 {
   g_return_if_fail (GB_IS_HTML_DOCUMENT (document));
 
-  document->priv->transform = transform;
+  document->transform = transform;
 }
 
 gchar *
@@ -79,15 +80,15 @@ gb_html_document_get_content (GbHtmlDocument *document)
 
   g_return_val_if_fail (GB_IS_HTML_DOCUMENT (document), NULL);
 
-  if (!document->priv->buffer)
+  if (!document->buffer)
     return NULL;
 
-  gtk_text_buffer_get_bounds (document->priv->buffer, &begin, &end);
+  gtk_text_buffer_get_bounds (document->buffer, &begin, &end);
   str = gtk_text_iter_get_slice (&begin, &end);
 
-  if (document->priv->transform)
+  if (document->transform)
     {
-      tmp = document->priv->transform (document, str);
+      tmp = document->transform (document, str);
       g_free (str);
       str = tmp;
     }
@@ -102,8 +103,8 @@ gb_html_document_get_title (GbDocument *document)
 
   g_return_val_if_fail (GB_IS_HTML_DOCUMENT (self), NULL);
 
-  if (self->priv->title)
-    return self->priv->title;
+  if (self->title)
+    return self->title;
 
   return _("HTML Preview");
 }
@@ -120,14 +121,14 @@ gb_html_document_notify_location (GbHtmlDocument *document,
 
   location = ide_file_get_file (file);
 
-  g_clear_pointer (&document->priv->title, g_free);
+  g_clear_pointer (&document->title, g_free);
 
   if (location)
     {
       gchar *filename;
 
       filename = g_file_get_basename (location);
-      document->priv->title = g_strdup_printf (_("%s (Preview)"), filename);
+      document->title = g_strdup_printf (_("%s (Preview)"), filename);
     }
 
   g_object_notify (G_OBJECT (document), "title");
@@ -177,7 +178,7 @@ gb_html_document_get_buffer (GbHtmlDocument *document)
 {
   g_return_val_if_fail (GB_IS_HTML_DOCUMENT (document), NULL);
 
-  return document->priv->buffer;
+  return document->buffer;
 }
 
 static void
@@ -189,17 +190,17 @@ gb_html_document_set_buffer (GbHtmlDocument *document,
   g_return_if_fail (GB_IS_HTML_DOCUMENT (self));
   g_return_if_fail (!buffer || GTK_IS_TEXT_BUFFER (buffer));
 
-  if (buffer != self->priv->buffer)
+  if (buffer != self->buffer)
     {
-      if (self->priv->buffer)
+      if (self->buffer)
         {
           gb_html_document_disconnect (self, buffer);
-          g_clear_object (&self->priv->buffer);
+          g_clear_object (&self->buffer);
         }
 
       if (buffer)
         {
-          self->priv->buffer = g_object_ref (buffer);
+          self->buffer = g_object_ref (buffer);
           gb_html_document_connect (self, buffer);
         }
 
@@ -235,10 +236,10 @@ gb_html_document_get_read_only (GbDocument *document)
 static void
 gb_html_document_finalize (GObject *object)
 {
-  GbHtmlDocumentPrivate *priv = GB_HTML_DOCUMENT (object)->priv;
+  GbHtmlDocument *self = GB_HTML_DOCUMENT (object);
 
-  g_clear_pointer (&priv->title, g_free);
-  g_clear_object (&priv->buffer);
+  g_clear_pointer (&self->title, g_free);
+  g_clear_object (&self->buffer);
 
   G_OBJECT_CLASS (gb_html_document_parent_class)->finalize (object);
 }
@@ -323,7 +324,6 @@ gb_html_document_class_init (GbHtmlDocumentClass *klass)
 static void
 gb_html_document_init (GbHtmlDocument *self)
 {
-  self->priv = gb_html_document_get_instance_private (self);
 }
 
 static void
diff --git a/src/html/gb-html-document.h b/src/html/gb-html-document.h
index a3fd37f..ce5dc89 100644
--- a/src/html/gb-html-document.h
+++ b/src/html/gb-html-document.h
@@ -23,35 +23,13 @@
 
 G_BEGIN_DECLS
 
-#define GB_TYPE_HTML_DOCUMENT            (gb_html_document_get_type())
-#define GB_HTML_DOCUMENT(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_HTML_DOCUMENT, 
GbHtmlDocument))
-#define GB_HTML_DOCUMENT_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_HTML_DOCUMENT, 
GbHtmlDocument const))
-#define GB_HTML_DOCUMENT_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GB_TYPE_HTML_DOCUMENT, 
GbHtmlDocumentClass))
-#define GB_IS_HTML_DOCUMENT(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_HTML_DOCUMENT))
-#define GB_IS_HTML_DOCUMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GB_TYPE_HTML_DOCUMENT))
-#define GB_HTML_DOCUMENT_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GB_TYPE_HTML_DOCUMENT, 
GbHtmlDocumentClass))
+#define GB_TYPE_HTML_DOCUMENT (gb_html_document_get_type())
 
-typedef struct _GbHtmlDocument        GbHtmlDocument;
-typedef struct _GbHtmlDocumentClass   GbHtmlDocumentClass;
-typedef struct _GbHtmlDocumentPrivate GbHtmlDocumentPrivate;
-
-struct _GbHtmlDocument
-{
-  GObject parent;
-
-  /*< private >*/
-  GbHtmlDocumentPrivate *priv;
-};
-
-struct _GbHtmlDocumentClass
-{
-  GObjectClass parent;
-};
+G_DECLARE_FINAL_TYPE (GbHtmlDocument, gb_html_document, GB, HTML_DOCUMENT, GObject)
 
 typedef gchar *(*GbHtmlDocumentTransform) (GbHtmlDocument *document,
                                            const gchar    *content);
 
-GType          gb_html_document_get_type           (void);
 GtkTextBuffer *gb_html_document_get_buffer         (GbHtmlDocument          *document);
 void           gb_html_document_set_transform_func (GbHtmlDocument          *document,
                                                     GbHtmlDocumentTransform  transform);
diff --git a/src/nautilus/nautilus-floating-bar.c b/src/nautilus/nautilus-floating-bar.c
index 2aee9c6..d35a9fb 100644
--- a/src/nautilus/nautilus-floating-bar.c
+++ b/src/nautilus/nautilus-floating-bar.c
@@ -27,15 +27,17 @@
 
 #include "nautilus-floating-bar.h"
 
-struct _NautilusFloatingBarDetails {
-       gchar *primary_label;
-       gchar *details_label;
-
-       GtkWidget *primary_label_widget;
-       GtkWidget *details_label_widget;
-       GtkWidget *spinner;
-       gboolean show_spinner;
-       gboolean is_interactive;
+struct _NautilusFloatingBar {
+        GtkBox  parent_instance;
+
+        gchar *primary_label;
+        gchar *details_label;
+
+        GtkWidget *primary_label_widget;
+        GtkWidget *details_label_widget;
+        GtkWidget *spinner;
+        gboolean show_spinner;
+        gboolean is_interactive;
 };
 
 enum {
@@ -73,8 +75,8 @@ nautilus_floating_bar_finalize (GObject *obj)
 {
        NautilusFloatingBar *self = NAUTILUS_FLOATING_BAR (obj);
 
-       g_free (self->priv->primary_label);
-       g_free (self->priv->details_label);
+       g_free (self->primary_label);
+       g_free (self->details_label);
 
        G_OBJECT_CLASS (nautilus_floating_bar_parent_class)->finalize (obj);
 }
@@ -89,13 +91,13 @@ nautilus_floating_bar_get_property (GObject *object,
 
        switch (property_id) {
        case PROP_PRIMARY_LABEL:
-               g_value_set_string (value, self->priv->primary_label);
+               g_value_set_string (value, self->primary_label);
                break;
        case PROP_DETAILS_LABEL:
-               g_value_set_string (value, self->priv->details_label);
+               g_value_set_string (value, self->details_label);
                break;
        case PROP_SHOW_SPINNER:
-               g_value_set_boolean (value, self->priv->show_spinner);
+               g_value_set_boolean (value, self->show_spinner);
                break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -132,18 +134,18 @@ update_labels (NautilusFloatingBar *self)
 {
        gboolean primary_visible, details_visible;
 
-       primary_visible = (self->priv->primary_label != NULL) &&
-               (strlen (self->priv->primary_label) > 0);
-       details_visible = (self->priv->details_label != NULL) &&
-               (strlen (self->priv->details_label) > 0);
+       primary_visible = (self->primary_label != NULL) &&
+               (strlen (self->primary_label) > 0);
+       details_visible = (self->details_label != NULL) &&
+               (strlen (self->details_label) > 0);
 
-       gtk_label_set_text (GTK_LABEL (self->priv->primary_label_widget),
-                           self->priv->primary_label);
-       gtk_widget_set_visible (self->priv->primary_label_widget, primary_visible);
+       gtk_label_set_text (GTK_LABEL (self->primary_label_widget),
+                           self->primary_label);
+       gtk_widget_set_visible (self->primary_label_widget, primary_visible);
 
-       gtk_label_set_text (GTK_LABEL (self->priv->details_label_widget),
-                           self->priv->details_label);
-       gtk_widget_set_visible (self->priv->details_label_widget, details_visible);
+       gtk_label_set_text (GTK_LABEL (self->details_label_widget),
+                           self->details_label);
+       gtk_widget_set_visible (self->details_label_widget, details_visible);
 }
 
 static gboolean
@@ -200,8 +202,8 @@ nautilus_floating_bar_show (GtkWidget *widget)
 
        GTK_WIDGET_CLASS (nautilus_floating_bar_parent_class)->show (widget);
 
-       if (self->priv->show_spinner) {
-               gtk_spinner_start (GTK_SPINNER (self->priv->spinner));
+       if (self->show_spinner) {
+               gtk_spinner_start (GTK_SPINNER (self->spinner));
        }
 }
 
@@ -212,7 +214,7 @@ nautilus_floating_bar_hide (GtkWidget *widget)
 
        GTK_WIDGET_CLASS (nautilus_floating_bar_parent_class)->hide (widget);
 
-       gtk_spinner_stop (GTK_SPINNER (self->priv->spinner));
+       gtk_spinner_stop (GTK_SPINNER (self->spinner));
 }
 
 static void
@@ -318,8 +320,8 @@ nautilus_floating_bar_constructed (GObject *obj)
 
        w = gtk_spinner_new ();
        gtk_box_pack_start (GTK_BOX (box), w, FALSE, FALSE, 0);
-       gtk_widget_set_visible (w, self->priv->show_spinner);
-       self->priv->spinner = w;
+       gtk_widget_set_visible (w, self->show_spinner);
+       self->spinner = w;
 
        gtk_widget_set_size_request (w, 16, 16);
        gtk_widget_set_margin_start (w, 8);
@@ -338,13 +340,13 @@ nautilus_floating_bar_constructed (GObject *obj)
        gtk_label_set_ellipsize (GTK_LABEL (w), PANGO_ELLIPSIZE_MIDDLE);
        gtk_label_set_single_line_mode (GTK_LABEL (w), TRUE);
        gtk_container_add (GTK_CONTAINER (labels_box), w);
-       self->priv->primary_label_widget = w;
+       self->primary_label_widget = w;
        gtk_widget_show (w);
 
        w = gtk_label_new (NULL);
        gtk_label_set_single_line_mode (GTK_LABEL (w), TRUE);
        gtk_container_add (GTK_CONTAINER (labels_box), w);
-       self->priv->details_label_widget = w;
+       self->details_label_widget = w;
        gtk_widget_show (w);
 }
 
@@ -353,9 +355,6 @@ nautilus_floating_bar_init (NautilusFloatingBar *self)
 {
        GtkStyleContext *context;
 
-       self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, NAUTILUS_TYPE_FLOATING_BAR,
-                                                 NautilusFloatingBarDetails);
-
        context = gtk_widget_get_style_context (GTK_WIDGET (self));
        gtk_style_context_add_class (context, "floating-bar");
 }
@@ -407,7 +406,6 @@ nautilus_floating_bar_class_init (NautilusFloatingBarClass *klass)
                              G_TYPE_NONE, 1,
                              G_TYPE_INT);
 
-       g_type_class_add_private (klass, sizeof (NautilusFloatingBarDetails));
        g_object_class_install_properties (oclass, NUM_PROPERTIES, properties);
 }
 
@@ -415,9 +413,9 @@ void
 nautilus_floating_bar_set_primary_label (NautilusFloatingBar *self,
                                         const gchar *label)
 {
-       if (g_strcmp0 (self->priv->primary_label, label) != 0) {
-               g_free (self->priv->primary_label);
-               self->priv->primary_label = g_strdup (label);
+       if (g_strcmp0 (self->primary_label, label) != 0) {
+               g_free (self->primary_label);
+               self->primary_label = g_strdup (label);
 
                g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_PRIMARY_LABEL]);
 
@@ -429,9 +427,9 @@ void
 nautilus_floating_bar_set_details_label (NautilusFloatingBar *self,
                                         const gchar *label)
 {
-       if (g_strcmp0 (self->priv->details_label, label) != 0) {
-               g_free (self->priv->details_label);
-               self->priv->details_label = g_strdup (label);
+       if (g_strcmp0 (self->details_label, label) != 0) {
+               g_free (self->details_label);
+               self->details_label = g_strdup (label);
 
                g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_DETAILS_LABEL]);
 
@@ -452,10 +450,10 @@ void
 nautilus_floating_bar_set_show_spinner (NautilusFloatingBar *self,
                                        gboolean show_spinner)
 {
-       if (self->priv->show_spinner != show_spinner) {
-               self->priv->show_spinner = show_spinner;
-               g_object_set (self->priv->spinner, "active", show_spinner, NULL);
-               gtk_widget_set_visible (self->priv->spinner,
+       if (self->show_spinner != show_spinner) {
+               self->show_spinner = show_spinner;
+               g_object_set (self->spinner, "active", show_spinner, NULL);
+               gtk_widget_set_visible (self->spinner,
                                        show_spinner);
 
                g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SHOW_SPINNER]);
@@ -498,7 +496,7 @@ nautilus_floating_bar_add_action (NautilusFloatingBar *self,
        g_signal_connect (button, "clicked",
                          G_CALLBACK (action_button_clicked_cb), self);
 
-       self->priv->is_interactive = TRUE;
+       self->is_interactive = TRUE;
 }
 
 void
@@ -524,5 +522,5 @@ nautilus_floating_bar_cleanup_actions (NautilusFloatingBar *self)
 
        g_list_free (children);
 
-       self->priv->is_interactive = FALSE;
+       self->is_interactive = FALSE;
 }
diff --git a/src/nautilus/nautilus-floating-bar.h b/src/nautilus/nautilus-floating-bar.h
index 59fd1ab..672cd1a 100644
--- a/src/nautilus/nautilus-floating-bar.h
+++ b/src/nautilus/nautilus-floating-bar.h
@@ -29,32 +29,9 @@
 #define NAUTILUS_FLOATING_BAR_ACTION_ID_STOP 1
 
 #define NAUTILUS_TYPE_FLOATING_BAR nautilus_floating_bar_get_type()
-#define NAUTILUS_FLOATING_BAR(obj) \
-  (G_TYPE_CHECK_INSTANCE_CAST ((obj), NAUTILUS_TYPE_FLOATING_BAR, NautilusFloatingBar))
-#define NAUTILUS_FLOATING_BAR_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_CAST ((klass), NAUTILUS_TYPE_FLOATING_BAR, NautilusFloatingBarClass))
-#define NAUTILUS_IS_FLOATING_BAR(obj) \
-  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NAUTILUS_TYPE_FLOATING_BAR))
-#define NAUTILUS_IS_FLOATING_BAR_CLASS(klass) \
-  (G_TYPE_CHECK_CLASS_TYPE ((klass), NAUTILUS_TYPE_FLOATING_BAR))
-#define NAUTILUS_FLOATING_BAR_GET_CLASS(obj) \
-  (G_TYPE_INSTANCE_GET_CLASS ((obj), NAUTILUS_TYPE_FLOATING_BAR, NautilusFloatingBarClass))
 
-typedef struct _NautilusFloatingBar NautilusFloatingBar;
-typedef struct _NautilusFloatingBarClass NautilusFloatingBarClass;
-typedef struct _NautilusFloatingBarDetails NautilusFloatingBarDetails;
-
-struct _NautilusFloatingBar {
-       GtkBox parent;
-       NautilusFloatingBarDetails *priv;
-};
-
-struct _NautilusFloatingBarClass {
-       GtkBoxClass parent_class;
-};
-
-/* GObject */
-GType       nautilus_floating_bar_get_type  (void);
+G_DECLARE_FINAL_TYPE (NautilusFloatingBar, nautilus_floating_bar,
+                      NAUTILUS, FLOATING_BAR, GtkBox)
 
 GtkWidget * nautilus_floating_bar_new              (const gchar *primary_label,
                                                    const gchar *details_label,
diff --git a/src/preferences/gb-preferences-page-git.c b/src/preferences/gb-preferences-page-git.c
index c5da482..0443eb9 100644
--- a/src/preferences/gb-preferences-page-git.c
+++ b/src/preferences/gb-preferences-page-git.c
@@ -20,20 +20,21 @@
 #include <libgit2-glib/ggit.h>
 
 #include "gb-preferences-page-git.h"
+#include "gb-widget.h"
 
-struct _GbPreferencesPageGitPrivate
+struct _GbPreferencesPageGit
 {
-  GgitConfig *config;
+  GbPreferencesPage  parent_instance;
 
-  GtkEntry *git_author_name_entry;
-  GtkEntry *git_author_email_entry;
-
-  GtkWidget *name_label;
-  GtkWidget *email_label;
+  GgitConfig        *config;
+  GtkEntry          *git_author_name_entry;
+  GtkEntry          *git_author_email_entry;
+  GtkWidget         *name_label;
+  GtkWidget         *email_label;
 };
 
-G_DEFINE_TYPE_WITH_PRIVATE (GbPreferencesPageGit, gb_preferences_page_git,
-                            GB_TYPE_PREFERENCES_PAGE)
+G_DEFINE_TYPE (GbPreferencesPageGit, gb_preferences_page_git,
+               GB_TYPE_PREFERENCES_PAGE)
 
 static void
 on_author_name_changed (GtkEntry             *entry,
@@ -42,7 +43,7 @@ on_author_name_changed (GtkEntry             *entry,
   g_return_if_fail (GB_IS_PREFERENCES_PAGE_GIT (git));
   g_return_if_fail (GTK_IS_ENTRY (entry));
 
-  ggit_config_set_string (git->priv->config, "user.name",
+  ggit_config_set_string (git->config, "user.name",
                           gtk_entry_get_text (entry), NULL);
 }
 
@@ -53,35 +54,32 @@ on_author_email_changed (GtkEntry             *entry,
   g_return_if_fail (GB_IS_PREFERENCES_PAGE_GIT (git));
   g_return_if_fail (GTK_IS_ENTRY (entry));
 
-  ggit_config_set_string (git->priv->config, "user.email",
+  ggit_config_set_string (git->config, "user.email",
                           gtk_entry_get_text (entry), NULL);
 }
 
 static void
 gb_preferences_page_git_constructed (GObject *object)
 {
-  GbPreferencesPageGitPrivate *priv;
   GbPreferencesPageGit *git = (GbPreferencesPageGit *)object;
   const gchar *value;
 
   g_return_if_fail (GB_IS_PREFERENCES_PAGE_GIT (git));
 
-  priv = git->priv;
-
   /* set current values from git */
-  value = ggit_config_get_string (priv->config, "user.name", NULL);
+  value = ggit_config_get_string (git->config, "user.name", NULL);
   if (value)
-    gtk_entry_set_text (priv->git_author_name_entry, value);
-  value = ggit_config_get_string (priv->config, "user.email", NULL);
+    gtk_entry_set_text (git->git_author_name_entry, value);
+  value = ggit_config_get_string (git->config, "user.email", NULL);
   if (value)
-    gtk_entry_set_text (priv->git_author_email_entry, value);
+    gtk_entry_set_text (git->git_author_email_entry, value);
 
   /* connect to changed signals to update values */
-  g_signal_connect (priv->git_author_name_entry,
+  g_signal_connect (git->git_author_name_entry,
                     "changed",
                     G_CALLBACK (on_author_name_changed),
                     git);
-  g_signal_connect (priv->git_author_email_entry,
+  g_signal_connect (git->git_author_email_entry,
                     "changed",
                     G_CALLBACK (on_author_email_changed),
                     git);
@@ -92,9 +90,9 @@ gb_preferences_page_git_constructed (GObject *object)
 static void
 gb_preferences_page_git_finalize (GObject *object)
 {
-  GbPreferencesPageGitPrivate *priv = GB_PREFERENCES_PAGE_GIT (object)->priv;
+  GbPreferencesPageGit *self = GB_PREFERENCES_PAGE_GIT (object);
 
-  g_clear_object (&priv->config);
+  g_clear_object (&self->config);
 
   G_OBJECT_CLASS (gb_preferences_page_git_parent_class)->finalize (object);
 }
@@ -111,30 +109,28 @@ gb_preferences_page_git_class_init (GbPreferencesPageGitClass *klass)
   gtk_widget_class_set_template_from_resource (widget_class,
                                                "/org/gnome/builder/ui/gb-preferences-page-git.ui");
 
-  gtk_widget_class_bind_template_child_private (widget_class, GbPreferencesPageGit, git_author_name_entry);
-  gtk_widget_class_bind_template_child_private (widget_class, GbPreferencesPageGit, git_author_email_entry);
+  GB_WIDGET_CLASS_BIND (widget_class, GbPreferencesPageGit, git_author_name_entry);
+  GB_WIDGET_CLASS_BIND (widget_class, GbPreferencesPageGit, git_author_email_entry);
 
-  gtk_widget_class_bind_template_child_private (widget_class, GbPreferencesPageGit, name_label);
-  gtk_widget_class_bind_template_child_private (widget_class, GbPreferencesPageGit, email_label);
+  GB_WIDGET_CLASS_BIND (widget_class, GbPreferencesPageGit, name_label);
+  GB_WIDGET_CLASS_BIND (widget_class, GbPreferencesPageGit, email_label);
 }
 
 static void
 gb_preferences_page_git_init (GbPreferencesPageGit *self)
 {
-  self->priv = gb_preferences_page_git_get_instance_private (self);
-
   gtk_widget_init_template (GTK_WIDGET (self));
 
-  self->priv->config = ggit_config_new_default (NULL);
+  self->config = ggit_config_new_default (NULL);
 
   gb_preferences_page_set_keywords_for_widget (GB_PREFERENCES_PAGE (self),
                                                _("git author name surname"),
-                                               self->priv->name_label,
-                                               self->priv->git_author_name_entry,
+                                               self->name_label,
+                                               self->git_author_name_entry,
                                                NULL);
   gb_preferences_page_set_keywords_for_widget (GB_PREFERENCES_PAGE (self),
                                                _("git author email mail address"),
-                                               self->priv->email_label,
-                                               self->priv->git_author_email_entry,
+                                               self->email_label,
+                                               self->git_author_email_entry,
                                                NULL);
 }
diff --git a/src/preferences/gb-preferences-page-git.h b/src/preferences/gb-preferences-page-git.h
index 592007c..7e93a26 100644
--- a/src/preferences/gb-preferences-page-git.h
+++ b/src/preferences/gb-preferences-page-git.h
@@ -23,32 +23,10 @@
 
 G_BEGIN_DECLS
 
-#define GB_TYPE_PREFERENCES_PAGE_GIT            (gb_preferences_page_git_get_type())
-#define GB_PREFERENCES_PAGE_GIT(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GB_TYPE_PREFERENCES_PAGE_GIT, GbPreferencesPageGit))
-#define GB_PREFERENCES_PAGE_GIT_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GB_TYPE_PREFERENCES_PAGE_GIT, GbPreferencesPageGit const))
-#define GB_PREFERENCES_PAGE_GIT_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  
GB_TYPE_PREFERENCES_PAGE_GIT, GbPreferencesPageGitClass))
-#define GB_IS_PREFERENCES_PAGE_GIT(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
GB_TYPE_PREFERENCES_PAGE_GIT))
-#define GB_IS_PREFERENCES_PAGE_GIT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  
GB_TYPE_PREFERENCES_PAGE_GIT))
-#define GB_PREFERENCES_PAGE_GIT_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  
GB_TYPE_PREFERENCES_PAGE_GIT, GbPreferencesPageGitClass))
+#define GB_TYPE_PREFERENCES_PAGE_GIT (gb_preferences_page_git_get_type())
 
-typedef struct _GbPreferencesPageGit        GbPreferencesPageGit;
-typedef struct _GbPreferencesPageGitClass   GbPreferencesPageGitClass;
-typedef struct _GbPreferencesPageGitPrivate GbPreferencesPageGitPrivate;
-
-struct _GbPreferencesPageGit
-{
-  GbPreferencesPage parent;
-
-  /*< private >*/
-  GbPreferencesPageGitPrivate *priv;
-};
-
-struct _GbPreferencesPageGitClass
-{
-  GbPreferencesPageClass parent;
-};
-
-GType gb_preferences_page_git_get_type (void);
+G_DECLARE_FINAL_TYPE (GbPreferencesPageGit, gb_preferences_page_git,
+                      GB, PREFERENCES_PAGE_GIT, GbPreferencesPage)
 
 G_END_DECLS
 
diff --git a/src/preferences/gb-preferences-page-language.c b/src/preferences/gb-preferences-page-language.c
index a281306..ebce11f 100644
--- a/src/preferences/gb-preferences-page-language.c
+++ b/src/preferences/gb-preferences-page-language.c
@@ -24,21 +24,23 @@
 #include "gb-editor-settings-widget.h"
 #include "gb-preferences-page-language.h"
 #include "gb-string.h"
+#include "gb-widget.h"
 
-struct _GbPreferencesPageLanguagePrivate
+struct _GbPreferencesPageLanguage
 {
-  GtkStack       *stack;
-  GtkListBox     *language_list_box;
-  GtkSearchEntry *search_entry;
-  GtkBox         *language_selection;
-  GtkWidget      *language_settings;
-  GtkBox         *language_settings_box;
-  GtkButton      *back_button;
+  GbPreferencesPage  parent_instance;
+
+  GtkStack          *stack;
+  GtkListBox        *language_list_box;
+  GtkSearchEntry    *search_entry;
+  GtkBox            *language_selection;
+  GtkWidget         *language_settings;
+  GtkBox            *language_settings_box;
+  GtkButton         *back_button;
 };
 
-G_DEFINE_TYPE_WITH_PRIVATE (GbPreferencesPageLanguage,
-                            gb_preferences_page_language,
-                            GB_TYPE_PREFERENCES_PAGE)
+G_DEFINE_TYPE (GbPreferencesPageLanguage, gb_preferences_page_language,
+               GB_TYPE_PREFERENCES_PAGE)
 
 GtkWidget *
 make_language_row (GtkSourceLanguage *language)
@@ -157,8 +159,8 @@ row_selected (GtkListBox                *list_box,
                          "language", lang_id,
                          "visible", TRUE,
                          NULL);
-  gtk_container_add (GTK_CONTAINER (page->priv->language_settings_box), GTK_WIDGET (widget));
-  gtk_stack_set_visible_child (page->priv->stack,GTK_WIDGET (page->priv->language_settings));
+  gtk_container_add (GTK_CONTAINER (page->language_settings_box), GTK_WIDGET (widget));
+  gtk_stack_set_visible_child (page->stack,GTK_WIDGET (page->language_settings));
   gb_preferences_page_set_title (GB_PREFERENCES_PAGE (page), gtk_source_language_get_name (lang));
 }
 
@@ -173,23 +175,23 @@ stack_notify_visible_child (GbPreferencesPageLanguage *page,
   g_assert (GTK_IS_STACK (stack));
 
   visible_child = gtk_stack_get_visible_child (stack);
-  if (visible_child == GTK_WIDGET (page->priv->language_selection))
+  if (visible_child == GTK_WIDGET (page->language_selection))
     {
       GList *children;
       GList *iter;
 
-      children = gtk_container_get_children (GTK_CONTAINER (page->priv->language_settings_box));
+      children = gtk_container_get_children (GTK_CONTAINER (page->language_settings_box));
       for(iter = children; iter != NULL; iter = g_list_next (iter))
         gtk_widget_destroy (GTK_WIDGET (iter->data));
       g_list_free (children);
 
-      gtk_list_box_unselect_all (page->priv->language_list_box);
-      gtk_widget_hide (GTK_WIDGET (page->priv->back_button));
+      gtk_list_box_unselect_all (page->language_list_box);
+      gtk_widget_hide (GTK_WIDGET (page->back_button));
       gb_preferences_page_reset_title (GB_PREFERENCES_PAGE (page));
     }
-  else if (visible_child == GTK_WIDGET (page->priv->language_settings))
+  else if (visible_child == GTK_WIDGET (page->language_settings))
     {
-      gtk_widget_show (GTK_WIDGET (page->priv->back_button));
+      gtk_widget_show (GTK_WIDGET (page->back_button));
     }
 }
 
@@ -200,7 +202,7 @@ back_button_clicked_cb (GbPreferencesPageLanguage *page,
   g_assert (GB_IS_PREFERENCES_PAGE_LANGUAGE (page));
   g_assert (GTK_IS_BUTTON (back_button));
 
-  gtk_stack_set_visible_child (page->priv->stack, GTK_WIDGET (page->priv->language_selection));
+  gtk_stack_set_visible_child (page->stack, GTK_WIDGET (page->language_selection));
 }
 
 static void
@@ -211,29 +213,29 @@ gb_preferences_page_language_constructed (GObject *object)
   const gchar * const *lang_ids;
   guint i;
 
-  gtk_list_box_set_header_func (page->priv->language_list_box,
+  gtk_list_box_set_header_func (page->language_list_box,
                                 item_header_func, NULL, NULL);
-  gtk_list_box_set_filter_func (page->priv->language_list_box,
-                                item_filter_func, page->priv->search_entry,
+  gtk_list_box_set_filter_func (page->language_list_box,
+                                item_filter_func, page->search_entry,
                                 NULL);
 
-  g_signal_connect (page->priv->search_entry,
+  g_signal_connect (page->search_entry,
                     "changed",
                     G_CALLBACK (search_entry_changed),
-                    page->priv->language_list_box);
+                    page->language_list_box);
 
-  g_signal_connect (page->priv->language_list_box,
+  g_signal_connect (page->language_list_box,
                     "row-selected",
                     G_CALLBACK (row_selected),
                     page);
 
-  g_signal_connect_object (page->priv->back_button,
+  g_signal_connect_object (page->back_button,
                           "clicked",
                            G_CALLBACK (back_button_clicked_cb),
                            page,
                            G_CONNECT_SWAPPED);
 
-  g_signal_connect_object (page->priv->stack,
+  g_signal_connect_object (page->stack,
                            "notify::visible-child",
                            G_CALLBACK (stack_notify_visible_child),
                            page,
@@ -264,7 +266,7 @@ gb_preferences_page_language_constructed (GObject *object)
                                                    keywords, widget, NULL);
       g_free (keywords);
 
-      gtk_container_add (GTK_CONTAINER (page->priv->language_list_box), widget);
+      gtk_container_add (GTK_CONTAINER (page->language_list_box), widget);
     }
 
   G_OBJECT_CLASS (gb_preferences_page_language_parent_class)->constructed (object);
@@ -287,27 +289,13 @@ gb_preferences_page_language_class_init (GbPreferencesPageLanguageClass *klass)
 
   gtk_widget_class_set_template_from_resource (widget_class,
                                                "/org/gnome/builder/ui/gb-preferences-page-language.ui");
-  gtk_widget_class_bind_template_child_private (widget_class,
-                                                GbPreferencesPageLanguage,
-                                                stack);
-  gtk_widget_class_bind_template_child_private (widget_class,
-                                                GbPreferencesPageLanguage,
-                                                language_list_box);
-  gtk_widget_class_bind_template_child_private (widget_class,
-                                                GbPreferencesPageLanguage,
-                                                search_entry);
-  gtk_widget_class_bind_template_child_private (widget_class,
-                                                GbPreferencesPageLanguage,
-                                                language_selection);
-  gtk_widget_class_bind_template_child_private (widget_class,
-                                                GbPreferencesPageLanguage,
-                                                language_settings);
-  gtk_widget_class_bind_template_child_private (widget_class,
-                                                GbPreferencesPageLanguage,
-                                                language_settings_box);
-  gtk_widget_class_bind_template_child_private (widget_class,
-                                                GbPreferencesPageLanguage,
-                                                back_button);
+  GB_WIDGET_CLASS_BIND (widget_class, GbPreferencesPageLanguage, stack);
+  GB_WIDGET_CLASS_BIND (widget_class, GbPreferencesPageLanguage, language_list_box);
+  GB_WIDGET_CLASS_BIND (widget_class, GbPreferencesPageLanguage, search_entry);
+  GB_WIDGET_CLASS_BIND (widget_class, GbPreferencesPageLanguage, language_selection);
+  GB_WIDGET_CLASS_BIND (widget_class, GbPreferencesPageLanguage, language_settings);
+  GB_WIDGET_CLASS_BIND (widget_class, GbPreferencesPageLanguage, language_settings_box);
+  GB_WIDGET_CLASS_BIND (widget_class, GbPreferencesPageLanguage, back_button);
 
   g_type_ensure (GB_TYPE_EDITOR_SETTINGS_WIDGET);
 }
@@ -315,7 +303,5 @@ gb_preferences_page_language_class_init (GbPreferencesPageLanguageClass *klass)
 static void
 gb_preferences_page_language_init (GbPreferencesPageLanguage *self)
 {
-  self->priv = gb_preferences_page_language_get_instance_private (self);
-
   gtk_widget_init_template (GTK_WIDGET (self));
 }
diff --git a/src/preferences/gb-preferences-page-language.h b/src/preferences/gb-preferences-page-language.h
index b1eb256..7958986 100644
--- a/src/preferences/gb-preferences-page-language.h
+++ b/src/preferences/gb-preferences-page-language.h
@@ -23,32 +23,10 @@
 
 G_BEGIN_DECLS
 
-#define GB_TYPE_PREFERENCES_PAGE_LANGUAGE            (gb_preferences_page_language_get_type())
-#define GB_PREFERENCES_PAGE_LANGUAGE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GB_TYPE_PREFERENCES_PAGE_LANGUAGE, GbPreferencesPageLanguage))
-#define GB_PREFERENCES_PAGE_LANGUAGE_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
GB_TYPE_PREFERENCES_PAGE_LANGUAGE, GbPreferencesPageLanguage const))
-#define GB_PREFERENCES_PAGE_LANGUAGE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  
GB_TYPE_PREFERENCES_PAGE_LANGUAGE, GbPreferencesPageLanguageClass))
-#define GB_IS_PREFERENCES_PAGE_LANGUAGE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
GB_TYPE_PREFERENCES_PAGE_LANGUAGE))
-#define GB_IS_PREFERENCES_PAGE_LANGUAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  
GB_TYPE_PREFERENCES_PAGE_LANGUAGE))
-#define GB_PREFERENCES_PAGE_LANGUAGE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  
GB_TYPE_PREFERENCES_PAGE_LANGUAGE, GbPreferencesPageLanguageClass))
+#define GB_TYPE_PREFERENCES_PAGE_LANGUAGE (gb_preferences_page_language_get_type())
 
-typedef struct _GbPreferencesPageLanguage        GbPreferencesPageLanguage;
-typedef struct _GbPreferencesPageLanguageClass   GbPreferencesPageLanguageClass;
-typedef struct _GbPreferencesPageLanguagePrivate GbPreferencesPageLanguagePrivate;
-
-struct _GbPreferencesPageLanguage
-{
-  GbPreferencesPage parent;
-
-  /*< private >*/
-  GbPreferencesPageLanguagePrivate *priv;
-};
-
-struct _GbPreferencesPageLanguageClass
-{
-  GbPreferencesPageClass parent;
-};
-
-GType gb_preferences_page_language_get_type (void);
+G_DECLARE_FINAL_TYPE (GbPreferencesPageLanguage, gb_preferences_page_language,
+                      GB, PREFERENCES_PAGE_LANGUAGE, GbPreferencesPage)
 
 G_END_DECLS
 
diff --git a/src/preferences/gb-preferences-page.c b/src/preferences/gb-preferences-page.c
index 8c7b41b..47293e8 100644
--- a/src/preferences/gb-preferences-page.c
+++ b/src/preferences/gb-preferences-page.c
@@ -25,13 +25,13 @@
 #include "gb-preferences-switch.h"
 #include "gb-string.h"
 
-struct _GbPreferencesPagePrivate
+typedef struct
 {
   GHashTable *widgets;
   GtkBox     *controls;
   gchar      *title;
   gchar      *default_title;
-};
+} GbPreferencesPagePrivate;
 
 static void buildable_iface_init (GtkBuildableIface *iface);
 
@@ -69,12 +69,13 @@ gb_preferences_page_set_keywords (GbPreferencesPage   *page,
   gsize size;
   guint count = 0;
   guint i;
+  GbPreferencesPagePrivate *priv = gb_preferences_page_get_instance_private (page);
 
   g_return_val_if_fail (GB_IS_PREFERENCES_PAGE (page), 0);
 
   if (!keywords || (g_strv_length ((gchar **)keywords) == 0))
     {
-      g_hash_table_foreach (page->priv->widgets, (GHFunc)gtk_widget_show, NULL);
+      g_hash_table_foreach (priv->widgets, (GHFunc)gtk_widget_show, NULL);
       return G_MAXUINT;
     }
 
@@ -84,7 +85,7 @@ gb_preferences_page_set_keywords (GbPreferencesPage   *page,
   for (i = 0; keywords [i]; i++)
     needle [i] = g_utf8_strdown (keywords [i], -1);
 
-  g_hash_table_iter_init (&iter, page->priv->widgets);
+  g_hash_table_iter_init (&iter, priv->widgets);
 
   while (g_hash_table_iter_next (&iter, &key, &value))
     {
@@ -123,6 +124,7 @@ gb_preferences_page_set_keywords_for_widget (GbPreferencesPage *page,
   va_list args;
   GQuark q;
   gchar *downcase;
+  GbPreferencesPagePrivate *priv = gb_preferences_page_get_instance_private (page);
 
   g_return_if_fail (GB_IS_PREFERENCES_PAGE (page));
   g_return_if_fail (GTK_IS_WIDGET (widget));
@@ -133,7 +135,7 @@ gb_preferences_page_set_keywords_for_widget (GbPreferencesPage *page,
 
   va_start (args, first_widget);
   do
-    g_hash_table_insert (page->priv->widgets, widget, GINT_TO_POINTER (q));
+    g_hash_table_insert (priv->widgets, widget, GINT_TO_POINTER (q));
   while ((widget = va_arg (args, GtkWidget *)));
   va_end (args);
 }
@@ -149,22 +151,25 @@ gb_preferences_page_set_keywords_for_widget (GbPreferencesPage *page,
 GtkWidget *
 gb_preferences_page_get_controls (GbPreferencesPage *page)
 {
+  GbPreferencesPagePrivate *priv = gb_preferences_page_get_instance_private (page);
 
   g_return_val_if_fail (GB_IS_PREFERENCES_PAGE (page), NULL);
 
-  return GTK_WIDGET (page->priv->controls);
+  return GTK_WIDGET (priv->controls);
 }
 
 void
 gb_preferences_page_set_title (GbPreferencesPage *page,
                                const gchar       *title)
 {
+  GbPreferencesPagePrivate *priv = gb_preferences_page_get_instance_private (page);
+
   g_return_if_fail (GB_IS_PREFERENCES_PAGE (page));
 
-  if (!gb_str_equal0 (title, page->priv->title))
+  if (!gb_str_equal0 (title, priv->title))
     {
-      g_free (page->priv->title);
-      page->priv->title = g_strdup (title);
+      g_free (priv->title);
+      priv->title = g_strdup (title);
       g_object_notify_by_pspec (G_OBJECT (page),
                                 gParamSpecs [PROP_TITLE]);
     }
@@ -173,23 +178,28 @@ gb_preferences_page_set_title (GbPreferencesPage *page,
 void
 gb_preferences_page_reset_title (GbPreferencesPage *page)
 {
+  GbPreferencesPagePrivate *priv = gb_preferences_page_get_instance_private (page);
+
   g_return_if_fail (GB_IS_PREFERENCES_PAGE (page));
 
-  gb_preferences_page_set_title (page, page->priv->default_title);
+  gb_preferences_page_set_title (page, priv->default_title);
 }
 
 static const gchar *
 gb_preferences_page_get_title (GbPreferencesPage *page)
 {
+  GbPreferencesPagePrivate *priv = gb_preferences_page_get_instance_private (page);
+
   g_return_val_if_fail (GB_IS_PREFERENCES_PAGE (page), NULL);
 
-  return page->priv->title;
+  return priv->title;
 }
 
 static void
 gb_preferences_page_constructed (GObject *object)
 {
-  GbPreferencesPagePrivate *priv = GB_PREFERENCES_PAGE (object)->priv;
+  GbPreferencesPage *self = GB_PREFERENCES_PAGE (object);
+  GbPreferencesPagePrivate *priv = gb_preferences_page_get_instance_private (self);
 
   g_object_get (object, "title", &priv->default_title, NULL);
 
@@ -199,7 +209,8 @@ gb_preferences_page_constructed (GObject *object)
 static void
 gb_preferences_page_finalize (GObject *object)
 {
-  GbPreferencesPagePrivate *priv = GB_PREFERENCES_PAGE (object)->priv;
+  GbPreferencesPage *self = GB_PREFERENCES_PAGE (object);
+  GbPreferencesPagePrivate *priv = gb_preferences_page_get_instance_private (self);
 
   g_clear_pointer (&priv->title, g_free);
   g_clear_pointer (&priv->default_title, g_free);
@@ -273,17 +284,17 @@ gb_preferences_page_class_init (GbPreferencesPageClass *klass)
 static void
 gb_preferences_page_init (GbPreferencesPage *self)
 {
+  GbPreferencesPagePrivate *priv = gb_preferences_page_get_instance_private (self);
   GtkBox *controls;
 
-  self->priv = gb_preferences_page_get_instance_private (self);
-  self->priv->widgets = g_hash_table_new_full (g_direct_hash, g_direct_equal,
+  priv->widgets = g_hash_table_new_full (g_direct_hash, g_direct_equal,
                                                NULL, NULL);
 
   controls = g_object_new (GTK_TYPE_BOX,
                            "orientation", GTK_ORIENTATION_HORIZONTAL,
                            "visible", TRUE,
                            NULL);
-  self->priv->controls = g_object_ref_sink (controls);
+  priv->controls = g_object_ref_sink (controls);
 }
 
 static GObject *
diff --git a/src/preferences/gb-preferences-page.h b/src/preferences/gb-preferences-page.h
index cfcb41a..4994615 100644
--- a/src/preferences/gb-preferences-page.h
+++ b/src/preferences/gb-preferences-page.h
@@ -23,34 +23,15 @@
 
 G_BEGIN_DECLS
 
-#define GB_TYPE_PREFERENCES_PAGE            (gb_preferences_page_get_type())
-#define GB_PREFERENCES_PAGE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_PREFERENCES_PAGE, 
GbPreferencesPage))
-#define GB_PREFERENCES_PAGE_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_PREFERENCES_PAGE, 
GbPreferencesPage const))
-#define GB_PREFERENCES_PAGE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GB_TYPE_PREFERENCES_PAGE, 
GbPreferencesPageClass))
-#define GB_IS_PREFERENCES_PAGE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_PREFERENCES_PAGE))
-#define GB_IS_PREFERENCES_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GB_TYPE_PREFERENCES_PAGE))
-#define GB_PREFERENCES_PAGE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GB_TYPE_PREFERENCES_PAGE, 
GbPreferencesPageClass))
+#define GB_TYPE_PREFERENCES_PAGE (gb_preferences_page_get_type())
 
-typedef struct _GbPreferencesPage        GbPreferencesPage;
-typedef struct _GbPreferencesPageClass   GbPreferencesPageClass;
-typedef struct _GbPreferencesPagePrivate GbPreferencesPagePrivate;
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GbPreferencesPage, g_object_unref)
-
-struct _GbPreferencesPage
-{
-  GtkBin parent;
-
-  /*< private >*/
-  GbPreferencesPagePrivate *priv;
-};
+G_DECLARE_DERIVABLE_TYPE (GbPreferencesPage, gb_preferences_page, GB, PREFERENCES_PAGE, GtkBin)
 
 struct _GbPreferencesPageClass
 {
   GtkBinClass parent;
 };
 
-GType        gb_preferences_page_get_type                (void);
 guint        gb_preferences_page_set_keywords            (GbPreferencesPage   *page,
                                                           const gchar * const *keywords);
 void         gb_preferences_page_set_keywords_for_widget (GbPreferencesPage   *page,
diff --git a/src/tree/gb-tree-builder.c b/src/tree/gb-tree-builder.c
index 4f38ead..6fbd377 100644
--- a/src/tree/gb-tree-builder.c
+++ b/src/tree/gb-tree-builder.c
@@ -23,12 +23,12 @@
 #include "gb-tree.h"
 #include "gb-tree-builder.h"
 
-G_DEFINE_TYPE(GbTreeBuilder, gb_tree_builder, G_TYPE_INITIALLY_UNOWNED)
-
-struct _GbTreeBuilderPrivate
+typedef struct
 {
        GbTree *tree;
-};
+} GbTreeBuilderPrivate;
+
+G_DEFINE_TYPE_WITH_PRIVATE(GbTreeBuilder, gb_tree_builder, G_TYPE_INITIALLY_UNOWNED)
 
 enum
 {
@@ -162,14 +162,12 @@ static void
 gb_tree_builder_set_tree (GbTreeBuilder *builder,
                           GbTree        *tree)
 {
-       GbTreeBuilderPrivate *priv;
+       GbTreeBuilderPrivate *priv = gb_tree_builder_get_instance_private (builder);
 
        g_return_if_fail(GB_IS_TREE_BUILDER(builder));
-       g_return_if_fail(builder->priv->tree == NULL);
+       g_return_if_fail(priv->tree == NULL);
        g_return_if_fail(GB_IS_TREE(tree));
 
-       priv = builder->priv;
-
        if (tree) {
                priv->tree = tree;
                g_object_add_weak_pointer(G_OBJECT(priv->tree),
@@ -188,8 +186,11 @@ gb_tree_builder_set_tree (GbTreeBuilder *builder,
 GtkWidget *
 gb_tree_builder_get_tree (GbTreeBuilder *builder)
 {
-   g_return_val_if_fail(GB_IS_TREE_BUILDER(builder), NULL);
-   return GTK_WIDGET(builder->priv->tree);
+  GbTreeBuilderPrivate *priv = gb_tree_builder_get_instance_private (builder);
+
+  g_return_val_if_fail(GB_IS_TREE_BUILDER(builder), NULL);
+
+  return GTK_WIDGET(priv->tree);
 }
 
 /**
@@ -201,7 +202,8 @@ gb_tree_builder_get_tree (GbTreeBuilder *builder)
 static void
 gb_tree_builder_finalize (GObject *object)
 {
-       GbTreeBuilderPrivate *priv = GB_TREE_BUILDER(object)->priv;
+       GbTreeBuilder *builder = GB_TREE_BUILDER (object);
+       GbTreeBuilderPrivate *priv = gb_tree_builder_get_instance_private (builder);
 
        if (priv->tree) {
                g_object_remove_weak_pointer(G_OBJECT(priv->tree),
@@ -227,11 +229,12 @@ gb_tree_builder_get_property (GObject    *object,
                               GValue     *value,
                               GParamSpec *pspec)
 {
-       GbTreeBuilder *builder = GB_TREE_BUILDER(object);
+       GbTreeBuilder *builder = GB_TREE_BUILDER (object);
+       GbTreeBuilderPrivate *priv = gb_tree_builder_get_instance_private (builder);
 
        switch (prop_id) {
        case PROP_TREE:
-               g_value_set_object(value, builder->priv->tree);
+               g_value_set_object(value, priv->tree);
                break;
        default:
                G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
@@ -282,7 +285,6 @@ gb_tree_builder_class_init (GbTreeBuilderClass *klass)
        object_class->finalize = gb_tree_builder_finalize;
        object_class->get_property = gb_tree_builder_get_property;
        object_class->set_property = gb_tree_builder_set_property;
-       g_type_class_add_private(object_class, sizeof(GbTreeBuilderPrivate));
 
        gParamSpecs[PROP_TREE] =
                g_param_spec_object("tree",
@@ -306,8 +308,4 @@ gb_tree_builder_class_init (GbTreeBuilderClass *klass)
 static void
 gb_tree_builder_init (GbTreeBuilder *builder)
 {
-       builder->priv =
-               G_TYPE_INSTANCE_GET_PRIVATE(builder,
-                                           GB_TYPE_TREE_BUILDER,
-                                           GbTreeBuilderPrivate);
 }
diff --git a/src/tree/gb-tree-builder.h b/src/tree/gb-tree-builder.h
index 9e9c610..ee94972 100644
--- a/src/tree/gb-tree-builder.h
+++ b/src/tree/gb-tree-builder.h
@@ -26,26 +26,8 @@
 G_BEGIN_DECLS
 
 #define GB_TYPE_TREE_BUILDER            (gb_tree_builder_get_type())
-#define GB_TREE_BUILDER(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_TREE_BUILDER, 
GbTreeBuilder))
-#define GB_TREE_BUILDER_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_TREE_BUILDER, 
GbTreeBuilder const))
-#define GB_TREE_BUILDER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GB_TYPE_TREE_BUILDER, 
GbTreeBuilderClass))
-#define GB_IS_TREE_BUILDER(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_TREE_BUILDER))
-#define GB_IS_TREE_BUILDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GB_TYPE_TREE_BUILDER))
-#define GB_TREE_BUILDER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GB_TYPE_TREE_BUILDER, 
GbTreeBuilderClass))
 
-typedef struct _GbTreeBuilder        GbTreeBuilder;
-typedef struct _GbTreeBuilderClass   GbTreeBuilderClass;
-typedef struct _GbTreeBuilderPrivate GbTreeBuilderPrivate;
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GbTreeBuilder, g_object_unref)
-
-struct _GbTreeBuilder
-{
-       GInitiallyUnowned parent;
-
-       /*< private >*/
-       GbTreeBuilderPrivate *priv;
-};
+G_DECLARE_DERIVABLE_TYPE (GbTreeBuilder, gb_tree_builder, GB, TREE_BUILDER, GInitiallyUnowned)
 
 struct _GbTreeBuilderClass
 {
@@ -69,7 +51,6 @@ struct _GbTreeBuilderClass
 };
 
 GtkWidget *gb_tree_builder_get_tree        (GbTreeBuilder *builder);
-GType      gb_tree_builder_get_type        (void);
 void       gb_tree_builder_build_node      (GbTreeBuilder *builder,
                                             GbTreeNode    *node);
 gboolean   gb_tree_builder_node_activated  (GbTreeBuilder *builder,
diff --git a/src/tree/gb-tree-node.c b/src/tree/gb-tree-node.c
index 0b6d174..2684608 100644
--- a/src/tree/gb-tree-node.c
+++ b/src/tree/gb-tree-node.c
@@ -23,14 +23,16 @@
 #include "gb-tree.h"
 #include "gb-tree-node.h"
 
-struct _GbTreeNodePrivate
+struct _GbTreeNode
 {
-  GObject       *item;
-  GbTreeNode    *parent;
-  gchar         *text;
-  GbTree        *tree;
-  GQuark         icon_name;
-  guint          use_markup : 1;
+  GInitiallyUnowned  parent_instance;
+
+  GObject           *item;
+  GbTreeNode        *parent;
+  gchar             *text;
+  GbTree            *tree;
+  GQuark             icon_name;
+  guint              use_markup : 1;
 };
 
 typedef struct
@@ -39,7 +41,7 @@ typedef struct
   GtkPopover *popover;
 } PopupRequest;
 
-G_DEFINE_TYPE_WITH_PRIVATE (GbTreeNode, gb_tree_node, G_TYPE_INITIALLY_UNOWNED)
+G_DEFINE_TYPE (GbTreeNode, gb_tree_node, G_TYPE_INITIALLY_UNOWNED)
 
 enum {
   PROP_0,
@@ -84,9 +86,9 @@ gb_tree_node_get_tree (GbTreeNode *node)
 {
   g_return_val_if_fail (GB_IS_TREE_NODE (node), NULL);
 
-  for (; node->priv->parent; node = node->priv->parent) { }
+  for (; node->parent; node = node->parent) { }
 
-  return node->priv->tree;
+  return node->tree;
 }
 
 /**
@@ -102,10 +104,10 @@ _gb_tree_node_set_tree (GbTreeNode *node,
 {
   g_return_if_fail (GB_IS_TREE_NODE (node));
   g_return_if_fail (GB_IS_TREE (tree));
-  g_return_if_fail ((node->priv->tree == NULL) ||
-                    (node->priv->tree == tree));
+  g_return_if_fail ((node->tree == NULL) ||
+                    (node->tree == tree));
 
-  node->priv->tree = tree;
+  node->tree = tree;
 }
 
 /**
@@ -199,15 +201,15 @@ gb_tree_node_get_path (GbTreeNode *node)
 
   do
     list = g_list_prepend (list, node);
-  while ((node = node->priv->parent));
+  while ((node = node->parent));
 
   toplevel = list->data;
 
   g_assert (toplevel);
-  g_assert (toplevel->priv->tree);
+  g_assert (toplevel->tree);
 
   list = g_list_remove_link (list, list);
-  path = gb_tree_get_path (toplevel->priv->tree, list);
+  path = gb_tree_get_path (toplevel->tree, list);
 
   g_list_free (list);
 
@@ -227,7 +229,7 @@ gb_tree_node_get_parent (GbTreeNode *node)
 {
   g_return_val_if_fail (GB_IS_TREE_NODE (node), NULL);
 
-  return node->priv->parent;
+  return node->parent;
 }
 
 /**
@@ -240,7 +242,7 @@ gb_tree_node_get_icon_name (GbTreeNode *node)
 {
   g_return_val_if_fail (GB_IS_TREE_NODE (node), NULL);
 
-  return g_quark_to_string (node->priv->icon_name);
+  return g_quark_to_string (node->icon_name);
 }
 
 /**
@@ -257,7 +259,7 @@ gb_tree_node_set_icon_name (GbTreeNode  *node,
 {
   g_return_if_fail (GB_IS_TREE_NODE (node));
 
-  node->priv->icon_name = g_quark_from_string (icon_name);
+  node->icon_name = g_quark_from_string (icon_name);
   g_object_notify_by_pspec (G_OBJECT (node), gParamSpecs [PROP_ICON_NAME]);
 }
 
@@ -276,7 +278,7 @@ gb_tree_node_set_item (GbTreeNode *node,
   g_return_if_fail (GB_IS_TREE_NODE (node));
   g_return_if_fail (!item || G_IS_OBJECT (item));
 
-  if (g_set_object (&node->priv->item, item))
+  if (g_set_object (&node->item, item))
     g_object_notify_by_pspec (G_OBJECT (node), gParamSpecs [PROP_ITEM]);
 }
 
@@ -293,14 +295,14 @@ gb_tree_node_set_parent (GbTreeNode *node,
                          GbTreeNode *parent)
 {
   g_return_if_fail (GB_IS_TREE_NODE (node));
-  g_return_if_fail (node->priv->parent == NULL);
+  g_return_if_fail (node->parent == NULL);
   g_return_if_fail (!parent || GB_IS_TREE_NODE (parent));
 
   if (parent)
     {
-      node->priv->parent = parent;
-      g_object_add_weak_pointer (G_OBJECT (node->priv->parent),
-                                 (gpointer *)&node->priv->parent);
+      node->parent = parent;
+      g_object_add_weak_pointer (G_OBJECT (node->parent),
+                                 (gpointer *)&node->parent);
     }
 }
 
@@ -309,7 +311,7 @@ gb_tree_node_get_text (GbTreeNode *node)
 {
   g_return_val_if_fail (GB_IS_TREE_NODE (node), NULL);
 
-  return node->priv->text;
+  return node->text;
 }
 
 /**
@@ -326,10 +328,10 @@ gb_tree_node_set_text (GbTreeNode  *node,
 {
   g_return_if_fail (GB_IS_TREE_NODE (node));
 
-  if (text != node->priv->text)
+  if (text != node->text)
     {
-      g_free (node->priv->text);
-      node->priv->text = g_strdup (text);
+      g_free (node->text);
+      node->text = g_strdup (text);
       g_object_notify_by_pspec (G_OBJECT (node), gParamSpecs [PROP_TEXT]);
     }
 }
@@ -347,7 +349,7 @@ gb_tree_node_set_use_markup (GbTreeNode *node,
 {
   g_return_if_fail (GB_IS_TREE_NODE (node));
 
-  node->priv->use_markup = !!use_markup;
+  node->use_markup = !!use_markup;
   g_object_notify_by_pspec (G_OBJECT (node), gParamSpecs [PROP_USE_MARKUP]);
 }
 
@@ -364,7 +366,7 @@ gb_tree_node_get_item (GbTreeNode *node)
 {
   g_return_val_if_fail (GB_IS_TREE_NODE (node), NULL);
 
-  return node->priv->item;
+  return node->item;
 }
 
 void
@@ -470,16 +472,16 @@ gb_tree_node_get_expanded (GbTreeNode *self)
 static void
 gb_tree_node_finalize (GObject *object)
 {
-  GbTreeNodePrivate *priv = GB_TREE_NODE (object)->priv;
+  GbTreeNode *self = GB_TREE_NODE (object);
 
-  g_clear_object (&priv->item);
-  g_clear_pointer (&priv->text, g_free);
+  g_clear_object (&self->item);
+  g_clear_pointer (&self->text, g_free);
 
-  if (priv->parent)
+  if (self->parent)
     {
-      g_object_remove_weak_pointer (G_OBJECT (priv->parent),
-                                    (gpointer *)&priv->parent);
-      priv->parent = NULL;
+      g_object_remove_weak_pointer (G_OBJECT (self->parent),
+                                    (gpointer *)&self->parent);
+      self->parent = NULL;
     }
 
   G_OBJECT_CLASS (gb_tree_node_parent_class)->finalize (object);
@@ -505,19 +507,19 @@ gb_tree_node_get_property (GObject    *object,
   switch (prop_id)
     {
     case PROP_ICON_NAME:
-      g_value_set_string (value, g_quark_to_string (node->priv->icon_name));
+      g_value_set_string (value, g_quark_to_string (node->icon_name));
       break;
 
     case PROP_ITEM:
-      g_value_set_object (value, node->priv->item);
+      g_value_set_object (value, node->item);
       break;
 
     case PROP_PARENT:
-      g_value_set_object (value, node->priv->parent);
+      g_value_set_object (value, node->parent);
       break;
 
     case PROP_TEXT:
-      g_value_set_string (value, node->priv->text);
+      g_value_set_string (value, node->text);
       break;
 
     case PROP_TREE:
@@ -525,7 +527,7 @@ gb_tree_node_get_property (GObject    *object,
       break;
 
     case PROP_USE_MARKUP:
-      g_value_set_boolean (value, node->priv->use_markup);
+      g_value_set_boolean (value, node->use_markup);
       break;
 
     default:
@@ -676,7 +678,6 @@ gb_tree_node_class_init (GbTreeNodeClass *klass)
 static void
 gb_tree_node_init (GbTreeNode *node)
 {
-  node->priv = gb_tree_node_get_instance_private (node);
 }
 
 static gboolean
diff --git a/src/tree/gb-tree-node.h b/src/tree/gb-tree-node.h
index be4eeb7..52c56fe 100644
--- a/src/tree/gb-tree-node.h
+++ b/src/tree/gb-tree-node.h
@@ -21,38 +21,12 @@
 
 #include <gtk/gtk.h>
 
-#if 0
-#include "gb-project-item.h"
-#endif
-
 G_BEGIN_DECLS
 
 #define GB_TYPE_TREE_NODE            (gb_tree_node_get_type())
-#define GB_TREE_NODE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_TREE_NODE, GbTreeNode))
-#define GB_TREE_NODE_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_TREE_NODE, GbTreeNode 
const))
-#define GB_TREE_NODE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GB_TYPE_TREE_NODE, GbTreeNodeClass))
-#define GB_IS_TREE_NODE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_TREE_NODE))
-#define GB_IS_TREE_NODE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GB_TYPE_TREE_NODE))
-#define GB_TREE_NODE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GB_TYPE_TREE_NODE, GbTreeNodeClass))
-
-typedef struct _GbTreeNode        GbTreeNode;
-typedef struct _GbTreeNodeClass   GbTreeNodeClass;
-typedef struct _GbTreeNodePrivate GbTreeNodePrivate;
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GbTreeNode, g_object_unref)
-
-struct _GbTreeNode
-{
-       GInitiallyUnowned parent;
-
-       /*< private >*/
-       GbTreeNodePrivate *priv;
-};
 
-struct _GbTreeNodeClass
-{
-       GInitiallyUnownedClass parent_class;
-};
+G_DECLARE_FINAL_TYPE (GbTreeNode, gb_tree_node,
+                      GB, TREE_NODE, GInitiallyUnowned)
 
 GbTreeNode    *gb_tree_node_new           (void);
 void           gb_tree_node_append        (GbTreeNode   *node,
@@ -61,7 +35,6 @@ const gchar   *gb_tree_node_get_icon_name (GbTreeNode   *node);
 GObject       *gb_tree_node_get_item      (GbTreeNode   *node);
 GbTreeNode    *gb_tree_node_get_parent    (GbTreeNode   *node);
 GtkTreePath   *gb_tree_node_get_path      (GbTreeNode   *node);
-GType          gb_tree_node_get_type      (void);
 void           gb_tree_node_prepend       (GbTreeNode  *node,
                                            GbTreeNode   *child);
 void           gb_tree_node_remove        (GbTreeNode   *node,
diff --git a/src/tree/gb-tree.c b/src/tree/gb-tree.c
index 9ee3b28..bca3f2d 100644
--- a/src/tree/gb-tree.c
+++ b/src/tree/gb-tree.c
@@ -25,7 +25,7 @@
 #include "gb-tree-node.h"
 #include "gb-widget.h"
 
-struct _GbTreePrivate
+typedef struct
 {
   GPtrArray         *builders;
   GbTreeNode        *root;
@@ -36,7 +36,7 @@ struct _GbTreePrivate
   GtkTreeStore      *store;
   guint              show_icons : 1;
   guint              building;
-};
+} GbTreePrivate;
 
 typedef struct
 {
@@ -70,23 +70,27 @@ static guint gSignals [LAST_SIGNAL];
 gboolean
 gb_tree_get_show_icons (GbTree *tree)
 {
+  GbTreePrivate *priv = gb_tree_get_instance_private (tree);
+
   g_return_val_if_fail (GB_IS_TREE (tree), FALSE);
 
-  return tree->priv->show_icons;
+  return priv->show_icons;
 }
 
 void
 gb_tree_set_show_icons (GbTree   *tree,
                         gboolean  show_icons)
 {
+  GbTreePrivate *priv = gb_tree_get_instance_private (tree);
+
   g_return_if_fail (GB_IS_TREE (tree));
 
   show_icons = !!show_icons;
 
-  if (show_icons != tree->priv->show_icons)
+  if (show_icons != priv->show_icons)
     {
-      tree->priv->show_icons = show_icons;
-      g_object_set (tree->priv->cell_pixbuf, "visible", show_icons, NULL);
+      priv->show_icons = show_icons;
+      g_object_set (priv->cell_pixbuf, "visible", show_icons, NULL);
       /*
        * WORKAROUND:
        *
@@ -94,8 +98,8 @@ gb_tree_set_show_icons (GbTree   *tree,
        * tree view. So to force it, we will hide/show our entire pixbuf/text
        * column.
        */
-      gtk_tree_view_column_set_visible (tree->priv->column, FALSE);
-      gtk_tree_view_column_set_visible (tree->priv->column, TRUE);
+      gtk_tree_view_column_set_visible (priv->column, FALSE);
+      gtk_tree_view_column_set_visible (priv->column, TRUE);
       g_object_notify_by_pspec (G_OBJECT (tree),
                                 gParamSpecs [PROP_SHOW_ICONS]);
     }
@@ -134,16 +138,14 @@ gb_tree_select (GbTree     *tree,
                 GbTreeNode *node)
 {
   GtkTreeSelection *selection;
-  GbTreePrivate *priv;
   GtkTreePath *path;
+  GbTreePrivate *priv = gb_tree_get_instance_private (tree);
 
   IDE_ENTRY;
 
   g_return_if_fail (GB_IS_TREE (tree));
   g_return_if_fail (GB_IS_TREE_NODE (node));
 
-  priv = tree->priv;
-
   if (priv->selection)
     {
       gb_tree_unselect (tree);
@@ -168,6 +170,7 @@ gb_tree_get_row_height (GbTree *tree)
   gint pix_nat_height;
   gint text_min_height;
   gint text_nat_height;
+  GbTreePrivate *priv = gb_tree_get_instance_private (tree);
 
   /*
    * TODO:
@@ -178,11 +181,11 @@ gb_tree_get_row_height (GbTree *tree)
 
   g_assert (GB_IS_TREE (tree));
 
-  gtk_cell_renderer_get_preferred_height (tree->priv->cell_pixbuf,
+  gtk_cell_renderer_get_preferred_height (priv->cell_pixbuf,
                                           GTK_WIDGET (tree),
                                           &pix_min_height,
                                           &pix_nat_height);
-  gtk_cell_renderer_get_preferred_height (tree->priv->cell_text,
+  gtk_cell_renderer_get_preferred_height (priv->cell_text,
                                           GTK_WIDGET (tree),
                                           &text_min_height,
                                           &text_nat_height);
@@ -247,17 +250,18 @@ gb_tree_create_menu (GbTree     *self,
 {
   GMenu *menu;
   guint i;
+  GbTreePrivate *priv = gb_tree_get_instance_private (self);
 
   g_return_val_if_fail (GB_IS_TREE (self), NULL);
   g_return_val_if_fail (GB_IS_TREE_NODE (node), NULL);
 
   menu = g_menu_new ();
 
-  for (i = 0; i < self->priv->builders->len; i++)
+  for (i = 0; i < priv->builders->len; i++)
     {
       GbTreeBuilder *builder;
 
-      builder = g_ptr_array_index (self->priv->builders, i);
+      builder = g_ptr_array_index (priv->builders, i);
       gb_tree_builder_node_popup (builder, node, menu);
     }
 
@@ -352,21 +356,19 @@ static void
 gb_tree_selection_changed (GbTree           *tree,
                            GtkTreeSelection *selection)
 {
-  GbTreePrivate *priv;
   GbTreeBuilder *builder;
   GtkTreeModel *model;
   GtkTreeIter iter;
   GbTreeNode *node;
   GbTreeNode *unselection;
   gint i;
+  GbTreePrivate *priv = gb_tree_get_instance_private (tree);
 
   IDE_ENTRY;
 
   g_return_if_fail (GB_IS_TREE (tree));
   g_return_if_fail (GTK_IS_TREE_SELECTION (selection));
 
-  priv = tree->priv;
-
   if ((unselection = priv->selection))
     {
       priv->selection = NULL;
@@ -449,16 +451,15 @@ gb_tree_get_iter_for_node (GbTree      *tree,
                            GtkTreeIter *iter,
                            GbTreeNode  *node)
 {
-  GbTreePrivate *priv;
   GtkTreeModel *model;
   GbTreeNode *that = NULL;
   gboolean ret;
+  GbTreePrivate *priv = gb_tree_get_instance_private (tree);
 
   g_return_val_if_fail (GB_IS_TREE (tree), FALSE);
   g_return_val_if_fail (iter != NULL, FALSE);
   g_return_val_if_fail (GB_IS_TREE_NODE (node), FALSE);
 
-  priv = tree->priv;
   model = GTK_TREE_MODEL (priv->store);
 
   if (parent)
@@ -497,15 +498,14 @@ GtkTreePath *
 gb_tree_get_path (GbTree *tree,
                   GList  *list)
 {
-  GbTreePrivate *priv;
   GtkTreeModel *model;
   GtkTreeIter iter;
   GtkTreeIter old_iter;
   GtkTreeIter *parent = NULL;
+  GbTreePrivate *priv = gb_tree_get_instance_private (tree);
 
   g_return_val_if_fail (GB_IS_TREE (tree), NULL);
 
-  priv = tree->priv;
   model = GTK_TREE_MODEL (priv->store);
 
   if (!list || !gtk_tree_model_get_iter_first (model, &iter))
@@ -644,16 +644,14 @@ void
 gb_tree_add_builder (GbTree        *tree,
                      GbTreeBuilder *builder)
 {
-  GbTreePrivate *priv;
   GtkTreeIter iter;
+  GbTreePrivate *priv = gb_tree_get_instance_private (tree);
 
   IDE_ENTRY;
 
   g_return_if_fail (GB_IS_TREE (tree));
   g_return_if_fail (GB_IS_TREE_BUILDER (builder));
 
-  priv = tree->priv;
-
   g_object_set (builder, "tree", tree, NULL);
   g_ptr_array_add (priv->builders, g_object_ref_sink (builder));
 
@@ -681,6 +679,8 @@ void
 gb_tree_remove_builder (GbTree        *tree,
                         GbTreeBuilder *builder)
 {
+  GbTreePrivate *priv = gb_tree_get_instance_private (tree);
+
   IDE_ENTRY;
 
   g_return_if_fail (GB_IS_TREE (tree));
@@ -689,7 +689,7 @@ gb_tree_remove_builder (GbTree        *tree,
   if (GB_TREE_BUILDER_GET_CLASS (builder)->removed)
     GB_TREE_BUILDER_GET_CLASS (builder)->removed (builder, GTK_WIDGET (tree));
 
-  g_ptr_array_remove (tree->priv->builders, builder);
+  g_ptr_array_remove (priv->builders, builder);
 
   IDE_EXIT;
 }
@@ -705,9 +705,11 @@ gb_tree_remove_builder (GbTree        *tree,
 GbTreeNode *
 gb_tree_get_root (GbTree *tree)
 {
+  GbTreePrivate *priv = gb_tree_get_instance_private (tree);
+
   g_return_val_if_fail (GB_IS_TREE (tree), NULL);
 
-  return tree->priv->root;
+  return priv->root;
 }
 
 /**
@@ -723,16 +725,14 @@ void
 gb_tree_set_root (GbTree     *tree,
                   GbTreeNode *root)
 {
-  GbTreePrivate *priv;
   GbTreeBuilder *builder;
   gint i;
+  GbTreePrivate *priv = gb_tree_get_instance_private (tree);
 
   IDE_ENTRY;
 
   g_return_if_fail (GB_IS_TREE (tree));
 
-  priv = tree->priv;
-
   gtk_tree_store_clear (priv->store);
   g_clear_object (&priv->root);
 
@@ -753,14 +753,12 @@ gb_tree_set_root (GbTree     *tree,
 void
 gb_tree_rebuild (GbTree *tree)
 {
-  GbTreePrivate *priv;
   GbTreeNode *root;
   GtkTreeSelection *selection;
+  GbTreePrivate *priv = gb_tree_get_instance_private (tree);
 
   g_return_if_fail (GB_IS_TREE (tree));
 
-  priv = tree->priv;
-
   /* avoid dealign with selection changes while rebuilding */
   selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree));
   gtk_tree_selection_unselect_all (selection);
@@ -841,19 +839,17 @@ gb_tree_add (GbTree     *tree,
              GbTreeNode *child,
              gboolean    prepend)
 {
-  GbTreePrivate *priv;
   GbTreeBuilder *builder;
   GtkTreePath *path;
   GtkTreeIter iter;
   GtkTreeIter that;
   gint i;
+  GbTreePrivate *priv = gb_tree_get_instance_private (tree);
 
   g_return_if_fail (GB_IS_TREE (tree));
   g_return_if_fail (GB_IS_TREE_NODE (node));
   g_return_if_fail (GB_IS_TREE_NODE (child));
 
-  priv = tree->priv;
-
   g_object_set (child, "parent", node, NULL);
 
   if ((path = gb_tree_node_get_path (node)))
@@ -937,18 +933,17 @@ gb_tree_row_activated (GtkTreeView *tree_view,
                        GtkTreePath *path)
 {
   GbTreeBuilder *builder;
-  GbTreePrivate *priv;
   GtkTreeModel *model;
   GtkTreeIter iter;
   GbTreeNode *node = NULL;
   gboolean handled = FALSE;
   GbTree *tree = (GbTree *) tree_view;
   gint i;
+  GbTreePrivate *priv = gb_tree_get_instance_private (tree);
 
   g_return_if_fail (GB_IS_TREE (tree));
   g_return_if_fail (path != NULL);
 
-  priv = tree->priv;
   model = GTK_TREE_MODEL (priv->store);
 
   if (gtk_tree_model_get_iter (model, &iter, path))
@@ -978,16 +973,14 @@ gb_tree_button_press_event (GbTree         *tree,
                             gpointer        user_data)
 {
   GtkAllocation alloc;
-  GbTreePrivate *priv;
   GtkTreePath *tree_path = NULL;
   GtkTreeIter iter;
   GbTreeNode *node = NULL;
   gint cell_y;
+  GbTreePrivate *priv = gb_tree_get_instance_private (tree);
 
   g_return_val_if_fail (GB_IS_TREE (tree), FALSE);
 
-  priv = tree->priv;
-
   if ((button->type == GDK_BUTTON_PRESS) &&
       (button->button == GDK_BUTTON_SECONDARY))
     {
@@ -1186,7 +1179,8 @@ gb_tree_default_search_equal_func (GtkTreeModel *model,
 static void
 gb_tree_finalize (GObject *object)
 {
-  GbTreePrivate *priv = GB_TREE (object)->priv;
+  GbTree *tree = GB_TREE (object);
+  GbTreePrivate *priv = gb_tree_get_instance_private (tree);
 
   g_ptr_array_unref (priv->builders);
   g_clear_object (&priv->store);
@@ -1211,19 +1205,20 @@ gb_tree_get_property (GObject    *object,
                       GParamSpec *pspec)
 {
   GbTree *tree = GB_TREE (object);
+  GbTreePrivate *priv = gb_tree_get_instance_private (tree);
 
   switch (prop_id)
     {
     case PROP_ROOT:
-      g_value_set_object (value, tree->priv->root);
+      g_value_set_object (value, priv->root);
       break;
 
     case PROP_SELECTION:
-      g_value_set_object (value, tree->priv->selection);
+      g_value_set_object (value, priv->selection);
       break;
 
     case PROP_SHOW_ICONS:
-      g_value_set_boolean (value, tree->priv->show_icons);
+      g_value_set_boolean (value, priv->show_icons);
       break;
 
     default:
@@ -1348,12 +1343,11 @@ gb_tree_init (GbTree *tree)
   GtkTreeSelection *selection;
   GtkCellRenderer *cell;
   GtkCellLayout *column;
+  GbTreePrivate *priv = gb_tree_get_instance_private (tree);
 
-  tree->priv = gb_tree_get_instance_private (tree);
-
-  tree->priv->builders = g_ptr_array_new ();
-  g_ptr_array_set_free_func (tree->priv->builders, g_object_unref);
-  tree->priv->store = gtk_tree_store_new (1, GB_TYPE_TREE_NODE);
+  priv->builders = g_ptr_array_new ();
+  g_ptr_array_set_free_func (priv->builders, g_object_unref);
+  priv->store = gtk_tree_store_new (1, GB_TYPE_TREE_NODE);
 
   selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (tree));
   g_signal_connect_swapped (selection, "changed",
@@ -1363,13 +1357,13 @@ gb_tree_init (GbTree *tree)
   column = g_object_new (GTK_TYPE_TREE_VIEW_COLUMN,
                          "title", "Node",
                          NULL);
-  tree->priv->column = GTK_TREE_VIEW_COLUMN (column);
+  priv->column = GTK_TREE_VIEW_COLUMN (column);
 
   cell = g_object_new (GTK_TYPE_CELL_RENDERER_PIXBUF,
                        "xpad", 3,
-                       "visible", tree->priv->show_icons,
+                       "visible", priv->show_icons,
                        NULL);
-  tree->priv->cell_pixbuf = cell;
+  priv->cell_pixbuf = cell;
   g_object_bind_property (tree, "show-icons", cell, "visible", 0);
   gtk_cell_layout_pack_start (column, cell, FALSE);
   gtk_cell_layout_set_cell_data_func (column, cell, pixbuf_func, NULL, NULL);
@@ -1377,7 +1371,7 @@ gb_tree_init (GbTree *tree)
   cell = g_object_new (GTK_TYPE_CELL_RENDERER_TEXT,
                        "ellipsize", PANGO_ELLIPSIZE_NONE,
                        NULL);
-  tree->priv->cell_text = cell;
+  priv->cell_text = cell;
   gtk_cell_layout_pack_start (column, cell, TRUE);
   gtk_cell_layout_set_cell_data_func (column, cell, text_func, NULL, NULL);
 
@@ -1385,7 +1379,7 @@ gb_tree_init (GbTree *tree)
                                GTK_TREE_VIEW_COLUMN (column));
 
   gtk_tree_view_set_model (GTK_TREE_VIEW (tree),
-                           GTK_TREE_MODEL (tree->priv->store));
+                           GTK_TREE_MODEL (priv->store));
 
   gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW (tree),
                                        gb_tree_default_search_equal_func,
diff --git a/src/tree/gb-tree.h b/src/tree/gb-tree.h
index fdf5622..3c8720a 100644
--- a/src/tree/gb-tree.h
+++ b/src/tree/gb-tree.h
@@ -26,27 +26,9 @@
 
 G_BEGIN_DECLS
 
-#define GB_TYPE_TREE            (gb_tree_get_type())
-#define GB_TREE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_TREE, GbTree))
-#define GB_TREE_CONST(obj)      (G_TYPE_CHECK_INSTANCE_CAST ((obj), GB_TYPE_TREE, GbTree const))
-#define GB_TREE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GB_TYPE_TREE, GbTreeClass))
-#define GB_IS_TREE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GB_TYPE_TREE))
-#define GB_IS_TREE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  GB_TYPE_TREE))
-#define GB_TREE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  GB_TYPE_TREE, GbTreeClass))
+#define GB_TYPE_TREE (gb_tree_get_type())
 
-typedef struct _GbTree        GbTree;
-typedef struct _GbTreeClass   GbTreeClass;
-typedef struct _GbTreePrivate GbTreePrivate;
-
-G_DEFINE_AUTOPTR_CLEANUP_FUNC (GbTree, g_object_unref)
-
-struct _GbTree
-{
-       GtkTreeView parent;
-
-       /*< private >*/
-       GbTreePrivate *priv;
-};
+G_DECLARE_DERIVABLE_TYPE (GbTree, gb_tree, GB, TREE, GtkTreeView)
 
 struct _GbTreeClass
 {
@@ -65,7 +47,6 @@ void          gb_tree_add_builder    (GbTree        *tree,
 GtkTreePath  *gb_tree_get_path       (GbTree        *tree,
                                       GList         *list);
 GbTreeNode   *gb_tree_get_selected   (GbTree        *tree);
-GType         gb_tree_get_type       (void);
 void          gb_tree_rebuild        (GbTree        *tree);
 void          gb_tree_remove_builder (GbTree        *tree,
                                       GbTreeBuilder *builder);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]