diff -ru metacity-2.12.0.orig/src/keybindings.c metacity-2.12.0/src/keybindings.c
--- metacity-2.12.0.orig/src/keybindings.c	2005-10-03 16:02:43.000000000 -0700
+++ metacity-2.12.0/src/keybindings.c	2005-10-03 17:24:11.000000000 -0700
@@ -188,6 +188,26 @@
                                        MetaWindow     *window,
                                        XEvent         *event,
                                        MetaKeyBinding *binding);
+static void handle_corner_nw          (MetaDisplay    *display,
+                                       MetaScreen     *screen,
+                                       MetaWindow     *window,
+                                       XEvent         *event,
+                                       MetaKeyBinding *binding);
+static void handle_corner_ne          (MetaDisplay    *display,
+                                       MetaScreen     *screen,
+                                       MetaWindow     *window,
+                                       XEvent         *event,
+                                       MetaKeyBinding *binding);
+static void handle_corner_sw          (MetaDisplay    *display,
+                                       MetaScreen     *screen,
+                                       MetaWindow     *window,
+                                       XEvent         *event,
+                                       MetaKeyBinding *binding);
+static void handle_corner_se          (MetaDisplay    *display,
+                                       MetaScreen     *screen,
+                                       MetaWindow     *window,
+                                       XEvent         *event,
+                                       MetaKeyBinding *binding);
 static void handle_run_terminal       (MetaDisplay    *display,
                                        MetaScreen     *screen,
                                        MetaWindow     *window,
@@ -415,6 +435,10 @@
   { META_KEYBINDING_LOWER, handle_lower, NULL},
   { META_KEYBINDING_MAXIMIZE_VERTICALLY, handle_maximize_vert, NULL },
   { META_KEYBINDING_MAXIMIZE_HORIZONTALLY, handle_maximize_horiz, NULL },
+  { META_KEYBINDING_CORNER_NW, handle_corner_nw, NULL },
+  { META_KEYBINDING_CORNER_NE, handle_corner_ne, NULL },
+  { META_KEYBINDING_CORNER_SW, handle_corner_sw, NULL },
+  { META_KEYBINDING_CORNER_SE, handle_corner_se, NULL },
   { NULL, NULL, NULL }
 };
 
@@ -2768,6 +2792,80 @@
     }
 }
 
+/* Move a window to a corner; xdir/ydir are 0 for the top or left edge,
+ * or 1 for the bottom/right edge.  Together they describe which of the 
+ * four corners is desired.
+ */
+static void
+do_corner (MetaDisplay    *display,
+           MetaScreen     *screen,
+           MetaWindow     *window,
+           int             xdir,
+           int             ydir)
+{
+  MetaRectangle work_area;
+
+  meta_window_get_work_area_all_xineramas (window, &work_area);
+  meta_window_move_resize (window,
+          TRUE,
+          (xdir == 0) ? 0 : (work_area.width - window->frame->rect.width),
+          (ydir == 0) ? 0 : (work_area.height - window->frame->rect.height),
+          window->rect.width,
+          window->rect.height);
+}
+
+static void
+handle_corner_nw          (MetaDisplay    *display,
+                           MetaScreen     *screen,
+                           MetaWindow     *window,
+                           XEvent         *event,
+                           MetaKeyBinding *binding)
+{
+  if (window)
+    {
+      do_corner (display, screen, window, 0, 0);
+    }
+}
+
+static void
+handle_corner_ne          (MetaDisplay    *display,
+                           MetaScreen     *screen,
+                           MetaWindow     *window,
+                           XEvent         *event,
+                           MetaKeyBinding *binding)
+{
+  if (window)
+    {
+      do_corner (display, screen, window, 1, 0);
+    }
+}
+
+static void
+handle_corner_sw          (MetaDisplay    *display,
+                           MetaScreen     *screen,
+                           MetaWindow     *window,
+                           XEvent         *event,
+                           MetaKeyBinding *binding)
+{
+  if (window)
+    {
+      do_corner (display, screen, window, 0, 1);
+    }
+}
+
+static void
+handle_corner_se          (MetaDisplay    *display,
+                           MetaScreen     *screen,
+                           MetaWindow     *window,
+                           XEvent         *event,
+                           MetaKeyBinding *binding)
+{
+  if (window)
+    {
+      do_corner (display, screen, window, 1, 1);
+    }
+}
+
 static gboolean
 process_workspace_switch_grab (MetaDisplay *display,
                                MetaScreen  *screen,
diff -ru metacity-2.12.0.orig/src/metacity.schemas.in metacity-2.12.0/src/metacity.schemas.in
--- metacity-2.12.0.orig/src/metacity.schemas.in	2005-10-03 16:02:43.000000000 -0700
+++ metacity-2.12.0/src/metacity.schemas.in	2005-10-03 17:50:38.000000000 -0700
@@ -1029,6 +1029,102 @@
       </locale>
     </schema>
 
+    <schema>
+      <key>/schemas/apps/metacity/window_keybindings/corner_nw</key>
+      <applyto>/apps/metacity/window_keybindings/corner_nw</applyto>
+      <owner>metacity</owner>
+      <type>string</type>
+      <!-- no default for this one -->
+      <locale name="C">
+         <short>Move window to north-west corner</short>
+         <long>
+            This keybinding moves a window into the north-west (top left)
+            corner of the screen.
+
+            The format looks like "&lt;Control&gt;a" or
+            "&lt;Shift&gt;&lt;Alt&gt;F1".
+
+            The parser is fairly liberal and allows lower or upper case,
+            and also abbreviations such as "&lt;Ctl&gt;" and
+            "&lt;Ctrl&gt;". If you set the option to the special string
+            "disabled", then there will be no keybinding for this
+            action.
+         </long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/apps/metacity/window_keybindings/corner_ne</key>
+      <applyto>/apps/metacity/window_keybindings/corner_ne</applyto>
+      <owner>metacity</owner>
+      <type>string</type>
+      <!-- no default for this one -->
+      <locale name="C">
+         <short>Move window to north-east corner</short>
+         <long>
+            This keybinding moves a window into the north-east (top right)
+            corner of the screen.
+
+            The format looks like "&lt;Control&gt;a" or
+            "&lt;Shift&gt;&lt;Alt&gt;F1".
+
+            The parser is fairly liberal and allows lower or upper case,
+            and also abbreviations such as "&lt;Ctl&gt;" and
+            "&lt;Ctrl&gt;". If you set the option to the special string
+            "disabled", then there will be no keybinding for this
+            action.
+         </long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/apps/metacity/window_keybindings/corner_sw</key>
+      <applyto>/apps/metacity/window_keybindings/corner_sw</applyto>
+      <owner>metacity</owner>
+      <type>string</type>
+      <!-- no default for this one -->
+      <locale name="C">
+         <short>Move window to south-west corner</short>
+         <long>
+            This keybinding moves a window into the south-west (bottom left)
+            corner of the screen.
+
+            The format looks like "&lt;Control&gt;a" or
+            "&lt;Shift&gt;&lt;Alt&gt;F1".
+
+            The parser is fairly liberal and allows lower or upper case,
+            and also abbreviations such as "&lt;Ctl&gt;" and
+            "&lt;Ctrl&gt;". If you set the option to the special string
+            "disabled", then there will be no keybinding for this
+            action.
+         </long>
+      </locale>
+    </schema>
+
+    <schema>
+      <key>/schemas/apps/metacity/window_keybindings/corner_se</key>
+      <applyto>/apps/metacity/window_keybindings/corner_se</applyto>
+      <owner>metacity</owner>
+      <type>string</type>
+      <!-- no default for this one -->
+      <locale name="C">
+         <short>Move window to south-east corner</short>
+         <long>
+            This keybinding moves a window into the south-east (bottom right)
+            corner of the screen.
+
+            The format looks like "&lt;Control&gt;a" or
+            "&lt;Shift&gt;&lt;Alt&gt;F1".
+
+            The parser is fairly liberal and allows lower or upper case,
+            and also abbreviations such as "&lt;Ctl&gt;" and
+            "&lt;Ctrl&gt;". If you set the option to the special string
+            "disabled", then there will be no keybinding for this
+            action.
+         </long>
+      </locale>
+    </schema>
+
     <!-- Global Keybindings -->
 
 
diff -ru metacity-2.12.0.orig/src/prefs.c metacity-2.12.0/src/prefs.c
--- metacity-2.12.0.orig/src/prefs.c	2005-10-03 16:02:43.000000000 -0700
+++ metacity-2.12.0/src/prefs.c	2005-10-03 16:39:00.000000000 -0700
@@ -1695,6 +1695,10 @@
   { META_KEYBINDING_LOWER, 0, 0, FALSE },
   { META_KEYBINDING_MAXIMIZE_VERTICALLY, 0, 0, FALSE },
   { META_KEYBINDING_MAXIMIZE_HORIZONTALLY, 0, 0, FALSE },
+  { META_KEYBINDING_CORNER_NW, 0, 0, FALSE },
+  { META_KEYBINDING_CORNER_NE, 0, 0, FALSE },
+  { META_KEYBINDING_CORNER_SW, 0, 0, FALSE },
+  { META_KEYBINDING_CORNER_SE, 0, 0, FALSE },
   { NULL, 0, 0, FALSE }
 };
 
diff -ru metacity-2.12.0.orig/src/prefs.h metacity-2.12.0/src/prefs.h
--- metacity-2.12.0.orig/src/prefs.h	2005-10-03 16:02:43.000000000 -0700
+++ metacity-2.12.0/src/prefs.h	2005-10-03 16:38:43.000000000 -0700
@@ -194,6 +194,10 @@
 #define META_KEYBINDING_LOWER                    "lower"
 #define META_KEYBINDING_MAXIMIZE_VERTICALLY      "maximize_vertically"
 #define META_KEYBINDING_MAXIMIZE_HORIZONTALLY    "maximize_horizontally"
+#define META_KEYBINDING_CORNER_NW                "corner_nw"
+#define META_KEYBINDING_CORNER_NE                "corner_ne"
+#define META_KEYBINDING_CORNER_SW                "corner_sw"
+#define META_KEYBINDING_CORNER_SE                "corner_se"
 
 typedef enum _MetaKeyBindingAction
 {
