diff -ru orig/metacity-2.14.5/src/keybindings.c metacity-2.14.5/src/keybindings.c
--- orig/metacity-2.14.5/src/keybindings.c	2006-04-27 20:23:05.000000000 +0100
+++ metacity-2.14.5/src/keybindings.c	2006-06-30 14:47:26.000000000 +0100
@@ -190,6 +190,46 @@
                                        MetaWindow     *window,
                                        XEvent         *event,
                                        MetaKeyBinding *binding);
+static void handle_move_to_side_n     (MetaDisplay    *display,
+                                       MetaScreen     *screen,
+                                       MetaWindow     *window,
+                                       XEvent         *event,
+                                       MetaKeyBinding *binding);
+static void handle_move_to_side_w     (MetaDisplay    *display,
+                                       MetaScreen     *screen,
+                                       MetaWindow     *window,
+                                       XEvent         *event,
+                                       MetaKeyBinding *binding);
+static void handle_move_to_side_s     (MetaDisplay    *display,
+                                       MetaScreen     *screen,
+                                       MetaWindow     *window,
+                                       XEvent         *event,
+                                       MetaKeyBinding *binding);
+static void handle_move_to_side_e     (MetaDisplay    *display,
+                                       MetaScreen     *screen,
+                                       MetaWindow     *window,
+                                       XEvent         *event,
+                                       MetaKeyBinding *binding);
+static void handle_move_to_corner_nw          (MetaDisplay    *display,
+                                       MetaScreen     *screen,
+                                       MetaWindow     *window,
+                                       XEvent         *event,
+                                       MetaKeyBinding *binding);
+static void handle_move_to_corner_ne          (MetaDisplay    *display,
+                                       MetaScreen     *screen,
+                                       MetaWindow     *window,
+                                       XEvent         *event,
+                                       MetaKeyBinding *binding);
+static void handle_move_to_corner_sw          (MetaDisplay    *display,
+                                       MetaScreen     *screen,
+                                       MetaWindow     *window,
+                                       XEvent         *event,
+                                       MetaKeyBinding *binding);
+static void handle_move_to_corner_se          (MetaDisplay    *display,
+                                       MetaScreen     *screen,
+                                       MetaWindow     *window,
+                                       XEvent         *event,
+                                       MetaKeyBinding *binding);
 static void handle_run_terminal       (MetaDisplay    *display,
                                        MetaScreen     *screen,
                                        MetaWindow     *window,
@@ -417,6 +457,14 @@
   { META_KEYBINDING_LOWER, handle_lower, NULL},
   { META_KEYBINDING_MAXIMIZE_VERTICALLY, handle_maximize_vert, NULL },
   { META_KEYBINDING_MAXIMIZE_HORIZONTALLY, handle_maximize_horiz, NULL },
+  { META_KEYBINDING_MOVE_TO_SIDE_N, handle_move_to_side_n, NULL },
+  { META_KEYBINDING_MOVE_TO_SIDE_S, handle_move_to_side_s, NULL },
+  { META_KEYBINDING_MOVE_TO_SIDE_E, handle_move_to_side_e, NULL },
+  { META_KEYBINDING_MOVE_TO_SIDE_W, handle_move_to_side_w, NULL },
+  { META_KEYBINDING_MOVE_TO_CORNER_NW, handle_move_to_corner_nw, NULL },
+  { META_KEYBINDING_MOVE_TO_CORNER_NE, handle_move_to_corner_ne, NULL },
+  { META_KEYBINDING_MOVE_TO_CORNER_SW, handle_move_to_corner_sw, NULL },
+  { META_KEYBINDING_MOVE_TO_CORNER_SE, handle_move_to_corner_se, NULL },
   { NULL, NULL, NULL }
 };
 
@@ -2686,6 +2734,161 @@
     }
 }
 
+/* Move a window to a corner; xdir/ydir are 0 for the top or left edge,
+ * or 1 for the bottom/right edge.  xchange/ychange are 0 if that
+ * dimension is not to be changed, 1 otherwise.  Together they describe
+ * which of the four corners, or four sides, is desired.
+ */
+static void
+handle_move_to_corner_backend (MetaDisplay    *display,
+           MetaScreen     *screen,
+           MetaWindow     *window,
+           int             xchange,
+           int             ychange,
+           int             xdir,
+           int             ydir)
+{
+  MetaRectangle work_area;
+  MetaRectangle outer;
+  int orig_x, orig_y;
+  int new_x, new_y;
+  int frame_width, frame_height;
+
+  meta_window_get_work_area_all_xineramas (window, &work_area);
+  meta_window_get_outer_rect (window, &outer);
+  meta_window_get_position (window, &orig_x, &orig_y);
+
+  frame_width = (window->frame ? window->frame->child_x : 0);
+  frame_height = (window->frame ? window->frame->child_y : 0);
+
+  if (xchange == 0) {
+    new_x = orig_x;
+  } else {
+    new_x = work_area.x + ((xdir == 0) ?
+            0 :
+            (work_area.width + frame_width) - outer.width);
+  }
+
+  if (ychange == 0) {
+    new_y = orig_y;
+  } else {
+    new_y = work_area.y + ((ydir == 0) ?
+            0 :
+            (work_area.height + frame_height) - outer.height);
+  }
+
+  meta_window_move_resize (window,
+          FALSE,
+          new_x,
+          new_y,
+          window->rect.width,
+          window->rect.height);
+}
+
+static void
+handle_move_to_corner_nw  (MetaDisplay    *display,
+                           MetaScreen     *screen,
+                           MetaWindow     *window,
+                           XEvent         *event,
+                           MetaKeyBinding *binding)
+{
+  if (window)
+    {
+      handle_move_to_corner_backend (display, screen, window, 1, 1, 0, 0);
+    }
+}
+
+static void
+handle_move_to_corner_ne  (MetaDisplay    *display,
+                           MetaScreen     *screen,
+                           MetaWindow     *window,
+                           XEvent         *event,
+                           MetaKeyBinding *binding)
+{
+  if (window)
+    {
+      handle_move_to_corner_backend (display, screen, window, 1, 1, 1, 0);
+    }
+}
+
+static void
+handle_move_to_corner_sw  (MetaDisplay    *display,
+                           MetaScreen     *screen,
+                           MetaWindow     *window,
+                           XEvent         *event,
+                           MetaKeyBinding *binding)
+{
+  if (window)
+    {
+      handle_move_to_corner_backend (display, screen, window, 1, 1, 0, 1);
+    }
+}
+
+static void
+handle_move_to_corner_se  (MetaDisplay    *display,
+                           MetaScreen     *screen,
+                           MetaWindow     *window,
+                           XEvent         *event,
+                           MetaKeyBinding *binding)
+{
+  if (window)
+    {
+      handle_move_to_corner_backend (display, screen, window, 1, 1, 1, 1);
+    }
+}
+
+static void
+handle_move_to_side_n     (MetaDisplay    *display,
+                           MetaScreen     *screen,
+                           MetaWindow     *window,
+                           XEvent         *event,
+                           MetaKeyBinding *binding)
+{
+  if (window)
+    {
+      handle_move_to_corner_backend (display, screen, window, 0, 1, 0, 0);
+    }
+}
+
+static void
+handle_move_to_side_s     (MetaDisplay    *display,
+                           MetaScreen     *screen,
+                           MetaWindow     *window,
+                           XEvent         *event,
+                           MetaKeyBinding *binding)
+{
+  if (window)
+    {
+      handle_move_to_corner_backend (display, screen, window, 0, 1, 0, 1);
+    }
+}
+
+static void
+handle_move_to_side_e     (MetaDisplay    *display,
+                           MetaScreen     *screen,
+                           MetaWindow     *window,
+                           XEvent         *event,
+                           MetaKeyBinding *binding)
+{
+  if (window)
+    {
+      handle_move_to_corner_backend (display, screen, window, 1, 0, 1, 0);
+    }
+}
+
+static void
+handle_move_to_side_w     (MetaDisplay    *display,
+                           MetaScreen     *screen,
+                           MetaWindow     *window,
+                           XEvent         *event,
+                           MetaKeyBinding *binding)
+{
+  if (window)
+    {
+      handle_move_to_corner_backend (display, screen, window, 1, 0, 0, 0);
+    }
+}
+
 static gboolean
 process_workspace_switch_grab (MetaDisplay *display,
                                MetaScreen  *screen,
diff -ru orig/metacity-2.14.5/src/metacity.schemas.in metacity-2.14.5/src/metacity.schemas.in
--- orig/metacity-2.14.5/src/metacity.schemas.in	2006-04-27 20:23:05.000000000 +0100
+++ metacity-2.14.5/src/metacity.schemas.in	2006-06-30 14:52:31.000000000 +0100
@@ -1086,6 +1086,198 @@
       </locale>
     </schema>
 
+    <schema>
+      <key>/schemas/apps/metacity/window_keybindings/move_to_corner_nw</key>
+      <applyto>/apps/metacity/window_keybindings/move_to_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/move_to_corner_ne</key>
+      <applyto>/apps/metacity/window_keybindings/move_to_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/move_to_corner_sw</key>
+      <applyto>/apps/metacity/window_keybindings/move_to_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/move_to_corner_se</key>
+      <applyto>/apps/metacity/window_keybindings/move_to_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>
+
+    <schema>
+      <key>/schemas/apps/metacity/window_keybindings/move_to_side_n</key>
+      <applyto>/apps/metacity/window_keybindings/move_to_side_n</applyto>
+      <owner>metacity</owner>
+      <type>string</type>
+      <!-- no default for this one -->
+      <locale name="C">
+         <short>Move window to north side of screen</short>
+         <long>
+            This keybinding moves a window against the north (top)
+            side 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/move_to_side_s</key>
+      <applyto>/apps/metacity/window_keybindings/move_to_side_s</applyto>
+      <owner>metacity</owner>
+      <type>string</type>
+      <!-- no default for this one -->
+      <locale name="C">
+         <short>Move window to south side of screen</short>
+         <long>
+            This keybinding moves a window into the south (bottom)
+            side 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/move_to_side_e</key>
+      <applyto>/apps/metacity/window_keybindings/move_to_side_e</applyto>
+      <owner>metacity</owner>
+      <type>string</type>
+      <!-- no default for this one -->
+      <locale name="C">
+         <short>Move window to east side of screen</short>
+         <long>
+            This keybinding moves a window into the east (right)
+            side 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/move_to_side_w</key>
+      <applyto>/apps/metacity/window_keybindings/move_to_side_w</applyto>
+      <owner>metacity</owner>
+      <type>string</type>
+      <!-- no default for this one -->
+      <locale name="C">
+         <short>Move window to west side of screen</short>
+         <long>
+            This keybinding moves a window into the west (left)
+            side 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 orig/metacity-2.14.5/src/prefs.c metacity-2.14.5/src/prefs.c
--- orig/metacity-2.14.5/src/prefs.c	2006-05-15 19:33:36.000000000 +0100
+++ metacity-2.14.5/src/prefs.c	2006-06-30 14:52:31.000000000 +0100
@@ -1810,6 +1812,14 @@
   { META_KEYBINDING_LOWER, 0, 0, FALSE },
   { META_KEYBINDING_MAXIMIZE_VERTICALLY, 0, 0, FALSE },
   { META_KEYBINDING_MAXIMIZE_HORIZONTALLY, 0, 0, FALSE },
+  { META_KEYBINDING_MOVE_TO_CORNER_NW, 0, 0, FALSE },
+  { META_KEYBINDING_MOVE_TO_CORNER_NE, 0, 0, FALSE },
+  { META_KEYBINDING_MOVE_TO_CORNER_SW, 0, 0, FALSE },
+  { META_KEYBINDING_MOVE_TO_CORNER_SE, 0, 0, FALSE },
+  { META_KEYBINDING_MOVE_TO_SIDE_N, 0, 0, FALSE },
+  { META_KEYBINDING_MOVE_TO_SIDE_S, 0, 0, FALSE },
+  { META_KEYBINDING_MOVE_TO_SIDE_E, 0, 0, FALSE },
+  { META_KEYBINDING_MOVE_TO_SIDE_W, 0, 0, FALSE },
   { NULL, 0, 0, FALSE }
 };
 
diff -ru orig/metacity-2.14.5/src/prefs.h metacity-2.14.5/src/prefs.h
--- orig/metacity-2.14.5/src/prefs.h	2006-04-27 20:23:05.000000000 +0100
+++ metacity-2.14.5/src/prefs.h	2006-06-30 14:48:32.000000000 +0100
@@ -199,6 +199,14 @@
 #define META_KEYBINDING_LOWER                    "lower"
 #define META_KEYBINDING_MAXIMIZE_VERTICALLY      "maximize_vertically"
 #define META_KEYBINDING_MAXIMIZE_HORIZONTALLY    "maximize_horizontally"
+#define META_KEYBINDING_MOVE_TO_CORNER_NW        "move_to_corner_nw"
+#define META_KEYBINDING_MOVE_TO_CORNER_NE        "move_to_corner_ne"
+#define META_KEYBINDING_MOVE_TO_CORNER_SW        "move_to_corner_sw"
+#define META_KEYBINDING_MOVE_TO_CORNER_SE        "move_to_corner_se"
+#define META_KEYBINDING_MOVE_TO_SIDE_N           "move_to_side_n"
+#define META_KEYBINDING_MOVE_TO_SIDE_S           "move_to_side_s"
+#define META_KEYBINDING_MOVE_TO_SIDE_E           "move_to_side_e"
+#define META_KEYBINDING_MOVE_TO_SIDE_W           "move_to_side_w"
 
 typedef enum _MetaKeyBindingAction
 {
