diff --git a/src/launcher/hd-launcher-grid.c b/src/launcher/hd-launcher-grid.c
index 1a9b13c..cf2665e 100644
--- a/src/launcher/hd-launcher-grid.c
+++ b/src/launcher/hd-launcher-grid.c
@@ -111,6 +111,7 @@ static gboolean _hd_launcher_grid_blocker_release_cb (ClutterActor *actor,
                                         gpointer *data);
 
 #define HD_LAUNCHER_GRID_MAX_COLUMNS 5
+#define HD_LAUNCHER_GRID_ROWS_PER_PAGE 3
 
 G_DEFINE_TYPE_WITH_CODE (HdLauncherGrid,
                          hd_launcher_grid,
@@ -419,7 +420,9 @@ void hd_launcher_grid_layout (HdLauncherGrid *grid)
 {
   HdLauncherGridPrivate *priv = grid->priv;
   GList *l;
-  guint cur_height, n_visible_launchers, n_rows;
+  guint cur_height, n_visible_launchers, n_rows, row_count;
+
+  row_count = 0;
 
   /* Free our list of 'blocker' actors that we use to block mouse clicks.
    * TODO: just check we have 'nrows' worth */
@@ -444,8 +447,9 @@ void hd_launcher_grid_layout (HdLauncherGrid *grid)
     /* Allocate all icons on this row */
     l = _hd_launcher_grid_layout_row(l, &n_visible_launchers,
                                        cur_height, priv->h_spacing);
-    if (l)
-      {
+    row_count++;
+
+    if (l && ((row_count % HD_LAUNCHER_GRID_ROWS_PER_PAGE) != 0)) {
         /* If there is another row, we must create an actor that
          * goes between the two rows that will grab the clicks that
          * would have gone between them and dismissed the launcher  */
@@ -465,10 +469,23 @@ void hd_launcher_grid_layout (HdLauncherGrid *grid)
             priv->v_spacing);
 
         priv->blockers = g_list_prepend(priv->blockers, blocker);
-      }
-    cur_height += HD_LAUNCHER_TILE_HEIGHT + priv->v_spacing;
+        cur_height += HD_LAUNCHER_TILE_HEIGHT + priv->v_spacing;
+    } else if (l) {
+        /* No blocker between pages, but leave more space that is
+         * clickable to dismiss the launcher between pages. */
+        cur_height += HD_LAUNCHER_TILE_HEIGHT + HD_LAUNCHER_PAGE_YMARGIN;
+    }
+  }
+
+  while (row_count % HD_LAUNCHER_GRID_ROWS_PER_PAGE) {
+      /* Reserve space for an empty row until the page is full */
+      cur_height += HD_LAUNCHER_TILE_HEIGHT + priv->v_spacing;
+      row_count++;
   }
 
+  /* One for the margin and one for the last page to align */
+  cur_height += HD_LAUNCHER_PAGE_YMARGIN*2;
+
   clutter_actor_set_size(CLUTTER_ACTOR(grid),
                          HD_LAUNCHER_PAGE_WIDTH,
                          cur_height);

