diff --git a/android/assets/gfx/screen_loader_bighand.png b/android/assets/gfx/screen_loader_bighand.png
new file mode 100644
index 0000000000000000000000000000000000000000..434875f3c490e13b87a8022adb506bd3dfd029ed
Binary files /dev/null and b/android/assets/gfx/screen_loader_bighand.png differ
diff --git a/android/assets/gfx/screen_loader_smallhand.png b/android/assets/gfx/screen_loader_smallhand.png
new file mode 100644
index 0000000000000000000000000000000000000000..70dc3586db2d259be4f316e992bbc69f8a6eac2c
Binary files /dev/null and b/android/assets/gfx/screen_loader_smallhand.png differ
diff --git a/android/assets/text/application/application_cs.properties b/android/assets/text/application/application_cs.properties
index d4386f691c1b3420e178cc58a7babf31663b089e..4b6a65816764b04d018408284ca6eb69196eb18f 100644
--- a/android/assets/text/application/application_cs.properties
+++ b/android/assets/text/application/application_cs.properties
@@ -10,6 +10,10 @@ mainmenu_preferences=NastavenĂ­
 mainmenu_about=O aplikaci
 mainmenu_logout=Odhlásit
 
+gamedifficulty_easy=Lehká
+gamedifficulty_medium=Střední
+gamedifficulty_hard=Těžká
+
 game_robbery_title=LupiÄŤi
 game_kidnapping_title=Ăšnos
 game_pursuit_title=Pronásledování
diff --git a/android/assets/text/application/application_sk.properties b/android/assets/text/application/application_sk.properties
index d4c46b7076da1910e37015b1a6140c01949d5b1c..f0d8c3f841ebf41ed97107a5ca9174d867189bc3 100644
--- a/android/assets/text/application/application_sk.properties
+++ b/android/assets/text/application/application_sk.properties
@@ -10,6 +10,10 @@ mainmenu_preferences=Nastavenie
 mainmenu_about=O aplikácií
 mainmenu_logout=Odhlásiť
 
+gamedifficulty_easy=Ľahká
+gamedifficulty_medium=Stredná
+gamedifficulty_hard=Ťažká
+
 game_robbery_title=LupiÄŤi
 game_kidnapping_title=Ăšnos
 game_pursuit_title=Prenasledovanie
diff --git a/core/assets/common/screen/gamemenu/overlay.png b/core/assets/common/screen/gamemenu/overlay.png
new file mode 100644
index 0000000000000000000000000000000000000000..d8fc30a3129c1ed8bf6f5c1ffb25a031c3e894ea
Binary files /dev/null and b/core/assets/common/screen/gamemenu/overlay.png differ
diff --git a/core/assets/cs/screen/gamemenu/helplayer.png b/core/assets/cs/screen/gamemenu/helplayer.png
index da37c81316dd950ae7b84b38bac43182e042abf9..ef6ac7ca9283901add57541243ccbe741c211fc9 100644
Binary files a/core/assets/cs/screen/gamemenu/helplayer.png and b/core/assets/cs/screen/gamemenu/helplayer.png differ
diff --git a/core/assets/cs/screen/gamemenu/potme_startbutton_pressed.png b/core/assets/cs/screen/gamemenu/potme_startbutton_pressed.png
index f38ebf062a39a51a8bb5674d4d47ba78797c9779..ce252cdc69a0b48eec7744fc6d3a95ccad3e4ae8 100644
Binary files a/core/assets/cs/screen/gamemenu/potme_startbutton_pressed.png and b/core/assets/cs/screen/gamemenu/potme_startbutton_pressed.png differ
diff --git a/core/assets/cs/screen/gamemenu/strelnice_startbutton_pressed.png b/core/assets/cs/screen/gamemenu/strelnice_startbutton_pressed.png
index e484ec595785f360b844146b8c3f20b0ff450d38..8c5143946d6aa7eee7f430ce2c29fe69cceaf65c 100644
Binary files a/core/assets/cs/screen/gamemenu/strelnice_startbutton_pressed.png and b/core/assets/cs/screen/gamemenu/strelnice_startbutton_pressed.png differ
diff --git a/core/src/cz/nic/tablexia/Tablexia.java b/core/src/cz/nic/tablexia/Tablexia.java
index 1aab38fab885ea66d7109c68b3a7b06855900cc0..641a10cfda4bbcd4aa3d9c87ba6a2f3b41fd6f32 100644
--- a/core/src/cz/nic/tablexia/Tablexia.java
+++ b/core/src/cz/nic/tablexia/Tablexia.java
@@ -22,11 +22,11 @@ import cz.nic.tablexia.util.Log;
 import cz.nic.tablexia.util.Utility;
 
 public class Tablexia extends TablexiaApplication {
-	
-	private boolean					loadingComplete         = false;
-    private MainMenuContainer       mainMenuContainer;
-    private ZipAssetLoader          zipAssetLoader;
-    private boolean                 resetState;
+
+    private boolean loadingComplete = false;
+    private MainMenuContainer mainMenuContainer;
+    private ZipAssetLoader    zipAssetLoader;
+    private boolean           resetState;
 
     public Tablexia(boolean debug, Locale systemLocale, String versionName, String applicationId, boolean resetState) {
         TablexiaSettings.init(debug, systemLocale, versionName, applicationId);
@@ -37,14 +37,14 @@ public class Tablexia extends TablexiaApplication {
         TablexiaSettings.init(buildTypeKey, systemLocale, versionName, applicationId);
         this.resetState = resetState;
     }
-	
-	private void loadingComplete() {
-		if (!loadingComplete) {
-			loadingComplete = true;
-			showLastOrInitialScreen();
-			ApplicationBus.getInstance().publishAsync(new ApplicationLoadingCompleteEvent());
-		}
-	}
+
+    private void loadingComplete() {
+        if (!loadingComplete) {
+            loadingComplete = true;
+            showLastOrInitialScreen();
+            ApplicationBus.getInstance().publishAsync(new ApplicationLoadingCompleteEvent());
+        }
+    }
 
     private void showLastOrInitialScreen() {
         AbstractTablexiaScreen<?> lastScreen = TablexiaSettings.getInstance().getCurrentScreen();
@@ -58,7 +58,7 @@ public class Tablexia extends TablexiaApplication {
     private void prepareMainMenu() {
         mainMenuContainer = new MainMenuContainer(getStage().getWidth(), getStage().getHeight());
         getStage().addActor(mainMenuContainer);
-	}
+    }
 
     private void startLoading(Locale locale) {
         // sync loaded screen with loader image
@@ -106,13 +106,13 @@ public class Tablexia extends TablexiaApplication {
             }
         });
     }
-	
-	
+
+
 //////////////////////////// LIBGDX LIFECYCLE
-	
-	@Override
-	public void create () {
-		super.create();
+
+    @Override
+    public void create() {
+        super.create();
 
         TablexiaSettings.getInstance().loadPreferences(resetState);
         Log.setLoglevel(TablexiaSettings.getInstance().getLogLevel());
@@ -122,7 +122,7 @@ public class Tablexia extends TablexiaApplication {
 
         // start loading application scope data
         startLoading(TablexiaSettings.getInstance().getLocale());
-	}
+    }
 
     @Override
     public void pause() {
@@ -134,76 +134,77 @@ public class Tablexia extends TablexiaApplication {
     }
 
     @Override
-	public void render () {
-		// render other screens
-		super.render();
-		
-		// process loading
-		if (!loadingComplete) {
+    public void render() {
+        // render other screens
+        super.render();
+
+        // process loading
+        if (!loadingComplete) {
             // load internal assets
             if (!ApplicationFontManager.getInstance().update()) return;
             if (!ApplicationTextManager.getInstance().update()) return;
             // load external assets
             if (!zipAssetLoader.update()) return;
-			if (!ApplicationTextureManager.getInstance().update()) return;
+            if (!ApplicationTextureManager.getInstance().update()) return;
             if (!ApplicationSoundManager.getInstance().update()) return;
-			
-			prepareMainMenu();
-			loadingComplete();
-		}
-	}
-	
-	@Override
-	public void dispose() {
+
+            prepareMainMenu();
+            loadingComplete();
+        }
+    }
+
+    @Override
+    public void dispose() {
         super.dispose();
-		clearLoadedData();
-	}
-	
-	
+        clearLoadedData();
+    }
+
+
 //////////////////////////// APPLICATION LOADING COMPLETE EVENT
-	
-	public static class ApplicationLoadingCompleteEvent implements ApplicationEvent {}
-	
-	
+
+    public static class ApplicationLoadingCompleteEvent implements ApplicationEvent {
+    }
+
+
 //////////////////////////// CHANGE SCREEN EVENT
-	
-	public static class ChangeScreenEvent implements ApplicationEvent {
-		
-		private Class<? extends AbstractTablexiaScreen<?>> 	screen;
-		private ScreenTransaction 							screenTransaction;
 
-		public ChangeScreenEvent(Class<? extends AbstractTablexiaScreen<?>> screen, ScreenTransaction screenTransaction) {
-			this.screen = screen;
-			this.screenTransaction = screenTransaction;
-		}
-		
-		public Class<? extends AbstractTablexiaScreen<?>> getScreen() {
-			return screen;
-		}
-		
-		public ScreenTransaction getScreenTransaction() {
-			return screenTransaction;
-		}
-	}
-	
-	@Handler
-	public void handleChangeScreenEvent(final ChangeScreenEvent changeScreenEvent) {
-		final Class<? extends AbstractTablexiaScreen<?>> screenClass = changeScreenEvent.getScreen();
-		if (!loadingComplete) {
-			Log.err(getClass(), "Cannot change screen -> Application loading not complete!");
-			return;
-		}
-		if (screenClass == null) {
-			Log.err(getClass(), "Cannot change screen -> Received empty screen class!");
-			return;
-		}
-		// create new screen on GL thread
-		Gdx.app.postRunnable(new Runnable() {
-			
-			@Override
-			public void run() {
+    public static class ChangeScreenEvent implements ApplicationEvent {
+
+        private Class<? extends AbstractTablexiaScreen<?>> screen;
+        private ScreenTransaction                          screenTransaction;
+
+        public ChangeScreenEvent(Class<? extends AbstractTablexiaScreen<?>> screen, ScreenTransaction screenTransaction) {
+            this.screen = screen;
+            this.screenTransaction = screenTransaction;
+        }
+
+        public Class<? extends AbstractTablexiaScreen<?>> getScreen() {
+            return screen;
+        }
+
+        public ScreenTransaction getScreenTransaction() {
+            return screenTransaction;
+        }
+    }
+
+    @Handler
+    public void handleChangeScreenEvent(final ChangeScreenEvent changeScreenEvent) {
+        final Class<? extends AbstractTablexiaScreen<?>> screenClass = changeScreenEvent.getScreen();
+        if (!loadingComplete) {
+            Log.err(((Object)this).getClass(), "Cannot change screen -> Application loading not complete!");
+            return;
+        }
+        if (screenClass == null) {
+            Log.err(((Object)this).getClass(), "Cannot change screen -> Received empty screen class!");
+            return;
+        }
+        // create new screen on GL thread
+        Gdx.app.postRunnable(new Runnable() {
+
+            @Override
+            public void run() {
                 setScreenIfIsDifferent(Utility.getScreenForScreenClass(screenClass), changeScreenEvent.getScreenTransaction());
-			}
-		});
-	}
+            }
+        });
+    }
 }
diff --git a/core/src/cz/nic/tablexia/TablexiaSettings.java b/core/src/cz/nic/tablexia/TablexiaSettings.java
index 2b8eb30643771d1b53b3459af7eb91311695093c..6e2404d613f51a319230da6016d9e00380d370d8 100644
--- a/core/src/cz/nic/tablexia/TablexiaSettings.java
+++ b/core/src/cz/nic/tablexia/TablexiaSettings.java
@@ -17,38 +17,38 @@ import cz.nic.tablexia.util.Utility;
 
 public class TablexiaSettings {
 
-    private static final    int                 DEFAULT_SCREEN_WIDTH        = 1000;
-    private static final    double              MAXIMUM_RATIO               = 9.0 / 16.0;
-    private static final    int                 MIN_SCREEN_HEIGHT           = (int) (DEFAULT_SCREEN_WIDTH * MAXIMUM_RATIO);
-    private static final    boolean 	        DEBUG_SHOW_BOUNDING_BOXES   = true;
+    private static final int     DEFAULT_SCREEN_WIDTH      = 1000;
+    private static final double  MAXIMUM_RATIO             = 9.0 / 16.0;
+    private static final int     MIN_SCREEN_HEIGHT         = (int) (DEFAULT_SCREEN_WIDTH * MAXIMUM_RATIO);
+    private static final boolean DEBUG_SHOW_BOUNDING_BOXES = true;
 
-    public  static final    Class<? extends AbstractTablexiaScreen<?>> 	INITIAL_SCREEN              = GameMenuScreen.class;
+    public  static final Class<? extends AbstractTablexiaScreen<?>> INITIAL_SCREEN = GameMenuScreen.class;
 
-    public static final     String      LOCALE_KEY                  = "locale";
-    public static final     String      CURRENT_SCREEN_KEY          = "current_screen";
+    public static final String LOCALE_KEY         = "locale";
+    public static final String CURRENT_SCREEN_KEY = "current_screen";
 
-    private static final    String      IDE_BUILD_APPLICATION_ID    = "cz.nic.tablexia.debug";
-    private static final    String      IDE_BUILD_VERSION_NAME      = "IDE-BUILD";
+    private static final String IDE_BUILD_APPLICATION_ID = "cz.nic.tablexia.debug";
+    private static final String IDE_BUILD_VERSION_NAME   = "IDE-BUILD";
 
-    private final           BuildType   BUILD_TYPE;
-    private final           String      VERSION_NAME;
-    private final           String      APPLICATION_ID;
+    private final BuildType BUILD_TYPE;
+    private final String    VERSION_NAME;
+    private final String    APPLICATION_ID;
 
-    private                 Preferences         preferences;
-    private                 LocaleDefinition    systemLocale;
-    private                 LocaleDefinition    selectedLocale;
+    private Preferences      preferences;
+    private LocaleDefinition systemLocale;
+    private LocaleDefinition selectedLocale;
 
 
     public static enum BuildType {
 
-        RELEASE ("release", false,  Log.TablexiaLogLevel.ERROR),
-        DEBUG   ("debug",   true,   Log.TablexiaLogLevel.DEBUG);
+        RELEASE("release", false, Log.TablexiaLogLevel.ERROR),
+        DEBUG("debug", true, Log.TablexiaLogLevel.DEBUG);
 
         private final static BuildType FALLBACK_VARIANT = BuildType.DEBUG;
 
-        private final String                key;
-        private final boolean               isDebug;
-        private Log.TablexiaLogLevel        logLevel;
+        private final String               key;
+        private final boolean              isDebug;
+        private       Log.TablexiaLogLevel logLevel;
 
         private BuildType(String key, boolean isDebug, Log.TablexiaLogLevel logLevel) {
             this.key = key;
@@ -65,7 +65,7 @@ public class TablexiaSettings {
         }
 
         public static BuildType getBuildTypeForKey(String key) {
-            for(BuildType buildType : BuildType.values()) {
+            for (BuildType buildType : BuildType.values()) {
                 if (buildType.key.equals(key)) {
                     return buildType;
                 }
@@ -76,12 +76,12 @@ public class TablexiaSettings {
 
     public enum LocaleDefinition {
 
-        SYSTEM  (null,                      "system",   ApplicationTextManager.LANGUAGE_SYSTEM),
-        cs_CZ   (new Locale("cs", "CZ"),    "cs_CZ",    ApplicationTextManager.LANGUAGE_CZECH),
-        sk_SK   (new Locale("sk", "SK"),    "sk_SK",    ApplicationTextManager.LANGUAGE_SLOVAK);
+        SYSTEM(null, "system", ApplicationTextManager.LANGUAGE_SYSTEM),
+        cs_CZ(new Locale("cs", "CZ"), "cs_CZ", ApplicationTextManager.LANGUAGE_CZECH),
+        sk_SK(new Locale("sk", "SK"), "sk_SK", ApplicationTextManager.LANGUAGE_SLOVAK);
 
-        public  final static LocaleDefinition   DEFAULT_LOCALE      = LocaleDefinition.cs_CZ;
-        private final static LocaleDefinition   FALLBACK_VARIANT    = LocaleDefinition.SYSTEM;
+        public final static  LocaleDefinition DEFAULT_LOCALE   = LocaleDefinition.cs_CZ;
+        private final static LocaleDefinition FALLBACK_VARIANT = LocaleDefinition.SYSTEM;
 
         private final Locale locale;
         private final String localeKey;
@@ -111,7 +111,7 @@ public class TablexiaSettings {
         }
 
         public static LocaleDefinition getLocaleDefinitionForKey(String key) {
-            for(LocaleDefinition localeDefinition: LocaleDefinition.values()) {
+            for (LocaleDefinition localeDefinition : LocaleDefinition.values()) {
                 if (localeDefinition.localeKey.equals(key)) {
                     return localeDefinition;
                 }
@@ -120,7 +120,7 @@ public class TablexiaSettings {
         }
 
         public static LocaleDefinition getLocaleDefinitionForLocale(Locale locale) {
-            for(LocaleDefinition localeDefinition: LocaleDefinition.values()) {
+            for (LocaleDefinition localeDefinition : LocaleDefinition.values()) {
                 if (localeDefinition.locale != null && localeDefinition.locale.equals(locale)) {
                     return localeDefinition;
                 }
@@ -135,10 +135,10 @@ public class TablexiaSettings {
     private static TablexiaSettings instance;
 
     private TablexiaSettings(BuildType buildType, Locale systemLocale, String versionName, String applicationId) {
-        BUILD_TYPE          = buildType;
-        VERSION_NAME        = versionName == null ? IDE_BUILD_VERSION_NAME : versionName;
-        APPLICATION_ID      = applicationId == null ? IDE_BUILD_APPLICATION_ID : applicationId;
-        this.systemLocale   = LocaleDefinition.getLocaleDefinitionForLocale(systemLocale);
+        BUILD_TYPE = buildType;
+        VERSION_NAME = versionName == null ? IDE_BUILD_VERSION_NAME : versionName;
+        APPLICATION_ID = applicationId == null ? IDE_BUILD_APPLICATION_ID : applicationId;
+        this.systemLocale = LocaleDefinition.getLocaleDefinitionForLocale(systemLocale);
     }
 
     public static TablexiaSettings getInstance() {
@@ -172,8 +172,8 @@ public class TablexiaSettings {
 //////////////////////////// LIBGDX PREFERENCES
 
     public void loadPreferences(boolean resetState) {
-        preferences     = Gdx.app.getPreferences(getApplicationId());
-        selectedLocale  = LocaleDefinition.getLocaleDefinitionForKey(preferences.getString(LOCALE_KEY));
+        preferences = Gdx.app.getPreferences(getApplicationId());
+        selectedLocale = LocaleDefinition.getLocaleDefinitionForKey(preferences.getString(LOCALE_KEY));
         if (resetState) {
             preferences.remove(CURRENT_SCREEN_KEY);
             preferences.flush();
diff --git a/core/src/cz/nic/tablexia/game/difficulty/GameDifficulty.java b/core/src/cz/nic/tablexia/game/difficulty/GameDifficulty.java
index 519a293597b4dba2a10470452701918cf32b9d5f..64111b5a60c11361cc2d3605d9b6167a9a5f9846 100644
--- a/core/src/cz/nic/tablexia/game/difficulty/GameDifficulty.java
+++ b/core/src/cz/nic/tablexia/game/difficulty/GameDifficulty.java
@@ -19,6 +19,8 @@
 package cz.nic.tablexia.game.difficulty;
 
 
+import cz.nic.tablexia.loader.application.ApplicationTextManager;
+
 /**
  * Game difficulty types
  * 
@@ -26,33 +28,28 @@ package cz.nic.tablexia.game.difficulty;
  */
 public enum GameDifficulty {
 
-	// TODO use string resources
-    EASY(1),
-    MEDIUM(2),
-    HARD(3);
+    EASY    ("gamedifficulty_easy"),
+    MEDIUM  ("gamedifficulty_medium"),
+    HARD    ("gamedifficulty_hard");
+
+    private String descriptionResourceKey;
 
-    private int descriptionResourceId;
 
-    private GameDifficulty(int descriptionResourceId) {
-        this.descriptionResourceId = descriptionResourceId;
+    private GameDifficulty(String descriptionResourceKey) {
+        this.descriptionResourceKey = descriptionResourceKey;
     }
 
-    /**
-     * Returns id of description for current difficulty
-     * 
-     * @return id of description string resource
-     */
-    public int getDescriptionResourceId() {
-        return descriptionResourceId;
+    public String getTextDescription() {
+        return ApplicationTextManager.getInstance().getText(getDescriptionResourceKey());
     }
 
     /**
-     * Returns string key for intent extra
+     * Returns key of description for current difficulty
      * 
-     * @return string key for intent extra
+     * @return key of description string resource
      */
-    public static String getIntentKey() {
-        return GameDifficulty.class.getName();
+    public String getDescriptionResourceKey() {
+        return descriptionResourceKey;
     }
 
     /**
diff --git a/core/src/cz/nic/tablexia/screen/ScreenDefinition.java b/core/src/cz/nic/tablexia/screen/ScreenDefinition.java
new file mode 100644
index 0000000000000000000000000000000000000000..ba280e041995f5fd3a6ce0c40f98f4ad8c53683c
--- /dev/null
+++ b/core/src/cz/nic/tablexia/screen/ScreenDefinition.java
@@ -0,0 +1,66 @@
+package cz.nic.tablexia.screen;
+
+import net.engio.mbassy.listener.Handler;
+
+import cz.nic.tablexia.Tablexia.ChangeScreenEvent;
+import cz.nic.tablexia.TablexiaApplication.ScreenTransaction;
+import cz.nic.tablexia.bus.ApplicationBus;
+import cz.nic.tablexia.menu.MainMenuDefinition;
+import cz.nic.tablexia.screen.about.AboutScreen;
+import cz.nic.tablexia.screen.encyclopedia.EncyclopediaScreen;
+import cz.nic.tablexia.screen.gamemenu.GameMenuScreen;
+import cz.nic.tablexia.screen.halloffame.HallOfFameScreen;
+import cz.nic.tablexia.screen.loader.LoaderScreen;
+import cz.nic.tablexia.screen.preferences.PreferencesScreen;
+import cz.nic.tablexia.screen.statistics.StatisticsScreen;
+
+public enum ScreenDefinition {
+    LOADER(LoaderScreen.class, null),
+    GAME_MENU(GameMenuScreen.class, null),
+    HALL_OF_FAME(HallOfFameScreen.class, MainMenuDefinition.HALL_OF_FAME),
+    STATISTICS(StatisticsScreen.class, MainMenuDefinition.STATISTICS),
+    ENCYCLOPEDIA(EncyclopediaScreen.class, MainMenuDefinition.ENCYCLOPEDIA),
+    PREFERENCES(PreferencesScreen.class, MainMenuDefinition.PREFERENCES),
+    ABOUT_APPLICATION(AboutScreen.class, MainMenuDefinition.ABOUT_APPLICATION);
+
+    private        Class<? extends AbstractTablexiaScreen<?>> screenClass;
+    private        MainMenuDefinition                         mainMenuDefinition;
+    private static Object                                     messageHandler;
+
+    private ScreenDefinition(Class<? extends AbstractTablexiaScreen<?>> screenClass, MainMenuDefinition mainMenuDefinition) {
+        this.screenClass = screenClass;
+        this.mainMenuDefinition = mainMenuDefinition;
+    }
+
+    public MainMenuDefinition getMainMenuDefinition() {
+        return mainMenuDefinition;
+    }
+
+    public Class<? extends AbstractTablexiaScreen<?>> getScreenClass() {
+        return screenClass;
+    }
+
+    public void performMenuAction() {
+        ApplicationBus.getInstance().publishAsync(new ChangeScreenEvent(screenClass, ScreenTransaction.FADE));
+    }
+
+    public static ScreenDefinition getScreenDefinitionForMainMenuDefinition(MainMenuDefinition mainMenuDefinition) {
+        for (ScreenDefinition screenDefinition : ScreenDefinition.values()) {
+            if (screenDefinition.getMainMenuDefinition() == mainMenuDefinition) {
+                return screenDefinition;
+            }
+        }
+        return null;
+    }
+
+    public static void initBus() {
+        messageHandler = new Object() {
+
+            @Handler
+            public void handleChangeScreenEvent(MainMenuDefinition mainMenuDefinition) {
+                ScreenDefinition.getScreenDefinitionForMainMenuDefinition(mainMenuDefinition).performMenuAction();
+            }
+        };
+        ApplicationBus.getInstance().subscribe(messageHandler);
+    }
+}
diff --git a/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuAssets.java b/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuAssets.java
index 20c688976647c8d9fee6bc7f61d7ffa8400acad7..b86aed5b550d6f2d11691d0e92fecf2919608033 100644
--- a/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuAssets.java
+++ b/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuAssets.java
@@ -23,6 +23,7 @@ public final class GameMenuAssets {
     public static final String OFFICE               = GAMEMENU_PATH + "office.jpg";
     public static final String OFFICE_CLICKMAP      = GAMEMENU_PATH + "clickablemap.png";
     public static final String OFFICE_HELP          = GAMEMENU_PATH + "helplayer.png";
+    public static final String OVERLAY              = GAMEMENU_PATH + "overlay.png";
     public static final String VIGNETTE             = GAMEMENU_PATH + "vignetting.png";
     public static final String DESK                 = GAMEMENU_PATH + "desk.png";
     public static final String ENCYCLOPEDIA_PRESSED = GAMEMENU_PATH + "encyclopedia_pressed.png";
@@ -54,6 +55,7 @@ public final class GameMenuAssets {
         textures.add(DESK);
         textures.add(OFFICE_HELP);
         textures.add(VIGNETTE);
+        textures.add(OVERLAY);
 
         textures.add(DIFF_BAR);
         textures.add(DIFF_THUMB);
diff --git a/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java b/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java
index cf74b3063c55015955de3cfc55624d40e2d53335..9fc0efbecdf452775909c568aac8124bc80b94d1 100644
--- a/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java
+++ b/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java
@@ -1,22 +1,24 @@
 package cz.nic.tablexia.screen.gamemenu;
 
+import com.badlogic.gdx.graphics.Texture;
 import com.badlogic.gdx.scenes.scene2d.Touchable;
 import com.badlogic.gdx.scenes.scene2d.ui.Image;
 
+import net.engio.mbassy.listener.Handler;
+
 import java.util.List;
 
+import cz.nic.tablexia.bus.ApplicationBus;
 import cz.nic.tablexia.game.GameDefinition;
 import cz.nic.tablexia.screen.AbstractTablexiaScreen;
 import cz.nic.tablexia.screen.gamemenu.pages.GameMenuPage;
 import cz.nic.tablexia.screen.gamemenu.pages.OfficeMenuPage;
-import cz.nic.tablexia.util.Log;
 import cz.nic.tablexia.util.ui.ViewPager;
 
 public class GameMenuScreen extends AbstractTablexiaScreen<Void> {
 
     private ViewPager vp;
 
-
     @Override
     protected void prepareScreenTextureAssetNames(List<String> textureFileNames) {
         super.prepareScreenTextureAssetNames(textureFileNames);
@@ -26,7 +28,6 @@ public class GameMenuScreen extends AbstractTablexiaScreen<Void> {
     @Override
     protected void screenLoaded() {
         vp = new ViewPager();
-
         vp.addPage(new OfficeMenuPage(this));
 
         for (GameDefinition gd : GameDefinition.getActiveGames()) {
@@ -34,15 +35,25 @@ public class GameMenuScreen extends AbstractTablexiaScreen<Void> {
         }
 
         vp.setSize(getStage().getWidth(), getStage().getHeight());
-
-        Log.info(getClass().getName(), "ViewPager size: " + getStage().getWidth() + "x" + getStage().getHeight());
-
         getStage().addActor(vp);
 
-
         Image im = new Image(getTexture(GameMenuAssets.VIGNETTE));
         im.setTouchable(Touchable.disabled);
         im.setSize(getStage().getWidth(), getStage().getHeight());
         getStage().addActor(im);
+
+        ApplicationBus.getInstance().subscribe(this);
+    }
+
+    @Handler
+    public void handleShowStreet(OfficeMenuPage.ShowStreetEvent message) {
+        vp.scrollToPage(1);
+    }
+
+    @Override
+    public Texture getTexture(String textureName) {
+        Texture texture = super.getTexture(textureName);
+        texture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear);
+        return texture;
     }
 }
diff --git a/core/src/cz/nic/tablexia/screen/gamemenu/pages/GameMenuPage.java b/core/src/cz/nic/tablexia/screen/gamemenu/pages/GameMenuPage.java
index f276a04f6f90a54ff9b7df2226d0049405a3ab19..4243708a5b2a8bd5fc84901fe1311da13d747289 100644
--- a/core/src/cz/nic/tablexia/screen/gamemenu/pages/GameMenuPage.java
+++ b/core/src/cz/nic/tablexia/screen/gamemenu/pages/GameMenuPage.java
@@ -3,6 +3,7 @@ package cz.nic.tablexia.screen.gamemenu.pages;
 import com.badlogic.gdx.graphics.Color;
 import com.badlogic.gdx.graphics.Texture;
 import com.badlogic.gdx.graphics.g2d.Batch;
+import com.badlogic.gdx.graphics.g2d.BitmapFont;
 import com.badlogic.gdx.scenes.scene2d.Actor;
 import com.badlogic.gdx.scenes.scene2d.InputEvent;
 import com.badlogic.gdx.scenes.scene2d.InputListener;
@@ -10,10 +11,13 @@ import com.badlogic.gdx.scenes.scene2d.actions.AlphaAction;
 import com.badlogic.gdx.scenes.scene2d.actions.MoveToAction;
 import com.badlogic.gdx.scenes.scene2d.ui.Image;
 import com.badlogic.gdx.scenes.scene2d.ui.Label;
+import com.badlogic.gdx.scenes.scene2d.ui.Stack;
 import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
 
 import cz.nic.tablexia.TablexiaSettings;
 import cz.nic.tablexia.game.GameDefinition;
+import cz.nic.tablexia.game.difficulty.GameDifficulty;
+import cz.nic.tablexia.loader.application.ApplicationTextManager;
 import cz.nic.tablexia.screen.AbstractTablexiaScreen;
 import cz.nic.tablexia.screen.gamemenu.GameMenuAssets;
 import cz.nic.tablexia.util.ui.ViewPager;
@@ -26,6 +30,9 @@ public class GameMenuPage extends MenuPage implements ViewPager.ScrollListener {
     private GameDefinition game;
 
     private float diffEasyX, diffMediumX, diffHardX;
+    private Actor diffEasy, diffMedium, diffHard;
+    private Stack diffStack;
+    private GameDifficulty gameDifficulty = GameDifficulty.EASY;
 
     private float scrollOffset = TablexiaSettings.getDefaultScreenWidth(); // hack to keep paralax layers out of picture before scrolled for first time
 
@@ -33,7 +40,6 @@ public class GameMenuPage extends MenuPage implements ViewPager.ScrollListener {
         super(screen);
         this.game = game;
 
-
         // Title
         Texture title = getScreen().getTexture(GameMenuAssets.getResourcePath(game, GameMenuAssets.GameMenuLayers.TITLE));
         Image titleImage = new Image(title);
@@ -68,7 +74,6 @@ public class GameMenuPage extends MenuPage implements ViewPager.ScrollListener {
 
         addActor(startDownButton);
         addActor(startButton);
-
         startButton.addListener(new ClickListener() {
             @Override
             public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
@@ -93,53 +98,59 @@ public class GameMenuPage extends MenuPage implements ViewPager.ScrollListener {
             }
         });
 
-        // Labels for diffuculty slider
-        Label.LabelStyle labelStyle = new Label.LabelStyle(screen.getDefaultRegularFont(), Color.BLACK);
-        // TODO load texts from GameDifficulty enum
-        Label easy = new Label("Easy", labelStyle);
-        Label medium = new Label("Medium", labelStyle);
-        Label hard = new Label("Hard", labelStyle);
-
-        easy.setPosition((screen.getStage().getWidth() / 2) - (screen.getStage().getWidth() * 0.1f) - easy.getWidth() / 2, screen.getStage().getHeight() * 0.0f);
-        medium.setPosition((screen.getStage().getWidth() / 2) - medium.getWidth() / 2, screen.getStage().getHeight() * 0.0f);
-        hard.setPosition((screen.getStage().getWidth() / 2) + (screen.getStage().getWidth() * 0.1f) - hard.getWidth() / 2, screen.getStage().getHeight() * 0.0f);
-
-        addActor(easy);
-        addActor(medium);
-        addActor(hard);
+        final Texture diff = getScreen().getTexture(GameMenuAssets.DIFF_THUMB_EASY);
+        float diffY = screen.getStage().getHeight() * 0.06f;
+        float diffHeight = screen.getStage().getHeight() * 0.12f;
+        float diffWidth = diffHeight * ((float) diff.getWidth() / (float) diff.getHeight());
 
         // Difficulty bar
         Texture diffBar = getScreen().getTexture(GameMenuAssets.DIFF_BAR);
         Image diffBarImage = new Image(diffBar);
 
-        int diffBarHeight = (int) (screen.getStage().getHeight() * 0.05);
+        int diffBarHeight = (int) (screen.getStage().getHeight() * 0.04f);
         int diffBarWidth = (int) (diffBarHeight * ((float) diffBar.getWidth() / (float) diffBar.getHeight()));
         int diffBarX = (int) screen.getStage().getWidth() / 2 - diffBarWidth / 2;
-        int diffBarY = (int) (screen.getStage().getHeight() * 0.1 - diffBarHeight);
+        int diffBarY = (int) (screen.getStage().getHeight() * 0.1);
         diffBarImage.setPosition(diffBarX, diffBarY);
         diffBarImage.setSize(diffBarWidth, diffBarHeight);
         addActor(diffBarImage);
 
-        // Difficulty button
+        diffMediumX = (screen.getStage().getWidth() / 2) - (diffWidth / 2);
+        diffEasyX = diffMediumX - (diffBarWidth / 2) + (diffWidth * 0.1f);
+        diffHardX = diffMediumX + (diffBarWidth / 2) - (diffWidth * 0.1f);
 
+        // Labels for diffuculty slider
+        BitmapFont font = screen.getDefaultBoldFont();
+        font.setScale(0.5f);
+        Label.LabelStyle labelStyle = new Label.LabelStyle(font, Color.BLACK);
 
-        final Texture diff = getScreen().getTexture(GameMenuAssets.DIFF_THUMB_MEDIUM);
-        final Image diffButton = new Image(diff);
-        float diffY = 0;
-        float diffHeight = screen.getStage().getHeight() * 0.15f;
-        float diffWidth = diffHeight * ((float) diff.getWidth() / (float) diff.getHeight());
+        Label easy = new Label(GameDifficulty.EASY.getTextDescription(), labelStyle);
+        Label medium = new Label(GameDifficulty.MEDIUM.getTextDescription(), labelStyle);
+        Label hard = new Label(GameDifficulty.HARD.getTextDescription(), labelStyle);
 
-        diffEasyX = (screen.getStage().getWidth() / 2 - diffWidth / 2 + (int) (diffWidth * 0.1f)) - diffBarWidth / 2;
-        diffMediumX = screen.getStage().getWidth() / 2 - diffWidth / 2 + (int) (diffWidth * 0.1f);
-        diffHardX = (screen.getStage().getWidth() / 2 - diffWidth / 2 + (int) (diffWidth * 0.1f)) + diffBarWidth / 2;
+        float labelY = screen.getStage().getHeight() * 0.06f;
+        float labelAddX = diffWidth / 2;
+        easy.setPosition(diffEasyX + labelAddX - easy.getWidth() / 2, labelY);
+        medium.setPosition(diffMediumX + labelAddX - medium.getWidth() / 2, labelY);
+        hard.setPosition(diffHardX + labelAddX - hard.getWidth() / 2, labelY);
 
-        float diffX = diffEasyX;
-        diffButton.setSize(diffWidth, diffHeight);
-        diffButton.setPosition(diffX, diffY);
-        addActor(diffButton);
+        addActor(easy);
+        addActor(medium);
+        addActor(hard);
 
+        // Difficulty button
+        diffStack = new Stack();
+        diffStack.addActor(diffEasy = new Image(diff));
+        diffStack.addActor(diffMedium = new Image(getScreen().getTexture(GameMenuAssets.DIFF_THUMB_MEDIUM)));
+        diffStack.addActor(diffHard = new Image(getScreen().getTexture(GameMenuAssets.DIFF_THUMB_HARD)));
+
+        float diffX = diffEasyX;
+        diffStack.setSize(diffWidth, diffHeight);
+        diffStack.setPosition(diffX, diffY);
+        addActor(diffStack);
+        setDifficulty(gameDifficulty);
 
-        diffButton.addListener(new InputListener() {
+        diffStack.addListener(new InputListener() {
             float lastX;
 
             @Override
@@ -153,41 +164,117 @@ public class GameMenuPage extends MenuPage implements ViewPager.ScrollListener {
             @Override
             public void touchDragged(InputEvent event, float x, float y, int pointer) {
                 super.touchDragged(event, x, y, pointer);
-                float bx = diffButton.getX() + (x - lastX);
+                float bx = diffStack.getX() + (x - lastX);
                 if (bx >= diffEasyX && bx <= diffHardX) {
-                    diffButton.setPosition(bx, diffButton.getY());
+                    diffStack.setPosition(bx, diffStack.getY());
                 }
+                showDifficulty(getDifficulty());
                 event.stop();
             }
 
             @Override
             public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
                 super.touchUp(event, x, y, pointer, button);
-                float bx = diffButton.getX() + (x - lastX);
-                MoveToAction ma = new MoveToAction();
-                if (bx < diffMediumX) {
-                    if ((diffEasyX + ((diffMediumX - diffEasyX) / 2)) > bx) {
-                        ma.setPosition(diffEasyX, diffButton.getY());
-                    } else {
-                        ma.setPosition(diffMediumX, diffButton.getY());
-                    }
-                } else {
-                    if ((diffMediumX + ((diffHardX - diffMediumX) / 2)) > bx) {
-                        ma.setPosition(diffMediumX, diffButton.getY());
-                    } else {
-                        ma.setPosition(diffHardX, diffButton.getY());
-                    }
+                float bx = diffStack.getX() + (x - lastX);
+
+                GameDifficulty newDiff = getDifficulty();
+                setDifficulty(newDiff);
+                if (gameDifficulty != newDiff) {
+                    difficultyChanged(newDiff);
                 }
-                diffButton.addAction(ma);
                 event.stop();
             }
         });
     }
 
+    /**
+     * Change selector to custom difficulty
+     *
+     * @param difficulty
+     */
+    public void setDifficulty(GameDifficulty difficulty) {
+        showDifficulty(difficulty);
+        MoveToAction ma = new MoveToAction();
+        switch (difficulty) {
+            case EASY:
+                ma.setPosition(diffEasyX, diffStack.getY());
+                break;
+            case MEDIUM:
+                ma.setPosition(diffMediumX, diffStack.getY());
+                break;
+            case HARD:
+                ma.setPosition(diffHardX, diffStack.getY());
+                break;
+        }
+        diffStack.addAction(ma);
+        if (gameDifficulty != difficulty) {
+            difficultyChanged(difficulty);
+        }
+    }
+
+    /**
+     * Called when difficulty is changed
+     *
+     * @param difficulty
+     */
+    public void difficultyChanged(GameDifficulty difficulty) {
+        gameDifficulty = difficulty;
+        // TODO
+    }
+
+    /**
+     * Get nearest difficulty from current slider position
+     *
+     * @return
+     */
+    private GameDifficulty getDifficulty() {
+        float bx = diffStack.getX();
+        if (bx < diffMediumX) {
+            if ((diffEasyX + ((diffMediumX - diffEasyX) / 2)) > bx) {
+                return GameDifficulty.EASY;
+            } else {
+                return GameDifficulty.MEDIUM;
+            }
+        } else {
+            if ((diffMediumX + ((diffHardX - diffMediumX) / 2)) > bx) {
+                return GameDifficulty.MEDIUM;
+            } else {
+                return GameDifficulty.HARD;
+            }
+        }
+    }
+
+    /**
+     * Check difficulty image and display corresponding image
+     *
+     * @param diff
+     */
+    private void showDifficulty(GameDifficulty diff) {
+        diffEasy.setVisible(false);
+        diffMedium.setVisible(false);
+        diffHard.setVisible(false);
+
+        switch (diff) {
+            case EASY:
+                diffEasy.setVisible(true);
+                break;
+            case MEDIUM:
+                diffMedium.setVisible(true);
+                break;
+            case HARD:
+                diffHard.setVisible(true);
+                break;
+        }
+    }
+
     @Override
     public void draw(Batch batch, float parentAlpha) {
         // Paralax layers
         // Back layer travels half the speed of scroll
+        // needed to make fade work
+        Color color = new Color(this.getColor().r, this.getColor().g, this.getColor().b, this.getColor().a * parentAlpha);
+        batch.setColor(color);
+
         Texture back = getScreen().getTexture(GameMenuAssets.getResourcePath(game, GameMenuAssets.GameMenuLayers.BACK));
         float scrollHalf = (Math.abs(scrollOffset / 2) / getWidth()) * back.getWidth();
         int srcX = (int) scrollHalf;
@@ -200,7 +287,6 @@ public class GameMenuPage extends MenuPage implements ViewPager.ScrollListener {
         batch.draw(getScreen().getTexture(GameMenuAssets.getResourcePath(game, GameMenuAssets.GameMenuLayers.MID)), getX(), getY(), getWidth(), getHeight());
 
         // Foreground layer travels faster and could be wider than screen. Needs to be clipped
-
         Texture fore = getScreen().getTexture(GameMenuAssets.getResourcePath(game, GameMenuAssets.GameMenuLayers.FORE));
         float foreWidth = (getHeight() / fore.getHeight()) * fore.getWidth();
         batch.draw(fore, getX() - ((foreWidth - getWidth()) / 2) + (scrollOffset / 2), getY(), foreWidth, getHeight());
diff --git a/core/src/cz/nic/tablexia/screen/gamemenu/pages/MenuPage.java b/core/src/cz/nic/tablexia/screen/gamemenu/pages/MenuPage.java
index 5711a8cf1962a3f0685b53602a81a358e73b6547..b00985334a213070b600ce10ac26199bf07632da 100644
--- a/core/src/cz/nic/tablexia/screen/gamemenu/pages/MenuPage.java
+++ b/core/src/cz/nic/tablexia/screen/gamemenu/pages/MenuPage.java
@@ -1,5 +1,6 @@
 package cz.nic.tablexia.screen.gamemenu.pages;
 
+import com.badlogic.gdx.scenes.scene2d.Actor;
 import com.badlogic.gdx.scenes.scene2d.Group;
 
 import cz.nic.tablexia.screen.AbstractTablexiaScreen;
@@ -17,4 +18,12 @@ public abstract class MenuPage extends Group {
     protected AbstractTablexiaScreen getScreen() {
         return screen;
     }
+
+    @Override
+    public void setDebug(boolean enabled) {
+        super.setDebug(enabled);
+        for (Actor a : getChildren()) {
+            a.setDebug(enabled);
+        }
+    }
 }
diff --git a/core/src/cz/nic/tablexia/screen/gamemenu/pages/OfficeMenuPage.java b/core/src/cz/nic/tablexia/screen/gamemenu/pages/OfficeMenuPage.java
index 980cefa66dbf75e034f19c08fc7b12a0a7bc061c..5d1e9667f1fdc26801512f63343ee0e9881d6b9f 100644
--- a/core/src/cz/nic/tablexia/screen/gamemenu/pages/OfficeMenuPage.java
+++ b/core/src/cz/nic/tablexia/screen/gamemenu/pages/OfficeMenuPage.java
@@ -3,13 +3,21 @@ package cz.nic.tablexia.screen.gamemenu.pages;
 import com.badlogic.gdx.graphics.Color;
 import com.badlogic.gdx.graphics.Pixmap;
 import com.badlogic.gdx.graphics.Texture;
-import com.badlogic.gdx.graphics.g2d.Batch;
+import com.badlogic.gdx.scenes.scene2d.Group;
 import com.badlogic.gdx.scenes.scene2d.InputEvent;
+import com.badlogic.gdx.scenes.scene2d.InputListener;
+import com.badlogic.gdx.scenes.scene2d.actions.Actions;
+import com.badlogic.gdx.scenes.scene2d.ui.Image;
+import com.badlogic.gdx.scenes.scene2d.ui.Stack;
 import com.badlogic.gdx.scenes.scene2d.utils.ClickListener;
 
+import cz.nic.tablexia.Tablexia;
+import cz.nic.tablexia.TablexiaApplication;
+import cz.nic.tablexia.bus.ApplicationBus;
 import cz.nic.tablexia.menu.MainMenuDefinition;
 import cz.nic.tablexia.screen.AbstractTablexiaScreen;
 import cz.nic.tablexia.screen.gamemenu.GameMenuAssets;
+import cz.nic.tablexia.screen.profile.ProfileScreen;
 import cz.nic.tablexia.util.Log;
 
 /**
@@ -23,34 +31,120 @@ public class OfficeMenuPage extends MenuPage {
     public static final Color ENCYCLOPEDIA_COLOR = Color.BLACK;
     public static final Color PROFILE_COLOR      = Color.BLUE;
 
+    private Group help;
+
+    private Image hallOfFame;
+    private Image statistics;
+    private Image encyclopedia;
+    private Image street;
+    private Image profile;
+
 
     public OfficeMenuPage(AbstractTablexiaScreen screen) {
         super(screen);
+        createImageStack();
+
+        // TODO show help layer button
+
+        addListener(new InputListener() {
+            private Color downColor;
+
+            @Override
+            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
+                super.touchDown(event, x, y, pointer, button);
+                Color color = getTouchedColor(x, y);
+                downColor = color;
+                help.addAction(Actions.fadeOut(0.5f));
+                if (color.equals(ENCYCLOPEDIA_COLOR)) {
+                    encyclopedia.setVisible(true);
+                } else if (color.equals(STATISTICS_COLOR)) {
+                    statistics.setVisible(true);
+                } else if (color.equals(HALLOFFAME_COLOR)) {
+                    hallOfFame.setVisible(true);
+                } else if (color.equals(STREET_COLOR)) {
+                    street.setVisible(true);
+                } else if (color.equals(PROFILE_COLOR)) {
+                    profile.setVisible(true);
+                } else {
+                    return false;
+                }
+                return true;
+            }
+
+            @Override
+            public void touchUp(InputEvent event, float x, float y, int pointer, int button) {
+                super.touchUp(event, x, y, pointer, button);
+                Log.info(((Object) this).getClass().getName(), "Touch up ");
+                hideAllActions();
+            }
+        });
+
         addListener(new ClickListener() {
             @Override
             public void clicked(InputEvent event, float x, float y) {
                 super.clicked(event, x, y);
-
                 Color color = getTouchedColor(x, y);
-
                 if (color.equals(ENCYCLOPEDIA_COLOR)) {
-                    MainMenuDefinition.ENCYCLOPEDIA.performAction();
+                    ApplicationBus.getInstance().publishAsync(MainMenuDefinition.ENCYCLOPEDIA);
                 } else if (color.equals(STATISTICS_COLOR)) {
-                    MainMenuDefinition.STATISTICS.performAction();
+                    ApplicationBus.getInstance().publishAsync(MainMenuDefinition.STATISTICS);
                 } else if (color.equals(HALLOFFAME_COLOR)) {
-                    MainMenuDefinition.HALL_OF_FAME.performAction();
+                    ApplicationBus.getInstance().publishAsync(MainMenuDefinition.HALL_OF_FAME);
                 } else if (color.equals(STREET_COLOR)) {
-                    Log.info(((Object) this).getClass().getName(), "Clicked STREET_COLOR");
-                    // TODO go to street
+                    ApplicationBus.getInstance().publishAsync(new ShowStreetEvent());
                 } else if (color.equals(PROFILE_COLOR)) {
-                    // TODO show profile
-                } else {
-                    // TODO hide help layer
+                    ApplicationBus.getInstance().publishAsync(new Tablexia.ChangeScreenEvent(ProfileScreen.class, TablexiaApplication.ScreenTransaction.FADE));
                 }
+                hideAllActions();
             }
         });
     }
 
+    private void createImageStack() {
+        Stack stack = new Stack();
+        stack.setSize(getScreen().getStage().getWidth(), getScreen().getStage().getHeight());
+        stack.setPosition(0, 0);
+        addActor(stack);
+
+        stack.addActor(createImage(GameMenuAssets.OFFICE));
+        stack.addActor(street = createImage(GameMenuAssets.DOOR_PRESSED));
+        stack.addActor(encyclopedia = createImage(GameMenuAssets.ENCYCLOPEDIA_PRESSED));
+        stack.addActor(statistics = createImage(GameMenuAssets.STATISTICS_PRESSED));
+        stack.addActor(hallOfFame = createImage(GameMenuAssets.HALLOFFAME_PRESSED));
+        stack.addActor(createImage(GameMenuAssets.DESK));
+        stack.addActor(profile = createImage(GameMenuAssets.PROFILE_PRESSED));
+
+        hideAllActions();
+
+        help = new Stack();
+        help.setSize(getScreen().getStage().getWidth(), getScreen().getStage().getHeight());
+        help.setPosition(0, 0);
+        stack.addActor(help);
+        Image overlay = createImage(GameMenuAssets.OVERLAY);
+        overlay.getColor().a = 0.5f;
+        help.addActor(overlay);
+        help.addActor(createImage(GameMenuAssets.OFFICE_HELP));
+    }
+
+    private void hideAllActions() {
+        profile.setVisible(false);
+        street.setVisible(false);
+        encyclopedia.setVisible(false);
+        statistics.setVisible(false);
+        hallOfFame.setVisible(false);
+
+    }
+
+    /**
+     * Helper method for creating image instances
+     *
+     * @param texture
+     * @return
+     */
+    private Image createImage(String texture) {
+        Image image = new Image(getScreen().getTexture(texture));
+        return image;
+    }
 
     private Color getTouchedColor(float x, float y) {
         Texture clickmap = getScreen().getTexture(GameMenuAssets.OFFICE_CLICKMAP);
@@ -61,28 +155,12 @@ public class OfficeMenuPage extends MenuPage {
         Pixmap pixmap = clickmap.getTextureData().consumePixmap();
         int clickX = (int) (x / getWidth() * clickmap.getWidth());
         int clickY = clickmap.getHeight() - (int) (y / getHeight() * clickmap.getHeight());
-
-        Log.info(((Object) this).getClass().getName(), "Color map " + clickmap.getWidth() + ":" + clickmap.getHeight() + " at " + clickX + ": " + clickY);
-
         return new Color(pixmap.getPixel(clickX, clickY));
     }
 
-
-    @Override
-    public void draw(Batch batch, float parentAlpha) {
-        batch.disableBlending();
-        batch.draw(getScreen().getTexture(GameMenuAssets.OFFICE), getX(), getY(), getWidth(), getHeight());
-        batch.enableBlending();
-
-        batch.draw(getScreen().getTexture(GameMenuAssets.OFFICE_HELP), getX(), getY(), getWidth(), getHeight());
-        batch.draw(getScreen().getTexture(GameMenuAssets.PROFILE_PRESSED), getX(), getY(), getWidth(), getHeight());
-        batch.draw(getScreen().getTexture(GameMenuAssets.DOOR_PRESSED), getX(), getY(), getWidth(), getHeight());
-        batch.draw(getScreen().getTexture(GameMenuAssets.ENCYCLOPEDIA_PRESSED), getX(), getY(), getWidth(), getHeight());
-        batch.draw(getScreen().getTexture(GameMenuAssets.STATISTICS_PRESSED), getX(), getY(), getWidth(), getHeight());
-        batch.draw(getScreen().getTexture(GameMenuAssets.HALLOFFAME_PRESSED), getX(), getY(), getWidth(), getHeight());
-
-        batch.draw(getScreen().getTexture(GameMenuAssets.DESK), getX(), getY(), getWidth(), getHeight());
-
-        batch.draw(getScreen().getTexture(GameMenuAssets.OFFICE_HELP), getX(), getY(), getWidth(), getHeight());
+    /**
+     * Event fired by clicking on door telling viewpager to page to first game
+     */
+    public static class ShowStreetEvent implements ApplicationBus.ApplicationEvent {
     }
 }
diff --git a/core/src/cz/nic/tablexia/screen/loader/LoaderScreen.java b/core/src/cz/nic/tablexia/screen/loader/LoaderScreen.java
index e4d29a8d6a8938db0ea0210113b5a316c91fc856..028ef30f78f473ed5e5cb051788116be96987bdc 100644
--- a/core/src/cz/nic/tablexia/screen/loader/LoaderScreen.java
+++ b/core/src/cz/nic/tablexia/screen/loader/LoaderScreen.java
@@ -1,9 +1,8 @@
 package cz.nic.tablexia.screen.loader;
 
 import com.badlogic.gdx.graphics.Texture;
-import com.badlogic.gdx.graphics.Texture.TextureFilter;
-import com.badlogic.gdx.graphics.g2d.Batch;
-import com.badlogic.gdx.scenes.scene2d.Actor;
+import com.badlogic.gdx.scenes.scene2d.actions.Actions;
+import com.badlogic.gdx.scenes.scene2d.ui.Image;
 
 import java.util.List;
 
@@ -13,27 +12,11 @@ import cz.nic.tablexia.screen.AbstractTablexiaScreen;
 public class LoaderScreen extends AbstractTablexiaScreen<Void> {
 
     private static final String LOADER_BACKGROUND = "gfx/screen_loader_background.jpg";
+    private static final String LOADER_SMALL_HAND = "gfx/screen_loader_smallhand.png";
+    private static final String LOADER_BIG_HAND   = "gfx/screen_loader_bighand.png";
 
-    private LoaderBackground background;
     private Texture backgroundTexture;
 
-    private class LoaderBackground extends Actor {
-
-
-        public LoaderBackground() {
-            backgroundTexture = getTexture(LOADER_BACKGROUND);
-            backgroundTexture.setFilter(TextureFilter.Linear, TextureFilter.Linear);
-        }
-
-        @Override
-        public void draw(Batch batch, float parentAlpha) {
-            batch.disableBlending();
-            batch.draw(backgroundTexture, 0, 0, getWidth(), getHeight());
-            batch.enableBlending();
-        }
-
-    }
-
     public LoaderScreen() {
         super(false, false, TablexiaAssetManager.StorageType.INTERNAL);
     }
@@ -41,16 +24,29 @@ public class LoaderScreen extends AbstractTablexiaScreen<Void> {
     @Override
     protected void prepareScreenTextureAssetNames(List<String> textureFileNames) {
         textureFileNames.add(LOADER_BACKGROUND);
+        textureFileNames.add(LOADER_SMALL_HAND);
+        textureFileNames.add(LOADER_BIG_HAND);
     }
 
     @Override
     protected void screenLoaded() {
-        background = new LoaderBackground();
+        Image background = new Image(getTexture(LOADER_BACKGROUND));
+        background.setPosition(0, 0);
+        background.setSize(getStage().getWidth(), getStage().getHeight());
         getStage().addActor(background);
-    }
 
-    @Override
-    public void screenResized(int width, int height) {
-        background.setSize(width, height);
+        Image smallhand = new Image(getTexture(LOADER_SMALL_HAND));
+        smallhand.setPosition(getStage().getWidth()*0.22f, getStage().getHeight() * 0.64f);
+        smallhand.setSize(getStage().getWidth()*0.01f, getStage().getHeight()*0.06f);
+        getStage().addActor(smallhand);
+        smallhand.setOrigin(smallhand.getWidth()/2,0);
+        smallhand.addAction(Actions.forever(Actions.rotateBy(-360, 6)));
+
+        Image bighand = new Image(getTexture(LOADER_BIG_HAND));
+        bighand.setPosition(getStage().getWidth()*0.22f, getStage().getHeight() * 0.64f);
+        bighand.setSize(getStage().getWidth()*0.01f, getStage().getHeight()*0.06f);
+        getStage().addActor(bighand);
+        bighand.setOrigin(bighand.getWidth()/2,0);
+        bighand.addAction(Actions.forever(Actions.rotateBy(-360, 0.5f)));
     }
 }
diff --git a/core/src/cz/nic/tablexia/util/ui/ViewPager.java b/core/src/cz/nic/tablexia/util/ui/ViewPager.java
index 55403797fb53f895318510ae2ce53f2ec7adfb16..63c279437d71f12586b139866d752714ad05d645 100644
--- a/core/src/cz/nic/tablexia/util/ui/ViewPager.java
+++ b/core/src/cz/nic/tablexia/util/ui/ViewPager.java
@@ -14,11 +14,7 @@ import com.badlogic.gdx.utils.Array;
 public class ViewPager extends ScrollPane {
 
     private boolean wasPanDragFling = false;
-
     private float lastX;
-
-    private float pageSpacing;
-
     private Table content;
 
     public ViewPager() {
@@ -82,7 +78,7 @@ public class ViewPager extends ScrollPane {
         }
 
 
-        if(lastX != getWidget().getX()){
+        if (lastX != getWidget().getX()) {
             float scrollX = -getWidget().getX();
             Array<Actor> pages = content.getChildren();
             float pageX = 0;
@@ -103,7 +99,7 @@ public class ViewPager extends ScrollPane {
                             sl.onScroll(pageX - scrollX);
                         }
                     }
-                    if(pageX == scrollX){
+                    if (pageX == scrollX) {
                         if (a instanceof ScrollListener) {
                             ScrollListener sl = (ScrollListener) a;
                             sl.onScrolledToPage();
@@ -117,7 +113,6 @@ public class ViewPager extends ScrollPane {
     }
 
 
-
     @Override
     @Deprecated
     public void setWidget(Actor widget) {
@@ -135,13 +130,28 @@ public class ViewPager extends ScrollPane {
         }
     }
 
-    public void setPageSpacing(float pageSpacing) {
-        if (content != null) {
-            content.defaults().space(pageSpacing);
-            for (Cell cell : content.getCells()) {
-                cell.space(pageSpacing);
+    /**
+     * Smooth scroll to child with given index
+     *
+     * @param page
+     */
+    public void scrollToPage(int page) {
+        // TODO cleanup
+        if (content.getChildren().size <= page) {
+            throw new IllegalArgumentException("Page index " + page + " out of bounds");
+        }
+        final float width = getWidth();
+        final float maxX = getMaxX();
+
+        float pageX = 0;
+        float pageWidth = 0;
+        if (content.getChildren().size > 0) {
+            for (int i = 0; i <= page; i++) {
+                Actor a = content.getChildren().get(i);
+                pageX = a.getX();
+                pageWidth = a.getWidth();
             }
-            content.invalidate();
+            setScrollX(MathUtils.clamp(pageX - (width - pageWidth) / 2, 0, maxX));
         }
     }