diff --git a/data/desktop_gnome_peripherals_touchpad.schemas.in b/data/desktop_gnome_peripherals_touchpad.schemas.in
index 381dc24..9ce2cb0 100644
--- a/data/desktop_gnome_peripherals_touchpad.schemas.in
+++ b/data/desktop_gnome_peripherals_touchpad.schemas.in
@@ -27,6 +27,42 @@
     </schema>
 
     <schema>
+      <key>/schemas/desktop/gnome/peripherals/touchpad/tap_button_1</key>
+      <applyto>/desktop/gnome/peripherals/touchpad/tap_button_1</applyto>
+      <owner>gnome</owner>
+      <type>int</type>
+      <default>1</default>
+      <locale name="C">
+        <short>Button assigned to one finger tap</short>
+        <long>Set this to the button number that you want to click by tapping one finger.</long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/desktop/gnome/peripherals/touchpad/tap_button_2</key>
+      <applyto>/desktop/gnome/peripherals/touchpad/tap_button_2</applyto>
+      <owner>gnome</owner>
+      <type>int</type>
+      <default>3</default>
+      <locale name="C">
+        <short>Button assigned to two finger tap</short>
+        <long>Set this to the button number that you want to click by tapping two fingers.</long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/desktop/gnome/peripherals/touchpad/tap_button_3</key>
+      <applyto>/desktop/gnome/peripherals/touchpad/tap_button_3</applyto>
+      <owner>gnome</owner>
+      <type>int</type>
+      <default>2</default>
+      <locale name="C">
+        <short>Button assigned to three finger tap</short>
+        <long>Set this to the button number that you want to click by tapping three fingers.</long>
+      </locale>
+    </schema>
+
+    <schema>
       <key>/schemas/desktop/gnome/peripherals/touchpad/scroll_method</key>
       <applyto>/desktop/gnome/peripherals/touchpad/scroll_method</applyto>
       <owner>gnome</owner>
diff --git a/plugins/mouse/gsd-mouse-manager.c b/plugins/mouse/gsd-mouse-manager.c
index d0ecf6b..79633bc 100644
--- a/plugins/mouse/gsd-mouse-manager.c
+++ b/plugins/mouse/gsd-mouse-manager.c
@@ -64,6 +64,9 @@
 #define KEY_DELAY_ENABLE        GCONF_MOUSE_A11Y_DIR "/delay_enable"
 #define KEY_TOUCHPAD_DISABLE_W_TYPING    GCONF_TOUCHPAD_DIR "/disable_while_typing"
 #define KEY_TAP_TO_CLICK        GCONF_TOUCHPAD_DIR "/tap_to_click"
+#define KEY_TAP_BUTTON_1        GCONF_TOUCHPAD_DIR "/tap_button_1"
+#define KEY_TAP_BUTTON_2        GCONF_TOUCHPAD_DIR "/tap_button_2"
+#define KEY_TAP_BUTTON_3        GCONF_TOUCHPAD_DIR "/tap_button_3"
 #define KEY_SCROLL_METHOD       GCONF_TOUCHPAD_DIR "/scroll_method"
 #define KEY_PAD_HORIZ_SCROLL    GCONF_TOUCHPAD_DIR "/horiz_scroll_enabled"
 
@@ -84,7 +87,8 @@ static void     gsd_mouse_manager_class_init  (GsdMouseManagerClass *klass);
 static void     gsd_mouse_manager_init        (GsdMouseManager      *mouse_manager);
 static void     gsd_mouse_manager_finalize    (GObject             *object);
 static void     set_mouse_settings            (GsdMouseManager      *manager);
-static int      set_tap_to_click              (gboolean state, gboolean left_handed);
+static int      set_tap_to_click              (gboolean state, guint tap_button_1, guint tap_button_2, guint tap_button_3);
+static int      update_tap_to_click           ();
 static XDevice* device_is_touchpad            (XDeviceInfo deviceinfo);
 
 G_DEFINE_TYPE (GsdMouseManager, gsd_mouse_manager, G_TYPE_OBJECT)
@@ -321,11 +325,8 @@ set_xinput_devices_left_handed (gboolean left_handed)
                 device = device_is_touchpad (device_info[i]);
                 if (device != NULL) {
                         GConfClient *client = gconf_client_get_default ();
-                        gboolean tap = gconf_client_get_bool (client, KEY_TAP_TO_CLICK, NULL);
                         gboolean single_button = touchpad_has_single_button (device);
 
-                        if (tap && !single_button)
-                                set_tap_to_click (tap, left_handed);
                         XCloseDevice (GDK_DISPLAY (), device);
                         g_object_unref (client);
 
@@ -364,6 +365,8 @@ set_xinput_devices_left_handed (gboolean left_handed)
 
         if (device_info != NULL)
                 XFreeDeviceList (device_info);
+
+        update_tap_to_click ();
 }
 
 static GdkFilterReturn
@@ -580,14 +583,18 @@ set_disable_w_typing (GsdMouseManager *manager, gboolean state)
 }
 
 static int
-set_tap_to_click (gboolean state, gboolean left_handed)
+set_tap_to_click (gboolean state, guint tap_button_1, guint tap_button_2, guint tap_button_3)
 {
-        int numdevices, i, format, rc;
+        int numdevices, i, j, format, rc;
         unsigned long nitems, bytes_after;
         XDeviceInfo *devicelist = XListInputDevices (GDK_DISPLAY (), &numdevices);
         XDevice * device;
         unsigned char* data;
         Atom prop, type;
+        guchar *buttons;
+        gsize buttons_capacity = 16;
+        gint n_buttons;
+        gint tap_physical_1 = tap_button_1, tap_physical_2 = tap_button_2, tap_physical_3 = tap_button_3;
 
         if (devicelist == NULL)
                 return 0;
@@ -597,9 +604,35 @@ set_tap_to_click (gboolean state, gboolean left_handed)
         if (!prop)
                 return 0;
 
+        buttons = g_new (guchar, buttons_capacity);
+        if (!buttons)
+                return 0;
+
         for (i = 0; i < numdevices; i++) {
                 if ((device = device_is_touchpad (devicelist[i]))) {
                         gdk_error_trap_push ();
+
+                        n_buttons = XGetDeviceButtonMapping (GDK_DISPLAY (), device,
+                                                             buttons,
+                                                             buttons_capacity);
+
+                        while (n_buttons > buttons_capacity) {
+                                buttons_capacity = n_buttons;
+                                buttons = (guchar *) g_realloc (buttons,
+                                                                buttons_capacity * sizeof (guchar));
+
+                                n_buttons = XGetDeviceButtonMapping (GDK_DISPLAY (), device,
+                                                                     buttons,
+                                                                     buttons_capacity);
+                        }
+
+                        for (j = 0; j < n_buttons; j++)
+                        {
+                                if (buttons[j] == tap_button_1) tap_physical_1 = j + 1;
+                                if (buttons[j] == tap_button_2) tap_physical_2 = j + 1;
+                                if (buttons[j] == tap_button_3) tap_physical_3 = j + 1;
+                        }
+
                         rc = XGetDeviceProperty (GDK_DISPLAY (), device, prop, 0, 2,
                                                 False, XA_INTEGER, &type, &format, &nitems,
                                                 &bytes_after, &data);
@@ -607,9 +640,9 @@ set_tap_to_click (gboolean state, gboolean left_handed)
                         if (rc == Success && type == XA_INTEGER && format == 8 && nitems >= 7)
                         {
                                 /* Set RLM mapping for 1/2/3 fingers*/
-                                data[4] = (state) ? ((left_handed) ? 3 : 1) : 0;
-                                data[5] = (state) ? ((left_handed) ? 1 : 3) : 0;
-                                data[6] = (state) ? 2 : 0;
+                                data[4] = (state) ? tap_physical_1 : 0;
+                                data[5] = (state) ? tap_physical_2 : 0;
+                                data[6] = (state) ? tap_physical_3 : 0;
                                 XChangeDeviceProperty (GDK_DISPLAY (), device, prop, XA_INTEGER, 8,
                                                         PropModeReplace, data, nitems);
                         }
@@ -624,10 +657,26 @@ set_tap_to_click (gboolean state, gboolean left_handed)
                 }
         }
 
+        g_free (buttons);
+
         XFreeDeviceList (devicelist);
         return 0;
 }
 
+static int update_tap_to_click ()
+{
+        GConfClient *client = gconf_client_get_default ();
+
+        int result = set_tap_to_click (gconf_client_get_bool (client, KEY_TAP_TO_CLICK, NULL),
+                                       gconf_client_get_int  (client, KEY_TAP_BUTTON_1, NULL),
+                                       gconf_client_get_int  (client, KEY_TAP_BUTTON_2, NULL),
+                                       gconf_client_get_int  (client, KEY_TAP_BUTTON_3, NULL));
+
+        g_object_unref (client);
+
+        return result;
+}
+
 static int
 set_horiz_scroll (gboolean state)
 {
@@ -852,14 +901,12 @@ static void
 set_mouse_settings (GsdMouseManager *manager)
 {
         GConfClient *client = gconf_client_get_default ();
-        gboolean left_handed = gconf_client_get_bool (client, KEY_LEFT_HANDED, NULL);
 
-        set_left_handed (manager, left_handed);
+        set_left_handed (manager, gconf_client_get_bool (client, KEY_LEFT_HANDED, NULL));
         set_motion_acceleration (manager, gconf_client_get_float (client, KEY_MOTION_ACCELERATION , NULL));
         set_motion_threshold (manager, gconf_client_get_int (client, KEY_MOTION_THRESHOLD, NULL));
 
         set_disable_w_typing (manager, gconf_client_get_bool (client, KEY_TOUCHPAD_DISABLE_W_TYPING, NULL));
-        set_tap_to_click (gconf_client_get_bool (client, KEY_TAP_TO_CLICK, NULL), left_handed);
         set_edge_scroll (gconf_client_get_int (client, KEY_SCROLL_METHOD, NULL));
         set_horiz_scroll (gconf_client_get_bool (client, KEY_PAD_HORIZ_SCROLL, NULL));
 
@@ -887,11 +934,11 @@ mouse_callback (GConfClient        *client,
         } else if (! strcmp (entry->key, KEY_TOUCHPAD_DISABLE_W_TYPING)) {
                 if (entry->value->type == GCONF_VALUE_BOOL)
                         set_disable_w_typing (manager, gconf_value_get_bool (entry->value));
-        } else if (! strcmp (entry->key, KEY_TAP_TO_CLICK)) {
-                if (entry->value->type == GCONF_VALUE_BOOL) {
-                        set_tap_to_click (gconf_value_get_bool (entry->value),
-                                          gconf_client_get_bool (client, KEY_LEFT_HANDED, NULL));
-                }
+        } else if ((! strcmp (entry->key, KEY_TAP_TO_CLICK) && entry->value->type == GCONF_VALUE_BOOL)
+               ||  (! strcmp (entry->key, KEY_TAP_BUTTON_1) && entry->value->type == GCONF_VALUE_INT)
+               ||  (! strcmp (entry->key, KEY_TAP_BUTTON_2) && entry->value->type == GCONF_VALUE_INT)
+               ||  (! strcmp (entry->key, KEY_TAP_BUTTON_3) && entry->value->type == GCONF_VALUE_INT)) {
+                        update_tap_to_click ();
         } else if (! strcmp (entry->key, KEY_SCROLL_METHOD)) {
                 if (entry->value->type == GCONF_VALUE_INT) {
                         set_edge_scroll (gconf_value_get_int (entry->value));
@@ -971,8 +1018,7 @@ gsd_mouse_manager_idle_cb (GsdMouseManager *manager)
                                 gconf_client_get_bool (client, KEY_DELAY_ENABLE, NULL));
 
         set_disable_w_typing (manager, gconf_client_get_bool (client, KEY_TOUCHPAD_DISABLE_W_TYPING, NULL));
-        set_tap_to_click (gconf_client_get_bool (client, KEY_TAP_TO_CLICK, NULL),
-                          gconf_client_get_bool (client, KEY_LEFT_HANDED, NULL));
+        update_tap_to_click ();
         set_edge_scroll (gconf_client_get_int (client, KEY_SCROLL_METHOD, NULL));
         set_horiz_scroll (gconf_client_get_bool (client, KEY_PAD_HORIZ_SCROLL, NULL));
 
