diff -Naur metacity-2.4.1/src/display.c metacity-2.4.1-ttb/src/display.c
--- metacity-2.4.1/src/display.c	2002-09-04 00:15:46.000000000 -0400
+++ metacity-2.4.1-ttb/src/display.c	2002-09-12 18:03:47.000000000 -0400
@@ -1066,7 +1066,7 @@
           unmodified = (event->xbutton.state & grab_mask) == 0;
           
           if (unmodified ||
-              event->xbutton.button == 1)
+              event->xbutton.button == meta_prefs_get_mouse_move_button())
             {
               if (!frame_was_receiver)
                 {
@@ -1115,7 +1115,7 @@
               if (!unmodified)
                 begin_move = TRUE;
             }
-          else if (event->xbutton.button == 2)
+          else if (event->xbutton.button == meta_prefs_get_mouse_resize_button())
             {
               if (window->has_resize_func)
                 {
@@ -1150,7 +1150,7 @@
                                               event->xbutton.y_root);
                 }
             }
-          else if (event->xbutton.button == 3)
+          else if (event->xbutton.button == meta_prefs_get_mouse_menu_button())
             {
               meta_window_show_menu (window,
                                      event->xbutton.x_root,
diff -Naur metacity-2.4.1/src/metacity.schemas.in metacity-2.4.1-ttb/src/metacity.schemas.in
--- metacity-2.4.1/src/metacity.schemas.in	2002-09-08 15:39:45.000000000 -0400
+++ metacity-2.4.1-ttb/src/metacity.schemas.in	2002-09-12 16:10:52.000000000 -0400
@@ -1412,6 +1412,54 @@
     </schema>
 
     <schema>
+        <key>/schemas/apps/metacity/general/mouse_move_button</key>
+        <applyto>/apps/metacity/general/mouse_move_button</applyto>
+        <owner>metacity</owner>
+        <type>int</type>
+        <default>1</default>
+        <locale name="C">
+            <short>Mouse button to be used with alt+click to start a window movement</short>
+            <long>
+                1 == Left
+                2 == Middle
+                3 == Right
+            </long>
+        </locale>
+    </schema>
+
+    <schema>
+        <key>/schemas/apps/metacity/general/mouse_resize_button</key>
+        <applyto>/apps/metacity/general/mouse_resize_button</applyto>
+        <owner>metacity</owner>
+        <type>int</type>
+        <default>2</default>
+        <locale name="C">
+            <short>Mouse button to be used with alt+click to start a window resize</short>
+            <long>
+                1 == Left
+                2 == Middle
+                3 == Right
+            </long>
+        </locale>
+    </schema>
+
+    <schema>
+        <key>/schemas/apps/metacity/general/mouse_menu_button</key>
+        <applyto>/apps/metacity/general/mouse_menu_button</applyto>
+        <owner>metacity</owner>
+        <type>int</type>
+        <default>3</default>
+        <locale name="C">
+            <short>Mouse button to be used with alt+click to get a properties menu</short>
+            <long>
+                1 == Left
+                2 == Middle
+                3 == Right
+            </long>
+        </locale>
+    </schema>
+
+    <schema>
       <key>/schemas/apps/metacity/general/disable_workarounds</key>
       <applyto>/apps/metacity/general/disable_workarounds</applyto>      
       <owner>metacity</owner>
diff -Naur metacity-2.4.1/src/prefs.c metacity-2.4.1-ttb/src/prefs.c
--- metacity-2.4.1/src/prefs.c	2002-08-21 02:47:16.000000000 -0400
+++ metacity-2.4.1-ttb/src/prefs.c	2002-09-12 18:02:18.000000000 -0400
@@ -44,6 +44,10 @@
 #define KEY_SCREEN_BINDINGS_PREFIX "/apps/metacity/global_keybindings"
 #define KEY_WINDOW_BINDINGS_PREFIX "/apps/metacity/window_keybindings"
 
+#define KEY_MOUSE_MOVE_BUTTON   "/apps/metacity/general/mouse_move_button"
+#define KEY_MOUSE_RESIZE_BUTTON "/apps/metacity/general/mouse_resize_button"
+#define KEY_MOUSE_MENU_BUTTON   "/apps/metacity/general/mouse_menu_button"
+
 static GConfClient *default_client = NULL;
 static GList *listeners = NULL;
 static GList *changes = NULL;
@@ -53,6 +57,9 @@
 static MetaFocusMode focus_mode = META_FOCUS_MODE_CLICK;
 static char* current_theme = NULL;
 static int num_workspaces = 4;
+static int mouse_move_button = 1;
+static int mouse_resize_button = 2;
+static int mouse_menu_button = 3;
 static gboolean application_based = FALSE;
 static gboolean disable_workarounds = FALSE;
 static gboolean auto_raise = FALSE;
@@ -74,6 +81,14 @@
                                            const char *value);
 static gboolean update_screen_binding     (const char *name,
                                            const char *value);
+
+/* Keep mouse buttons sane */
+#define MOUSE_BUTTON_MIN 1
+#define MOUSE_BUTTON_MAX 3
+static gboolean update_mouse_move_button  (int         value);
+static gboolean update_mouse_resize_button (int        value);
+static gboolean update_mouse_menu_button  (int         value);
+
 static void     init_bindings             (void);
 static gboolean update_binding            (MetaKeyPref *binding,
                                            const char  *value);
@@ -289,6 +304,23 @@
                                     &err);
   cleanup_error (&err);
   update_disable_workarounds (bool_val);
+
+  /* Added for customized alt+click mouse buttons */
+
+  int_val = gconf_client_get_int (default_client, KEY_MOUSE_MOVE_BUTTON,
+                                    &err);
+  cleanup_error(&err);
+  update_mouse_move_button(int_val);
+
+  int_val = gconf_client_get_int (default_client, KEY_MOUSE_RESIZE_BUTTON,
+                                    &err);
+  cleanup_error(&err);
+  update_mouse_resize_button(int_val);
+
+  int_val = gconf_client_get_int (default_client, KEY_MOUSE_MENU_BUTTON,
+                                    &err);
+  cleanup_error(&err);
+  update_mouse_menu_button(int_val);
   
   /* Load keybindings prefs */
   init_bindings ();
@@ -337,6 +369,57 @@
   key = gconf_entry_get_key (entry);
   value = gconf_entry_get_value (entry);
   
+  if (strcmp (key, KEY_MOUSE_MOVE_BUTTON) == 0)
+  {
+      int val;
+
+      if (value && value->type != GCONF_VALUE_INT)
+        {
+          meta_warning (_("GConf key \"%s\" is set to an invalid type\n"),
+                        KEY_MOUSE_MOVE_BUTTON);
+          goto out;
+        }
+
+      val = value ? gconf_value_get_int(value) : 1;
+
+      if (update_mouse_move_button(val))
+        queue_changed (META_PREF_MOUSE_MOVE_BUTTON);
+  }
+
+  if (strcmp (key, KEY_MOUSE_RESIZE_BUTTON) == 0)
+  {
+      int val;
+
+      if (value && value->type != GCONF_VALUE_INT)
+        {
+          meta_warning (_("GConf key \"%s\" is set to an invalid type\n"),
+                        KEY_MOUSE_RESIZE_BUTTON);
+          goto out;
+        }
+
+      val = value ? gconf_value_get_int(value) : 1;
+
+      if (update_mouse_resize_button(val))
+        queue_changed (META_PREF_MOUSE_RESIZE_BUTTON);
+  }
+
+  if (strcmp (key, KEY_MOUSE_MENU_BUTTON) == 0)
+  {
+      int val;
+
+      if (value && value->type != GCONF_VALUE_INT)
+        {
+          meta_warning (_("GConf key \"%s\" is set to an invalid type\n"),
+                        KEY_MOUSE_MENU_BUTTON);
+          goto out;
+        }
+
+      val = value ? gconf_value_get_int(value) : 1;
+
+      if (update_mouse_menu_button(val))
+        queue_changed (META_PREF_MOUSE_MENU_BUTTON);
+  }
+
   if (strcmp (key, KEY_FOCUS_MODE) == 0)
     {
       const char *str;
@@ -799,6 +882,15 @@
 
     case META_PREF_COMMANDS:
       return "COMMANDS";
+
+    case META_PREF_MOUSE_MOVE_BUTTON:
+      return "MOVE_BUTTON";
+
+    case META_PREF_MOUSE_RESIZE_BUTTON:
+      return "RESIZE_BUTTON";
+
+    case META_PREF_MOUSE_MENU_BUTTON:
+      return "MENU_BUTTON";
     }
 
   return "(unknown)";
@@ -1171,6 +1263,58 @@
   return auto_raise_delay;
 }
 
+static gboolean
+update_mouse_move_button(int value)
+{
+  if (value < MOUSE_BUTTON_MIN || value > MOUSE_BUTTON_MAX)
+        return FALSE;
+
+  mouse_move_button = value;
+
+  return TRUE;
+}
+
+int 
+meta_prefs_get_mouse_move_button ()
+{
+  return mouse_move_button;
+}
+
+static gboolean
+update_mouse_resize_button(int value)
+{
+  if (value < MOUSE_BUTTON_MIN || value > MOUSE_BUTTON_MAX)
+        return FALSE;
+
+  mouse_resize_button = value;
+
+  return TRUE;
+}
+
+int
+meta_prefs_get_mouse_resize_button ()
+{
+  return mouse_resize_button;  
+}
+
+static gboolean
+update_mouse_menu_button(int value)
+{
+  if (value < MOUSE_BUTTON_MIN || value > MOUSE_BUTTON_MAX)
+        return FALSE;
+
+  mouse_menu_button = value;
+
+  return TRUE;
+}
+
+int meta_prefs_get_mouse_menu_button ()
+{
+  return mouse_menu_button;
+}
+
+
+
 MetaKeyBindingAction
 meta_prefs_get_keybinding_action (const char *name)
 {
diff -Naur metacity-2.4.1/src/prefs.h metacity-2.4.1-ttb/src/prefs.h
--- metacity-2.4.1/src/prefs.h	2002-08-21 02:47:16.000000000 -0400
+++ metacity-2.4.1-ttb/src/prefs.h	2002-09-12 17:59:23.000000000 -0400
@@ -38,7 +38,10 @@
   META_PREF_WINDOW_KEYBINDINGS,
   META_PREF_SCREEN_KEYBINDINGS,
   META_PREF_DISABLE_WORKAROUNDS,
-  META_PREF_COMMANDS
+  META_PREF_COMMANDS,
+  META_PREF_MOUSE_MOVE_BUTTON,
+  META_PREF_MOUSE_RESIZE_BUTTON,
+  META_PREF_MOUSE_MENU_BUTTON
 } MetaPreference;
 
 typedef void (* MetaPrefsChangedFunc) (MetaPreference pref,
@@ -62,6 +65,10 @@
 gboolean                    meta_prefs_get_auto_raise         (void);
 int                         meta_prefs_get_auto_raise_delay   (void);
 
+int                         meta_prefs_get_mouse_move_button  (void);
+int                         meta_prefs_get_mouse_resize_button(void);
+int                         meta_prefs_get_mouse_menu_button  (void);
+
 const char*                 meta_prefs_get_command            (int i);
 
 char*                       meta_prefs_get_gconf_key_for_command (int i);
