diff --git a/clutter/clutter-flow-layout.c b/clutter/clutter-flow-layout.c
index 54e9a17db..d6d92b9fd 100644
--- a/clutter/clutter-flow-layout.c
+++ b/clutter/clutter-flow-layout.c
@@ -77,7 +77,8 @@ struct _ClutterFlowLayoutPrivate
 
   gint max_row_items;
 
-  guint layout_wrap : 1;
+  guint layout_wrap    : 1;
+  guint is_homogeneous : 1;
 };
 
 enum
@@ -86,6 +87,8 @@ enum
 
   PROP_ORIENTATION,
 
+  PROP_HOMOGENEOUS,
+
   PROP_COLUMN_SPACING,
   PROP_ROW_SPACING,
 
@@ -272,15 +275,23 @@ clutter_flow_layout_allocate (ClutterLayoutManager   *manager,
           line_index += 1;
         }
 
-      clutter_actor_get_preferred_width (child, priv->row_height,
-                                         &child_min,
-                                         &child_natural);
-      item_width = MIN (child_natural, priv->col_width);
+      if (priv->is_homogeneous)
+        {
+          item_width = priv->col_width;
+          item_height = priv->row_height;
+        }
+      else
+        {
+          clutter_actor_get_preferred_width (child, priv->row_height,
+                                             &child_min,
+                                             &child_natural);
+          item_width = MIN (child_natural, priv->col_width);
 
-      clutter_actor_get_preferred_height (child, item_width,
-                                          &child_min,
-                                          &child_natural);
-      item_height = MIN (child_natural, priv->row_height);
+          clutter_actor_get_preferred_height (child, item_width,
+                                              &child_min,
+                                              &child_natural);
+          item_height = MIN (child_natural, priv->row_height);
+        }
 
       CLUTTER_NOTE (LAYOUT,
                     "flow[line:%d, item:%d/%d] = { %.2f, %.2f, %.2f, %.2f }",
@@ -294,9 +305,9 @@ clutter_flow_layout_allocate (ClutterLayoutManager   *manager,
       clutter_actor_allocate (child, &child_alloc, flags);
 
       if (priv->orientation == CLUTTER_FLOW_HORIZONTAL)
-        item_x += item_width;
+        item_x += (item_width + priv->col_spacing);
       else
-        item_y += item_height;
+        item_y += (item_height + priv->row_spacing);
 
       line_items_count += 1;
     }
@@ -331,6 +342,10 @@ clutter_flow_layout_set_property (GObject      *gobject,
       clutter_flow_layout_set_wrap (self, g_value_get_boolean (value));
       break;
 
+    case PROP_HOMOGENEOUS:
+      clutter_flow_layout_set_homogeneous (self, g_value_get_boolean (value));
+      break;
+
     case PROP_COLUMN_SPACING:
       clutter_flow_layout_set_column_spacing (self, g_value_get_float (value));
       break;
@@ -387,6 +402,10 @@ clutter_flow_layout_get_property (GObject    *gobject,
       g_value_set_boolean (value, priv->layout_wrap);
       break;
 
+    case PROP_HOMOGENEOUS:
+      g_value_set_boolean (value, priv->is_homogeneous);
+      break;
+
     case PROP_COLUMN_SPACING:
       g_value_set_float (value, priv->col_spacing);
       break;
@@ -459,6 +478,22 @@ clutter_flow_layout_class_init (ClutterFlowLayoutClass *klass)
                              G_PARAM_CONSTRUCT);
   g_object_class_install_property (gobject_class, PROP_ORIENTATION, pspec);
 
+  /**
+   * ClutterFlowLayout:homogeneous:
+   *
+   * Whether each child inside the #ClutterFlowLayout should receive
+   * the same allocation
+   *
+   * Since: 1.2
+   */
+  pspec = g_param_spec_boolean ("homogeneous",
+                                "Homogeneous",
+                                "Whether each item should receive the "
+                                "same allocation",
+                                FALSE,
+                                CLUTTER_PARAM_READWRITE);
+  g_object_class_install_property (gobject_class, PROP_HOMOGENEOUS, pspec);
+
   /**
    * ClutterFlowLayout:wrap:
    *
@@ -684,6 +719,37 @@ clutter_flow_layout_get_wrap (ClutterFlowLayout *layout)
   return layout->priv->layout_wrap;
 }
 
+void
+clutter_flow_layout_set_homogeneous (ClutterFlowLayout *layout,
+                                     gboolean           homogeneous)
+{
+  ClutterFlowLayoutPrivate *priv;
+
+  g_return_if_fail (CLUTTER_IS_FLOW_LAYOUT (layout));
+
+  priv = layout->priv;
+
+  if (priv->is_homogeneous != homogeneous)
+    {
+      ClutterLayoutManager *manager;
+
+      priv->is_homogeneous = homogeneous;
+
+      manager = CLUTTER_LAYOUT_MANAGER (layout);
+      clutter_layout_manager_layout_changed (manager);
+
+      g_object_notify (G_OBJECT (layout), "homogeneous");
+    }
+}
+
+gboolean
+clutter_flow_layout_get_homogeneous (ClutterFlowLayout *layout)
+{
+  g_return_val_if_fail (CLUTTER_IS_FLOW_LAYOUT (layout), FALSE);
+
+  return layout->priv->is_homogeneous;
+}
+
 void
 clutter_flow_layout_set_column_spacing (ClutterFlowLayout *layout,
                                         gfloat             spacing)
diff --git a/clutter/clutter-flow-layout.h b/clutter/clutter-flow-layout.h
index 95aee0978..530b2f134 100644
--- a/clutter/clutter-flow-layout.h
+++ b/clutter/clutter-flow-layout.h
@@ -101,6 +101,9 @@ ClutterFlowOrientation clutter_flow_layout_get_orientation    (ClutterFlowLayout
 void                   clutter_flow_layout_set_wrap           (ClutterFlowLayout      *layout,
                                                                gboolean                wrap);
 gboolean               clutter_flow_layout_get_wrap           (ClutterFlowLayout      *layout);
+void                   clutter_flow_layout_set_homogeneous    (ClutterFlowLayout      *layout,
+                                                               gboolean                homogeneous);
+gboolean               clutter_flow_layout_get_homogeneous    (ClutterFlowLayout      *layout);
 
 void                   clutter_flow_layout_set_column_spacing (ClutterFlowLayout      *layout,
                                                                gfloat                  spacing);
diff --git a/tests/interactive/test-flow.c b/tests/interactive/test-flow.c
index 838a5ec67..00348e7d7 100644
--- a/tests/interactive/test-flow.c
+++ b/tests/interactive/test-flow.c
@@ -5,9 +5,13 @@
 
 #define N_RECTS         20
 
-static gboolean vertical    = FALSE;
-static gboolean random_size = FALSE;
-static gint     n_rects     = N_RECTS;
+static gboolean is_homogeneous = FALSE;
+static gboolean vertical       = FALSE;
+static gboolean random_size    = FALSE;
+
+static gint     n_rects        = N_RECTS;
+static gint     x_spacing      = 0;
+static gint     y_spacing      = 0;
 
 static GOptionEntry entries[] = {
   {
@@ -31,6 +35,27 @@ static GOptionEntry entries[] = {
     &vertical,
     "Set vertical orientation", NULL
   },
+  {
+    "homogeneous", 'h',
+    0,
+    G_OPTION_ARG_NONE,
+    &is_homogeneous,
+    "Whether the layout should be homogeneous", NULL
+  },
+  {
+    "x-spacing", 0,
+    0,
+    G_OPTION_ARG_INT,
+    &x_spacing,
+    "Horizontal spacing between elements", "PX"
+  },
+  {
+    "y-spacing", 0,
+    0,
+    G_OPTION_ARG_INT,
+    &y_spacing,
+    "Vertical spacing between elements", "PX"
+  },
   { NULL }
 };
 
@@ -64,6 +89,12 @@ test_flow_main (int argc, char *argv[])
 
   layout = clutter_flow_layout_new (vertical ? CLUTTER_FLOW_VERTICAL
                                              : CLUTTER_FLOW_HORIZONTAL);
+  clutter_flow_layout_set_homogeneous (CLUTTER_FLOW_LAYOUT (layout),
+                                       is_homogeneous);
+  clutter_flow_layout_set_column_spacing (CLUTTER_FLOW_LAYOUT (layout),
+                                          x_spacing);
+  clutter_flow_layout_set_row_spacing (CLUTTER_FLOW_LAYOUT (layout),
+                                       y_spacing);
 
   box = clutter_box_new (layout);
   clutter_container_add_actor (CLUTTER_CONTAINER (stage), box);