diff --git a/src/game.vala b/src/game.vala
index 933316c..02fe8e7 100644
--- a/src/game.vala
+++ b/src/game.vala
@@ -36,6 +36,7 @@ public class Game : GLib.Object
   private Grid _grid;
 
   private Clutter.Actor _view;
+  private Clutter.Actor _mold;
   private RoundedRectangle[,] _background;
   private TileView[,] _foreground_cur;
   private TileView[,] _foreground_nxt;
@@ -211,12 +212,15 @@ public class Game : GLib.Object
 
     Clutter.Color color = Clutter.Color.from_string ("#ffffff");
 
+    _mold = new Clutter.Actor ();
+    _mold.set_size (tile_width, tile_height);
+
     for (int i = 0; i < rows; i++) {
       for (int j = 0; j < cols; j++) {
         float x = j * tile_width + (j+1) * BLANK_COL_WIDTH;
         float y = i * tile_height + (i+1) * BLANK_ROW_HEIGHT;
 
-        RoundedRectangle rect = new RoundedRectangle (x, y, tile_width, tile_height, color);
+        RoundedRectangle rect = new RoundedRectangle (x, y, _mold, color);
 
         _view.add_child (rect.actor);
         rect.canvas.invalidate ();
@@ -240,15 +244,20 @@ public class Game : GLib.Object
     float tile_width = canvas_width / rows;
     float tile_height = canvas_height / cols;
 
+    _mold.set_size (tile_width, tile_height);
+
     for (int i = 0; i < rows; i++) {
       for (int j = 0; j < cols; j++) {
         float x = j * tile_width + (j+1) * BLANK_COL_WIDTH;
         float y = i * tile_height + (i+1) * BLANK_ROW_HEIGHT;
 
-        _background[i,j].resize (x, y, tile_width, tile_height);
+        _background[i,j].move_actor (x, y);
 
         if (_foreground_cur[i,j] != null) {
-          _foreground_cur[i,j].resize (x, y, tile_width, tile_height);
+          _foreground_cur[i,j].move_actor (x, y);
+        }
+        if (_foreground_nxt[i,j] != null) {
+          _foreground_nxt[i,j].move_actor (x, y);
         }
       }
     }
@@ -275,18 +284,14 @@ public class Game : GLib.Object
     TileView view;
     float x;
     float y;
-    float width;
-    float height;
 
     pos = tile.pos;
     rect = _background[pos.row,pos.col];
     x = rect.actor.x;
     y = rect.actor.y;
-    width = rect.actor.width;
-    height = rect.actor.height;
 
     assert (_foreground_nxt[pos.row,pos.col] == null);
-    view = new TileView (x, y, width, height, tile.val);
+    view = new TileView (x, y, _mold, tile.val);
     _foreground_nxt[pos.row,pos.col] = view;
   }
 
@@ -493,6 +498,7 @@ public class Game : GLib.Object
         _view.remove_child (rect.actor);
       }
     }
+    _mold.destroy ();
   }
 
   private void _clear_foreground ()
diff --git a/src/view.vala b/src/view.vala
index 297e26e..1dc46d8 100644
--- a/src/view.vala
+++ b/src/view.vala
@@ -19,26 +19,29 @@
 public class RoundedRectangle : GLib.Object
 {
   protected Clutter.Actor _actor;
+  protected Clutter.Actor _mold;
   protected Clutter.Canvas _canvas;
   protected Clutter.Color? _color;
 
-  public RoundedRectangle (float x, float y, float width, float height, Clutter.Color? color)
+  public RoundedRectangle (float x, float y, Clutter.Actor mold, Clutter.Color? color)
   {
     Object ();
 
     _color = color;
 
+    _mold = mold;
+    Clutter.BindConstraint molder = new Clutter.BindConstraint (_mold, Clutter.BindCoordinate.SIZE, 0);
+
     _canvas = new Clutter.Canvas ();
-    _canvas.set_size ((int)Math.ceilf (width), (int)Math.ceilf (height));
+    _canvas.draw.connect (_draw);
 
     _actor = new Clutter.Actor ();
-    _actor.set_size (width, height);
+    _actor.add_constraint_with_name ("size", molder);
     _actor.set_content (_canvas);
     _actor.x = x;
     _actor.y = y;
     _actor.set_pivot_point (0.5f, 0.5f);
-
-    _canvas.draw.connect (_draw);
+    _actor.allocation_changed.connect (_on_allocation_changed);
   }
 
   public Clutter.Actor actor {
@@ -57,13 +60,10 @@ public class RoundedRectangle : GLib.Object
     get { return _canvas; }
   }
 
-  public void resize (float x, float y, float width, float height)
+  public void move_actor (float x, float y)
   {
     _actor.x = x;
     _actor.y = y;
-    _actor.width = width;
-    _actor.height = height;
-    _canvas.invalidate ();
   }
 
   protected virtual bool _draw (Cairo.Context ctx, int width, int height)
@@ -90,20 +90,20 @@ public class RoundedRectangle : GLib.Object
 
     return false;
   }
+
+  private void _on_allocation_changed (Clutter.ActorBox box, Clutter.AllocationFlags flags)
+  {
+    if (_canvas.set_size ((int)Math.ceilf (_actor.width), (int)Math.ceilf (_actor.height))) {
+      _canvas.invalidate ();
+    }
+  }
 }
 
 public class TileView : RoundedRectangle
 {
-  private Clutter.Text _text;
-
-  public TileView (float x, float y, float width, float height, uint val)
+  public TileView (float x, float y, Clutter.Actor mold, uint val)
   {
-    base (x, y, width, height, null);
-
-    _text = new Clutter.Text ();
-    _text.set_font_name ("Sans 22");
-    _text.set_color (Clutter.Color.from_string ("#ffffff"));
-    _actor.add_child (_text);
+    base (x, y, mold, null);
 
     _value = val;
     _color = _pick_color ();
@@ -115,12 +115,22 @@ public class TileView : RoundedRectangle
 
   protected override bool _draw (Cairo.Context ctx, int width, int height)
   {
+    Pango.Rectangle ink_rect, logical_rect;
+
     base._draw (ctx, width, height);
 
-    _text.text = value.to_string ();
-    _text.x = _actor.width/2.0f - _text.width/2.0f;
-    _text.y = _actor.height/2.0f - _text.height/2.0f;
-    _text.show ();
+    ctx.set_source_rgb(255,255,255);
+
+    Pango.Layout layout = Pango.cairo_create_layout(ctx);
+    Pango.FontDescription font_desc = Pango.FontDescription.from_string("Sans Bold %dpx".printf (height / 4));
+    layout.set_font_description(font_desc);
+
+    layout.set_text(value.to_string(), -1);
+
+    layout.get_extents(out ink_rect, out logical_rect);
+    ctx.move_to(width / 2 - logical_rect.width / 2 / Pango.SCALE,
+                height / 2 - logical_rect.height / 2 / Pango.SCALE);
+    Pango.cairo_show_layout(ctx, layout);
 
     return true;
   }
