diff --git a/ChangeLog b/ChangeLog
index 866241b8b153568cb9d8ca7f4361c17c65f20620..fb307edf080ef6f90b7570d496e7bafe9de8dd6d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,13 @@
 2009-07-07 jeromeg
 
+Use libsoup instead of XMLRPC-C.
+
+Add libsoup as a dependency, remove the XMLRPC-C stuff. Factorize the
+xmlrpc calls in lib/screenshooter-zimagez.c and add some additional
+error checking.
+
+2009-07-07 jeromeg
+
 Use integers instead of strings to identify the information fields.
 
 2009-07-05 jeromeg
diff --git a/configure.ac.in b/configure.ac.in
index f9519c0a28a32f1454d3f758970a9034b5dfae08..c6e2d349cefa7e1c913c497555954bd1c5233b34 100644
--- a/configure.ac.in
+++ b/configure.ac.in
@@ -56,34 +56,7 @@ XDT_CHECK_PACKAGE([LIBXFCEGUI4], [libxfcegui4-1.0], [4.4.0])
 XDT_CHECK_PACKAGE([GTHREAD], [gthread-2.0], [2.16.0])
 XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [2.12.0])
 XDT_CHECK_PACKAGE([GLIB], [glib-2.0], [2.16.0])
-
-dnl ************************************
-dnl *** Check for optional packages ***
-dnl ************************************
-
-XDT_CHECK_OPTIONAL_PACKAGE([CURL], [libcurl], [7])
-
-dnl **************************
-dnl *** Check for xmlrpc-c ***
-dnl **************************
-
-XMLRPC_LIBS=""
-XMLRPC_CFLAGS=""
-AC_PATH_PROG([XMLRPC_CONFIG], [xmlrpc-c-config], [no])
-if test x"$XMLRPC_CONFIG" != x"no"; then
-  AC_MSG_CHECKING([XMLRPC_CFLAGS])
-  XMLRPC_CFLAGS="`$XMLRPC_CONFIG --cflags client`"
-  AC_MSG_RESULT([$XMLRPC_CFLAGS])
-
-  AC_MSG_CHECKING([XMLRPC_LIBS])
-  XMLRPC_LIBS="`$XMLRPC_CONFIG --libs client`"
-  AC_MSG_RESULT([$XMLRPC_LIBS])
-
-  AC_DEFINE([HAVE_XMLRPC], [1], [Xmlrpc-c was found on the system])
-fi
-AM_CONDITIONAL([HAVE_XMLRPC], [test x"$XMLRPC_CONFIG" != x"no"])
-AC_SUBST([XMLRPC_CFLAGS])
-AC_SUBST([XMLRPC_LIBS])
+XDT_CHECK_PACKAGE([SOUP], [libsoup-2.4], [2.26.0])
 
 dnl **************************
 dnl *** Check for xsltproc ***
@@ -164,15 +137,6 @@ echo "Build Configuration:"
 echo ""
 
 echo "  * Debugging support:             $enable_debug"
-if test x"$CURL_FOUND" = x"yes"; then
-  if test x"$XMLRPC_CONFIG" != x"no"; then
-    echo "  * ZimageZ support:               yes"
-  else
-    echo "  * ZimageZ support:               no"
-  fi
-else
-  echo "  * ZimageZ support:               no"
-fi
 
 echo ""
 echo "Maintainer Configuration:"
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 4bf7a4e5ecd0ee59a37be39d8b7f54ba4d090fd2..a058df112ea84c6c0b8f4fe73981c0af5b3f8607 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -3,12 +3,19 @@ noinst_LTLIBRARIES = \
 
 libscreenshooter_la_SOURCES =	\
 	$(libscreenshooter_built_sources) \
+  exo-job.c exo-job.h \
+	exo-simple-job.c exo-simple-job.h \
+	katze-throbber.c katze-throbber.h \
 	libscreenshooter.h \
+  sexy-url-label.c sexy-url-label.h \
 	screenshooter-actions.c screenshooter-actions.h \
 	screenshooter-capture.c screenshooter-capture.h \
   screenshooter-dialogs.c screenshooter-dialogs.h \
 	screenshooter-global.h \
-	screenshooter-utils.c screenshooter-utils.h 
+	screenshooter-job.c screenshooter-job.h \
+	screenshooter-simple-job.c screenshooter-simple-job.h \
+	screenshooter-utils.c screenshooter-utils.h \ 
+	screenshooter-zimagez.c screenshooter-zimagez.h
 
 libscreenshooter_la_CFLAGS = \
 	-I$(top_srcdir)	\
@@ -16,36 +23,19 @@ libscreenshooter_la_CFLAGS = \
 	@GLIB_CFLAGS@ \
 	@LIBXFCE4UTIL_CFLAGS@ \
 	@LIBXFCEGUI4_CFLAGS@ \
+	@SOUP_CFLAGS@ \
   -DPACKAGE_LOCALE_DIR=\"$(localedir)\"
 	
 libscreenshooter_la_LIBADD = \
   @GTK_LIBS@ \
 	@LIBXFCE4UTIL_LIBS@ \
 	@LIBXFCEGUI4_LIBS@ \
-  @GLIB_LIBS@
-
-if HAVE_XMLRPC
-if HAVE_CURL
+  @GLIB_LIBS@ \
+	@SOUP_LIBS@
 
 libscreenshooter_built_sources = \
 	screenshooter-marshal.c screenshooter-marshal.h
 
-libscreenshooter_la_SOURCES +=	\
-	$(libscreenshooter_built_sources) \
-  exo-job.c exo-job.h \
-	exo-simple-job.c exo-simple-job.h \
-	katze-throbber.c katze-throbber.h \
-	screenshooter-job.c screenshooter-job.h \
-	screenshooter-simple-job.c screenshooter-simple-job.h \
-	screenshooter-zimagez.c screenshooter-zimagez.h \
-  sexy-url-label.c sexy-url-label.h
-
-libscreenshooter_la_CFLAGS += \
-	$(XMLRPC_CFLAGS)
-
-libscreenshooter_la_LIBADD += \
-	$(XMLRPC_LIBS) -lxmlrpc_client
-
 ##
 ## Rules to auto-generate built sources
 ##
@@ -84,6 +74,3 @@ screenshooter-marshal.c: screenshooter-marshal.list Makefile
 
 EXTRA_DIST = \
 	screenshooter-marshal.list
-
-endif
-endif
diff --git a/lib/screenshooter-actions.c b/lib/screenshooter-actions.c
index 40ba990c32b6527d4b44d24615c11d11c6a3b637..b48d2f544f8d798fb654ddd15110b8f4984e1c0b 100644
--- a/lib/screenshooter-actions.c
+++ b/lib/screenshooter-actions.c
@@ -110,14 +110,10 @@ gboolean screenshooter_take_and_output_screenshot (ScreenshotData *sd)
             {
               screenshooter_open_screenshot (screenshot_path, sd->app);
             }
-#ifdef HAVE_XMLRPC
-#ifdef HAVE_CURL
           else
             {
               screenshooter_upload_to_zimagez (screenshot_path, sd->last_user);
             }
-#endif
-#endif
         }
 
       g_object_unref (temp_dir);
diff --git a/lib/screenshooter-actions.h b/lib/screenshooter-actions.h
index 08737d57c15001b25d1d71efe4f29584bdbeecd4..a846693c762f0a6de512488b3a64a10f751cd86e 100644
--- a/lib/screenshooter-actions.h
+++ b/lib/screenshooter-actions.h
@@ -24,12 +24,7 @@
 #include "screenshooter-capture.h"
 #include "screenshooter-global.h"
 #include "screenshooter-dialogs.h"
-
-#ifdef HAVE_XMLRPC
-#ifdef HAVE_CURL
 #include "screenshooter-zimagez.h"
-#endif
-#endif
 
 gboolean screenshooter_take_and_output_screenshot (ScreenshotData *sd);
 
diff --git a/lib/screenshooter-dialogs.c b/lib/screenshooter-dialogs.c
index 98dd4cc434ea3fd676a5e7a6010354e39328b7ed..e915d352a52fc1e2ebe353b09e795088e9970470 100644
--- a/lib/screenshooter-dialogs.c
+++ b/lib/screenshooter-dialogs.c
@@ -50,13 +50,9 @@ cb_open_toggled                    (GtkToggleButton    *tb,
 static void
 cb_clipboard_toggled               (GtkToggleButton    *tb,
                                     ScreenshotData     *sd);
-#ifdef HAVE_XMLRPC
-#ifdef HAVE_CURL
 static void
 cb_zimagez_toggled                 (GtkToggleButton    *tb,
                                     ScreenshotData     *sd);
-#endif
-#endif
 static void
 cb_show_save_dialog_toggled        (GtkToggleButton    *tb,
                                     ScreenshotData     *sd);
@@ -207,8 +203,6 @@ static void cb_clipboard_toggled (GtkToggleButton *tb, ScreenshotData *sd)
 
 
 
-#ifdef HAVE_XMLRPC
-#ifdef HAVE_CURL
 static void cb_zimagez_toggled (GtkToggleButton *tb, ScreenshotData *sd)
 {
   if (gtk_toggle_button_get_active (tb))
@@ -216,8 +210,7 @@ static void cb_zimagez_toggled (GtkToggleButton *tb, ScreenshotData *sd)
       sd->action = UPLOAD;
     }
 }
-#endif
-#endif
+
 
 
 /* Set sd->show_save_dialog when the button is toggled */
@@ -700,16 +693,9 @@ GtkWidget *screenshooter_dialog_new (ScreenshotData  *sd, gboolean plugin)
   GtkWidget *save_checkbox;
 
   GtkWidget *actions_main_box, *actions_label, *actions_alignment;
-
   GtkWidget *save_radio_button, *dir_chooser;
-
   GtkWidget *clipboard_radio_button, *open_with_radio_button;
-
-#ifdef HAVE_XMLRPC
-#ifdef HAVE_CURL
   GtkWidget *zimagez_radio_button;
-#endif
-#endif
 
   GtkListStore *liststore;
   GtkWidget *combobox;
@@ -1195,11 +1181,9 @@ GtkWidget *screenshooter_dialog_new (ScreenshotData  *sd, gboolean plugin)
   cb_toggle_set_sensi (GTK_TOGGLE_BUTTON (open_with_radio_button), combobox);
 
   /* Upload to zimagez radio button */
-#ifdef HAVE_XMLRPC
-#ifdef HAVE_CURL
-  zimagez_radio_button = 
+  zimagez_radio_button =
     gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (save_radio_button),
-	                                               _("Host on ZimageZ"));
+                                                 _("Host on ZimageZ"));
 
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (zimagez_radio_button),
                                 (sd->action == UPLOAD));
@@ -1215,8 +1199,6 @@ GtkWidget *screenshooter_dialog_new (ScreenshotData  *sd, gboolean plugin)
                              0, 1, 3, 4);
 
   gtk_widget_show (zimagez_radio_button);
-#endif
-#endif
 
   return dlg;
 }
@@ -1237,7 +1219,7 @@ gchar
   gchar *savename = NULL;
 
   if (show_save_dialog)
-	  {
+    {
       GdkPixbuf *thumbnail;
 
       GtkWidget *preview;
@@ -1290,12 +1272,12 @@ gchar
       dialog_response = gtk_dialog_run (GTK_DIALOG (chooser));
 
       /* The user pressed the save button */
-	    if (G_LIKELY (dialog_response == GTK_RESPONSE_ACCEPT))
-	      {
+      if (G_LIKELY (dialog_response == GTK_RESPONSE_ACCEPT))
+       {
           save_uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (chooser));
         }
 
-	    gtk_widget_destroy (chooser);
+      gtk_widget_destroy (chooser);
 
       if (G_LIKELY (save_uri != NULL))
         {
@@ -1303,10 +1285,10 @@ gchar
 
           g_free (save_uri);
         }
-	  }
-	else
-	  {
-	    /* Else, we just save the file in the default folder */
+   }
+ else
+   {
+      /* Else, we just save the file in the default folder */
       gchar *save_uri = g_build_filename (default_dir, filename, NULL);
 
       savename = save_screenshot_to (screenshot, save_uri);
diff --git a/lib/screenshooter-global.h b/lib/screenshooter-global.h
index 5a1f8ffcf68c709f3082672539545571ec72b10f..0fd793c1b65bb2b84a0e6194df11a3499a894865 100644
--- a/lib/screenshooter-global.h
+++ b/lib/screenshooter-global.h
@@ -32,11 +32,7 @@ enum {
   SAVE,
   CLIPBOARD,
   OPEN,
-#ifdef HAVE_XMLRPC
-#ifdef HAVE_CURL
   UPLOAD,
-#endif
-#endif
 };
 
 
@@ -52,11 +48,7 @@ typedef struct
   gint close;
   gchar *screenshot_dir;
   gchar *app;
-#ifdef HAVE_XMLRPC
-#ifdef HAVE_CURL
   gchar *last_user;
-#endif
-#endif
   gboolean cli;
 }
 ScreenshotData;
diff --git a/lib/screenshooter-utils.c b/lib/screenshooter-utils.c
index cdf857b5ffb604bbf677b995aad46b92611f9f42..bfc203896e182795bf9a7f9da3c7e0ab1736fb7c 100644
--- a/lib/screenshooter-utils.c
+++ b/lib/screenshooter-utils.c
@@ -65,11 +65,7 @@ screenshooter_read_rc_file (const gchar *file, ScreenshotData *sd)
   gint close_app = 1;
   gchar *screenshot_dir = g_strdup (home_uri);
   gchar *app = g_strdup ("none");
-#ifdef HAVE_XMLRPC
-#ifdef HAVE_CURL
   gchar *last_user = g_strdup ("");
-#endif
-#endif
 
   if (G_LIKELY (file != NULL))
     {
@@ -91,12 +87,8 @@ screenshooter_read_rc_file (const gchar *file, ScreenshotData *sd)
           g_free (app);
           app = g_strdup (xfce_rc_read_entry (rc, "app", "none"));
 
-#ifdef HAVE_XMLRPC
-#ifdef HAVE_CURL
           g_free (last_user);
           last_user = g_strdup (xfce_rc_read_entry (rc, "last_user", ""));
-#endif
-#endif
 
           g_free (screenshot_dir);
           screenshot_dir =
@@ -119,11 +111,7 @@ screenshooter_read_rc_file (const gchar *file, ScreenshotData *sd)
   sd->close = close_app;
   sd->screenshot_dir = screenshot_dir;
   sd->app = app;
-#ifdef HAVE_XMLRPC
-#ifdef HAVE_CURL
   sd->last_user = last_user;
-#endif
-#endif
 }
 
 
@@ -155,14 +143,9 @@ screenshooter_write_rc_file (const gchar *file, ScreenshotData *sd)
   xfce_rc_write_int_entry (rc, "close", sd->close);
   xfce_rc_write_entry (rc, "screenshot_dir", sd->screenshot_dir);
   xfce_rc_write_entry (rc, "app", sd->app);
-#ifdef HAVE_XMLRPC
-#ifdef HAVE_CURL
   xfce_rc_write_entry (rc, "last_user", sd->last_user);
-#endif
-#endif
 
   TRACE ("Flush and close the rc file");
-
   xfce_rc_flush (rc);
   xfce_rc_close (rc);
 }
diff --git a/lib/screenshooter-zimagez.c b/lib/screenshooter-zimagez.c
index 787a31831a69adb1acb265a08d6b8aab4c15aba7..5545e6d4a663b14be4f9f882904829a8ba6e9156 100644
--- a/lib/screenshooter-zimagez.c
+++ b/lib/screenshooter-zimagez.c
@@ -54,6 +54,12 @@ typedef enum
 static void              open_url_hook             (SexyUrlLabel      *url_label,
                                                     gchar             *url,
                                                     gpointer           user_data);
+static gboolean          do_xmlrpc                 (SoupSession       *session,
+                                                    const gchar       *uri,
+                                                    const gchar       *method,
+                                                    GError           **error,
+                                                    GValue            *retval,
+                                                    ...);
 static gboolean          has_empty_field           (GtkListStore      *liststore);
 static ScreenshooterJob *zimagez_upload_to_zimagez (const gchar       *file_name,
                                                     gchar             *last_user);
@@ -99,12 +105,95 @@ open_url_hook (SexyUrlLabel *url_label, gchar *url, gpointer user_data)
 
 
 
+static gboolean
+do_xmlrpc (SoupSession *session, const gchar *uri, const gchar *method,
+           GError **error, GValue *retval, ...)
+{
+  SoupMessage *msg;
+  va_list args;
+  GValueArray *params;
+  GError *err = NULL;
+  char *body;
+
+  va_start (args, retval);
+  params = soup_value_array_from_args (args);
+  va_end (args);
+
+  body =
+    soup_xmlrpc_build_method_call (method, params->values,
+                                   params->n_values);
+  g_value_array_free (params);
+
+  if (!body)
+    {
+      err = g_error_new (SOUP_XMLRPC_FAULT,
+                         SOUP_XMLRPC_FAULT_APPLICATION_ERROR,
+                         _("An error occured when creating the XMLRPC"
+                           " request."));
+      g_propagate_error (error, err);
+
+      return FALSE;
+    }
+
+  msg = soup_message_new ("POST", uri);
+  soup_message_set_request (msg, "text/xml", SOUP_MEMORY_TAKE,
+                            body, strlen (body));
+  soup_session_send_message (session, msg);
+
+  if (!SOUP_STATUS_IS_SUCCESSFUL (msg->status_code))
+    {
+      TRACE ("Error during the XMLRPC exchange: %d %s\n",
+             msg->status_code, msg->reason_phrase);
+
+      err = g_error_new (SOUP_XMLRPC_FAULT,
+                         SOUP_XMLRPC_FAULT_TRANSPORT_ERROR,
+                         _("An error occured when transfering the data"
+                           " to ZimageZ."));
+      g_propagate_error (error, err);
+      g_object_unref (msg);
+
+      return FALSE;
+    }
+
+  if (!soup_xmlrpc_parse_method_response (msg->response_body->data,
+                                          msg->response_body->length,
+                                          retval, &err))
+    {
+      if (err)
+        {
+          TRACE ("Fault when parsing the response: %d %s\n",
+                 err->code, err->message);
+
+          g_propagate_error (error, err);
+        }
+      else
+        {
+          TRACE ("Unable to parse the response, and no error...");
+
+          err = g_error_new (SOUP_XMLRPC_FAULT,
+                             SOUP_XMLRPC_FAULT_APPLICATION_ERROR,
+                             _("An error occured when parsing the response"
+                               " from ZimageZ."));
+          g_propagate_error (error, err);
+        }
+
+      g_object_unref (msg);
+      return FALSE;
+    }
+
+  g_object_unref (msg);
+
+  return TRUE;
+}
+
+
+
 static gboolean
 has_empty_field (GtkListStore *liststore)
 {
   GtkTreeIter iter;
   gboolean result = FALSE;
-  
+
   gtk_tree_model_get_iter_first (GTK_TREE_MODEL (liststore), &iter);
 
   do
@@ -132,9 +221,6 @@ zimagez_upload_job (ScreenshooterJob *job, GValueArray *param_values, GError **e
   gchar *comment = g_strdup ("");
   gchar *data = NULL;
   gchar *encoded_password = NULL;
-  gchar *escaped_file_name;
-  gchar *escaped_title;
-  gchar *escaped_comment;
   gchar *file_name = NULL;
   gchar *login_response = NULL;
   gchar *online_file_name = NULL;
@@ -143,18 +229,18 @@ zimagez_upload_job (ScreenshooterJob *job, GValueArray *param_values, GError **e
   gchar *user;
 
   gsize data_length;
+  gboolean response = FALSE;
 
-  xmlrpc_env env;
-  xmlrpc_value *resultP = NULL;
-  xmlrpc_bool response = 0;
-
-  const gchar * const serverurl = "http://www.zimagez.com/apiXml.php";
-  const gchar * const method_login = "apiXml.xmlrpcLogin";
-  const gchar * const method_logout = "apiXml.xmlrpcLogout";
-  const gchar * const method_upload = "apiXml.xmlrpcUpload";
+  const gchar *serverurl = g_strdup ("http://www.zimagez.com/apiXml.php");
+  const gchar *method_login = g_strdup ("apiXml.xmlrpcLogin");
+  const gchar *method_logout = g_strdup ("apiXml.xmlrpcLogout");
+  const gchar *method_upload = g_strdup ("apiXml.xmlrpcUpload");
+  SoupSession *session;
 
+  GError *tmp_error;
   GtkTreeIter iter;
   GtkListStore *liststore;
+  GValue response_value;
 
   g_return_val_if_fail (SCREENSHOOTER_IS_JOB (job), FALSE);
   g_return_val_if_fail (param_values != NULL, FALSE);
@@ -179,37 +265,15 @@ zimagez_upload_job (ScreenshooterJob *job, GValueArray *param_values, GError **e
       user = g_strdup ("");
     }
 
-  g_object_set_data_full (G_OBJECT (job), "user", 
+  g_object_set_data_full (G_OBJECT (job), "user",
                           g_strdup (user), (GDestroyNotify) g_free);
 
   /* Get the path of the image that is to be uploaded */
   image_path = g_value_get_string (g_value_array_get_nth (param_values, 0));
 
-  /* Start the user XML RPC session */
+  /* Start the user soup session */
   exo_job_info_message (EXO_JOB (job), _("Initialize the connection..."));
-
-  TRACE ("Initialize the RPC environment");
-  xmlrpc_env_init(&env);
-
-  TRACE ("Initialize the RPC client");
-  xmlrpc_client_init2 (&env, XMLRPC_CLIENT_NO_FLAGS, PACKAGE_NAME, PACKAGE_VERSION,
-                       NULL, 0);
-
-  if (env.fault_occurred)
-    {
-      GError *tmp_error =
-        g_error_new (G_IO_ERROR, G_IO_ERROR_FAILED,
-                     _("An error occurred during the XML exchange: %s (%d).\n "
-                       "The screenshot could not be uploaded."),
-                     env.fault_string, env.fault_code);
-
-      xmlrpc_env_clean (&env);
-      xmlrpc_client_cleanup ();
-
-      g_propagate_error (error, tmp_error);
-
-      return FALSE;
-    }
+  session = soup_session_sync_new ();
 
   TRACE ("Get the information liststore ready.");
   liststore = gtk_list_store_new (2, G_TYPE_INT, G_TYPE_STRING);
@@ -262,10 +326,10 @@ zimagez_upload_job (ScreenshooterJob *job, GValueArray *param_values, GError **e
 
       switch (field_index)
         {
-          case USER: 
+          case USER:
             user = g_strdup (field_value);
             break;
-          case PASSWORD: 
+          case PASSWORD:
             password = g_strdup (field_value);
             break;
           case TITLE:
@@ -286,8 +350,8 @@ zimagez_upload_job (ScreenshooterJob *job, GValueArray *param_values, GError **e
     {
       if (exo_job_set_error_if_cancelled (EXO_JOB (job), error))
         {
-          xmlrpc_env_clean (&env);
-          xmlrpc_client_cleanup ();
+          soup_session_abort (session);
+          g_object_unref (session);
 
           g_free (user);
           g_free (password);
@@ -317,97 +381,69 @@ zimagez_upload_job (ScreenshooterJob *job, GValueArray *param_values, GError **e
       encoded_password = g_strdup (g_strreverse (rot13 (password)));
 
       TRACE ("User: %s", user);
+      TRACE ("Encoded password: %s", encoded_password);
 
       /* Start the user session */
       TRACE ("Call the login method");
 
       exo_job_info_message (EXO_JOB (job), _("Login on ZimageZ..."));
 
-      resultP = xmlrpc_client_call (&env, serverurl, method_login,
-                                    "(ss)", user, encoded_password);
-
-      if (env.fault_occurred)
+      if (!do_xmlrpc (session, serverurl, method_login,
+                      &tmp_error, &response_value,
+                      G_TYPE_STRING, user,
+                      G_TYPE_STRING, encoded_password,
+                      G_TYPE_INVALID))
         {
-          GError *tmp_error =
-            g_error_new (G_IO_ERROR, G_IO_ERROR_FAILED,
-                         _("An error occurred during the XML exchange: %s (%d).\n "
-                           "The screenshot could not be uploaded."),
-                         env.fault_string, env.fault_code);
-
-          xmlrpc_env_clean (&env);
-          xmlrpc_client_cleanup ();
+          g_propagate_error (error, tmp_error);
+          soup_session_abort (session);
+          g_object_unref (session);
 
-          g_free (user);
           g_free (password);
           g_free (title);
           g_free (comment);
           g_free (encoded_password);
 
-          g_propagate_error (error, tmp_error);
-
           return FALSE;
         }
 
       TRACE ("Read the login response");
 
       /* If the response is a boolean, there was an error */
-      if (xmlrpc_value_type (resultP) == XMLRPC_TYPE_BOOL)
+      if (G_VALUE_HOLDS_BOOLEAN (&response_value))
         {
-          xmlrpc_read_bool (&env, resultP, &response);
-
-          if (env.fault_occurred)
-            {
-              GError *tmp_error =
-                g_error_new (G_IO_ERROR, G_IO_ERROR_FAILED,
-                             _("An error occurred during the XML exchange: %s (%d).\n "
-                               "The screenshot could not be uploaded."),
-                             env.fault_string, env.fault_code);
-
-              xmlrpc_env_clean (&env);
-              xmlrpc_client_cleanup ();
-
-              g_free (user);
-              g_free (password);
-              g_free (title);
-              g_free (comment);
-              g_free (encoded_password);
-
-              g_propagate_error (error, tmp_error);
-
-              return FALSE;
-            }
+          response = g_value_get_boolean (&response_value);
         }
       /* Else we read the string response to get the session ID */
-      else
+      else if (G_VALUE_HOLDS_STRING (&response_value))
         {
           TRACE ("Read the session ID");
-          xmlrpc_read_string (&env, resultP, (const gchar ** const)&login_response);
-
-          if (env.fault_occurred)
-           {
-             GError *tmp_error =
-               g_error_new (G_IO_ERROR, G_IO_ERROR_FAILED,
-                            _("An error occurred during the XML exchange: %s (%d).\n "
-                              "The screenshot could not be uploaded."),
-                            env.fault_string, env.fault_code);
-
-             xmlrpc_env_clean (&env);
-             xmlrpc_client_cleanup ();
-
-             g_free (user);
-             g_free (password);
-             g_free (title);
-             g_free (comment);
-             g_free (encoded_password);
+          login_response = g_strdup (g_value_get_string (&response_value));
+          response = TRUE;
+        }
+      /* We received an unexpected reply */
+      else
+        {
+          GError *tmp_err =
+            g_error_new (SOUP_XMLRPC_FAULT,
+                         SOUP_XMLRPC_FAULT_PARSE_ERROR_NOT_WELL_FORMED,
+                         "%s", _("An unexpected reply from ZimageZ was received."
+                                 " The upload of the screenshot failed."));
+          soup_session_abort (session);
+          g_object_unref (session);
 
-             g_propagate_error (error, tmp_error);
+          g_free (user);
+          g_free (password);
+          g_free (title);
+          g_free (comment);
+          g_free (encoded_password);
 
-             return FALSE;
-           }
+          g_propagate_error (error, tmp_err);
 
-          response = 1;
+          return FALSE;
         }
 
+      g_value_unset (&response_value);
+
       if (!response)
         {
           /* Login failed, erase the password and ask for the correct on to the
@@ -470,9 +506,7 @@ zimagez_upload_job (ScreenshooterJob *job, GValueArray *param_values, GError **e
         }
     }
 
-  xmlrpc_DECREF (resultP);
-
-  g_object_set_data_full (G_OBJECT (job), "user", 
+  g_object_set_data_full (G_OBJECT (job), "user",
                           g_strdup (user), (GDestroyNotify) g_free);
 
   g_free (user);
@@ -489,36 +523,26 @@ zimagez_upload_job (ScreenshooterJob *job, GValueArray *param_values, GError **e
   /* Get the basename of the image path */
   file_name = g_path_get_basename (image_path);
 
-  /* Escape the strings before passing them to xmlrpc-c */
-  escaped_file_name = g_markup_escape_text (file_name, -1);
-  escaped_title = g_markup_escape_text (title, -1);
-  escaped_comment = g_markup_escape_text (comment, -1);
-
   exo_job_info_message (EXO_JOB (job), _("Upload the screenshot..."));
 
   TRACE ("Call the upload method");
-  resultP = xmlrpc_client_call (&env, serverurl, method_upload,
-                                "(sssss)", encoded_data, escaped_file_name, 
-                                escaped_title, escaped_comment,
-                                login_response);
-
-  g_free (escaped_file_name);
-  g_free (escaped_title);
-  g_free (escaped_comment);
+  do_xmlrpc (session, serverurl, method_upload,
+             &tmp_error, &response_value,
+             G_TYPE_STRING, encoded_data,
+             G_TYPE_STRING, file_name,
+             G_TYPE_STRING, title,
+             G_TYPE_STRING, comment,
+             G_TYPE_STRING, login_response,
+             G_TYPE_INVALID);
+
   g_free (title);
   g_free (comment);
   g_free (file_name);
 
-  if (env.fault_occurred)
+  if (tmp_error)
     {
-      GError *tmp_error =
-        g_error_new (G_IO_ERROR, G_IO_ERROR_FAILED,
-                     _("An error occurred during the XML exchange: %s (%d).\n "
-                       "The screenshot could not be uploaded."),
-                     env.fault_string, env.fault_code);
-
-      xmlrpc_env_clean (&env);
-      xmlrpc_client_cleanup ();
+      soup_session_abort (session);
+      g_object_unref (session);
 
       g_propagate_error (error, tmp_error);
 
@@ -526,79 +550,63 @@ zimagez_upload_job (ScreenshooterJob *job, GValueArray *param_values, GError **e
     }
 
   /* If the response is a boolean, there was an error */
-  if (xmlrpc_value_type (resultP) == XMLRPC_TYPE_BOOL)
+  if (G_VALUE_HOLDS_BOOLEAN (&response_value))
     {
-      xmlrpc_bool response_upload;
-
-      xmlrpc_read_bool (&env, resultP, &response_upload);
-
-      if (env.fault_occurred)
+      if (!g_value_get_boolean (&response_value))
         {
-          GError *tmp_error =
-            g_error_new (G_IO_ERROR, G_IO_ERROR_FAILED,
-                         _("An error occurred during the XML exchange: %s (%d).\n "
-                           "The screenshot could not be uploaded."),
-                         env.fault_string, env.fault_code);
-
-          xmlrpc_env_clean (&env);
-          xmlrpc_client_cleanup ();
-
-          g_propagate_error (error, tmp_error);
-
-          return FALSE;
-        }
-
-      if (!response_upload)
-        {
-          GError *tmp_error =
+          GError *tmp_err =
             g_error_new (G_IO_ERROR, G_IO_ERROR_FAILED,
                          _("An error occurred while uploading the screenshot."));
 
-          xmlrpc_env_clean (&env);
-          xmlrpc_client_cleanup ();
-
-          g_propagate_error (error, tmp_error);
+          soup_session_abort (session);
+          g_object_unref (session);
+          g_propagate_error (error, tmp_err);
 
           return FALSE;
         }
     }
   /* Else we get the file name */
-  else
+  else if (G_VALUE_HOLDS_STRING (&response_value))
     {
-      xmlrpc_read_string (&env, resultP, (const char **)&online_file_name);
-
       TRACE ("The screenshot has been uploaded, get the file name.");
+      online_file_name = g_strdup (g_value_get_string (&response_value));
+    }
+  /* We received un unexpected reply */
+  else
+    {
+      GError *tmp_err =
+        g_error_new (SOUP_XMLRPC_FAULT,
+                     SOUP_XMLRPC_FAULT_PARSE_ERROR_NOT_WELL_FORMED,
+                     "%s", _("An unexpected reply from ZimageZ was received."
+                       " The upload of the screenshot failed."));
+      soup_session_abort (session);
+      g_object_unref (session);
+      g_propagate_error (error, tmp_err);
 
-      if (env.fault_occurred)
-        {
-          GError *tmp_error =
-            g_error_new (G_IO_ERROR, G_IO_ERROR_FAILED,
-                         _("An error occurred during the XML exchange: %s (%d).\n "
-                           "The screenshot could not be uploaded."),
-                         env.fault_string, env.fault_code);
-
-          xmlrpc_env_clean (&env);
-          xmlrpc_client_cleanup ();
-
-          g_propagate_error (error, tmp_error);
-
-          return FALSE;
-        }
+      return FALSE;
     }
 
-  xmlrpc_DECREF (resultP);
+  g_value_unset (&response_value);
 
   /* End the user session */
-
   exo_job_info_message (EXO_JOB (job), _("Close the session on ZimageZ..."));
 
   TRACE ("Closing the user session");
 
-  xmlrpc_client_call (&env, serverurl, method_logout, "(s)", login_response);
+  do_xmlrpc (session, serverurl, method_logout,
+             &tmp_error, &response_value,
+             G_TYPE_STRING, login_response,
+             G_TYPE_INVALID);
+
+  if (tmp_error)
+    g_error_free (tmp_error);
 
-  TRACE ("Cleanup the XMLRPC session");
-  xmlrpc_env_clean (&env);
-  xmlrpc_client_cleanup ();
+  g_value_unset (&response_value);
+
+  /* Clean the soup session */
+  soup_session_abort (session);
+  g_object_unref (session);
+  g_free (login_response);
 
   screenshooter_job_image_uploaded (job, online_file_name);
 
@@ -775,7 +783,7 @@ cb_ask_for_information (ScreenshooterJob *job,
           default:
             break;
         }
-      
+
       g_free (field_value);
     }
   while (gtk_tree_model_iter_next (GTK_TREE_MODEL (liststore), &iter));
@@ -882,7 +890,7 @@ static void cb_image_uploaded (ScreenshooterJob *job, gchar *upload_name, gchar
     last_user_temp = g_strdup ("");
 
   last_user = g_strdup (last_user_temp);
-    
+
   /* Dialog */
   dialog =
     xfce_titled_dialog_new_with_buttons (_("My screenshot on ZimageZ"),
@@ -910,7 +918,7 @@ static void cb_image_uploaded (ScreenshooterJob *job, gchar *upload_name, gchar
 
   /* Links bold label */
   link_label = gtk_label_new ("");
-  gtk_label_set_markup (GTK_LABEL (link_label), 
+  gtk_label_set_markup (GTK_LABEL (link_label),
                         _("<span weight=\"bold\" stretch=\"semiexpanded\">"
                           "Links</span>"));
   gtk_misc_set_alignment (GTK_MISC (link_label), 0, 0);
@@ -955,7 +963,7 @@ static void cb_image_uploaded (ScreenshooterJob *job, gchar *upload_name, gchar
 
   /* Examples bold label */
   example_label = gtk_label_new ("");
-  gtk_label_set_markup (GTK_LABEL (example_label), 
+  gtk_label_set_markup (GTK_LABEL (example_label),
                         _("<span weight=\"bold\" stretch=\"semiexpanded\">"
                           "Code for a thumbnail pointing to the full size image</span>"));
   gtk_misc_set_alignment (GTK_MISC (example_label), 0, 0);
@@ -1028,7 +1036,7 @@ static void cb_error (ExoJob *job, GError *error, gpointer unused)
 {
   g_return_if_fail (error != NULL);
 
-  screenshooter_error ("%s", error->message); 
+  screenshooter_error ("%s", error->message);
 }
 
 
diff --git a/lib/screenshooter-zimagez.h b/lib/screenshooter-zimagez.h
index 0b20cddf72871b3bfa5ce558cc933b72a5f31f52..d2d422ef925af743dd8ab57460bfe159d0e12dc1 100644
--- a/lib/screenshooter-zimagez.h
+++ b/lib/screenshooter-zimagez.h
@@ -26,9 +26,7 @@
 
 #include <glib.h>
 #include <glib/gstdio.h>
-
-#include <xmlrpc-c/base.h>
-#include <xmlrpc-c/client.h>
+#include <libsoup/soup.h>
 
 #include "screenshooter-utils.h"
 #include "screenshooter-simple-job.h"
diff --git a/panel-plugin/Makefile.am b/panel-plugin/Makefile.am
index 99163e842bcfe9ab4442a862eace743cbd2e4113..0d1f3f8e0eb1710b9f928504b9f0ae0a544701b6 100644
--- a/panel-plugin/Makefile.am
+++ b/panel-plugin/Makefile.am
@@ -6,12 +6,14 @@ xfce4_screenshooter_plugin_CFLAGS =	\
 	-I$(top_srcdir)	\
 	-I$(top_srcdir)/lib	\
 	@LIBXFCE4PANEL_CFLAGS@ \
-	@GTHREAD_CFLAGS@
+	@GTHREAD_CFLAGS@ \
+	@SOUP_CFLAGS@
 
 xfce4_screenshooter_plugin_LDFLAGS = \
+	$(top_builddir)/lib/libscreenshooter.la \
 	@LIBXFCE4PANEL_LIBS@ \
 	@GTHREAD_LIBS@ \
-	$(top_builddir)/lib/libscreenshooter.la
+	@SOUP_LIBS@
 
 xfce4_screenshooter_plugin_SOURCES = \
 	screenshooter-plugin.c
diff --git a/src/Makefile.am b/src/Makefile.am
index 4d964238d1faa9f2efab256dcc75b29207c274c3..48272b768189c65257ce0eb7cbbc82d0bd4f519c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -7,6 +7,7 @@ xfce4_screenshooter_CFLAGS = \
 	@LIBXFCE4UTIL_CFLAGS@ \
 	@LIBXFCEGUI4_CFLAGS@ \
 	@GTHREAD_CFLAGS@ \
+	@SOUP_CFLAGS@ \
 	-DPACKAGE_LOCALE_DIR=\"$(localedir)\"
 	
 xfce4_screenshooter_LDFLAGS = \
@@ -14,6 +15,7 @@ xfce4_screenshooter_LDFLAGS = \
 	@GTK_LIBS@ \
 	@GLIB_LIBS@ \
 	@GTHREAD_LIBS@ \
+	@SOUP_LIBS@ \
 	@LIBXFCE4UTIL_LIBS@ \
 	@LIBXFCEGUI4_LIBS@
 
diff --git a/src/main.c b/src/main.c
index 85077f58b0a7a6ab578d813f5da01e230273f7e8..e6df156c2a427ff73c7c5b42ee627d6ad82c5c5b 100644
--- a/src/main.c
+++ b/src/main.c
@@ -34,11 +34,7 @@ gboolean region = FALSE;
 gboolean fullscreen = FALSE;
 gboolean no_save_dialog = FALSE;
 gboolean hide_mouse = FALSE;
-#ifdef HAVE_XMLRPC
-#ifdef HAVE_CURL
 gboolean upload = FALSE;
-#endif
-#endif
 gchar *screenshot_dir;
 gchar *application;
 gint delay = 0;
@@ -85,15 +81,11 @@ static GOptionEntry entries[] =
     N_("Directory where the screenshot will be saved"),
     NULL
   },
-#ifdef HAVE_XMLRPC
-#ifdef HAVE_CURL  
   {
     "upload", 'u', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &upload,
     N_("Host the screenshot on ZimageZ, a free online image hosting service"),
     NULL
   },
-#endif
-#endif
   {
     "version", 'V', G_OPTION_FLAG_IN_MAIN, G_OPTION_ARG_NONE, &version,
     N_("Version information"),
@@ -204,15 +196,11 @@ int main (int argc, char **argv)
           sd->app = application;
           sd->action = OPEN;
         }
-#ifdef HAVE_XMLRPC
-#ifdef HAVE_CURL
       else if (upload)
         {
           sd->app = g_strdup ("none");
           sd->action = UPLOAD;
         }
-#endif
-#endif
       else
         {
           sd->app = g_strdup ("none");
@@ -262,8 +250,6 @@ int main (int argc, char **argv)
       if (preferences_file != NULL)
         screenshooter_write_rc_file (preferences_file, sd);
     }
-#ifdef HAVE_XMLRPC
-#ifdef HAVE_CURL
   else if (sd->action == UPLOAD)
     {
       const gchar *preferences_file =
@@ -287,16 +273,10 @@ int main (int argc, char **argv)
             }
         }
     }
-#endif
-#endif
 
   g_free (sd->screenshot_dir);
   g_free (sd->app);
-#ifdef HAVE_XMLRPC
-#ifdef HAVE_CURL
   g_free (sd->last_user);
-#endif
-#endif
   g_free (sd);
 
   TRACE ("Ciao");