[Xfce4-commits] <xfce4-panel:nick/gtk3> Drop exo for now.

Nick Schermer noreply at xfce.org
Sun Mar 17 13:38:02 CET 2013


Updating branch refs/heads/nick/gtk3
         to 9067b1bf63311dd892414e6df5d33944873fcced (commit)
       from b513b93b7b047a9f46074b79fd1d85f743178751 (commit)

commit 9067b1bf63311dd892414e6df5d33944873fcced
Author: Nick Schermer <nick at xfce.org>
Date:   Sun Feb 3 11:50:26 2013 +0100

    Drop exo for now.
    
    Panel looses some small functionality but it makes it a lot
    easier to test gtk3.
    
    The lucent icons and the icon chooser are not working, everything
    else should be fine.

 common/Makefile.am                          |    4 +-
 common/panel-private.h                      |    3 +
 common/panel-utils.c                        |   22 ++-
 common/panel-utils.h                        |    2 +
 configure.ac.in                             |    1 -
 panel/Makefile.am                           |    4 +-
 panel/panel-application.c                   |    7 +-
 panel/panel-base-window.c                   |   21 +-
 panel/panel-dbus-client.c                   |    5 +-
 panel/panel-dbus-service.c                  |    3 +-
 panel/panel-dialogs.c                       |   13 +-
 panel/panel-item-dialog.c                   |   15 +-
 panel/panel-itembar.c                       |   13 +-
 panel/panel-module-factory.c                |    7 +-
 panel/panel-module.c                        |    5 +-
 panel/panel-plugin-external-46.c            |    1 -
 panel/panel-plugin-external-wrapper.c       |    1 -
 panel/panel-plugin-external.c               |   10 +-
 panel/panel-preferences-dialog.c            |   66 ++++---
 panel/panel-window.c                        |   49 +++--
 plugins/actions/Makefile.am                 |    4 +-
 plugins/actions/actions.c                   |   35 ++--
 plugins/applicationsmenu/Makefile.am        |    4 +-
 plugins/applicationsmenu/applicationsmenu.c |   76 ++++----
 plugins/clock/Makefile.am                   |    4 +-
 plugins/clock/clock-fuzzy.c                 |   22 ++-
 plugins/clock/clock.c                       |  275 +++++++++++++++++++++++++--
 plugins/directorymenu/Makefile.am           |    4 +-
 plugins/directorymenu/directorymenu.c       |   46 +++--
 plugins/launcher/Makefile.am                |    4 +-
 plugins/launcher/launcher-dialog.c          |   18 +-
 plugins/launcher/launcher.c                 |   76 +++++---
 plugins/pager/Makefile.am                   |    4 +-
 plugins/pager/pager-buttons.c               |   12 +-
 plugins/pager/pager.c                       |   22 ++-
 plugins/separator/Makefile.am               |    4 +-
 plugins/separator/separator.c               |   15 +-
 plugins/systray/Makefile.am                 |    4 +-
 plugins/systray/systray-box.c               |    3 +-
 plugins/systray/systray.c                   |   31 ++--
 plugins/tasklist/Makefile.am                |    4 +-
 plugins/tasklist/tasklist-widget.c          |   58 ++++---
 plugins/tasklist/tasklist.c                 |   24 ++-
 plugins/windowmenu/Makefile.am              |    4 +-
 plugins/windowmenu/windowmenu.c             |   38 ++--
 45 files changed, 678 insertions(+), 365 deletions(-)

diff --git a/common/Makefile.am b/common/Makefile.am
index dd2d971..3d2a3be 100644
--- a/common/Makefile.am
+++ b/common/Makefile.am
@@ -20,7 +20,6 @@ libpanel_common_la_SOURCES = \
 libpanel_common_la_CFLAGS = \
 	$(XFCONF_CFLAGS) \
 	$(GTK_CFLAGS) \
-	$(EXO_CFLAGS) \
 	$(LIBXFCE4UI_CFLAGS) \
 	$(PLATFORM_CFLAGS)
 
@@ -31,8 +30,7 @@ libpanel_common_la_LDFLAGS = \
 libpanel_common_la_LIBADD = \
 	$(XFCONF_LIBS) \
 	$(GTK_LIBS) \
-	$(LIBXFCE4UI_LIBS) \
-	$(EXO_LIBS)
+	$(LIBXFCE4UI_LIBS)
 
 EXTRA_DIST = \
 	panel-dbus.h \
diff --git a/common/panel-private.h b/common/panel-private.h
index cc669be..b26c685 100644
--- a/common/panel-private.h
+++ b/common/panel-private.h
@@ -69,6 +69,9 @@
 #define TRANSPOSE_AREA(area) G_STMT_START { SWAP_INTEGER (area.width, area.height); \
                                             SWAP_INTEGER (area.x, area.y); } G_STMT_END
 
+/* to avoid exo for gtk3 testing */
+#define panel_str_is_empty(string) ((string) == NULL || *(string) == '\0')
+
 /* quick GList and GSList counting without traversing */
 #define LIST_HAS_ONE_ENTRY(l)           ((l) != NULL && (l)->next == NULL)
 #define LIST_HAS_ONE_OR_NO_ENTRIES(l)   ((l) == NULL || (l)->next == NULL)
diff --git a/common/panel-utils.c b/common/panel-utils.c
index a86978e..be76c9b 100644
--- a/common/panel-utils.c
+++ b/common/panel-utils.c
@@ -25,7 +25,6 @@
 #endif
 
 #include <libxfce4ui/libxfce4ui.h>
-#include <exo/exo.h>
 
 #include <common/panel-private.h>
 #include <common/panel-utils.h>
@@ -201,3 +200,24 @@ panel_utils_set_atk_info (GtkWidget   *widget,
         atk_object_set_description (object, description);
     }
 }
+
+
+
+static gboolean
+destroy_later (gpointer widget)
+{
+  gtk_widget_destroy (GTK_WIDGET (widget));
+  g_object_unref (G_OBJECT (widget));
+  return FALSE;
+}
+
+
+
+void
+panel_utils_destroy_later (GtkWidget *widget)
+{
+  panel_return_if_fail (GTK_IS_WIDGET (widget));
+
+  g_idle_add_full (G_PRIORITY_HIGH, destroy_later, widget, NULL);
+  g_object_ref_sink (G_OBJECT (widget));
+}
diff --git a/common/panel-utils.h b/common/panel-utils.h
index 70cbd3d..9a175c3 100644
--- a/common/panel-utils.h
+++ b/common/panel-utils.h
@@ -42,4 +42,6 @@ void        panel_utils_set_atk_info   (GtkWidget        *widget,
                                         const gchar      *name,
                                         const gchar      *description);
 
+void        panel_utils_destroy_later  (GtkWidget        *widget);
+
 #endif /* !__PANEL_BUILDER_H__ */
diff --git a/configure.ac.in b/configure.ac.in
index 80d909e..27943c1 100644
--- a/configure.ac.in
+++ b/configure.ac.in
@@ -130,7 +130,6 @@ XDT_CHECK_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0], [4.9.0])
 XDT_CHECK_PACKAGE([GARCON], [garcon-1], [0.1.5])
 XDT_CHECK_PACKAGE([LIBXFCE4UI], [libxfce4ui-1], [4.9.0])
 XDT_CHECK_PACKAGE([XFCONF], [libxfconf-0], [4.9.0])
-XDT_CHECK_PACKAGE([EXO], [exo-1], [0.7.2])
 XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [2.20.0])
 XDT_CHECK_PACKAGE([GLIB], [glib-2.0], [2.24.0])
 XDT_CHECK_PACKAGE([GIO], [gio-2.0], [2.24.0])
diff --git a/panel/Makefile.am b/panel/Makefile.am
index a19453d..8c041b2 100644
--- a/panel/Makefile.am
+++ b/panel/Makefile.am
@@ -57,7 +57,6 @@ xfce4_panel_SOURCES = \
 xfce4_panel_CFLAGS = \
 	$(GTK_CFLAGS) \
 	$(GMODULE_CFLAGS) \
-	$(EXO_CFLAGS) \
 	$(LIBXFCE4UTIL_CFLAGS) \
 	$(LIBXFCE4UI_CFLAGS) \
 	$(DBUS_CFLAGS) \
@@ -73,7 +72,6 @@ xfce4_panel_LDADD = \
 	$(top_builddir)/libxfce4panel/libxfce4panel-$(LIBXFCE4PANEL_VERSION_API).la \
 	$(top_builddir)/common/libpanel-common.la \
 	$(GTK_LIBS) \
-	$(EXO_LIBS) \
 	$(GMODULE_LIBS) \
 	$(LIBXFCE4UTIL_LIBS) \
 	$(LIBXFCE4UI_LIBS) \
@@ -105,7 +103,7 @@ panel-plugin-external-wrapper-infos.h: $(srcdir)/panel-plugin-external-wrapper-i
 	$(AM_V_GEN) dbus-binding-tool --prefix=panel_plugin_external_wrapper --mode=glib-server $< > $@
 
 panel-preferences-dialog-ui.h: $(srcdir)/panel-preferences-dialog.glade Makefile
-	$(AM_V_GEN) exo-csource --static --strip-comments --strip-content --name=panel_preferences_dialog_ui $< >$@
+	$(AM_V_GEN) xdt-csource --static --strip-comments --strip-content --name=panel_preferences_dialog_ui $< >$@
 
 #panel-marshal.h: $(srcdir)/panel-marshal.list Makefile
 #	$(AM_V_GEN) glib-genmarshal --header --prefix=panel_marshal $< > $@
diff --git a/panel/panel-application.c b/panel/panel-application.c
index 21d84ad..bd19f1c 100644
--- a/panel/panel-application.c
+++ b/panel/panel-application.c
@@ -24,7 +24,6 @@
 #include <stdlib.h>
 #endif
 
-#include <exo/exo.h>
 #include <glib/gstdio.h>
 #include <xfconf/xfconf.h>
 #include <libxfce4util/libxfce4util.h>
@@ -576,7 +575,7 @@ panel_application_plugin_move (GtkWidget        *item,
   module = panel_module_get_from_plugin_provider (XFCE_PANEL_PLUGIN_PROVIDER (item));
   icon_name = panel_module_get_icon_name (module);
   theme = gtk_icon_theme_get_for_screen (gtk_widget_get_screen (item));
-  if (!exo_str_is_empty (icon_name)
+  if (!panel_str_is_empty (icon_name)
       && gtk_icon_theme_has_icon (theme, icon_name))
     gtk_drag_set_icon_name (context, icon_name, 0, 0);
   else
@@ -600,7 +599,7 @@ panel_application_plugin_delete_config (PanelApplication *application,
   gchar *filename, *path;
 
   panel_return_if_fail (PANEL_IS_APPLICATION (application));
-  panel_return_if_fail (!exo_str_is_empty (name));
+  panel_return_if_fail (!panel_str_is_empty (name));
   panel_return_if_fail (unique_id != -1);
 
   /* remove the xfconf property */
@@ -1520,7 +1519,7 @@ panel_application_new_window (PanelApplication *application,
   /* add the itembar */
   itembar = panel_itembar_new ();
   for (i = 0; i < G_N_ELEMENTS (props); i++)
-    exo_binding_new (G_OBJECT (window), props[i], G_OBJECT (itembar), props[i]);
+    g_object_bind_property (G_OBJECT (window), props[i], G_OBJECT (itembar), props[i], G_BINDING_DEFAULT);
   gtk_container_add (GTK_CONTAINER (window), itembar);
   gtk_widget_show (itembar);
 
diff --git a/panel/panel-base-window.c b/panel/panel-base-window.c
index 6064aee..a48456d 100644
--- a/panel/panel-base-window.c
+++ b/panel/panel-base-window.c
@@ -24,7 +24,8 @@
 #include <math.h>
 #endif
 
-#include <exo/exo.h>
+#include <gtk/gtk.h>
+
 #include <libxfce4panel/libxfce4panel.h>
 #include <libxfce4panel/xfce-panel-plugin-provider.h>
 #include <common/panel-private.h>
@@ -128,21 +129,21 @@ panel_base_window_class_init (PanelBaseWindowClass *klass)
                                    g_param_spec_uint ("enter-opacity",
                                                       NULL, NULL,
                                                       0, 100, 100,
-                                                      EXO_PARAM_READWRITE));
+                                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_LEAVE_OPACITY,
                                    g_param_spec_uint ("leave-opacity",
                                                       NULL, NULL,
                                                       0, 100, 100,
-                                                      EXO_PARAM_READWRITE));
+                                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_BACKGROUND_ALPHA,
                                    g_param_spec_uint ("background-alpha",
                                                       NULL, NULL,
                                                       0, 100, 100,
-                                                      EXO_PARAM_READWRITE));
+                                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_BACKGROUND_STYLE,
@@ -151,21 +152,21 @@ panel_base_window_class_init (PanelBaseWindowClass *klass)
                                                       PANEL_BG_STYLE_NONE,
                                                       PANEL_BG_STYLE_IMAGE,
                                                       PANEL_BG_STYLE_NONE,
-                                                      EXO_PARAM_READWRITE));
+                                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_BACKGROUND_COLOR,
                                    g_param_spec_boxed ("background-color",
                                                        NULL, NULL,
                                                        GDK_TYPE_COLOR,
-                                                       EXO_PARAM_READWRITE));
+                                                       G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_BACKGROUND_IMAGE,
                                    g_param_spec_string ("background-image",
                                                         NULL, NULL,
                                                         NULL,
-                                                        EXO_PARAM_READWRITE));
+                                                        G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_BORDERS,
@@ -173,21 +174,21 @@ panel_base_window_class_init (PanelBaseWindowClass *klass)
                                                       NULL, NULL,
                                                       0, G_MAXUINT,
                                                       PANEL_BORDER_NONE,
-                                                      EXO_PARAM_READWRITE));
+                                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_ACTIVE,
                                    g_param_spec_boolean ("active",
                                                          NULL, NULL,
                                                          FALSE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_COMPOSITED,
                                    g_param_spec_boolean ("composited",
                                                          NULL, NULL,
                                                          FALSE,
-                                                         EXO_PARAM_READABLE));
+                                                         G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
 }
 
 
diff --git a/panel/panel-dbus-client.c b/panel/panel-dbus-client.c
index 07214a2..b32b858 100644
--- a/panel/panel-dbus-client.c
+++ b/panel/panel-dbus-client.c
@@ -24,7 +24,6 @@
 #include <stdlib.h>
 #endif
 
-#include <exo/exo.h>
 #include <dbus/dbus-glib.h>
 #include <libxfce4util/libxfce4util.h>
 #include <common/panel-private.h>
@@ -204,8 +203,8 @@ panel_dbus_client_plugin_event (const gchar  *plugin_event,
   n_tokens = g_strv_length (tokens);
 
   if (!(n_tokens == 2 || n_tokens == N_TOKENS)
-      || exo_str_is_empty (tokens[PLUGIN_NAME])
-      || exo_str_is_empty (tokens[NAME]))
+      || panel_str_is_empty (tokens[PLUGIN_NAME])
+      || panel_str_is_empty (tokens[NAME]))
     {
       g_set_error_literal (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
                            _("Invalid plugin event syntax specified. "
diff --git a/panel/panel-dbus-service.c b/panel/panel-dbus-service.c
index 21537c5..03c575d 100644
--- a/panel/panel-dbus-service.c
+++ b/panel/panel-dbus-service.c
@@ -27,7 +27,6 @@
 #include <dbus/dbus.h>
 #include <dbus/dbus-glib.h>
 #include <dbus/dbus-glib-lowlevel.h>
-#include <exo/exo.h>
 #include <common/panel-private.h>
 #include <common/panel-dbus.h>
 #include <libxfce4util/libxfce4util.h>
@@ -256,7 +255,7 @@ panel_dbus_service_add_new_item (PanelDBusService  *service,
 
   application = panel_application_get ();
 
-  if (arguments != NULL && exo_str_is_empty (*arguments))
+  if (arguments != NULL && panel_str_is_empty (*arguments))
     arguments = NULL;
 
   /* add new plugin (with or without arguments) */
diff --git a/panel/panel-dialogs.c b/panel/panel-dialogs.c
index 9f6a0bd..4897b14 100644
--- a/panel/panel-dialogs.c
+++ b/panel/panel-dialogs.c
@@ -24,7 +24,6 @@
 #include <string.h>
 #endif
 
-#include <exo/exo.h>
 #include <libxfce4util/libxfce4util.h>
 #include <libxfce4ui/libxfce4ui.h>
 
@@ -42,14 +41,19 @@ panel_dialogs_show_about_email_hook (GtkAboutDialog *dialog,
                                      const gchar    *uri,
                                      gpointer        data)
 {
+  GError *error = NULL;
+
   if (g_strcmp0 ("tictactoe at xfce.org", uri) == 0)
     {
       /* open tic-tac-toe */
       panel_tic_tac_toe_show ();
     }
-  else
+  else if (!gtk_show_uri (gtk_window_get_screen (GTK_WINDOW (dialog)),
+                          uri, gtk_get_current_event_time (), &error))
     {
-      exo_gtk_url_about_dialog_hook (dialog, uri, data);
+      xfce_dialog_show_error (GTK_WINDOW (dialog), error,
+                              _("Unable to open the e-mail address"));
+      g_error_free (error);
     }
 }
 
@@ -73,9 +77,6 @@ panel_dialogs_show_about (void)
                                 "Tic-tac-toe <tictactoe at xfce.org>");
 
   gtk_about_dialog_set_email_hook (panel_dialogs_show_about_email_hook, NULL, NULL);
-#if !GTK_CHECK_VERSION (2, 18, 0)
-  gtk_about_dialog_set_url_hook (exo_gtk_url_about_dialog_hook, NULL, NULL);
-#endif
 
   gtk_show_about_dialog (NULL,
                          "authors", authors,
diff --git a/panel/panel-item-dialog.c b/panel/panel-item-dialog.c
index fe7e9ff..170b67d 100644
--- a/panel/panel-item-dialog.c
+++ b/panel/panel-item-dialog.c
@@ -24,7 +24,6 @@
 #include <string.h>
 #endif
 
-#include <exo/exo.h>
 #include <libxfce4ui/libxfce4ui.h>
 #include <libxfce4util/libxfce4util.h>
 
@@ -506,7 +505,7 @@ panel_item_dialog_drag_begin (GtkWidget       *treeview,
           /* set the drag icon */
           icon_name = panel_module_get_icon_name (module);
           theme = gtk_icon_theme_get_for_screen (gtk_widget_get_screen (treeview));
-          if (!exo_str_is_empty (icon_name)
+          if (!panel_str_is_empty (icon_name)
               && gtk_icon_theme_has_icon (theme, icon_name))
             gtk_drag_set_icon_name (context, icon_name, 0, 0);
           else
@@ -636,14 +635,14 @@ panel_item_dialog_compare_func (GtkTreeModel *model,
       /* don't move the separator */
       result = 0;
     }
-  else if (exo_str_is_equal (LAUNCHER_PLUGIN_NAME,
-                             panel_module_get_name (module_a)))
+  else if (g_strcmp0 (LAUNCHER_PLUGIN_NAME,
+                      panel_module_get_name (module_a)) == 0)
     {
       /* move the launcher to the first position */
       result = -1;
     }
-  else if (exo_str_is_equal (LAUNCHER_PLUGIN_NAME,
-                             panel_module_get_name (module_b)))
+  else if (g_strcmp0 (LAUNCHER_PLUGIN_NAME,
+                      panel_module_get_name (module_b)) == 0)
     {
       /* move the launcher to the first position */
       result = 1;
@@ -690,7 +689,7 @@ panel_item_dialog_visible_func (GtkTreeModel *model,
 
   /* search string from dialog */
   text = gtk_entry_get_text (entry);
-  if (G_UNLIKELY (exo_str_is_empty (text)))
+  if (G_UNLIKELY (panel_str_is_empty (text)))
     return TRUE;
 
   gtk_tree_model_get (model, iter, COLUMN_MODULE, &module, -1);
@@ -760,7 +759,7 @@ panel_item_dialog_text_renderer (GtkTreeViewColumn *column,
 
   /* avoid (null) in markup string */
   comment = panel_module_get_comment (module);
-  if (exo_str_is_empty (comment))
+  if (panel_str_is_empty (comment))
     comment = "";
 
   name = panel_module_get_display_name (module);
diff --git a/panel/panel-itembar.c b/panel/panel-itembar.c
index 98ffae1..2c436ac 100644
--- a/panel/panel-itembar.c
+++ b/panel/panel-itembar.c
@@ -23,7 +23,6 @@
 
 #include <math.h>
 #include <gtk/gtk.h>
-#include <exo/exo.h>
 
 #include <common/panel-private.h>
 #include <libxfce4panel/libxfce4panel.h>
@@ -187,42 +186,42 @@ panel_itembar_class_init (PanelItembarClass *klass)
                                                       NULL, NULL,
                                                       XFCE_TYPE_PANEL_PLUGIN_MODE,
                                                       XFCE_PANEL_PLUGIN_MODE_HORIZONTAL,
-                                                      EXO_PARAM_WRITABLE));
+                                                      G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_SIZE,
                                    g_param_spec_uint ("size",
                                                       NULL, NULL,
                                                       16, 128, 30,
-                                                      EXO_PARAM_WRITABLE));
+                                                      G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_NROWS,
                                    g_param_spec_uint ("nrows",
                                                       NULL, NULL,
                                                       1, 6, 1,
-                                                      EXO_PARAM_WRITABLE));
+                                                      G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
 
   gtk_container_class_install_child_property (gtkcontainer_class,
                                               CHILD_PROP_EXPAND,
                                               g_param_spec_boolean ("expand",
                                                                     NULL, NULL,
                                                                     FALSE,
-                                                                    EXO_PARAM_READWRITE));
+                                                                    G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   gtk_container_class_install_child_property (gtkcontainer_class,
                                               CHILD_PROP_SHRINK,
                                               g_param_spec_boolean ("shrink",
                                                                     NULL, NULL,
                                                                     FALSE,
-                                                                    EXO_PARAM_READWRITE));
+                                                                    G_PARAM_READWRITE| G_PARAM_STATIC_STRINGS));
 
   gtk_container_class_install_child_property (gtkcontainer_class,
                                               CHILD_PROP_SMALL,
                                               g_param_spec_boolean ("small",
                                                                     NULL, NULL,
                                                                     FALSE,
-                                                                    EXO_PARAM_READWRITE));
+                                                                    G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 }
 
 
diff --git a/panel/panel-module-factory.c b/panel/panel-module-factory.c
index 529fe85..c897bcc 100644
--- a/panel/panel-module-factory.c
+++ b/panel/panel-module-factory.c
@@ -28,7 +28,6 @@
 #include <time.h>
 #endif
 
-#include <exo/exo.h>
 #include <libxfce4util/libxfce4util.h>
 
 #include <common/panel-private.h>
@@ -203,7 +202,7 @@ panel_module_factory_load_modules_dir (PanelModuleFactory *factory,
 
           /* check if this is the launcher */
           if (!factory->has_launcher)
-            factory->has_launcher = exo_str_is_equal (LAUNCHER_PLUGIN_NAME, internal_name);
+            factory->has_launcher = g_strcmp0 (LAUNCHER_PLUGIN_NAME, internal_name) == 0;
         }
       else
         {
@@ -249,8 +248,8 @@ panel_module_factory_modules_cleanup (gpointer key,
 
   /* if we're going to remove this item, check if it is the launcher */
   if (remove_from_table
-      && exo_str_is_equal (LAUNCHER_PLUGIN_NAME,
-                           panel_module_get_name (module)))
+      && g_strcmp0 (LAUNCHER_PLUGIN_NAME,
+                    panel_module_get_name (module)) == 0)
     factory->has_launcher = FALSE;
 
   return remove_from_table;
diff --git a/panel/panel-module.c b/panel/panel-module.c
index ba39320..2c29f03 100644
--- a/panel/panel-module.c
+++ b/panel/panel-module.c
@@ -21,7 +21,6 @@
 #endif
 
 #include <gmodule.h>
-#include <exo/exo.h>
 #include <glib/gstdio.h>
 #include <libxfce4util/libxfce4util.h>
 
@@ -304,8 +303,8 @@ panel_module_new_from_desktop_file (const gchar *filename,
   const gchar *module_unique;
   gboolean     found;
 
-  panel_return_val_if_fail (!exo_str_is_empty (filename), NULL);
-  panel_return_val_if_fail (!exo_str_is_empty (name), NULL);
+  panel_return_val_if_fail (!panel_str_is_empty (filename), NULL);
+  panel_return_val_if_fail (!panel_str_is_empty (name), NULL);
 
   rc = xfce_rc_simple_open (filename, TRUE);
   if (G_UNLIKELY (rc == NULL))
diff --git a/panel/panel-plugin-external-46.c b/panel/panel-plugin-external-46.c
index c2d1c11..3e2c335 100644
--- a/panel/panel-plugin-external-46.c
+++ b/panel/panel-plugin-external-46.c
@@ -30,7 +30,6 @@
 #include <math.h>
 #endif
 
-#include <exo/exo.h>
 #include <gdk/gdk.h>
 #include <gdk/gdkx.h>
 #include <libxfce4util/libxfce4util.h>
diff --git a/panel/panel-plugin-external-wrapper.c b/panel/panel-plugin-external-wrapper.c
index 06f6e63..a97e90e 100644
--- a/panel/panel-plugin-external-wrapper.c
+++ b/panel/panel-plugin-external-wrapper.c
@@ -30,7 +30,6 @@
 #include <sys/wait.h>
 #endif
 
-#include <exo/exo.h>
 #include <gdk/gdk.h>
 #include <gdk/gdkx.h>
 #include <libxfce4util/libxfce4util.h>
diff --git a/panel/panel-plugin-external.c b/panel/panel-plugin-external.c
index b9e8f36..0c4bc6c 100644
--- a/panel/panel-plugin-external.c
+++ b/panel/panel-plugin-external.c
@@ -30,7 +30,6 @@
 #include <sys/wait.h>
 #endif
 
-#include <exo/exo.h>
 #include <gdk/gdk.h>
 #include <gdk/gdkx.h>
 #include <libxfce4util/libxfce4util.h>
@@ -40,6 +39,7 @@
 #include <common/panel-private.h>
 #include <common/panel-dbus.h>
 #include <common/panel-debug.h>
+#include <common/panel-utils.h>
 
 #include <libxfce4panel/libxfce4panel.h>
 #include <libxfce4panel/xfce-panel-plugin-provider.h>
@@ -170,7 +170,7 @@ panel_plugin_external_class_init (PanelPluginExternalClass *klass)
                                    g_param_spec_int ("unique-id",
                                                      NULL, NULL,
                                                      -1, G_MAXINT, -1,
-                                                     EXO_PARAM_READWRITE
+                                                     G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS
                                                      | G_PARAM_CONSTRUCT_ONLY));
 
   g_object_class_install_property (gobject_class,
@@ -178,7 +178,7 @@ panel_plugin_external_class_init (PanelPluginExternalClass *klass)
                                    g_param_spec_object ("module",
                                                         NULL, NULL,
                                                         PANEL_TYPE_MODULE,
-                                                        EXO_PARAM_READWRITE
+                                                        G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS
                                                         | G_PARAM_CONSTRUCT_ONLY));
 
   g_object_class_install_property (gobject_class,
@@ -186,7 +186,7 @@ panel_plugin_external_class_init (PanelPluginExternalClass *klass)
                                    g_param_spec_boxed ("arguments",
                                                        NULL, NULL,
                                                        G_TYPE_STRV,
-                                                       EXO_PARAM_READWRITE
+                                                       G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS
                                                        | G_PARAM_CONSTRUCT_ONLY));
 }
 
@@ -745,7 +745,7 @@ panel_plugin_external_child_watch (GPid     pid,
                                                   PROVIDER_SIGNAL_REMOVE_PLUGIN);
 
           /* wait until everything is settled before we destroy */
-          exo_gtk_object_destroy_later (GTK_OBJECT (external));
+          panel_utils_destroy_later (GTK_WIDGET (external));
           goto close_pid;
         }
     }
diff --git a/panel/panel-preferences-dialog.c b/panel/panel-preferences-dialog.c
index 865d7f3..6a131c5 100644
--- a/panel/panel-preferences-dialog.c
+++ b/panel/panel-preferences-dialog.c
@@ -24,7 +24,6 @@
 #include <stdlib.h>
 #endif
 
-#include <exo/exo.h>
 #include <libxfce4util/libxfce4util.h>
 #include <libxfce4ui/libxfce4ui.h>
 
@@ -55,7 +54,8 @@ static void                     panel_preferences_dialog_response
 static void                     panel_preferences_dialog_bindings_unbind        (PanelPreferencesDialog *dialog);
 static void                     panel_preferences_dialog_bindings_add           (PanelPreferencesDialog *dialog,
                                                                                  const gchar            *property1,
-                                                                                 const gchar            *property2);
+                                                                                 const gchar            *property2,
+                                                                                 GBindingFlags           flags);
 static void                     panel_preferences_dialog_bindings_update        (PanelPreferencesDialog *dialog);
 static void                     panel_preferences_dialog_output_changed         (GtkComboBox            *combobox,
                                                                                  PanelPreferencesDialog *dialog);
@@ -126,7 +126,7 @@ struct _PanelPreferencesDialog
   /* currently selected window in the selector */
   PanelWindow      *active;
 
-  /* ExoMutualBinding's between dialog <-> window */
+  /* GBinding's between dialog <-> window */
   GSList           *bindings;
 
   /* store for the items list */
@@ -216,8 +216,9 @@ panel_preferences_dialog_init (PanelPreferencesDialog *dialog)
 
   info = gtk_builder_get_object (GTK_BUILDER (dialog), "composited-info");
   panel_return_if_fail (G_IS_OBJECT (info));
-  exo_binding_new_with_negation (G_OBJECT (object), "sensitive",
-                                 G_OBJECT (info), "visible");
+  g_object_bind_property (G_OBJECT (object), "sensitive",
+                          G_OBJECT (info), "visible",
+                          G_BINDING_SYNC_CREATE | G_BINDING_INVERT_BOOLEAN);
 
   object = gtk_builder_get_object (GTK_BUILDER (dialog), "background-image");
   panel_return_if_fail (GTK_IS_FILE_CHOOSER_BUTTON (object));
@@ -358,7 +359,7 @@ panel_preferences_dialog_bindings_unbind (PanelPreferencesDialog *dialog)
     {
       /* remove all bindings */
       for (li = dialog->bindings; li != NULL; li = li->next)
-        exo_mutual_binding_unbind (li->data);
+        g_object_unref (G_OBJECT (li->data));
 
       g_slist_free (dialog->bindings);
       dialog->bindings = NULL;
@@ -382,17 +383,19 @@ panel_preferences_dialog_bindings_unbind (PanelPreferencesDialog *dialog)
 static void
 panel_preferences_dialog_bindings_add (PanelPreferencesDialog *dialog,
                                        const gchar            *property1,
-                                       const gchar            *property2)
+                                       const gchar            *property2,
+                                       GBindingFlags           flags)
 {
-  ExoMutualBinding *binding;
-  GObject          *object;
+  GBinding *binding;
+  GObject  *object;
 
   /* get the object from the builder */
   object = gtk_builder_get_object (GTK_BUILDER (dialog), property1);
   panel_return_if_fail (G_IS_OBJECT (object));
 
   /* create the binding and prepend to the list */
-  binding = exo_mutual_binding_new (G_OBJECT (dialog->active), property1, object, property2);
+  binding = g_object_bind_property (G_OBJECT (dialog->active), property1, object, property2,
+                                    flags ? flags : G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
   dialog->bindings = g_slist_prepend (dialog->bindings, binding);
 }
 
@@ -420,21 +423,21 @@ panel_preferences_dialog_bindings_update (PanelPreferencesDialog *dialog)
     return;
 
   /* hook up the bindings */
-  panel_preferences_dialog_bindings_add (dialog, "mode", "active");
-  panel_preferences_dialog_bindings_add (dialog, "span-monitors", "active");
-  panel_preferences_dialog_bindings_add (dialog, "position-locked", "active");
-  panel_preferences_dialog_bindings_add (dialog, "autohide", "active");
-  panel_preferences_dialog_bindings_add (dialog, "disable-struts", "active");
-  panel_preferences_dialog_bindings_add (dialog, "size", "value");
-  panel_preferences_dialog_bindings_add (dialog, "nrows", "value");
-  panel_preferences_dialog_bindings_add (dialog, "length", "value");
-  panel_preferences_dialog_bindings_add (dialog, "length-adjust", "active");
-  panel_preferences_dialog_bindings_add (dialog, "background-alpha", "value");
-  panel_preferences_dialog_bindings_add (dialog, "enter-opacity", "value");
-  panel_preferences_dialog_bindings_add (dialog, "leave-opacity", "value");
-  panel_preferences_dialog_bindings_add (dialog, "composited", "sensitive");
-  panel_preferences_dialog_bindings_add (dialog, "background-style", "active");
-  panel_preferences_dialog_bindings_add (dialog, "background-color", "color");
+  panel_preferences_dialog_bindings_add (dialog, "mode", "active", 0);
+  panel_preferences_dialog_bindings_add (dialog, "span-monitors", "active", 0);
+  panel_preferences_dialog_bindings_add (dialog, "position-locked", "active", 0);
+  panel_preferences_dialog_bindings_add (dialog, "autohide", "active", 0);
+  panel_preferences_dialog_bindings_add (dialog, "disable-struts", "active", 0);
+  panel_preferences_dialog_bindings_add (dialog, "size", "value", 0);
+  panel_preferences_dialog_bindings_add (dialog, "nrows", "value", 0);
+  panel_preferences_dialog_bindings_add (dialog, "length", "value", 0);
+  panel_preferences_dialog_bindings_add (dialog, "length-adjust", "active", 0);
+  panel_preferences_dialog_bindings_add (dialog, "background-alpha", "value", 0);
+  panel_preferences_dialog_bindings_add (dialog, "enter-opacity", "value", 0);
+  panel_preferences_dialog_bindings_add (dialog, "leave-opacity", "value", 0);
+  panel_preferences_dialog_bindings_add (dialog, "composited", "sensitive", G_BINDING_SYNC_CREATE);
+  panel_preferences_dialog_bindings_add (dialog, "background-style", "active", 0);
+  panel_preferences_dialog_bindings_add (dialog, "background-color", "color", 0);
 
   /* watch image changes from the panel */
   dialog->bg_image_notify_handler_id = g_signal_connect_swapped (G_OBJECT (dialog->active),
@@ -465,12 +468,12 @@ panel_preferences_dialog_bindings_update (PanelPreferencesDialog *dialog)
 
   if (n_screens > 1
       || n_monitors > 1
-      || !exo_str_is_empty (output_name))
+      || !panel_str_is_empty (output_name))
     {
       gtk_list_store_insert_with_values (GTK_LIST_STORE (store), &iter, n++,
                                          OUTPUT_NAME, NULL,
                                          OUTPUT_TITLE, _("Automatic"), -1);
-      if (exo_str_is_empty (output_name))
+      if (panel_str_is_empty (output_name))
         {
           gtk_combo_box_set_active_iter  (GTK_COMBO_BOX (object), &iter);
           output_selected = TRUE;
@@ -494,7 +497,7 @@ panel_preferences_dialog_bindings_update (PanelPreferencesDialog *dialog)
                                                  OUTPUT_NAME, name,
                                                  OUTPUT_TITLE, title, -1);
 
-              if (!output_selected && exo_str_is_equal (name, output_name))
+              if (!output_selected && g_strcmp0 (name, output_name) == 0)
                 {
                   gtk_combo_box_set_active_iter  (GTK_COMBO_BOX (object), &iter);
                   output_selected = TRUE;
@@ -509,7 +512,7 @@ panel_preferences_dialog_bindings_update (PanelPreferencesDialog *dialog)
           for (i = 0; i < n_monitors; i++)
             {
               name = gdk_screen_get_monitor_plug_name (screen, i);
-              if (exo_str_is_empty (name))
+              if (panel_str_is_empty (name))
                 {
                   g_free (name);
 
@@ -526,7 +529,8 @@ panel_preferences_dialog_bindings_update (PanelPreferencesDialog *dialog)
               gtk_list_store_insert_with_values (GTK_LIST_STORE (store), &iter, n++,
                                                  OUTPUT_NAME, name,
                                                  OUTPUT_TITLE, title, -1);
-              if (!output_selected && exo_str_is_equal (name, output_name))
+              if (!output_selected
+                  && g_strcmp0 (name, output_name) == 0)
                 {
                   gtk_combo_box_set_active_iter  (GTK_COMBO_BOX (object), &iter);
                   output_selected = TRUE;
@@ -538,7 +542,7 @@ panel_preferences_dialog_bindings_update (PanelPreferencesDialog *dialog)
         }
 
       /* add the output from the config if still nothing has been selected */
-      if (!output_selected && !exo_str_is_empty (output_name))
+      if (!output_selected && !panel_str_is_empty (output_name))
         {
           gtk_list_store_insert_with_values (GTK_LIST_STORE (store), &iter, n++,
                                              OUTPUT_NAME, output_name,
diff --git a/panel/panel-window.c b/panel/panel-window.c
index 982ea9b..93964ed 100644
--- a/panel/panel-window.c
+++ b/panel/panel-window.c
@@ -26,13 +26,17 @@
 #ifdef HAVE_MATH_H
 #include <math.h>
 #endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
 
 #ifdef GDK_WINDOWING_X11
 #include <gdk/gdkx.h>
 #include <X11/Xlib.h>
 #endif
 
-#include <exo/exo.h>
+#include <libxfce4ui/libxfce4ui.h>
+
 #include <common/panel-private.h>
 #include <common/panel-debug.h>
 #include <common/panel-utils.h>
@@ -352,7 +356,7 @@ panel_window_class_init (PanelWindowClass *klass)
                                    PROP_ID,
                                    g_param_spec_int ("id", NULL, NULL,
                                                      0, G_MAXINT, 0,
-                                                     EXO_PARAM_READWRITE
+                                                     G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS
                                                      | G_PARAM_CONSTRUCT_ONLY));
 
   g_object_class_install_property (gobject_class,
@@ -360,67 +364,67 @@ panel_window_class_init (PanelWindowClass *klass)
                                    g_param_spec_enum ("mode", NULL, NULL,
                                                       XFCE_TYPE_PANEL_PLUGIN_MODE,
                                                       XFCE_PANEL_PLUGIN_MODE_HORIZONTAL,
-                                                      EXO_PARAM_READWRITE));
+                                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_SIZE,
                                    g_param_spec_uint ("size", NULL, NULL,
                                                       16, 128, 48,
-                                                      EXO_PARAM_READWRITE));
+                                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_NROWS,
                                    g_param_spec_uint ("nrows", NULL, NULL,
                                                       1, 6, 1,
-                                                      EXO_PARAM_READWRITE));
+                                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_LENGTH,
                                    g_param_spec_uint ("length", NULL, NULL,
                                                       1, 100, 10,
-                                                      EXO_PARAM_READWRITE));
+                                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_LENGTH_ADJUST,
                                    g_param_spec_boolean ("length-adjust", NULL, NULL,
                                                          TRUE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_POSITION_LOCKED,
                                    g_param_spec_boolean ("position-locked", NULL, NULL,
                                                          FALSE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_AUTOHIDE,
                                    g_param_spec_boolean ("autohide", NULL, NULL,
                                                          FALSE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_SPAN_MONITORS,
                                    g_param_spec_boolean ("span-monitors", NULL, NULL,
                                                          FALSE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_OUTPUT_NAME,
                                    g_param_spec_string ("output-name", NULL, NULL,
                                                         NULL,
-                                                        EXO_PARAM_READWRITE));
+                                                        G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_POSITION,
                                    g_param_spec_string ("position", NULL, NULL,
                                                         NULL,
-                                                        EXO_PARAM_READWRITE));
+                                                        G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_DISABLE_STRUTS,
                                    g_param_spec_boolean ("disable-struts", NULL, NULL,
                                                          FALSE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   gtk_widget_class_install_style_property (gtkwidget_class,
                                            g_param_spec_int ("popup-delay",
@@ -428,7 +432,7 @@ panel_window_class_init (PanelWindowClass *klass)
                                                              "Time before the panel will unhide on an enter event",
                                                              1, G_MAXINT,
                                                              DEFAULT_POPUP_DELAY,
-                                                             EXO_PARAM_READABLE));
+                                                             G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
 
   gtk_widget_class_install_style_property (gtkwidget_class,
                                            g_param_spec_int ("popdown-delay",
@@ -436,7 +440,7 @@ panel_window_class_init (PanelWindowClass *klass)
                                                              "Time before the panel will hide on a leave event",
                                                              1, G_MAXINT,
                                                              DEFAULT_POPDOWN_DELAY,
-                                                             EXO_PARAM_READABLE));
+                                                             G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
 
   gtk_widget_class_install_style_property (gtkwidget_class,
                                            g_param_spec_int ("autohide-size",
@@ -444,7 +448,7 @@ panel_window_class_init (PanelWindowClass *klass)
                                                              "Size of hidden panel",
                                                              1, G_MAXINT,
                                                              DEFAULT_ATUOHIDE_SIZE,
-                                                             EXO_PARAM_READABLE));
+                                                             G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
 
   /* initialize the atoms */
   cardinal_atom = gdk_atom_intern_static_string ("CARDINAL");
@@ -680,7 +684,7 @@ panel_window_set_property (GObject      *object,
       g_free (window->output_name);
 
       val_string = g_value_get_string (value);
-      if (exo_str_is_empty (val_string))
+      if (panel_str_is_empty (val_string))
         window->output_name = NULL;
       else
         window->output_name = g_strdup (val_string);
@@ -690,7 +694,7 @@ panel_window_set_property (GObject      *object,
 
     case PROP_POSITION:
       val_string = g_value_get_string (value);
-      if (!exo_str_is_empty (val_string)
+      if (!panel_str_is_empty (val_string)
           && sscanf (val_string, "p=%d;x=%d;y=%d", &snap_position, &x, &y) == 3)
         {
           window->snap_position = CLAMP (snap_position, SNAP_POSITION_NONE, SNAP_POSITION_S);
@@ -1945,7 +1949,7 @@ panel_window_screen_layout_changed (GdkScreen   *screen,
     }
   else
     {
-      if (exo_str_is_empty (window->output_name))
+      if (panel_str_is_empty (window->output_name))
         {
           normal_monitor_positioning:
 
@@ -2254,8 +2258,11 @@ panel_window_set_autohide (PanelWindow *window,
 
       /* bind some properties to sync the two windows */
       for (i = 0; i < G_N_ELEMENTS (properties); i++)
-        exo_binding_new (G_OBJECT (window), properties[i],
-                         G_OBJECT (popup), properties[i]);
+        {
+          g_object_bind_property (G_OBJECT (window), properties[i],
+                                  G_OBJECT (popup), properties[i],
+                                  G_BINDING_SYNC_CREATE);
+        }
 
       /* signals for pointer enter/leave events */
       g_signal_connect (G_OBJECT (popup), "enter-notify-event",
diff --git a/plugins/actions/Makefile.am b/plugins/actions/Makefile.am
index b649215..83655b3 100644
--- a/plugins/actions/Makefile.am
+++ b/plugins/actions/Makefile.am
@@ -21,7 +21,6 @@ libactions_la_CFLAGS = \
 	$(GTK_CFLAGS) \
 	$(LIBXFCE4UTIL_CFLAGS) \
 	$(LIBXFCE4UI_CFLAGS) \
-	$(EXO_CFLAGS) \
 	$(XFCONF_CFLAGS) \
 	$(DBUS_CFLAGS) \
 	$(PLATFORM_CFLAGS)
@@ -39,7 +38,6 @@ libactions_la_LIBADD = \
 	$(GTK_LIBS) \
 	$(LIBXFCE4UTIL_LIBS) \
 	$(LIBXFCE4UI_LIBS) \
-	$(EXO_LIBS) \
 	$(DBUS_LIBS) \
 	$(XFCONF_LIBS)
 
@@ -70,7 +68,7 @@ DISTCLEANFILES += \
 	$(libactions_built_sources)
 
 actions-dialog_ui.h: actions-dialog.glade
-	$(AM_V_GEN) exo-csource --static --strip-comments --strip-content --name=actions_dialog_ui $< >$@
+	$(AM_V_GEN) xdt-csource --static --strip-comments --strip-content --name=actions_dialog_ui $< >$@
 endif
 
 # vi:set ts=8 sw=8 noet ai nocindent syntax=automake:
diff --git a/plugins/actions/actions.c b/plugins/actions/actions.c
index 53ff8d0..72fb9b4 100644
--- a/plugins/actions/actions.c
+++ b/plugins/actions/actions.c
@@ -25,7 +25,6 @@
 #include <libxfce4panel/libxfce4panel.h>
 #include <libxfce4util/libxfce4util.h>
 #include <libxfce4ui/libxfce4ui.h>
-#include <exo/exo.h>
 #include <dbus/dbus-glib.h>
 
 #include <common/panel-private.h>
@@ -243,7 +242,7 @@ actions_plugin_class_init (ActionsPluginClass *klass)
                                    g_param_spec_boxed ("items",
                                                        NULL, NULL,
                                                        PANEL_PROPERTIES_TYPE_VALUE_ARRAY,
-                                                       EXO_PARAM_READWRITE));
+                                                       G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_APPEARANCE,
@@ -252,21 +251,21 @@ actions_plugin_class_init (ActionsPluginClass *klass)
                                                       APPEARANCE_TYPE_BUTTONS,
                                                       APPEARANCE_TYPE_MENU,
                                                       APPEARANCE_TYPE_MENU,
-                                                      EXO_PARAM_READWRITE));
+                                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_INVERT_ORIENTATION,
                                    g_param_spec_boolean ("invert-orientation",
                                                          NULL, NULL,
                                                          FALSE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_ASK_CONFIRMATION,
                                    g_param_spec_boolean ("ask-confirmation",
                                                          NULL, NULL,
                                                          TRUE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   menu_icon_size = gtk_icon_size_from_name ("panel-actions-menu");
   if (menu_icon_size == GTK_ICON_SIZE_INVALID)
@@ -595,18 +594,22 @@ actions_plugin_configure_plugin (XfcePanelPlugin *panel_plugin)
     return;
 
   combo = gtk_builder_get_object (builder, "combo-mode");
-  exo_mutual_binding_new (G_OBJECT (plugin), "appearance",
-                          G_OBJECT (combo), "active");
+  g_object_bind_property (G_OBJECT (plugin), "appearance",
+                          G_OBJECT (combo), "active",
+                          G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
 
   object = gtk_builder_get_object (builder, "invert-orientation");
-  exo_mutual_binding_new (G_OBJECT (plugin), "invert-orientation",
-                          G_OBJECT (object), "active");
-  exo_binding_new_with_negation (G_OBJECT (combo), "active",
-                                 G_OBJECT (object), "sensitive");
+  g_object_bind_property (G_OBJECT (plugin), "invert-orientation",
+                          G_OBJECT (object), "active",
+                          G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
+  g_object_bind_property (G_OBJECT (combo), "active",
+                          G_OBJECT (object), "sensitive",
+                          G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL | G_BINDING_INVERT_BOOLEAN);
 
   object = gtk_builder_get_object (builder, "confirmation-dialog");
-  exo_mutual_binding_new (G_OBJECT (plugin), "ask-confirmation",
-                          G_OBJECT (object), "active");
+  g_object_bind_property (G_OBJECT (plugin), "ask-confirmation",
+                          G_OBJECT (object), "active",
+                          G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
 
   store = gtk_builder_get_object (builder, "items-store");
   panel_return_if_fail (GTK_IS_LIST_STORE (store));
@@ -625,7 +628,7 @@ actions_plugin_configure_plugin (XfcePanelPlugin *panel_plugin)
       /* get the value and check if it is within range */
       val = g_ptr_array_index (plugin->items, i);
       name = g_value_get_string (val);
-      if (exo_str_is_empty (name))
+      if (panel_str_is_empty (name))
         continue;
 
       /* find the entry in the available actions */
@@ -1133,11 +1136,11 @@ actions_plugin_pack_idle (gpointer data)
     {
       /* get a decent username, not the glib defaults */
       username = g_get_real_name ();
-      if (exo_str_is_empty (username)
+      if (panel_str_is_empty (username)
           || strcmp (username, "Unknown") == 0)
         {
           username = g_get_user_name ();
-          if (exo_str_is_empty (username)
+          if (panel_str_is_empty (username)
               || strcmp (username, "somebody") == 0)
             username = _("John Doe");
         }
diff --git a/plugins/applicationsmenu/Makefile.am b/plugins/applicationsmenu/Makefile.am
index d0d94bf..834cfc9 100644
--- a/plugins/applicationsmenu/Makefile.am
+++ b/plugins/applicationsmenu/Makefile.am
@@ -19,7 +19,6 @@ libapplicationsmenu_la_SOURCES = \
 
 libapplicationsmenu_la_CFLAGS = \
 	$(GTK_CFLAGS) \
-	$(EXO_CFLAGS) \
 	$(XFCONF_CFLAGS) \
 	$(LIBXFCE4UTIL_CFLAGS) \
 	$(LIBXFCE4UI_CFLAGS) \
@@ -36,7 +35,6 @@ libapplicationsmenu_la_LDFLAGS = \
 libapplicationsmenu_la_LIBADD = \
 	$(top_builddir)/libxfce4panel/libxfce4panel-$(LIBXFCE4PANEL_VERSION_API).la \
 	$(top_builddir)/common/libpanel-common.la \
-	$(EXO_LIBS) \
 	$(GTK_LIBS) \
 	$(LIBXFCE4UTIL_LIBS) \
 	$(LIBXFCE4UI_LIBS) \
@@ -82,7 +80,7 @@ DISTCLEANFILES += \
 	$(libapplicationsmenu_built_sources)
 
 applicationsmenu-dialog_ui.h: applicationsmenu-dialog.glade
-	$(AM_V_GEN) exo-csource --static --strip-comments --strip-content --name=applicationsmenu_dialog_ui $< >$@
+	$(AM_V_GEN) xdt-csource --static --strip-comments --strip-content --name=applicationsmenu_dialog_ui $< >$@
 endif
 
 # vi:set ts=8 sw=8 noet ai nocindent syntax=automake:
diff --git a/plugins/applicationsmenu/applicationsmenu.c b/plugins/applicationsmenu/applicationsmenu.c
index efe1c30..103be00 100644
--- a/plugins/applicationsmenu/applicationsmenu.c
+++ b/plugins/applicationsmenu/applicationsmenu.c
@@ -20,7 +20,6 @@
 #include <config.h>
 #endif
 
-#include <exo/exo.h>
 #include <garcon/garcon.h>
 #include <libxfce4ui/libxfce4ui.h>
 #include <libxfce4util/libxfce4util.h>
@@ -146,55 +145,55 @@ applications_menu_plugin_class_init (ApplicationsMenuPluginClass *klass)
                                    g_param_spec_boolean ("show-generic-names",
                                                          NULL, NULL,
                                                          TRUE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_SHOW_MENU_ICONS,
                                    g_param_spec_boolean ("show-menu-icons",
                                                          NULL, NULL,
                                                          TRUE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
   g_object_class_install_property (gobject_class,
                                    PROP_SHOW_TOOLTIPS,
                                    g_param_spec_boolean ("show-tooltips",
                                                          NULL, NULL,
                                                          FALSE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_SHOW_BUTTON_TITLE,
                                    g_param_spec_boolean ("show-button-title",
                                                          NULL, NULL,
                                                          TRUE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_BUTTON_TITLE,
                                    g_param_spec_string ("button-title",
                                                         NULL, NULL,
                                                         DEFAULT_TITLE,
-                                                        EXO_PARAM_READWRITE));
+                                                        G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_BUTTON_ICON,
                                    g_param_spec_string ("button-icon",
                                                         NULL, NULL,
                                                         DEFAULT_ICON_NAME,
-                                                        EXO_PARAM_READWRITE));
+                                                        G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_CUSTOM_MENU,
                                    g_param_spec_boolean ("custom-menu",
                                                          NULL, NULL,
                                                          FALSE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_CUSTOM_MENU_FILE,
                                    g_param_spec_string ("custom-menu-file",
                                                         NULL, NULL,
                                                         NULL,
-                                                        EXO_PARAM_READWRITE));
+                                                        G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   menu_icon_size = gtk_icon_size_from_name ("panel-applications-menu");
   if (menu_icon_size == GTK_ICON_SIZE_INVALID)
@@ -284,7 +283,7 @@ applications_menu_plugin_get_property (GObject    *object,
       break;
 
     case PROP_BUTTON_ICON:
-      g_value_set_string (value, exo_str_is_empty (plugin->button_icon) ?
+      g_value_set_string (value, panel_str_is_empty (plugin->button_icon) ?
           DEFAULT_ICON_NAME : plugin->button_icon);
       break;
 
@@ -347,7 +346,7 @@ applications_menu_plugin_set_property (GObject      *object,
       gtk_label_set_text (GTK_LABEL (plugin->label),
           plugin->button_title != NULL ? plugin->button_title : "");
       gtk_widget_set_tooltip_text (plugin->button,
-          exo_str_is_empty (plugin->button_title) ? NULL : plugin->button_title);
+          panel_str_is_empty (plugin->button_title) ? NULL : plugin->button_title);
 
       /* check if the label still fits */
       if (xfce_panel_plugin_get_mode (XFCE_PANEL_PLUGIN (plugin)) == XFCE_PANEL_PLUGIN_MODE_DESKBAR
@@ -361,7 +360,7 @@ applications_menu_plugin_set_property (GObject      *object,
       g_free (plugin->button_icon);
       plugin->button_icon = g_value_dup_string (value);
       xfce_panel_image_set_from_source (XFCE_PANEL_IMAGE (plugin->icon),
-          exo_str_is_empty (plugin->button_icon) ? DEFAULT_ICON_NAME : plugin->button_icon);
+          panel_str_is_empty (plugin->button_icon) ? DEFAULT_ICON_NAME : plugin->button_icon);
 
       force_a_resize = TRUE;
       break;
@@ -556,6 +555,7 @@ static void
 applications_menu_plugin_configure_plugin_icon_chooser (GtkWidget              *button,
                                                         ApplicationsMenuPlugin *plugin)
 {
+#ifdef EXO_CHECK_VERSION
   GtkWidget *chooser;
   gchar     *icon;
 
@@ -573,7 +573,7 @@ applications_menu_plugin_configure_plugin_icon_chooser (GtkWidget              *
                                            GTK_RESPONSE_CANCEL, -1);
 
   exo_icon_chooser_dialog_set_icon (EXO_ICON_CHOOSER_DIALOG (chooser),
-      exo_str_is_empty (plugin->button_icon) ? DEFAULT_ICON_NAME : plugin->button_icon);
+      panel_str_is_empty (plugin->button_icon) ? DEFAULT_ICON_NAME : plugin->button_icon);
 
   if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_ACCEPT)
     {
@@ -583,6 +583,7 @@ applications_menu_plugin_configure_plugin_icon_chooser (GtkWidget              *
     }
 
   gtk_widget_destroy (chooser);
+#endif
 }
 
 
@@ -629,14 +630,16 @@ applications_menu_plugin_configure_plugin (XfcePanelPlugin *panel_plugin)
     {
       object = gtk_builder_get_object (builder, check_names[i]);
       panel_return_if_fail (GTK_IS_CHECK_BUTTON (object));
-      exo_mutual_binding_new (G_OBJECT (plugin), check_names[i],
-                              G_OBJECT (object), "active");
+      g_object_bind_property (G_OBJECT (plugin), check_names[i],
+                              G_OBJECT (object), "active",
+                              G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
     }
 
   object = gtk_builder_get_object (builder, "button-title");
   panel_return_if_fail (GTK_IS_ENTRY (object));
-  exo_mutual_binding_new (G_OBJECT (plugin), "button-title",
-                          G_OBJECT (object), "text");
+  g_object_bind_property (G_OBJECT (plugin), "button-title",
+                          G_OBJECT (object), "text",
+                          G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
 
   object = gtk_builder_get_object (builder, "icon-button");
   panel_return_if_fail (GTK_IS_BUTTON (object));
@@ -644,7 +647,7 @@ applications_menu_plugin_configure_plugin (XfcePanelPlugin *panel_plugin)
      G_CALLBACK (applications_menu_plugin_configure_plugin_icon_chooser), plugin);
 
   plugin->dialog_icon = xfce_panel_image_new_from_source (
-      exo_str_is_empty (plugin->button_icon) ? DEFAULT_ICON_NAME : plugin->button_icon);
+      panel_str_is_empty (plugin->button_icon) ? DEFAULT_ICON_NAME : plugin->button_icon);
   xfce_panel_image_set_size (XFCE_PANEL_IMAGE (plugin->dialog_icon), 48);
   gtk_container_add (GTK_CONTAINER (object), plugin->dialog_icon);
   g_object_add_weak_pointer (G_OBJECT (plugin->dialog_icon), (gpointer) &plugin->dialog_icon);
@@ -658,7 +661,9 @@ applications_menu_plugin_configure_plugin (XfcePanelPlugin *panel_plugin)
     {
       object2 = gtk_builder_get_object (builder, "use-default-menu");
       panel_return_if_fail (GTK_IS_RADIO_BUTTON (object2));
-      exo_binding_new (G_OBJECT (object2), "active", G_OBJECT (object), "sensitive");
+      g_object_bind_property (G_OBJECT (object2), "active",
+                              G_OBJECT (object), "sensitive",
+                              G_BINDING_SYNC_CREATE);
       g_signal_connect (G_OBJECT (object), "clicked",
           G_CALLBACK (applications_menu_plugin_configure_plugin_edit), plugin);
     }
@@ -670,17 +675,20 @@ applications_menu_plugin_configure_plugin (XfcePanelPlugin *panel_plugin)
 
   object = gtk_builder_get_object (builder, "use-custom-menu");
   panel_return_if_fail (GTK_IS_RADIO_BUTTON (object));
-  exo_mutual_binding_new (G_OBJECT (plugin), "custom-menu",
-                          G_OBJECT (object), "active");
+  g_object_bind_property (G_OBJECT (plugin), "custom-menu",
+                          G_OBJECT (object), "active",
+                          G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
 
   /* sensitivity of custom file selector */
   object2 = gtk_builder_get_object (builder, "custom-box");
   panel_return_if_fail (GTK_IS_WIDGET (object2));
-  exo_binding_new (G_OBJECT (object), "active", G_OBJECT (object2), "sensitive");
+  g_object_bind_property (G_OBJECT (object), "active",
+                          G_OBJECT (object2), "sensitive",
+                          G_BINDING_SYNC_CREATE);
 
   object = gtk_builder_get_object (builder, "custom-file");
   panel_return_if_fail (GTK_IS_FILE_CHOOSER_BUTTON (object));
-  if (!exo_str_is_empty (plugin->custom_menu_file))
+  if (!panel_str_is_empty (plugin->custom_menu_file))
     gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (object), plugin->custom_menu_file);
   g_signal_connect (G_OBJECT (object), "file-set",
      G_CALLBACK (applications_menu_plugin_configure_plugin_file_set), plugin);
@@ -772,7 +780,7 @@ applications_menu_plugin_menu_item_activate (GtkWidget      *mi,
   panel_return_if_fail (GARCON_IS_MENU_ITEM (item));
 
   command = garcon_menu_item_get_command (item);
-  if (exo_str_is_empty (command))
+  if (panel_str_is_empty (command))
     return;
 
   string = g_string_sized_new (100);
@@ -794,7 +802,7 @@ applications_menu_plugin_menu_item_activate (GtkWidget      *mi,
 
             case 'i':
               tmp = garcon_menu_item_get_icon_name (item);
-              if (!exo_str_is_empty (tmp))
+              if (!panel_str_is_empty (tmp))
                 {
                   g_string_append (string, "--icon ");
                   applications_menu_plugin_append_quoted (string, tmp);
@@ -803,13 +811,13 @@ applications_menu_plugin_menu_item_activate (GtkWidget      *mi,
 
             case 'c':
               tmp = garcon_menu_item_get_name (item);
-              if (!exo_str_is_empty (tmp))
+              if (!panel_str_is_empty (tmp))
                 applications_menu_plugin_append_quoted (string, tmp);
               break;
 
             case 'k':
               uri = garcon_menu_item_get_uri (item);
-              if (!exo_str_is_empty (uri))
+              if (!panel_str_is_empty (uri))
                 applications_menu_plugin_append_quoted (string, uri);
               g_free (uri);
               break;
@@ -859,7 +867,7 @@ applications_menu_plugin_menu_item_drag_begin (GarconMenuItem   *item,
   panel_return_if_fail (GARCON_IS_MENU_ITEM (item));
 
   icon_name = garcon_menu_item_get_icon_name (item);
-  if (!exo_str_is_empty (icon_name))
+  if (!panel_str_is_empty (icon_name))
     gtk_drag_set_icon_name (drag_context, icon_name, 0, 0);
 }
 
@@ -914,9 +922,9 @@ applications_menu_plugin_menu_reload (ApplicationsMenuPlugin *plugin)
        * time to finalize the events that triggered the reload */
       if (GTK_WIDGET_VISIBLE (plugin->menu))
         g_signal_connect (G_OBJECT (plugin->menu), "selection-done",
-            G_CALLBACK (exo_gtk_object_destroy_later), NULL);
+            G_CALLBACK (panel_utils_destroy_later), NULL);
       else
-        exo_gtk_object_destroy_later (GTK_OBJECT (plugin->menu));
+        panel_utils_destroy_later (GTK_WIDGET (plugin->menu));
     }
 }
 
@@ -975,7 +983,7 @@ applications_menu_plugin_menu_add (GtkWidget              *gtk_menu,
           if (plugin->show_tooltips)
             {
               comment = garcon_menu_item_get_comment (li->data);
-              if (!exo_str_is_empty (comment))
+              if (!panel_str_is_empty (comment))
                 gtk_widget_set_tooltip_text (mi, comment);
             }
 
@@ -990,13 +998,13 @@ applications_menu_plugin_menu_add (GtkWidget              *gtk_menu,
               G_CALLBACK (applications_menu_plugin_menu_item_drag_end), plugin);
 
           command = garcon_menu_item_get_command (li->data);
-          if (G_UNLIKELY (exo_str_is_empty (command)))
+          if (G_UNLIKELY (panel_str_is_empty (command)))
             gtk_widget_set_sensitive (mi, FALSE);
 
           if (plugin->show_menu_icons)
             {
               icon_name = garcon_menu_item_get_icon_name (li->data);
-              if (exo_str_is_empty (icon_name))
+              if (panel_str_is_empty (icon_name))
                 icon_name = "applications-other";
 
               image = xfce_panel_image_new_from_source (icon_name);
@@ -1041,7 +1049,7 @@ applications_menu_plugin_menu_add (GtkWidget              *gtk_menu,
               if (plugin->show_menu_icons)
                 {
                   icon_name = garcon_menu_element_get_icon_name (li->data);
-                  if (exo_str_is_empty (icon_name))
+                  if (panel_str_is_empty (icon_name))
                     icon_name = "applications-other";
 
                   image = xfce_panel_image_new_from_source (icon_name);
diff --git a/plugins/clock/Makefile.am b/plugins/clock/Makefile.am
index 9ecb8f8..672da22 100644
--- a/plugins/clock/Makefile.am
+++ b/plugins/clock/Makefile.am
@@ -35,7 +35,6 @@ libclock_la_CFLAGS = \
 	$(LIBXFCE4UTIL_CFLAGS) \
 	$(CAIRO_CFLAGS) \
 	$(LIBXFCE4UI_CFLAGS) \
-	$(EXO_CFLAGS) \
 	$(XFCONF_CFLAGS) \
 	$(PLATFORM_CFLAGS)
 
@@ -54,7 +53,6 @@ libclock_la_LIBADD = \
 	$(CAIRO_LIBS) \
 	$(LIBXFCE4UTIL_LIBS) \
 	$(LIBXFCE4UI_LIBS) \
-	$(EXO_LIBS) \
 	$(XFCONF_LIBS) \
 	-lm
 
@@ -85,7 +83,7 @@ DISTCLEANFILES += \
 	$(libclock_built_sources)
 
 clock-dialog_ui.h: clock-dialog.glade
-	$(AM_V_GEN) exo-csource --static --strip-comments --strip-content --name=clock_dialog_ui $< >$@
+	$(AM_V_GEN) xdt-csource --static --strip-comments --strip-content --name=clock_dialog_ui $< >$@
 endif
 
 # vi:set ts=8 sw=8 noet ai nocindent syntax=automake:
diff --git a/plugins/clock/clock-fuzzy.c b/plugins/clock/clock-fuzzy.c
index 7b0aa41..bc7e19a 100644
--- a/plugins/clock/clock-fuzzy.c
+++ b/plugins/clock/clock-fuzzy.c
@@ -25,7 +25,6 @@
 #endif
 
 #include <gtk/gtk.h>
-#include <exo/exo.h>
 
 #include "clock.h"
 #include "clock-time.h"
@@ -280,7 +279,7 @@ xfce_clock_fuzzy_update (XfceClockFuzzy *fuzzy,
   GDateTime      *date_time;
   gint            sector;
   gint            minute, hour;
-  gchar          *string;
+  GString        *string;
   const gchar    *time_format;
   gchar          *p;
   gchar           pattern[3];
@@ -333,12 +332,25 @@ xfce_clock_fuzzy_update (XfceClockFuzzy *fuzzy,
           p = strchr (time_format, '%');
           panel_assert (p != NULL && g_ascii_isdigit (*(p + 1)));
         }
+      
+      string = g_string_new (NULL);
 
       /* replace the %? with the hour name */
       g_snprintf (pattern, sizeof (pattern), "%%%c", p != NULL ? *(p + 1) : '0');
-      string = exo_str_replace (time_format, pattern, _(i18n_hour_names[hour]));
-      gtk_label_set_text (GTK_LABEL (fuzzy), string);
-      g_free (string);
+      p = strstr (time_format, pattern);
+      if (p != NULL)
+        {
+          g_string_append_len (string, time_format, p - time_format);
+          g_string_append (string, _(i18n_hour_names[hour]));
+          g_string_append (string, p + strlen (pattern));
+        }
+      else
+        {
+          g_string_append (string, time_format);
+        }
+
+      gtk_label_set_text (GTK_LABEL (fuzzy), string->str);
+      g_string_free (string, TRUE);
     }
   else /* FUZZINESS_DAY */
     {
diff --git a/plugins/clock/clock.c b/plugins/clock/clock.c
index 61e6c66..fab6a16 100644
--- a/plugins/clock/clock.c
+++ b/plugins/clock/clock.c
@@ -27,7 +27,6 @@
 
 #include <gdk/gdkkeysyms.h>
 #include <gtk/gtk.h>
-#include <exo/exo.h>
 #include <libxfce4ui/libxfce4ui.h>
 #include <libxfce4panel/libxfce4panel.h>
 #include <common/panel-private.h>
@@ -223,34 +222,34 @@ clock_plugin_class_init (ClockPluginClass *klass)
                                                       CLOCK_PLUGIN_MODE_MIN,
                                                       CLOCK_PLUGIN_MODE_MAX,
                                                       CLOCK_PLUGIN_MODE_DEFAULT,
-                                                      EXO_PARAM_READWRITE));
+                                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_TOOLTIP_FORMAT,
                                    g_param_spec_string ("tooltip-format",
                                                         NULL, NULL,
                                                         DEFAULT_TOOLTIP_FORMAT,
-                                                        EXO_PARAM_READWRITE));
+                                                        G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_ROTATE_VERTICALLY,
                                    g_param_spec_boolean ("rotate-vertically",
                                                          NULL, NULL,
                                                          TRUE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_COMMAND,
                                    g_param_spec_string ("command",
                                                         NULL, NULL, NULL,
-                                                        EXO_PARAM_READWRITE));
+                                                        G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_TIME_CONFIG_TOOL,
                                    g_param_spec_string ("time-config-tool",
                                                         NULL, NULL,
                                                         DEFAULT_TIME_CONFIG_TOOL,
-                                                        EXO_PARAM_READWRITE));
+                                                        G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 }
 
 
@@ -426,7 +425,7 @@ clock_plugin_button_press_event (GtkWidget      *widget,
   if (event->button == 1 || event->button == 2)
     {
       if (event->type == GDK_BUTTON_PRESS &&
-          exo_str_is_empty (plugin->command))
+          panel_str_is_empty (plugin->command))
         {
           /* toggle calendar window visibility */
           if (plugin->calendar_window == NULL
@@ -439,7 +438,7 @@ clock_plugin_button_press_event (GtkWidget      *widget,
           return TRUE;
         }
       else if (event->type == GDK_2BUTTON_PRESS
-               && !exo_str_is_empty (plugin->command))
+               && !panel_str_is_empty (plugin->command))
         {
           /* launch command */
           if (!xfce_spawn_command_line_on_screen (gtk_widget_get_screen (widget),
@@ -687,15 +686,16 @@ clock_plugin_configure_plugin_mode_changed (GtkComboBox       *combo,
     g_object_set (G_OBJECT (dialog->plugin), "mode", mode, NULL);
   panel_return_if_fail (G_IS_OBJECT (dialog->plugin->clock));
 
-  /* connect the exo bindings */
+  /* connect the bindings */
   for (i = 0; i < G_N_ELEMENTS (names); i++)
     {
       if (PANEL_HAS_FLAG (active, 1 << (i + 1)))
         {
           object = gtk_builder_get_object (dialog->builder, names[i].binding);
           panel_return_if_fail (G_IS_OBJECT (object));
-          exo_mutual_binding_new (G_OBJECT (dialog->plugin->clock), names[i].binding,
-                                  G_OBJECT (object), names[i].property);
+          g_object_bind_property (G_OBJECT (dialog->plugin->clock), names[i].binding,
+                                  G_OBJECT (object), names[i].property,
+                                  G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
         }
     }
 }
@@ -781,7 +781,7 @@ clock_plugin_configure_plugin_chooser_fill (ClockPlugin *plugin,
       g_free (preview);
 
       if (has_active == FALSE
-          && !exo_str_is_empty (active_format)
+          && !panel_str_is_empty (active_format)
           && strcmp (active_format, formats[i]) == 0)
         {
           gtk_combo_box_set_active_iter (combo, &iter);
@@ -890,19 +890,22 @@ clock_plugin_configure_plugin (XfcePanelPlugin *panel_plugin)
 
   object = gtk_builder_get_object (builder, "timezone-name");
   panel_return_if_fail (GTK_IS_ENTRY (object));
-  exo_mutual_binding_new (G_OBJECT (plugin->time), "timezone",
-                          G_OBJECT (object), "text");
+  g_object_bind_property (G_OBJECT (plugin->time), "timezone",
+                          G_OBJECT (object), "text",
+                          G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
 
   object = gtk_builder_get_object (builder, "mode");
   g_signal_connect_data (G_OBJECT (object), "changed",
       G_CALLBACK (clock_plugin_configure_plugin_mode_changed), dialog,
       (GClosureNotify) clock_plugin_configure_plugin_free, 0);
-  exo_mutual_binding_new (G_OBJECT (plugin), "mode",
-                          G_OBJECT (object), "active");
+  g_object_bind_property (G_OBJECT (plugin), "mode",
+                          G_OBJECT (object), "active",
+                          G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
 
   object = gtk_builder_get_object (builder, "tooltip-format");
-  exo_mutual_binding_new (G_OBJECT (plugin), "tooltip-format",
-                          G_OBJECT (object), "text");
+  g_object_bind_property (G_OBJECT (plugin), "tooltip-format",
+                          G_OBJECT (object), "text",
+                          G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
   combo = gtk_builder_get_object (builder, "tooltip-chooser");
   clock_plugin_configure_plugin_chooser_fill (plugin,
                                               GTK_COMBO_BOX (combo),
@@ -1218,3 +1221,239 @@ clock_plugin_tooltip (gpointer user_data)
   /* keep the timeout running */
   return TRUE;
 }
+<<<<<<< HEAD
+=======
+
+
+
+static gboolean
+clock_plugin_timeout_running (gpointer user_data)
+{
+  ClockPluginTimeout *timeout = user_data;
+  gboolean            result;
+  struct tm           tm;
+
+  GDK_THREADS_ENTER ();
+  result = (timeout->function) (timeout->data);
+  GDK_THREADS_LEAVE ();
+
+  /* check if the timeout still runs in time if updating once a minute */
+  if (result && timeout->interval == CLOCK_INTERVAL_MINUTE)
+    {
+      /* sync again when we don't run on time */
+      clock_plugin_get_localtime (&tm);
+      timeout->restart = tm.tm_sec != 0;
+    }
+
+  return result && !timeout->restart;
+}
+
+
+
+static void
+clock_plugin_timeout_destroyed (gpointer user_data)
+{
+  ClockPluginTimeout *timeout = user_data;
+
+  timeout->timeout_id = 0;
+
+  if (G_UNLIKELY (timeout->restart))
+    clock_plugin_timeout_set_interval (timeout, timeout->interval);
+}
+
+
+
+static gboolean
+clock_plugin_timeout_sync (gpointer user_data)
+{
+  ClockPluginTimeout *timeout = user_data;
+
+  /* run the user function */
+  if ((timeout->function) (timeout->data))
+    {
+      /* start the real timeout */
+      timeout->timeout_id = g_timeout_add_seconds_full (G_PRIORITY_DEFAULT, timeout->interval,
+                                                        clock_plugin_timeout_running, timeout,
+                                                        clock_plugin_timeout_destroyed);
+    }
+  else
+    {
+      timeout->timeout_id = 0;
+    }
+
+  /* stop the sync timeout */
+  return FALSE;
+}
+
+
+
+ClockPluginTimeout *
+clock_plugin_timeout_new (guint       interval,
+                          GSourceFunc function,
+                          gpointer    data)
+{
+  ClockPluginTimeout *timeout;
+
+  panel_return_val_if_fail (interval > 0, NULL);
+  panel_return_val_if_fail (function != NULL, NULL);
+
+  timeout = g_slice_new0 (ClockPluginTimeout);
+  timeout->interval = 0;
+  timeout->function = function;
+  timeout->data = data;
+  timeout->timeout_id = 0;
+  timeout->restart = FALSE;
+
+  clock_plugin_timeout_set_interval (timeout, interval);
+
+  return timeout;
+}
+
+
+
+void
+clock_plugin_timeout_set_interval (ClockPluginTimeout *timeout,
+                                   guint               interval)
+{
+  struct tm tm;
+  guint     next_interval;
+  gboolean  restart = timeout->restart;
+
+  panel_return_if_fail (timeout != NULL);
+  panel_return_if_fail (interval > 0);
+
+  /* leave if nothing changed and we're not restarting */
+  if (!restart && timeout->interval == interval)
+    return;
+  timeout->interval = interval;
+  timeout->restart = FALSE;
+
+  /* stop running timeout */
+  if (G_LIKELY (timeout->timeout_id != 0))
+    g_source_remove (timeout->timeout_id);
+  timeout->timeout_id = 0;
+
+  /* run function when not restarting, leave if it returns false */
+  if (!restart && !(timeout->function) (timeout->data))
+    return;
+
+  /* get the seconds to the next internal */
+  if (interval == CLOCK_INTERVAL_MINUTE)
+    {
+      clock_plugin_get_localtime (&tm);
+      next_interval = 60 - tm.tm_sec;
+    }
+  else
+    {
+      next_interval = 0;
+    }
+
+  if (next_interval > 0)
+    {
+      /* start the sync timeout */
+      timeout->timeout_id = g_timeout_add_seconds_full (G_PRIORITY_DEFAULT, next_interval,
+                                                        clock_plugin_timeout_sync,
+                                                        timeout, NULL);
+    }
+  else
+    {
+      /* directly start running the normal timeout */
+      timeout->timeout_id = g_timeout_add_seconds_full (G_PRIORITY_DEFAULT, interval,
+                                                        clock_plugin_timeout_running, timeout,
+                                                        clock_plugin_timeout_destroyed);
+    }
+}
+
+
+
+void
+clock_plugin_timeout_free (ClockPluginTimeout *timeout)
+{
+  panel_return_if_fail (timeout != NULL);
+
+  timeout->restart = FALSE;
+  if (G_LIKELY (timeout->timeout_id != 0))
+    g_source_remove (timeout->timeout_id);
+  g_slice_free (ClockPluginTimeout, timeout);
+}
+
+
+
+void
+clock_plugin_get_localtime (struct tm *tm)
+{
+  time_t now = time (NULL);
+
+#ifndef HAVE_LOCALTIME_R
+  struct tm *tmbuf;
+
+  tmbuf = localtime (&now);
+  *tm = *tmbuf;
+#else
+  localtime_r (&now, tm);
+#endif
+}
+
+
+
+gchar *
+clock_plugin_strdup_strftime (const gchar     *format,
+                              const struct tm *tm)
+{
+  gchar *converted, *result;
+  gsize  length;
+  gchar  buffer[1024];
+
+  /* leave when format is null */
+  if (G_UNLIKELY (panel_str_is_empty (format)))
+    return NULL;
+
+  /* convert to locale, because that's what strftime uses */
+  converted = g_locale_from_utf8 (format, -1, NULL, NULL, NULL);
+  if (G_UNLIKELY (converted == NULL))
+    return NULL;
+
+  /* parse the time string */
+  length = strftime (buffer, sizeof (buffer), converted, tm);
+  if (G_UNLIKELY (length == 0))
+    buffer[0] = '\0';
+
+  /* convert the string back to utf-8 */
+  result = g_locale_to_utf8 (buffer, -1, NULL, NULL, NULL);
+
+  /* cleanup */
+  g_free (converted);
+
+  return result;
+}
+
+
+
+guint
+clock_plugin_interval_from_format (const gchar *format)
+{
+  const gchar *p;
+
+  if (G_UNLIKELY (panel_str_is_empty (format)))
+      return CLOCK_INTERVAL_MINUTE;
+
+  for (p = format; *p != '\0'; ++p)
+    {
+      if (p[0] == '%' && p[1] != '\0')
+        {
+          switch (*++p)
+            {
+            case 'c':
+            case 'N':
+            case 'r':
+            case 's':
+            case 'S':
+            case 'T':
+            case 'X':
+              return CLOCK_INTERVAL_SECOND;
+            }
+        }
+    }
+
+  return CLOCK_INTERVAL_MINUTE;
+}
diff --git a/plugins/directorymenu/Makefile.am b/plugins/directorymenu/Makefile.am
index 88b13ea..57eb616 100644
--- a/plugins/directorymenu/Makefile.am
+++ b/plugins/directorymenu/Makefile.am
@@ -19,7 +19,6 @@ libdirectorymenu_la_SOURCES = \
 
 libdirectorymenu_la_CFLAGS = \
 	$(GTK_CFLAGS) \
-	$(EXO_CFLAGS) \
 	$(XFCONF_CFLAGS) \
 	$(LIBXFCE4UTIL_CFLAGS) \
 	$(LIBXFCE4UI_CFLAGS) \
@@ -37,7 +36,6 @@ libdirectorymenu_la_LDFLAGS = \
 libdirectorymenu_la_LIBADD = \
 	$(top_builddir)/libxfce4panel/libxfce4panel-$(LIBXFCE4PANEL_VERSION_API).la \
 	$(top_builddir)/common/libpanel-common.la \
-	$(EXO_LIBS) \
 	$(GTK_LIBS) \
 	$(LIBXFCE4UTIL_LIBS) \
 	$(LIBXFCE4UI_LIBS) \
@@ -84,7 +82,7 @@ DISTCLEANFILES += \
 	$(libdirectorymenu_built_sources)
 
 directorymenu-dialog_ui.h: directorymenu-dialog.glade
-	$(AM_V_GEN) exo-csource --static --strip-comments --strip-content --name=directorymenu_dialog_ui $< >$@
+	$(AM_V_GEN) xdt-csource --static --strip-comments --strip-content --name=directorymenu_dialog_ui $< >$@
 endif
 
 # vi:set ts=8 sw=8 noet ai nocindent syntax=automake:
diff --git a/plugins/directorymenu/directorymenu.c b/plugins/directorymenu/directorymenu.c
index d2e20a6..a8f5483 100644
--- a/plugins/directorymenu/directorymenu.c
+++ b/plugins/directorymenu/directorymenu.c
@@ -21,7 +21,6 @@
 #endif
 
 #include <gio/gio.h>
-#include <exo/exo.h>
 #include <libxfce4ui/libxfce4ui.h>
 #include <libxfce4util/libxfce4util.h>
 #include <libxfce4panel/libxfce4panel.h>
@@ -127,28 +126,28 @@ directory_menu_plugin_class_init (DirectoryMenuPluginClass *klass)
                                    g_param_spec_string ("base-directory",
                                                         NULL, NULL,
                                                         NULL,
-                                                        EXO_PARAM_READWRITE));
+                                                        G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_ICON_NAME,
                                    g_param_spec_string ("icon-name",
                                                         NULL, NULL,
                                                         NULL,
-                                                        EXO_PARAM_READWRITE));
+                                                        G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_FILE_PATTERN,
                                    g_param_spec_string ("file-pattern",
                                                         NULL, NULL,
                                                         "",
-                                                        EXO_PARAM_READWRITE));
+                                                        G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_HIDDEN_FILES,
                                    g_param_spec_boolean ("hidden-files",
                                                          NULL, NULL,
                                                          FALSE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   menu_file = g_quark_from_static_string ("dir-menu-file");
 
@@ -201,7 +200,7 @@ directory_menu_plugin_get_property (GObject    *object,
       break;
 
     case PROP_FILE_PATTERN:
-      g_value_set_string (value, exo_str_is_empty (plugin->file_pattern) ?
+      g_value_set_string (value, panel_str_is_empty (plugin->file_pattern) ?
           "" : plugin->file_pattern);
       break;
 
@@ -233,7 +232,7 @@ directory_menu_plugin_set_property (GObject      *object,
     {
     case PROP_BASE_DIRECTORY:
       path = g_value_get_string (value);
-      if (exo_str_is_empty (path))
+      if (panel_str_is_empty (path))
         path = g_get_home_dir ();
 
       if (plugin->base_directory != NULL)
@@ -252,7 +251,7 @@ directory_menu_plugin_set_property (GObject      *object,
       g_free (plugin->icon_name);
       plugin->icon_name = g_value_dup_string (value);
       xfce_panel_image_set_from_source (XFCE_PANEL_IMAGE (plugin->icon),
-          exo_str_is_empty (plugin->icon_name) ? DEFAULT_ICON_NAME : plugin->icon_name);
+          panel_str_is_empty (plugin->icon_name) ? DEFAULT_ICON_NAME : plugin->icon_name);
       break;
 
     case PROP_FILE_PATTERN:
@@ -265,7 +264,7 @@ directory_menu_plugin_set_property (GObject      *object,
       if (G_LIKELY (array != NULL))
         {
           for (i = 0; array[i] != NULL; i++)
-            if (!exo_str_is_empty (array[i]))
+            if (!panel_str_is_empty (array[i]))
                 plugin->patterns = g_slist_prepend (plugin->patterns,
                     g_pattern_spec_new (array[i]));
 
@@ -379,6 +378,7 @@ static void
 directory_menu_plugin_configure_plugin_icon_chooser (GtkWidget           *button,
                                                      DirectoryMenuPlugin *plugin)
 {
+#ifdef EXO_CHECK_VERSION
   GtkWidget *chooser;
   gchar     *icon;
 
@@ -395,7 +395,7 @@ directory_menu_plugin_configure_plugin_icon_chooser (GtkWidget           *button
                                            GTK_RESPONSE_ACCEPT,
                                            GTK_RESPONSE_CANCEL, -1);
 
-  if (!exo_str_is_empty (plugin->icon_name))
+  if (!panel_str_is_empty (plugin->icon_name))
   exo_icon_chooser_dialog_set_icon (EXO_ICON_CHOOSER_DIALOG (chooser), plugin->icon_name);
 
   if (gtk_dialog_run (GTK_DIALOG (chooser)) == GTK_RESPONSE_ACCEPT)
@@ -407,6 +407,7 @@ directory_menu_plugin_configure_plugin_icon_chooser (GtkWidget           *button
     }
 
   gtk_widget_destroy (chooser);
+#endif
 }
 
 
@@ -419,7 +420,7 @@ directory_menu_plugin_configure_plugin (XfcePanelPlugin *panel_plugin)
   GObject             *dialog, *object;
   const gchar         *icon_name = plugin->icon_name;
 
-  if (exo_str_is_empty (icon_name))
+  if (panel_str_is_empty (icon_name))
     icon_name = DEFAULT_ICON_NAME;
 
   /* setup the dialog */
@@ -450,13 +451,15 @@ directory_menu_plugin_configure_plugin (XfcePanelPlugin *panel_plugin)
 
   object = gtk_builder_get_object (builder, "file-pattern");
   panel_return_if_fail (GTK_IS_ENTRY (object));
-  exo_mutual_binding_new (G_OBJECT (plugin), "file-pattern",
-                          G_OBJECT (object), "text");
+  g_object_bind_property (G_OBJECT (plugin), "file-pattern",
+                          G_OBJECT (object), "text",
+                          G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
 
   object = gtk_builder_get_object (builder, "hidden-files");
   panel_return_if_fail (GTK_IS_CHECK_BUTTON (object));
-  exo_mutual_binding_new (G_OBJECT (plugin), "hidden-files",
-                          G_OBJECT (object), "active");
+  g_object_bind_property (G_OBJECT (plugin), "hidden-files",
+                          G_OBJECT (object), "active",
+                          G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
 
   gtk_widget_show (GTK_WIDGET (dialog));
 }
@@ -510,7 +513,7 @@ directory_menu_plugin_selection_done (GtkWidget *menu,
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
 
   /* delay destruction so we can handle the activate event first */
-  exo_gtk_object_destroy_later (GTK_OBJECT (menu));
+  panel_utils_destroy_later (GTK_WIDGET (menu));
 }
 
 
@@ -709,8 +712,11 @@ directory_menu_plugin_menu_open (GtkWidget   *mi,
     }
 
   if (!result
+#ifdef EXO_CHECK_VERSION
       && !exo_execute_preferred_application_on_screen (category, NULL, working_dir, NULL,
-                                                       gtk_widget_get_screen (mi), &error))
+                                                       gtk_widget_get_screen (mi), &error)
+#endif
+     )
     {
       xfce_dialog_show_error (NULL, error,
           _("Failed to execute the preferred application for category \"%s\""), category);
@@ -751,7 +757,7 @@ directory_menu_plugin_menu_unload (GtkWidget *menu)
 {
   /* delay destruction so we can handle the activate event first */
   gtk_container_foreach (GTK_CONTAINER (menu),
-     (GtkCallback) exo_gtk_object_destroy_later, NULL);
+     (GtkCallback) panel_utils_destroy_later, NULL);
 }
 
 
@@ -898,7 +904,7 @@ directory_menu_plugin_menu_load (GtkWidget           *menu,
                   icon = g_app_info_get_icon (G_APP_INFO (desktopinfo));
 
                   /* ignore invalid or hidden files */
-                  if (exo_str_is_empty (display_name)
+                  if (panel_str_is_empty (display_name)
                       || g_desktop_app_info_get_is_hidden (desktopinfo))
                     {
                       g_object_unref (G_OBJECT (desktopinfo));
@@ -939,7 +945,7 @@ directory_menu_plugin_menu_load (GtkWidget           *menu,
           else if (G_UNLIKELY (desktopinfo != NULL))
             {
               description = g_app_info_get_description (G_APP_INFO (desktopinfo));
-              if (!exo_str_is_empty (description))
+              if (!panel_str_is_empty (description))
                 gtk_widget_set_tooltip_text (mi, description);
 
               g_signal_connect_data (G_OBJECT (mi), "activate",
diff --git a/plugins/launcher/Makefile.am b/plugins/launcher/Makefile.am
index 5841dc7..1c3bed0 100644
--- a/plugins/launcher/Makefile.am
+++ b/plugins/launcher/Makefile.am
@@ -25,7 +25,6 @@ liblauncher_la_CFLAGS = \
 	$(LIBXFCE4UTIL_CFLAGS) \
 	$(LIBXFCE4UI_CFLAGS) \
 	$(GARCON_CFLAGS) \
-	$(EXO_CFLAGS) \
 	$(GIO_CFLAGS) \
 	$(XFCONF_CFLAGS) \
 	$(DBUS_CFLAGS) \
@@ -45,7 +44,6 @@ liblauncher_la_LIBADD = \
 	$(LIBXFCE4UTIL_LIBS) \
 	$(LIBXFCE4UI_LIBS) \
 	$(GARCON_LIBS) \
-	$(EXO_LIBS) \
 	$(DBUS_LIBS) \
 	$(GIO_LIBS) \
 	$(XFCONF_LIBS)
@@ -77,7 +75,7 @@ DISTCLEANFILES += \
 	$(libclock_built_sources)
 
 launcher-dialog_ui.h: launcher-dialog.glade
-	$(AM_V_GEN) exo-csource --static --strip-comments --strip-content --name=launcher_dialog_ui $< >$@
+	$(AM_V_GEN) xdt-csource --static --strip-comments --strip-content --name=launcher_dialog_ui $< >$@
 endif
 
 # vi:set ts=8 sw=8 noet ai nocindent syntax=automake:
diff --git a/plugins/launcher/launcher-dialog.c b/plugins/launcher/launcher-dialog.c
index b454433..b8340d6 100644
--- a/plugins/launcher/launcher-dialog.c
+++ b/plugins/launcher/launcher-dialog.c
@@ -24,7 +24,6 @@
 #include <string.h>
 #endif
 
-#include <exo/exo.h>
 #include <libxfce4ui/libxfce4ui.h>
 #include <libxfce4util/libxfce4util.h>
 #include <garcon/garcon.h>
@@ -132,7 +131,7 @@ launcher_dialog_add_visible_function (GtkTreeModel *model,
 
   /* get the search string from the item */
   text = gtk_entry_get_text (GTK_ENTRY (user_data));
-  if (G_UNLIKELY (exo_str_is_empty (text)))
+  if (G_UNLIKELY (panel_str_is_empty (text)))
     return TRUE;
 
   /* casefold the search text */
@@ -142,7 +141,7 @@ launcher_dialog_add_visible_function (GtkTreeModel *model,
 
   /* try the pre-build search string first */
   gtk_tree_model_get (model, iter, COL_SEARCH, &string, -1);
-  if (!exo_str_is_empty (string))
+  if (!panel_str_is_empty (string))
     {
       /* search */
       visible = (strstr (string, text_casefolded) != NULL);
@@ -151,7 +150,7 @@ launcher_dialog_add_visible_function (GtkTreeModel *model,
     {
       /* get the name */
       gtk_tree_model_get (model, iter, COL_NAME, &string, -1);
-      if (!exo_str_is_empty (string))
+      if (!panel_str_is_empty (string))
         {
           /* escape and casefold the name */
           escaped = g_markup_escape_text (string, -1);
@@ -856,7 +855,7 @@ launcher_dialog_item_button_clicked (GtkWidget            *button,
           if (xfce_dialog_confirm (GTK_WINDOW (toplevel), GTK_STOCK_DELETE, NULL,
                   _("If you delete an item, it will be permanently removed"),
                   _("Are you sure you want to remove \"%s\"?"),
-                  exo_str_is_empty (display_name) ? _("Unnamed item") : display_name))
+                  panel_str_is_empty (display_name) ? _("Unnamed item") : display_name))
             {
               /* remove the item from the store */
               gtk_list_store_remove (GTK_LIST_STORE (model), &iter_a);
@@ -1050,13 +1049,13 @@ launcher_dialog_items_set_item (GtkTreeModel         *model,
   name = garcon_menu_item_get_name (item);
   comment = garcon_menu_item_get_comment (item);
 
-  if (!exo_str_is_empty (comment))
+  if (!panel_str_is_empty (comment))
     markup = g_markup_printf_escaped ("<b>%s</b>\n%s", name, comment);
   else
     markup = g_markup_printf_escaped ("<b>%s</b>", name);
 
   icon_name = garcon_menu_item_get_icon_name (item);
-  if (!exo_str_is_empty (icon_name))
+  if (!panel_str_is_empty (icon_name))
     {
       if (!gtk_icon_size_lookup (GTK_ICON_SIZE_DND, &w, &h))
         w = h = 32;
@@ -1241,8 +1240,9 @@ launcher_dialog_show (LauncherPlugin *plugin)
     {
       object = gtk_builder_get_object (builder, binding_names[i]);
       panel_return_if_fail (GTK_IS_WIDGET (object));
-      exo_mutual_binding_new (G_OBJECT (plugin), binding_names[i],
-                              G_OBJECT (object), "active");
+      g_object_bind_property (G_OBJECT (plugin), binding_names[i],
+                              G_OBJECT (object), "active",
+                              G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
     }
 
   /* setup responses for the add dialog */
diff --git a/plugins/launcher/launcher.c b/plugins/launcher/launcher.c
index 6479869..470eedb 100644
--- a/plugins/launcher/launcher.c
+++ b/plugins/launcher/launcher.c
@@ -25,7 +25,6 @@
 #endif
 
 #include <gio/gio.h>
-#include <exo/exo.h>
 #include <libxfce4util/libxfce4util.h>
 #include <libxfce4ui/libxfce4ui.h>
 #include <garcon/garcon.h>
@@ -280,28 +279,28 @@ launcher_plugin_class_init (LauncherPluginClass *klass)
                                    g_param_spec_boxed ("items",
                                                        NULL, NULL,
                                                        PANEL_PROPERTIES_TYPE_VALUE_ARRAY,
-                                                       EXO_PARAM_READWRITE));
+                                                       G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_DISABLE_TOOLTIPS,
                                    g_param_spec_boolean ("disable-tooltips",
                                                          NULL, NULL,
                                                          FALSE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_MOVE_FIRST,
                                    g_param_spec_boolean ("move-first",
                                                          NULL, NULL,
                                                          FALSE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_SHOW_LABEL,
                                    g_param_spec_boolean ("show-label",
                                                          NULL, NULL,
                                                          FALSE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_ARROW_POSITION,
@@ -310,7 +309,7 @@ launcher_plugin_class_init (LauncherPluginClass *klass)
                                                       LAUNCHER_ARROW_DEFAULT,
                                                       LAUNCHER_ARROW_INTERNAL,
                                                       LAUNCHER_ARROW_DEFAULT,
-                                                      EXO_PARAM_READWRITE));
+                                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   launcher_signals[ITEMS_CHANGED] =
     g_signal_new (g_intern_static_string ("items-changed"),
@@ -551,6 +550,27 @@ err1:
 }
 
 
+static gboolean
+_exo_str_looks_like_an_uri (const gchar *str)
+{
+  const gchar *s = str;
+
+  if (G_UNLIKELY (str == NULL))
+    return FALSE;
+
+  /* <scheme> starts with an alpha character */
+  if (g_ascii_isalpha (*s))
+    {
+      /* <scheme> continues with (alpha | digit | "+" | "-" | ".")* */
+      for (++s; g_ascii_isalnum (*s) || *s == '+' || *s == '-' || *s == '.'; ++s);
+
+      /* <scheme> must be followed by ":" */
+      return (*s == ':' && *(s+1) == '/');
+    }
+
+  return FALSE;
+}
+
 
 static GarconMenuItem *
 launcher_plugin_item_load (LauncherPlugin *plugin,
@@ -568,7 +588,7 @@ launcher_plugin_item_load (LauncherPlugin *plugin,
   panel_return_val_if_fail (str != NULL, NULL);
   panel_return_val_if_fail (G_IS_FILE (plugin->config_directory), NULL);
 
-  if (G_UNLIKELY (g_path_is_absolute (str) || exo_str_looks_like_an_uri (str)))
+  if (G_UNLIKELY (g_path_is_absolute (str) || _exo_str_looks_like_an_uri (str)))
     {
       src_file = g_file_new_for_commandline_arg (str);
       if (g_file_has_prefix (src_file, plugin->config_directory))
@@ -1156,7 +1176,7 @@ launcher_plugin_remote_event (XfcePanelPlugin *panel_plugin,
 
   panel_return_val_if_fail (value == NULL || G_IS_VALUE (value), FALSE);
 
-  if (exo_str_is_equal (name, "popup")
+  if (g_strcmp0 (name, "popup") == 0
       && LIST_HAS_TWO_OR_MORE_ENTRIES (plugin->items)
       && (plugin->menu == NULL || !GTK_WIDGET_VISIBLE (plugin->menu)))
     {
@@ -1165,7 +1185,7 @@ launcher_plugin_remote_event (XfcePanelPlugin *panel_plugin,
       return TRUE;
     }
 
-  if (exo_str_is_equal (name, "disable-tooltips")
+  if (g_strcmp0 (name, "disable-tooltips") == 0
       && value != NULL
       && G_VALUE_HOLDS_BOOLEAN (value))
     {
@@ -1401,7 +1421,7 @@ launcher_plugin_tooltip_pixbuf (GdkScreen   *screen,
 
   panel_return_val_if_fail (screen == NULL || GDK_IS_SCREEN (screen), NULL);
 
-  if (exo_str_is_empty (icon_name))
+  if (panel_str_is_empty (icon_name))
     return NULL;
 
   if (gtk_icon_size_lookup (launcher_tooltip_icon_size, &w, &h))
@@ -1411,7 +1431,7 @@ launcher_plugin_tooltip_pixbuf (GdkScreen   *screen,
 
   /* load directly from a file */
   if (G_UNLIKELY (g_path_is_absolute (icon_name)))
-    return exo_gdk_pixbuf_new_from_file_at_max_size (icon_name, size, size, TRUE, NULL);
+    return gdk_pixbuf_new_from_file_at_scale (icon_name, size, size, TRUE, NULL);
 
   if (G_LIKELY (screen != NULL))
     theme = gtk_icon_theme_get_for_screen (screen);
@@ -1572,7 +1592,7 @@ launcher_plugin_menu_construct (LauncherPlugin *plugin)
       /* create the menu item */
       name = garcon_menu_item_get_name (item);
       mi = gtk_image_menu_item_new_with_label (
-          exo_str_is_empty (name) ? _("Unnamed Item") : name);
+          panel_str_is_empty (name) ? _("Unnamed Item") : name);
       g_object_set_qdata (G_OBJECT (mi), launcher_plugin_quark, plugin);
       gtk_widget_show (mi);
       gtk_drag_dest_set (mi, GTK_DEST_DEFAULT_ALL, drop_targets,
@@ -1600,7 +1620,7 @@ launcher_plugin_menu_construct (LauncherPlugin *plugin)
 
       /* set the icon if one is set */
       icon_name = garcon_menu_item_get_icon_name (item);
-      if (!exo_str_is_empty (icon_name))
+      if (!panel_str_is_empty (icon_name))
         {
           image = xfce_panel_image_new_from_source (icon_name);
           xfce_panel_image_set_size (XFCE_PANEL_IMAGE (image), size);
@@ -1733,7 +1753,7 @@ launcher_plugin_button_update (LauncherPlugin *plugin)
 
       icon_name = garcon_menu_item_get_icon_name (item);
       xfce_panel_image_set_from_source (XFCE_PANEL_IMAGE (plugin->child),
-          exo_str_is_empty (icon_name) ? GTK_STOCK_MISSING_IMAGE : icon_name);
+          panel_str_is_empty (icon_name) ? GTK_STOCK_MISSING_IMAGE : icon_name);
 
       panel_utils_set_atk_info (plugin->button,
           garcon_menu_item_get_name (item),
@@ -2230,11 +2250,11 @@ launcher_plugin_item_query_tooltip (GtkWidget      *widget,
 
   /* require atleast an item name */
   name = garcon_menu_item_get_name (item);
-  if (exo_str_is_empty (name))
+  if (panel_str_is_empty (name))
     return FALSE;
 
   comment = garcon_menu_item_get_comment (item);
-  if (!exo_str_is_empty (comment))
+  if (!panel_str_is_empty (comment))
     {
       markup = g_markup_printf_escaped ("<b>%s</b>\n%s", name, comment);
       gtk_tooltip_set_markup (tooltip, markup);
@@ -2250,7 +2270,7 @@ launcher_plugin_item_query_tooltip (GtkWidget      *widget,
    * data on the menu item widget */
   if (GTK_IS_MENU_ITEM (widget))
     {
-      pixbuf = g_object_get_data (G_OBJECT (widget), I_("pixbuf-cache"));
+      pixbuf = g_object_get_data (G_OBJECT (widget), "pixbuf-cache");
       if (G_LIKELY (pixbuf != NULL))
         {
           gtk_tooltip_set_icon (tooltip, pixbuf);
@@ -2262,7 +2282,7 @@ launcher_plugin_item_query_tooltip (GtkWidget      *widget,
           if (G_LIKELY (pixbuf != NULL))
             {
               gtk_tooltip_set_icon (tooltip, pixbuf);
-              g_object_set_data_full (G_OBJECT (widget), I_("pixbuf-cache"), pixbuf,
+              g_object_set_data_full (G_OBJECT (widget), "pixbuf-cache", pixbuf,
                                       (GDestroyNotify) g_object_unref);
             }
         }
@@ -2330,7 +2350,7 @@ launcher_plugin_item_exec (GarconMenuItem *item,
 
   /* leave when there is nothing to execute */
   command = garcon_menu_item_get_command (item);
-  if (exo_str_is_empty (command))
+  if (panel_str_is_empty (command))
     return;
 
   if (G_UNLIKELY (uri_list != NULL
@@ -2373,7 +2393,7 @@ launcher_plugin_item_exec_from_clipboard (GarconMenuItem *item,
     text = gtk_clipboard_wait_for_text (clipboard);
 
   /* try the secondary keayboard if the text is empty */
-  if (exo_str_is_empty (text))
+  if (panel_str_is_empty (text))
     {
       /* get the secondary clipboard text */
       clipboard = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
@@ -2381,7 +2401,7 @@ launcher_plugin_item_exec_from_clipboard (GarconMenuItem *item,
         text = gtk_clipboard_wait_for_text (clipboard);
     }
 
-  if (!exo_str_is_empty (text))
+  if (!panel_str_is_empty (text))
     {
       /* create fake selection data */
       data.data = (guchar *) text;
@@ -2433,7 +2453,7 @@ launcher_plugin_exec_parse (GarconMenuItem   *item,
 
   /* get the command */
   command = garcon_menu_item_get_command (item);
-  panel_return_val_if_fail (!exo_str_is_empty (command), FALSE);
+  panel_return_val_if_fail (!panel_str_is_empty (command), FALSE);
 
   /* allocate an empty string */
   string = g_string_sized_new (100);
@@ -2481,7 +2501,7 @@ launcher_plugin_exec_parse (GarconMenuItem   *item,
 
             case 'i':
               tmp = garcon_menu_item_get_icon_name (item);
-              if (!exo_str_is_empty (tmp))
+              if (!panel_str_is_empty (tmp))
                 {
                   g_string_append (string, "--icon ");
                   launcher_plugin_exec_append_quoted (string, tmp);
@@ -2490,13 +2510,13 @@ launcher_plugin_exec_parse (GarconMenuItem   *item,
 
             case 'c':
               tmp = garcon_menu_item_get_name (item);
-              if (!exo_str_is_empty (tmp))
+              if (!panel_str_is_empty (tmp))
                 launcher_plugin_exec_append_quoted (string, tmp);
               break;
 
             case 'k':
               uri = garcon_menu_item_get_uri (item);
-              if (!exo_str_is_empty (uri))
+              if (!panel_str_is_empty (uri))
                 launcher_plugin_exec_append_quoted (string, uri);
               g_free (uri);
               break;
@@ -2543,7 +2563,7 @@ launcher_plugin_uri_list_extract (GtkSelectionData *data)
       /* create the list of uris */
       for (i = 0; array[i] != NULL; i++)
         {
-          if (!exo_str_is_empty (array[i]))
+          if (!panel_str_is_empty (array[i]))
             list = g_slist_prepend (list, array[i]);
           else
             g_free (array[i]);
@@ -2562,14 +2582,14 @@ launcher_plugin_uri_list_extract (GtkSelectionData *data)
       for (i = 0; array[i] != NULL; i++)
         {
           /* skip empty strings */
-          if (!!exo_str_is_empty (array[i]))
+          if (!!panel_str_is_empty (array[i]))
             continue;
 
           uri = NULL;
 
           if (g_path_is_absolute (array[i]))
             uri = g_filename_to_uri (array[i], NULL, NULL);
-          else if (exo_str_looks_like_an_uri (array[i]))
+          else if (_exo_str_looks_like_an_uri (array[i]))
             uri = g_strdup (array[i]);
 
           /* append the uri if we extracted one */
diff --git a/plugins/pager/Makefile.am b/plugins/pager/Makefile.am
index 7730391..3268d95 100644
--- a/plugins/pager/Makefile.am
+++ b/plugins/pager/Makefile.am
@@ -26,7 +26,6 @@ libpager_la_CFLAGS = \
 	$(LIBXFCE4UTIL_CFLAGS) \
 	$(LIBWNCK_CFLAGS) \
 	$(LIBXFCE4UI_CFLAGS) \
-	$(EXO_CFLAGS) \
 	$(PLATFORM_CFLAGS)
 
 libpager_la_LDFLAGS = \
@@ -42,7 +41,6 @@ libpager_la_LIBADD = \
 	$(GTK_LIBS) \
 	$(LIBXFCE4UTIL_LIBS) \
 	$(LIBWNCK_LIBS) \
-	$(EXO_LIBS) \
 	$(LIBXFCE4UI_LIBS) \
 	$(XFCONF_LIBS)
 
@@ -73,7 +71,7 @@ DISTCLEANFILES += \
 	$(libpager_built_sources)
 
 pager-dialog_ui.h: pager-dialog.glade
-	$(AM_V_GEN) exo-csource --static --strip-comments --strip-content --name=pager_dialog_ui $< >$@
+	$(AM_V_GEN) xdt-csource --static --strip-comments --strip-content --name=pager_dialog_ui $< >$@
 endif
 
 # vi:set ts=8 sw=8 noet ai nocindent syntax=automake:
diff --git a/plugins/pager/pager-buttons.c b/plugins/pager/pager-buttons.c
index 040e58d..c2f434c 100644
--- a/plugins/pager/pager-buttons.c
+++ b/plugins/pager/pager-buttons.c
@@ -21,7 +21,7 @@
 #endif
 
 #include <gtk/gtk.h>
-#include <exo/exo.h>
+#include <libxfce4ui/libxfce4ui.h>
 #include <libxfce4panel/libxfce4panel.h>
 #include <common/panel-private.h>
 
@@ -114,7 +114,7 @@ pager_buttons_class_init (PagerButtonsClass *klass)
                                    g_param_spec_object ("screen",
                                                          NULL, NULL,
                                                          WNCK_TYPE_SCREEN,
-                                                         EXO_PARAM_WRITABLE
+                                                         G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS
                                                          | G_PARAM_CONSTRUCT_ONLY));
 
   g_object_class_install_property (gobject_class,
@@ -122,7 +122,7 @@ pager_buttons_class_init (PagerButtonsClass *klass)
                                    g_param_spec_int ("rows",
                                                      NULL, NULL,
                                                      1, 100, 1,
-                                                     EXO_PARAM_READWRITE));
+                                                     G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_ORIENTATION,
@@ -130,7 +130,7 @@ pager_buttons_class_init (PagerButtonsClass *klass)
                                                      NULL, NULL,
                                                      GTK_TYPE_ORIENTATION,
                                                      GTK_ORIENTATION_HORIZONTAL,
-                                                     EXO_PARAM_READWRITE));
+                                                     G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 }
 
 
@@ -571,11 +571,11 @@ pager_buttons_workspace_button_label (WnckWorkspace *workspace,
 
   /* try to get an utf-8 valid name */
   name = wnck_workspace_get_name (workspace);
-  if (!exo_str_is_empty (name)
+  if (!panel_str_is_empty (name)
       && !g_utf8_validate (name, -1, NULL))
     name = utf8 = g_locale_to_utf8 (name, -1, NULL, NULL, NULL);
 
-  if (exo_str_is_empty (name))
+  if (panel_str_is_empty (name))
     name = name_num = g_strdup_printf (_("Workspace %d"),
         wnck_workspace_get_number (workspace) + 1);
 
diff --git a/plugins/pager/pager.c b/plugins/pager/pager.c
index 6f0a378..28195a4 100644
--- a/plugins/pager/pager.c
+++ b/plugins/pager/pager.c
@@ -33,7 +33,6 @@
 #include <common/panel-utils.h>
 #include <common/panel-private.h>
 #include <libwnck/libwnck.h>
-#include <exo/exo.h>
 
 #include "pager.h"
 #include "pager-buttons.h"
@@ -130,21 +129,21 @@ pager_plugin_class_init (PagerPluginClass *klass)
                                    g_param_spec_boolean ("workspace-scrolling",
                                                          NULL, NULL,
                                                          TRUE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_MINIATURE_VIEW,
                                    g_param_spec_boolean ("miniature-view",
                                                          NULL, NULL,
                                                          TRUE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_ROWS,
                                    g_param_spec_uint ("rows",
                                                       NULL, NULL,
                                                       1, 50, 1,
-                                                      EXO_PARAM_READWRITE));
+                                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 }
 
 
@@ -542,18 +541,21 @@ pager_plugin_configure_plugin (XfcePanelPlugin *panel_plugin)
 
   object = gtk_builder_get_object (builder, "workspace-scrolling");
   panel_return_if_fail (GTK_IS_TOGGLE_BUTTON (object));
-  exo_mutual_binding_new (G_OBJECT (plugin), "workspace-scrolling",
-                          G_OBJECT (object), "active");
+  g_object_bind_property (G_OBJECT (plugin), "workspace-scrolling",
+                          G_OBJECT (object), "active",
+                          G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
 
   object = gtk_builder_get_object (builder, "miniature-view");
   panel_return_if_fail (GTK_IS_TOGGLE_BUTTON (object));
-  exo_mutual_binding_new (G_OBJECT (plugin), "miniature-view",
-                          G_OBJECT (object), "active");
+  g_object_bind_property (G_OBJECT (plugin), "miniature-view",
+                          G_OBJECT (object), "active",
+                          G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
 
   object = gtk_builder_get_object (builder, "rows");
   panel_return_if_fail (GTK_IS_ADJUSTMENT (object));
-  exo_mutual_binding_new (G_OBJECT (plugin), "rows",
-                          G_OBJECT (object), "value");
+  g_object_bind_property (G_OBJECT (plugin), "rows",
+                          G_OBJECT (object), "value",
+                          G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
 
   /* update the rows limit */
   pager_plugin_configure_n_workspaces_changed (plugin->wnck_screen, NULL, builder);
diff --git a/plugins/separator/Makefile.am b/plugins/separator/Makefile.am
index 77b6449..ced05f9 100644
--- a/plugins/separator/Makefile.am
+++ b/plugins/separator/Makefile.am
@@ -23,7 +23,6 @@ libseparator_la_CFLAGS = \
 	$(LIBXFCE4UTIL_CFLAGS) \
 	$(CAIRO_CFLAGS) \
 	$(LIBXFCE4UI_CFLAGS) \
-	$(EXO_CFLAGS) \
 	$(PLATFORM_CFLAGS)
 
 libseparator_la_LDFLAGS = \
@@ -40,7 +39,6 @@ libseparator_la_LIBADD = \
 	$(CAIRO_LIBS) \
 	$(LIBXFCE4UTIL_LIBS) \
 	$(LIBXFCE4UI_LIBS) \
-	$(EXO_LIBS) \
 	$(XFCONF_LIBS)
 
 libseparator_la_DEPENDENCIES = \
@@ -70,7 +68,7 @@ DISTCLEANFILES += \
 	$(libseparator_built_sources)
 
 separator-dialog_ui.h: separator-dialog.glade
-	$(AM_V_GEN) exo-csource --static --strip-comments --strip-content --name=separator_dialog_ui $< >$@
+	$(AM_V_GEN) xdt-csource --static --strip-comments --strip-content --name=separator_dialog_ui $< >$@
 endif
 
 # vi:set ts=8 sw=8 noet ai nocindent syntax=automake:
diff --git a/plugins/separator/separator.c b/plugins/separator/separator.c
index 8543ee7..cf809ab 100644
--- a/plugins/separator/separator.c
+++ b/plugins/separator/separator.c
@@ -29,7 +29,6 @@
 #include <common/panel-private.h>
 #include <common/panel-xfconf.h>
 #include <common/panel-utils.h>
-#include <exo/exo.h>
 
 #include "separator.h"
 #include "separator-dialog_ui.h"
@@ -139,14 +138,14 @@ separator_plugin_class_init (SeparatorPluginClass *klass)
                                                       SEPARATOR_PLUGIN_STYLE_MIN,
                                                       SEPARATOR_PLUGIN_STYLE_MAX,
                                                       SEPARATOR_PLUGIN_STYLE_DEFAULT,
-                                                      EXO_PARAM_READWRITE));
+                                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_EXPAND,
                                    g_param_spec_boolean ("expand",
                                                          NULL, NULL,
                                                          FALSE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 }
 
 
@@ -396,12 +395,14 @@ separator_plugin_configure_plugin (XfcePanelPlugin *panel_plugin)
     return;
 
   style = gtk_builder_get_object (builder, "style");
-  exo_mutual_binding_new (G_OBJECT (plugin), "style",
-                          G_OBJECT (style), "active");
+  g_object_bind_property (G_OBJECT (plugin), "style",
+                          G_OBJECT (style), "active",
+                          G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
 
   expand = gtk_builder_get_object (builder, "expand");
-  exo_mutual_binding_new (G_OBJECT (plugin), "expand",
-                          G_OBJECT (expand), "active");
+  g_object_bind_property (G_OBJECT (plugin), "expand",
+                          G_OBJECT (expand), "active",
+                          G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
 
   gtk_widget_show (GTK_WIDGET (dialog));
 }
diff --git a/plugins/systray/Makefile.am b/plugins/systray/Makefile.am
index 8c8c948..58fb864 100644
--- a/plugins/systray/Makefile.am
+++ b/plugins/systray/Makefile.am
@@ -28,7 +28,6 @@ libsystray_la_SOURCES = \
 libsystray_la_CFLAGS = \
 	$(LIBX11_CFLAGS) \
 	$(GTK_CFLAGS) \
-	$(EXO_CFLAGS) \
 	$(XFCONF_CFLAGS) \
 	$(LIBXFCE4UTIL_CFLAGS) \
 	$(LIBXFCE4UI_CFLAGS) \
@@ -46,7 +45,6 @@ libsystray_la_LIBADD = \
 	$(top_builddir)/common/libpanel-common.la \
 	$(LIBX11_LIBS) \
 	$(GTK_LIBS) \
-	$(EXO_LIBS) \
 	$(LIBXFCE4UTIL_LIBS) \
 	$(LIBXFCE4UI_LIBS) \
 	$(XFCONF_LIBS)
@@ -89,7 +87,7 @@ systray-marshal.c: systray-marshal.list Makefile
 	&& glib-genmarshal --prefix=_systray_marshal --body $< >> $@
 
 systray-dialog_ui.h: systray-dialog.glade
-	$(AM_V_GEN) exo-csource --static --strip-comments --strip-content --name=systray_dialog_ui $< >$@
+	$(AM_V_GEN) xdt-csource --static --strip-comments --strip-content --name=systray_dialog_ui $< >$@
 endif
 
 # vi:set ts=8 sw=8 noet ai nocindent syntax=automake:
diff --git a/plugins/systray/systray-box.c b/plugins/systray/systray-box.c
index 06f0b46..991becb 100644
--- a/plugins/systray/systray-box.c
+++ b/plugins/systray/systray-box.c
@@ -27,7 +27,6 @@
 #include <math.h>
 #endif
 
-#include <exo/exo.h>
 #include <gtk/gtk.h>
 #include <libxfce4panel/libxfce4panel.h>
 #include <common/panel-private.h>
@@ -134,7 +133,7 @@ systray_box_class_init (SystrayBoxClass *klass)
                                    g_param_spec_boolean ("has-hidden",
                                                          NULL, NULL,
                                                          FALSE,
-                                                         EXO_PARAM_READABLE));
+                                                         G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
 }
 
 
diff --git a/plugins/systray/systray.c b/plugins/systray/systray.c
index 154bc03..6d21ae9 100644
--- a/plugins/systray/systray.c
+++ b/plugins/systray/systray.c
@@ -27,7 +27,6 @@
 #include <common/panel-xfconf.h>
 #include <common/panel-utils.h>
 #include <common/panel-debug.h>
-#include <exo/exo.h>
 
 #include "systray.h"
 #include "systray-box.h"
@@ -182,28 +181,28 @@ systray_plugin_class_init (SystrayPluginClass *klass)
                                                       SIZE_MAX_MIN,
                                                       SIZE_MAX_MAX,
                                                       SIZE_MAX_DEFAULT,
-                                                      EXO_PARAM_READWRITE));
+                                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_SHOW_FRAME,
                                    g_param_spec_boolean ("show-frame",
                                                          NULL, NULL,
                                                          TRUE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_NAMES_HIDDEN,
                                    g_param_spec_boxed ("names-hidden",
                                                        NULL, NULL,
                                                        PANEL_PROPERTIES_TYPE_VALUE_ARRAY,
-                                                       EXO_PARAM_READWRITE));
+                                                       G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_NAMES_VISIBLE,
                                    g_param_spec_boxed ("names-visible",
                                                        NULL, NULL,
                                                        PANEL_PROPERTIES_TYPE_VALUE_ARRAY,
-                                                       EXO_PARAM_READWRITE));
+                                                       G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 }
 
 
@@ -244,7 +243,9 @@ systray_plugin_init (SystrayPlugin *plugin)
   g_signal_connect (G_OBJECT (plugin->button), "toggled",
       G_CALLBACK (systray_plugin_button_toggled), plugin);
   gtk_button_set_relief (GTK_BUTTON (plugin->button), GTK_RELIEF_NONE);
-  exo_binding_new (G_OBJECT (plugin->box), "has-hidden", G_OBJECT (plugin->button), "visible");
+  g_object_bind_property (G_OBJECT (plugin->box), "has-hidden",
+                          G_OBJECT (plugin->button), "visible",
+                          G_BINDING_SYNC_CREATE);
   xfce_panel_plugin_add_action_widget (XFCE_PANEL_PLUGIN (plugin), plugin->button);
 }
 
@@ -562,13 +563,15 @@ systray_plugin_configure_plugin (XfcePanelPlugin *panel_plugin)
 
   object = gtk_builder_get_object (builder, "size-max");
   panel_return_if_fail (GTK_IS_WIDGET (object));
-  exo_mutual_binding_new (G_OBJECT (plugin), "size-max",
-                          G_OBJECT (object), "value");
+  g_object_bind_property (G_OBJECT (plugin), "size-max",
+                          G_OBJECT (object), "value",
+                          G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
 
   object = gtk_builder_get_object (builder, "show-frame");
   panel_return_if_fail (GTK_IS_WIDGET (object));
-  exo_mutual_binding_new (G_OBJECT (plugin), "show-frame",
-                          G_OBJECT (object), "active");
+  g_object_bind_property (G_OBJECT (plugin), "show-frame",
+                          G_OBJECT (object), "active",
+                          G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
 
   store = gtk_builder_get_object (builder, "applications-store");
   panel_return_if_fail (GTK_IS_LIST_STORE (store));
@@ -760,7 +763,7 @@ systray_plugin_names_set_hidden (SystrayPlugin *plugin,
                                  gboolean       hidden)
 {
   panel_return_if_fail (XFCE_IS_SYSTRAY_PLUGIN (plugin));
-  panel_return_if_fail (!exo_str_is_empty (name));
+  panel_return_if_fail (!panel_str_is_empty (name));
 
   g_hash_table_replace (plugin->names, g_strdup (name),
                         GUINT_TO_POINTER (hidden ? 1 : 0));
@@ -779,7 +782,7 @@ systray_plugin_names_get_hidden (SystrayPlugin *plugin,
 {
   gpointer p;
 
-  if (exo_str_is_empty (name))
+  if (panel_str_is_empty (name))
     return FALSE;
 
   /* lookup the name in the table */
@@ -880,7 +883,7 @@ systray_plugin_dialog_camel_case (const gchar *text)
   gunichar     c;
   GString     *result;
 
-  panel_return_val_if_fail (!exo_str_is_empty (text), NULL);
+  panel_return_val_if_fail (!panel_str_is_empty (text), NULL);
 
   /* allocate a new string for the result */
   result = g_string_sized_new (32);
@@ -932,7 +935,7 @@ systray_plugin_dialog_add_application_names (gpointer key,
   panel_return_if_fail (name == NULL || g_utf8_validate (name, -1, NULL));
 
   /* skip invalid names */
-  if (exo_str_is_empty (name))
+  if (panel_str_is_empty (name))
      return;
 
   /* check if we have a better name for the application */
diff --git a/plugins/tasklist/Makefile.am b/plugins/tasklist/Makefile.am
index 4f386f3..0d1234e 100644
--- a/plugins/tasklist/Makefile.am
+++ b/plugins/tasklist/Makefile.am
@@ -21,7 +21,6 @@ libtasklist_la_SOURCES = \
 
 libtasklist_la_CFLAGS = \
 	$(GTK_CFLAGS) \
-	$(EXO_CFLAGS) \
 	$(XFCONF_CFLAGS) \
 	$(LIBXFCE4UTIL_CFLAGS) \
 	$(LIBXFCE4UI_CFLAGS) \
@@ -39,7 +38,6 @@ libtasklist_la_LDFLAGS = \
 libtasklist_la_LIBADD = \
 	$(top_builddir)/libxfce4panel/libxfce4panel-$(LIBXFCE4PANEL_VERSION_API).la \
 	$(top_builddir)/common/libpanel-common.la \
-	$(EXO_LIBS) \
 	$(GTK_LIBS) \
 	$(LIBXFCE4UTIL_LIBS) \
 	$(LIBXFCE4UI_LIBS) \
@@ -74,7 +72,7 @@ DISTCLEANFILES += \
 	$(libtasklist_built_sources)
 
 tasklist-dialog_ui.h: tasklist-dialog.glade
-	$(AM_V_GEN) exo-csource --static --strip-comments --strip-content --name=tasklist_dialog_ui $< >$@
+	$(AM_V_GEN) xdt-csource --static --strip-comments --strip-content --name=tasklist_dialog_ui $< >$@
 endif
 
 # vi:set ts=8 sw=8 noet ai nocindent syntax=automake:
diff --git a/plugins/tasklist/tasklist-widget.c b/plugins/tasklist/tasklist-widget.c
index 5978dbd..767517f 100644
--- a/plugins/tasklist/tasklist-widget.c
+++ b/plugins/tasklist/tasklist-widget.c
@@ -28,7 +28,7 @@
 #endif
 
 #include <gtk/gtk.h>
-#include <exo/exo.h>
+#include <libxfce4ui/libxfce4ui.h>
 #include <libwnck/libwnck.h>
 #include <libxfce4panel/libxfce4panel.h>
 #include <common/panel-private.h>
@@ -391,63 +391,63 @@ xfce_tasklist_class_init (XfceTasklistClass *klass)
                                                       XFCE_TASKLIST_GROUPING_MIN,
                                                       XFCE_TASKLIST_GROUPING_MAX + 1 /* TODO drop this later */,
                                                       XFCE_TASKLIST_GROUPING_DEFAULT,
-                                                      EXO_PARAM_READWRITE));
+                                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_INCLUDE_ALL_WORKSPACES,
                                    g_param_spec_boolean ("include-all-workspaces",
                                                          NULL, NULL,
                                                          FALSE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_INCLUDE_ALL_MONITORS,
                                    g_param_spec_boolean ("include-all-monitors",
                                                          NULL, NULL,
                                                          TRUE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_FLAT_BUTTONS,
                                    g_param_spec_boolean ("flat-buttons",
                                                          NULL, NULL,
                                                          FALSE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_SWITCH_WORKSPACE_ON_UNMINIMIZE,
                                    g_param_spec_boolean ("switch-workspace-on-unminimize",
                                                          NULL, NULL,
                                                          TRUE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_SHOW_LABELS,
                                    g_param_spec_boolean ("show-labels",
                                                          NULL, NULL,
                                                          TRUE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_SHOW_ONLY_MINIMIZED,
                                    g_param_spec_boolean ("show-only-minimized",
                                                          NULL, NULL,
                                                          FALSE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_SHOW_WIREFRAMES,
                                    g_param_spec_boolean ("show-wireframes",
                                                          NULL, NULL,
                                                          FALSE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_SHOW_HANDLE,
                                    g_param_spec_boolean ("show-handle",
                                                          NULL, NULL,
                                                          TRUE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_SORT_ORDER,
@@ -456,21 +456,21 @@ xfce_tasklist_class_init (XfceTasklistClass *klass)
                                                       XFCE_TASKLIST_SORT_ORDER_MIN,
                                                       XFCE_TASKLIST_SORT_ORDER_MAX,
                                                       XFCE_TASKLIST_SORT_ORDER_DEFAULT,
-                                                      EXO_PARAM_READWRITE));
+                                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_WINDOW_SCROLLING,
                                    g_param_spec_boolean ("window-scrolling",
                                                          NULL, NULL,
                                                          TRUE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_INCLUDE_ALL_BLINKING,
                                    g_param_spec_boolean ("include-all-blinking",
                                                          NULL, NULL,
                                                          TRUE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   gtk_widget_class_install_style_property (gtkwidget_class,
                                            g_param_spec_int ("max-button-length",
@@ -478,7 +478,7 @@ xfce_tasklist_class_init (XfceTasklistClass *klass)
                                                              "The maximum length of a window button",
                                                              -1, G_MAXINT,
                                                              DEFAULT_MAX_BUTTON_LENGTH,
-                                                             EXO_PARAM_READABLE));
+                                                             G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
 
   gtk_widget_class_install_style_property (gtkwidget_class,
                                            g_param_spec_int ("min-button-length",
@@ -486,7 +486,7 @@ xfce_tasklist_class_init (XfceTasklistClass *klass)
                                                              "The minumum length of a window button",
                                                              1, G_MAXINT,
                                                              DEFAULT_MIN_BUTTON_LENGTH,
-                                                             EXO_PARAM_READABLE));
+                                                             G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
 
   gtk_widget_class_install_style_property (gtkwidget_class,
                                            g_param_spec_int ("max-button-size",
@@ -494,7 +494,7 @@ xfce_tasklist_class_init (XfceTasklistClass *klass)
                                                              "The maximum size of a window button",
                                                              1, G_MAXINT,
                                                              DEFAULT_BUTTON_SIZE,
-                                                             EXO_PARAM_READABLE));
+                                                             G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
 
   gtk_widget_class_install_style_property (gtkwidget_class,
                                            g_param_spec_enum ("ellipsize-mode",
@@ -502,7 +502,7 @@ xfce_tasklist_class_init (XfceTasklistClass *klass)
                                                               "The ellipsize mode used for the button label",
                                                               PANGO_TYPE_ELLIPSIZE_MODE,
                                                               DEFAULT_ELLIPSIZE_MODE,
-                                                              EXO_PARAM_READABLE));
+                                                              G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
 
   gtk_widget_class_install_style_property (gtkwidget_class,
                                            g_param_spec_int ("minimized-icon-lucency",
@@ -510,14 +510,14 @@ xfce_tasklist_class_init (XfceTasklistClass *klass)
                                                              "Lucent percentage of minimized icons",
                                                              0, 100,
                                                              DEFAULT_ICON_LUCENCY,
-                                                             EXO_PARAM_READABLE));
+                                                             G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
   gtk_widget_class_install_style_property (gtkwidget_class,
                                            g_param_spec_int ("menu-max-width-chars",
                                                              NULL,
                                                              "Maximum chars in the overflow menu labels",
                                                              0, G_MAXINT,
                                                              DEFAULT_MENU_MAX_WIDTH_CHARS,
-                                                             EXO_PARAM_READABLE));
+                                                             G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
 
   menu_icon_size = gtk_icon_size_from_name ("panel-tasklist-menu");
   if (menu_icon_size == GTK_ICON_SIZE_INVALID)
@@ -2321,10 +2321,10 @@ xfce_tasklist_button_compare (gconstpointer child_a,
             name_b = wnck_class_group_get_name (class_group_b);
 
           /* if there is no class group name, use the window name */
-          if (exo_str_is_empty (name_a)
+          if (panel_str_is_empty (name_a)
               && a->window != NULL)
             name_a = wnck_window_get_name (a->window);
-          if (exo_str_is_empty (name_b)
+          if (panel_str_is_empty (name_b)
               && b->window != NULL)
             name_b = wnck_window_get_name (b->window) ;
 
@@ -2412,9 +2412,11 @@ xfce_tasklist_button_icon_changed (WnckWindow        *window,
       && tasklist->minimized_icon_lucency < 100
       && wnck_window_is_minimized (window))
     {
+#ifdef EXO_CHECK_VERSION
       lucent = exo_gdk_pixbuf_lucent (pixbuf, tasklist->minimized_icon_lucency);
       if (G_UNLIKELY (lucent != NULL))
         pixbuf = lucent;
+#endif
     }
 
   xfce_panel_image_set_from_pixbuf (XFCE_PANEL_IMAGE (child->icon), pixbuf);
@@ -2756,8 +2758,12 @@ xfce_tasklist_button_proxy_menu_item (XfceTasklistChild *child,
   panel_return_val_if_fail (WNCK_IS_WINDOW (child->window), NULL);
 
   mi = gtk_image_menu_item_new ();
-  exo_binding_new (G_OBJECT (child->label), "label", G_OBJECT (mi), "label");
-  exo_binding_new (G_OBJECT (child->label), "label", G_OBJECT (mi), "tooltip-text");
+  g_object_bind_property (G_OBJECT (child->label), "label",
+                          G_OBJECT (mi), "label",
+                          G_BINDING_SYNC_CREATE);
+  g_object_bind_property (G_OBJECT (child->label), "label",
+                          G_OBJECT (mi), "tooltip-text",
+                          G_BINDING_SYNC_CREATE);
 
   label = gtk_bin_get_child (GTK_BIN (mi));
   panel_return_val_if_fail (GTK_IS_LABEL (label), NULL);
@@ -2769,7 +2775,9 @@ xfce_tasklist_button_proxy_menu_item (XfceTasklistChild *child,
       image = xfce_panel_image_new ();
       gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mi), image);
       xfce_panel_image_set_size (XFCE_PANEL_IMAGE (image), tasklist->menu_icon_size);
-      exo_binding_new (G_OBJECT (child->icon), "pixbuf", G_OBJECT (image), "pixbuf");
+      g_object_bind_property (G_OBJECT (child->icon), "pixbuf",
+                              G_OBJECT (image), "pixbuf",
+                              G_BINDING_SYNC_CREATE);
       gtk_widget_show (image);
     }
 
@@ -3384,7 +3392,7 @@ xfce_tasklist_group_button_name_changed (WnckClassGroup    *class_group,
 
   /* create the button label */
   name = wnck_class_group_get_name (group_child->class_group);
-  if (!exo_str_is_empty (name))
+  if (!panel_str_is_empty (name))
     label = g_strdup_printf ("%s (%d)", name, n_windows);
   else
     label = g_strdup_printf ("(%d)", n_windows);
diff --git a/plugins/tasklist/tasklist.c b/plugins/tasklist/tasklist.c
index 71881c5..a00d985 100644
--- a/plugins/tasklist/tasklist.c
+++ b/plugins/tasklist/tasklist.c
@@ -20,7 +20,6 @@
 #include <config.h>
 #endif
 
-#include <exo/exo.h>
 #include <libxfce4ui/libxfce4ui.h>
 #include <common/panel-xfconf.h>
 #include <common/panel-utils.h>
@@ -104,7 +103,9 @@ tasklist_plugin_init (TasklistPlugin *plugin)
   /* create widgets */
   box = xfce_hvbox_new (GTK_ORIENTATION_HORIZONTAL, FALSE, 0);
   gtk_container_add (GTK_CONTAINER (plugin), box);
-  exo_binding_new (G_OBJECT (plugin), "orientation", G_OBJECT (box), "orientation");
+  g_object_bind_property (G_OBJECT (plugin), "orientation",
+                          G_OBJECT (box), "orientation",
+                          G_BINDING_SYNC_CREATE);
   gtk_widget_show (box);
 
   plugin->handle = gtk_alignment_new (0.00, 0.00, 0.00, 0.00);
@@ -117,8 +118,9 @@ tasklist_plugin_init (TasklistPlugin *plugin)
   plugin->tasklist = g_object_new (XFCE_TYPE_TASKLIST, NULL);
   gtk_box_pack_start (GTK_BOX (box), plugin->tasklist, TRUE, TRUE, 0);
 
-  exo_binding_new (G_OBJECT (plugin->tasklist), "show-handle",
-                   G_OBJECT (plugin->handle), "visible");
+  g_object_bind_property (G_OBJECT (plugin->tasklist), "show-handle",
+                          G_OBJECT (plugin->handle), "visible",
+                          G_BINDING_SYNC_CREATE);
 }
 
 
@@ -232,15 +234,19 @@ tasklist_plugin_configure_plugin (XfcePanelPlugin *panel_plugin)
 #define TASKLIST_DIALOG_BIND(name, property) \
   object = gtk_builder_get_object (builder, (name)); \
   panel_return_if_fail (G_IS_OBJECT (object)); \
-  exo_mutual_binding_new (G_OBJECT (plugin->tasklist), (name), \
-                          G_OBJECT (object), (property));
+  g_object_bind_property (G_OBJECT (plugin->tasklist), (name), \
+                          G_OBJECT (object), (property), \
+                          G_BINDING_SYNC_CREATE);
 
 #define TASKLIST_DIALOG_BIND_INV(name, property) \
   object = gtk_builder_get_object (builder, (name)); \
   panel_return_if_fail (G_IS_OBJECT (object)); \
-  exo_mutual_binding_new_with_negation (G_OBJECT (plugin->tasklist), \
-                                        name,  G_OBJECT (object), \
-                                        property);
+  g_object_bind_property (G_OBJECT (plugin->tasklist), \
+                          name,  G_OBJECT (object), \
+                          property, \
+                          G_BINDING_BIDIRECTIONAL \
+                          | G_BINDING_SYNC_CREATE \
+                          | G_BINDING_INVERT_BOOLEAN);
 
   TASKLIST_DIALOG_BIND ("show-labels", "active")
   TASKLIST_DIALOG_BIND ("grouping", "active")
diff --git a/plugins/windowmenu/Makefile.am b/plugins/windowmenu/Makefile.am
index a183683..77a87b8 100644
--- a/plugins/windowmenu/Makefile.am
+++ b/plugins/windowmenu/Makefile.am
@@ -20,7 +20,6 @@ libwindowmenu_la_SOURCES = \
 
 libwindowmenu_la_CFLAGS = \
 	$(GTK_CFLAGS) \
-	$(EXO_CFLAGS) \
 	$(XFCONF_CFLAGS) \
 	$(LIBXFCE4UTIL_CFLAGS) \
 	$(LIBXFCE4UI_CFLAGS) \
@@ -37,7 +36,6 @@ libwindowmenu_la_LDFLAGS = \
 libwindowmenu_la_LIBADD = \
 	$(top_builddir)/libxfce4panel/libxfce4panel-$(LIBXFCE4PANEL_VERSION_API).la \
 	$(top_builddir)/common/libpanel-common.la \
-	$(EXO_LIBS) \
 	$(GTK_LIBS) \
 	$(LIBXFCE4UTIL_LIBS) \
 	$(LIBXFCE4UI_LIBS) \
@@ -83,7 +81,7 @@ DISTCLEANFILES += \
 	$(libwindowmenu_built_sources)
 
 windowmenu-dialog_ui.h: windowmenu-dialog.glade
-	$(AM_V_GEN) exo-csource --static --strip-comments --strip-content --name=windowmenu_dialog_ui $< >$@
+	$(AM_V_GEN) xdt-csource --static --strip-comments --strip-content --name=windowmenu_dialog_ui $< >$@
 endif
 
 # vi:set ts=8 sw=8 noet ai nocindent syntax=automake:
diff --git a/plugins/windowmenu/windowmenu.c b/plugins/windowmenu/windowmenu.c
index c96123a..4c69fa6 100644
--- a/plugins/windowmenu/windowmenu.c
+++ b/plugins/windowmenu/windowmenu.c
@@ -20,7 +20,6 @@
 #include <config.h>
 #endif
 
-#include <exo/exo.h>
 #include <libxfce4ui/libxfce4ui.h>
 #include <libxfce4panel/libxfce4panel.h>
 #include <libwnck/libwnck.h>
@@ -171,35 +170,35 @@ window_menu_plugin_class_init (WindowMenuPluginClass *klass)
                                                       BUTTON_STYLE_ICON,
                                                       BUTTON_STYLE_ARROW,
                                                       BUTTON_STYLE_ICON,
-                                                      EXO_PARAM_READWRITE));
+                                                      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_WORKSPACE_ACTIONS,
                                    g_param_spec_boolean ("workspace-actions",
                                                          NULL, NULL,
                                                          FALSE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_WORKSPACE_NAMES,
                                    g_param_spec_boolean ("workspace-names",
                                                          NULL, NULL,
                                                          TRUE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_URGENTCY_NOTIFICATION,
                                    g_param_spec_boolean ("urgentcy-notification",
                                                          NULL, NULL,
                                                          TRUE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
                                    PROP_ALL_WORKSPACES,
                                    g_param_spec_boolean ("all-workspaces",
                                                          NULL, NULL,
                                                          TRUE,
-                                                         EXO_PARAM_READWRITE));
+                                                         G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   gtk_widget_class_install_style_property (gtkwidget_class,
                                            g_param_spec_int ("minimized-icon-lucency",
@@ -207,7 +206,7 @@ window_menu_plugin_class_init (WindowMenuPluginClass *klass)
                                                              "Lucent percentage of minimized icons",
                                                              0, 100,
                                                              DEFAULT_ICON_LUCENCY,
-                                                             EXO_PARAM_READABLE));
+                                                             G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
 
   gtk_widget_class_install_style_property (gtkwidget_class,
                                            g_param_spec_enum ("ellipsize-mode",
@@ -215,7 +214,7 @@ window_menu_plugin_class_init (WindowMenuPluginClass *klass)
                                                               "The ellipsize mode used for the menu label",
                                                               PANGO_TYPE_ELLIPSIZE_MODE,
                                                               DEFAULT_ELLIPSIZE_MODE,
-                                                              EXO_PARAM_READABLE));
+                                                              G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
 
   gtk_widget_class_install_style_property (gtkwidget_class,
                                            g_param_spec_int ("max-width-chars",
@@ -223,7 +222,7 @@ window_menu_plugin_class_init (WindowMenuPluginClass *klass)
                                                              "Maximum length of window/workspace name",
                                                              1, G_MAXINT,
                                                              DEFAULT_MAX_WIDTH_CHARS,
-                                                             EXO_PARAM_READABLE));
+                                                             G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
 
   window_quark = g_quark_from_static_string ("window-list-window-quark");
 
@@ -565,8 +564,9 @@ window_menu_plugin_configure_plugin (XfcePanelPlugin *panel_plugin)
     {
       object = gtk_builder_get_object (builder, names[i]);
       panel_return_if_fail (GTK_IS_WIDGET (object));
-      exo_mutual_binding_new (G_OBJECT (plugin), names[i],
-                              G_OBJECT (object), "active");
+      g_object_bind_property (G_OBJECT (plugin), names[i],
+                              G_OBJECT (object), "active",
+                              G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);
     }
 
   gtk_widget_show (GTK_WIDGET (dialog));
@@ -849,11 +849,11 @@ window_menu_plugin_menu_workspace_item_new (WnckWorkspace        *workspace,
 
   /* try to get an utf-8 valid name */
   name = wnck_workspace_get_name (workspace);
-  if (!exo_str_is_empty (name)
+  if (!panel_str_is_empty (name)
       && !g_utf8_validate (name, -1, NULL))
     name = utf8 = g_locale_to_utf8 (name, -1, NULL, NULL, NULL);
 
-  if (exo_str_is_empty (name))
+  if (panel_str_is_empty (name))
     name = name_num = g_strdup_printf (_("Workspace %d"),
         wnck_workspace_get_number (workspace) + 1);
 
@@ -959,10 +959,10 @@ window_menu_plugin_menu_window_item_new (WnckWindow           *window,
 
   /* try to get an utf-8 valid name */
   name = wnck_window_get_name (window);
-  if (!exo_str_is_empty (name) && !g_utf8_validate (name, -1, NULL))
+  if (!panel_str_is_empty (name) && !g_utf8_validate (name, -1, NULL))
     name = utf8 = g_locale_to_utf8 (name, -1, NULL, NULL, NULL);
 
-  if (exo_str_is_empty (name))
+  if (panel_str_is_empty (name))
     name = "?";
 
   /* store the tooltip text */
@@ -1020,9 +1020,11 @@ window_menu_plugin_menu_window_item_new (WnckWindow           *window,
           if (wnck_window_is_minimized (window)
               && plugin->minimized_icon_lucency < 100)
             {
+#ifdef EXO_CHECK_VERSION
               lucent = exo_gdk_pixbuf_lucent (pixbuf, plugin->minimized_icon_lucency);
               if (G_LIKELY (lucent != NULL))
                 pixbuf = lucent;
+#endif
             }
 
           /* set the menu item label */
@@ -1053,7 +1055,7 @@ window_menu_plugin_menu_selection_done (GtkWidget *menu,
     gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), FALSE);
 
   /* delay destruction so we can handle the activate event first */
-  exo_gtk_object_destroy_later (GTK_OBJECT (menu));
+  panel_utils_destroy_later (GTK_WIDGET (menu));
 }
 
 
@@ -1314,12 +1316,12 @@ window_menu_plugin_menu_new (WindowMenuPlugin *plugin)
         {
           /* try to get an utf-8 valid name */
           name = wnck_workspace_get_name (workspace);
-          if (!exo_str_is_empty (name) && !g_utf8_validate (name, -1, NULL))
+          if (!panel_str_is_empty (name) && !g_utf8_validate (name, -1, NULL))
             name = utf8 = g_locale_to_utf8 (name, -1, NULL, NULL, NULL);
         }
 
       /* create label */
-      if (!exo_str_is_empty (name))
+      if (!panel_str_is_empty (name))
         label = g_strdup_printf (_("Remove Workspace \"%s\""), name);
       else
         label = g_strdup_printf (_("Remove Workspace %d"), n_workspaces);


More information about the Xfce4-commits mailing list