]> git.0d.be Git - empathy.git/blobdiff - libempathy-gtk/empathy-account-widget.c
individual_view_drag_end: remove the auto scroll
[empathy.git] / libempathy-gtk / empathy-account-widget.c
index 679b515a7c2d6b9304e8662517960309dfe33f9d..0de4dc80fa37350868701f7dd5ceb1bfdc2263c1 100644 (file)
@@ -21,6 +21,7 @@
  *          Martyn Russell <martyn@imendio.com>
  *          Cosimo Cecchi <cosimo.cecchi@collabora.co.uk>
  *          Jonathan Tellier <jonathan.tellier@gmail.com>
+ *          Danielle Madeley <danielle.madeley@collabora.co.uk>
  */
 
 #include <config.h>
@@ -30,9 +31,6 @@
 #include <gtk/gtk.h>
 #include <glib/gi18n-lib.h>
 
-#ifdef HAVE_MEEGO
-#include <mx-gtk/mx-gtk.h>
-#endif /* HAVE_MEEGO */
 #include <gio/gdesktopappinfo.h>
 
 #include <libempathy/empathy-utils.h>
@@ -70,20 +68,20 @@ typedef struct
 
 static ServiceInfo services_infos[N_SERVICES] = {
     { "label_username_example", TRUE },
-    { "label_username_g_example", TRUE },
+    { "label_username_g_example", FALSE },
     { "label_username_f_example", FALSE },
 };
 
-typedef struct {
+struct _EmpathyAccountWidgetPriv {
   EmpathyAccountSettings *settings;
 
-  GtkWidget *table_common_settings;
+  GtkWidget *grid_common_settings;
   GtkWidget *apply_button;
   GtkWidget *cancel_button;
   GtkWidget *entry_password;
   GtkWidget *spinbutton_port;
-  GtkWidget *enabled_checkbox;
   GtkWidget *radiobutton_reuse;
+  GtkWidget *hbox_buttons;
 
   gboolean simple;
 
@@ -118,9 +116,7 @@ typedef struct {
   /* Used for 'special' XMPP account having a service associated ensuring that
    * JIDs have a specific suffix; such as Facebook for example */
   gchar *jid_suffix;
-
-  gboolean dispose_run;
-} EmpathyAccountWidgetPriv;
+};
 
 enum {
   PROP_PROTOCOL = 1,
@@ -134,6 +130,7 @@ enum {
   HANDLE_APPLY,
   ACCOUNT_CREATED,
   CANCELLED,
+  CLOSE,
   LAST_SIGNAL
 };
 
@@ -145,7 +142,6 @@ enum {
 
 static guint signals[LAST_SIGNAL] = { 0 };
 
-#define GET_PRIV(obj) EMPATHY_GET_PRIV (obj, EmpathyAccountWidget)
 #define CHANGED_TIMEOUT 300
 
 #define DIGIT             "0-9"
@@ -158,9 +154,10 @@ static guint signals[LAST_SIGNAL] = { 0 };
 #define ALPHADIGITDASHS   "(["ALPHADIGITDASH"]*)"
 
 #define HOSTNUMBER        "("DIGITS"\\."DIGITS"\\."DIGITS"\\."DIGITS")"
-#define TOPLABEL          ALPHAS"|(["ALPHA"]" ALPHADIGITDASHS "["ALPHADIGIT"])"
-#define DOMAINLABEL       ALPHADIGITS"|(["ALPHADIGIT"]" ALPHADIGITDASHS \
-                                       "["ALPHADIGIT"])"
+#define TOPLABEL          "("ALPHAS \
+                            "| (["ALPHA"]"ALPHADIGITDASHS "["ALPHADIGIT"]))"
+#define DOMAINLABEL       "("ALPHADIGITS"|(["ALPHADIGIT"]" ALPHADIGITDASHS \
+                                       "["ALPHADIGIT"]))"
 #define HOSTNAME          "((" DOMAINLABEL "\\.)+" TOPLABEL ")"
 /* Based on http://www.ietf.org/rfc/rfc1738.txt (section 5) */
 #define HOST              "("HOSTNAME "|" HOSTNUMBER")"
@@ -176,7 +173,16 @@ static guint signals[LAST_SIGNAL] = { 0 };
 
 /* Based on http://www.ietf.org/rfc/rfc2812.txt (section 2.3.1) */
 #define IRC_SPECIAL       "_\\[\\]{}\\\\|`^"
-#define IRC_USER_NAME     "(["ALPHA IRC_SPECIAL"]["ALPHADIGITDASH IRC_SPECIAL"]*)"
+#define IRC_NICK_NAME     "(["ALPHA IRC_SPECIAL"]["ALPHADIGITDASH IRC_SPECIAL"]*)"
+/*   user       =  1*( %x01-09 / %x0B-0C / %x0E-1F / %x21-3F / %x41-FF )
+ *                ; any octet except NUL, CR, LF, " " and "@"
+ *
+ * so technically, like so many other places in IRC, we should be using arrays
+ * of bytes here rather than UTF-8 strings. Life: too short. In practice this
+ * will always be ASCII.
+ */
+#define IRC_USER_NAME     "([^\r\n@ ])+"
+
 /* Based on http://www.ietf.org/rfc/rfc4622.txt (section 2.2)
  * We just exclude invalid characters to avoid ucschars and other redundant
  * complexity */
@@ -185,12 +191,15 @@ static guint signals[LAST_SIGNAL] = { 0 };
  * http://www.hypothetic.org/docs/msn/general/names.php */
 #define MSN_USER_NAME     EMAIL_LOCALPART
 /* Based on the official help:
- * http://help.yahoo.com/l/us/yahoo/edit/registration/edit-01.html */
-#define YAHOO_USER_NAME   "(["ALPHA"]["ALPHADIGIT"_\\.]{3,31})"
+ * http://help.yahoo.com/l/us/yahoo/edit/registration/edit-01.html
+ * Looks like an email address can be used as well (bgo #655959)
+ * */
+#define YAHOO_USER_NAME   "(["ALPHA"]["ALPHADIGIT"_\\.]{3,31})|("EMAIL_LOCALPART"@"HOST")"
 
 #define ACCOUNT_REGEX_ICQ      "^"ICQ_USER_NAME"$"
-#define ACCOUNT_REGEX_IRC      "^"IRC_USER_NAME"$"
-#define ACCOUNT_REGEX_JABBER   "^"JABBER_USER_NAME"@"HOST"$"
+#define ACCOUNT_REGEX_IRC      "^"IRC_NICK_NAME"$"
+#define USERNAME_REGEX_IRC     "^"IRC_USER_NAME"$"
+#define ACCOUNT_REGEX_JABBER   "^"JABBER_USER_NAME"@[^@/]+"
 #define ACCOUNT_REGEX_MSN      "^"MSN_USER_NAME"@"HOST"$"
 #define ACCOUNT_REGEX_YAHOO    "^"YAHOO_USER_NAME"$"
 
@@ -198,32 +207,25 @@ static void
 account_widget_set_control_buttons_sensitivity (EmpathyAccountWidget *self,
     gboolean sensitive)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
+  /* we hit this case because of the 'other-accounts-exist' property handler
+   * being called during init (before constructed()) */
+  if (self->priv->apply_button == NULL || self->priv->cancel_button == NULL)
+    return;
 
-  if (!priv->simple)
-    {
-      /* we hit this case because of the 'other-accounts-exist' property handler
-       * being called during init (before constructed()) */
-      if (priv->apply_button == NULL || priv->cancel_button == NULL)
-        return;
+  gtk_widget_set_sensitive (self->priv->apply_button, sensitive);
 
-      gtk_widget_set_sensitive (priv->apply_button, sensitive);
-      gtk_widget_set_sensitive (priv->cancel_button,
-          (sensitive || priv->creating_account) && priv->other_accounts_exist);
+  if (sensitive)
+    {
+      /* We can't grab default if the widget hasn't be packed in a
+       * window */
+      GtkWidget *window;
 
-      if (sensitive)
+      window = gtk_widget_get_toplevel (self->priv->apply_button);
+      if (window != NULL &&
+          gtk_widget_is_toplevel (window))
         {
-          /* We can't grab default if the widget hasn't be packed in a
-           * window */
-          GtkWidget *window;
-
-          window = gtk_widget_get_toplevel (priv->apply_button);
-          if (window != NULL &&
-              gtk_widget_is_toplevel (window))
-            {
-              gtk_widget_set_can_default (priv->apply_button, TRUE);
-              gtk_widget_grab_default (priv->apply_button);
-            }
+          gtk_widget_set_can_default (self->priv->apply_button, TRUE);
+          gtk_widget_grab_default (self->priv->apply_button);
         }
     }
 }
@@ -261,13 +263,11 @@ account_widget_set_entry_highlighting (GtkEntry *entry,
 static void
 account_widget_handle_control_buttons_sensitivity (EmpathyAccountWidget *self)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
   gboolean is_valid;
 
-  is_valid = empathy_account_settings_is_valid (priv->settings);
+  is_valid = empathy_account_settings_is_valid (self->priv->settings);
 
-  if (!priv->simple)
-      account_widget_set_control_buttons_sensitivity (self, is_valid);
+  account_widget_set_control_buttons_sensitivity (self, is_valid);
 
   g_signal_emit (self, signals[HANDLE_APPLY], 0, is_valid);
 }
@@ -278,24 +278,23 @@ account_widget_entry_changed_common (EmpathyAccountWidget *self,
 {
   const gchar *str;
   const gchar *param_name;
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
   gboolean prev_status;
   gboolean curr_status;
 
   str = gtk_entry_get_text (entry);
   param_name = g_object_get_data (G_OBJECT (entry), "param_name");
-  prev_status = empathy_account_settings_parameter_is_valid (priv->settings,
-                                                             param_name);
+  prev_status = empathy_account_settings_parameter_is_valid (
+      self->priv->settings, param_name);
 
   if (EMP_STR_EMPTY (str))
     {
       const gchar *value = NULL;
 
-      empathy_account_settings_unset (priv->settings, param_name);
+      empathy_account_settings_unset (self->priv->settings, param_name);
 
       if (focus)
         {
-          value = empathy_account_settings_get_string (priv->settings,
+          value = empathy_account_settings_get_string (self->priv->settings,
               param_name);
           DEBUG ("Unset %s and restore to %s", param_name, value);
           gtk_entry_set_text (entry, value ? value : "");
@@ -305,11 +304,13 @@ account_widget_entry_changed_common (EmpathyAccountWidget *self,
     {
       DEBUG ("Setting %s to %s", param_name,
           tp_strdiff (param_name, "password") ? str : "***");
-      empathy_account_settings_set_string (priv->settings, param_name, str);
+      empathy_account_settings_set_string (self->priv->settings, param_name,
+          str);
     }
 
-  curr_status = empathy_account_settings_parameter_is_valid (priv->settings,
-                                                             param_name);
+  curr_status = empathy_account_settings_parameter_is_valid (
+      self->priv->settings, param_name);
+
   if (curr_status != prev_status)
     account_widget_set_entry_highlighting (entry, !curr_status);
 }
@@ -318,9 +319,7 @@ static void
 account_widget_entry_changed_cb (GtkEditable *entry,
     EmpathyAccountWidget *self)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
-
-  if (priv->automatic_change)
+  if (self->priv->automatic_change)
     return;
 
   account_widget_entry_changed_common (self, GTK_ENTRY (entry), FALSE);
@@ -331,14 +330,13 @@ static void
 account_widget_entry_map_cb (GtkEntry *entry,
     EmpathyAccountWidget *self)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
   const gchar *param_name;
   gboolean is_valid;
 
   /* need to initialize input highlighting */
   param_name = g_object_get_data (G_OBJECT (entry), "param_name");
-  is_valid = empathy_account_settings_parameter_is_valid (priv->settings,
-                                                          param_name);
+  is_valid = empathy_account_settings_parameter_is_valid (self->priv->settings,
+      param_name);
   account_widget_set_entry_highlighting (entry, !is_valid);
 }
 
@@ -349,12 +347,11 @@ account_widget_int_changed_cb (GtkWidget *widget,
   const gchar *param_name;
   gint value;
   const gchar *signature;
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
 
   value = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (widget));
   param_name = g_object_get_data (G_OBJECT (widget), "param_name");
 
-  signature = empathy_account_settings_get_dbus_signature (priv->settings,
+  signature = empathy_account_settings_get_dbus_signature (self->priv->settings,
     param_name);
   g_return_if_fail (signature != NULL);
 
@@ -364,17 +361,21 @@ account_widget_int_changed_cb (GtkWidget *widget,
     {
     case DBUS_TYPE_INT16:
     case DBUS_TYPE_INT32:
-      empathy_account_settings_set_int32 (priv->settings, param_name, value);
+      empathy_account_settings_set_int32 (self->priv->settings, param_name,
+          value);
       break;
     case DBUS_TYPE_INT64:
-      empathy_account_settings_set_int64 (priv->settings, param_name, value);
+      empathy_account_settings_set_int64 (self->priv->settings, param_name,
+          value);
       break;
     case DBUS_TYPE_UINT16:
     case DBUS_TYPE_UINT32:
-      empathy_account_settings_set_uint32 (priv->settings, param_name, value);
+      empathy_account_settings_set_uint32 (self->priv->settings, param_name,
+          value);
       break;
     case DBUS_TYPE_UINT64:
-      empathy_account_settings_set_uint64 (priv->settings, param_name, value);
+      empathy_account_settings_set_uint64 (self->priv->settings, param_name,
+          value);
       break;
     default:
       g_return_if_reached ();
@@ -390,7 +391,6 @@ account_widget_checkbutton_toggled_cb (GtkWidget *widget,
   gboolean     value;
   gboolean     default_value;
   const gchar *param_name;
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
 
   value = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
   param_name = g_object_get_data (G_OBJECT (widget), "param_name");
@@ -398,8 +398,8 @@ account_widget_checkbutton_toggled_cb (GtkWidget *widget,
   /* FIXME: This is ugly! checkbox don't have a "not-set" value so we
    * always unset the param and set the value if different from the
    * default value. */
-  empathy_account_settings_unset (priv->settings, param_name);
-  default_value = empathy_account_settings_get_boolean (priv->settings,
+  empathy_account_settings_unset (self->priv->settings, param_name);
+  default_value = empathy_account_settings_get_boolean (self->priv->settings,
       param_name);
 
   if (default_value == value)
@@ -409,7 +409,8 @@ account_widget_checkbutton_toggled_cb (GtkWidget *widget,
   else
     {
       DEBUG ("Setting %s to %d", param_name, value);
-      empathy_account_settings_set_boolean (priv->settings, param_name, value);
+      empathy_account_settings_set_boolean (self->priv->settings, param_name,
+          value);
     }
 
   empathy_account_widget_changed (self);
@@ -419,12 +420,11 @@ static void
 account_widget_jabber_ssl_toggled_cb (GtkWidget *checkbutton_ssl,
     EmpathyAccountWidget *self)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
   gboolean   value;
   gint32       port = 0;
 
   value = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbutton_ssl));
-  port = empathy_account_settings_get_uint32 (priv->settings, "port");
+  port = empathy_account_settings_get_uint32 (self->priv->settings, "port");
 
   if (value)
     {
@@ -437,9 +437,10 @@ account_widget_jabber_ssl_toggled_cb (GtkWidget *checkbutton_ssl,
         port = 5222;
     }
 
-  gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->spinbutton_port), port);
+  gtk_spin_button_set_value (GTK_SPIN_BUTTON (self->priv->spinbutton_port),
+      port);
 
-  priv->contains_pending_changes = TRUE;
+  self->priv->contains_pending_changes = TRUE;
 }
 
 static void
@@ -452,7 +453,6 @@ account_widget_combobox_changed_cb (GtkWidget *widget,
   const GValue *v;
   const gchar *default_value = NULL;
   const gchar *param_name;
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
 
   if (!gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter))
     return;
@@ -463,19 +463,20 @@ account_widget_combobox_changed_cb (GtkWidget *widget,
 
   param_name = g_object_get_data (G_OBJECT (widget), "param_name");
 
-  v = empathy_account_settings_get_default (priv->settings, param_name);
+  v = empathy_account_settings_get_default (self->priv->settings, param_name);
   if (v != NULL)
     default_value = g_value_get_string (v);
 
   if (!tp_strdiff (value, default_value))
     {
       DEBUG ("Unset %s and restore to %s", param_name, default_value);
-      empathy_account_settings_unset (priv->settings, param_name);
+      empathy_account_settings_unset (self->priv->settings, param_name);
     }
   else
     {
       DEBUG ("Setting %s to %s", param_name, value);
-      empathy_account_settings_set_string (priv->settings, param_name, value);
+      empathy_account_settings_set_string (self->priv->settings, param_name,
+          value);
     }
 
   empathy_account_widget_changed (self);
@@ -487,13 +488,12 @@ clear_icon_released_cb (GtkEntry *entry,
     GdkEvent *event,
     EmpathyAccountWidget *self)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
   const gchar *param_name;
 
   param_name = g_object_get_data (G_OBJECT (entry), "param_name");
 
   DEBUG ("Unset %s", param_name);
-  empathy_account_settings_unset (priv->settings, param_name);
+  empathy_account_settings_unset (self->priv->settings, param_name);
   gtk_entry_set_text (entry, "");
 
   empathy_account_widget_changed (self);
@@ -515,9 +515,7 @@ static void
 password_entry_activated_cb (GtkEntry *entry,
     EmpathyAccountWidget *self)
 {
-    EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
-
-    if (gtk_widget_get_sensitive (priv->apply_button))
+    if (gtk_widget_get_sensitive (self->priv->apply_button))
         account_widget_apply_and_log_in (self);
 }
 
@@ -525,9 +523,7 @@ static void
 account_entry_activated_cb (GtkEntry *entry,
     EmpathyAccountWidget *self)
 {
-    EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
-
-    if (gtk_widget_get_sensitive (priv->apply_button))
+    if (gtk_widget_get_sensitive (self->priv->apply_button))
         account_widget_apply_and_log_in (self);
 }
 
@@ -536,8 +532,6 @@ empathy_account_widget_setup_widget (EmpathyAccountWidget *self,
     GtkWidget *widget,
     const gchar *param_name)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
-
   g_object_set_data_full (G_OBJECT (widget), "param_name",
       g_strdup (param_name), g_free);
 
@@ -546,28 +540,28 @@ empathy_account_widget_setup_widget (EmpathyAccountWidget *self,
       gint value = 0;
       const gchar *signature;
 
-      signature = empathy_account_settings_get_dbus_signature (priv->settings,
-          param_name);
+      signature = empathy_account_settings_get_dbus_signature (
+          self->priv->settings, param_name);
       g_return_if_fail (signature != NULL);
 
       switch ((int)*signature)
         {
           case DBUS_TYPE_INT16:
           case DBUS_TYPE_INT32:
-            value = empathy_account_settings_get_int32 (priv->settings,
+            value = empathy_account_settings_get_int32 (self->priv->settings,
               param_name);
             break;
           case DBUS_TYPE_INT64:
-            value = empathy_account_settings_get_int64 (priv->settings,
+            value = empathy_account_settings_get_int64 (self->priv->settings,
               param_name);
             break;
           case DBUS_TYPE_UINT16:
           case DBUS_TYPE_UINT32:
-            value = empathy_account_settings_get_uint32 (priv->settings,
+            value = empathy_account_settings_get_uint32 (self->priv->settings,
               param_name);
             break;
           case DBUS_TYPE_UINT64:
-            value = empathy_account_settings_get_uint64 (priv->settings,
+            value = empathy_account_settings_get_uint64 (self->priv->settings,
                 param_name);
             break;
           default:
@@ -584,13 +578,14 @@ empathy_account_widget_setup_widget (EmpathyAccountWidget *self,
     {
       const gchar *str = NULL;
 
-      str = empathy_account_settings_get_string (priv->settings, param_name);
+      str = empathy_account_settings_get_string (self->priv->settings,
+          param_name);
       gtk_entry_set_text (GTK_ENTRY (widget), str ? str : "");
 
       if (!tp_strdiff (param_name, "account"))
-        priv->param_account_widget = widget;
+        self->priv->param_account_widget = widget;
       else if (!tp_strdiff (param_name, "password"))
-        priv->param_password_widget = widget;
+        self->priv->param_password_widget = widget;
 
       if (strstr (param_name, "password"))
         {
@@ -624,7 +619,7 @@ empathy_account_widget_setup_widget (EmpathyAccountWidget *self,
     {
       gboolean value = FALSE;
 
-      value = empathy_account_settings_get_boolean (priv->settings,
+      value = empathy_account_settings_get_boolean (self->priv->settings,
           param_name);
       gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), value);
 
@@ -641,7 +636,8 @@ empathy_account_widget_setup_widget (EmpathyAccountWidget *self,
       GtkTreeIter iter;
       gboolean valid;
 
-      str = empathy_account_settings_get_string (priv->settings, param_name);
+      str = empathy_account_settings_get_string (self->priv->settings,
+          param_name);
       model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
 
       valid = gtk_tree_model_get_iter_first (model, &iter);
@@ -671,6 +667,10 @@ empathy_account_widget_setup_widget (EmpathyAccountWidget *self,
     {
       DEBUG ("Unknown type of widget for param %s", param_name);
     }
+
+  gtk_widget_set_sensitive (widget,
+      empathy_account_settings_param_is_supported (self->priv->settings,
+        param_name));
 }
 
 static GHashTable *
@@ -723,32 +723,38 @@ account_widget_generic_format_param_name (const gchar *param_name)
 
 static void
 accounts_widget_generic_setup (EmpathyAccountWidget *self,
-    GtkWidget *table_common_settings,
-    GtkWidget *table_advanced_settings)
+    GtkWidget *grid_common_settings,
+    GtkWidget *grid_advanced_settings)
 {
   TpConnectionManagerParam *params, *param;
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
+  guint row_common = 0, row_advanced = 0;
 
-  params = empathy_account_settings_get_tp_params (priv->settings);
+  params = empathy_account_settings_get_tp_params (self->priv->settings);
 
   for (param = params; param != NULL && param->name != NULL; param++)
     {
-      GtkWidget       *table_settings;
-      guint            n_rows = 0;
+      GtkWidget       *grid_settings;
+      guint           row;
       GtkWidget       *widget = NULL;
       gchar           *param_name_formatted;
 
       if (param->flags & TP_CONN_MGR_PARAM_FLAG_REQUIRED)
-        table_settings = table_common_settings;
-      else if (priv->simple)
-        return;
+        {
+          grid_settings = grid_common_settings;
+          row = row_common++;
+        }
+      else if (self->priv->simple)
+        {
+          return;
+        }
       else
-        table_settings = table_advanced_settings;
+        {
+          grid_settings = grid_advanced_settings;
+          row = row_advanced++;
+        }
 
       param_name_formatted = account_widget_generic_format_param_name
         (param->name);
-      g_object_get (table_settings, "n-rows", &n_rows, NULL);
-      gtk_table_resize (GTK_TABLE (table_settings), ++n_rows, 2);
 
       if (param->dbus_signature[0] == 's')
         {
@@ -759,12 +765,9 @@ accounts_widget_generic_setup (EmpathyAccountWidget *self,
           gtk_misc_set_alignment (GTK_MISC (widget), 0, 0.5);
           g_free (str);
 
-          gtk_table_attach (GTK_TABLE (table_settings),
-              widget,
-              0, 1,
-              n_rows - 1, n_rows,
-              GTK_FILL, 0,
-              0, 0);
+          gtk_grid_attach (GTK_GRID (grid_settings),
+              widget, 0, row, 1, 1);
+
           gtk_widget_show (widget);
 
           widget = gtk_entry_new ();
@@ -774,12 +777,10 @@ accounts_widget_generic_setup (EmpathyAccountWidget *self,
                   G_CALLBACK (gtk_widget_grab_focus),
                   NULL);
             }
-          gtk_table_attach (GTK_TABLE (table_settings),
-              widget,
-              1, 2,
-              n_rows - 1, n_rows,
-              GTK_FILL | GTK_EXPAND, 0,
-              0, 0);
+
+          gtk_grid_attach (GTK_GRID (grid_settings),
+              widget, 1, row, 1, 1);
+
           gtk_widget_show (widget);
         }
       /* int types: ynqiuxt. double type is 'd' */
@@ -816,32 +817,20 @@ accounts_widget_generic_setup (EmpathyAccountWidget *self,
           gtk_misc_set_alignment (GTK_MISC (widget), 0, 0.5);
           g_free (str);
 
-          gtk_table_attach (GTK_TABLE (table_settings),
-              widget,
-              0, 1,
-              n_rows - 1, n_rows,
-              GTK_FILL, 0,
-              0, 0);
+          gtk_grid_attach (GTK_GRID (grid_settings),
+              widget, 0, row, 1, 1);
           gtk_widget_show (widget);
 
           widget = gtk_spin_button_new_with_range (minint, maxint, step);
-          gtk_table_attach (GTK_TABLE (table_settings),
-              widget,
-              1, 2,
-              n_rows - 1, n_rows,
-              GTK_FILL | GTK_EXPAND, 0,
-              0, 0);
+          gtk_grid_attach (GTK_GRID (grid_settings),
+              widget, 1, row, 1, 1);
           gtk_widget_show (widget);
         }
       else if (param->dbus_signature[0] == 'b')
         {
           widget = gtk_check_button_new_with_label (param_name_formatted);
-          gtk_table_attach (GTK_TABLE (table_settings),
-              widget,
-              0, 2,
-              n_rows - 1, n_rows,
-              GTK_FILL | GTK_EXPAND, 0,
-              0, 0);
+          gtk_grid_attach (GTK_GRID (grid_settings),
+              widget, 0, row, 2, 1);
           gtk_widget_show (widget);
         }
       else
@@ -888,6 +877,7 @@ account_widget_cancel_clicked_cb (GtkWidget *button,
     EmpathyAccountWidget *self)
 {
   g_signal_emit (self, signals[CANCELLED], 0);
+  g_signal_emit (self, signals[CLOSE], 0, GTK_RESPONSE_CANCEL);
 }
 
 static void
@@ -897,8 +887,7 @@ account_widget_account_enabled_cb (GObject *source_object,
 {
   GError *error = NULL;
   TpAccount *account = TP_ACCOUNT (source_object);
-  EmpathyAccountWidget *widget = EMPATHY_ACCOUNT_WIDGET (user_data);
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (widget);
+  EmpathyAccountWidget *self = EMPATHY_ACCOUNT_WIDGET (user_data);
 
   tp_account_set_enabled_finish (account, res, &error);
 
@@ -909,11 +898,11 @@ account_widget_account_enabled_cb (GObject *source_object,
     }
   else
     {
-      empathy_connect_new_account (account, priv->account_manager);
+      empathy_connect_new_account (account, self->priv->account_manager);
     }
 
-  /* unref widget - part of the workaround */
-  g_object_unref (widget);
+  /* unref self - part of the workaround */
+  g_object_unref (self);
 }
 
 static void
@@ -924,8 +913,7 @@ account_widget_applied_cb (GObject *source_object,
   GError *error = NULL;
   TpAccount *account;
   EmpathyAccountSettings *settings = EMPATHY_ACCOUNT_SETTINGS (source_object);
-  EmpathyAccountWidget *widget = EMPATHY_ACCOUNT_WIDGET (user_data);
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (widget);
+  EmpathyAccountWidget *self = EMPATHY_ACCOUNT_WIDGET (user_data);
   gboolean reconnect_required;
 
   empathy_account_settings_apply_finish (settings, res, &reconnect_required,
@@ -938,34 +926,23 @@ account_widget_applied_cb (GObject *source_object,
       return;
     }
 
-  account = empathy_account_settings_get_account (priv->settings);
+  account = empathy_account_settings_get_account (self->priv->settings);
 
   if (account != NULL)
     {
-      if (priv->creating_account)
+      if (self->priv->creating_account)
         {
           /* By default, when an account is created, we enable it. */
 
-          /* workaround to keep widget alive during async call */
-          g_object_ref (widget);
+          /* workaround to keep self alive during async call */
+          g_object_ref (self);
 
           tp_account_set_enabled_async (account, TRUE,
-              account_widget_account_enabled_cb, widget);
-          g_signal_emit (widget, signals[ACCOUNT_CREATED], 0, account);
+              account_widget_account_enabled_cb, self);
+          g_signal_emit (self, signals[ACCOUNT_CREATED], 0, account);
         }
-      else if (priv->enabled_checkbox != NULL)
+      else
         {
-          gboolean enabled_checked;
-
-          enabled_checked =
-#ifdef HAVE_MEEGO
-            mx_gtk_light_switch_get_active (
-                MX_GTK_LIGHT_SWITCH (priv->enabled_checkbox));
-#else
-            gtk_toggle_button_get_active (
-                GTK_TOGGLE_BUTTON (priv->enabled_checkbox));
-#endif /* HAVE_MEEGO */
-
           /* If the account was offline, we always want to try reconnecting,
            * to give it a chance to connect if the previous params were wrong.
            * tp_account_reconnect_async() won't do anything if the requested
@@ -975,7 +952,7 @@ account_widget_applied_cb (GObject *source_object,
             reconnect_required = TRUE;
 
           if (reconnect_required && tp_account_is_enabled (account)
-              && enabled_checked)
+              && tp_account_is_enabled (account))
             {
               /* After having applied changes to a user account, we
                * reconnect it if needed. This is done so the new
@@ -985,34 +962,37 @@ account_widget_applied_cb (GObject *source_object,
         }
     }
 
-  if (!priv->destroyed)
-    account_widget_set_control_buttons_sensitivity (widget, FALSE);
+  if (!self->priv->destroyed)
+    account_widget_set_control_buttons_sensitivity (self, FALSE);
+
+  self->priv->contains_pending_changes = FALSE;
 
-  priv->contains_pending_changes = FALSE;
+  /* announce the widget can be closed */
+  g_signal_emit (self, signals[CLOSE], 0, GTK_RESPONSE_APPLY);
 
   /* unref the widget - part of the workaround */
-  g_object_unref (widget);
+  g_object_unref (self);
 }
 
 static void
 account_widget_apply_and_log_in (EmpathyAccountWidget *self)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
   gboolean display_name_overridden;
 
-  if (priv->radiobutton_reuse != NULL)
+  if (self->priv->radiobutton_reuse != NULL)
     {
       gboolean reuse = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (
-            priv->radiobutton_reuse));
+            self->priv->radiobutton_reuse));
 
       DEBUG ("Set register param: %d", !reuse);
-      empathy_account_settings_set_boolean (priv->settings, "register", !reuse);
+      empathy_account_settings_set_boolean (self->priv->settings, "register",
+          !reuse);
     }
 
-  g_object_get (priv->settings,
+  g_object_get (self->priv->settings,
       "display-name-overridden", &display_name_overridden, NULL);
 
-  if (priv->creating_account || !display_name_overridden)
+  if (self->priv->creating_account || !display_name_overridden)
     {
       gchar *display_name;
 
@@ -1020,7 +1000,7 @@ account_widget_apply_and_log_in (EmpathyAccountWidget *self)
        * manually override it. */
       display_name = empathy_account_widget_get_default_display_name (self);
 
-      empathy_account_settings_set_display_name_async (priv->settings,
+      empathy_account_settings_set_display_name_async (self->priv->settings,
           display_name, NULL, NULL);
 
       g_free (display_name);
@@ -1028,7 +1008,7 @@ account_widget_apply_and_log_in (EmpathyAccountWidget *self)
 
   /* workaround to keep widget alive during async call */
   g_object_ref (self);
-  empathy_account_settings_apply_async (priv->settings,
+  empathy_account_settings_apply_async (self->priv->settings,
       account_widget_applied_cb, self);
 }
 
@@ -1042,16 +1022,16 @@ account_widget_apply_clicked_cb (GtkWidget *button,
 static void
 account_widget_setup_generic (EmpathyAccountWidget *self)
 {
-  GtkWidget *table_common_settings;
-  GtkWidget *table_advanced_settings;
+  GtkWidget *grid_common_settings;
+  GtkWidget *grid_advanced_settings;
 
-  table_common_settings = GTK_WIDGET (gtk_builder_get_object
-      (self->ui_details->gui, "table_common_settings"));
-  table_advanced_settings = GTK_WIDGET (gtk_builder_get_object
-      (self->ui_details->gui, "table_advanced_settings"));
+  grid_common_settings = GTK_WIDGET (gtk_builder_get_object
+      (self->ui_details->gui, "grid_common_settings"));
+  grid_advanced_settings = GTK_WIDGET (gtk_builder_get_object
+      (self->ui_details->gui, "grid_advanced_settings"));
 
-  accounts_widget_generic_setup (self, table_common_settings,
-      table_advanced_settings);
+  accounts_widget_generic_setup (self, grid_common_settings,
+      grid_advanced_settings);
 
   g_object_unref (self->ui_details->gui);
 }
@@ -1062,9 +1042,8 @@ account_widget_settings_ready_cb (EmpathyAccountSettings *settings,
     gpointer user_data)
 {
   EmpathyAccountWidget *self = user_data;
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
 
-  if (empathy_account_settings_is_ready (priv->settings))
+  if (empathy_account_settings_is_ready (self->priv->settings))
     account_widget_setup_generic (self);
 }
 
@@ -1072,146 +1051,34 @@ static void
 account_widget_build_generic (EmpathyAccountWidget *self,
     const char *filename)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
   GtkWidget *expander_advanced;
 
   self->ui_details->gui = empathy_builder_get_file (filename,
-      "table_common_settings", &priv->table_common_settings,
+      "grid_common_settings", &self->priv->grid_common_settings,
       "vbox_generic_settings", &self->ui_details->widget,
       "expander_advanced_settings", &expander_advanced,
       NULL);
 
-  if (priv->simple)
+  if (self->priv->simple)
     gtk_widget_hide (expander_advanced);
 
   g_object_ref (self->ui_details->gui);
 
-  if (empathy_account_settings_is_ready (priv->settings))
+  if (empathy_account_settings_is_ready (self->priv->settings))
     account_widget_setup_generic (self);
   else
-    g_signal_connect (priv->settings, "notify::ready",
+    g_signal_connect (self->priv->settings, "notify::ready",
         G_CALLBACK (account_widget_settings_ready_cb), self);
 }
 
-static void
-account_widget_launch_external_clicked (GtkWidget *button,
-    TpAccount *account)
-{
-  if (!tp_strdiff (tp_account_get_storage_provider (account),
-        "com.meego.libsocialweb"))
-    {
-      /* we know how to handle this external provider */
-      GDesktopAppInfo *desktop_info;
-      GError *error = NULL;
-      GdkAppLaunchContext *context = NULL;
-      GdkDisplay *display;
-      gchar *cmd;
-      GAppInfo *app_info;
-
-      desktop_info = g_desktop_app_info_new ("gnome-control-center.desktop");
-      if (desktop_info == NULL)
-        {
-          g_critical ("Could not locate 'gnome-control-center.desktop'");
-          return;
-        }
-
-      /* glib doesn't have API to start a desktop file with args... (#637875) */
-      cmd = g_strdup_printf ("%s bisho.desktop", g_app_info_get_commandline (
-            (GAppInfo *) desktop_info));
-
-      app_info = g_app_info_create_from_commandline (cmd, NULL, 0, &error);
-      g_free (cmd);
-
-      if (app_info == NULL)
-        {
-          DEBUG ("Failed to create app info: %s", error->message);
-          g_error_free (error);
-          goto out;
-        }
-
-      display = gdk_display_get_default ();
-      context = gdk_display_get_app_launch_context (display);
-
-      if (!g_app_info_launch (app_info, NULL, (GAppLaunchContext *) context,
-            &error))
-        {
-          g_critical ("Failed to bisho: %s", error->message);
-          g_clear_error (&error);
-        }
-
-out:
-      g_object_unref (desktop_info);
-      tp_clear_object (&app_info);
-      tp_clear_object (&context);
-    }
-}
-
-static void
-account_widget_build_external (EmpathyAccountWidget *self,
-    EmpathyAccountSettings *settings)
-{
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
-  TpAccount *account = empathy_account_settings_get_account (settings);
-  GtkWidget *bar, *widget;
-  gchar *str;
-
-  self->ui_details->widget = gtk_vbox_new (FALSE, 6);
-  priv->table_common_settings = gtk_table_new (1, 2, FALSE);
-
-  if (!tp_strdiff (tp_account_get_storage_provider (account),
-        "com.meego.libsocialweb"))
-    {
-      /* we know how to handle this external provider */
-      str = g_strdup_printf (
-          _("The account %s is edited via My Web Accounts."),
-          empathy_account_settings_get_display_name (settings));
-    }
-  else
-    {
-      str = g_strdup_printf (
-          _("The account %s cannot be edited in Empathy."),
-          empathy_account_settings_get_display_name (settings));
-    }
-
-  widget = gtk_label_new (str);
-  gtk_label_set_line_wrap (GTK_LABEL (widget), TRUE);
-  g_free (str);
-
-  bar = gtk_info_bar_new ();
-  gtk_info_bar_set_message_type (GTK_INFO_BAR (bar), GTK_MESSAGE_INFO);
-  gtk_container_add (
-      GTK_CONTAINER (gtk_info_bar_get_content_area (GTK_INFO_BAR (bar))),
-      widget);
-  gtk_container_set_border_width (GTK_CONTAINER (bar), 6);
-
-  if (!tp_strdiff (tp_account_get_storage_provider (account),
-        "com.meego.libsocialweb"))
-    {
-      /* we know how to handle this external provider */
-      widget = gtk_info_bar_add_button (GTK_INFO_BAR (bar),
-          _("Launch My Web Accounts"), RESPONSE_LAUNCH);
-
-      g_signal_connect (widget, "clicked",
-          G_CALLBACK (account_widget_launch_external_clicked), account);
-    }
-
-  gtk_box_pack_start (GTK_BOX (self->ui_details->widget), bar,
-      FALSE, TRUE, 0);
-  gtk_box_pack_start (GTK_BOX (self->ui_details->widget),
-      priv->table_common_settings, FALSE, TRUE, 0);
-
-  gtk_widget_show_all (self->ui_details->widget);
-}
-
 static void
 account_widget_build_salut (EmpathyAccountWidget *self,
     const char *filename)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
   GtkWidget *expander_advanced;
 
   self->ui_details->gui = empathy_builder_get_file (filename,
-      "table_common_settings", &priv->table_common_settings,
+      "grid_common_settings", &self->priv->grid_common_settings,
       "vbox_salut_settings", &self->ui_details->widget,
       "expander_advanced_settings", &expander_advanced,
       NULL);
@@ -1225,7 +1092,7 @@ account_widget_build_salut (EmpathyAccountWidget *self,
       "entry_jid", "jid",
       NULL);
 
-  if (priv->simple)
+  if (self->priv->simple)
     gtk_widget_hide (expander_advanced);
 
   self->ui_details->default_focus = g_strdup ("entry_first_name");
@@ -1235,20 +1102,20 @@ static void
 account_widget_build_irc (EmpathyAccountWidget *self,
   const char *filename)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
-
-  empathy_account_settings_set_regex (priv->settings, "account",
+  empathy_account_settings_set_regex (self->priv->settings, "account",
       ACCOUNT_REGEX_IRC);
+  empathy_account_settings_set_regex (self->priv->settings, "username",
+      USERNAME_REGEX_IRC);
 
-  if (priv->simple)
+  if (self->priv->simple)
     {
-      priv->irc_network_chooser = empathy_account_widget_irc_build_simple (self,
-          filename);
+      self->priv->irc_network_chooser = empathy_account_widget_irc_build_simple
+        (self, filename);
     }
   else
     {
-      priv->irc_network_chooser = empathy_account_widget_irc_build (self,
-          filename, &priv->table_common_settings);
+      self->priv->irc_network_chooser = empathy_account_widget_irc_build (self,
+          filename, &self->priv->grid_common_settings);
     }
 }
 
@@ -1256,19 +1123,19 @@ static void
 account_widget_build_sip (EmpathyAccountWidget *self,
   const char *filename)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
   empathy_account_widget_sip_build (self, filename,
-    &priv->table_common_settings);
+    &self->priv->grid_common_settings);
 
-  if (priv->simple)
+  if (self->priv->simple)
     {
-      priv->remember_password_widget = GTK_WIDGET (gtk_builder_get_object (
-              self->ui_details->gui, "remember_password_simple"));
+      self->priv->remember_password_widget = GTK_WIDGET (
+          gtk_builder_get_object (self->ui_details->gui,
+            "remember_password_simple"));
     }
   else
     {
-      priv->remember_password_widget = GTK_WIDGET (gtk_builder_get_object (
-              self->ui_details->gui, "remember_password"));
+      self->priv->remember_password_widget = GTK_WIDGET (
+          gtk_builder_get_object (self->ui_details->gui, "remember_password"));
     }
 }
 
@@ -1276,12 +1143,10 @@ static void
 account_widget_build_msn (EmpathyAccountWidget *self,
     const char *filename)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
-
-  empathy_account_settings_set_regex (priv->settings, "account",
+  empathy_account_settings_set_regex (self->priv->settings, "account",
       ACCOUNT_REGEX_MSN);
 
-  if (priv->simple)
+  if (self->priv->simple)
     {
       self->ui_details->gui = empathy_builder_get_file (filename,
           "vbox_msn_simple", &self->ui_details->widget,
@@ -1294,13 +1159,14 @@ account_widget_build_msn (EmpathyAccountWidget *self,
 
       self->ui_details->default_focus = g_strdup ("entry_id_simple");
 
-      priv->remember_password_widget = GTK_WIDGET (gtk_builder_get_object (
-              self->ui_details->gui, "remember_password_simple"));
+      self->priv->remember_password_widget = GTK_WIDGET (
+          gtk_builder_get_object (self->ui_details->gui,
+            "remember_password_simple"));
     }
   else
     {
       self->ui_details->gui = empathy_builder_get_file (filename,
-          "table_common_msn_settings", &priv->table_common_settings,
+          "grid_common_msn_settings", &self->priv->grid_common_settings,
           "vbox_msn_settings", &self->ui_details->widget,
           NULL);
 
@@ -1313,8 +1179,8 @@ account_widget_build_msn (EmpathyAccountWidget *self,
 
       self->ui_details->default_focus = g_strdup ("entry_id");
 
-      priv->remember_password_widget = GTK_WIDGET (gtk_builder_get_object (
-              self->ui_details->gui, "remember_password"));
+      self->priv->remember_password_widget = GTK_WIDGET (
+          gtk_builder_get_object (self->ui_details->gui, "remember_password"));
     }
 }
 
@@ -1322,24 +1188,25 @@ static void
 suffix_id_widget_changed_cb (GtkWidget *entry,
     EmpathyAccountWidget *self)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
   const gchar *account;
 
-  g_assert (priv->jid_suffix != NULL);
+  g_assert (self->priv->jid_suffix != NULL);
 
   account_widget_entry_changed_common (self, GTK_ENTRY (entry), FALSE);
 
-  account = empathy_account_settings_get_string (priv->settings, "account");
+  account = empathy_account_settings_get_string (self->priv->settings,
+      "account");
   if (!EMP_STR_EMPTY (account) &&
-      !g_str_has_suffix (account, priv->jid_suffix))
+      !g_str_has_suffix (account, self->priv->jid_suffix))
     {
       gchar *tmp;
 
-      tmp = g_strdup_printf ("%s%s", account, priv->jid_suffix);
+      tmp = g_strdup_printf ("%s%s", account, self->priv->jid_suffix);
 
       DEBUG ("Change account from '%s' to '%s'", account, tmp);
 
-      empathy_account_settings_set_string (priv->settings, "account", tmp);
+      empathy_account_settings_set_string (self->priv->settings, "account",
+          tmp);
       g_free (tmp);
     }
 
@@ -1350,14 +1217,12 @@ static gchar *
 remove_jid_suffix (EmpathyAccountWidget *self,
     const gchar *str)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
-
-  g_assert (priv->jid_suffix != NULL);
+  g_assert (self->priv->jid_suffix != NULL);
 
-  if (!g_str_has_suffix (str, priv->jid_suffix))
+  if (!g_str_has_suffix (str, self->priv->jid_suffix))
     return g_strdup (str);
 
-  return g_strndup (str, strlen (str) - strlen (priv->jid_suffix));
+  return g_strndup (str, strlen (str) - strlen (self->priv->jid_suffix));
 }
 
 static void
@@ -1365,16 +1230,15 @@ setup_id_widget_with_suffix (EmpathyAccountWidget *self,
     GtkWidget *widget,
     const gchar *suffix)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
   const gchar *str = NULL;
 
   g_object_set_data_full (G_OBJECT (widget), "param_name",
       g_strdup ("account"), g_free);
 
-  g_assert (priv->jid_suffix == NULL);
-  priv->jid_suffix = g_strdup (suffix);
+  g_assert (self->priv->jid_suffix == NULL);
+  self->priv->jid_suffix = g_strdup (suffix);
 
-  str = empathy_account_settings_get_string (priv->settings, "account");
+  str = empathy_account_settings_get_string (self->priv->settings, "account");
   if (str != NULL)
     {
       gchar *tmp;
@@ -1384,7 +1248,7 @@ setup_id_widget_with_suffix (EmpathyAccountWidget *self,
       g_free (tmp);
     }
 
-  priv->param_account_widget = widget;
+  self->priv->param_account_widget = widget;
 
   g_signal_connect (widget, "changed",
       G_CALLBACK (suffix_id_widget_changed_cb), self);
@@ -1393,11 +1257,10 @@ setup_id_widget_with_suffix (EmpathyAccountWidget *self,
 static Service
 account_widget_get_service (EmpathyAccountWidget *self)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
   const gchar *icon_name, *service;
 
-  icon_name = empathy_account_settings_get_icon_name (priv->settings);
-  service = empathy_account_settings_get_service (priv->settings);
+  icon_name = empathy_account_settings_get_icon_name (self->priv->settings);
+  service = empathy_account_settings_get_service (self->priv->settings);
 
   /* Previous versions of Empathy didn't set the Service property on Facebook
    * and gtalk accounts, so we check using the icon name as well. */
@@ -1416,7 +1279,6 @@ static void
 account_widget_build_jabber (EmpathyAccountWidget *self,
     const char *filename)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
   GtkWidget *spinbutton_port;
   GtkWidget *checkbutton_ssl;
   GtkWidget *label_id, *label_password;
@@ -1429,10 +1291,10 @@ account_widget_build_jabber (EmpathyAccountWidget *self,
 
   service = account_widget_get_service (self);
 
-  empathy_account_settings_set_regex (priv->settings, "account",
+  empathy_account_settings_set_regex (self->priv->settings, "account",
       ACCOUNT_REGEX_JABBER);
 
-  if (priv->simple && service == NO_SERVICE)
+  if (self->priv->simple && service == NO_SERVICE)
     {
       /* Simple widget for XMPP */
       self->ui_details->gui = empathy_builder_get_file (filename,
@@ -1443,7 +1305,8 @@ account_widget_build_jabber (EmpathyAccountWidget *self,
           "label_password_create", &label_password_create,
           NULL);
 
-      if (empathy_account_settings_get_boolean (priv->settings, "register"))
+      if (empathy_account_settings_get_boolean (self->priv->settings,
+            "register"))
         {
           gtk_widget_hide (label_id);
           gtk_widget_hide (label_password);
@@ -1458,10 +1321,11 @@ account_widget_build_jabber (EmpathyAccountWidget *self,
 
       self->ui_details->default_focus = g_strdup ("entry_id_simple");
 
-      priv->remember_password_widget = GTK_WIDGET (gtk_builder_get_object (
-              self->ui_details->gui, "remember_password_simple"));
+      self->priv->remember_password_widget = GTK_WIDGET (
+          gtk_builder_get_object (self->ui_details->gui,
+            "remember_password_simple"));
     }
-  else if (priv->simple && service == GTALK_SERVICE)
+  else if (self->priv->simple && service == GTALK_SERVICE)
     {
       /* Simple widget for Google Talk */
       self->ui_details->gui = empathy_builder_get_file (filename,
@@ -1475,10 +1339,11 @@ account_widget_build_jabber (EmpathyAccountWidget *self,
 
       self->ui_details->default_focus = g_strdup ("entry_id_g_simple");
 
-      priv->remember_password_widget = GTK_WIDGET (gtk_builder_get_object (
-              self->ui_details->gui, "remember_password_g_simple"));
+      self->priv->remember_password_widget = GTK_WIDGET (
+          gtk_builder_get_object (self->ui_details->gui,
+            "remember_password_g_simple"));
     }
-  else if (priv->simple && service == FACEBOOK_SERVICE)
+  else if (self->priv->simple && service == FACEBOOK_SERVICE)
     {
       /* Simple widget for Facebook */
       self->ui_details->gui = empathy_builder_get_file (filename,
@@ -1494,8 +1359,9 @@ account_widget_build_jabber (EmpathyAccountWidget *self,
 
       self->ui_details->default_focus = g_strdup ("entry_id_fb_simple");
 
-      priv->remember_password_widget = GTK_WIDGET (gtk_builder_get_object (
-              self->ui_details->gui, "remember_password_fb_simple"));
+      self->priv->remember_password_widget = GTK_WIDGET (
+          gtk_builder_get_object (self->ui_details->gui,
+            "remember_password_fb_simple"));
     }
   else
     {
@@ -1503,7 +1369,7 @@ account_widget_build_jabber (EmpathyAccountWidget *self,
 
       /* Full widget for XMPP, Google Talk and Facebook*/
       self->ui_details->gui = empathy_builder_get_file (filename,
-          "table_common_settings", &priv->table_common_settings,
+          "grid_common_settings", &self->priv->grid_common_settings,
           "vbox_jabber_settings", &self->ui_details->widget,
           "spinbutton_port", &spinbutton_port,
           "checkbutton_ssl", &checkbutton_ssl,
@@ -1539,10 +1405,10 @@ account_widget_build_jabber (EmpathyAccountWidget *self,
         }
 
       self->ui_details->default_focus = g_strdup ("entry_id");
-      priv->spinbutton_port = spinbutton_port;
+      self->priv->spinbutton_port = spinbutton_port;
 
-      priv->remember_password_widget = GTK_WIDGET (gtk_builder_get_object (
-              self->ui_details->gui, "remember_password"));
+      self->priv->remember_password_widget = GTK_WIDGET (
+          gtk_builder_get_object (self->ui_details->gui, "remember_password"));
 
       g_signal_connect (checkbutton_ssl, "toggled",
           G_CALLBACK (account_widget_jabber_ssl_toggled_cb),
@@ -1572,13 +1438,12 @@ static void
 account_widget_build_icq (EmpathyAccountWidget *self,
     const char *filename)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
   GtkWidget *spinbutton_port;
 
-  empathy_account_settings_set_regex (priv->settings, "account",
+  empathy_account_settings_set_regex (self->priv->settings, "account",
       ACCOUNT_REGEX_ICQ);
 
-  if (priv->simple)
+  if (self->priv->simple)
     {
       self->ui_details->gui = empathy_builder_get_file (filename,
           "vbox_icq_simple", &self->ui_details->widget,
@@ -1591,13 +1456,14 @@ account_widget_build_icq (EmpathyAccountWidget *self,
 
       self->ui_details->default_focus = g_strdup ("entry_uin_simple");
 
-      priv->remember_password_widget = GTK_WIDGET (gtk_builder_get_object (
-              self->ui_details->gui, "remember_password_simple"));
+      self->priv->remember_password_widget = GTK_WIDGET (
+          gtk_builder_get_object (self->ui_details->gui,
+            "remember_password_simple"));
     }
   else
     {
       self->ui_details->gui = empathy_builder_get_file (filename,
-          "table_common_settings", &priv->table_common_settings,
+          "grid_common_settings", &self->priv->grid_common_settings,
           "vbox_icq_settings", &self->ui_details->widget,
           "spinbutton_port", &spinbutton_port,
           NULL);
@@ -1612,8 +1478,8 @@ account_widget_build_icq (EmpathyAccountWidget *self,
 
       self->ui_details->default_focus = g_strdup ("entry_uin");
 
-      priv->remember_password_widget = GTK_WIDGET (gtk_builder_get_object (
-              self->ui_details->gui, "remember_password"));
+      self->priv->remember_password_widget = GTK_WIDGET (
+          gtk_builder_get_object (self->ui_details->gui, "remember_password"));
     }
 }
 
@@ -1621,10 +1487,9 @@ static void
 account_widget_build_aim (EmpathyAccountWidget *self,
     const char *filename)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
   GtkWidget *spinbutton_port;
 
-  if (priv->simple)
+  if (self->priv->simple)
     {
       self->ui_details->gui = empathy_builder_get_file (filename,
           "vbox_aim_simple", &self->ui_details->widget,
@@ -1637,13 +1502,14 @@ account_widget_build_aim (EmpathyAccountWidget *self,
 
       self->ui_details->default_focus = g_strdup ("entry_screenname_simple");
 
-      priv->remember_password_widget = GTK_WIDGET (gtk_builder_get_object (
-              self->ui_details->gui, "remember_password_simple"));
+      self->priv->remember_password_widget = GTK_WIDGET (
+          gtk_builder_get_object (self->ui_details->gui,
+            "remember_password_simple"));
     }
   else
     {
       self->ui_details->gui = empathy_builder_get_file (filename,
-          "table_common_settings", &priv->table_common_settings,
+          "grid_common_settings", &self->priv->grid_common_settings,
           "vbox_aim_settings", &self->ui_details->widget,
           "spinbutton_port", &spinbutton_port,
           NULL);
@@ -1657,8 +1523,8 @@ account_widget_build_aim (EmpathyAccountWidget *self,
 
       self->ui_details->default_focus = g_strdup ("entry_screenname");
 
-      priv->remember_password_widget = GTK_WIDGET (gtk_builder_get_object (
-              self->ui_details->gui, "remember_password"));
+      self->priv->remember_password_widget = GTK_WIDGET (
+          gtk_builder_get_object (self->ui_details->gui, "remember_password"));
     }
 }
 
@@ -1666,12 +1532,10 @@ static void
 account_widget_build_yahoo (EmpathyAccountWidget *self,
     const char *filename)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
-
-  empathy_account_settings_set_regex (priv->settings, "account",
+  empathy_account_settings_set_regex (self->priv->settings, "account",
       ACCOUNT_REGEX_YAHOO);
 
-  if (priv->simple)
+  if (self->priv->simple)
     {
       self->ui_details->gui = empathy_builder_get_file (filename,
           "vbox_yahoo_simple", &self->ui_details->widget,
@@ -1684,13 +1548,14 @@ account_widget_build_yahoo (EmpathyAccountWidget *self,
 
       self->ui_details->default_focus = g_strdup ("entry_id_simple");
 
-      priv->remember_password_widget = GTK_WIDGET (gtk_builder_get_object (
-              self->ui_details->gui, "remember_password_simple"));
+      self->priv->remember_password_widget = GTK_WIDGET (
+          gtk_builder_get_object (self->ui_details->gui,
+            "remember_password_simple"));
     }
   else
     {
       self->ui_details->gui = empathy_builder_get_file (filename,
-          "table_common_settings", &priv->table_common_settings,
+          "grid_common_settings", &self->priv->grid_common_settings,
           "vbox_yahoo_settings", &self->ui_details->widget,
           NULL);
 
@@ -1705,8 +1570,8 @@ account_widget_build_yahoo (EmpathyAccountWidget *self,
 
       self->ui_details->default_focus = g_strdup ("entry_id");
 
-      priv->remember_password_widget = GTK_WIDGET (gtk_builder_get_object (
-              self->ui_details->gui, "remember_password"));
+      self->priv->remember_password_widget = GTK_WIDGET (
+          gtk_builder_get_object (self->ui_details->gui, "remember_password"));
     }
 }
 
@@ -1714,9 +1579,7 @@ static void
 account_widget_build_groupwise (EmpathyAccountWidget *self,
     const char *filename)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
-
-  if (priv->simple)
+  if (self->priv->simple)
     {
       self->ui_details->gui = empathy_builder_get_file (filename,
           "vbox_groupwise_simple", &self->ui_details->widget,
@@ -1729,13 +1592,14 @@ account_widget_build_groupwise (EmpathyAccountWidget *self,
 
       self->ui_details->default_focus = g_strdup ("entry_id_simple");
 
-      priv->remember_password_widget = GTK_WIDGET (gtk_builder_get_object (
-              self->ui_details->gui, "remember_password_simple"));
+      self->priv->remember_password_widget = GTK_WIDGET (
+          gtk_builder_get_object (self->ui_details->gui,
+            "remember_password_simple"));
     }
   else
     {
       self->ui_details->gui = empathy_builder_get_file (filename,
-          "table_common_groupwise_settings", &priv->table_common_settings,
+          "grid_common_groupwise_settings", &self->priv->grid_common_settings,
           "vbox_groupwise_settings", &self->ui_details->widget,
           NULL);
 
@@ -1748,8 +1612,8 @@ account_widget_build_groupwise (EmpathyAccountWidget *self,
 
       self->ui_details->default_focus = g_strdup ("entry_id");
 
-      priv->remember_password_widget = GTK_WIDGET (gtk_builder_get_object (
-              self->ui_details->gui, "remember_password"));
+      self->priv->remember_password_widget = GTK_WIDGET (
+          gtk_builder_get_object (self->ui_details->gui, "remember_password"));
     }
 }
 
@@ -1757,71 +1621,19 @@ static void
 account_widget_destroy_cb (GtkWidget *widget,
     EmpathyAccountWidget *self)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
   /* set the destroyed flag - workaround */
-  priv->destroyed = TRUE;
+  self->priv->destroyed = TRUE;
 
   g_object_unref (self);
 }
 
-static void
-empathy_account_widget_enabled_cb (TpAccount *account,
-      GParamSpec *spec,
-      gpointer user_data)
-{
-  EmpathyAccountWidget *widget = EMPATHY_ACCOUNT_WIDGET (user_data);
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (widget);
-  gboolean enabled = tp_account_is_enabled (account);
-
-  if (priv->enabled_checkbox != NULL)
-    {
-#ifdef HAVE_MEEGO
-      mx_gtk_light_switch_set_active (
-          MX_GTK_LIGHT_SWITCH (priv->enabled_checkbox),
-          enabled);
-#else
-      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->enabled_checkbox),
-          enabled);
-#endif /* HAVE_MEEGO */
-    }
-}
-
-static void
-#ifdef HAVE_MEEGO
-account_widget_switch_flipped_cb (MxGtkLightSwitch *sw,
-    gboolean state,
-    gpointer user_data)
-#else
-account_widget_enabled_toggled_cb (GtkToggleButton *toggle_button,
-    gpointer user_data)
-#endif /* HAVE_MEEGO */
-{
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (user_data);
-  TpAccount *account;
-#ifndef HAVE_MEEGO
-  gboolean state;
-
-  state = gtk_toggle_button_get_active (toggle_button);
-#endif /* HAVE_MEEGO */
-
-  account = empathy_account_settings_get_account (priv->settings);
-
-  /* Enable the account according to the value of the "Enabled" checkbox */
-  /* workaround to keep widget alive during async call */
-  g_object_ref (user_data);
-  tp_account_set_enabled_async (account, state,
-      account_widget_account_enabled_cb, user_data);
-}
-
 void
 empathy_account_widget_set_other_accounts_exist (EmpathyAccountWidget *self,
     gboolean others_exist)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
-
-  priv->other_accounts_exist = others_exist;
+  self->priv->other_accounts_exist = others_exist;
 
-  if (priv->creating_account)
+  if (self->priv->creating_account)
     account_widget_handle_control_buttons_sensitivity (self);
 }
 
@@ -1831,18 +1643,18 @@ do_set_property (GObject *object,
     const GValue *value,
     GParamSpec *pspec)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (object);
+  EmpathyAccountWidget *self = EMPATHY_ACCOUNT_WIDGET (object);
 
   switch (prop_id)
     {
     case PROP_SETTINGS:
-      priv->settings = g_value_dup_object (value);
+      self->priv->settings = g_value_dup_object (value);
       break;
     case PROP_SIMPLE:
-      priv->simple = g_value_get_boolean (value);
+      self->priv->simple = g_value_get_boolean (value);
       break;
     case PROP_CREATING_ACCOUNT:
-      priv->creating_account = g_value_get_boolean (value);
+      self->priv->creating_account = g_value_get_boolean (value);
       break;
     case PROP_OTHER_ACCOUNTS_EXIST:
       empathy_account_widget_set_other_accounts_exist (
@@ -1859,25 +1671,25 @@ do_get_property (GObject *object,
     GValue *value,
     GParamSpec *pspec)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (object);
+  EmpathyAccountWidget *self = EMPATHY_ACCOUNT_WIDGET (object);
 
   switch (prop_id)
     {
     case PROP_PROTOCOL:
       g_value_set_string (value,
-        empathy_account_settings_get_protocol (priv->settings));
+        empathy_account_settings_get_protocol (self->priv->settings));
       break;
     case PROP_SETTINGS:
-      g_value_set_object (value, priv->settings);
+      g_value_set_object (value, self->priv->settings);
       break;
     case PROP_SIMPLE:
-      g_value_set_boolean (value, priv->simple);
+      g_value_set_boolean (value, self->priv->simple);
       break;
     case PROP_CREATING_ACCOUNT:
-      g_value_set_boolean (value, priv->creating_account);
+      g_value_set_boolean (value, self->priv->creating_account);
       break;
     case PROP_OTHER_ACCOUNTS_EXIST:
-      g_value_set_boolean (value, priv->other_accounts_exist);
+      g_value_set_boolean (value, self->priv->other_accounts_exist);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -1887,18 +1699,17 @@ do_get_property (GObject *object,
 static void
 set_apply_button (EmpathyAccountWidget *self)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
   GtkWidget *image;
 
   /* We can't use the stock button as its accelerator ('A') clashes with the
    * Add button. */
-  gtk_button_set_use_stock (GTK_BUTTON (priv->apply_button), FALSE);
+  gtk_button_set_use_stock (GTK_BUTTON (self->priv->apply_button), FALSE);
 
-  gtk_button_set_label (GTK_BUTTON (priv->apply_button), _("A_pply"));
-  gtk_button_set_use_underline (GTK_BUTTON (priv->apply_button), TRUE);
+  gtk_button_set_label (GTK_BUTTON (self->priv->apply_button), _("A_pply"));
+  gtk_button_set_use_underline (GTK_BUTTON (self->priv->apply_button), TRUE);
 
   image = gtk_image_new_from_stock (GTK_STOCK_APPLY, GTK_ICON_SIZE_BUTTON);
-  gtk_button_set_image (GTK_BUTTON (priv->apply_button), image);
+  gtk_button_set_image (GTK_BUTTON (self->priv->apply_button), image);
 }
 
 static void
@@ -1908,27 +1719,26 @@ presence_changed_cb (TpAccountManager *manager,
     const gchar *message,
     EmpathyAccountWidget *self)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
-
-  if (priv->destroyed)
+  if (self->priv->destroyed)
     return;
 
-  if (priv->apply_button == NULL)
+  if (self->priv->apply_button == NULL)
     /* This button doesn't exist in 'simple' mode */
     return;
 
   if (state > TP_CONNECTION_PRESENCE_TYPE_OFFLINE &&
-      priv->creating_account)
+      self->priv->creating_account)
     {
       /* We are online and creating a new account, display a Login button */
       GtkWidget *image;
 
-      gtk_button_set_use_stock (GTK_BUTTON (priv->apply_button), FALSE);
-      gtk_button_set_label (GTK_BUTTON (priv->apply_button), _("L_og in"));
+      gtk_button_set_use_stock (GTK_BUTTON (self->priv->apply_button), FALSE);
+      gtk_button_set_label (GTK_BUTTON (self->priv->apply_button),
+          _("L_og in"));
 
       image = gtk_image_new_from_stock (GTK_STOCK_CONNECT,
           GTK_ICON_SIZE_BUTTON);
-      gtk_button_set_image (GTK_BUTTON (priv->apply_button), image);
+      gtk_button_set_image (GTK_BUTTON (self->priv->apply_button), image);
     }
   else
     {
@@ -1948,7 +1758,7 @@ account_manager_ready_cb (GObject *source_object,
   GError *error = NULL;
   TpConnectionPresenceType state;
 
-  if (!tp_account_manager_prepare_finish (account_manager, result, &error))
+  if (!tp_proxy_prepare_finish (account_manager, result, &error))
     {
       DEBUG ("Failed to prepare account manager: %s", error->message);
       g_error_free (error);
@@ -1970,91 +1780,20 @@ out:
   { #cm, #proto, "empathy-account-widget-"#proto".ui", \
     account_widget_build_##proto }
 
-static void
-add_enable_checkbox (EmpathyAccountWidget *self,
-    TpAccount *account)
-{
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
-#ifdef HAVE_MEEGO
-  GtkWidget *w;
-#else
-  GtkWidget *vbox = self->ui_details->widget;
-#endif /* HAVE_MEEGO */
-  guint nb_rows, nb_columns;
-  gboolean is_enabled;
-
-  /* handle the "Enabled" checkbox. We only add it when modifying an account */
-  if (priv->creating_account || priv->table_common_settings == NULL)
-    return;
-
-  is_enabled = tp_account_is_enabled (account);
-
-#ifdef HAVE_MEEGO
-  w = gtk_label_new (_("Account:"));
-  gtk_misc_set_alignment (GTK_MISC (w), 0, 0.5);
-
-  priv->enabled_checkbox = mx_gtk_light_switch_new ();
-
-  mx_gtk_light_switch_set_active (
-      MX_GTK_LIGHT_SWITCH (priv->enabled_checkbox), is_enabled);
-
-  gtk_widget_show (w);
-#else
-  /* translators: this is the label of a checkbox used to enable/disable IM
-   * accounts */
-  priv->enabled_checkbox =
-      gtk_check_button_new_with_mnemonic (_("_Enabled"));
-
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->enabled_checkbox),
-      is_enabled);
-#endif /* HAVE_MEEGO */
-
-  g_object_get (priv->table_common_settings, "n-rows", &nb_rows,
-      "n-columns", &nb_columns, NULL);
-
-  gtk_table_resize (GTK_TABLE (priv->table_common_settings), ++nb_rows,
-      nb_columns);
-
-#ifdef HAVE_MEEGO
-  gtk_table_attach (GTK_TABLE (priv->table_common_settings),
-      w,
-      0, 1, nb_rows - 1, nb_rows,
-      GTK_FILL, 0, 0, 0);
-  gtk_table_attach (GTK_TABLE (priv->table_common_settings),
-      priv->enabled_checkbox,
-      1, nb_columns, nb_rows - 1, nb_rows,
-      GTK_EXPAND | GTK_FILL, 0, 0, 0);
-#else
-  gtk_box_pack_start (GTK_BOX (vbox), priv->enabled_checkbox, FALSE, FALSE, 0);
-  gtk_box_reorder_child (GTK_BOX (vbox), priv->enabled_checkbox, 0);
-#endif /* HAVE_MEEGO */
-
-  gtk_widget_show (priv->enabled_checkbox);
-
-#ifdef HAVE_MEEGO
-  g_signal_connect (G_OBJECT (priv->enabled_checkbox), "switch-flipped",
-      G_CALLBACK (account_widget_switch_flipped_cb), self);
-#else
-  g_signal_connect (G_OBJECT (priv->enabled_checkbox), "toggled",
-      G_CALLBACK (account_widget_enabled_toggled_cb), self);
-#endif /* HAVE_MEEGO */
-}
-
 #ifndef HAVE_MEEGO
 /* Meego doesn't support registration */
 static void
 add_register_buttons (EmpathyAccountWidget *self,
     TpAccount *account)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
   const TpConnectionManagerProtocol *protocol;
   GtkWidget *radiobutton_register;
   GtkWidget *vbox = self->ui_details->widget;
 
-  if (!priv->creating_account)
+  if (!self->priv->creating_account)
     return;
 
-  protocol = empathy_account_settings_get_tp_protocol (priv->settings);
+  protocol = empathy_account_settings_get_tp_protocol (self->priv->settings);
   if (protocol == NULL)
     return;
 
@@ -2064,20 +1803,22 @@ add_register_buttons (EmpathyAccountWidget *self,
   if (account_widget_get_service (self) != NO_SERVICE)
     return;
 
-  if (priv->simple)
+  if (self->priv->simple)
     return;
 
-  priv->radiobutton_reuse = gtk_radio_button_new_with_label (NULL,
+  self->priv->radiobutton_reuse = gtk_radio_button_new_with_label (NULL,
       _("This account already exists on the server"));
   radiobutton_register = gtk_radio_button_new_with_label (
-      gtk_radio_button_get_group (GTK_RADIO_BUTTON (priv->radiobutton_reuse)),
+      gtk_radio_button_get_group (
+        GTK_RADIO_BUTTON (self->priv->radiobutton_reuse)),
       _("Create a new account on the server"));
 
-  gtk_box_pack_start (GTK_BOX (vbox), priv->radiobutton_reuse, FALSE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX (vbox), self->priv->radiobutton_reuse, FALSE,
+      FALSE, 0);
   gtk_box_pack_start (GTK_BOX (vbox), radiobutton_register, FALSE, FALSE, 0);
-  gtk_box_reorder_child (GTK_BOX (vbox), priv->radiobutton_reuse, 0);
+  gtk_box_reorder_child (GTK_BOX (vbox), self->priv->radiobutton_reuse, 0);
   gtk_box_reorder_child (GTK_BOX (vbox), radiobutton_register, 1);
-  gtk_widget_show (priv->radiobutton_reuse);
+  gtk_widget_show (self->priv->radiobutton_reuse);
   gtk_widget_show (radiobutton_register);
 }
 #endif /* HAVE_MEEGO */
@@ -2086,17 +1827,15 @@ static void
 remember_password_toggled_cb (GtkToggleButton *button,
     EmpathyAccountWidget *self)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
-
   if (gtk_toggle_button_get_active (button))
     {
-      gtk_widget_set_sensitive (priv->param_password_widget, TRUE);
+      gtk_widget_set_sensitive (self->priv->param_password_widget, TRUE);
     }
   else
     {
-      gtk_widget_set_sensitive (priv->param_password_widget, FALSE);
-      gtk_entry_set_text (GTK_ENTRY (priv->param_password_widget), "");
-      empathy_account_settings_unset (priv->settings, "password");
+      gtk_widget_set_sensitive (self->priv->param_password_widget, FALSE);
+      gtk_entry_set_text (GTK_ENTRY (self->priv->param_password_widget), "");
+      empathy_account_settings_unset (self->priv->settings, "password");
     }
 }
 
@@ -2105,22 +1844,22 @@ account_settings_password_retrieved_cb (GObject *object,
     gpointer user_data)
 {
   EmpathyAccountWidget *self = user_data;
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
   const gchar *password = empathy_account_settings_get_string (
-      priv->settings, "password");
+      self->priv->settings, "password");
 
   if (password != NULL)
     {
       /* We have to do this so that when we call gtk_entry_set_text,
        * the ::changed callback doesn't think the user made the
        * change. */
-      priv->automatic_change = TRUE;
-      gtk_entry_set_text (GTK_ENTRY (priv->param_password_widget), password);
-      priv->automatic_change = FALSE;
+      self->priv->automatic_change = TRUE;
+      gtk_entry_set_text (GTK_ENTRY (self->priv->param_password_widget),
+          password);
+      self->priv->automatic_change = FALSE;
     }
 
   gtk_toggle_button_set_active (
-      GTK_TOGGLE_BUTTON (priv->remember_password_widget),
+      GTK_TOGGLE_BUTTON (self->priv->remember_password_widget),
       !EMP_STR_EMPTY (password));
 }
 
@@ -2128,9 +1867,7 @@ static void
 do_constructed (GObject *obj)
 {
   EmpathyAccountWidget *self = EMPATHY_ACCOUNT_WIDGET (obj);
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
   TpAccount *account;
-  TpStorageRestrictionFlags storage_restrictions;
   const gchar *display_name, *default_display_name;
   guint i = 0;
   struct {
@@ -2150,51 +1887,35 @@ do_constructed (GObject *obj)
     WIDGET (idle, irc),
     WIDGET (sofiasip, sip),
   };
+  const gchar *protocol, *cm_name;
 
-  account = empathy_account_settings_get_account (priv->settings);
-
-  if (account != NULL)
-    storage_restrictions = tp_account_get_storage_restrictions (account);
-  else
-    storage_restrictions = 0;
+  account = empathy_account_settings_get_account (self->priv->settings);
 
-  /* Empathy can only edit accounts without the Cannot_Set_Parameters flag */
-  if (storage_restrictions & TP_STORAGE_RESTRICTION_FLAG_CANNOT_SET_PARAMETERS)
-    {
-      DEBUG ("Account is provided by an external storage provider");
+  cm_name = empathy_account_settings_get_cm (self->priv->settings);
+  protocol = empathy_account_settings_get_protocol (self->priv->settings);
 
-      account_widget_build_external (self, priv->settings);
-    }
-  else
+  for (i = 0 ; i < G_N_ELEMENTS (widgets); i++)
     {
-      const gchar *protocol, *cm_name;
-
-      cm_name = empathy_account_settings_get_cm (priv->settings);
-      protocol = empathy_account_settings_get_protocol (priv->settings);
-
-      for (i = 0 ; i < G_N_ELEMENTS (widgets); i++)
+      if (!tp_strdiff (widgets[i].cm_name, cm_name) &&
+          !tp_strdiff (widgets[i].protocol, protocol))
         {
-          if (!tp_strdiff (widgets[i].cm_name, cm_name) &&
-              !tp_strdiff (widgets[i].protocol, protocol))
-            {
-              gchar *filename;
+          gchar *filename;
 
-              filename = empathy_file_lookup (widgets[i].file,
-                  "libempathy-gtk");
-              widgets[i].func (self, filename);
-              g_free (filename);
+          filename = empathy_file_lookup (widgets[i].file,
+              "libempathy-gtk");
+          widgets[i].func (self, filename);
+          g_free (filename);
 
-              break;
-            }
+          break;
         }
+    }
 
-      if (i == G_N_ELEMENTS (widgets))
-        {
-          gchar *filename = empathy_file_lookup (
-              "empathy-account-widget-generic.ui", "libempathy-gtk");
-          account_widget_build_generic (self, filename);
-          g_free (filename);
-        }
+  if (i == G_N_ELEMENTS (widgets))
+    {
+      gchar *filename = empathy_file_lookup (
+          "empathy-account-widget-generic.ui", "libempathy-gtk");
+      account_widget_build_generic (self, filename);
+      g_free (filename);
     }
 
   /* handle default focus */
@@ -2210,114 +1931,94 @@ do_constructed (GObject *obj)
     }
 
   /* remember password */
-  if (priv->param_password_widget != NULL
-      && priv->remember_password_widget != NULL
-      && empathy_account_settings_supports_sasl (priv->settings))
+  if (self->priv->param_password_widget != NULL
+      && self->priv->remember_password_widget != NULL
+      && empathy_account_settings_supports_sasl (self->priv->settings))
     {
-      if (priv->simple)
+      if (self->priv->simple)
         {
           gtk_toggle_button_set_active (
-              GTK_TOGGLE_BUTTON (priv->remember_password_widget), TRUE);
+              GTK_TOGGLE_BUTTON (self->priv->remember_password_widget), TRUE);
         }
       else
         {
           gtk_toggle_button_set_active (
-              GTK_TOGGLE_BUTTON (priv->remember_password_widget),
+              GTK_TOGGLE_BUTTON (self->priv->remember_password_widget),
               !EMP_STR_EMPTY (empathy_account_settings_get_string (
-                      priv->settings, "password")));
+                      self->priv->settings, "password")));
 
           /* The password might not have been retrieved from the
            * keyring yet. We should update the remember password
            * toggle button and the password entry when/if it is. */
-          g_signal_connect (priv->settings, "password-retrieved",
-              G_CALLBACK (account_settings_password_retrieved_cb), self);
+          tp_g_signal_connect_object (self->priv->settings,
+              "password-retrieved",
+              G_CALLBACK (account_settings_password_retrieved_cb), self, 0);
         }
 
-      g_signal_connect (priv->remember_password_widget, "toggled",
+      g_signal_connect (self->priv->remember_password_widget, "toggled",
           G_CALLBACK (remember_password_toggled_cb), self);
 
       remember_password_toggled_cb (
-          GTK_TOGGLE_BUTTON (priv->remember_password_widget), self);
+          GTK_TOGGLE_BUTTON (self->priv->remember_password_widget), self);
     }
-  else if (priv->remember_password_widget != NULL
-      && !empathy_account_settings_supports_sasl (priv->settings))
+  else if (self->priv->remember_password_widget != NULL
+      && !empathy_account_settings_supports_sasl (self->priv->settings))
     {
-      gtk_widget_set_visible (priv->remember_password_widget, FALSE);
+      gtk_widget_set_visible (self->priv->remember_password_widget, FALSE);
     }
 
   /* dup and init the account-manager */
-  priv->account_manager = tp_account_manager_dup ();
+  self->priv->account_manager = tp_account_manager_dup ();
 
   g_object_ref (self);
-  tp_account_manager_prepare_async (priv->account_manager, NULL,
+  tp_proxy_prepare_async (self->priv->account_manager, NULL,
       account_manager_ready_cb, self);
 
   /* handle apply and cancel button */
-  if (!priv->simple &&
-      !(storage_restrictions &
-        TP_STORAGE_RESTRICTION_FLAG_CANNOT_SET_PARAMETERS))
-    {
-      GtkWidget *hbox = gtk_hbox_new (TRUE, 3);
-      GtkWidget *image;
-
-      /*  We can't use the stock button as its accelerator ('C') clashes with
-       *  the Close button. */
-      priv->cancel_button = gtk_button_new ();
-      gtk_button_set_label (GTK_BUTTON (priv->cancel_button), _("Ca_ncel"));
-      gtk_button_set_use_underline (GTK_BUTTON (priv->cancel_button), TRUE);
-
-      image = gtk_image_new_from_stock (GTK_STOCK_CANCEL, GTK_ICON_SIZE_BUTTON);
-      gtk_button_set_image (GTK_BUTTON (priv->cancel_button), image);
-
-      priv->apply_button = gtk_button_new ();
-      set_apply_button (self);
-
-      /* We'll change this button to a "Log in" one if we are creating a new
-       * account and are connected. */
-      tp_g_signal_connect_object (priv->account_manager,
-          "most-available-presence-changed",
-          G_CALLBACK (presence_changed_cb), obj, 0);
-
-      gtk_box_pack_end (GTK_BOX (hbox), priv->apply_button, TRUE,
-          TRUE, 3);
-      gtk_box_pack_end (GTK_BOX (hbox), priv->cancel_button, TRUE,
-          TRUE, 3);
-
-      gtk_box_pack_end (GTK_BOX (self->ui_details->widget), hbox, FALSE,
-          FALSE, 3);
-
-      g_signal_connect (priv->cancel_button, "clicked",
-          G_CALLBACK (account_widget_cancel_clicked_cb),
-          self);
-      g_signal_connect (priv->apply_button, "clicked",
-          G_CALLBACK (account_widget_apply_clicked_cb),
-          self);
-      gtk_widget_show_all (hbox);
-
-      if (priv->creating_account)
-        /* When creating an account, the user might have nothing to enter.
-         * That means that no control interaction might occur,
-         * so we update the control button sensitivity manually.
-         */
-        account_widget_handle_control_buttons_sensitivity (self);
-      else
-        account_widget_set_control_buttons_sensitivity (self, FALSE);
-    }
-
-  if (account != NULL)
-    {
-      g_signal_connect (account, "notify::enabled",
-          G_CALLBACK (empathy_account_widget_enabled_cb), self);
-    }
+  self->priv->hbox_buttons = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 3);
+
+  gtk_box_set_homogeneous (GTK_BOX (self->priv->hbox_buttons), TRUE);
+
+  self->priv->cancel_button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
+
+  self->priv->apply_button = gtk_button_new ();
+  set_apply_button (self);
+
+  /* We'll change this button to a "Log in" one if we are creating a new
+   * account and are connected. */
+  tp_g_signal_connect_object (self->priv->account_manager,
+      "most-available-presence-changed",
+      G_CALLBACK (presence_changed_cb), obj, 0);
+
+  gtk_box_pack_end (GTK_BOX (self->priv->hbox_buttons),
+      self->priv->apply_button, TRUE, TRUE, 3);
+  gtk_box_pack_end (GTK_BOX (self->priv->hbox_buttons),
+      self->priv->cancel_button, TRUE, TRUE, 3);
+
+  gtk_box_pack_end (GTK_BOX (self->ui_details->widget), self->priv->hbox_buttons, FALSE,
+      FALSE, 3);
+
+  g_signal_connect (self->priv->cancel_button, "clicked",
+      G_CALLBACK (account_widget_cancel_clicked_cb),
+      self);
+  g_signal_connect (self->priv->apply_button, "clicked",
+      G_CALLBACK (account_widget_apply_clicked_cb),
+      self);
+  gtk_widget_show_all (self->priv->hbox_buttons);
+
+  if (self->priv->creating_account)
+    /* When creating an account, the user might have nothing to enter.
+     * That means that no control interaction might occur,
+     * so we update the control button sensitivity manually.
+     */
+    account_widget_handle_control_buttons_sensitivity (self);
+  else
+    account_widget_set_control_buttons_sensitivity (self, FALSE);
 
 #ifndef HAVE_MEEGO
   add_register_buttons (self, account);
 #endif /* HAVE_MEEGO */
 
-  /* add the Enable checkbox to accounts that support it */
-  if (!(storage_restrictions & TP_STORAGE_RESTRICTION_FLAG_CANNOT_SET_ENABLED))
-    add_enable_checkbox (self, account);
-
   /* hook up to widget destruction to unref ourselves */
   g_signal_connect (self->ui_details->widget, "destroy",
       G_CALLBACK (account_widget_destroy_cb), self);
@@ -2329,15 +2030,17 @@ do_constructed (GObject *obj)
       self->ui_details->gui = NULL;
     }
 
-  display_name = empathy_account_settings_get_display_name (priv->settings);
+  display_name = empathy_account_settings_get_display_name (
+      self->priv->settings);
   default_display_name = empathy_account_widget_get_default_display_name (self);
 
   if (tp_strdiff (display_name, default_display_name) &&
-      !priv->creating_account)
+      !self->priv->creating_account)
     {
       /* The display name of the account is not the one that we'd assign by
        * default; assume that the user changed it manually */
-      g_object_set (priv->settings, "display-name-overridden", TRUE, NULL);
+      g_object_set (self->priv->settings, "display-name-overridden", TRUE,
+          NULL);
     }
 }
 
@@ -2345,33 +2048,9 @@ static void
 do_dispose (GObject *obj)
 {
   EmpathyAccountWidget *self = EMPATHY_ACCOUNT_WIDGET (obj);
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
-
-  if (priv->dispose_run)
-    return;
-
-  priv->dispose_run = TRUE;
 
-  if (priv->settings != NULL)
-    {
-      TpAccount *account;
-      account = empathy_account_settings_get_account (priv->settings);
-
-      if (account != NULL)
-        {
-          g_signal_handlers_disconnect_by_func (account,
-              empathy_account_widget_enabled_cb, self);
-        }
-
-      g_object_unref (priv->settings);
-      priv->settings = NULL;
-    }
-
-  if (priv->account_manager != NULL)
-    {
-      g_object_unref (priv->account_manager);
-      priv->account_manager = NULL;
-    }
+  g_clear_object (&self->priv->settings);
+  g_clear_object (&self->priv->account_manager);
 
   if (G_OBJECT_CLASS (empathy_account_widget_parent_class)->dispose != NULL)
     G_OBJECT_CLASS (empathy_account_widget_parent_class)->dispose (obj);
@@ -2381,12 +2060,11 @@ static void
 do_finalize (GObject *obj)
 {
   EmpathyAccountWidget *self = EMPATHY_ACCOUNT_WIDGET (obj);
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
 
   g_free (self->ui_details->default_focus);
   g_slice_free (EmpathyAccountWidgetUIDetails, self->ui_details);
 
-  g_free (priv->jid_suffix);
+  g_free (self->priv->jid_suffix);
 
   if (G_OBJECT_CLASS (empathy_account_widget_parent_class)->finalize != NULL)
     G_OBJECT_CLASS (empathy_account_widget_parent_class)->finalize (obj);
@@ -2440,7 +2118,7 @@ empathy_account_widget_class_init (EmpathyAccountWidgetClass *klass)
   signals[HANDLE_APPLY] =
     g_signal_new ("handle-apply", G_TYPE_FROM_CLASS (klass),
         G_SIGNAL_RUN_LAST, 0, NULL, NULL,
-        g_cclosure_marshal_VOID__BOOLEAN,
+        g_cclosure_marshal_generic,
         G_TYPE_NONE,
         1, G_TYPE_BOOLEAN);
 
@@ -2448,51 +2126,49 @@ empathy_account_widget_class_init (EmpathyAccountWidgetClass *klass)
   signals[ACCOUNT_CREATED] =
       g_signal_new ("account-created", G_TYPE_FROM_CLASS (klass),
           G_SIGNAL_RUN_LAST, 0, NULL, NULL,
-          g_cclosure_marshal_VOID__OBJECT,
+          g_cclosure_marshal_generic,
           G_TYPE_NONE,
           1, G_TYPE_OBJECT);
 
   signals[CANCELLED] =
       g_signal_new ("cancelled", G_TYPE_FROM_CLASS (klass),
           G_SIGNAL_RUN_LAST, 0, NULL, NULL,
-          g_cclosure_marshal_VOID__VOID,
+          g_cclosure_marshal_generic,
           G_TYPE_NONE,
           0);
 
+  signals[CLOSE] =
+    g_signal_new ("close", G_TYPE_FROM_CLASS (klass),
+        G_SIGNAL_RUN_LAST, 0, NULL, NULL,
+        g_cclosure_marshal_VOID__INT,
+        G_TYPE_NONE,
+        1, G_TYPE_INT);
+
   g_type_class_add_private (klass, sizeof (EmpathyAccountWidgetPriv));
 }
 
 static void
 empathy_account_widget_init (EmpathyAccountWidget *self)
 {
-  EmpathyAccountWidgetPriv *priv =
-    G_TYPE_INSTANCE_GET_PRIVATE ((self), EMPATHY_TYPE_ACCOUNT_WIDGET,
+  self->priv = G_TYPE_INSTANCE_GET_PRIVATE ((self), EMPATHY_TYPE_ACCOUNT_WIDGET,
         EmpathyAccountWidgetPriv);
 
-  self->priv = priv;
-  priv->dispose_run = FALSE;
-
   self->ui_details = g_slice_new0 (EmpathyAccountWidgetUIDetails);
 }
 
 /* public methods */
 
 void
-empathy_account_widget_discard_pending_changes
-    (EmpathyAccountWidget *widget)
+empathy_account_widget_discard_pending_changes (EmpathyAccountWidget *self)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (widget);
-
-  empathy_account_settings_discard_changes (priv->settings);
-  priv->contains_pending_changes = FALSE;
+  empathy_account_settings_discard_changes (self->priv->settings);
+  self->priv->contains_pending_changes = FALSE;
 }
 
 gboolean
-empathy_account_widget_contains_pending_changes (EmpathyAccountWidget *widget)
+empathy_account_widget_contains_pending_changes (EmpathyAccountWidget *self)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (widget);
-
-  return priv->contains_pending_changes;
+  return self->priv->contains_pending_changes;
 }
 
 void
@@ -2534,14 +2210,14 @@ empathy_account_widget_new_for_protocol (EmpathyAccountSettings *settings,
 gchar *
 empathy_account_widget_get_default_display_name (EmpathyAccountWidget *self)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
   const gchar *login_id;
   const gchar *protocol, *p;
   gchar *default_display_name;
   Service service;
 
-  login_id = empathy_account_settings_get_string (priv->settings, "account");
-  protocol = empathy_account_settings_get_protocol (priv->settings);
+  login_id = empathy_account_settings_get_string (self->priv->settings,
+      "account");
+  protocol = empathy_account_settings_get_protocol (self->priv->settings);
   service = account_widget_get_service (self);
 
   if (login_id != NULL)
@@ -2552,7 +2228,7 @@ empathy_account_widget_get_default_display_name (EmpathyAccountWidget *self)
           EmpathyIrcNetwork *network;
 
           network = empathy_irc_network_chooser_get_network (
-              priv->irc_network_chooser);
+              self->priv->irc_network_chooser);
           g_assert (network != NULL);
 
           /* To translators: The first parameter is the login id and the
@@ -2563,7 +2239,7 @@ empathy_account_widget_get_default_display_name (EmpathyAccountWidget *self)
           default_display_name = g_strdup_printf (_("%1$s on %2$s"),
               login_id, empathy_irc_network_get_name (network));
         }
-      else if (service == FACEBOOK_SERVICE)
+      else if (service == FACEBOOK_SERVICE && self->priv->jid_suffix != NULL)
         {
           gchar *tmp;
 
@@ -2600,32 +2276,38 @@ empathy_account_widget_get_default_display_name (EmpathyAccountWidget *self)
 void
 empathy_account_widget_changed (EmpathyAccountWidget *self)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
-
   account_widget_handle_control_buttons_sensitivity (self);
-  priv->contains_pending_changes = TRUE;
+  self->priv->contains_pending_changes = TRUE;
 }
 
 void
 empathy_account_widget_set_account_param (EmpathyAccountWidget *self,
     const gchar *account)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
-
-  if (priv->param_account_widget == NULL)
+  if (self->priv->param_account_widget == NULL)
     return;
 
-  gtk_entry_set_text (GTK_ENTRY (priv->param_account_widget), account);
+  gtk_entry_set_text (GTK_ENTRY (self->priv->param_account_widget), account);
 }
 
 void
 empathy_account_widget_set_password_param (EmpathyAccountWidget *self,
     const gchar *account)
 {
-  EmpathyAccountWidgetPriv *priv = GET_PRIV (self);
-
-  if (priv->param_password_widget == NULL)
+  if (self->priv->param_password_widget == NULL)
     return;
 
-  gtk_entry_set_text (GTK_ENTRY (priv->param_password_widget), account);
+  gtk_entry_set_text (GTK_ENTRY (self->priv->param_password_widget), account);
+}
+
+EmpathyAccountSettings *
+empathy_account_widget_get_settings (EmpathyAccountWidget *self)
+{
+  return self->priv->settings;
+}
+
+void
+empathy_account_widget_hide_buttons (EmpathyAccountWidget *self)
+{
+  gtk_widget_hide (self->priv->hbox_buttons);
 }