diff --git a/ChangeLog b/ChangeLog
index 91c34d4aa2fc4f7cb440130d7889710a43f38b72..dee3033ab19231e5b4b8660f5c65e8432f00306d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2005-11-22	Benedikt Meurer <benny@xfce.org>
+
+	* thunar-vfs/*.{c,h}, thunar/*.c, thunarx/*.c: Avoid duplicating static
+	  strings if possible.
+	* thunar-vfs/thunar-vfs-scandir.c(thunar_vfs_scandir_collect): Ignore
+	  EACCES and EPERM on subdirectories with recursive scanning.
+	* thunar-vfs/thunar-vfs-info.h(ThunarVfsInfo): Compress "type", "mode"
+	  and "flags" to reduce memory overhead.
+
 2005-11-22	Benedikt Meurer <benny@xfce.org>
 
 	* configure.in.in: Add fr and pt_BR to gettext linguas, which were
diff --git a/thunar-vfs/thunar-vfs-info.c b/thunar-vfs/thunar-vfs-info.c
index 0a25c48f19fcfb2dfd761b6e11fcbdb00132e21c..fbc707faaade1948a78d0c23140e1d949a5898fa 100644
--- a/thunar-vfs/thunar-vfs-info.c
+++ b/thunar-vfs/thunar-vfs-info.c
@@ -85,7 +85,7 @@ thunar_vfs_info_get_type (void)
 
   if (G_UNLIKELY (type == G_TYPE_INVALID))
     {
-      type = g_boxed_type_register_static ("ThunarVfsInfo",
+      type = g_boxed_type_register_static (I_("ThunarVfsInfo"),
                                            (GBoxedCopyFunc) thunar_vfs_info_ref,
                                            (GBoxedFreeFunc) thunar_vfs_info_unref);
     }
diff --git a/thunar-vfs/thunar-vfs-info.h b/thunar-vfs/thunar-vfs-info.h
index c1ce4fbdc18f3d643ca4ef5988367bc55e1e139e..1146c1fb1c3f41872ab120dd80a833b7c6aed814 100644
--- a/thunar-vfs/thunar-vfs-info.h
+++ b/thunar-vfs/thunar-vfs-info.h
@@ -42,13 +42,13 @@ typedef struct _ThunarVfsInfo ThunarVfsInfo;
 struct _ThunarVfsInfo
 {
   /* File type */
-  ThunarVfsFileType type;
+  ThunarVfsFileType type : 8;
 
   /* File permissions and special mode flags */
-  ThunarVfsFileMode mode;
+  ThunarVfsFileMode mode : 12;
 
   /* File flags */
-  ThunarVfsFileFlags flags;
+  ThunarVfsFileFlags flags : 12;
 
   /* Owner's user id */
   ThunarVfsUserId uid;
diff --git a/thunar-vfs/thunar-vfs-interactive-job.c b/thunar-vfs/thunar-vfs-interactive-job.c
index 55a4b3f18302ffb8a4fe503ef853b9f31b272f6e..ab6069c33c623ec55926df22d7423c2e7ffc32f0 100644
--- a/thunar-vfs/thunar-vfs-interactive-job.c
+++ b/thunar-vfs/thunar-vfs-interactive-job.c
@@ -56,11 +56,37 @@ static ThunarVfsInteractiveJobResponse thunar_vfs_interactive_job_ask        (Th
 
 
 
-static guint interactive_signals[LAST_SIGNAL];
+static GObjectClass *thunar_vfs_interactive_job_parent_class;
+static guint         interactive_signals[LAST_SIGNAL];
 
 
 
-G_DEFINE_ABSTRACT_TYPE (ThunarVfsInteractiveJob, thunar_vfs_interactive_job, THUNAR_VFS_TYPE_JOB);
+GType
+thunar_vfs_interactive_job_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarVfsInteractiveJobClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_vfs_interactive_job_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarVfsInteractiveJob),
+        0,
+        (GInstanceInitFunc) thunar_vfs_interactive_job_init,
+        NULL,
+      };
+
+      type = g_type_register_static (THUNAR_VFS_TYPE_JOB, I_("ThunarVfsInteractiveJob"), &info, G_TYPE_FLAG_ABSTRACT);
+    }
+
+  return type;
+}
 
 
 
@@ -81,6 +107,9 @@ thunar_vfs_interactive_job_class_init (ThunarVfsInteractiveJobClass *klass)
 {
   GObjectClass *gobject_class;
 
+  /* determine the parent type class */
+  thunar_vfs_interactive_job_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = thunar_vfs_interactive_job_finalize;
 
@@ -97,7 +126,7 @@ thunar_vfs_interactive_job_class_init (ThunarVfsInteractiveJobClass *klass)
    * Return value: the selected choice.
    **/
   interactive_signals[ASK] =
-    g_signal_new ("ask",
+    g_signal_new (I_("ask"),
                   G_TYPE_FROM_CLASS (klass),
                   G_SIGNAL_NO_HOOKS | G_SIGNAL_RUN_LAST,
                   G_STRUCT_OFFSET (ThunarVfsInteractiveJobClass, ask),
@@ -118,7 +147,7 @@ thunar_vfs_interactive_job_class_init (ThunarVfsInteractiveJobClass *klass)
    * the application on creation of the @job.
    **/
   interactive_signals[NEW_FILES] =
-    g_signal_new ("new-files",
+    g_signal_new (I_("new-files"),
                   G_TYPE_FROM_CLASS (klass),
                   G_SIGNAL_NO_HOOKS, 0, NULL, NULL,
                   g_cclosure_marshal_VOID__POINTER,
@@ -138,7 +167,7 @@ thunar_vfs_interactive_job_class_init (ThunarVfsInteractiveJobClass *klass)
    * box.
    **/
   interactive_signals[INFO_MESSAGE] =
-    g_signal_new ("info-message",
+    g_signal_new (I_("info-message"),
                   G_TYPE_FROM_CLASS (klass),
                   G_SIGNAL_NO_HOOKS, 0, NULL, NULL,
                   g_cclosure_marshal_VOID__STRING,
@@ -153,7 +182,7 @@ thunar_vfs_interactive_job_class_init (ThunarVfsInteractiveJobClass *klass)
    * of the overall progress.
    **/
   interactive_signals[PERCENT] =
-    g_signal_new ("percent",
+    g_signal_new (I_("percent"),
                   G_TYPE_FROM_CLASS (klass),
                   G_SIGNAL_NO_HOOKS, 0, NULL, NULL,
                   g_cclosure_marshal_VOID__DOUBLE,
diff --git a/thunar-vfs/thunar-vfs-job.c b/thunar-vfs/thunar-vfs-job.c
index 5125c42b1698f9632cbb0b1287af4bc7b4a88610..dd5dfc9ba71e54d6e2fe1ea516716c938fc8fab8 100644
--- a/thunar-vfs/thunar-vfs-job.c
+++ b/thunar-vfs/thunar-vfs-job.c
@@ -36,7 +36,7 @@
 
 #include <thunar-vfs/thunar-vfs-alias.h>
 
-#include <gdk/gdk.h>
+#include <exo/exo.h>
 
 
 
@@ -113,7 +113,7 @@ thunar_vfs_job_get_type (void)
         NULL,
       };
 
-      type = g_type_register_static (G_TYPE_OBJECT, "ThunarVfsJob", &info, G_TYPE_FLAG_ABSTRACT);
+      type = g_type_register_static (G_TYPE_OBJECT, I_("ThunarVfsJob"), &info, G_TYPE_FLAG_ABSTRACT);
     }
 
   return type;
@@ -144,7 +144,7 @@ thunar_vfs_job_class_init (ThunarVfsJobClass *klass)
    * @job.
    **/
   job_signals[ERROR] =
-    g_signal_new ("error",
+    g_signal_new (I_("error"),
                   G_TYPE_FROM_CLASS (klass),
                   G_SIGNAL_NO_HOOKS, 0, NULL, NULL,
                   g_cclosure_marshal_VOID__POINTER,
@@ -160,7 +160,7 @@ thunar_vfs_job_class_init (ThunarVfsJobClass *klass)
    * user.
    **/
   job_signals[FINISHED] =
-    g_signal_new ("finished",
+    g_signal_new (I_("finished"),
                   G_TYPE_FROM_CLASS (klass),
                   G_SIGNAL_NO_HOOKS, 0, NULL, NULL,
                   g_cclosure_marshal_VOID__VOID,
diff --git a/thunar-vfs/thunar-vfs-link-job.c b/thunar-vfs/thunar-vfs-link-job.c
index 66f7962a6a567a5736f5d2025a3f78a262a1696c..e329ec075879634d37be1baa71ccba257938bfa5 100644
--- a/thunar-vfs/thunar-vfs-link-job.c
+++ b/thunar-vfs/thunar-vfs-link-job.c
@@ -89,7 +89,7 @@ thunar_vfs_link_job_get_type (void)
       };
 
       type = g_type_register_static (THUNAR_VFS_TYPE_INTERACTIVE_JOB,
-                                     "ThunarVfsLinkJob", &info, 0);
+                                     I_("ThunarVfsLinkJob"), &info, 0);
     }
 
   return type;
diff --git a/thunar-vfs/thunar-vfs-listdir-job.c b/thunar-vfs/thunar-vfs-listdir-job.c
index f7606d1dc5526b12d4f175450c8c4f661f2bdd50..15390dd29bbf665a6ac2bc357781c646598d72bf 100644
--- a/thunar-vfs/thunar-vfs-listdir-job.c
+++ b/thunar-vfs/thunar-vfs-listdir-job.c
@@ -102,7 +102,7 @@ thunar_vfs_listdir_job_get_type (void)
       };
 
       type = g_type_register_static (THUNAR_VFS_TYPE_JOB,
-                                     "ThunarVfsListdirJob",
+                                     I_("ThunarVfsListdirJob"),
                                      &info, 0);
     }
 
@@ -134,7 +134,7 @@ thunar_vfs_listdir_job_class_init (ThunarVfsJobClass *klass)
    * to be never emitted with an @infos parameter of %NULL.
    **/
   listdir_signals[INFOS_READY] =
-    g_signal_new ("infos-ready",
+    g_signal_new (I_("infos-ready"),
                   G_TYPE_FROM_CLASS (klass),
                   G_SIGNAL_NO_HOOKS, 0, NULL, NULL,
                   g_cclosure_marshal_VOID__POINTER,
@@ -349,3 +349,6 @@ thunar_vfs_listdir_job_new (ThunarVfsPath *folder_path)
 }
 
 
+
+#define __THUNAR_VFS_LISTDIR_JOB_C__
+#include <thunar-vfs/thunar-vfs-aliasdef.c>
diff --git a/thunar-vfs/thunar-vfs-mime-application.c b/thunar-vfs/thunar-vfs-mime-application.c
index 71e6ecf4836306ea353546aec07f410c87fd6a36..7df9d57647b8d15b4cbfc2d26614a96c7337bd03 100644
--- a/thunar-vfs/thunar-vfs-mime-application.c
+++ b/thunar-vfs/thunar-vfs-mime-application.c
@@ -67,7 +67,7 @@ thunar_vfs_mime_application_get_type (void)
 
   if (G_UNLIKELY (type == G_TYPE_INVALID))
     {
-      type = g_boxed_type_register_static ("ThunarVfsMimeApplication",
+      type = g_boxed_type_register_static (I_("ThunarVfsMimeApplication"),
                                            (GBoxedCopyFunc) thunar_vfs_mime_application_ref,
                                            (GBoxedFreeFunc) thunar_vfs_mime_application_unref);
     }
diff --git a/thunar-vfs/thunar-vfs-mime-cache.c b/thunar-vfs/thunar-vfs-mime-cache.c
index 6e5f573bacffebaf707647f443a582833c2c5441..59a1429381a16b41c9f28f28da7c735b2ab12f78 100644
--- a/thunar-vfs/thunar-vfs-mime-cache.c
+++ b/thunar-vfs/thunar-vfs-mime-cache.c
@@ -52,6 +52,7 @@
 #endif
 
 #include <thunar-vfs/thunar-vfs-mime-cache.h>
+#include <thunar-vfs/thunar-vfs-alias.h>
 
 #if GLIB_CHECK_VERSION(2,6,0)
 #include <glib/gstdio.h>
@@ -134,7 +135,8 @@ thunar_vfs_mime_cache_get_type (void)
       };
 
       type = g_type_register_static (THUNAR_VFS_TYPE_MIME_PROVIDER,
-                                     "ThunarVfsMimeCache", &info, 0);
+                                     I_("ThunarVfsMimeCache"),
+                                     &info, 0);
     }
 
   return type;
diff --git a/thunar-vfs/thunar-vfs-mime-database.c b/thunar-vfs/thunar-vfs-mime-database.c
index 1a16eb07d1b583dbbff15fe94ee8ee08307677f6..7697f39b21dcbaeb2519989d0a3d7f45a073a463 100644
--- a/thunar-vfs/thunar-vfs-mime-database.c
+++ b/thunar-vfs/thunar-vfs-mime-database.c
@@ -170,7 +170,36 @@ struct _ThunarVfsMimeProviderData
 
 
 
-G_DEFINE_TYPE (ThunarVfsMimeDatabase, thunar_vfs_mime_database, G_TYPE_OBJECT);
+static GObjectClass *thunar_vfs_mime_database_parent_class;
+
+
+
+GType
+thunar_vfs_mime_database_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarVfsMimeDatabaseClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_vfs_mime_database_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarVfsMimeDatabase),
+        0,
+        (GInstanceInitFunc) thunar_vfs_mime_database_init,
+        NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_OBJECT, I_("ThunarVfsMimeDatabase"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -179,6 +208,9 @@ thunar_vfs_mime_database_class_init (ThunarVfsMimeDatabaseClass *klass)
 {
   GObjectClass *gobject_class;
 
+  /* determine the parent type class */
+  thunar_vfs_mime_database_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = thunar_vfs_mime_database_finalize;
 }
diff --git a/thunar-vfs/thunar-vfs-mime-info.c b/thunar-vfs/thunar-vfs-mime-info.c
index 62eb3b45f725ea05684930dea3e464bd1775519c..4c1de3723c638ed28aae0c3fed2be75a17f9cc42 100644
--- a/thunar-vfs/thunar-vfs-mime-info.c
+++ b/thunar-vfs/thunar-vfs-mime-info.c
@@ -96,7 +96,7 @@ thunar_vfs_mime_info_get_type (void)
 
   if (G_UNLIKELY (type == G_TYPE_INVALID))
     {
-      type = g_boxed_type_register_static ("ThunarVfsMimeInfo",
+      type = g_boxed_type_register_static (I_("ThunarVfsMimeInfo"),
                                            (GBoxedCopyFunc) thunar_vfs_mime_info_ref,
                                            (GBoxedFreeFunc) thunar_vfs_mime_info_unref);
     }
diff --git a/thunar-vfs/thunar-vfs-mime-legacy.c b/thunar-vfs/thunar-vfs-mime-legacy.c
index 9099c7e7e0719f3f51a6fd30f24cfc011d2fa6e3..d35436a4cf6a9f3c9ff72f1ecc9ef24962a51af0 100644
--- a/thunar-vfs/thunar-vfs-mime-legacy.c
+++ b/thunar-vfs/thunar-vfs-mime-legacy.c
@@ -37,6 +37,7 @@
 #endif
 
 #include <thunar-vfs/thunar-vfs-mime-legacy.h>
+#include <thunar-vfs/thunar-vfs-alias.h>
 
 
 
@@ -144,7 +145,7 @@ thunar_vfs_mime_legacy_get_type (void)
       };
 
       type = g_type_register_static (THUNAR_VFS_TYPE_MIME_PROVIDER,
-                                     "ThunarVfsMimeLegacy", &info, 0);
+                                     I_("ThunarVfsMimeLegacy"), &info, 0);
     }
 
   return type;
@@ -641,3 +642,5 @@ thunar_vfs_mime_legacy_new (const gchar *directory)
 
 
 
+#define __THUNAR_VFS_MIME_LEGACY_C__
+#include <thunar-vfs/thunar-vfs-aliasdef.c>
diff --git a/thunar-vfs/thunar-vfs-mime-provider.c b/thunar-vfs/thunar-vfs-mime-provider.c
index e1b4b8a3a4ceac1cbe0e6cc95515c8d16c8d95b4..96d431af1a39fa65d2103b0c85b80b26e79a512c 100644
--- a/thunar-vfs/thunar-vfs-mime-provider.c
+++ b/thunar-vfs/thunar-vfs-mime-provider.c
@@ -23,6 +23,7 @@
 #endif
 
 #include <thunar-vfs/thunar-vfs-mime-provider.h>
+#include <thunar-vfs/thunar-vfs-alias.h>
 
 
 
@@ -47,9 +48,13 @@ thunar_vfs_mime_provider_get_type (void)
         NULL,
       };
 
-      type = g_type_register_static (G_TYPE_OBJECT, "ThunarVfsMimeProvider", &info, G_TYPE_FLAG_ABSTRACT);
+      type = g_type_register_static (G_TYPE_OBJECT, I_("ThunarVfsMimeProvider"), &info, G_TYPE_FLAG_ABSTRACT);
     }
 
   return type;
 }
 
+
+
+#define __THUNAR_VFS_MIME_PROVIDER_C__
+#include <thunar-vfs/thunar-vfs-aliasdef.c>
diff --git a/thunar-vfs/thunar-vfs-mime-provider.h b/thunar-vfs/thunar-vfs-mime-provider.h
index bc609567f2d2c196cc6c16e58ec6a2f39ebc7c9f..9f8c0d5d28ac4d314789213af925bda23dcff159 100644
--- a/thunar-vfs/thunar-vfs-mime-provider.h
+++ b/thunar-vfs/thunar-vfs-mime-provider.h
@@ -21,7 +21,7 @@
 #ifndef __THUNAR_VFS_MIME_PROVIDER_H__
 #define __THUNAR_VFS_MIME_PROVIDER_H__
 
-#include <glib-object.h>
+#include <exo/exo.h>
 
 G_BEGIN_DECLS;
 
diff --git a/thunar-vfs/thunar-vfs-mkdir-job.c b/thunar-vfs/thunar-vfs-mkdir-job.c
index 1e5812b20b1021ba06d3e02a1adedcfdf32e0d9b..ecc7bf4b724907cf135cdeb2cc3cdf7f4c92e053 100644
--- a/thunar-vfs/thunar-vfs-mkdir-job.c
+++ b/thunar-vfs/thunar-vfs-mkdir-job.c
@@ -86,7 +86,7 @@ thunar_vfs_mkdir_job_get_type (void)
       };
 
       type = g_type_register_static (THUNAR_VFS_TYPE_INTERACTIVE_JOB,
-                                     "ThunarVfsMkdirJob", &info, 0);
+                                     I_("ThunarVfsMkdirJob"), &info, 0);
     }
 
   return type;
diff --git a/thunar-vfs/thunar-vfs-monitor.c b/thunar-vfs/thunar-vfs-monitor.c
index 8ef86d0e1292f29aa896eeefe823ca50c3a0101c..ab106b4584fff6819ebb86d1200b39b0b2687323 100644
--- a/thunar-vfs/thunar-vfs-monitor.c
+++ b/thunar-vfs/thunar-vfs-monitor.c
@@ -128,7 +128,36 @@ struct _ThunarVfsMonitorNotification
 
 
 
-G_DEFINE_TYPE (ThunarVfsMonitor, thunar_vfs_monitor, G_TYPE_OBJECT);
+static GObjectClass *thunar_vfs_monitor_parent_class;
+
+
+
+GType
+thunar_vfs_monitor_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarVfsMonitorClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_vfs_monitor_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarVfsMonitor),
+        0,
+        (GInstanceInitFunc) thunar_vfs_monitor_init,
+        NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_OBJECT, I_("ThunarVfsMonitor"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -137,6 +166,9 @@ thunar_vfs_monitor_class_init (ThunarVfsMonitorClass *klass)
 {
   GObjectClass *gobject_class;
 
+  /* determine the parent type class */
+  thunar_vfs_monitor_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = thunar_vfs_monitor_finalize;
 }
diff --git a/thunar-vfs/thunar-vfs-path.c b/thunar-vfs/thunar-vfs-path.c
index 7c0fc6d7d71713f4834d6066b6e0f5cf0e6e1abf..0799a4a2fa24ec65915069956d6f3ba994f61cf4 100644
--- a/thunar-vfs/thunar-vfs-path.c
+++ b/thunar-vfs/thunar-vfs-path.c
@@ -177,7 +177,7 @@ thunar_vfs_path_get_type (void)
 
   if (G_UNLIKELY (type == G_TYPE_INVALID))
     {
-      type = g_boxed_type_register_static ("ThunarVfsPath",
+      type = g_boxed_type_register_static (I_("ThunarVfsPath"),
                                            (GBoxedCopyFunc) thunar_vfs_path_ref,
                                            (GBoxedFreeFunc) thunar_vfs_path_unref);
     }
diff --git a/thunar-vfs/thunar-vfs-scandir.c b/thunar-vfs/thunar-vfs-scandir.c
index aaa1a6b71ccbac42343c0047065f06b80ff22dd8..5c5dadb0cd8d987a81b54e6c2b211c283368f78b 100644
--- a/thunar-vfs/thunar-vfs-scandir.c
+++ b/thunar-vfs/thunar-vfs-scandir.c
@@ -58,6 +58,7 @@
 #endif
 
 #include <thunar-vfs/thunar-vfs-scandir.h>
+#include <thunar-vfs/thunar-vfs-alias.h>
 
 
 
@@ -369,7 +370,7 @@ thunar_vfs_scandir_collect (ThunarVfsScandirHandle *handle,
           if (G_UNLIKELY (!succeed))
             {
               /* we can ignore certain errors here */
-              if (errno == EMLINK || errno == ENOTDIR || errno == ENOENT)
+              if (errno == EACCES || errno == EMLINK || errno == ENOTDIR || errno == ENOENT || errno == EPERM)
                 succeed = TRUE;
             }
         }
@@ -426,3 +427,7 @@ thunar_vfs_scandir (ThunarVfsPath        *path,
   return handle.path_list;
 }
 
+
+
+#define __THUNAR_VFS_SCANDIR_C__
+#include <thunar-vfs/thunar-vfs-aliasdef.c>
diff --git a/thunar-vfs/thunar-vfs-thumb-jpeg.c b/thunar-vfs/thunar-vfs-thumb-jpeg.c
index 62888906a733a5a634564ef8b042c177a96f2a31..210e05983ef54c0beba571dccfcc8a2e47d025ed 100644
--- a/thunar-vfs/thunar-vfs-thumb-jpeg.c
+++ b/thunar-vfs/thunar-vfs-thumb-jpeg.c
@@ -335,3 +335,5 @@ error:
 
 
 
+#define __THUNAR_VFS_THUMB_JPEG_C__
+#include <thunar-vfs/thunar-vfs-aliasdef.c>
diff --git a/thunar-vfs/thunar-vfs-thumb.c b/thunar-vfs/thunar-vfs-thumb.c
index b03ef8b2d3426344236e6fb4b2c4e23b83c397f5..0e23de6f8a457eec4fa8dbd884c6d111017bd6d8 100644
--- a/thunar-vfs/thunar-vfs-thumb.c
+++ b/thunar-vfs/thunar-vfs-thumb.c
@@ -118,7 +118,36 @@ struct _ThunarVfsThumbFactory
 
 
 
-G_DEFINE_TYPE (ThunarVfsThumbFactory, thunar_vfs_thumb_factory, G_TYPE_OBJECT);
+static GObjectClass *thunar_vfs_thumb_factory_parent_class;
+
+
+
+GType
+thunar_vfs_thumb_factory_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarVfsThumbFactoryClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_vfs_thumb_factory_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarVfsThumbFactory),
+        0,
+        (GInstanceInitFunc) thunar_vfs_thumb_factory_init,
+        NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_OBJECT, I_("ThunarVfsThumbFactory"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -127,6 +156,9 @@ thunar_vfs_thumb_factory_class_init (ThunarVfsThumbFactoryClass *klass)
 {
   GObjectClass *gobject_class;
 
+  /* determine the parent type class */
+  thunar_vfs_thumb_factory_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = thunar_vfs_thumb_factory_finalize;
   gobject_class->get_property = thunar_vfs_thumb_factory_get_property;
diff --git a/thunar-vfs/thunar-vfs-transfer-job.c b/thunar-vfs/thunar-vfs-transfer-job.c
index b5fac46a11ea67872cb65148836dea1f2068f3ad..938b30206f3ac3fedefb189073a9de7ccb51515a 100644
--- a/thunar-vfs/thunar-vfs-transfer-job.c
+++ b/thunar-vfs/thunar-vfs-transfer-job.c
@@ -148,7 +148,38 @@ struct _ThunarVfsTransferPair
 
 
 
-G_DEFINE_TYPE (ThunarVfsTransferJob, thunar_vfs_transfer_job, THUNAR_VFS_TYPE_INTERACTIVE_JOB);
+static GObjectClass *thunar_vfs_transfer_job_parent_class;
+
+
+
+GType
+thunar_vfs_transfer_job_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarVfsTransferJobClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_vfs_transfer_job_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarVfsTransferJob),
+        0,
+        (GInstanceInitFunc) thunar_vfs_transfer_job_init,
+        NULL,
+      };
+
+      type = g_type_register_static (THUNAR_VFS_TYPE_INTERACTIVE_JOB,
+                                     I_("ThunarVfsTransferJob"),
+                                     &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -158,6 +189,9 @@ thunar_vfs_transfer_job_class_init (ThunarVfsTransferJobClass *klass)
   ThunarVfsJobClass *thunarvfs_job_class;
   GObjectClass      *gobject_class;
 
+  /* determine the parent type class */
+  thunar_vfs_transfer_job_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = thunar_vfs_transfer_job_finalize;
 
@@ -860,3 +894,7 @@ failure:
   return NULL;
 }
 
+
+
+#define __THUNAR_VFS_TRANSFER_JOB_C__
+#include <thunar-vfs/thunar-vfs-aliasdef.c>
diff --git a/thunar-vfs/thunar-vfs-unlink-job.c b/thunar-vfs/thunar-vfs-unlink-job.c
index 54f8020b844afbb7da16b0a9dd02ab8439932a27..b84a02a9cd8995808c14e2fec44a67b0c82f002d 100644
--- a/thunar-vfs/thunar-vfs-unlink-job.c
+++ b/thunar-vfs/thunar-vfs-unlink-job.c
@@ -109,7 +109,8 @@ thunar_vfs_unlink_job_get_type (void)
       };
 
       type = g_type_register_static (THUNAR_VFS_TYPE_INTERACTIVE_JOB,
-                                     "ThunarVfsUnlinkJob", &info, 0);
+                                     I_("ThunarVfsUnlinkJob"),
+                                     &info, 0);
     }
 
   return type;
@@ -292,3 +293,6 @@ thunar_vfs_unlink_job_new (GList   *path_list,
 }
 
 
+
+#define __THUNAR_VFS_UNLINK_JOB_C__
+#include <thunar-vfs/thunar-vfs-aliasdef.c>
diff --git a/thunar-vfs/thunar-vfs-user.c b/thunar-vfs/thunar-vfs-user.c
index 51f5dc3ab06e7d0607782d49951d5934048f8f76..84d708a76f42ef128427ec343a3df1614dea9848 100644
--- a/thunar-vfs/thunar-vfs-user.c
+++ b/thunar-vfs/thunar-vfs-user.c
@@ -102,7 +102,7 @@ thunar_vfs_group_get_type (void)
         NULL,
       };
 
-      type = g_type_register_static (G_TYPE_OBJECT, "ThunarVfsGroup", &info, 0);
+      type = g_type_register_static (G_TYPE_OBJECT, I_("ThunarVfsGroup"), &info, 0);
     }
 
   return type;
@@ -251,7 +251,7 @@ thunar_vfs_user_get_type (void)
         NULL,
       };
 
-      type = g_type_register_static (G_TYPE_OBJECT, "ThunarVfsUser", &info, 0);
+      type = g_type_register_static (G_TYPE_OBJECT, I_("ThunarVfsUser"), &info, 0);
     }
 
   return type;
diff --git a/thunar-vfs/thunar-vfs-volume.c b/thunar-vfs/thunar-vfs-volume.c
index 8180791ba41dec7b9779b71fe3d09817cf9579f8..320c607f66a5221af833ddf03b2ffd74c6a4e6a4 100644
--- a/thunar-vfs/thunar-vfs-volume.c
+++ b/thunar-vfs/thunar-vfs-volume.c
@@ -67,10 +67,7 @@ thunar_vfs_volume_get_type (void)
         NULL,
       };
 
-      type = g_type_register_static (G_TYPE_INTERFACE,
-                                     "ThunarVfsVolume",
-                                     &info, 0);
-
+      type = g_type_register_static (G_TYPE_INTERFACE, I_("ThunarVfsVolume"), &info, 0);
       g_type_interface_add_prerequisite (type, G_TYPE_OBJECT);
     }
 
@@ -93,7 +90,7 @@ thunar_vfs_volume_base_init (gpointer klass)
        * Emitted whenever the state of @volume changed.
        **/
       volume_signals[THUNAR_VFS_VOLUME_CHANGED] =
-        g_signal_new ("changed",
+        g_signal_new (I_("changed"),
                       G_TYPE_FROM_INTERFACE (klass),
                       G_SIGNAL_RUN_LAST,
                       G_STRUCT_OFFSET (ThunarVfsVolumeIface, changed),
diff --git a/thunar/thunar-application.c b/thunar/thunar-application.c
index ca7ef19634d955bc66bfa16b733814c93dda2111..23c7a4e9d5126daef764cbe1255e0a620cf2b84c 100644
--- a/thunar/thunar-application.c
+++ b/thunar/thunar-application.c
@@ -79,7 +79,36 @@ struct _ThunarApplication
 
 
 
-G_DEFINE_TYPE (ThunarApplication, thunar_application, G_TYPE_OBJECT);
+static GObjectClass *thunar_application_parent_class;
+
+
+
+GType
+thunar_application_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarApplicationClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_application_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarApplication),
+        0,
+        (GInstanceInitFunc) thunar_application_init,
+        NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_OBJECT, I_("ThunarApplication"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -88,6 +117,9 @@ thunar_application_class_init (ThunarApplicationClass *klass)
 {
   GObjectClass *gobject_class;
  
+  /* determine the parent type class */
+  thunar_application_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = thunar_application_finalize;
 }
diff --git a/thunar/thunar-chooser-dialog.c b/thunar/thunar-chooser-dialog.c
index 91f49d495e158d80dc63a4d07d5aabe3f400d1d3..d52048e4bdd426aeaee7f8d274862f12b536edfd 100644
--- a/thunar/thunar-chooser-dialog.c
+++ b/thunar/thunar-chooser-dialog.c
@@ -104,7 +104,36 @@ struct _ThunarChooserDialog
 
 
 
-G_DEFINE_TYPE (ThunarChooserDialog, thunar_chooser_dialog, GTK_TYPE_DIALOG);
+static GObjectClass *thunar_chooser_dialog_parent_class;
+
+
+
+GType
+thunar_chooser_dialog_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarChooserDialogClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_chooser_dialog_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarChooserDialog),
+        0,
+        (GInstanceInitFunc) thunar_chooser_dialog_init,
+        NULL,
+      };
+
+      type = g_type_register_static (GTK_TYPE_DIALOG, I_("ThunarChooserDialog"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -115,6 +144,9 @@ thunar_chooser_dialog_class_init (ThunarChooserDialogClass *klass)
   GtkWidgetClass *gtkwidget_class;
   GObjectClass   *gobject_class;
 
+  /* determine the parent type class */
+  thunar_chooser_dialog_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->dispose = thunar_chooser_dialog_dispose;
   gobject_class->get_property = thunar_chooser_dialog_get_property;
diff --git a/thunar/thunar-chooser-model.c b/thunar/thunar-chooser-model.c
index 599c3db893fbf294c85ec4120d3fdf3258c0f7ca..92b2157d117d5554c3773ae9e4d37d93b8f2facb 100644
--- a/thunar/thunar-chooser-model.c
+++ b/thunar/thunar-chooser-model.c
@@ -90,7 +90,36 @@ struct _ThunarChooserModel
 
 
 
-G_DEFINE_TYPE (ThunarChooserModel, thunar_chooser_model, GTK_TYPE_TREE_STORE);
+static GObjectClass *thunar_chooser_model_parent_class;
+
+
+
+GType
+thunar_chooser_model_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarChooserModelClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_chooser_model_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarChooserModel),
+        0,
+        (GInstanceInitFunc) thunar_chooser_model_init,
+        NULL,
+      };
+
+      type = g_type_register_static (GTK_TYPE_TREE_STORE, I_("ThunarChooserModel"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -99,6 +128,9 @@ thunar_chooser_model_class_init (ThunarChooserModelClass *klass)
 {
   GObjectClass *gobject_class;
 
+  /* determine the parent type class */
+  thunar_chooser_model_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = thunar_chooser_model_finalize;
   gobject_class->get_property = thunar_chooser_model_get_property;
diff --git a/thunar/thunar-clipboard-manager.c b/thunar/thunar-clipboard-manager.c
index bc2b8206a771fccd0d4b070d7d68f966e5d93fd1..4112cae854bc57977e0daa4ddb15ab2306ed92a3 100644
--- a/thunar/thunar-clipboard-manager.c
+++ b/thunar/thunar-clipboard-manager.c
@@ -55,6 +55,7 @@ enum
 
 
 static void thunar_clipboard_manager_class_init         (ThunarClipboardManagerClass *klass);
+static void thunar_clipboard_manager_init               (ThunarClipboardManager      *manager);
 static void thunar_clipboard_manager_finalize           (GObject                     *object);
 static void thunar_clipboard_manager_get_property       (GObject                     *object,
                                                          guint                        prop_id,
@@ -118,12 +119,38 @@ static const GtkTargetEntry clipboard_targets[] =
   { "UTF8_STRING", 0, TARGET_UTF8_STRING }
 };
 
-static GQuark thunar_clipboard_manager_quark = 0;
-static guint  manager_signals[LAST_SIGNAL];
+static GObjectClass *thunar_clipboard_manager_parent_class;
+static GQuark        thunar_clipboard_manager_quark = 0;
+static guint         manager_signals[LAST_SIGNAL];
 
 
 
-G_DEFINE_TYPE (ThunarClipboardManager, thunar_clipboard_manager, G_TYPE_OBJECT);
+GType
+thunar_clipboard_manager_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarClipboardManagerClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_clipboard_manager_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarClipboardManager),
+        0,
+        (GInstanceInitFunc) thunar_clipboard_manager_init,
+        NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_OBJECT, I_("ThunarClipboardManager"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -132,6 +159,9 @@ thunar_clipboard_manager_class_init (ThunarClipboardManagerClass *klass)
 {
   GObjectClass *gobject_class;
 
+  /* determine the parent type class */
+  thunar_clipboard_manager_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = thunar_clipboard_manager_finalize;
   gobject_class->get_property = thunar_clipboard_manager_get_property;
@@ -159,7 +189,7 @@ thunar_clipboard_manager_class_init (ThunarClipboardManagerClass *klass)
    * clipboard associated with @manager changes.
    **/
   manager_signals[CHANGED] =
-    g_signal_new ("changed",
+    g_signal_new (I_("changed"),
                   G_TYPE_FROM_CLASS (klass),
                   G_SIGNAL_RUN_FIRST,
                   G_STRUCT_OFFSET (ThunarClipboardManagerClass, changed),
@@ -173,7 +203,6 @@ thunar_clipboard_manager_class_init (ThunarClipboardManagerClass *klass)
 static void
 thunar_clipboard_manager_init (ThunarClipboardManager *manager)
 {
-  manager->can_paste = FALSE;
   manager->x_special_gnome_copied_files = gdk_atom_intern ("x-special/gnome-copied-files", FALSE);
 }
 
diff --git a/thunar/thunar-create-dialog.c b/thunar/thunar-create-dialog.c
index 44d3b606260c76563c613f94074a8f11e991c535..129b8553c7098526bcd56a6cf210cea608185619 100644
--- a/thunar/thunar-create-dialog.c
+++ b/thunar/thunar-create-dialog.c
@@ -71,7 +71,36 @@ struct _ThunarCreateDialog
 
 
 
-G_DEFINE_TYPE (ThunarCreateDialog, thunar_create_dialog, GTK_TYPE_DIALOG);
+static GObjectClass *thunar_create_dialog_parent_class;
+
+
+
+GType
+thunar_create_dialog_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarCreateDialogClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_create_dialog_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarCreateDialog),
+        0,
+        (GInstanceInitFunc) thunar_create_dialog_init,
+        NULL,
+      };
+
+      type = g_type_register_static (GTK_TYPE_DIALOG, I_("ThunarCreateDialog"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -81,6 +110,9 @@ thunar_create_dialog_class_init (ThunarCreateDialogClass *klass)
   GtkWidgetClass *gtkwidget_class;
   GObjectClass   *gobject_class;
 
+  /* determine the parent type class */
+  thunar_create_dialog_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->dispose = thunar_create_dialog_dispose;
   gobject_class->get_property = thunar_create_dialog_get_property;
diff --git a/thunar/thunar-details-view.c b/thunar/thunar-details-view.c
index e3f02f0e49824eb2d6e5e1c1a07b83fda0ba54b7..9bf7e168d38e4510d2ada9d2624abeb311d74057 100644
--- a/thunar/thunar-details-view.c
+++ b/thunar/thunar-details-view.c
@@ -73,7 +73,36 @@ struct _ThunarDetailsView
 
 
 
-G_DEFINE_TYPE (ThunarDetailsView, thunar_details_view, THUNAR_TYPE_STANDARD_VIEW);
+static GObjectClass *thunar_details_view_parent_class;
+
+
+
+GType
+thunar_details_view_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarDetailsViewClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_details_view_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarDetailsView),
+        0,
+        (GInstanceInitFunc) thunar_details_view_init,
+        NULL,
+      };
+
+      type = g_type_register_static (THUNAR_TYPE_STANDARD_VIEW, I_("ThunarDetailsView"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -83,6 +112,9 @@ thunar_details_view_class_init (ThunarDetailsViewClass *klass)
   ThunarStandardViewClass *thunarstandard_view_class;
   GtkWidgetClass          *gtkwidget_class;
 
+  /* determine the parent type class */
+  thunar_details_view_parent_class = g_type_class_peek_parent (klass);
+
   gtkwidget_class = GTK_WIDGET_CLASS (klass);
   gtkwidget_class->get_accessible = thunar_details_view_get_accessible;
 
diff --git a/thunar/thunar-dnd.c b/thunar/thunar-dnd.c
index 46ce1bb52b75b0664dea277e284e0bf286beb99d..858d92e661e8159d26b7c3dd6f1719c40b87ed3d 100644
--- a/thunar/thunar-dnd.c
+++ b/thunar/thunar-dnd.c
@@ -31,7 +31,7 @@ static void
 action_selected (GtkWidget     *item,
                  GdkDragAction *action)
 {
-  *action = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (item), "action"));
+  *action = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (item), I_("action")));
 }
 
 
@@ -84,7 +84,7 @@ thunar_dnd_ask (GtkWidget    *widget,
     if (G_LIKELY ((actions & action_items[n]) != 0))
       {
         item = gtk_image_menu_item_new_with_mnemonic (_(action_names[n]));
-        g_object_set_data (G_OBJECT (item), "action", GUINT_TO_POINTER (action_items[n]));
+        g_object_set_data (G_OBJECT (item), I_("action"), GUINT_TO_POINTER (action_items[n]));
         g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (action_selected), &action);
         gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
         gtk_widget_show (item);
diff --git a/thunar/thunar-emblem-chooser.c b/thunar/thunar-emblem-chooser.c
index 3fb7326fa7dc070952181025480c16bf1cb30d06..c0447540d9906aa2b718a91d55b642ed2c96901e 100644
--- a/thunar/thunar-emblem-chooser.c
+++ b/thunar/thunar-emblem-chooser.c
@@ -84,7 +84,36 @@ struct _ThunarEmblemChooser
 
 
 
-G_DEFINE_TYPE (ThunarEmblemChooser, thunar_emblem_chooser, GTK_TYPE_SCROLLED_WINDOW);
+static GObjectClass *thunar_emblem_chooser_parent_class;
+
+
+
+GType
+thunar_emblem_chooser_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarEmblemChooserClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_emblem_chooser_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarEmblemChooser),
+        0,
+        (GInstanceInitFunc) thunar_emblem_chooser_init,
+        NULL,
+      };
+
+      type = g_type_register_static (GTK_TYPE_SCROLLED_WINDOW, I_("ThunarEmblemChooser"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -94,6 +123,9 @@ thunar_emblem_chooser_class_init (ThunarEmblemChooserClass *klass)
   GtkWidgetClass *gtkwidget_class;
   GObjectClass   *gobject_class;
 
+  /* determine the parent type class */
+  thunar_emblem_chooser_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->dispose = thunar_emblem_chooser_dispose;
   gobject_class->finalize = thunar_emblem_chooser_finalize;
@@ -279,7 +311,7 @@ thunar_emblem_chooser_button_toggled (GtkToggleButton     *button,
   for (lp = children; lp != NULL; lp = lp->next)
     if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (lp->data)))
       {
-        emblem_name = g_object_get_data (G_OBJECT (lp->data), "thunar-emblem");
+        emblem_name = g_object_get_data (G_OBJECT (lp->data), I_("thunar-emblem"));
         emblem_names = g_list_append (emblem_names, g_strdup (emblem_name));
       }
   g_list_free (children);
@@ -317,7 +349,7 @@ thunar_emblem_chooser_file_changed (ThunarFile          *file,
   children = gtk_container_get_children (GTK_CONTAINER (chooser->table));
   for (lp = children; lp != NULL; lp = lp->next)
     {
-      emblem_name = g_object_get_data (G_OBJECT (lp->data), "thunar-emblem");
+      emblem_name = g_object_get_data (G_OBJECT (lp->data), I_("thunar-emblem"));
       if (g_list_find_custom (emblem_names, emblem_name, (GCompareFunc) strcmp) != NULL)
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (lp->data), TRUE);
       else
@@ -419,7 +451,7 @@ thunar_emblem_chooser_create_button (ThunarEmblemChooser *chooser,
   /* allocate the button */
   button = gtk_check_button_new ();
   GTK_WIDGET_UNSET_FLAGS (button, GTK_CAN_FOCUS);
-  g_object_set_data_full (G_OBJECT (button), "thunar-emblem", g_strdup (emblem), g_free);
+  g_object_set_data_full (G_OBJECT (button), I_("thunar-emblem"), g_strdup (emblem), g_free);
   g_signal_connect (G_OBJECT (button), "toggled", G_CALLBACK (thunar_emblem_chooser_button_toggled), chooser);
 
   /* allocate the box */
diff --git a/thunar/thunar-favourites-model.c b/thunar/thunar-favourites-model.c
index 2ab65b0971acac42f03a552076c6620c293b1586..99bf892c2f6aa492bbf8814c0982df70e52264f2 100644
--- a/thunar/thunar-favourites-model.c
+++ b/thunar/thunar-favourites-model.c
@@ -143,13 +143,52 @@ struct _ThunarFavourite
 
 
 
-G_DEFINE_TYPE_WITH_CODE (ThunarFavouritesModel,
-                         thunar_favourites_model,
-                         G_TYPE_OBJECT,
-                         G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL,
-                                                thunar_favourites_model_tree_model_init)
-                         G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_DRAG_SOURCE,
-                                                thunar_favourites_model_drag_source_init));
+static GObjectClass *thunar_favourites_model_parent_class;
+
+
+
+GType
+thunar_favourites_model_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarFavouritesModelClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_favourites_model_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarFavouritesModel),
+        0,
+        (GInstanceInitFunc) thunar_favourites_model_init,
+        NULL,
+      };
+
+      static const GInterfaceInfo tree_model_info =
+      {
+        (GInterfaceInitFunc) thunar_favourites_model_tree_model_init,
+        NULL,
+        NULL,
+      };
+
+      static const GInterfaceInfo drag_source_info =
+      {
+        (GInterfaceInitFunc) thunar_favourites_model_drag_source_init,
+        NULL,
+        NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_OBJECT, I_("ThunarFavouritesModel"), &info, 0);
+      g_type_add_interface_static (type, GTK_TYPE_TREE_MODEL, &tree_model_info);
+      g_type_add_interface_static (type, GTK_TYPE_TREE_DRAG_SOURCE, &drag_source_info);
+    }
+
+  return type;
+}
 
 
     
@@ -158,6 +197,9 @@ thunar_favourites_model_class_init (ThunarFavouritesModelClass *klass)
 {
   GObjectClass *gobject_class;
 
+  /* determine the parent type class */
+  thunar_favourites_model_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = thunar_favourites_model_finalize;
 }
diff --git a/thunar/thunar-favourites-pane.c b/thunar/thunar-favourites-pane.c
index 9e9989bbfdcaa69eaaaea3d1a823b892fea752a3..1b68e4d3ab2808d59a74835cb18eac9c34a8852e 100644
--- a/thunar/thunar-favourites-pane.c
+++ b/thunar/thunar-favourites-pane.c
@@ -68,13 +68,52 @@ struct _ThunarFavouritesPane
 
 
 
-G_DEFINE_TYPE_WITH_CODE (ThunarFavouritesPane,
-                         thunar_favourites_pane,
-                         GTK_TYPE_SCROLLED_WINDOW,
-                         G_IMPLEMENT_INTERFACE (THUNAR_TYPE_NAVIGATOR,
-                                                thunar_favourites_pane_navigator_init)
-                         G_IMPLEMENT_INTERFACE (THUNAR_TYPE_SIDE_PANE,
-                                                thunar_favourites_pane_side_pane_init));
+static GObjectClass *thunar_favourites_pane_parent_class;
+
+
+
+GType
+thunar_favourites_pane_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarFavouritesPaneClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_favourites_pane_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarFavouritesPane),
+        0,
+        (GInstanceInitFunc) thunar_favourites_pane_init,
+        NULL,
+      };
+
+      static const GInterfaceInfo navigator_info =
+      {
+        (GInterfaceInitFunc) thunar_favourites_pane_navigator_init,
+        NULL,
+        NULL,
+      };
+
+      static const GInterfaceInfo side_pane_info =
+      {
+        (GInterfaceInitFunc) thunar_favourites_pane_side_pane_init,
+        NULL,
+        NULL,
+      };
+
+      type = g_type_register_static (GTK_TYPE_SCROLLED_WINDOW, I_("ThunarFavouritesPane"), &info, 0);
+      g_type_add_interface_static (type, THUNAR_TYPE_NAVIGATOR, &navigator_info);
+      g_type_add_interface_static (type, THUNAR_TYPE_SIDE_PANE, &side_pane_info);
+    }
+
+  return type;
+}
 
 
 
@@ -83,6 +122,9 @@ thunar_favourites_pane_class_init (ThunarFavouritesPaneClass *klass)
 {
   GObjectClass *gobject_class;
 
+  /* determine the parent type class */
+  thunar_favourites_pane_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->dispose = thunar_favourites_pane_dispose;
   gobject_class->get_property = thunar_favourites_pane_get_property;
diff --git a/thunar/thunar-favourites-view.c b/thunar/thunar-favourites-view.c
index a9f38b65996bde2183899a65d50fae97d9a35e6d..7e3d2310bffbcef9e00da732ad94fccd5e6d521d 100644
--- a/thunar/thunar-favourites-view.c
+++ b/thunar/thunar-favourites-view.c
@@ -125,7 +125,36 @@ static const GtkTargetEntry drop_targets[] = {
 
 
 
-G_DEFINE_TYPE (ThunarFavouritesView, thunar_favourites_view, GTK_TYPE_TREE_VIEW);
+static GObjectClass *thunar_favourites_view_parent_class;
+
+
+
+GType
+thunar_favourites_view_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarFavouritesViewClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_favourites_view_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarFavouritesView),
+        0,
+        (GInstanceInitFunc) thunar_favourites_view_init,
+        NULL,
+      };
+
+      type = g_type_register_static (GTK_TYPE_TREE_VIEW, I_("ThunarFavouritesView"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -135,6 +164,9 @@ thunar_favourites_view_class_init (ThunarFavouritesViewClass *klass)
   GtkTreeViewClass *gtktree_view_class;
   GtkWidgetClass   *gtkwidget_class;
 
+  /* determine the parent type class */
+  thunar_favourites_view_parent_class = g_type_class_peek_parent (klass);
+
   gtkwidget_class = GTK_WIDGET_CLASS (klass);
   gtkwidget_class->button_press_event = thunar_favourites_view_button_press_event;
   gtkwidget_class->drag_data_received = thunar_favourites_view_drag_data_received;
@@ -150,7 +182,7 @@ thunar_favourites_view_class_init (ThunarFavouritesViewClass *klass)
    * Invoked whenever a favourite is activated by the user.
    **/
   view_signals[FAVOURITE_ACTIVATED] =
-    g_signal_new ("favourite-activated",
+    g_signal_new (I_("favourite-activated"),
                   G_TYPE_FROM_CLASS (klass),
                   G_SIGNAL_RUN_LAST,
                   G_STRUCT_OFFSET (ThunarFavouritesViewClass, favourite_activated),
@@ -290,7 +322,7 @@ thunar_favourites_view_button_press_event (GtkWidget      *widget,
 
       /* append the remove menu item */
       item = gtk_image_menu_item_new_with_mnemonic (_("_Remove Favourite"));
-      g_object_set_data_full (G_OBJECT (item), "thunar-favourites-row",
+      g_object_set_data_full (G_OBJECT (item), I_("thunar-favourites-row"),
                               gtk_tree_row_reference_new (model, path),
                               (GDestroyNotify) gtk_tree_row_reference_free);
       g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (thunar_favourites_view_remove_activated), widget);
@@ -305,7 +337,7 @@ thunar_favourites_view_button_press_event (GtkWidget      *widget,
 
       /* append the rename menu item */
       item = gtk_image_menu_item_new_with_mnemonic (_("Re_name Favourite"));
-      g_object_set_data_full (G_OBJECT (item), "thunar-favourites-row",
+      g_object_set_data_full (G_OBJECT (item), I_("thunar-favourites-row"),
                               gtk_tree_row_reference_new (model, path),
                               (GDestroyNotify) gtk_tree_row_reference_free);
       g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (thunar_favourites_view_rename_activated), widget);
@@ -481,7 +513,7 @@ thunar_favourites_view_remove_activated (GtkWidget            *item,
   GtkTreeModel        *model;
   GtkTreePath         *path;
 
-  row = g_object_get_data (G_OBJECT (item), "thunar-favourites-row");
+  row = g_object_get_data (G_OBJECT (item), I_("thunar-favourites-row"));
   path = gtk_tree_row_reference_get_path (row);
   if (G_LIKELY (path != NULL))
     {
@@ -503,7 +535,7 @@ thunar_favourites_view_rename_activated (GtkWidget            *item,
   GtkTreePath         *path;
   GList               *renderers;
 
-  row = g_object_get_data (G_OBJECT (item), "thunar-favourites-row");
+  row = g_object_get_data (G_OBJECT (item), I_("thunar-favourites-row"));
   path = gtk_tree_row_reference_get_path (row);
   if (G_LIKELY (path != NULL))
     {
diff --git a/thunar/thunar-file.c b/thunar/thunar-file.c
index d7dd46a0e0fab01102a8db2f822db282448129ec..d54efb46720501b4894c4a836ba4f11cf3d107af 100644
--- a/thunar/thunar-file.c
+++ b/thunar/thunar-file.c
@@ -133,8 +133,7 @@ thunar_file_get_type (void)
         NULL,
       };
 
-      type = g_type_register_static (G_TYPE_OBJECT, "ThunarFile", &info, 0);
-
+      type = g_type_register_static (G_TYPE_OBJECT, I_("ThunarFile"), &info, 0);
       g_type_add_interface_static (type, THUNARX_TYPE_FILE_INFO, &file_info_info);
     }
 
@@ -213,7 +212,7 @@ thunar_file_class_init (ThunarFileClass *klass)
    * Emitted whenever the system notices a change to @file.
    **/
   file_signals[CHANGED] =
-    g_signal_new ("changed",
+    g_signal_new (I_("changed"),
                   G_TYPE_FROM_CLASS (klass),
                   G_SIGNAL_RUN_FIRST,
                   G_STRUCT_OFFSET (ThunarFileClass, changed),
@@ -229,7 +228,7 @@ thunar_file_class_init (ThunarFileClass *klass)
    * was destroyed.
    **/
   file_signals[DESTROY] =
-    g_signal_new ("destroy",
+    g_signal_new (I_("destroy"),
                   G_TYPE_FROM_CLASS (klass),
                   G_SIGNAL_RUN_CLEANUP | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS,
                   G_STRUCT_OFFSET (ThunarFileClass, destroy),
@@ -246,7 +245,7 @@ thunar_file_class_init (ThunarFileClass *klass)
    * reregister it's VFS directory monitor.
    **/
   file_signals[RENAMED] =
-    g_signal_new ("renamed",
+    g_signal_new (I_("renamed"),
                   G_TYPE_FROM_CLASS (klass),
                   G_SIGNAL_RUN_FIRST,
                   G_STRUCT_OFFSET (ThunarFileClass, renamed),
diff --git a/thunar/thunar-folder.c b/thunar/thunar-folder.c
index c7b0368cc7455488818120f295a922138c77cda9..fa9055fba94acecc83a03129dfa86fd250d714cc 100644
--- a/thunar/thunar-folder.c
+++ b/thunar/thunar-folder.c
@@ -104,12 +104,38 @@ struct _ThunarFolder
 
 
 
-static guint  folder_signals[LAST_SIGNAL];
-static GQuark thunar_folder_quark;
+static GObjectClass *thunar_folder_parent_class;
+static guint         folder_signals[LAST_SIGNAL];
+static GQuark        thunar_folder_quark;
 
 
 
-G_DEFINE_TYPE (ThunarFolder, thunar_folder, GTK_TYPE_OBJECT);
+GType
+thunar_folder_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarFolderClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_folder_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarFolder),
+        0,
+        (GInstanceInitFunc) thunar_folder_init,
+        NULL,
+      };
+
+      type = g_type_register_static (GTK_TYPE_OBJECT, I_("ThunarFolder"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -118,6 +144,9 @@ thunar_folder_class_init (ThunarFolderClass *klass)
 {
   GObjectClass *gobject_class;
 
+  /* determine the parent type class */
+  thunar_folder_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = thunar_folder_finalize;
   gobject_class->get_property = thunar_folder_get_property;
@@ -145,7 +174,7 @@ thunar_folder_class_init (ThunarFolderClass *klass)
    * load the directory content because of an error.
    **/
   folder_signals[ERROR] =
-    g_signal_new ("error",
+    g_signal_new (I_("error"),
                   G_TYPE_FROM_CLASS (gobject_class),
                   G_SIGNAL_RUN_LAST,
                   G_STRUCT_OFFSET (ThunarFolderClass, error),
@@ -160,7 +189,7 @@ thunar_folder_class_init (ThunarFolderClass *klass)
    * been added to a particular folder.
    **/
   folder_signals[FILES_ADDED] =
-    g_signal_new ("files-added",
+    g_signal_new (I_("files-added"),
                   G_TYPE_FROM_CLASS (gobject_class),
                   G_SIGNAL_RUN_LAST,
                   G_STRUCT_OFFSET (ThunarFolderClass, files_added),
@@ -177,7 +206,7 @@ thunar_folder_class_init (ThunarFolderClass *klass)
    * the reload of folders, which take longer to load.
    **/
   folder_signals[FILES_REMOVED] =
-    g_signal_new ("files-removed",
+    g_signal_new (I_("files-removed"),
                   G_TYPE_FROM_CLASS (gobject_class),
                   G_SIGNAL_RUN_LAST,
                   G_STRUCT_OFFSET (ThunarFolderClass, files_removed),
diff --git a/thunar/thunar-history.c b/thunar/thunar-history.c
index 29d4c14862d53a3a9af5326beae415408bb28857..146139689a7f7416a4d14d9b0e1ea70639451bfd 100644
--- a/thunar/thunar-history.c
+++ b/thunar/thunar-history.c
@@ -81,11 +81,44 @@ struct _ThunarHistory
 
 
 
-G_DEFINE_TYPE_WITH_CODE (ThunarHistory,
-                         thunar_history,
-                         G_TYPE_OBJECT,
-                         G_IMPLEMENT_INTERFACE (THUNAR_TYPE_NAVIGATOR,
-                                                thunar_history_navigator_init));
+static GObjectClass *thunar_history_parent_class;
+
+
+
+GType
+thunar_history_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarHistoryClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_history_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarHistory),
+        0,
+        (GInstanceInitFunc) thunar_history_init,
+        NULL,
+      };
+
+      static const GInterfaceInfo navigator_info =
+      {
+        (GInterfaceInitFunc) thunar_history_navigator_init,
+        NULL,
+        NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_OBJECT, I_("ThunarHistory"), &info, 0);
+      g_type_add_interface_static (type, THUNAR_TYPE_NAVIGATOR, &navigator_info);
+    }
+
+  return type;
+}
 
 
 
@@ -94,6 +127,9 @@ thunar_history_class_init (ThunarHistoryClass *klass)
 {
   GObjectClass *gobject_class;
 
+  /* determine the parent type class */
+  thunar_history_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->dispose = thunar_history_dispose;
   gobject_class->finalize = thunar_history_finalize;
diff --git a/thunar/thunar-icon-factory.c b/thunar/thunar-icon-factory.c
index 56c7b99fa7fdf147bcfa500989dc4bbe2391c069..226cb8c367525b3490330574b363ef699dc20bbd 100644
--- a/thunar/thunar-icon-factory.c
+++ b/thunar/thunar-icon-factory.c
@@ -32,8 +32,6 @@
 #include <string.h>
 #endif
 
-#include <exo/exo.h>
-
 #include <thunar/thunar-fallback-icon.h>
 #include <thunar/thunar-gdk-pixbuf-extensions.h>
 #include <thunar/thunar-icon-factory.h>
@@ -128,12 +126,38 @@ struct _ThunarIconKey
 
 
 
-static GQuark thunar_icon_factory_quark = 0;
-static GQuark thunar_file_thumb_path_quark = 0;
+static GObjectClass *thunar_icon_factory_parent_class = NULL;
+static GQuark        thunar_icon_factory_quark = 0;
+static GQuark        thunar_file_thumb_path_quark = 0;
 
 
 
-G_DEFINE_TYPE (ThunarIconFactory, thunar_icon_factory, G_TYPE_OBJECT);
+GType
+thunar_icon_factory_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarIconFactoryClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_icon_factory_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarIconFactory),
+        0,
+        (GInstanceInitFunc) thunar_icon_factory_init,
+        NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_OBJECT, I_("ThunarIconFactory"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -142,6 +166,9 @@ thunar_icon_factory_class_init (ThunarIconFactoryClass *klass)
 {
   GObjectClass *gobject_class;
 
+  /* determine the parent type class */
+  thunar_icon_factory_parent_class = g_type_class_peek_parent (klass);
+
   /* setup the thunar-file-thumb-path quark */
   thunar_file_thumb_path_quark = g_quark_from_static_string ("thunar-file-thumb-path");
 
diff --git a/thunar/thunar-icon-renderer.c b/thunar/thunar-icon-renderer.c
index b48a9bb463d28e032374c67007acfe59db039bd1..e749e7367c1d767a46c61c78f5a23c155dc0bc01 100644
--- a/thunar/thunar-icon-renderer.c
+++ b/thunar/thunar-icon-renderer.c
@@ -85,7 +85,36 @@ struct _ThunarIconRenderer
 
 
 
-G_DEFINE_TYPE (ThunarIconRenderer, thunar_icon_renderer, GTK_TYPE_CELL_RENDERER);
+static GObjectClass *thunar_icon_renderer_parent_class;
+
+
+
+GType
+thunar_icon_renderer_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarIconRendererClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_icon_renderer_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarIconRenderer),
+        0,
+        (GInstanceInitFunc) thunar_icon_renderer_init,
+        NULL,
+      };
+
+      type = g_type_register_static (GTK_TYPE_CELL_RENDERER, I_("ThunarIconRenderer"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -95,6 +124,9 @@ thunar_icon_renderer_class_init (ThunarIconRendererClass *klass)
   GtkCellRendererClass *gtkcell_renderer_class;
   GObjectClass         *gobject_class;
 
+  /* determine the parent type class */
+  thunar_icon_renderer_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = thunar_icon_renderer_finalize;
   gobject_class->get_property = thunar_icon_renderer_get_property;
diff --git a/thunar/thunar-icon-view.c b/thunar/thunar-icon-view.c
index 488b31e62c4cffe7d13ce25118254e1a71379d38..453d000baf4697c5e5a2e5f90a2222203dd804b8 100644
--- a/thunar/thunar-icon-view.c
+++ b/thunar/thunar-icon-view.c
@@ -140,7 +140,36 @@ static const GtkRadioActionEntry order_action_entries[] =
 
 
 
-G_DEFINE_TYPE (ThunarIconView, thunar_icon_view, THUNAR_TYPE_STANDARD_VIEW);
+static GObjectClass *thunar_icon_view_parent_class;
+
+
+
+GType
+thunar_icon_view_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarIconViewClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_icon_view_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarIconView),
+        0,
+        (GInstanceInitFunc) thunar_icon_view_init,
+        NULL,
+      };
+
+      type = g_type_register_static (THUNAR_TYPE_STANDARD_VIEW, I_("ThunarIconView"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -151,6 +180,9 @@ thunar_icon_view_class_init (ThunarIconViewClass *klass)
   GtkWidgetClass          *gtkwidget_class;
   GObjectClass            *gobject_class;
 
+  /* determine the parent type class */
+  thunar_icon_view_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->set_property = thunar_icon_view_set_property;
 
diff --git a/thunar/thunar-launcher.c b/thunar/thunar-launcher.c
index 1adf59d44c3dc31bce64fdadfe28742be7fc3ca9..bb1b2db3cc0b239eb7d37a66d437ede3f7b4ea70 100644
--- a/thunar/thunar-launcher.c
+++ b/thunar/thunar-launcher.c
@@ -103,11 +103,37 @@ struct _ThunarLauncher
 
 
 
-static guint launcher_signals[LAST_SIGNAL];
+static GObjectClass *thunar_launcher_parent_class;
+static guint         launcher_signals[LAST_SIGNAL];
 
 
 
-G_DEFINE_TYPE (ThunarLauncher, thunar_launcher, G_TYPE_OBJECT);
+GType
+thunar_launcher_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarLauncherClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_launcher_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarLauncher),
+        0,
+        (GInstanceInitFunc) thunar_launcher_init,
+        NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_OBJECT, I_("ThunarLauncher"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -116,6 +142,9 @@ thunar_launcher_class_init (ThunarLauncherClass *klass)
 {
   GObjectClass *gobject_class;
 
+  /* determine the parent type class */
+  thunar_launcher_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->dispose = thunar_launcher_dispose;
   gobject_class->finalize = thunar_launcher_finalize;
@@ -171,7 +200,7 @@ thunar_launcher_class_init (ThunarLauncherClass *klass)
    * based on the @launcher in the current window (if possible).
    **/
   launcher_signals[OPEN_DIRECTORY] =
-    g_signal_new ("open-directory",
+    g_signal_new (I_("open-directory"),
                   G_TYPE_FROM_CLASS (gobject_class),
                   G_SIGNAL_RUN_LAST,
                   G_STRUCT_OFFSET (ThunarLauncherClass, open_directory),
diff --git a/thunar/thunar-list-model.c b/thunar/thunar-list-model.c
index b2113527010cb13eed18a9a22b7221df302eed75..1d1d3a5222ee64631177899713495a32c96bcb56 100644
--- a/thunar/thunar-list-model.c
+++ b/thunar/thunar-list-model.c
@@ -220,19 +220,61 @@ struct _SortTuple
 
 
 
-static guint list_model_signals[LAST_SIGNAL];
+static GObjectClass *thunar_list_model_parent_class;
+static guint         list_model_signals[LAST_SIGNAL];
 
 
 
-G_DEFINE_TYPE_WITH_CODE (ThunarListModel,
-                         thunar_list_model,
-                         G_TYPE_OBJECT,
-                         G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_MODEL,
-                                                thunar_list_model_tree_model_init)
-                         G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_DRAG_DEST,
-                                                thunar_list_model_drag_dest_init)
-                         G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_SORTABLE,
-                                                thunar_list_model_sortable_init));
+GType
+thunar_list_model_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarListModelClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_list_model_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarListModel),
+        0,
+        (GInstanceInitFunc) thunar_list_model_init,
+        NULL,
+      };
+
+      static const GInterfaceInfo tree_model_info =
+      {
+        (GInterfaceInitFunc) thunar_list_model_tree_model_init,
+        NULL,
+        NULL,
+      };
+
+      static const GInterfaceInfo drag_dest_info =
+      {
+        (GInterfaceInitFunc) thunar_list_model_drag_dest_init,
+        NULL,
+        NULL,
+      };
+
+      static const GInterfaceInfo sortable_info =
+      {
+        (GInterfaceInitFunc) thunar_list_model_sortable_init,
+        NULL,
+        NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_OBJECT, I_("ThunarListModel"), &info, 0);
+      g_type_add_interface_static (type, GTK_TYPE_TREE_MODEL, &tree_model_info);
+      g_type_add_interface_static (type, GTK_TYPE_TREE_DRAG_DEST, &drag_dest_info);
+      g_type_add_interface_static (type, GTK_TYPE_TREE_SORTABLE, &sortable_info);
+    }
+
+  return type;
+}
 
 
 
@@ -241,6 +283,9 @@ thunar_list_model_class_init (ThunarListModelClass *klass)
 {
   GObjectClass *gobject_class;
 
+  /* determine the parent type class */
+  thunar_list_model_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class               = G_OBJECT_CLASS (klass);
   gobject_class->finalize     = thunar_list_model_finalize;
   gobject_class->dispose      = thunar_list_model_dispose;
@@ -308,7 +353,7 @@ thunar_list_model_class_init (ThunarListModelClass *klass)
    * @store content.
    **/
   list_model_signals[ERROR] =
-    g_signal_new ("error",
+    g_signal_new (I_("error"),
                   G_TYPE_FROM_CLASS (gobject_class),
                   G_SIGNAL_RUN_LAST,
                   G_STRUCT_OFFSET (ThunarListModelClass, error),
diff --git a/thunar/thunar-location-bar.c b/thunar/thunar-location-bar.c
index a2b602fea66e5fb959af04461322dfffe6c91ce7..c7b4a7ffc760bfaff2864598d379c66790fb8644 100644
--- a/thunar/thunar-location-bar.c
+++ b/thunar/thunar-location-bar.c
@@ -45,10 +45,7 @@ thunar_location_bar_get_type (void)
         NULL,
       };
 
-      type = g_type_register_static (G_TYPE_INTERFACE,
-                                     "ThunarLocationBar",
-                                     &info, 0);
-
+      type = g_type_register_static (G_TYPE_INTERFACE, I_("ThunarLocationBar"), &info, 0);
       g_type_interface_add_prerequisite (type, THUNAR_TYPE_NAVIGATOR);
     }
 
diff --git a/thunar/thunar-location-buttons.c b/thunar/thunar-location-buttons.c
index c1979d6d80ada98475d6fdd929294dc2a877ef6f..79a5665198c450c3cb266210d71463caa1217286 100644
--- a/thunar/thunar-location-buttons.c
+++ b/thunar/thunar-location-buttons.c
@@ -162,13 +162,52 @@ static const GtkTargetEntry drag_targets[] =
 
 
 
-G_DEFINE_TYPE_WITH_CODE (ThunarLocationButtons,
-                         thunar_location_buttons,
-                         GTK_TYPE_CONTAINER,
-                         G_IMPLEMENT_INTERFACE (THUNAR_TYPE_NAVIGATOR,
-                                                thunar_location_buttons_navigator_init)
-                         G_IMPLEMENT_INTERFACE (THUNAR_TYPE_LOCATION_BAR,
-                                                thunar_location_buttons_location_bar_init));
+static GObjectClass *thunar_location_buttons_parent_class;
+
+
+
+GType
+thunar_location_buttons_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarLocationButtonsClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_location_buttons_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarLocationButtons),
+        0,
+        (GInstanceInitFunc) thunar_location_buttons_init,
+        NULL,
+      };
+
+      static const GInterfaceInfo navigator_info =
+      {
+        (GInterfaceInitFunc) thunar_location_buttons_navigator_init,
+        NULL,
+        NULL,
+      };
+
+      static const GInterfaceInfo location_bar_info =
+      {
+        (GInterfaceInitFunc) thunar_location_buttons_location_bar_init,
+        NULL,
+        NULL,
+      };
+
+      type = g_type_register_static (GTK_TYPE_CONTAINER, I_("ThunarLocationButtons"), &info, 0);
+      g_type_add_interface_static (type, THUNAR_TYPE_NAVIGATOR, &navigator_info);
+      g_type_add_interface_static (type, THUNAR_TYPE_LOCATION_BAR, &location_bar_info);
+    }
+
+  return type;
+}
 
 
 
@@ -179,6 +218,9 @@ thunar_location_buttons_class_init (ThunarLocationButtonsClass *klass)
   GtkWidgetClass    *gtkwidget_class;
   GObjectClass      *gobject_class;
 
+  /* determine the parent type class */
+  thunar_location_buttons_parent_class = g_type_class_peek_parent (klass);
+
   gtk_label_quark = g_quark_from_static_string ("gtk-label");
   thunar_file_quark = g_quark_from_static_string ("thunar-file");
 
diff --git a/thunar/thunar-location-dialog.c b/thunar/thunar-location-dialog.c
index c912adf1026620a903805796c004526932262a54..288d11c4b2b20ecff899a7abf7d56abcaf5515a1 100644
--- a/thunar/thunar-location-dialog.c
+++ b/thunar/thunar-location-dialog.c
@@ -26,8 +26,7 @@
 
 
 
-static void thunar_location_dialog_class_init (ThunarLocationDialogClass *klass);
-static void thunar_location_dialog_init       (ThunarLocationDialog      *location_dialog);
+static void thunar_location_dialog_init (ThunarLocationDialog      *location_dialog);
 
 
 
@@ -45,13 +44,31 @@ struct _ThunarLocationDialog
 
 
 
-G_DEFINE_TYPE (ThunarLocationDialog, thunar_location_dialog, GTK_TYPE_DIALOG);
-
-
-
-static void
-thunar_location_dialog_class_init (ThunarLocationDialogClass *klass)
+GType
+thunar_location_dialog_get_type (void)
 {
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarLocationDialogClass),
+        NULL,
+        NULL,
+        NULL,
+        NULL,
+        NULL,
+        sizeof (ThunarLocationDialog),
+        0,
+        (GInstanceInitFunc) thunar_location_dialog_init,
+        NULL,
+      };
+
+      type = g_type_register_static (GTK_TYPE_DIALOG, I_("ThunarLocationDialog"), &info, 0);
+    }
+  
+  return type;
 }
 
 
diff --git a/thunar/thunar-location-entry.c b/thunar/thunar-location-entry.c
index 9b068fcf11220890b1cf5ad05b7960da24d7c81f..459d8fc55b9af6f8d440535eec172b6dc2e8bfff 100644
--- a/thunar/thunar-location-entry.c
+++ b/thunar/thunar-location-entry.c
@@ -70,13 +70,52 @@ struct _ThunarLocationEntry
 
 
 
-G_DEFINE_TYPE_WITH_CODE (ThunarLocationEntry,
-                         thunar_location_entry,
-                         GTK_TYPE_HBOX,
-                         G_IMPLEMENT_INTERFACE (THUNAR_TYPE_NAVIGATOR,
-                                                thunar_location_entry_navigator_init)
-                         G_IMPLEMENT_INTERFACE (THUNAR_TYPE_LOCATION_BAR,
-                                                thunar_location_entry_location_bar_init));
+static GObjectClass *thunar_location_entry_parent_class;
+
+
+
+GType
+thunar_location_entry_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarLocationEntryClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_location_entry_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarLocationEntry),
+        0,
+        (GInstanceInitFunc) thunar_location_entry_init,
+        NULL,
+      };
+
+      static const GInterfaceInfo navigator_info =
+      {
+        (GInterfaceInitFunc) thunar_location_entry_navigator_init,
+        NULL,
+        NULL,
+      };
+
+      static const GInterfaceInfo location_bar_info =
+      {
+        (GInterfaceInitFunc) thunar_location_entry_location_bar_init,
+        NULL,
+        NULL,
+      };
+
+      type = g_type_register_static (GTK_TYPE_HBOX, I_("ThunarLocationEntry"), &info, 0);
+      g_type_add_interface_static (type, THUNAR_TYPE_NAVIGATOR, &navigator_info);
+      g_type_add_interface_static (type, THUNAR_TYPE_LOCATION_BAR, &location_bar_info);
+    }
+
+  return type;
+}
 
 
 
@@ -85,6 +124,9 @@ thunar_location_entry_class_init (ThunarLocationEntryClass *klass)
 {
   GObjectClass *gobject_class;
 
+  /* determine the parent type class */
+  thunar_location_entry_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = thunar_location_entry_finalize;
   gobject_class->get_property = thunar_location_entry_get_property;
diff --git a/thunar/thunar-metafile.c b/thunar/thunar-metafile.c
index cb7e08c2e63eafe2688c1fed69a643c5cce9e296..8783ad8ea39d657478adaaf8327850b124da8e99 100644
--- a/thunar/thunar-metafile.c
+++ b/thunar/thunar-metafile.c
@@ -66,7 +66,36 @@ struct _ThunarMetafile
 
 
 
-G_DEFINE_TYPE (ThunarMetafile, thunar_metafile, G_TYPE_OBJECT);
+static GObjectClass *thunar_metafile_parent_class;
+
+
+
+GType
+thunar_metafile_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarMetafileClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_metafile_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarMetafile),
+        0,
+        (GInstanceInitFunc) thunar_metafile_init,
+        NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_OBJECT, I_("ThunarMetafile"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -75,6 +104,9 @@ thunar_metafile_class_init (ThunarMetafileClass *klass)
 {
   GObjectClass *gobject_class;
 
+  /* determine the parent type class */
+  thunar_metafile_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = thunar_metafile_finalize;
 }
diff --git a/thunar/thunar-navigator.c b/thunar/thunar-navigator.c
index 047a0efd8e92ad492f980162d9ea3fc0e5bbfaa9..75db0393e8d3953b9158513f28cc3f3b436ec91b 100644
--- a/thunar/thunar-navigator.c
+++ b/thunar/thunar-navigator.c
@@ -62,9 +62,7 @@ thunar_navigator_get_type (void)
         NULL,
       };
 
-      type = g_type_register_static (G_TYPE_INTERFACE,
-                                     "ThunarNavigator",
-                                     &info, 0);
+      type = g_type_register_static (G_TYPE_INTERFACE, I_("ThunarNavigator"), &info, 0);
     }
 
   return type;
@@ -99,7 +97,7 @@ thunar_navigator_base_init (gpointer klass)
        * or the "current-directory" property.
        **/
       navigator_signals[CHANGE_DIRECTORY] =
-        g_signal_new ("change-directory",
+        g_signal_new (I_("change-directory"),
                       G_TYPE_FROM_INTERFACE (klass),
                       G_SIGNAL_RUN_LAST,
                       G_STRUCT_OFFSET (ThunarNavigatorIface, change_directory),
diff --git a/thunar/thunar-open-with-action.c b/thunar/thunar-open-with-action.c
index b7829549a192614b0a6fdd024442d780718f0986..e8f36803de07375322dc540ea007702fd32b1b03 100644
--- a/thunar/thunar-open-with-action.c
+++ b/thunar/thunar-open-with-action.c
@@ -82,9 +82,37 @@ struct _ThunarOpenWithAction
 
 
 
-static guint open_with_action_signals[LAST_SIGNAL];
+static GObjectClass *thunar_open_with_action_parent_class;
+static guint         open_with_action_signals[LAST_SIGNAL];
 
-G_DEFINE_TYPE (ThunarOpenWithAction, thunar_open_with_action, GTK_TYPE_ACTION);
+
+
+GType
+thunar_open_with_action_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarOpenWithActionClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_open_with_action_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarOpenWithAction),
+        0,
+        (GInstanceInitFunc) thunar_open_with_action_init,
+        NULL,
+      };
+
+      type = g_type_register_static (GTK_TYPE_ACTION, I_("ThunarOpenWithAction"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -94,6 +122,9 @@ thunar_open_with_action_class_init (ThunarOpenWithActionClass *klass)
   GtkActionClass *gtkaction_class;
   GObjectClass   *gobject_class;
 
+  /* determine the parent type class */
+  thunar_open_with_action_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->dispose = thunar_open_with_action_dispose;
   gobject_class->finalize = thunar_open_with_action_finalize;
@@ -127,7 +158,7 @@ thunar_open_with_action_class_init (ThunarOpenWithActionClass *klass)
    * open @path_list with @application.
    **/
   open_with_action_signals[OPEN_APPLICATION] =
-    g_signal_new ("open-application",
+    g_signal_new (I_("open-application"),
                   G_TYPE_FROM_CLASS (gobject_class),
                   G_SIGNAL_RUN_LAST,
                   G_STRUCT_OFFSET (ThunarOpenWithActionClass, open_application),
@@ -251,7 +282,7 @@ thunar_open_with_action_activated (GtkWidget            *item,
     return;
 
   /* query the launch parameters for this application item */
-  application = g_object_get_data (G_OBJECT (item), "thunar-vfs-mime-application");
+  application = g_object_get_data (G_OBJECT (item), I_("thunar-vfs-mime-application"));
 
   /* generate a single item list */
   path_list.data = thunar_file_get_path (file);
@@ -319,7 +350,7 @@ thunar_open_with_action_menu_mapped (GtkWidget            *menu,
 
       text = g_strdup_printf (_("%s (default)"), thunar_vfs_mime_application_get_name (default_application));
       item = gtk_image_menu_item_new_with_label (text);
-      g_object_set_data_full (G_OBJECT (item), "thunar-vfs-mime-application", default_application, (GDestroyNotify) thunar_vfs_mime_application_unref);
+      g_object_set_data_full (G_OBJECT (item), I_("thunar-vfs-mime-application"), default_application, (GDestroyNotify) thunar_vfs_mime_application_unref);
       g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (thunar_open_with_action_activated), open_with_action);
       gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
       gtk_widget_show (item);
@@ -345,7 +376,7 @@ thunar_open_with_action_menu_mapped (GtkWidget            *menu,
       for (lp = applications; lp != NULL; lp = lp->next)
         {
           item = gtk_image_menu_item_new_with_label (thunar_vfs_mime_application_get_name (lp->data));
-          g_object_set_data_full (G_OBJECT (item), "thunar-vfs-mime-application", lp->data, (GDestroyNotify) thunar_vfs_mime_application_unref);
+          g_object_set_data_full (G_OBJECT (item), I_("thunar-vfs-mime-application"), lp->data, (GDestroyNotify) thunar_vfs_mime_application_unref);
           g_signal_connect (G_OBJECT (item), "activate", G_CALLBACK (thunar_open_with_action_activated), open_with_action);
           gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
           gtk_widget_show (item);
diff --git a/thunar/thunar-path-entry.c b/thunar/thunar-path-entry.c
index 2961581493961fa8a42ac098b4d191ca4b38b447..9f46a5888c54f1a015d7d5656a9f164231e5bd7f 100644
--- a/thunar/thunar-path-entry.c
+++ b/thunar/thunar-path-entry.c
@@ -50,7 +50,6 @@ enum
 
 static void     thunar_path_entry_class_init            (ThunarPathEntryClass *klass);
 static void     thunar_path_entry_editable_init         (GtkEditableClass     *iface);
-static void     thunar_path_entry_init                  (ThunarPathEntry      *path_entry);
 static void     thunar_path_entry_finalize              (GObject              *object);
 static void     thunar_path_entry_get_property          (GObject              *object,  
                                                          guint                 prop_id,
@@ -119,13 +118,47 @@ static const GtkTargetEntry drag_targets[] =
   { "text/uri-list", 0, 0, },
 };
 
+
+
 static GtkEditableClass *thunar_path_entry_editable_parent_iface;
+static GObjectClass     *thunar_path_entry_parent_class;
+
 
-G_DEFINE_TYPE_WITH_CODE (ThunarPathEntry,
-                         thunar_path_entry,
-                         GTK_TYPE_ENTRY,
-                         G_IMPLEMENT_INTERFACE (GTK_TYPE_EDITABLE,
-                                                thunar_path_entry_editable_init));
+
+GType
+thunar_path_entry_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarPathEntryClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_path_entry_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarPathEntry),
+        0,
+        NULL,
+        NULL,
+      };
+
+      static const GInterfaceInfo editable_info =
+      {
+        (GInterfaceInitFunc) thunar_path_entry_editable_init,
+        NULL,
+        NULL,
+      };
+
+      type = g_type_register_static (GTK_TYPE_ENTRY, I_("ThunarPathEntry"), &info, 0);
+      g_type_add_interface_static (type, GTK_TYPE_EDITABLE, &editable_info);
+    }
+
+  return type;
+}
 
 
 
@@ -136,6 +169,9 @@ thunar_path_entry_class_init (ThunarPathEntryClass *klass)
   GtkEntryClass  *gtkentry_class;
   GObjectClass   *gobject_class;
 
+  /* determine the parent type class */
+  thunar_path_entry_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = thunar_path_entry_finalize;
   gobject_class->get_property = thunar_path_entry_get_property;
@@ -193,14 +229,6 @@ thunar_path_entry_editable_init (GtkEditableClass *iface)
 
 
 
-static void
-thunar_path_entry_init (ThunarPathEntry *path_entry)
-{
-  path_entry->drag_button = -1;
-}
-
-
-
 static void
 thunar_path_entry_finalize (GObject *object)
 {
@@ -506,7 +534,7 @@ thunar_path_entry_button_release_event (GtkWidget      *widget,
   if (event->window == path_entry->icon_area && event->button == path_entry->drag_button)
     {
       /* reset the drag button state */
-      path_entry->drag_button = -1;
+      path_entry->drag_button = 0;
       return TRUE;
     }
 
@@ -525,7 +553,7 @@ thunar_path_entry_motion_notify_event (GtkWidget      *widget,
   GdkPixbuf       *icon;
   gint             size;
 
-  if (event->window == path_entry->icon_area && path_entry->drag_button >= 0 && path_entry->current_file != NULL
+  if (event->window == path_entry->icon_area && path_entry->drag_button > 0 && path_entry->current_file != NULL
       && gtk_drag_check_threshold (widget, path_entry->drag_x, path_entry->drag_y, event->x, event->y))
     {
       /* create the drag context */
@@ -543,7 +571,7 @@ thunar_path_entry_motion_notify_event (GtkWidget      *widget,
         }
 
       /* reset the drag button state */
-      path_entry->drag_button = -1;
+      path_entry->drag_button = 0;
 
       return TRUE;
     }
diff --git a/thunar/thunar-preferences-dialog.c b/thunar/thunar-preferences-dialog.c
index 3cde958f80574ab72f47d0b6b468f3391ea8aa6e..2b0a4a1eea67b1386cd541aca7d774b30ba7b1ba 100644
--- a/thunar/thunar-preferences-dialog.c
+++ b/thunar/thunar-preferences-dialog.c
@@ -53,7 +53,36 @@ struct _ThunarPreferencesDialog
 
 
 
-G_DEFINE_TYPE (ThunarPreferencesDialog, thunar_preferences_dialog, GTK_TYPE_DIALOG);
+static GObjectClass *thunar_preferences_dialog_parent_class;
+
+
+
+GType
+thunar_preferences_dialog_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarPreferencesDialogClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_preferences_dialog_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarPreferencesDialog),
+        0,
+        (GInstanceInitFunc) thunar_preferences_dialog_init,
+        NULL,
+      };
+
+      type = g_type_register_static (GTK_TYPE_DIALOG, I_("ThunarPreferencesDialog"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -108,6 +137,9 @@ thunar_preferences_dialog_class_init (ThunarPreferencesDialogClass *klass)
   GtkDialogClass *gtkdialog_class;
   GObjectClass   *gobject_class;
 
+  /* determine the parent type class */
+  thunar_preferences_dialog_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = thunar_preferences_dialog_finalize;
 
diff --git a/thunar/thunar-preferences.c b/thunar/thunar-preferences.c
index 9ab063d98b8219126d0d957c36b3cffcdcf2a537..518354720fdf73a036c552f5bf9f7fd18677aaaa 100644
--- a/thunar/thunar-preferences.c
+++ b/thunar/thunar-preferences.c
@@ -91,7 +91,36 @@ struct _ThunarPreferences
 
 
 
-G_DEFINE_TYPE (ThunarPreferences, thunar_preferences, G_TYPE_OBJECT);
+static GObjectClass *thunar_preferences_parent_class;
+
+
+
+GType
+thunar_preferences_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarPreferencesClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_preferences_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarPreferences),
+        0,
+        (GInstanceInitFunc) thunar_preferences_init,
+        NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_OBJECT, I_("ThunarPreferences"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -100,6 +129,9 @@ thunar_preferences_class_init (ThunarPreferencesClass *klass)
 {
   GObjectClass *gobject_class;
 
+  /* determine the parent type class */
+  thunar_preferences_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = thunar_preferences_finalize;
   gobject_class->get_property = thunar_preferences_get_property;
diff --git a/thunar/thunar-progress-dialog.c b/thunar/thunar-progress-dialog.c
index b0ff845032e613aa68db6e189c5e0f84ddef6a6b..1c06f0c2c0d91dd9d92a09e56151a439b11e3bfb 100644
--- a/thunar/thunar-progress-dialog.c
+++ b/thunar/thunar-progress-dialog.c
@@ -88,7 +88,36 @@ struct _ThunarProgressDialog
 
 
 
-G_DEFINE_TYPE (ThunarProgressDialog, thunar_progress_dialog, GTK_TYPE_DIALOG);
+static GObjectClass *thunar_progress_dialog_parent_class;
+
+
+
+GType
+thunar_progress_dialog_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarProgressDialogClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_progress_dialog_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarProgressDialog),
+        0,
+        (GInstanceInitFunc) thunar_progress_dialog_init,
+        NULL,
+      };
+
+      type = g_type_register_static (GTK_TYPE_DIALOG, I_("ThunarProgressDialog"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -109,6 +138,9 @@ thunar_progress_dialog_class_init (ThunarProgressDialogClass *klass)
   GtkDialogClass *gtkdialog_class;
   GObjectClass   *gobject_class;
 
+  /* determine the parent type class */
+  thunar_progress_dialog_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->dispose = thunar_progress_dialog_dispose;
   gobject_class->get_property = thunar_progress_dialog_get_property;
diff --git a/thunar/thunar-properties-dialog.c b/thunar/thunar-properties-dialog.c
index 7a0f73fb7ac898b1113da39aae38c8499fcca7b2..67ed7db39fdfbf0e6fb9b83cfc29b44dfe5bd375 100644
--- a/thunar/thunar-properties-dialog.c
+++ b/thunar/thunar-properties-dialog.c
@@ -103,7 +103,36 @@ struct _ThunarPropertiesDialog
 
 
 
-G_DEFINE_TYPE (ThunarPropertiesDialog, thunar_properties_dialog, GTK_TYPE_DIALOG);
+static GObjectClass *thunar_properties_dialog_parent_class;
+
+
+
+GType
+thunar_properties_dialog_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarPropertiesDialogClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_properties_dialog_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarPropertiesDialog),
+        0,
+        (GInstanceInitFunc) thunar_properties_dialog_init,
+        NULL,
+      };
+
+      type = g_type_register_static (GTK_TYPE_DIALOG, I_("ThunarPropertiesDialog"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -114,6 +143,9 @@ thunar_properties_dialog_class_init (ThunarPropertiesDialogClass *klass)
   GtkWidgetClass *gtkwidget_class;
   GObjectClass   *gobject_class;
 
+  /* determine the parent type class */
+  thunar_properties_dialog_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->dispose = thunar_properties_dialog_dispose;
   gobject_class->finalize = thunar_properties_dialog_finalize;
diff --git a/thunar/thunar-side-pane.c b/thunar/thunar-side-pane.c
index 1c1e24441a7098f021f452cb957d6dbcde27ed79..f75110b7d8529ec15b5af37c17debf37bfab1baf 100644
--- a/thunar/thunar-side-pane.c
+++ b/thunar/thunar-side-pane.c
@@ -45,10 +45,7 @@ thunar_side_pane_get_type (void)
         NULL,
       };
 
-      type = g_type_register_static (G_TYPE_INTERFACE,
-                                     "ThunarSidePane",
-                                     &info, 0);
-
+      type = g_type_register_static (G_TYPE_INTERFACE, I_("ThunarSidePane"), &info, 0);
       g_type_interface_add_prerequisite (type, GTK_TYPE_WIDGET);
       g_type_interface_add_prerequisite (type, THUNAR_TYPE_NAVIGATOR);
     }
diff --git a/thunar/thunar-standard-view.c b/thunar/thunar-standard-view.c
index 148c13faed03845584991922f17d8f2136ad471e..2b0a73e09500a794fd34f73b18b41230a5e0eda5 100644
--- a/thunar/thunar-standard-view.c
+++ b/thunar/thunar-standard-view.c
@@ -320,10 +320,7 @@ thunar_standard_view_get_type (void)
         NULL,
       };
 
-      type = g_type_register_static (GTK_TYPE_SCROLLED_WINDOW,
-                                     "ThunarStandardView",
-                                     &info, G_TYPE_FLAG_ABSTRACT);
-
+      type = g_type_register_static (GTK_TYPE_SCROLLED_WINDOW, I_("ThunarStandardView"), &info, G_TYPE_FLAG_ABSTRACT);
       g_type_add_interface_static (type, THUNAR_TYPE_NAVIGATOR, &navigator_info);
       g_type_add_interface_static (type, THUNAR_TYPE_VIEW, &view_info);
     }
@@ -386,7 +383,7 @@ thunar_standard_view_class_init (ThunarStandardViewClass *klass)
    * is an internal signal used to bind the action to keys.
    **/
   standard_view_signals[DELETE_SELECTED_FILES] =
-    g_signal_new ("delete-selected-files",
+    g_signal_new (I_("delete-selected-files"),
                   G_TYPE_FROM_CLASS (klass),
                   G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                   G_STRUCT_OFFSET (ThunarStandardViewClass, delete_selected_files),
@@ -2225,8 +2222,10 @@ thunar_standard_view_loading_unbound (gpointer user_data)
   if (G_UNLIKELY (standard_view->loading))
     {
       standard_view->loading = FALSE;
+      g_object_freeze_notify (G_OBJECT (standard_view));
       g_object_notify (G_OBJECT (standard_view), "loading");
       g_object_notify (G_OBJECT (standard_view), "statusbar-text");
+      g_object_thaw_notify (G_OBJECT (standard_view));
     }
 }
 
diff --git a/thunar/thunar-statusbar.c b/thunar/thunar-statusbar.c
index 2004d416deaa0bc62fd731b63d31ab129626be58..3f1a673062fb7a36e0d929d95995620e9e242b37 100644
--- a/thunar/thunar-statusbar.c
+++ b/thunar/thunar-statusbar.c
@@ -148,7 +148,7 @@ thunar_statusbar_icon_get_type (void)
         NULL,
       };
 
-      type = g_type_register_static (GTK_TYPE_WIDGET, "ThunarStatusbarIcon", &info, 0);
+      type = g_type_register_static (GTK_TYPE_WIDGET, I_("ThunarStatusbarIcon"), &info, 0);
     }
 
   return type;
@@ -708,11 +708,40 @@ struct _ThunarStatusbar
 
 
 
-G_DEFINE_TYPE_WITH_CODE (ThunarStatusbar,
-                         thunar_statusbar,
-                         GTK_TYPE_STATUSBAR,
-                         G_IMPLEMENT_INTERFACE (THUNAR_TYPE_NAVIGATOR,
-                                                thunar_statusbar_navigator_init));
+GType
+thunar_statusbar_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarStatusbarClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_statusbar_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarStatusbar),
+        0,
+        (GInstanceInitFunc) thunar_statusbar_init,
+        NULL,
+      };
+
+      static const GInterfaceInfo navigator_info =
+      {
+        (GInterfaceInitFunc) thunar_statusbar_navigator_init,
+        NULL,
+        NULL,
+      };
+
+      type = g_type_register_static (GTK_TYPE_STATUSBAR, I_("ThunarStatusbar"), &info, 0);
+      g_type_add_interface_static (type, THUNAR_TYPE_NAVIGATOR, &navigator_info);
+    }
+
+  return type;
+}
 
 
 
diff --git a/thunar/thunar-text-renderer.c b/thunar/thunar-text-renderer.c
index f4f7344ae149b9329d06df893197ba33e2bd9f12..c1d232f2440d5f90bb8f6c7266e3eb079f0f705f 100644
--- a/thunar/thunar-text-renderer.c
+++ b/thunar/thunar-text-renderer.c
@@ -134,11 +134,37 @@ struct _ThunarTextRenderer
 
 
 
-static guint text_renderer_signals[LAST_SIGNAL];
+static GObjectClass *thunar_text_renderer_parent_class;
+static guint         text_renderer_signals[LAST_SIGNAL];
 
 
 
-G_DEFINE_TYPE (ThunarTextRenderer, thunar_text_renderer, GTK_TYPE_CELL_RENDERER);
+GType
+thunar_text_renderer_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarTextRendererClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_text_renderer_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarTextRenderer),
+        0,
+        (GInstanceInitFunc) thunar_text_renderer_init,
+        NULL,
+      };
+
+      type = g_type_register_static (GTK_TYPE_CELL_RENDERER, I_("ThunarTextRenderer"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -148,6 +174,9 @@ thunar_text_renderer_class_init (ThunarTextRendererClass *klass)
   GtkCellRendererClass *gtkcell_renderer_class;
   GObjectClass         *gobject_class;
 
+  /* determine the parent type class */
+  thunar_text_renderer_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = thunar_text_renderer_finalize;
   gobject_class->get_property = thunar_text_renderer_get_property;
@@ -228,7 +257,7 @@ thunar_text_renderer_class_init (ThunarTextRendererClass *klass)
    * Emitted whenever the user successfully edits a cell.
    **/
   text_renderer_signals[EDITED] =
-    g_signal_new ("edited",
+    g_signal_new (I_("edited"),
                   G_OBJECT_CLASS_TYPE (gobject_class),
                   G_SIGNAL_RUN_LAST,
                   G_STRUCT_OFFSET (ThunarTextRendererClass, edited),
@@ -256,7 +285,7 @@ thunar_text_renderer_finalize (GObject *object)
   /* drop the cached widget */
   thunar_text_renderer_set_widget (text_renderer, NULL);
 
-  G_OBJECT_CLASS (thunar_text_renderer_parent_class)->finalize (object);
+  (*G_OBJECT_CLASS (thunar_text_renderer_parent_class)->finalize) (object);
 }
 
 
@@ -574,7 +603,7 @@ thunar_text_renderer_start_editing (GtkCellRenderer     *renderer,
   gtk_editable_select_region (GTK_EDITABLE (text_renderer->entry), 0, -1);
 
   /* remember the tree path that we're editing */
-  g_object_set_data_full (G_OBJECT (text_renderer->entry), "thunar-text-renderer-path", g_strdup (path), g_free);
+  g_object_set_data_full (G_OBJECT (text_renderer->entry), I_("thunar-text-renderer-path"), g_strdup (path), g_free);
 
   /* connect required signals */
   g_signal_connect (G_OBJECT (text_renderer->entry), "editing-done", G_CALLBACK (thunar_text_renderer_editing_done), text_renderer);
@@ -663,7 +692,7 @@ thunar_text_renderer_editing_done (GtkCellEditable    *editable,
   if (G_LIKELY (!GTK_ENTRY (editable)->editing_canceled))
     {
       text = gtk_entry_get_text (GTK_ENTRY (editable));
-      path = g_object_get_data (G_OBJECT (editable), "thunar-text-renderer-path");
+      path = g_object_get_data (G_OBJECT (editable), I_("thunar-text-renderer-path"));
       g_signal_emit (G_OBJECT (text_renderer), text_renderer_signals[EDITED], 0, path, text);
     }
 }
diff --git a/thunar/thunar-thumbnail-generator.c b/thunar/thunar-thumbnail-generator.c
index 44191251908bf516ef942319e1090350a093f636..a2b59e09ef3c22450c859d9805cbabfbdb84c3f1 100644
--- a/thunar/thunar-thumbnail-generator.c
+++ b/thunar/thunar-thumbnail-generator.c
@@ -65,7 +65,36 @@ struct _ThunarThumbnailInfo
 
 
 
-G_DEFINE_TYPE (ThunarThumbnailGenerator, thunar_thumbnail_generator, G_TYPE_OBJECT);
+static GObjectClass *thunar_thumbnail_generator_parent_class;
+
+
+
+GType
+thunar_thumbnail_generator_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarThumbnailGeneratorClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_thumbnail_generator_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarThumbnailGenerator),
+        0,
+        (GInstanceInitFunc) thunar_thumbnail_generator_init,
+        NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_OBJECT, I_("ThunarThumbnailGenerator"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -74,6 +103,9 @@ thunar_thumbnail_generator_class_init (ThunarThumbnailGeneratorClass *klass)
 {
   GObjectClass *gobject_class;
 
+  /* determine the parent type class */
+  thunar_thumbnail_generator_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = thunar_thumbnail_generator_finalize;
 }
diff --git a/thunar/thunar-view.c b/thunar/thunar-view.c
index db85252f4b74a6e1c914ef6439e9ea852acd1de6..17e556d553f4a3a24ea560a089876879aa46c1eb 100644
--- a/thunar/thunar-view.c
+++ b/thunar/thunar-view.c
@@ -49,10 +49,7 @@ thunar_view_get_type (void)
         NULL,
       };
 
-      type = g_type_register_static (G_TYPE_INTERFACE,
-                                     "ThunarView",
-                                     &info, 0);
-
+      type = g_type_register_static (G_TYPE_INTERFACE, I_("ThunarView"), &info, 0);
       g_type_interface_add_prerequisite (type, GTK_TYPE_WIDGET);
       g_type_interface_add_prerequisite (type, THUNAR_TYPE_NAVIGATOR);
     }
diff --git a/thunar/thunar-window.c b/thunar/thunar-window.c
index aa887425fabe53f47230ab2c8c70ef0c96d9485a..b89951da1c54070bb2635fbe4896ed233a52b130 100644
--- a/thunar/thunar-window.c
+++ b/thunar/thunar-window.c
@@ -181,7 +181,36 @@ static const GtkToggleActionEntry toggle_action_entries[] =
 
 
 
-G_DEFINE_TYPE (ThunarWindow, thunar_window, GTK_TYPE_WINDOW);
+static GObjectClass *thunar_window_parent_class;
+
+
+
+GType
+thunar_window_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarWindowClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunar_window_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarWindow),
+        0,
+        (GInstanceInitFunc) thunar_window_init,
+        NULL,
+      };
+
+      type = g_type_register_static (GTK_TYPE_WINDOW, I_("ThunarWindow"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -191,6 +220,9 @@ thunar_window_class_init (ThunarWindowClass *klass)
   GtkWidgetClass *gtkwidget_class;
   GObjectClass   *gobject_class;
 
+  /* determine the parent type class */
+  thunar_window_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->dispose = thunar_window_dispose;
   gobject_class->finalize = thunar_window_finalize;
@@ -999,7 +1031,7 @@ thunar_window_menu_item_selected (GtkWidget    *menu_item,
   gchar     *tooltip;
 
   /* determine the action for the menu item */
-  action = g_object_get_data (G_OBJECT (menu_item), "gtk-action");
+  action = g_object_get_data (G_OBJECT (menu_item), I_("gtk-action"));
   if (G_UNLIKELY (action == NULL))
     return;
 
diff --git a/thunarx/Makefile.am b/thunarx/Makefile.am
index 1c1bad21faceb11e3fd7a717917db778d445662a..aa38784310901384ed4f36acea13ca5462102e31 100644
--- a/thunarx/Makefile.am
+++ b/thunarx/Makefile.am
@@ -36,6 +36,7 @@ libthunarx_1_la_SOURCES =						\
 	thunarx-config.c						\
 	thunarx-file-info.c						\
 	thunarx-menu-provider.c						\
+	thunarx-private.h						\
 	thunarx-property-page.c						\
 	thunarx-property-page-provider.c				\
 	thunarx-provider-factory.c					\
diff --git a/thunarx/thunarx-file-info.c b/thunarx/thunarx-file-info.c
index c1d279cc19c7fc9af6976700a39c7eb4b26d5d18..6a669d1b2afbf349d80108e6f71395ee0434bf84 100644
--- a/thunarx/thunarx-file-info.c
+++ b/thunarx/thunarx-file-info.c
@@ -23,6 +23,7 @@
 #endif
 
 #include <thunarx/thunarx-file-info.h>
+#include <thunarx/thunarx-private.h>
 #include <thunarx/thunarx-alias.h>
 
 
@@ -48,8 +49,7 @@ thunarx_file_info_get_type (void)
         NULL,
       };
 
-      type = g_type_register_static (G_TYPE_INTERFACE, "ThunarxFileInfo", &info, 0);
-
+      type = g_type_register_static (G_TYPE_INTERFACE, I_("ThunarxFileInfo"), &info, 0);
       g_type_interface_add_prerequisite (type, G_TYPE_OBJECT);
     }
 
diff --git a/thunarx/thunarx-menu-provider.c b/thunarx/thunarx-menu-provider.c
index f697a4956632b0142a75c6ff16c47c63df8ae953..70f82a16eae6139d7efd00858ecd6a96ac4ee6d7 100644
--- a/thunarx/thunarx-menu-provider.c
+++ b/thunarx/thunarx-menu-provider.c
@@ -23,6 +23,7 @@
 #endif
 
 #include <thunarx/thunarx-menu-provider.h>
+#include <thunarx/thunarx-private.h>
 #include <thunarx/thunarx-alias.h>
 
 
@@ -53,7 +54,7 @@ thunarx_menu_provider_get_type (void)
       };
 
       /* register the menu provider interface */
-      type = g_type_register_static (G_TYPE_INTERFACE, "ThunarxMenuProvider", &info, 0);
+      type = g_type_register_static (G_TYPE_INTERFACE, I_("ThunarxMenuProvider"), &info, 0);
       g_type_interface_add_prerequisite (type, G_TYPE_OBJECT);
 
       /* allocate the thunarx-menu-provider-action quark */
diff --git a/thunarx/thunarx-private.h b/thunarx/thunarx-private.h
new file mode 100644
index 0000000000000000000000000000000000000000..2f2d4ac425c21d48e0bb7fba8417dcea0c7661bb
--- /dev/null
+++ b/thunarx/thunarx-private.h
@@ -0,0 +1,40 @@
+/* $Id$ */
+/*-
+ * Copyright (c) 2005 Benedikt Meurer <benny@xfce.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#if !defined(THUNARX_INSIDE_THUNARX_H) && !defined(THUNARX_COMPILATION)
+#error "Only <thunarx/thunarx.h> can be included directly, this file may disappear or change contents"
+#endif
+
+#ifndef __THUNARX_PRIVATE_H__
+#define __THUNARX_PRIVATE_H__
+
+#include <glib.h>
+
+G_BEGIN_DECLS;
+
+#if GLIB_CHECK_VERSION(2,9,0)
+#define I_(string) (g_intern_static_string ((string)))
+#else
+#define I_(string) (g_quark_to_string (g_quark_from_static_string ((string))))
+#endif
+
+G_END_DECLS;
+
+#endif /* !__THUNARX_PRIVATE_H__ */
diff --git a/thunarx/thunarx-property-page-provider.c b/thunarx/thunarx-property-page-provider.c
index c1caec61b8e81a7d4628ae62e125b44aae94b050..06aa0d5300d1fd5181ba6f10f2915ec7a1aaee79 100644
--- a/thunarx/thunarx-property-page-provider.c
+++ b/thunarx/thunarx-property-page-provider.c
@@ -22,6 +22,7 @@
 #include <config.h>
 #endif
 
+#include <thunarx/thunarx-private.h>
 #include <thunarx/thunarx-property-page-provider.h>
 #include <thunarx/thunarx-alias.h>
 
@@ -53,7 +54,7 @@ thunarx_property_page_provider_get_type (void)
       };
 
       /* register the property page provider interface */
-      type = g_type_register_static (G_TYPE_INTERFACE, "ThunarxPropertyPageProvider", &info, 0);
+      type = g_type_register_static (G_TYPE_INTERFACE, I_("ThunarxPropertyPageProvider"), &info, 0);
       g_type_interface_add_prerequisite (type, G_TYPE_OBJECT);
 
       /* allocate the thunarx-property-page quark */
diff --git a/thunarx/thunarx-property-page.c b/thunarx/thunarx-property-page.c
index 554ac6ffc6f83cfbb1b926f782153d28a87abfef..c37902a8e6927fe21d4bc612d6502a3608a5f0a1 100644
--- a/thunarx/thunarx-property-page.c
+++ b/thunarx/thunarx-property-page.c
@@ -24,6 +24,7 @@
 
 #include <glib/gi18n-lib.h>
 
+#include <thunarx/thunarx-private.h>
 #include <thunarx/thunarx-property-page.h>
 #include <thunarx/thunarx-alias.h>
 
@@ -68,7 +69,36 @@ struct _ThunarxPropertyPagePrivate
 
 
 
-G_DEFINE_TYPE (ThunarxPropertyPage, thunarx_property_page, GTK_TYPE_BIN);
+static GObjectClass *thunarx_property_page_parent_class;
+
+
+
+GType
+thunarx_property_page_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarxPropertyPageClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunarx_property_page_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarxPropertyPage),
+        0,
+        (GInstanceInitFunc) thunarx_property_page_init,
+        NULL,
+      };
+
+      type = g_type_register_static (GTK_TYPE_BIN, I_("ThunarxPropertyPage"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -79,6 +109,9 @@ thunarx_property_page_class_init (ThunarxPropertyPageClass *klass)
   GtkWidgetClass *gtkwidget_class;
   GObjectClass   *gobject_class;
 
+  /* determine the parent type class */
+  thunarx_property_page_parent_class = g_type_class_peek_parent (klass);
+
   /* add our private data to the class type */
   g_type_class_add_private (klass, sizeof (ThunarxPropertyPagePrivate));
 
diff --git a/thunarx/thunarx-provider-factory.c b/thunarx/thunarx-provider-factory.c
index a9105d0d2444d8895e1b52581dcec798f9578598..8b13437c1535ae242085ad98c0a24a58f1a1fd35 100644
--- a/thunarx/thunarx-provider-factory.c
+++ b/thunarx/thunarx-provider-factory.c
@@ -24,6 +24,7 @@
 
 #include <gdk/gdk.h>
 
+#include <thunarx/thunarx-private.h>
 #include <thunarx/thunarx-provider-factory.h>
 #include <thunarx/thunarx-provider-module.h>
 #include <thunarx/thunarx-provider-plugin.h>
@@ -71,7 +72,36 @@ struct _ThunarxProviderFactory
 
 
 
-G_DEFINE_TYPE (ThunarxProviderFactory, thunarx_provider_factory, G_TYPE_OBJECT);
+static GObjectClass *thunarx_provider_factory_parent_class;
+
+
+
+GType
+thunarx_provider_factory_get_type (void)
+{
+  static GType type = G_TYPE_INVALID;
+
+  if (G_UNLIKELY (type == G_TYPE_INVALID))
+    {
+      static const GTypeInfo info =
+      {
+        sizeof (ThunarxProviderFactoryClass),
+        NULL,
+        NULL,
+        (GClassInitFunc) thunarx_provider_factory_class_init,
+        NULL,
+        NULL,
+        sizeof (ThunarxProviderFactory),
+        0,
+        (GInstanceInitFunc) thunarx_provider_factory_init,
+        NULL,
+      };
+
+      type = g_type_register_static (G_TYPE_OBJECT, I_("ThunarxProviderFactory"), &info, 0);
+    }
+
+  return type;
+}
 
 
 
@@ -80,6 +110,9 @@ thunarx_provider_factory_class_init (ThunarxProviderFactoryClass *klass)
 {
   GObjectClass *gobject_class;
 
+  /* determine the parent type class */
+  thunarx_provider_factory_parent_class = g_type_class_peek_parent (klass);
+
   gobject_class = G_OBJECT_CLASS (klass);
   gobject_class->finalize = thunarx_provider_factory_finalize;
 }
diff --git a/thunarx/thunarx-provider-module.c b/thunarx/thunarx-provider-module.c
index 73ea192374c10fb53bd9e477a3bd1b4df674d312..601a085dd27c9aabd19242576adaf76731cdde78 100644
--- a/thunarx/thunarx-provider-module.c
+++ b/thunarx/thunarx-provider-module.c
@@ -24,6 +24,7 @@
 
 #include <gmodule.h>
 
+#include <thunarx/thunarx-private.h>
 #include <thunarx/thunarx-provider-module.h>
 #include <thunarx/thunarx-provider-plugin.h>
 #include <thunarx/thunarx-alias.h>
@@ -109,7 +110,7 @@ thunarx_provider_module_get_type (void)
         NULL,
       };
 
-      type = g_type_register_static (G_TYPE_TYPE_MODULE, "ThunarxProviderModule", &info, 0);
+      type = g_type_register_static (G_TYPE_TYPE_MODULE, I_("ThunarxProviderModule"), &info, 0);
       g_type_add_interface_static (type, THUNARX_TYPE_PROVIDER_PLUGIN, &plugin_info);
     }
 
diff --git a/thunarx/thunarx-provider-plugin.c b/thunarx/thunarx-provider-plugin.c
index b1facb0a45572cfdacb48384063429c9eb7b9f01..fe80c652d56a98202ffd875d23264cc7665c3e09 100644
--- a/thunarx/thunarx-provider-plugin.c
+++ b/thunarx/thunarx-provider-plugin.c
@@ -24,6 +24,7 @@
 
 #include <glib/gi18n-lib.h>
 
+#include <thunarx/thunarx-private.h>
 #include <thunarx/thunarx-provider-plugin.h>
 #include <thunarx/thunarx-alias.h>
 
@@ -55,7 +56,7 @@ thunarx_provider_plugin_get_type (void)
       };
 
       /* register the provider plugin interface */
-      type = g_type_register_static (G_TYPE_INTERFACE, "ThunarxProviderPlugin", &info, 0);
+      type = g_type_register_static (G_TYPE_INTERFACE, I_("ThunarxProviderPlugin"), &info, 0);
     }
 
   return type;