diff --git a/lib/components/croupier.dart b/lib/components/croupier.dart
index 211bd7b..415e8f7 100644
--- a/lib/components/croupier.dart
+++ b/lib/components/croupier.dart
@@ -10,6 +10,8 @@
 import '../logic/croupier_settings.dart' show CroupierSettings;
 import '../logic/game/game.dart' as logic_game;
 import '../styles/common.dart' as style;
+import 'croupier_game_advertisement.dart'
+    show CroupierGameAdvertisementComponent;
 import 'croupier_profile.dart' show CroupierProfileComponent;
 import 'game.dart' as component_game;
 
@@ -75,32 +77,34 @@
                       logic_croupier.CroupierState.Welcome))
             ], direction: FlexDirection.vertical));
       case logic_croupier.CroupierState.JoinGame:
-        // A stateful view, first showing the players that can be seen creating a game.
-        List<Widget> profileWidgets = new List<Widget>();
+        // A stateful view, showing the game ads discovered.
+        List<Widget> gameAdWidgets = new List<Widget>();
+        if (config.croupier.games_found.length == 0) {
+          gameAdWidgets.add(
+              new Text("Looking for Games...", style: style.Text.titleStyle));
+        } else {
+          gameAdWidgets
+              .add(new Text("Available Games", style: style.Text.titleStyle));
+        }
+
         config.croupier.games_found
             .forEach((String _, logic_game.GameStartData gsd) {
           CroupierSettings cs = config.croupier.settings_everyone[gsd.ownerID];
-          // cs could be null if this settings data hasn't synced yet.
-          // If so, a placeholder is shown instead.
-          profileWidgets.add(new GestureDetector(
-              child: new CroupierProfileComponent(settings: cs),
+          gameAdWidgets.add(new CroupierGameAdvertisementComponent(gsd,
               onTap: makeSetStateCallback(
-                  logic_croupier.CroupierState.ArrangePlayers, gsd)));
+                  logic_croupier.CroupierState.ArrangePlayers, gsd),
+              settings: cs));
         });
+
+        gameAdWidgets.add(new FlatButton(
+            child: new Text('Back', style: style.Text.subtitleStyle),
+            onPressed:
+                makeSetStateCallback(logic_croupier.CroupierState.Welcome)));
+
         // in which players wait for game invitations to arrive.
         return new Container(
             padding: new EdgeDims.only(top: ui.window.padding.top),
-            child: new Column([
-              profileWidgets.length == 0
-                  ? new Text("Looking for Games...",
-                      style: style.Text.titleStyle)
-                  : new Text("Available Games", style: style.Text.titleStyle),
-              new Grid(profileWidgets, maxChildExtent: 150.0),
-              new FlatButton(
-                  child: new Text('Back', style: style.Text.subtitleStyle),
-                  onPressed: makeSetStateCallback(
-                      logic_croupier.CroupierState.Welcome))
-            ]));
+            child: new Column(gameAdWidgets));
       case logic_croupier.CroupierState.ArrangePlayers:
         List<Widget> profileWidgets = new List<Widget>();
         config.croupier.players_found.forEach((int userID, _) {
diff --git a/lib/components/croupier_game_advertisement.dart b/lib/components/croupier_game_advertisement.dart
new file mode 100644
index 0000000..545f028
--- /dev/null
+++ b/lib/components/croupier_game_advertisement.dart
@@ -0,0 +1,33 @@
+// Copyright 2015 The Vanadium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+import 'package:flutter/material.dart';
+
+import 'croupier_profile.dart';
+import '../logic/croupier_settings.dart' show CroupierSettings;
+import '../logic/game/game.dart' as game;
+import '../styles/common.dart' as style;
+
+typedef void NoArgCb();
+
+class CroupierGameAdvertisementComponent extends StatelessComponent {
+  final CroupierSettings settings;
+  final game.GameStartData gameStartData;
+  final NoArgCb onTap;
+
+  CroupierGameAdvertisementComponent(this.gameStartData,
+      {CroupierSettings settings, this.onTap})
+      : settings = settings ?? new CroupierSettings.placeholder();
+
+  Widget build(BuildContext context) {
+    return new GestureDetector(
+        child: new Card(
+            child: new Row([
+          new Card(child: new CroupierProfileComponent(settings: settings)),
+          new Text(game.gameTypeToString(gameStartData.gameType),
+              style: style.Text.hugeStyle),
+        ])),
+        onTap: onTap);
+  }
+}
diff --git a/lib/src/syncbase/settings_manager.dart b/lib/src/syncbase/settings_manager.dart
index 297a363..8a5b88b 100644
--- a/lib/src/syncbase/settings_manager.dart
+++ b/lib/src/syncbase/settings_manager.dart
@@ -364,9 +364,7 @@
     // Looks like leave isn't actually implemented, so we can't do this.
     String addr = gameAddrs[instanceId];
     if (addr != null) {
-      List<String> parts = addr.split("-");
-      String gameID = parts[parts.length - 1];
-      updateGamesCallback(gameID, null);
+      updateGamesCallback(addr, null);
     }
     settingsAddrs.remove(instanceId);
     gameAddrs.remove(instanceId);
