diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000000000000000000000000000000000000..68d498f6e44899a805df4209ee14c4edb1f2a631
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "core/src/cz/nic/tablexia/shared"]
+	path = core/src/cz/nic/tablexia/shared
+	url = git@gitlab.labs.nic.cz:mlatner/Tablexia-Model.git
diff --git a/core/src/cz/nic/tablexia/TablexiaSettings.java b/core/src/cz/nic/tablexia/TablexiaSettings.java
index dbed7b65c0ab6756ddbcf8598aea7067a12da67d..fdbe4957946223ec0ca566acaace9480e9d2fcdd 100644
--- a/core/src/cz/nic/tablexia/TablexiaSettings.java
+++ b/core/src/cz/nic/tablexia/TablexiaSettings.java
@@ -11,7 +11,8 @@ import cz.nic.tablexia.bus.ApplicationBus;
 import cz.nic.tablexia.game.GameDefinition;
 import cz.nic.tablexia.game.difficulty.GameDifficulty;
 import cz.nic.tablexia.loader.application.ApplicationTextManager;
-import cz.nic.tablexia.model.User;
+import cz.nic.tablexia.model.UserDAO;
+import cz.nic.tablexia.shared.model.User;
 import cz.nic.tablexia.screen.AbstractTablexiaScreen;
 import cz.nic.tablexia.screen.gamemenu.GameMenuScreen;
 import cz.nic.tablexia.screen.loader.LoaderScreen;
@@ -163,7 +164,7 @@ public class TablexiaSettings {
     public void loadPreferences(boolean reset) {
         preferences = Gdx.app.getPreferences(PREFERENCES_KEY + BUILD_TYPE.getKey());
         selectedLocale = LocaleDefinition.getLocaleDefinitionForKey(preferences.getString(LOCALE_KEY));
-        selectedUser = reset ? null : User.selectUser(preferences.getLong(SELECTED_USER));
+        selectedUser = reset ? null : UserDAO.selectUser(preferences.getLong(SELECTED_USER));
     }
 
 
diff --git a/core/src/cz/nic/tablexia/TablexiaStorage.java b/core/src/cz/nic/tablexia/TablexiaStorage.java
index f5573a642e14f34644178f93781047380630fd05..77bcaf315cebc6ac333cb1f343bf1eb12fb33170 100644
--- a/core/src/cz/nic/tablexia/TablexiaStorage.java
+++ b/core/src/cz/nic/tablexia/TablexiaStorage.java
@@ -17,9 +17,10 @@ import java.util.Map;
 
 import cz.nic.tablexia.bus.ApplicationBus;
 import cz.nic.tablexia.loader.TablexiaAbstractFileManager;
+import cz.nic.tablexia.model.UserDAO;
 import cz.nic.tablexia.model.game.Game;
 import cz.nic.tablexia.model.game.GamePause;
-import cz.nic.tablexia.model.User;
+import cz.nic.tablexia.shared.model.User;
 import cz.nic.tablexia.model.game.GameScore;
 import cz.nic.tablexia.screen.AbstractTablexiaScreen;
 import cz.nic.tablexia.util.Log;
@@ -121,7 +122,7 @@ public class TablexiaStorage {
     private void initTables() {
         try {
             Statement statement = createStatement();
-            statement.execute(User.CREATE_TABLE);
+            statement.execute(UserDAO.CREATE_TABLE);
             statement.execute(Game.CREATE_TABLE);
             statement.execute(GameScore.CREATE_TABLE);
             statement.execute(GamePause.CREATE_TABLE);
@@ -134,7 +135,7 @@ public class TablexiaStorage {
     }
 
     private void MigrateData() {
-        User.migrateUserSignaturesData();
+        UserDAO.migrateUserSignaturesData();
     }
 
     private void reset(boolean reset) {
diff --git a/core/src/cz/nic/tablexia/debug/DebugInfo.java b/core/src/cz/nic/tablexia/debug/DebugInfo.java
index a7f1435ebcf5e21b965156a47f40c5c263b37f6b..ef726f3f2746ec69853b97872c6a65360dcab43d 100644
--- a/core/src/cz/nic/tablexia/debug/DebugInfo.java
+++ b/core/src/cz/nic/tablexia/debug/DebugInfo.java
@@ -22,7 +22,7 @@ import cz.nic.tablexia.TablexiaApplication.ScreenChangedEvent;
 import cz.nic.tablexia.TablexiaSettings;
 import cz.nic.tablexia.bus.ApplicationBus;
 import cz.nic.tablexia.loader.application.ApplicationAtlasManager;
-import cz.nic.tablexia.model.User;
+import cz.nic.tablexia.shared.model.User;
 import cz.nic.tablexia.screen.AbstractTablexiaScreen.ScreenInfoEvent;
 
 import static com.badlogic.gdx.scenes.scene2d.actions.Actions.alpha;
diff --git a/core/src/cz/nic/tablexia/game/AbstractTablexiaGame.java b/core/src/cz/nic/tablexia/game/AbstractTablexiaGame.java
index 6155dbd0882d0983700260eca8de0897736ecd3b..c3c8eda74825f38319d3a857acdeb1b5f7386f26 100644
--- a/core/src/cz/nic/tablexia/game/AbstractTablexiaGame.java
+++ b/core/src/cz/nic/tablexia/game/AbstractTablexiaGame.java
@@ -41,6 +41,7 @@ import cz.nic.tablexia.loader.application.ApplicationFontManager;
 import cz.nic.tablexia.loader.application.ApplicationTextManager;
 import cz.nic.tablexia.menu.AbstractMenu;
 import cz.nic.tablexia.menu.main.MainMenu;
+import cz.nic.tablexia.model.UserDAO;
 import cz.nic.tablexia.model.game.Game;
 import cz.nic.tablexia.screen.AbstractTablexiaScreen;
 import cz.nic.tablexia.screen.gamemenu.GameMenuScreen;
@@ -280,7 +281,7 @@ public abstract class AbstractTablexiaGame<T> extends AbstractTablexiaScreen<T>
             // create new
             TablexiaRandom random = TablexiaSettings.GAMES_RANDOM_SEED == null ? new TablexiaRandom() : new TablexiaRandom(TablexiaSettings.GAMES_RANDOM_SEED);
             GameDefinition gameDefinition = GameDefinition.getGameDefinitionForClass(AbstractTablexiaGame.this.getClass());
-            GameDifficulty gameDifficulty = gameDefinition.hasTutorial() && getSelectedUser().isTutorialForGameDefinition(gameDefinition) ? GameDifficulty.TUTORIAL : TablexiaSettings.getInstance().getGameDifficulty(gameDefinition);
+            GameDifficulty gameDifficulty = gameDefinition.hasTutorial() && UserDAO.isTutorialForGameDefinition(gameDefinition, getSelectedUser()) ? GameDifficulty.TUTORIAL : TablexiaSettings.getInstance().getGameDifficulty(gameDefinition);
             game = Game.createGame(getSelectedUser(), gameDifficulty, gameDefinition, random);
             Log.info(getClass(), "[DB] Created new GAME object: " + game);
         } else {
diff --git a/core/src/cz/nic/tablexia/game/games/robbery/RobberyGame.java b/core/src/cz/nic/tablexia/game/games/robbery/RobberyGame.java
index 39d31cb47d3e6c4d48f07e5d31c66a56e8c484c9..be2732b27c4a2827e5c8c5bd94707dc1d3484ad6 100644
--- a/core/src/cz/nic/tablexia/game/games/robbery/RobberyGame.java
+++ b/core/src/cz/nic/tablexia/game/games/robbery/RobberyGame.java
@@ -19,7 +19,7 @@ import cz.nic.tablexia.game.games.robbery.creature.CreatureFactory;
 import cz.nic.tablexia.game.games.robbery.rules.GameRule;
 import cz.nic.tablexia.game.games.robbery.rules.GameRulesDefinition;
 import cz.nic.tablexia.loader.application.ApplicationTextManager;
-import cz.nic.tablexia.model.User;
+import cz.nic.tablexia.shared.model.User;
 import cz.nic.tablexia.model.game.Game;
 import cz.nic.tablexia.screen.AbstractTablexiaScreen;
 import cz.nic.tablexia.util.ScaleUtil;
diff --git a/core/src/cz/nic/tablexia/game/trophy/GameTrophyDefinition.java b/core/src/cz/nic/tablexia/game/trophy/GameTrophyDefinition.java
index 5bd23ec312d85dfe1850bf98ba886d1487790918..60188ee5664f2d15438021a7dd851cb294d89d03 100644
--- a/core/src/cz/nic/tablexia/game/trophy/GameTrophyDefinition.java
+++ b/core/src/cz/nic/tablexia/game/trophy/GameTrophyDefinition.java
@@ -21,7 +21,7 @@ package cz.nic.tablexia.game.trophy;
 
 import cz.nic.tablexia.game.GameDefinition;
 import cz.nic.tablexia.game.difficulty.GameDifficulty;
-import cz.nic.tablexia.model.User;
+import cz.nic.tablexia.shared.model.User;
 import cz.nic.tablexia.model.game.GameTrophy;
 
 /**
diff --git a/core/src/cz/nic/tablexia/game/trophy/ITrophyDefinition.java b/core/src/cz/nic/tablexia/game/trophy/ITrophyDefinition.java
index cd368c8976b8d346e7224e1893de779eab4494e8..a73024f38a4877babdeb4e8f55e39abaa2daeccb 100644
--- a/core/src/cz/nic/tablexia/game/trophy/ITrophyDefinition.java
+++ b/core/src/cz/nic/tablexia/game/trophy/ITrophyDefinition.java
@@ -18,18 +18,13 @@
  ******************************************************************************/
 package cz.nic.tablexia.game.trophy;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-import cz.nic.tablexia.model.User;
+import cz.nic.tablexia.shared.model.User;
 
 public interface ITrophyDefinition {
     
-    public String getTrophyName();
-    public String getTrophyDescription();
-    public boolean hasTrophy(User user);
-    public String name();
+    String getTrophyName();
+    String getTrophyDescription();
+    boolean hasTrophy(User user);
+    String name();
 
 }
diff --git a/core/src/cz/nic/tablexia/game/trophy/UserTrophyDefinition.java b/core/src/cz/nic/tablexia/game/trophy/UserTrophyDefinition.java
index e0b1e1fa44c423789d8955a391230ffbc8b1228b..96cf927513b97cda95057e7a93afcbba88103859 100644
--- a/core/src/cz/nic/tablexia/game/trophy/UserTrophyDefinition.java
+++ b/core/src/cz/nic/tablexia/game/trophy/UserTrophyDefinition.java
@@ -23,7 +23,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import cz.nic.tablexia.game.difficulty.GameDifficulty;
-import cz.nic.tablexia.model.User;
+import cz.nic.tablexia.shared.model.User;
 import cz.nic.tablexia.model.game.*;
 
 /**
diff --git a/core/src/cz/nic/tablexia/menu/main/user/UserSelectBox.java b/core/src/cz/nic/tablexia/menu/main/user/UserSelectBox.java
index 0d0b7eeb54b61f7b327b60c61fd7df85431fc284..0439985974ddddf5bcf015a5987dc92402ce0380 100644
--- a/core/src/cz/nic/tablexia/menu/main/user/UserSelectBox.java
+++ b/core/src/cz/nic/tablexia/menu/main/user/UserSelectBox.java
@@ -16,9 +16,11 @@ import cz.nic.tablexia.TablexiaApplication;
 import cz.nic.tablexia.TablexiaSettings;
 import cz.nic.tablexia.bus.ApplicationBus;
 import cz.nic.tablexia.loader.application.ApplicationAtlasManager;
+import cz.nic.tablexia.menu.user.UserMenuItem;
 import cz.nic.tablexia.menu.user.UserMenuNewSelectBoxItemGroup;
 import cz.nic.tablexia.menu.user.UserMenuSelectBoxItemGroup;
-import cz.nic.tablexia.model.User;
+import cz.nic.tablexia.model.UserDAO;
+import cz.nic.tablexia.shared.model.User;
 import cz.nic.tablexia.screen.createuser.PanoramaScreen;
 import cz.nic.tablexia.util.ui.AbstractTablexiaSelectBox;
 
@@ -70,8 +72,8 @@ public class UserSelectBox extends AbstractTablexiaSelectBox<UserSelectBox.UserS
         removeCaptureListener(changeListener);
         UserMenuSelectBoxItemGroup selectedUserItem = null;
         List<UserSelectBoxItem> userItems = new ArrayList<UserSelectBoxItem>();
-        for (User user: User.selectActiveUsers()) {
-            UserMenuSelectBoxItemGroup userItem = new UserMenuSelectBoxItemGroup(user, getWidth());
+        for (User user: UserDAO.selectActiveUsers()) {
+            UserMenuSelectBoxItemGroup userItem = new UserMenuSelectBoxItemGroup(new UserMenuItem(user), getWidth());
             userItems.add(userItem);
             if (user.equals(TablexiaSettings.getInstance().getSelectedUser())) {
                 selectedUserItem = userItem;
diff --git a/core/src/cz/nic/tablexia/menu/user/UserMenu.java b/core/src/cz/nic/tablexia/menu/user/UserMenu.java
index e49c2ec5628e285391b453177def6b8b8fc36a95..d6b2c7f54a8041ced55cf038f6d0dda73ba0f4b6 100644
--- a/core/src/cz/nic/tablexia/menu/user/UserMenu.java
+++ b/core/src/cz/nic/tablexia/menu/user/UserMenu.java
@@ -15,8 +15,8 @@ import cz.nic.tablexia.bus.ApplicationBus;
 import cz.nic.tablexia.bus.event.MenuControlEvent;
 import cz.nic.tablexia.loader.application.ApplicationSoundManager;
 import cz.nic.tablexia.menu.AbstractMenu;
-import cz.nic.tablexia.menu.IMenuItem;
-import cz.nic.tablexia.model.User;
+import cz.nic.tablexia.model.UserDAO;
+import cz.nic.tablexia.shared.model.User;
 import cz.nic.tablexia.screen.createuser.PanoramaScreen;
 
 /**
@@ -54,7 +54,8 @@ public class UserMenu extends AbstractMenu {
         container.setFillParent(true);
 
         final float userMenuItemWidth = getBackground().getWidth();
-        for (final IMenuItem menuItem : User.selectActiveUsers()) {
+        for (final User user : UserDAO.selectActiveUsers()) {
+            final UserMenuItem menuItem = new UserMenuItem(user);
             Group userItemGroup = getGroupForMenuItem(menuItem, getWidth());
             userItemGroup.setSize(userMenuItemWidth, USER_ITEM_HEIGHT);
             userItemGroup.addListener(new ClickListener() {
@@ -96,7 +97,7 @@ public class UserMenu extends AbstractMenu {
 //////////////////////////// CREATE USER EVENT HANDLING
 
     @Handler
-    public void handleCreatedUserEvent(User.CreatedUserEvent createdUserEvent) {
+    public void handleCreatedUserEvent(UserDAO.CreatedUserEvent createdUserEvent) {
         initMenuItems();
     }
 }
diff --git a/core/src/cz/nic/tablexia/menu/user/UserMenuItem.java b/core/src/cz/nic/tablexia/menu/user/UserMenuItem.java
new file mode 100644
index 0000000000000000000000000000000000000000..8f2302d17825e76541a9932744c6486a3578a1b7
--- /dev/null
+++ b/core/src/cz/nic/tablexia/menu/user/UserMenuItem.java
@@ -0,0 +1,59 @@
+package cz.nic.tablexia.menu.user;
+
+import com.badlogic.gdx.scenes.scene2d.Group;
+
+import cz.nic.tablexia.TablexiaSettings;
+import cz.nic.tablexia.menu.AbstractMenu;
+import cz.nic.tablexia.menu.IMenuItem;
+import cz.nic.tablexia.shared.model.User;
+
+/**
+ * Created by frantisek on 11.1.16.
+ */
+public class UserMenuItem implements IMenuItem {
+
+    private User user;
+
+    private static final Class<UserMenuSelectBoxItemGroup> USER_ITEM_CLASS = UserMenuSelectBoxItemGroup.class;
+
+
+    public UserMenuItem(User user) {
+        this.user = user;
+    }
+
+    @Override
+    public String getTitle() {
+        return user.getName();
+    }
+
+    @Override
+    public String getDescription() {
+        return null;
+    }
+
+    @Override
+    public String[] getIcons() {
+        // TODO return user avatar
+        return null;
+    }
+
+    @Override
+    public Class<? extends Group> getItemGroupClass() {
+        return USER_ITEM_CLASS;
+    }
+
+    @Override
+    public void performAction() {
+        TablexiaSettings.getInstance().setSelectedUser(this.user);
+    }
+
+    @Override
+    public AbstractMenu.MenuAction getMenuAction() {
+        return AbstractMenu.MenuAction.HIDE;
+    }
+
+    @Override
+    public IMenuItem[] getSubmenu() {
+        return null;
+    }
+}
diff --git a/core/src/cz/nic/tablexia/menu/user/UserMenuSelectBoxItemGroup.java b/core/src/cz/nic/tablexia/menu/user/UserMenuSelectBoxItemGroup.java
index 6eb5957a0eab33dc9e104347e87fef65e2775f5c..860b739ee33c3a2281674b6e3a8212a7dfad4e0f 100644
--- a/core/src/cz/nic/tablexia/menu/user/UserMenuSelectBoxItemGroup.java
+++ b/core/src/cz/nic/tablexia/menu/user/UserMenuSelectBoxItemGroup.java
@@ -11,7 +11,6 @@ import cz.nic.tablexia.loader.application.ApplicationAtlasManager;
 import cz.nic.tablexia.loader.application.ApplicationFontManager;
 import cz.nic.tablexia.menu.IMenuItem;
 import cz.nic.tablexia.menu.main.user.UserSelectBox;
-import cz.nic.tablexia.model.User;
 
 /**
  * Created by Matyáš Latner.
@@ -26,10 +25,10 @@ public class UserMenuSelectBoxItemGroup extends Group implements UserSelectBox.U
     private final NinePatch             background;
     private final BitmapFont            font;
     private final TextureRegionDrawable image;
-    private final User                  user;
+    private final UserMenuItem userMenuItem;
 
     public UserMenuSelectBoxItemGroup(IMenuItem menuItem, float width) {
-        this.user   = (User) menuItem;
+        this.userMenuItem = (UserMenuItem)menuItem;
 
         background  = ApplicationAtlasManager.getInstance().getPatch(ApplicationAtlasManager.USERMENU_MENUITEM_BACKGROUND);
         font        = ApplicationFontManager.getInstance().getFont(TEXT_FONT);
@@ -37,7 +36,7 @@ public class UserMenuSelectBoxItemGroup extends Group implements UserSelectBox.U
     }
 
     public void performAction() {
-        user.performAction();
+        userMenuItem.performAction();
     }
 
     @Override
@@ -52,6 +51,6 @@ public class UserMenuSelectBoxItemGroup extends Group implements UserSelectBox.U
 
         float textPositionX = getX() + imageWidth + TEXT_LEFT_OFFSET;
         float textPositionY = getY() + getHeight() / 2;
-        font.draw(batch, user.getName(), textPositionX, textPositionY + font.getLineHeight() / 3);
+        font.draw(batch, userMenuItem.getTitle(), textPositionX, textPositionY + font.getLineHeight() / 3);
     }
 }
diff --git a/core/src/cz/nic/tablexia/model/User.java b/core/src/cz/nic/tablexia/model/UserDAO.java
similarity index 70%
rename from core/src/cz/nic/tablexia/model/User.java
rename to core/src/cz/nic/tablexia/model/UserDAO.java
index 3f1ca363b3cb4a7d610c1b3220e5315575731b0e..f6c63b847f7f5a83a76557653f066de4be0a85f6 100644
--- a/core/src/cz/nic/tablexia/model/User.java
+++ b/core/src/cz/nic/tablexia/model/UserDAO.java
@@ -1,7 +1,5 @@
 package cz.nic.tablexia.model;
 
-import com.badlogic.gdx.scenes.scene2d.Group;
-
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -10,170 +8,18 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import cz.nic.tablexia.TablexiaSettings;
 import cz.nic.tablexia.TablexiaStorage;
 import cz.nic.tablexia.bus.ApplicationBus;
 import cz.nic.tablexia.game.GameDefinition;
 import cz.nic.tablexia.game.difficulty.GameDifficulty;
-import cz.nic.tablexia.menu.AbstractMenu;
-import cz.nic.tablexia.menu.IMenuItem;
-import cz.nic.tablexia.menu.user.UserMenuSelectBoxItemGroup;
 import cz.nic.tablexia.model.game.Game;
+import cz.nic.tablexia.shared.model.User;
 import cz.nic.tablexia.util.Log;
 
 /**
  * Created by lhoracek, Matyáš Latner
  */
-public class User implements IMenuItem {
-
-    private static final Class<UserMenuSelectBoxItemGroup> USER_ITEM_CLASS = UserMenuSelectBoxItemGroup.class;
-
-    public enum Gender {
-        FEMALE(0),
-        MALE(1);
-
-        private int genderId;
-
-        Gender(int genderId) {
-            this.genderId = genderId;
-        }
-
-        public static Gender getGenderForId(int genderId) {
-            for (Gender gender : Gender.values()) {
-                if (gender.genderId == genderId) {
-                    return gender;
-                }
-            }
-            return null;
-        }
-    }
-
-    private final Long    id;
-    private final String  name;
-    private final String  avatar;
-    private final String  signature;
-    private final int     age;
-    private final Gender  gender;
-    private       boolean deleted;
-    private       boolean help;
-    private       boolean intro;
-
-    //need to be pulic for testing purposes
-    public User(long id, String name, int age, Gender gender, String avatar, String signature, boolean deleted, boolean help, boolean intro) {
-        this.id = id;
-        this.name = name;
-        this.age = age;
-        this.gender = gender;
-        this.signature = signature;
-        this.avatar = avatar;
-        this.deleted = deleted;
-        this.help = help;
-        this.intro = intro;
-    }
-
-    public Long getId() {
-        return id;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public int getAge() {
-        return age;
-    }
-
-    public Gender getGender() {
-        return gender;
-    }
-
-    public boolean isDeleted() {
-        return deleted;
-    }
-
-    public boolean isHelp() {
-        return help;
-    }
-
-    public boolean isIntro() {
-        return intro;
-    }
-
-    public String getAvatar() {
-        return avatar;
-    }
-
-    public String getSignature() {
-        return signature;
-    }
-
-    public void setIntro(boolean intro) {
-        this.intro = intro;
-    }
-
-    public void setHelp(boolean help) {
-        this.help = help;
-    }
-
-    public void setDeleted(boolean deleted) {
-        this.deleted = deleted;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == null) {
-            return false;
-        }
-        if (!(obj instanceof User)) {
-            return false;
-        }
-        return ((User) obj).getId().equals(getId());
-    }
-
-    @Override
-    public String toString() {
-        return "USER[id: " + id + ", name: " + name + ", age: " + age + ", gen: " + gender.name() + ", del: " + deleted + ", help: " + help + ", intro: " + intro + "]";
-    }
-
-
-//////////////////////////// USER MENU ITEM
-
-    @Override
-    public String getTitle() {
-        return getName();
-    }
-
-    @Override
-    public String getDescription() {
-        return null;
-    }
-
-    @Override
-    public String[] getIcons() {
-        // TODO return user avatar
-        return null;
-    }
-
-    @Override
-    public Class<? extends Group> getItemGroupClass() {
-        return USER_ITEM_CLASS;
-    }
-
-    @Override
-    public void performAction() {
-        TablexiaSettings.getInstance().setSelectedUser(this);
-    }
-
-    @Override
-    public AbstractMenu.MenuAction getMenuAction() {
-        return AbstractMenu.MenuAction.HIDE;
-    }
-
-    @Override
-    public IMenuItem[] getSubmenu() {
-        return null;
-    }
-
+public class UserDAO {
 
 //////////////////////////// DB ACCESS
 
@@ -195,7 +41,7 @@ public class User implements IMenuItem {
                     long id = resultSet.getLong(1);
                     String name = resultSet.getString(2);
                     int age = resultSet.getInt(3);
-                    Gender gender = Gender.getGenderForId(resultSet.getInt(4));
+                    User.Gender gender = User.Gender.getGenderForId(resultSet.getInt(4));
                     String avatar = resultSet.getString(5);
                     String signature = resultSet.getString(6);
                     boolean deleted = resultSet.getInt(7) != 0;
@@ -214,13 +60,13 @@ public class User implements IMenuItem {
         return users;
     }
 
-    public static User createUser(String name, int age, Gender gender, String avatar, String signature) {
+    public static User createUser(String name, int age, User.Gender gender, String avatar, String signature) {
         User user = null;
         try {
             PreparedStatement insertStatement = TablexiaStorage.getInstance().prepareStatement(INSERT_USER);
             insertStatement.setString(1, name);
             insertStatement.setInt(2, age);
-            insertStatement.setInt(3, gender.genderId);
+            insertStatement.setInt(3, gender.getGenderId());
             insertStatement.setString(4, avatar);
             insertStatement.setString(5, signature);
             insertStatement.executeUpdate();
@@ -262,7 +108,7 @@ public class User implements IMenuItem {
                 if (resultSet.next()) {
                     String name = resultSet.getString(2);
                     int age = resultSet.getInt(3);
-                    Gender gender = Gender.getGenderForId(resultSet.getInt(4));
+                    User.Gender gender = User.Gender.getGenderForId(resultSet.getInt(4));
                     String avatar = resultSet.getString(5);
                     String signature = resultSet.getString(6);
                     boolean deleted = resultSet.getInt(7) != 0;
@@ -292,7 +138,7 @@ public class User implements IMenuItem {
                     Long id = resultSet.getLong(1);
                     String name = resultSet.getString(2);
                     int age = resultSet.getInt(3);
-                    Gender gender = Gender.getGenderForId(resultSet.getInt(4));
+                    User.Gender gender = User.Gender.getGenderForId(resultSet.getInt(4));
                     String avatar = resultSet.getString(5);
                     String signature = resultSet.getString(6);
                     boolean deleted = resultSet.getInt(7) != 0;
@@ -312,8 +158,8 @@ public class User implements IMenuItem {
         return selectedUser;
     }
 
-    public boolean isTutorialForGameDefinition(GameDefinition gameDefinition) {
-        return Game.getNumberOfCompleteGamesForGameDefinitionAndDifficulty(gameDefinition, GameDifficulty.TUTORIAL, this) < 1;
+    public static boolean isTutorialForGameDefinition(GameDefinition gameDefinition, User user) {
+        return Game.getNumberOfCompleteGamesForGameDefinitionAndDifficulty(gameDefinition, GameDifficulty.TUTORIAL, user) < 1;
     }
 
     public static boolean userNameExists(String name) {
diff --git a/core/src/cz/nic/tablexia/model/game/Game.java b/core/src/cz/nic/tablexia/model/game/Game.java
index b637450e15ab02a562efecbd729e12a9ac79f717..f611167020cd9a022ed218afac48b41acfcbe075 100644
--- a/core/src/cz/nic/tablexia/model/game/Game.java
+++ b/core/src/cz/nic/tablexia/model/game/Game.java
@@ -17,7 +17,8 @@ import cz.nic.tablexia.game.AbstractTablexiaGame;
 import cz.nic.tablexia.game.GameDefinition;
 import cz.nic.tablexia.game.common.TablexiaRandom;
 import cz.nic.tablexia.game.difficulty.GameDifficulty;
-import cz.nic.tablexia.model.User;
+import cz.nic.tablexia.model.UserDAO;
+import cz.nic.tablexia.shared.model.User;
 import cz.nic.tablexia.util.Log;
 
 /**
@@ -244,7 +245,7 @@ public class Game {
                     String startTimeStr = resultSet.getString(6);
                     String endTimeStr = resultSet.getString(7);
                     selectedGame = new Game(resultSet.getLong(1),
-                            User.selectUser(resultSet.getLong(2)),
+                            UserDAO.selectUser(resultSet.getLong(2)),
                             GameDifficulty.getGameDifficultyForDifficultyNumber(resultSet.getInt(3)),
                             GameDefinition.getGameDefinitionForGameNumber(resultSet.getInt(4)),
                             new TablexiaRandom(resultSet.getLong(5)),
@@ -283,7 +284,7 @@ public class Game {
                         String startTimeStr = resultSet.getString(6);
                         String endTimeStr = resultSet.getString(7);
                         game = new Game(resultSet.getLong(1),
-                                User.selectUser(resultSet.getLong(2)),
+                                UserDAO.selectUser(resultSet.getLong(2)),
                                 GameDifficulty.getGameDifficultyForDifficultyNumber(resultSet.getInt(3)),
                                 GameDefinition.getGameDefinitionForGameNumber(resultSet.getInt(4)),
                                 new TablexiaRandom(resultSet.getLong(5)),
diff --git a/core/src/cz/nic/tablexia/model/game/GamePause.java b/core/src/cz/nic/tablexia/model/game/GamePause.java
index 7c092bc03d517c1a5224996b715d4694fcecda68..363ec3ec77ef51d14cbc5841051775615abb665f 100644
--- a/core/src/cz/nic/tablexia/model/game/GamePause.java
+++ b/core/src/cz/nic/tablexia/model/game/GamePause.java
@@ -7,7 +7,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import cz.nic.tablexia.TablexiaStorage;
-import cz.nic.tablexia.model.User;
+import cz.nic.tablexia.shared.model.User;
 import cz.nic.tablexia.util.Log;
 
 /**
diff --git a/core/src/cz/nic/tablexia/model/game/GameTrophy.java b/core/src/cz/nic/tablexia/model/game/GameTrophy.java
index c01f6700976af31a77ecbb4e89ded79b3a460834..51eb22e48d417aa755e7443d85d530bf7453aa9a 100644
--- a/core/src/cz/nic/tablexia/model/game/GameTrophy.java
+++ b/core/src/cz/nic/tablexia/model/game/GameTrophy.java
@@ -12,7 +12,8 @@ import cz.nic.tablexia.game.GameDefinition;
 import cz.nic.tablexia.game.common.TablexiaRandom;
 import cz.nic.tablexia.game.difficulty.GameDifficulty;
 import cz.nic.tablexia.game.trophy.GameTrophyDefinition;
-import cz.nic.tablexia.model.User;
+import cz.nic.tablexia.model.UserDAO;
+import cz.nic.tablexia.shared.model.User;
 import cz.nic.tablexia.util.Log;
 
 /**
@@ -73,7 +74,7 @@ public class GameTrophy {
                         String startTimeStr = resultSet.getString(6);
                         String endTimeStr = resultSet.getString(7);
                         games.add(new Game(resultSet.getLong(1),
-                                User.selectUser(resultSet.getLong(2)),
+                                UserDAO.selectUser(resultSet.getLong(2)),
                                 GameDifficulty.getGameDifficultyForDifficultyNumber(resultSet.getInt(3)),
                                 GameDefinition.getGameDefinitionForGameNumber(resultSet.getInt(4)),
                                 new TablexiaRandom(resultSet.getLong(5)),
diff --git a/core/src/cz/nic/tablexia/model/game/UserTrophy.java b/core/src/cz/nic/tablexia/model/game/UserTrophy.java
index 12b7facddcfac5cf11131420ce5fa91425d6d3a1..4012e47b8d56741643c73213ebe248c4cb1c0471 100644
--- a/core/src/cz/nic/tablexia/model/game/UserTrophy.java
+++ b/core/src/cz/nic/tablexia/model/game/UserTrophy.java
@@ -21,7 +21,8 @@ import cz.nic.tablexia.game.GameDefinition;
 import cz.nic.tablexia.game.common.TablexiaRandom;
 import cz.nic.tablexia.game.difficulty.GameDifficulty;
 import cz.nic.tablexia.game.trophy.UserTrophyDefinition;
-import cz.nic.tablexia.model.User;
+import cz.nic.tablexia.model.UserDAO;
+import cz.nic.tablexia.shared.model.User;
 import cz.nic.tablexia.util.Log;
 
 /**
@@ -166,7 +167,7 @@ public class UserTrophy {
                         String startTimeStr = resultSet.getString(6);
                         String endTimeStr = resultSet.getString(7);
                         games.add(new Game(resultSet.getLong(1),
-                                User.selectUser(resultSet.getLong(2)),
+                                UserDAO.selectUser(resultSet.getLong(2)),
                                 GameDifficulty.getGameDifficultyForDifficultyNumber(resultSet.getInt(3)),
                                 GameDefinition.getGameDefinitionForGameNumber(resultSet.getInt(4)),
                                 new TablexiaRandom(resultSet.getLong(5)),
diff --git a/core/src/cz/nic/tablexia/screen/AbstractTablexiaScreen.java b/core/src/cz/nic/tablexia/screen/AbstractTablexiaScreen.java
index ef220cacafb53a768b775988918a70ca428d8f16..34a0cceb13d3cac726afb5f3e2b45c09cca7c326 100644
--- a/core/src/cz/nic/tablexia/screen/AbstractTablexiaScreen.java
+++ b/core/src/cz/nic/tablexia/screen/AbstractTablexiaScreen.java
@@ -42,7 +42,7 @@ import cz.nic.tablexia.loader.TablexiaDataManager;
 import cz.nic.tablexia.loader.TablexiaSoundManager;
 import cz.nic.tablexia.loader.application.ApplicationAtlasManager;
 import cz.nic.tablexia.loader.application.ApplicationFontManager;
-import cz.nic.tablexia.model.User;
+import cz.nic.tablexia.shared.model.User;
 import cz.nic.tablexia.util.Log;
 import cz.nic.tablexia.util.ScaleUtil;
 import cz.nic.tablexia.util.Utility;
diff --git a/core/src/cz/nic/tablexia/screen/createuser/FormScreen.java b/core/src/cz/nic/tablexia/screen/createuser/FormScreen.java
index 5c18056b894091c5cfd265c14e011776ded15a13..fbbd10ff4fcde1b19be524aed62791800db095bb 100644
--- a/core/src/cz/nic/tablexia/screen/createuser/FormScreen.java
+++ b/core/src/cz/nic/tablexia/screen/createuser/FormScreen.java
@@ -40,7 +40,8 @@ import cz.nic.tablexia.TablexiaSettings;
 import cz.nic.tablexia.bus.ApplicationBus;
 import cz.nic.tablexia.loader.application.ApplicationAtlasManager;
 import cz.nic.tablexia.loader.application.ApplicationFontManager;
-import cz.nic.tablexia.model.User;
+import cz.nic.tablexia.model.UserDAO;
+import cz.nic.tablexia.shared.model.User;
 import cz.nic.tablexia.screen.AbstractTablexiaScreen;
 import cz.nic.tablexia.screen.createuser.form.FormActorsLayout;
 import cz.nic.tablexia.screen.createuser.form.SignatureDialog;
@@ -303,7 +304,7 @@ public class FormScreen extends AbstractTablexiaScreen<Void> {
                     clearValidations();
                     validations.put(VALIDATION_STAMP, true);
                     stampIt();
-                    User user = User.createUser(nameField.getText(), FormScreen.this.age, FormScreen.this.gender, mugshot, signature);
+                    User user = UserDAO.createUser(nameField.getText(), FormScreen.this.age, FormScreen.this.gender, mugshot, signature);
                     TablexiaSettings.getInstance().setSelectedUser(user);
                     ApplicationBus.getInstance().post(new Tablexia.ChangeScreenEvent(TablexiaSettings.INITIAL_SCREEN, TablexiaApplication.ScreenTransaction.FADE)).asynchronously();
                 }
@@ -348,7 +349,7 @@ public class FormScreen extends AbstractTablexiaScreen<Void> {
             return false;
         }
 
-        if (User.userNameExists(nameField.getText())) {
+        if (UserDAO.userNameExists(nameField.getText())) {
             displayHintDialog(VALIDATION_USERNAME_EXISTS, nameField);
             return false;
         }
diff --git a/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java b/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java
index 137356cef867c6c8a2bd67c635e51a7190ea7279..231e231737cd310d9c8ce1f81f4b1bec57fbe436 100644
--- a/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java
+++ b/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java
@@ -16,7 +16,7 @@ import java.util.Map;
 import cz.nic.tablexia.bus.ApplicationBus;
 import cz.nic.tablexia.game.GameDefinition;
 import cz.nic.tablexia.menu.game.GameMenuDefinition;
-import cz.nic.tablexia.model.User;
+import cz.nic.tablexia.model.UserDAO;
 import cz.nic.tablexia.screen.AbstractTablexiaScreen;
 import cz.nic.tablexia.screen.gamemenu.actions.ScrollHomeAction;
 import cz.nic.tablexia.screen.gamemenu.event.ShowGameMenuPageEvent;
@@ -150,7 +150,7 @@ public class GameMenuScreen extends AbstractTablexiaScreen<int[][]> {
                 public void run() {
                     pagedScrollPane.setTouchable(Touchable.enabled);
                     getSelectedUser().setIntro(false);
-                    User.updateUser(getSelectedUser());
+                    UserDAO.updateUser(getSelectedUser());
                 }
             })));
         }
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 29fe873dd8d4a3a4fac4f959f199c91910d852b7..f9409add8f7868f60d8b179cf56a61d512ae5838 100644
--- a/core/src/cz/nic/tablexia/screen/gamemenu/pages/OfficeMenuPage.java
+++ b/core/src/cz/nic/tablexia/screen/gamemenu/pages/OfficeMenuPage.java
@@ -17,7 +17,8 @@ import cz.nic.tablexia.TablexiaApplication;
 import cz.nic.tablexia.TablexiaSettings;
 import cz.nic.tablexia.bus.ApplicationBus;
 import cz.nic.tablexia.loader.application.ApplicationAtlasManager;
-import cz.nic.tablexia.model.User;
+import cz.nic.tablexia.model.UserDAO;
+import cz.nic.tablexia.shared.model.User;
 import cz.nic.tablexia.screen.AbstractTablexiaScreen;
 import cz.nic.tablexia.screen.encyclopedia.EncyclopediaScreen;
 import cz.nic.tablexia.screen.gamemenu.GameMenuAssets;
@@ -109,7 +110,7 @@ public class OfficeMenuPage extends MenuPage {
         //Have user seen the help overlay ?
         if(TablexiaSettings.getInstance().getSelectedUser().isHelp()) {
             TablexiaSettings.getInstance().getSelectedUser().setHelp(false);
-            User.updateUser(TablexiaSettings.getInstance().getSelectedUser());
+            UserDAO.updateUser(TablexiaSettings.getInstance().getSelectedUser());
             toggleHelpOverlay();
         }
 
diff --git a/core/src/cz/nic/tablexia/screen/profile/ProfileScreen.java b/core/src/cz/nic/tablexia/screen/profile/ProfileScreen.java
index a582cfff99cb99d65a99f90ee823f440fc771f79..540b439b392680eb7c6f47404bc1563fd1e29c1e 100644
--- a/core/src/cz/nic/tablexia/screen/profile/ProfileScreen.java
+++ b/core/src/cz/nic/tablexia/screen/profile/ProfileScreen.java
@@ -12,7 +12,7 @@ import cz.nic.tablexia.Tablexia;
 import cz.nic.tablexia.TablexiaApplication;
 import cz.nic.tablexia.TablexiaSettings;
 import cz.nic.tablexia.bus.ApplicationBus;
-import cz.nic.tablexia.model.User;
+import cz.nic.tablexia.shared.model.User;
 import cz.nic.tablexia.screen.createuser.FormScreen;
 import cz.nic.tablexia.util.ui.ClickListenerWithSound;
 
diff --git a/core/src/cz/nic/tablexia/shared b/core/src/cz/nic/tablexia/shared
new file mode 160000
index 0000000000000000000000000000000000000000..965e91fb41c73b291946f5c105f8fdcadff912f8
--- /dev/null
+++ b/core/src/cz/nic/tablexia/shared
@@ -0,0 +1 @@
+Subproject commit 965e91fb41c73b291946f5c105f8fdcadff912f8