diff -ur metacity-2.8.6/src/common.h metacity-2.8.6-patched/src/common.h
--- metacity-2.8.6/src/common.h	2005-02-15 20:33:57.000000000 -0600
+++ metacity-2.8.6-patched/src/common.h	2005-03-08 20:31:03.542536008 -0600
@@ -151,6 +151,15 @@
 
 typedef enum
 {
+  META_PLACEMENT_MODE_FIRST_FIT,
+  META_PLACEMENT_MODE_RANDOM,
+  META_PLACEMENT_MODE_CASCADE,
+  META_PLACEMENT_MODE_CENTER,
+  META_PLACEMENT_MODE_ORIGIN
+} MetaPlacementMode;
+
+typedef enum
+{
   META_ACTION_DOUBLE_CLICK_TITLEBAR_TOGGLE_SHADE,
   META_ACTION_DOUBLE_CLICK_TITLEBAR_TOGGLE_MAXIMIZE,
   META_ACTION_DOUBLE_CLICK_TITLEBAR_LAST
diff -ur metacity-2.8.6/src/metacity.schemas.in metacity-2.8.6-patched/src/metacity.schemas.in
--- metacity-2.8.6/src/metacity.schemas.in	2005-02-19 16:52:13.000000000 -0600
+++ metacity-2.8.6-patched/src/metacity.schemas.in	2005-03-08 20:31:03.544535704 -0600
@@ -1894,6 +1894,29 @@
       </locale>
     </schema>
 
+    <schema>
+      <key>/schemas/apps/metacity/general/placement_mode</key>
+      <applyto>/apps/metacity/general/placement_mode</applyto>
+      <owner>metacity</owner>
+      <type>string</type>
+      <default>first_fit</default>
+      <locale name="C">
+         <short>Window placement policy</short>
+         <long>
+          Metacity's original window-placement policy is first-fit,
+          similar to the "smart" window-placement policies in some
+          other window managers. It will try to tile windows so that
+          they do not overlap. This is still the default behavior.
+
+          Change this value to "random" to enable random window
+          placement. Change it to "smart" or "first_fit" to change
+          it back to the original/default method.
+
+         </long>
+
+      </locale>
+    </schema>
+
 
   </schemalist>  
 </gconfschemafile>
diff -ur metacity-2.8.6/src/place.c metacity-2.8.6-patched/src/place.c
--- metacity-2.8.6/src/place.c	2005-02-19 16:52:13.000000000 -0600
+++ metacity-2.8.6-patched/src/place.c	2005-03-08 20:31:03.546535400 -0600
@@ -554,6 +554,184 @@
   return retval;
 }
 
+static gboolean
+find_random_position (MetaWindow *window,
+                MetaFrameGeometry *fgeom,
+                /* visible windows on relevant workspaces */
+                GList      *windows,
+                int*        xineramas_list,
+                int         n_xineramas,
+                int         x,
+                int         y,
+                int        *new_x,
+                int        *new_y)
+{
+  /* The following function implements a simple random-window-placement
+   * option. If the window to be positioned is bigger than the available
+   * work area in either the X or Y dimension, then this function gives
+   * up and returns FALSE, letting the calling function deal with it.
+   * The code to find_first_fit() was the starting point for this.
+   */
+  MetaRectangle rect;
+  MetaRectangle work_area;
+  int i;
+
+  rect.width = window->rect.width;
+  rect.height = window->rect.height;
+
+  if (fgeom)
+    {
+      rect.width += fgeom->left_width + fgeom->right_width;
+      rect.height += fgeom->top_height + fgeom->bottom_height;
+    }
+
+  for (i = 0; i < n_xineramas; i++)
+    {
+      meta_topic (META_DEBUG_XINERAMA,
+                  "Natural xinerama %d is %d,%d %dx%d\n",
+                  i,
+                  window->screen->xinerama_infos[xineramas_list[i]].x_origin,
+                  window->screen->xinerama_infos[xineramas_list[i]].y_origin,
+                  window->screen->xinerama_infos[xineramas_list[i]].width,
+                  window->screen->xinerama_infos[xineramas_list[i]].height);
+    }
+
+  /* try each xinerama in the natural ordering in turn */
+  for (i = 0; i < n_xineramas; i++)
+    {
+      meta_window_get_work_area_for_xinerama (window,
+                                              xineramas_list[i],
+                                              &work_area);
+
+      if ((rect.width < work_area.width) && (rect.height < work_area.height))
+        {
+          *new_x = (int) ((float) (work_area.width - rect.width) *
+                          ((float) rand() / (float) RAND_MAX));
+          *new_y = (int) ((float) (work_area.height - rect.height) *
+                          ((float) rand() / (float) RAND_MAX));
+
+          *new_x += work_area.x;
+          *new_y += work_area.y;
+
+          if (fgeom)
+            {
+              *new_x += fgeom->left_width;
+              *new_y += fgeom->top_height;
+            }
+
+          return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
+static gboolean
+find_cascade_position (MetaWindow *window,
+                MetaFrameGeometry *fgeom,
+                /* visible windows on relevant workspaces */
+                GList      *windows,
+                int*        xineramas_list,
+                int         n_xineramas,
+                int         x,
+                int         y,
+                int        *new_x,
+                int        *new_y)
+{
+  MetaRectangle rect;
+  MetaRectangle work_area;
+#define DEFAULT_CASCADE_OFFSET  10
+  static int static_x = DEFAULT_CASCADE_OFFSET;
+  static int static_y = DEFAULT_CASCADE_OFFSET;
+  static int cascade_offset = DEFAULT_CASCADE_OFFSET;
+
+  rect.width = window->rect.width;
+  rect.height = window->rect.height;
+
+  meta_window_get_work_area_for_xinerama (window,
+                                          xineramas_list[0],
+                                          &work_area);
+
+  if (fgeom)
+    {
+      rect.width += fgeom->left_width + fgeom->right_width;
+      rect.height += fgeom->top_height + fgeom->bottom_height;
+      cascade_offset = fgeom->top_height;
+    }
+
+  if ((rect.width > work_area.width) || (rect.height > work_area.height))
+    {
+      return FALSE;
+    }
+
+  static_x += cascade_offset;
+  if ((static_x + rect.width) > work_area.width)
+    static_x = 0;
+
+  static_y += cascade_offset;
+  if ((static_y + rect.height) > work_area.height)
+    static_y = 0;
+
+  *new_x = static_x;
+  *new_y = static_y;
+
+  *new_x += work_area.x;
+  *new_y += work_area.y;
+
+  if (fgeom)
+    {
+      *new_x += fgeom->left_width;
+      *new_y += fgeom->top_height;
+    }
+
+  return TRUE;
+}
+
+static gboolean
+find_center_position (MetaWindow *window,
+                MetaFrameGeometry *fgeom,
+                /* visible windows on relevant workspaces */
+                GList      *windows,
+                int*        xineramas_list,
+                int         n_xineramas,
+                int         x,
+                int         y,
+                int        *new_x,
+                int        *new_y)
+{
+  MetaRectangle rect;
+  MetaRectangle work_area;
+
+  rect.width = window->rect.width;
+  rect.height = window->rect.height;
+
+  if (fgeom)
+    {
+      rect.width += fgeom->left_width + fgeom->right_width;
+      rect.height += fgeom->top_height + fgeom->bottom_height;
+    }
+
+  meta_window_get_work_area_for_xinerama (window,
+                                          xineramas_list[0],
+                                          &work_area);
+
+  *new_x = work_area.x + ((work_area.width - rect.width) / 2);
+  *new_y = work_area.y + ((work_area.height - rect.height) / 2);
+
+  if ((*new_x < 0) || (*new_y < 0))
+    {
+      return FALSE;
+    }
+
+  if (fgeom)
+    {
+      *new_x += fgeom->left_width;
+      *new_y += fgeom->top_height;
+    }
+
+  return TRUE;
+}
+
 void
 meta_window_place (MetaWindow        *window,
                    MetaFrameGeometry *fgeom,
@@ -768,10 +946,87 @@
 					 &xineramas_list,
 					 &n_xineramas);
 
-  if (find_first_fit (window, fgeom, windows,
-                      xineramas_list, n_xineramas,
-                      x, y, &x, &y))
-    goto done;
+  /* Attempt to place the window on the screen using the user-specified
+   * method. FIRST_FIT is assumed to be the default.
+   */
+  switch (meta_prefs_get_placement_mode ())
+    {
+    case META_PLACEMENT_MODE_RANDOM:
+      if (find_random_position (window, fgeom, windows,
+                          xineramas_list, n_xineramas,
+                          x, y, &x, &y))
+        {
+          goto done;
+        }
+
+      break;
+
+    case META_PLACEMENT_MODE_ORIGIN:
+      {
+        MetaRectangle rect;
+        MetaRectangle work_area;
+
+        rect.width = window->rect.width;
+        rect.height = window->rect.height;
+
+        if (fgeom)
+          {
+            rect.width += fgeom->left_width + fgeom->right_width;
+            rect.height += fgeom->top_height + fgeom->bottom_height;
+          }
+
+        meta_window_get_work_area_for_xinerama (window,
+                                                xineramas_list[0],
+                                                &work_area);
+
+        rect.x = work_area.x;
+        rect.y = work_area.y;
+
+        if (fgeom)
+          {
+            rect.x += fgeom->left_width;
+            rect.y += fgeom->top_height;
+          }
+
+        if (rect_fits_in_work_area (&work_area, &rect))
+          {
+            x = rect.x;
+            y = rect.y;
+            goto done;
+          }
+      }
+      break;
+
+    case META_PLACEMENT_MODE_CENTER:
+      if (find_center_position (window, fgeom, windows,
+                          xineramas_list, n_xineramas,
+                          x, y, &x, &y))
+        {
+          goto done;
+        }
+      break;
+
+    case META_PLACEMENT_MODE_CASCADE:
+      if (find_cascade_position (window, fgeom, windows,
+                          xineramas_list, n_xineramas,
+                          x, y, &x, &y))
+        {
+          goto done;
+        }
+      break;
+
+    case META_PLACEMENT_MODE_FIRST_FIT:
+      /* This is the default, so just fall through. */
+
+    default:
+      if (find_first_fit (window, fgeom, windows,
+                          xineramas_list, n_xineramas,
+                          x, y, &x, &y))
+        {
+          goto done;
+        }
+      break;
+    }
 
   /* This is a special-case origin-cascade so that windows that are
    * too large to fit onto a workspace (and which will be
diff -ur metacity-2.8.6/src/prefs.c metacity-2.8.6-patched/src/prefs.c
--- metacity-2.8.6/src/prefs.c	2005-02-19 16:52:13.000000000 -0600
+++ metacity-2.8.6-patched/src/prefs.c	2005-03-08 20:31:03.548535096 -0600
@@ -41,6 +41,7 @@
  */
 #define KEY_MOUSE_BUTTON_MODS "/apps/metacity/general/mouse_button_modifier"
 #define KEY_FOCUS_MODE "/apps/metacity/general/focus_mode"
+#define KEY_PLACEMENT_MODE "/apps/metacity/general/placement_mode"
 #define KEY_ACTION_DOUBLE_CLICK_TITLEBAR "/apps/metacity/general/action_double_click_titlebar"
 #define KEY_AUTO_RAISE "/apps/metacity/general/auto_raise"
 #define KEY_AUTO_RAISE_DELAY "/apps/metacity/general/auto_raise_delay"
@@ -74,6 +75,7 @@
 static PangoFontDescription *titlebar_font = NULL;
 static MetaVirtualModifier mouse_button_mods = Mod1Mask;
 static MetaFocusMode focus_mode = META_FOCUS_MODE_CLICK;
+static MetaPlacementMode placement_mode = META_PLACEMENT_MODE_FIRST_FIT;
 static char* current_theme = NULL;
 static int num_workspaces = 4;
 static MetaActionDoubleClickTitlebar action_double_click_titlebar =
@@ -112,6 +114,7 @@
 static gboolean update_titlebar_font      (const char *value);
 static gboolean update_mouse_button_mods  (const char *value);
 static gboolean update_focus_mode         (const char *value);
+static gboolean update_placement_mode     (const char *value);
 static gboolean update_theme              (const char *value);
 static gboolean update_visual_bell        (gboolean v1, gboolean v2);
 static gboolean update_visual_bell_type   (const char *value);
@@ -316,6 +319,11 @@
   update_focus_mode (str_val);
   g_free (str_val);  
 
+  str_val = gconf_client_get_string (default_client, KEY_PLACEMENT_MODE,
+                                     &err);
+  cleanup_error (&err);
+  update_placement_mode (str_val);
+
   str_val = gconf_client_get_string (default_client,
                                      KEY_ACTION_DOUBLE_CLICK_TITLEBAR,
 				     &err);
@@ -482,6 +490,22 @@
       if (update_focus_mode (str))
         queue_changed (META_PREF_FOCUS_MODE);
     }
+  else if (strcmp (key, KEY_PLACEMENT_MODE) == 0)
+    {
+      const char *str;
+
+      if (value && value->type != GCONF_VALUE_STRING)
+        {
+          meta_warning (_("GConf key \"%s\" is set to an invalid type\n"),
+                        KEY_PLACEMENT_MODE);
+          goto out;
+        }
+
+      str = value ? gconf_value_get_string (value) : NULL;
+
+      if (update_placement_mode (str))
+          queue_changed (META_PREF_PLACEMENT_MODE);
+    }
   else if (strcmp (key, KEY_THEME) == 0)
     {
       const char *str;
@@ -841,6 +865,49 @@
 
 #ifdef HAVE_GCONF
 static gboolean
+update_placement_mode (const char *value)
+{
+  MetaPlacementMode old_policy;
+
+  old_policy = placement_mode;
+
+  if (value != NULL)
+    {
+      if ((g_ascii_strcasecmp (value, "smart") == 0) ||
+          (g_ascii_strcasecmp (value, "first_fit") == 0))
+        {
+          placement_mode = META_PLACEMENT_MODE_FIRST_FIT;
+        }
+      else if (g_ascii_strcasecmp (value, "random") == 0)
+        {
+          placement_mode = META_PLACEMENT_MODE_RANDOM;
+        }
+      else if (g_ascii_strcasecmp (value, "center") == 0)
+        {
+          placement_mode = META_PLACEMENT_MODE_CENTER;
+        }
+      else if (g_ascii_strcasecmp (value, "cascade") == 0)
+        {
+          placement_mode = META_PLACEMENT_MODE_CASCADE;
+        }
+      else if (g_ascii_strcasecmp (value, "origin") == 0)
+        {
+          placement_mode = META_PLACEMENT_MODE_ORIGIN;
+        }
+      else
+        {
+          meta_warning (_("GConf key '%s' is set to an invalid value\n"),
+                        KEY_PLACEMENT_MODE);
+        }
+    }
+
+  return (old_policy != placement_mode);
+}
+#endif /* HAVE_GCONF */
+
+
+#ifdef HAVE_GCONF
+static gboolean
 update_theme (const char *value)
 {
   char *old_theme;
@@ -885,6 +952,12 @@
   return focus_mode;
 }
 
+MetaPlacementMode
+meta_prefs_get_placement_mode (void)
+{
+  return placement_mode;
+}
+
 const char*
 meta_prefs_get_theme (void)
 {
@@ -1302,6 +1375,9 @@
     case META_PREF_FOCUS_MODE:
       return "FOCUS_MODE";
 
+    case META_PREF_PLACEMENT_MODE:
+      return "PLACEMENT_MODE";
+
     case META_PREF_THEME:
       return "THEME";
 
diff -ur metacity-2.8.6/src/prefs.h metacity-2.8.6-patched/src/prefs.h
--- metacity-2.8.6/src/prefs.h	2005-02-19 16:52:13.000000000 -0600
+++ metacity-2.8.6-patched/src/prefs.h	2005-03-08 20:31:03.549534944 -0600
@@ -30,6 +30,7 @@
 {
   META_PREF_MOUSE_BUTTON_MODS,
   META_PREF_FOCUS_MODE,
+  META_PREF_PLACEMENT_MODE,
   META_PREF_ACTION_DOUBLE_CLICK_TITLEBAR,
   META_PREF_AUTO_RAISE,
   META_PREF_AUTO_RAISE_DELAY,
@@ -62,6 +63,7 @@
 
 MetaVirtualModifier         meta_prefs_get_mouse_button_mods  (void);
 MetaFocusMode               meta_prefs_get_focus_mode         (void);
+MetaPlacementMode           meta_prefs_get_placement_mode     (void);
 const char*                 meta_prefs_get_theme              (void);
 /* returns NULL if GTK default should be used */
 const PangoFontDescription* meta_prefs_get_titlebar_font      (void);
