diff --git a/src/favorites.c b/src/favorites.c
index edb64c5fca277c0b116b8686ddc3f8654abe2585..70ecf2de1ee1864602ba55d86f1b126563d790ab 100644
--- a/src/favorites.c
+++ b/src/favorites.c
@@ -13,18 +13,22 @@
 #include "config.h"
 
 #include "favorites.h"
+#include "phosh.h"
 
 #include <gio/gdesktopappinfo.h>
 
 enum {
   APP_LAUNCHED,
+  SELECTION_ABORTED,
   N_SIGNALS
 };
 static guint signals[N_SIGNALS] = { 0 };
 
 typedef struct
 {
-  GtkWidget *grid;
+  GtkWidget *scroll;
+  GtkWidget *evbox;
+  GtkWidget *flowbox;
   GSettings *settings;
 } PhoshFavoritesPrivate;
 
@@ -34,7 +38,7 @@ struct _PhoshFavorites
   GtkWindowClass parent;
 };
 
-G_DEFINE_TYPE_WITH_PRIVATE(PhoshFavorites, phosh_favorites, GTK_TYPE_WINDOW) 
+G_DEFINE_TYPE_WITH_PRIVATE(PhoshFavorites, phosh_favorites, GTK_TYPE_WINDOW)
 
 
 static void
@@ -89,6 +93,9 @@ add_favorite (PhoshFavorites *self,
   gtk_style_context_add_class (gtk_widget_get_style_context (btn),
                                "phosh-favorite");
 
+  gtk_style_context_add_class (gtk_widget_get_style_context( GTK_WIDGET(btn) ),
+                               "circular");
+
   gtk_button_set_image (GTK_BUTTON (btn), image);
   g_object_set (image, "margin", 20, NULL);
 
@@ -101,7 +108,7 @@ add_favorite (PhoshFavorites *self,
 
 /* Add weston terminal as band aid in case all else fails for now */
 static void
-add_weston_terminal (PhoshFavorites *self, gint row)
+add_weston_terminal (PhoshFavorites *self)
 {
   PhoshFavoritesPrivate *priv = phosh_favorites_get_instance_private (self);
   GIcon *icon;
@@ -117,8 +124,11 @@ add_weston_terminal (PhoshFavorites *self, gint row)
   g_object_set (image, "margin", 20, NULL);
   gtk_button_set_image (GTK_BUTTON (btn), image);
 
+  gtk_style_context_add_class (gtk_widget_get_style_context( GTK_WIDGET(btn) ),
+                               "circular");
+
   g_signal_connect_swapped (btn, "clicked", G_CALLBACK (term_btn_clicked), self);
-  gtk_grid_attach (GTK_GRID (priv->grid), btn, 1, row++, 1, 1);
+  gtk_flow_box_insert (GTK_FLOW_BOX (priv->flowbox), btn, -1);
 }
 
 
@@ -130,20 +140,37 @@ favorites_changed (GSettings *settings,
   PhoshFavoritesPrivate *priv = phosh_favorites_get_instance_private (self);
   gchar **favorites = g_settings_get_strv (settings, key);
   GtkWidget *btn;
-  guint row = 1;
 
   /* Remove all favorites first */
-  gtk_container_foreach (GTK_CONTAINER (priv->grid),
+  gtk_container_foreach (GTK_CONTAINER (priv->flowbox),
                          (GtkCallback) gtk_widget_destroy, NULL);
 
-  add_weston_terminal (self, row++);
   for (gint i = 0; i < g_strv_length (favorites); i++) {
     gchar *fav = favorites[i];
     btn = add_favorite (self, fav);
     if (btn)
-      gtk_grid_attach (GTK_GRID (priv->grid), btn, 1, row++, 1, 1);
+      gtk_flow_box_insert (GTK_FLOW_BOX (priv->flowbox), btn, -1);
   }
   g_strfreev (favorites);
+  add_weston_terminal (self);
+}
+
+
+static gboolean
+draw_cb (GtkWidget *widget, cairo_t *cr, gpointer unused)
+{
+  cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.1);
+  cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
+  cairo_paint (cr);
+  return FALSE;
+}
+
+
+static gboolean
+evbox_button_press_event_cb (PhoshFavorites *self, GdkEventButton *event)
+{
+  g_signal_emit(self, signals[SELECTION_ABORTED], 0);
+  return FALSE;
 }
 
 
@@ -152,23 +179,53 @@ phosh_favorites_constructed (GObject *object)
 {
   PhoshFavorites *self = PHOSH_FAVORITES (object);
   PhoshFavoritesPrivate *priv = phosh_favorites_get_instance_private (self);
+  gint width, height;
 
   G_OBJECT_CLASS (phosh_favorites_parent_class)->constructed (object);
 
   /* window properties */
+  phosh_shell_get_usable_area (phosh(), NULL, NULL, &width, &height);
   gtk_window_set_title (GTK_WINDOW (self), "phosh favorites");
   gtk_window_set_decorated (GTK_WINDOW (self), FALSE);
-  gtk_window_resize (GTK_WINDOW (self), 100, 250);
+  gtk_window_resize (GTK_WINDOW (self), width, height);
   gtk_widget_realize(GTK_WIDGET (self));
+  gtk_widget_set_app_paintable(GTK_WIDGET (self), TRUE);
+
+  g_signal_connect (G_OBJECT(self),
+                    "draw",
+                    G_CALLBACK(draw_cb),
+                    NULL);
 
   gtk_style_context_add_class (
       gtk_widget_get_style_context (GTK_WIDGET (self)),
       "phosh-favorites");
 
-  priv->grid = gtk_widget_new (GTK_TYPE_GRID, "halign",
-                               GTK_ALIGN_CENTER, "valign",
-                               GTK_ALIGN_CENTER, NULL);
-  gtk_container_add (GTK_CONTAINER (self), priv->grid);
+  /* Flowbox */
+  priv->flowbox = gtk_widget_new (GTK_TYPE_FLOW_BOX,
+                                    "halign", GTK_ALIGN_START,
+                                    "valign", GTK_ALIGN_CENTER,
+                                    "selection-mode", GTK_SELECTION_NONE,
+                                    "orientation", GTK_ORIENTATION_VERTICAL,
+                                    NULL);
+  gtk_flow_box_set_max_children_per_line (GTK_FLOW_BOX(priv->flowbox), G_MAXINT);
+  gtk_flow_box_set_homogeneous (GTK_FLOW_BOX(priv->flowbox), TRUE);
+
+  /* Scrolled window */
+  priv->scroll = gtk_scrolled_window_new (NULL, NULL);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (priv->scroll),
+                                  GTK_POLICY_AUTOMATIC,
+                                  GTK_POLICY_NEVER);
+  gtk_container_add (GTK_CONTAINER (priv->scroll), priv->flowbox);
+
+  /* Eventbox */
+  priv->evbox = gtk_event_box_new ();
+  gtk_container_add (GTK_CONTAINER (priv->evbox), priv->scroll);
+  g_signal_connect_swapped (priv->evbox, "button_press_event",
+                            G_CALLBACK (evbox_button_press_event_cb),
+                            self);
+  gtk_widget_set_events (priv->evbox, GDK_BUTTON_PRESS_MASK);
+
+  gtk_container_add (GTK_CONTAINER (self), priv->evbox);
 
   priv->settings = g_settings_new ("sm.puri.phosh");
   g_signal_connect (priv->settings, "changed::favorites",
@@ -200,6 +257,9 @@ phosh_favorites_class_init (PhoshFavoritesClass *klass)
   signals[APP_LAUNCHED] = g_signal_new ("app-launched",
       G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL,
       NULL, G_TYPE_NONE, 0);
+  signals[SELECTION_ABORTED] = g_signal_new ("selection-aborted",
+      G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL,
+      NULL, G_TYPE_NONE, 0);
 }
 
 
diff --git a/src/phosh.c b/src/phosh.c
index 313f6832f669aa56fad21975eec9396206b3f5c6..62d457d58ff3069ca5fbf888a50b9a70cc42e06d 100644
--- a/src/phosh.c
+++ b/src/phosh.c
@@ -220,6 +220,17 @@ app_launched_cb (PhoshShell *self,
 }
 
 
+static void
+favorites_selection_aborted (PhoshShell *self,
+                             PhoshFavorites *favorites)
+{
+  PhoshShellPrivate *priv = phosh_shell_get_instance_private (self);
+
+  g_return_if_fail (priv->favorites);
+  close_menu (&priv->favorites);
+}
+
+
 static void
 xdg_surface_handle_configure(void *data,
                              struct xdg_surface *xdg_surface,
@@ -314,6 +325,10 @@ favorites_activated_cb (PhoshShell *self,
                             "app-launched",
                             G_CALLBACK(app_launched_cb),
                             self);
+  g_signal_connect_swapped (priv->favorites->window,
+                            "selection-aborted",
+                            G_CALLBACK(favorites_selection_aborted),
+                            self);
 }
 
 
@@ -782,7 +797,7 @@ phosh_shell_constructed (GObject *object)
 
   gtk_icon_theme_add_resource_path (gtk_icon_theme_get_default (),
                                     "/sm/puri/phosh/icons");
-  
+
   env_setup ();
   css_setup (self);
   panel_create (self);
diff --git a/tests/meson.build b/tests/meson.build
index 3c998a49948b5cf89ee0b49c532896dd43c79e54..63d560362124774422db27a5f8107785e30dd42f 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -20,6 +20,10 @@ test_link_args = [
   '-fPIC',
 ]
 
+test_stubs = [
+  'phoshstub.c',
+]
+
 cls_names = [
   'favorites',
 ]
@@ -27,7 +31,8 @@ cls_names = [
 foreach cls_name : cls_names
   t = executable('test-@0@'.format(cls_name),
 		 ['test-@0@.c'.format(cls_name),
-		  '../src/@0@.c'.format(cls_name)],
+		  '../src/@0@.c'.format(cls_name),
+		  test_stubs],
 		 c_args: test_cflags,
 		 link_args: test_link_args,
 		 dependencies: phosh_deps,
diff --git a/tests/phoshstub.c b/tests/phoshstub.c
new file mode 100644
index 0000000000000000000000000000000000000000..ff886475ecda2600132f516d6f752bc3809cf86c
--- /dev/null
+++ b/tests/phoshstub.c
@@ -0,0 +1,23 @@
+/* Stubs so we don't need to run the shell */
+
+#include <glib.h>
+
+gpointer
+phosh ()
+{
+  return NULL;
+}
+
+void
+phosh_shell_get_usable_area (gpointer *self, gint *x, gint *y, gint *width, gint *height)
+{
+  if (x)
+    *x = 16;
+  if (y)
+    *y = 32;
+  if (width)
+    *width = 64;
+  if (height)
+    *height = 128;
+  return;
+}