diff --git a/libempathy-gtk/empathy-account-widget-private.h b/libempathy-gtk/empathy-account-widget-private.h
index b7ebe2b..c5c1c1a 100644
--- a/libempathy-gtk/empathy-account-widget-private.h
+++ b/libempathy-gtk/empathy-account-widget-private.h
@@ -42,6 +42,10 @@ void       empathy_account_widget_handle_params     (EmpathyAccountWidget *self,
 						     const gchar *first_widget,
 						     ...);
 
+void account_widget_setup_widget (EmpathyAccountWidget *self,
+    GtkWidget *widget,
+    const gchar *param_name);
+
 G_END_DECLS
 
 #endif /* __EMPATHY_ACCOUNT_WIDGET_PRIVATE_H__ */
diff --git a/libempathy-gtk/empathy-account-widget-sip.c b/libempathy-gtk/empathy-account-widget-sip.c
index db39dda..0b79b61 100644
--- a/libempathy-gtk/empathy-account-widget-sip.c
+++ b/libempathy-gtk/empathy-account-widget-sip.c
@@ -28,6 +28,7 @@
 #include <glib/gi18n-lib.h>
 #include <gtk/gtk.h>
 
+#include <telepathy-glib/util.h>
 #include <libempathy/empathy-utils.h>
 
 #include "empathy-account-widget.h"
@@ -39,9 +40,14 @@ typedef struct {
   EmpathyAccountWidget *self;
   GtkWidget *vbox_settings;
 
+  GtkWidget *label_stun_server;
   GtkWidget *entry_stun_server;
-  GtkWidget *spinbutton_stun_part;
+  GtkWidget *label_stun_port;
+  GtkWidget *spinbutton_stun_port;
   GtkWidget *checkbutton_discover_stun;
+  GtkWidget *combobox_transport;
+  GtkWidget *combobox_keep_alive_mechanism;
+  GtkWidget *spinbutton_keepalive_interval;
 } EmpathyAccountWidgetSip;
 
 static void
@@ -59,8 +65,32 @@ account_widget_sip_discover_stun_toggled_cb (
   gboolean active;
 
   active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (checkbox));
+  gtk_widget_set_sensitive (settings->label_stun_server, !active);
   gtk_widget_set_sensitive (settings->entry_stun_server, !active);
-  gtk_widget_set_sensitive (settings->spinbutton_stun_part, !active);
+  gtk_widget_set_sensitive (settings->label_stun_port, !active);
+  gtk_widget_set_sensitive (settings->spinbutton_stun_port, !active);
+}
+
+static void
+keep_alive_mechanism_combobox_change_cb (GtkWidget *widget,
+    EmpathyAccountWidgetSip *self)
+{
+  GtkTreeIter iter;
+  GtkTreeModel *model;
+  gchar *mechanism;
+  gboolean enabled;
+
+  /* Unsensitive the keep-alive spin button if keep-alive is disabled */
+  if (!gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter))
+    return;
+
+  model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
+  gtk_tree_model_get (model, &iter, 0, &mechanism, -1);
+
+  enabled = tp_strdiff (mechanism, "none");
+
+  gtk_widget_set_sensitive (self->spinbutton_keepalive_interval, enabled);
+  g_free (mechanism);
 }
 
 void
@@ -71,6 +101,7 @@ empathy_account_widget_sip_build (EmpathyAccountWidget *self,
   EmpathyAccountWidgetSip *settings;
   GtkWidget *vbox_settings;
   gboolean is_simple;
+  GtkWidget *table_advanced;
 
   g_object_get (self, "simple", &is_simple, NULL);
 
@@ -89,15 +120,24 @@ empathy_account_widget_sip_build (EmpathyAccountWidget *self,
     }
   else
     {
+      GtkListStore *store;
+      GtkTreeIter iter;
+      GtkCellRenderer *renderer;
+
       settings = g_slice_new0 (EmpathyAccountWidgetSip);
       settings->self = self;
 
       self->ui_details->gui = empathy_builder_get_file (filename,
           "table_common_settings", table_common_settings,
+          "table_advanced_sip_settings", &table_advanced,
           "vbox_sip_settings", &vbox_settings,
+          "label_stun-server", &settings->label_stun_server,
           "entry_stun-server", &settings->entry_stun_server,
-          "spinbutton_stun-port", &settings->spinbutton_stun_part,
+          "label_stun-port", &settings->label_stun_port,
+          "spinbutton_stun-port", &settings->spinbutton_stun_port,
           "checkbutton_discover-stun", &settings->checkbutton_discover_stun,
+          "spinbutton_keepalive-interval",
+            &settings->spinbutton_keepalive_interval,
           NULL);
       settings->vbox_settings = vbox_settings;
 
@@ -107,6 +147,12 @@ empathy_account_widget_sip_build (EmpathyAccountWidget *self,
           "checkbutton_discover-stun", "discover-stun",
           "entry_stun-server", "stun-server",
           "spinbutton_stun-port", "stun-port",
+          "entry_auth-user", "auth-user",
+          "entry_proxy-host", "proxy-host",
+          "spinbutton_port", "port",
+          "checkbutton_loose-routing", "loose-routing",
+          "checkbutton_discover-binding", "discover-binding",
+          "spinbutton_keepalive-interval", "keepalive-interval",
           NULL);
 
       account_widget_sip_discover_stun_toggled_cb (
@@ -121,6 +167,74 @@ empathy_account_widget_sip_build (EmpathyAccountWidget *self,
 
       self->ui_details->add_forget = TRUE;
       self->ui_details->default_focus = g_strdup ("entry_userid");
+
+      /* Create the 'transport' combo box. The first column has to contain the
+       * value of the param. */
+      store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
+      settings->combobox_transport = gtk_combo_box_new_with_model (
+          GTK_TREE_MODEL (store));
+
+      renderer = gtk_cell_renderer_text_new ();
+      gtk_cell_layout_pack_start (
+          GTK_CELL_LAYOUT (settings->combobox_transport), renderer, TRUE);
+      gtk_cell_layout_add_attribute (
+          GTK_CELL_LAYOUT (settings->combobox_transport), renderer, "text", 1);
+
+      gtk_list_store_append (store, &iter);
+      gtk_list_store_set (store, &iter, 0, "auto", 1, _("Auto"), -1);
+
+      gtk_list_store_append (store, &iter);
+      gtk_list_store_set (store, &iter, 0, "udp", 1, "UDP", -1);
+
+      gtk_list_store_append (store, &iter);
+      gtk_list_store_set (store, &iter, 0, "tcp", 1, "TCP", -1);
+
+      gtk_list_store_append (store, &iter);
+      gtk_list_store_set (store, &iter, 0, "tls", 1, "TLS", -1);
+
+      account_widget_setup_widget (self, settings->combobox_transport,
+          "transport");
+
+      gtk_table_attach_defaults (GTK_TABLE (table_advanced),
+          settings->combobox_transport, 1, 2, 13, 14);
+
+      gtk_widget_show (settings->combobox_transport);
+
+      /* Create the 'keep-alive mechanism' combo box */
+      store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
+      settings->combobox_keep_alive_mechanism = gtk_combo_box_new_with_model (
+          GTK_TREE_MODEL (store));
+
+      renderer = gtk_cell_renderer_text_new ();
+      gtk_cell_layout_pack_start (
+          GTK_CELL_LAYOUT (settings->combobox_keep_alive_mechanism), renderer,
+          TRUE);
+      gtk_cell_layout_add_attribute (
+          GTK_CELL_LAYOUT (settings->combobox_keep_alive_mechanism), renderer,
+          "text", 1);
+
+      gtk_list_store_append (store, &iter);
+      gtk_list_store_set (store, &iter, 0, "auto", 1, _("Auto"), -1);
+
+      gtk_list_store_append (store, &iter);
+      gtk_list_store_set (store, &iter, 0, "register", 1, "Register", -1);
+
+      gtk_list_store_append (store, &iter);
+      gtk_list_store_set (store, &iter, 0, "options", 1, "Options", -1);
+
+      gtk_list_store_append (store, &iter);
+      gtk_list_store_set (store, &iter, 0, "none", 1, _("None"), -1);
+
+      g_signal_connect (settings->combobox_keep_alive_mechanism, "changed",
+          G_CALLBACK (keep_alive_mechanism_combobox_change_cb), settings);
+
+      account_widget_setup_widget (self,
+          settings->combobox_keep_alive_mechanism, "keepalive-mechanism");
+
+      gtk_table_attach_defaults (GTK_TABLE (table_advanced),
+          settings->combobox_keep_alive_mechanism, 1, 2, 9, 10);
+
+      gtk_widget_show (settings->combobox_keep_alive_mechanism);
     }
 
   self->ui_details->widget = vbox_settings;
diff --git a/libempathy-gtk/empathy-account-widget-sip.ui b/libempathy-gtk/empathy-account-widget-sip.ui
index e8491a6..74d7b16 100644
--- a/libempathy-gtk/empathy-account-widget-sip.ui
+++ b/libempathy-gtk/empathy-account-widget-sip.ui
@@ -98,9 +98,6 @@
           </packing>
         </child>
         <child>
-          <placeholder/>
-        </child>
-        <child>
           <object class="GtkLabel" id="label_username_example">
             <property name="visible">True</property>
             <property name="xalign">0</property>
@@ -115,6 +112,9 @@
             <property name="bottom_attach">2</property>
           </packing>
         </child>
+        <child>
+          <placeholder/>
+        </child>
       </object>
       <packing>
         <property name="expand">False</property>
@@ -130,11 +130,12 @@
           <object class="GtkAlignment" id="alignment3">
             <property name="visible">True</property>
             <property name="xalign">0</property>
+            <property name="top_padding">6</property>
             <property name="left_padding">12</property>
             <child>
               <object class="GtkTable" id="table_advanced_sip_settings">
                 <property name="visible">True</property>
-                <property name="n_rows">3</property>
+                <property name="n_rows">15</property>
                 <property name="n_columns">2</property>
                 <property name="column_spacing">6</property>
                 <property name="row_spacing">6</property>
@@ -147,8 +148,8 @@
                   <packing>
                     <property name="left_attach">1</property>
                     <property name="right_attach">2</property>
-                    <property name="top_attach">1</property>
-                    <property name="bottom_attach">2</property>
+                    <property name="top_attach">2</property>
+                    <property name="bottom_attach">3</property>
                   </packing>
                 </child>
                 <child>
@@ -159,8 +160,8 @@
                     <property name="mnemonic_widget">spinbutton_stun-port</property>
                   </object>
                   <packing>
-                    <property name="top_attach">2</property>
-                    <property name="bottom_attach">3</property>
+                    <property name="top_attach">3</property>
+                    <property name="bottom_attach">4</property>
                     <property name="x_options">GTK_FILL</property>
                     <property name="y_options"></property>
                   </packing>
@@ -173,8 +174,8 @@
                     <property name="mnemonic_widget">entry_stun-server</property>
                   </object>
                   <packing>
-                    <property name="top_attach">1</property>
-                    <property name="bottom_attach">2</property>
+                    <property name="top_attach">2</property>
+                    <property name="bottom_attach">3</property>
                     <property name="x_options">GTK_FILL</property>
                     <property name="y_options"></property>
                   </packing>
@@ -190,8 +191,8 @@
                   <packing>
                     <property name="left_attach">1</property>
                     <property name="right_attach">2</property>
-                    <property name="top_attach">2</property>
-                    <property name="bottom_attach">3</property>
+                    <property name="top_attach">3</property>
+                    <property name="bottom_attach">4</property>
                   </packing>
                 </child>
                 <child>
@@ -205,10 +206,223 @@
                   </object>
                   <packing>
                     <property name="right_attach">2</property>
+                    <property name="top_attach">1</property>
+                    <property name="bottom_attach">2</property>
                     <property name="x_options">GTK_FILL</property>
                     <property name="y_options"></property>
                   </packing>
                 </child>
+                <child>
+                  <object class="GtkLabel" id="label_auth-user">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">Authentication username:</property>
+                  </object>
+                  <packing>
+                    <property name="top_attach">12</property>
+                    <property name="bottom_attach">13</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkEntry" id="entry_auth-user">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="tooltip_text" translatable="yes">The username for SIP authentication, if different from the SIP URI
+username.</property>
+                    <property name="invisible_char">&#x2022;</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="right_attach">2</property>
+                    <property name="top_attach">12</property>
+                    <property name="bottom_attach">13</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="label_proxy-host">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">Proxy Server:</property>
+                  </object>
+                  <packing>
+                    <property name="top_attach">6</property>
+                    <property name="bottom_attach">7</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkEntry" id="entry_proxy-host">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="tooltip_text" translatable="yes">Hostname of the proxy for outbound requests.</property>
+                    <property name="invisible_char">&#x2022;</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="right_attach">2</property>
+                    <property name="top_attach">6</property>
+                    <property name="bottom_attach">7</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="label_port">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">Proxy Port:</property>
+                  </object>
+                  <packing>
+                    <property name="top_attach">7</property>
+                    <property name="bottom_attach">8</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkSpinButton" id="spinbutton_port">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="tooltip_text" translatable="yes">Port of the proxy for outbound requests.</property>
+                    <property name="invisible_char">&#x2022;</property>
+                    <property name="adjustment">adjustment2</property>
+                    <property name="climb_rate">1</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="right_attach">2</property>
+                    <property name="top_attach">7</property>
+                    <property name="bottom_attach">8</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="label_transport">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">Transport:</property>
+                  </object>
+                  <packing>
+                    <property name="top_attach">13</property>
+                    <property name="bottom_attach">14</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="checkbutton_loose-routing">
+                    <property name="label" translatable="yes">Loose Routing</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="tooltip_text" translatable="yes">Use the loose routing behavior and the Route header as recommended in RFC 3261.</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="right_attach">2</property>
+                    <property name="top_attach">14</property>
+                    <property name="bottom_attach">15</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkCheckButton" id="checkbutton_discover-binding">
+                    <property name="label" translatable="yes">Discover Binding</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="receives_default">False</property>
+                    <property name="tooltip_text" translatable="yes">Update the registration binding if the external address for the client is discovered to be different from the local binding.</property>
+                    <property name="draw_indicator">True</property>
+                  </object>
+                  <packing>
+                    <property name="right_attach">2</property>
+                    <property name="top_attach">4</property>
+                    <property name="bottom_attach">5</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="label_keepalive-mechanism">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">Keep-alive Mechanism:</property>
+                  </object>
+                  <packing>
+                    <property name="top_attach">9</property>
+                    <property name="bottom_attach">10</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="label_keepalive-interval">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">Keep-alive Interval (seconds)</property>
+                  </object>
+                  <packing>
+                    <property name="top_attach">10</property>
+                    <property name="bottom_attach">11</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkSpinButton" id="spinbutton_keepalive-interval">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="invisible_char">&#x2022;</property>
+                    <property name="adjustment">adjustment3</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="right_attach">2</property>
+                    <property name="top_attach">10</property>
+                    <property name="bottom_attach">11</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="label_nat_traversal">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">&lt;b&gt;Nat Traversal&lt;/b&gt;</property>
+                    <property name="use_markup">True</property>
+                  </object>
+                  <packing>
+                    <property name="right_attach">2</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="label_proxy">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">&lt;b&gt;Proxy&lt;/b&gt;</property>
+                    <property name="use_markup">True</property>
+                  </object>
+                  <packing>
+                    <property name="right_attach">2</property>
+                    <property name="top_attach">5</property>
+                    <property name="bottom_attach">6</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="label_keep_alive">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">&lt;b&gt;Keep-Alive&lt;/b&gt;</property>
+                    <property name="use_markup">True</property>
+                  </object>
+                  <packing>
+                    <property name="right_attach">2</property>
+                    <property name="top_attach">8</property>
+                    <property name="bottom_attach">9</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="label_misc">
+                    <property name="visible">True</property>
+                    <property name="xalign">0</property>
+                    <property name="label" translatable="yes">&lt;b&gt;Misc&lt;/b&gt;</property>
+                    <property name="use_markup">True</property>
+                  </object>
+                  <packing>
+                    <property name="right_attach">2</property>
+                    <property name="top_attach">11</property>
+                    <property name="bottom_attach">12</property>
+                  </packing>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
+                <child>
+                  <placeholder/>
+                </child>
               </object>
             </child>
           </object>
@@ -318,4 +532,14 @@
       </packing>
     </child>
   </object>
+  <object class="GtkAdjustment" id="adjustment2">
+    <property name="upper">65535</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+  </object>
+  <object class="GtkAdjustment" id="adjustment3">
+    <property name="upper">10000</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+  </object>
 </interface>
diff --git a/libempathy-gtk/empathy-account-widget.c b/libempathy-gtk/empathy-account-widget.c
index a4d0f28..58c8f1f 100644
--- a/libempathy-gtk/empathy-account-widget.c
+++ b/libempathy-gtk/empathy-account-widget.c
@@ -297,6 +297,45 @@ account_widget_jabber_ssl_toggled_cb (GtkWidget *checkbutton_ssl,
 }
 
 static void
+account_widget_combobox_changed_cb (GtkWidget *widget,
+    EmpathyAccountWidget *self)
+{
+  GtkTreeIter iter;
+  GtkTreeModel *model;
+  const gchar *value;
+  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;
+
+  model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
+  /* the param value is stored in the first column */
+  gtk_tree_model_get (model, &iter, 0, &value, -1);
+
+  param_name = g_object_get_data (G_OBJECT (widget), "param_name");
+
+  v = empathy_account_settings_get_default (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);
+    }
+  else
+    {
+      DEBUG ("Setting %s to %s", param_name, value);
+      empathy_account_settings_set_string (priv->settings, param_name, value);
+    }
+
+  account_widget_handle_control_buttons_sensitivity (self);
+}
+
+void
 account_widget_setup_widget (EmpathyAccountWidget *self,
     GtkWidget *widget,
     const gchar *param_name)
@@ -372,6 +411,41 @@ account_widget_setup_widget (EmpathyAccountWidget *self,
           G_CALLBACK (account_widget_checkbutton_toggled_cb),
           self);
     }
+  else if (GTK_IS_COMBO_BOX (widget))
+    {
+      /* The combo box's model has to contain the param value in its first
+       * column (as a string) */
+      const gchar *str;
+      GtkTreeModel *model;
+      GtkTreeIter iter;
+      gboolean valid;
+
+      str = empathy_account_settings_get_string (priv->settings, param_name);
+      model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
+
+      valid = gtk_tree_model_get_iter_first (model, &iter);
+      while (valid)
+        {
+          gchar *name;
+
+          gtk_tree_model_get (model, &iter, 0, &name, -1);
+          if (!tp_strdiff (name, str))
+            {
+              gtk_combo_box_set_active_iter (GTK_COMBO_BOX (widget), &iter);
+              valid = FALSE;
+            }
+          else
+            {
+              valid = gtk_tree_model_iter_next (model, &iter);
+            }
+
+          g_free (name);
+        }
+
+      g_signal_connect (widget, "changed",
+          G_CALLBACK (account_widget_combobox_changed_cb),
+          self);
+    }
   else
     {
       DEBUG ("Unknown type of widget for param %s", param_name);
