diff --git a/CheckersClient/.idea/caches/build_file_checksums.ser b/CheckersClient/.idea/caches/build_file_checksums.ser
index 81028eea2fc848506c97c5c1f3b1c93cf4c1c788..13675fdaaed4926c89b045bb8c396fb86f523650 100644
Binary files a/CheckersClient/.idea/caches/build_file_checksums.ser and b/CheckersClient/.idea/caches/build_file_checksums.ser differ
diff --git a/CheckersClient/android/assets/Loading/LoadingBarBackground.png b/CheckersClient/android/assets/Loading/LoadingBarBackground.png
new file mode 100644
index 0000000000000000000000000000000000000000..5128e41cf63ae4f7d2432993ccb11f4dd96e34c6
Binary files /dev/null and b/CheckersClient/android/assets/Loading/LoadingBarBackground.png differ
diff --git a/CheckersClient/android/assets/Loading/LoadingBarBorder.png b/CheckersClient/android/assets/Loading/LoadingBarBorder.png
new file mode 100644
index 0000000000000000000000000000000000000000..7da6d2851e8b4b11e3026df1417c1cedcf1c1fa2
Binary files /dev/null and b/CheckersClient/android/assets/Loading/LoadingBarBorder.png differ
diff --git a/CheckersClient/android/assets/Loading/LoadingBarFill.png b/CheckersClient/android/assets/Loading/LoadingBarFill.png
new file mode 100644
index 0000000000000000000000000000000000000000..a62a4be48ca8fdf71b70ea42ce2452a942628dfb
Binary files /dev/null and b/CheckersClient/android/assets/Loading/LoadingBarFill.png differ
diff --git a/CheckersClient/android/assets/Loading/LoadingDot.png b/CheckersClient/android/assets/Loading/LoadingDot.png
new file mode 100644
index 0000000000000000000000000000000000000000..43e0eb9fe132cdef62f6acd96ae08b1fd619b249
Binary files /dev/null and b/CheckersClient/android/assets/Loading/LoadingDot.png differ
diff --git a/CheckersClient/android/assets/Loading/LoadingText.png b/CheckersClient/android/assets/Loading/LoadingText.png
new file mode 100644
index 0000000000000000000000000000000000000000..3327f9ee7a66412f3e2e14badba2284ec74fa6c9
Binary files /dev/null and b/CheckersClient/android/assets/Loading/LoadingText.png differ
diff --git a/CheckersClient/android/assets/Menu/1x/ConnectionBar.png b/CheckersClient/android/assets/Menu/1x/ConnectionBar.png
new file mode 100644
index 0000000000000000000000000000000000000000..99923e288792146810e0f085778c452d813bd8af
Binary files /dev/null and b/CheckersClient/android/assets/Menu/1x/ConnectionBar.png differ
diff --git a/CheckersClient/android/assets/Menu/1x/GreenCircleSmall.png b/CheckersClient/android/assets/Menu/1x/GreenCircleSmall.png
new file mode 100644
index 0000000000000000000000000000000000000000..d87d4975b87432cc4b8c6ecea587ab8f0d231755
Binary files /dev/null and b/CheckersClient/android/assets/Menu/1x/GreenCircleSmall.png differ
diff --git a/CheckersClient/android/assets/Menu/1x/MainMenuForm.png b/CheckersClient/android/assets/Menu/1x/MainMenuForm.png
index 795f9abecd1f2d70eb99328dc3436b8fc89c54aa..fa2fd0625e2059a7110678fbd4975f68f2c3d20b 100644
Binary files a/CheckersClient/android/assets/Menu/1x/MainMenuForm.png and b/CheckersClient/android/assets/Menu/1x/MainMenuForm.png differ
diff --git a/CheckersClient/android/assets/Menu/1x/RedCircleSmall.png b/CheckersClient/android/assets/Menu/1x/RedCircleSmall.png
new file mode 100644
index 0000000000000000000000000000000000000000..ee77e4b35c5408d48caf1e5bbe9b763adc1f5785
Binary files /dev/null and b/CheckersClient/android/assets/Menu/1x/RedCircleSmall.png differ
diff --git a/CheckersClient/android/assets/Menu/1x/SpaceCheckersLogo.png b/CheckersClient/android/assets/Menu/1x/SpaceCheckersLogo.png
new file mode 100644
index 0000000000000000000000000000000000000000..8d3ed55d3f843c6c381317e59784ec31c7dd7371
Binary files /dev/null and b/CheckersClient/android/assets/Menu/1x/SpaceCheckersLogo.png differ
diff --git a/CheckersClient/android/assets/Menu/1x/flipButton.png b/CheckersClient/android/assets/Menu/1x/flipButton.png
new file mode 100644
index 0000000000000000000000000000000000000000..11d2f62806263409f481bd6474f278d85c2f42a0
Binary files /dev/null and b/CheckersClient/android/assets/Menu/1x/flipButton.png differ
diff --git a/CheckersClient/android/assets/Menu/Click11.wav.asd b/CheckersClient/android/assets/Menu/Click11.wav.asd
new file mode 100644
index 0000000000000000000000000000000000000000..bf1f98b27e67a96ebba6a054e49ec6db5ba82a58
Binary files /dev/null and b/CheckersClient/android/assets/Menu/Click11.wav.asd differ
diff --git a/CheckersClient/android/assets/Menu/MenuLoop.mp3.asd b/CheckersClient/android/assets/Menu/MenuLoop.mp3.asd
new file mode 100644
index 0000000000000000000000000000000000000000..affd8edeb9392f173dcaa97bb57f733610c90e8f
Binary files /dev/null and b/CheckersClient/android/assets/Menu/MenuLoop.mp3.asd differ
diff --git a/CheckersClient/android/assets/Pause/PauseBackground.png b/CheckersClient/android/assets/Pause/PauseBackground.png
deleted file mode 100644
index 197fa67442edb07b049d2b334b6c977541036aa0..0000000000000000000000000000000000000000
Binary files a/CheckersClient/android/assets/Pause/PauseBackground.png and /dev/null differ
diff --git a/CheckersClient/android/assets/Pause/PauseButton.png b/CheckersClient/android/assets/Pause/PauseButton.png
deleted file mode 100644
index 42c154ceb5125b00599c90e44e1b228d7e50cae5..0000000000000000000000000000000000000000
Binary files a/CheckersClient/android/assets/Pause/PauseButton.png and /dev/null differ
diff --git a/CheckersClient/android/assets/UISkins/glassy/skin/glassy-ui.json b/CheckersClient/android/assets/UISkins/glassy/skin/glassy-ui.json
index 2eaad5f5e125bf3f1261282a500a514a3676e4c4..91c0c1d90fc85877454aedeae03b6ae812bc7830 100644
--- a/CheckersClient/android/assets/UISkins/glassy/skin/glassy-ui.json
+++ b/CheckersClient/android/assets/UISkins/glassy/skin/glassy-ui.json
@@ -111,7 +111,7 @@ com.badlogic.gdx.scenes.scene2d.ui.List$ListStyle: {
 		background: list
 	}
 	plain: {
-		font: font
+		font: font-big
 		fontColorSelected: white
 		fontColorUnselected: dark-cyan
 		selection: pale-blue
@@ -183,7 +183,7 @@ com.badlogic.gdx.scenes.scene2d.ui.TextButton$TextButtonStyle: {
 }
 com.badlogic.gdx.scenes.scene2d.ui.TextField$TextFieldStyle: {
 	default: {
-		font: font
+		font: font-big
 		fontColor: black
 		background: textfield
 		cursor: black
@@ -210,4 +210,4 @@ com.badlogic.gdx.scenes.scene2d.ui.Window$WindowStyle: {
 		titleFontColor: black
 	}
 }
-}
\ No newline at end of file
+}
diff --git a/CheckersClient/android/assets/characters/AsianGirl1@1x.png b/CheckersClient/android/assets/characters/AsianGirl1@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..9207f25f0067db0cd8b0d9f7546a585682eeabfa
Binary files /dev/null and b/CheckersClient/android/assets/characters/AsianGirl1@1x.png differ
diff --git a/CheckersClient/android/assets/characters/AsianGirl2@1x.png b/CheckersClient/android/assets/characters/AsianGirl2@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..f946f74ff365a73570e41a3686b2013cb84b9491
Binary files /dev/null and b/CheckersClient/android/assets/characters/AsianGirl2@1x.png differ
diff --git a/CheckersClient/android/assets/characters/AsianGirl3@1x.png b/CheckersClient/android/assets/characters/AsianGirl3@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..cd4d6415be2bbb29a9c896ef4f748703526f6ff3
Binary files /dev/null and b/CheckersClient/android/assets/characters/AsianGirl3@1x.png differ
diff --git a/CheckersClient/android/assets/characters/AsianGirlPortrait@1x.png b/CheckersClient/android/assets/characters/AsianGirlPortrait@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..f138ad58031933fb192c74abee8c81cf6acaf53d
Binary files /dev/null and b/CheckersClient/android/assets/characters/AsianGirlPortrait@1x.png differ
diff --git a/CheckersClient/android/assets/characters/Grandma1@1x.png b/CheckersClient/android/assets/characters/Grandma1@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..8184f9e78b481da0907fba6e2262b65e6846add9
Binary files /dev/null and b/CheckersClient/android/assets/characters/Grandma1@1x.png differ
diff --git a/CheckersClient/android/assets/characters/Grandma2@1x.png b/CheckersClient/android/assets/characters/Grandma2@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..ae0e623fe877a26cc74a1d02815eaae524cb61c9
Binary files /dev/null and b/CheckersClient/android/assets/characters/Grandma2@1x.png differ
diff --git a/CheckersClient/android/assets/characters/Grandma3@1x.png b/CheckersClient/android/assets/characters/Grandma3@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..ebf9759a7045d1b5802cb6bb51902ed47e1cc8c6
Binary files /dev/null and b/CheckersClient/android/assets/characters/Grandma3@1x.png differ
diff --git a/CheckersClient/android/assets/characters/GrandmaPortrait@1x.png b/CheckersClient/android/assets/characters/GrandmaPortrait@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..eb923bf8eeb718e32bb962687e3ec5fbc0e88d39
Binary files /dev/null and b/CheckersClient/android/assets/characters/GrandmaPortrait@1x.png differ
diff --git a/CheckersClient/android/assets/characters/HighSchoolGuy1@1x.png b/CheckersClient/android/assets/characters/HighSchoolGuy1@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..f80b3dbbc2daa0dc8d5aac09e6e4c6fc976b524d
Binary files /dev/null and b/CheckersClient/android/assets/characters/HighSchoolGuy1@1x.png differ
diff --git a/CheckersClient/android/assets/characters/HighSchoolGuy2@1x.png b/CheckersClient/android/assets/characters/HighSchoolGuy2@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..7ad6e0646cf20dd067e1516caa6198dbebbac895
Binary files /dev/null and b/CheckersClient/android/assets/characters/HighSchoolGuy2@1x.png differ
diff --git a/CheckersClient/android/assets/characters/HighSchoolGuy3@1x.png b/CheckersClient/android/assets/characters/HighSchoolGuy3@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..ead8ebdbc6a508b7489064390a122a3d7cc127f5
Binary files /dev/null and b/CheckersClient/android/assets/characters/HighSchoolGuy3@1x.png differ
diff --git a/CheckersClient/android/assets/characters/HighSchoolGuyPortrait@1x.png b/CheckersClient/android/assets/characters/HighSchoolGuyPortrait@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..a07477ed3ce86273e5ab690fddd337619a3ce5dc
Binary files /dev/null and b/CheckersClient/android/assets/characters/HighSchoolGuyPortrait@1x.png differ
diff --git a/CheckersClient/android/assets/characters/HipsterGirl1@1x.png b/CheckersClient/android/assets/characters/HipsterGirl1@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..1cd2a9579d3302499abe202e5e7b23aa0792db59
Binary files /dev/null and b/CheckersClient/android/assets/characters/HipsterGirl1@1x.png differ
diff --git a/CheckersClient/android/assets/characters/HipsterGirl2@1x.png b/CheckersClient/android/assets/characters/HipsterGirl2@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..888706fd549bc08ae191ddd112526381abc26b48
Binary files /dev/null and b/CheckersClient/android/assets/characters/HipsterGirl2@1x.png differ
diff --git a/CheckersClient/android/assets/characters/HipsterGirl3@1x.png b/CheckersClient/android/assets/characters/HipsterGirl3@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..14441d5e98ac5588a0576a9307a6b41b2f080ce1
Binary files /dev/null and b/CheckersClient/android/assets/characters/HipsterGirl3@1x.png differ
diff --git a/CheckersClient/android/assets/characters/HipsterGirlPortrait@1x.png b/CheckersClient/android/assets/characters/HipsterGirlPortrait@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..dd6062657c9589c5ccfdf0051d2f72993a368d30
Binary files /dev/null and b/CheckersClient/android/assets/characters/HipsterGirlPortrait@1x.png differ
diff --git a/CheckersClient/android/assets/characters/RegularGuy1@1x.png b/CheckersClient/android/assets/characters/RegularGuy1@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..b736ba2e352862d74c4fed640a0444c1369e69e3
Binary files /dev/null and b/CheckersClient/android/assets/characters/RegularGuy1@1x.png differ
diff --git a/CheckersClient/android/assets/characters/RegularGuy2@1x.png b/CheckersClient/android/assets/characters/RegularGuy2@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..f87dea69fd985da55a60493e5d24808520960bf4
Binary files /dev/null and b/CheckersClient/android/assets/characters/RegularGuy2@1x.png differ
diff --git a/CheckersClient/android/assets/characters/RegularGuy3@1x.png b/CheckersClient/android/assets/characters/RegularGuy3@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f00a24030b5f9e6226e9b0e5f064e89bc89f27d
Binary files /dev/null and b/CheckersClient/android/assets/characters/RegularGuy3@1x.png differ
diff --git a/CheckersClient/android/assets/characters/RegularGuyPortrait@1x.png b/CheckersClient/android/assets/characters/RegularGuyPortrait@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..81566ea5eb9977cd5b74c2ff69521e496e9cb0aa
Binary files /dev/null and b/CheckersClient/android/assets/characters/RegularGuyPortrait@1x.png differ
diff --git a/CheckersClient/android/assets/characters/RocketGuy1@1x.png b/CheckersClient/android/assets/characters/RocketGuy1@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..53d5f2cb7c8ca10f1998ae568367b128b0e9ff00
Binary files /dev/null and b/CheckersClient/android/assets/characters/RocketGuy1@1x.png differ
diff --git a/CheckersClient/android/assets/characters/RocketGuy2@1x.png b/CheckersClient/android/assets/characters/RocketGuy2@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..5bbd38171337784452613a1aafe8d5a64d67071b
Binary files /dev/null and b/CheckersClient/android/assets/characters/RocketGuy2@1x.png differ
diff --git a/CheckersClient/android/assets/characters/RocketGuy3@1x.png b/CheckersClient/android/assets/characters/RocketGuy3@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..4606ea58abb7f0c5349e3b295b5cfaf9531ca056
Binary files /dev/null and b/CheckersClient/android/assets/characters/RocketGuy3@1x.png differ
diff --git a/CheckersClient/android/assets/characters/RocketGuyPortrait@1x.png b/CheckersClient/android/assets/characters/RocketGuyPortrait@1x.png
new file mode 100644
index 0000000000000000000000000000000000000000..8ede5685a057250e49ba5708eab0d71d67f87424
Binary files /dev/null and b/CheckersClient/android/assets/characters/RocketGuyPortrait@1x.png differ
diff --git a/CheckersClient/core/src/com/mygdx/game/UniCheckersClient.java b/CheckersClient/core/src/com/mygdx/game/UniCheckersClient.java
index 8c468e05f46ebd60fdb0f08512087b28307dffd1..ee5065b4828f3b9dea012ad197d337e91c0aadbf 100644
--- a/CheckersClient/core/src/com/mygdx/game/UniCheckersClient.java
+++ b/CheckersClient/core/src/com/mygdx/game/UniCheckersClient.java
@@ -3,6 +3,7 @@ package com.mygdx.game;
 import com.badlogic.gdx.ApplicationAdapter;
 import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.assets.AssetManager;
+import com.badlogic.gdx.assets.loaders.resolvers.InternalFileHandleResolver;
 import com.badlogic.gdx.graphics.GL20;
 import com.badlogic.gdx.graphics.g2d.SpriteBatch;
 import com.badlogic.gdx.scenes.scene2d.Stage;
@@ -12,7 +13,7 @@ import com.badlogic.gdx.utils.viewport.Viewport;
 import com.mygdx.game.controllers.NetworkController;
 import com.mygdx.game.controllers.PlayerController;
 import com.mygdx.game.views.GameViewManager;
-import com.mygdx.game.views.MenuLoadingView;
+import com.mygdx.game.views.LoadingView;
 
 import java.util.ArrayList;
 
@@ -50,11 +51,11 @@ public class UniCheckersClient extends ApplicationAdapter {
 
 		// Initialize Views..
 		sb = new SpriteBatch();
-		assetManager = new AssetManager();
+		assetManager = new AssetManager(new InternalFileHandleResolver());
 
 		skin = new Skin(Gdx.files.internal("UISkins/glassy/skin/glassy-ui.json"));
 		gvm = new GameViewManager();
-		gvm.push(new MenuLoadingView(gvm, playerController, assetManager, stage, skin));
+		gvm.push(new LoadingView(gvm, playerController, assetManager, stage, skin));
 
 	}
 
diff --git a/CheckersClient/core/src/com/mygdx/game/controllers/NetworkController.java b/CheckersClient/core/src/com/mygdx/game/controllers/NetworkController.java
index d0d256f416d766962c45c77396c77684f36bd198..f4fe5fb9c59255974403211fb95f1e7d6c9ebc33 100644
--- a/CheckersClient/core/src/com/mygdx/game/controllers/NetworkController.java
+++ b/CheckersClient/core/src/com/mygdx/game/controllers/NetworkController.java
@@ -9,6 +9,7 @@ import com.mygdx.game.controllers.commands.Command;
 import com.mygdx.game.controllers.commands.*;
 import com.mygdx.game.model.Lobby;
 import com.mygdx.game.model.Player;
+import com.mygdx.game.views.tokens.PlayerAvatar;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -19,13 +20,14 @@ public class NetworkController {
     private Kryo kryo;
     private Queue<Command> commandQueue;
 
-    private boolean devMode = true;
+    private boolean devMode = false;
 
     public NetworkController(){
         this.client = new Client();
         client.start();
         try {
-            String IP4_LAN_ADDRESS = "192.168.87.20";
+            //192.168.87.34
+            String IP4_LAN_ADDRESS = "192.168.87.34";
             client.connect(10000, IP4_LAN_ADDRESS, 54555, 54777);
         } catch (IOException e) {
             e.printStackTrace();
@@ -56,6 +58,7 @@ public class NetworkController {
         kryo.register(cLobbyLeave.class, 22);
         kryo.register(cLobbyDelete.class, 23);
         kryo.register(cLobbyGetList.class, 24);
+        kryo.register(cSetIndexAvatar.class, 25);
     }
 
     public Client getClient() { return client; }
diff --git a/CheckersClient/core/src/com/mygdx/game/controllers/PlayerController.java b/CheckersClient/core/src/com/mygdx/game/controllers/PlayerController.java
index b583aee91f43ac58278a1522a2f08ffc9da9cc9a..dd16a30c3a85bd125a0e77fa30e7da4588da21ca 100644
--- a/CheckersClient/core/src/com/mygdx/game/controllers/PlayerController.java
+++ b/CheckersClient/core/src/com/mygdx/game/controllers/PlayerController.java
@@ -15,9 +15,6 @@ public class PlayerController {
     private Lobby lobby;                 //Current lobby
     private ArrayList<Lobby> lobbies;    //List of all lobbies
 
-
-    private String playerName; // NB..! THIS IS TEMPORARY.. SHOULD BE IN MODEL..
-
     public PlayerController(NetworkController networkController){
         net = networkController;
 
@@ -30,36 +27,23 @@ public class PlayerController {
                 }
             }
         });
-
-        net.sendToServer(new cPlayerJoin());
+        connectPlayer(0);
     }
 
 
-    public void issueACommand(String commandString) {
-        if (commandString.equals("W")){
-            cPlayerPieceMove newCommand = new cPlayerPieceMove();
-            net.sendToServer(newCommand);
-        }
-    }
+    public void lobbyGetList(){ net.sendToServer(new cLobbyGetList()); }
 
-    // This could be a command invoked on the controller that changes PlayerState in the model. (Bit hard since model isn't written yet..)
-    public void setPlayerName(String playerName){
-        this.playerName = playerName;
-        System.out.println("Updating playername.. Name is " + playerName);
-        // UpdatePlayerName code
-    }
+    public void connectPlayer(int avatarIndex){ net.sendToServer(new cPlayerJoin(avatarIndex));}
 
-    public String getPlayerName(){
-        return this.playerName;
-    }
+    public void createLobby(String name, int MAX_PLAYERS){ net.sendToServer(new cLobbyCreate(name, MAX_PLAYERS)); }
 
-    public void joinLobby(int id){ net.sendToServer(new cLobbyJoin(id)); }
+    public void updateIndexAvatar(int indexAvatar){ net.sendToServer(new cSetIndexAvatar(indexAvatar)); }
 
-    public void lobbyGetList(){ net.sendToServer(new cLobbyGetList()); }
+    public void deleteLobby(int id){ net.sendToServer(new cLobbyDelete(id)); }
 
-    public void createLobby(int MAX_PLAYERS){ net.sendToServer(new cLobbyCreate(MAX_PLAYERS)); }
+    public void joinLobby(int id){ net.sendToServer(new cLobbyJoin(id)); }
 
-    public void deleteLobby(int id){ net.sendToServer(new cLobbyDelete(id)); }
+    public void leaveLobby(int id) { net.sendToServer(new cLobbyLeave(id)); }
 
     public Lobby getLobby(){ return lobby; }
 
@@ -76,4 +60,8 @@ public class PlayerController {
     public PlayerController getPlayerController(){ return this; }
 
     public NetworkController getNetWorkController() { return net; }
+
+
+
+
 }
diff --git a/CheckersClient/core/src/com/mygdx/game/controllers/commands/Command.java b/CheckersClient/core/src/com/mygdx/game/controllers/commands/Command.java
index 9da62d69f3aee8d931616c2394e8aa811240e02c..b8bb4a064a608a853094fc3f0db75d0ea0d88286 100644
--- a/CheckersClient/core/src/com/mygdx/game/controllers/commands/Command.java
+++ b/CheckersClient/core/src/com/mygdx/game/controllers/commands/Command.java
@@ -19,6 +19,7 @@ public class Command{
         this.data = "None";
     }
 
+
     public void execute(PlayerController playerController, Connection connection){}
 
     public String getText(){ return text; }
diff --git a/CheckersClient/core/src/com/mygdx/game/controllers/commands/cLobbyCreate.java b/CheckersClient/core/src/com/mygdx/game/controllers/commands/cLobbyCreate.java
index de48edb5cfae4fc4fb5e2f5443ee8ba8d28d5e8a..45856d504f3926f95185e1915a5b1fc28830a384 100644
--- a/CheckersClient/core/src/com/mygdx/game/controllers/commands/cLobbyCreate.java
+++ b/CheckersClient/core/src/com/mygdx/game/controllers/commands/cLobbyCreate.java
@@ -4,11 +4,19 @@ import com.esotericsoftware.kryonet.Connection;
 import com.mygdx.game.controllers.PlayerController;
 import com.mygdx.game.model.Lobby;
 
+import java.util.ArrayList;
+
 public class cLobbyCreate extends Command {
 
     public cLobbyCreate() { super("cLobbyCreate"); }
 
-    public cLobbyCreate(int MAX_PLAYERS) { super("cLobbyCreate", (Integer) MAX_PLAYERS); }
+    public cLobbyCreate(String name, int MAX_PLAYERS) {
+        super("cLobbyCreate");
+        ArrayList<Object> data = new ArrayList<Object>();
+        data.add(name);
+        data.add(MAX_PLAYERS);
+        this.data = data;
+    }
 
     @Override
     public void execute(PlayerController playerController, Connection connection){
diff --git a/CheckersClient/core/src/com/mygdx/game/controllers/commands/cLobbyJoin.java b/CheckersClient/core/src/com/mygdx/game/controllers/commands/cLobbyJoin.java
index 59ae87197d3f28afaf2f4f472ed289be75421b6c..77d5b4e4f1eb2d301beeb96eeab8d3c33bd87ca7 100644
--- a/CheckersClient/core/src/com/mygdx/game/controllers/commands/cLobbyJoin.java
+++ b/CheckersClient/core/src/com/mygdx/game/controllers/commands/cLobbyJoin.java
@@ -9,7 +9,9 @@ public class cLobbyJoin extends Command{
 
     public cLobbyJoin() { super("cLobbyJoin"); }
 
-    public cLobbyJoin(int id) { super("cLobbyJoin", (Integer) id); }
+    public cLobbyJoin(int id) {
+        super("cLobbyJoin", (Integer) id);
+    }
 
     @Override
     public void execute(PlayerController playerController, Connection connection){
diff --git a/CheckersClient/core/src/com/mygdx/game/controllers/commands/cLobbyLeave.java b/CheckersClient/core/src/com/mygdx/game/controllers/commands/cLobbyLeave.java
index 90b4200c309965ce6d68fe7d81967ee6506d292c..21c47b8be275a93e9b65009cd363ddf7685ebb24 100644
--- a/CheckersClient/core/src/com/mygdx/game/controllers/commands/cLobbyLeave.java
+++ b/CheckersClient/core/src/com/mygdx/game/controllers/commands/cLobbyLeave.java
@@ -12,12 +12,22 @@ public class cLobbyLeave extends Command{
 
     @Override
     public void execute(PlayerController playerController, Connection connection){
-        if(data instanceof Integer){
-            int result = (int) data;
-            if (result == -1) System.out.println("Failed to leave lobby");
-            else {
-                playerController.setLobby(new Lobby(-1));
-                System.out.println("Request to leave lobby successful");
+        if(data instanceof Lobby){
+            Lobby lobby = (Lobby) data;
+            if(lobby.getID() != -1){
+                if (lobby.getPlayersID().contains((Integer) connection.getID())) {
+                    //Somebody else left
+                    System.out.println("Somebody left the lobby");
+                    playerController.setLobby(lobby);
+                }
+                else{
+                    //The current player left
+                    playerController.setLobby(new Lobby(-1));
+                    System.out.println("Request to leave lobby successful");
+                }
+            }
+            else{
+                System.out.println("Received leaveLobby command with an error");
             }
         }
     }
diff --git a/CheckersClient/core/src/com/mygdx/game/controllers/commands/cPlayerJoin.java b/CheckersClient/core/src/com/mygdx/game/controllers/commands/cPlayerJoin.java
index 77c20a07fa49c6ed732ccc96aa3e11037de26bab..bae2c3eea518a58867241addae49b42a7450f198 100644
--- a/CheckersClient/core/src/com/mygdx/game/controllers/commands/cPlayerJoin.java
+++ b/CheckersClient/core/src/com/mygdx/game/controllers/commands/cPlayerJoin.java
@@ -11,6 +11,10 @@ public class cPlayerJoin extends Command {
         super("cPlayerJoin");
     }
 
+    public cPlayerJoin(int indexAvatar) {
+        super("cPlayerJoin", (Integer) indexAvatar);
+    }
+
     @Override
     public void execute(PlayerController playerController, Connection connection){
         if(data instanceof Player){
diff --git a/CheckersClient/core/src/com/mygdx/game/controllers/commands/cSetIndexAvatar.java b/CheckersClient/core/src/com/mygdx/game/controllers/commands/cSetIndexAvatar.java
new file mode 100644
index 0000000000000000000000000000000000000000..b917c6980a2e03d916895cb2e4959747cc2fa23c
--- /dev/null
+++ b/CheckersClient/core/src/com/mygdx/game/controllers/commands/cSetIndexAvatar.java
@@ -0,0 +1,26 @@
+package com.mygdx.game.controllers.commands;
+
+import com.esotericsoftware.kryonet.Connection;
+import com.mygdx.game.controllers.NetworkController;
+import com.mygdx.game.controllers.PlayerController;
+import com.mygdx.game.model.Lobby;
+
+public class cSetIndexAvatar extends Command {
+
+    public cSetIndexAvatar() { super("cLobbyJoin"); }
+
+    public cSetIndexAvatar(int indexAvatar) {
+        super("cSetIndexAvatar", indexAvatar);
+    }
+
+    @Override
+    public void execute(PlayerController playerController, Connection connection){
+        if(data instanceof Integer){
+            int indexAvatar = (int) data;
+            if (indexAvatar == -1) System.out.println("Failed to set indexAvatar.");
+            else {
+                playerController.getPlayer().setIndexAvatar(indexAvatar);
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/CheckersClient/core/src/com/mygdx/game/model/Lobby.java b/CheckersClient/core/src/com/mygdx/game/model/Lobby.java
index d198b3d091395e403dbca069f5988b14323bbf5c..4b170d62e45db0a338fdfcf35fa115da11220114 100644
--- a/CheckersClient/core/src/com/mygdx/game/model/Lobby.java
+++ b/CheckersClient/core/src/com/mygdx/game/model/Lobby.java
@@ -1,10 +1,12 @@
 package com.mygdx.game.model;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 
 public class Lobby {
 
     private int ID;
+    private String name;
     private int MAX_PLAYERS;
     private ArrayList<Player> players;
 
@@ -15,14 +17,39 @@ public class Lobby {
         players = new ArrayList<Player>();
     }
 
-    public Lobby(int ID, int MAX_PLAYERS){
+    public Lobby(int ID, String name, int MAX_PLAYERS){
         this.ID = ID;
+        this.name = name;
         this.MAX_PLAYERS = MAX_PLAYERS;
         players = new ArrayList<Player>();
     }
 
     public int getID(){ return ID; }
 
+    public void setName(String name){
+        this.name = name;
+    }
+
+    public String getName(){
+        return name;
+    }
+
+    public int getMaxPlayers(){
+        return MAX_PLAYERS;
+    }
+
+    public ArrayList<Player> getPlayers(){
+        return players;
+    }
+
+    public HashSet<Integer> getPlayersID(){
+        HashSet set = new HashSet();
+        for(Player player : players){
+            set.add((Integer) player.getID());
+        }
+        return set;
+    }
+
     @Override
     public boolean equals(Object o) {
         if (this == o) return true;
@@ -35,9 +62,9 @@ public class Lobby {
     public String toString() {
         return "Lobby{" +
                 "ID=" + ID +
+                ", name='" + name + '\'' +
                 ", MAX_PLAYERS=" + MAX_PLAYERS +
                 ", players=" + players +
                 '}';
     }
-
 }
diff --git a/CheckersClient/core/src/com/mygdx/game/model/Player.java b/CheckersClient/core/src/com/mygdx/game/model/Player.java
index 168218638ce097035d6195ac675d782d2e72e10f..e8200a4ff01d3bb3bbc6a2d8f71d9417ff93fdc4 100644
--- a/CheckersClient/core/src/com/mygdx/game/model/Player.java
+++ b/CheckersClient/core/src/com/mygdx/game/model/Player.java
@@ -3,11 +3,16 @@ package com.mygdx.game.model;
 public class Player {
 
     private int ID;
+    private int indexAvatar;
+    private String playerName;
 
     public Player(){}
 
-    public Player(int ID){
+    public Player(int ID){ this.ID = ID; }
+
+    public Player(int ID, int indexAvatar){
         this.ID = ID;
+        this.indexAvatar = indexAvatar;
     }
 
     public int getID(){ return ID; }
@@ -26,4 +31,16 @@ public class Player {
                 "ID=" + ID +
                 '}';
     }
+
+    public void setIndexAvatar(int indexAvatar){
+        this.indexAvatar = indexAvatar;
+    }
+
+    public int getIndexAvatar(){
+        return this.indexAvatar;
+    }
+
+    public void setPlayerName(String playerName) {
+        this.playerName = playerName;
+    }
 }
diff --git a/CheckersClient/core/src/com/mygdx/game/views/LoadingView.java b/CheckersClient/core/src/com/mygdx/game/views/LoadingView.java
new file mode 100644
index 0000000000000000000000000000000000000000..2a1c001ba04ff01fd8fe7c3b42c56c353f3cd4ac
--- /dev/null
+++ b/CheckersClient/core/src/com/mygdx/game/views/LoadingView.java
@@ -0,0 +1,72 @@
+package com.mygdx.game.views;
+
+import com.badlogic.gdx.assets.AssetManager;
+import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.math.MathUtils;
+import com.badlogic.gdx.scenes.scene2d.Stage;
+import com.badlogic.gdx.scenes.scene2d.ui.Image;
+import com.badlogic.gdx.scenes.scene2d.ui.Skin;
+import com.mygdx.game.controllers.PlayerController;
+import com.mygdx.game.views.enums.CharacterAssets;
+import com.mygdx.game.views.enums.LobbyAssets;
+import com.mygdx.game.views.enums.MenuAssets;
+
+public class LoadingView extends View {
+
+    private Image loadingTextImage = new Image(new Texture("Loading/LoadingText.png"));
+    private Image loadingDotImage = new Image(new Texture("Loading/LoadingDot.png"));
+    private Image loadingBarFillImage = new Image(new Texture("Loading/LoadingBarFill.png"));
+    private Image loadingBarBorderImage = new Image(new Texture("Loading/LoadingBarBorder.png"));
+    private Image loadingBarBackgroundImage = new Image(new Texture("Loading/LoadingBarBackground.png"));
+    private float animationLoopTimer;
+    private float animationSpeedTimer;
+
+    public LoadingView(GameViewManager gvm, PlayerController playerController, AssetManager assetManager, Stage stage, Skin skin) {
+        super(gvm, playerController, assetManager, stage, skin);
+
+        this.loadingBarBackgroundImage.setPosition((float)(this.col_width * 6) - this.loadingBarBackgroundImage.getWidth() / 2.0F, (float)(this.row_height * 1));
+        this.loadingBarBorderImage.setPosition(this.loadingBarBackgroundImage.getX(), this.loadingBarBackgroundImage.getY());
+        this.loadingTextImage.setPosition(this.loadingBarBackgroundImage.getX(), this.loadingBarBackgroundImage.getY() + this.loadingTextImage.getHeight() * 1.25F);
+        this.loadingDotImage.setPosition(this.loadingTextImage.getX() + this.loadingDotImage.getWidth() * 2.0F, this.loadingTextImage.getY());
+        this.loadingBarFillImage.setBounds(this.loadingBarBackgroundImage.getX(), this.loadingBarBackgroundImage.getY(), this.loadingBarBackgroundImage.getWidth() * 0.05F, this.loadingBarBackgroundImage.getHeight());
+        stage.addActor(this.loadingTextImage);
+        stage.addActor(this.loadingDotImage);
+        stage.addActor(this.loadingBarBackgroundImage);
+        stage.addActor(this.loadingBarFillImage);
+        stage.addActor(this.loadingBarBorderImage);
+
+        for(MenuAssets asset : MenuAssets.values()) {
+            assetManager.load(asset.path, asset.classType);
+        }
+
+        for(CharacterAssets asset : CharacterAssets.values()) {
+            assetManager.load(asset.path, asset.classType);
+        }
+    }
+
+    @Override
+    protected void handleInput() {
+
+    }
+
+    @Override
+    public void update(float dt) {
+        if(assetManager.update()){
+            gvm.set(new MenuView(gvm, playerController, assetManager, stage, skin));
+        }
+        else{
+            loadingBarFillImage.setWidth(assetManager.getProgress()*loadingBarBackgroundImage.getWidth());
+        }
+    }
+
+    @Override
+    public void render(float dt) {
+        stage.draw();
+    }
+
+    @Override
+    public void dispose() {
+        // background.dispose();
+        //playBtn.dispose();
+    }
+}
diff --git a/CheckersClient/core/src/com/mygdx/game/views/LobbyView.java b/CheckersClient/core/src/com/mygdx/game/views/LobbyView.java
index ce115e2e806e394bba7101c51610ae6b5b01f0cf..2097722fa82cd29fe24255d65f38f9b781fd1c15 100644
--- a/CheckersClient/core/src/com/mygdx/game/views/LobbyView.java
+++ b/CheckersClient/core/src/com/mygdx/game/views/LobbyView.java
@@ -3,19 +3,18 @@ package com.mygdx.game.views;
 import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.assets.AssetManager;
 import com.badlogic.gdx.audio.Sound;
+import com.badlogic.gdx.graphics.Pixmap;
 import com.badlogic.gdx.graphics.Texture;
-import com.badlogic.gdx.graphics.g2d.TextureRegion;
-import com.badlogic.gdx.graphics.glutils.FrameBuffer;
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
-import com.badlogic.gdx.math.MathUtils;
 import com.badlogic.gdx.scenes.scene2d.Actor;
 import com.badlogic.gdx.scenes.scene2d.InputEvent;
 import com.badlogic.gdx.scenes.scene2d.InputListener;
 import com.badlogic.gdx.scenes.scene2d.Stage;
 import com.badlogic.gdx.scenes.scene2d.ui.Button;
-import com.badlogic.gdx.scenes.scene2d.ui.Dialog;
 import com.badlogic.gdx.scenes.scene2d.ui.Image;
 import com.badlogic.gdx.scenes.scene2d.ui.Label;
+import com.badlogic.gdx.scenes.scene2d.ui.List;
+import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
 import com.badlogic.gdx.scenes.scene2d.ui.SelectBox;
 import com.badlogic.gdx.scenes.scene2d.ui.Skin;
 import com.badlogic.gdx.scenes.scene2d.ui.Table;
@@ -23,56 +22,73 @@ import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
 import com.badlogic.gdx.scenes.scene2d.ui.TextField;
 import com.badlogic.gdx.utils.Align;
 import com.mygdx.game.controllers.PlayerController;
+import com.mygdx.game.model.Lobby;
+import com.mygdx.game.model.Player;
 import com.mygdx.game.views.enums.LobbyAssets;
 import com.mygdx.game.views.enums.MenuAssets;
+import com.mygdx.game.views.tokens.PlayerAvatar;
 
+import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.List;
+import java.util.HashMap;
 
 public class LobbyView extends View{
 
-    private Texture background;
-    private Image lobbyListBubbleImage;
-    private Image rocketImage;
-    private Image exhaustImage;
-    private Texture rocketTexture;
-    private Texture exhaustTexture;
-    private Sound sound;
+    private final ArrayList<Actor> mainUIActors = new ArrayList<>();
+    private ScrollPane scroller;
+    private Table lobbyTable;
+
+    private boolean fadingToBlank = true;
+    private boolean fadeOut = true;
+    private boolean startFadeFromWhiteToBlank;
+    private boolean startRocketTransition;
+
+    private Button createLobbyButton;
+    private Button lobbyListBackButton;
+    private Button joinLobbyButton;
+    private Button lobbyBackButton;
+    private Button lobbyListRefreshButton;
+    private Button lobbyRefreshButton;
+    private Button findLobbyButton;
     private Button setUserNameButton;
-    private Image backgroundImage;
+    private Button startLobbyButton;
 
+    private float fadeTransitionLength = 1f;
+    private float alphaFadeValue = 1;
 
+    private Image backgroundImage;
+    private Image exhaustImage;
+    private Image lobbyListBubbleImage;
+    private Image rocketImage;
+    private Image whiteImage;
 
-    private FrameBuffer previousScreenFrameBuffer;
-    private float fadeTransitionLength = 0.75f;
-    private float fadeTransitionTimer = 1;
-    private Image fadeImage;
-    private TextureRegion fadeTextureRegion;
-    private boolean transitionFinished = false;
-    private boolean fadeIn = true;
-    private boolean fadeOut = true;
     private Label mrServerBubbleLabel;
+    private Label outputLabel;
 
     private Sound buttonClickAudio;
 
+    private Texture background;
+    private Texture rocketTexture;
+    private Texture exhaustTexture;
+
     private TextField lobbyCreateTextField;
-    private Button joinLobbyButton;
-    private Button createLobbyButton;
-    private Button lobbyRefreshButton;
-    private Button lobbyBackButton;
-    private Dialog lobbyCreateDialogue;
-    private SelectBox<Integer> lobbyCreateSizeSelectBox;
 
+    private SelectBox<Integer> lobbyCreateSizeSelectBox;
 
+    private ShapeRenderer shapeRenderer;
 
-    int Help_Guides = 12;
-    int row_height = Gdx.graphics.getHeight() / Help_Guides;
-    int col_width = Gdx.graphics.getWidth() / Help_Guides;
-    private Label outputLabel;
 
-    public LobbyView(GameViewManager gvm, final PlayerController playerController, AssetManager assetManager, Stage stage, Skin skin, FrameBuffer previousScreenFrameBuffer) {
+    public LobbyView(GameViewManager gvm, final PlayerController playerController, AssetManager assetManager, final Stage stage, Skin skin, ArrayList<PlayerAvatar> availableAvatars) {
         super(gvm, playerController, assetManager, stage, skin);
-        this.previousScreenFrameBuffer = previousScreenFrameBuffer;
+
+        this.availableAvatars = availableAvatars;
+
+        Pixmap tablePixmap = new Pixmap(1,1, Pixmap.Format.RGB565);
+        tablePixmap.setColor(1, 1, 1, 1);
+        tablePixmap.fill();
+        whiteImage = new Image(new Texture(tablePixmap));
+
+        startFadeFromWhiteToBlank = true;
 
         background = (Texture) assetManager.get(LobbyAssets.BACKGROUND.path, LobbyAssets.BACKGROUND.classType);
         rocketTexture = (Texture) assetManager.get(LobbyAssets.ROCKET.path, LobbyAssets.ROCKET.classType);
@@ -87,11 +103,6 @@ public class LobbyView extends View{
         exhaustImage.setSize(col_width*0.6f, row_height*2f);
         exhaustImage.setPosition(rocketImage.getX()+rocketImage.getWidth()/2-exhaustImage.getWidth()/2, rocketImage.getY()-exhaustImage.getHeight());
 
-        fadeTextureRegion = new TextureRegion(previousScreenFrameBuffer.getColorBufferTexture());
-        fadeTextureRegion.flip(false, true);
-        fadeImage = new Image(fadeTextureRegion);
-        fadeImage.setColor(1, 1, 1, 1f);
-
         lobbyListBubbleImage = new Image(lobbyListTexture);
         lobbyListBubbleImage.setPosition(col_width*0.25f, row_height*5.5f);
         backgroundImage = new Image(background);
@@ -112,9 +123,13 @@ public class LobbyView extends View{
         createLobbyButton.setSize(col_width*1f,(float)(row_height*0.65));
         createLobbyButton.setPosition(lobbyListBubbleImage.getX()+lobbyListBubbleImage.getWidth()*0.1f,lobbyListBubbleImage.getY()+lobbyListBubbleImage.getHeight()*0.125f+row_height*1);
 
-        joinLobbyButton = new TextButton("Join Lobby",skin,"small");
-        joinLobbyButton.setSize(col_width*1f,(float)(row_height*0.65));
-        joinLobbyButton.setPosition(lobbyListBubbleImage.getX()+lobbyListBubbleImage.getWidth()*0.6f,lobbyListBubbleImage.getY()+lobbyListBubbleImage.getHeight()*0.125f+row_height*1);
+        findLobbyButton = new TextButton("Find Lobby",skin,"small");
+        findLobbyButton.setSize(col_width*1f,(float)(row_height*0.65));
+        findLobbyButton.setPosition(lobbyListBubbleImage.getX()+lobbyListBubbleImage.getWidth()*0.6f,lobbyListBubbleImage.getY()+lobbyListBubbleImage.getHeight()*0.125f+row_height*1);
+
+        lobbyListRefreshButton = new TextButton("Refresh",skin,"small");
+        lobbyListRefreshButton.setSize(col_width*1f,(float)(row_height*0.65));
+        lobbyListRefreshButton.setPosition(lobbyListBubbleImage.getX()+lobbyListBubbleImage.getWidth()*0.1f,lobbyListBubbleImage.getY()+lobbyListBubbleImage.getHeight()*0.125f+row_height*1);
 
         lobbyRefreshButton = new TextButton("Refresh",skin,"small");
         lobbyRefreshButton.setSize(col_width*1f,(float)(row_height*0.65));
@@ -124,31 +139,53 @@ public class LobbyView extends View{
         lobbyBackButton.setSize(col_width*1f,(float)(row_height*0.65));
         lobbyBackButton.setPosition(lobbyListBubbleImage.getX()+lobbyListBubbleImage.getWidth()*0.6f,lobbyListBubbleImage.getY()+lobbyListBubbleImage.getHeight()*0.125f+row_height*1);
 
+        lobbyListBackButton = new TextButton("Back",skin,"small");
+        lobbyListBackButton.setSize(col_width*1f,(float)(row_height*0.65));
+        lobbyListBackButton.setPosition(lobbyListBubbleImage.getX()+lobbyListBubbleImage.getWidth()*0.6f,lobbyListBubbleImage.getY()+lobbyListBubbleImage.getHeight()*0.125f+row_height*1);
+
+        joinLobbyButton = new TextButton("Join Lobby",skin,"small");
+        joinLobbyButton.setSize(col_width*1f,(float)(row_height*0.65));
+        joinLobbyButton.setPosition(lobbyListBubbleImage.getX()+lobbyListBubbleImage.getWidth()*0.6f,lobbyListBubbleImage.getY()+lobbyListBubbleImage.getHeight()*0.125f+row_height*2);
+
+        startLobbyButton = new TextButton("Start",skin,"small");
+        startLobbyButton.setSize(col_width*1f,(float)(row_height*0.65));
+        startLobbyButton.setPosition(lobbyListBubbleImage.getX()+lobbyListBubbleImage.getWidth()*0.1f,lobbyListBubbleImage.getY()+lobbyListBubbleImage.getHeight()*0.125f+row_height*1);
+
         setUserNameButton = new TextButton("Text Button",skin,"small");
         setUserNameButton.setSize(col_width*2,(float)(row_height*0.5));
         setUserNameButton.setPosition(col_width*5,Gdx.graphics.getHeight()-row_height*4);
 
         lobbyCreateTextField = new TextField("", skin);
-        lobbyCreateTextField.setMessageText("Name of your lobby.");
-        lobbyCreateTextField.setPosition(col_width*5,Gdx.graphics.getHeight()-row_height*3);
-        lobbyCreateTextField.setSize(col_width*2,(float)(row_height*0.75));
-        lobbyCreateTextField.scaleBy(1000);
+        lobbyCreateTextField.setMessageText("Enter lobby name.");
+        lobbyCreateTextField.setSize(col_width*1f,row_height*1f);
+        lobbyCreateTextField.setPosition(lobbyListRefreshButton.getX(), lobbyListRefreshButton.getY()+row_height*1.25f);
 
         lobbyCreateSizeSelectBox =new SelectBox<>(skin);
         lobbyCreateSizeSelectBox.setItems(2, 4, 6, 8);
-        lobbyCreateTextField = new TextField("", skin);
-        lobbyCreateTextField.setMessageText("Enter lobby name.");
-        lobbyCreateTextField.setSize(col_width*1.5f,row_height*0.8f);
-        lobbyCreateTextField.setPosition(lobbyRefreshButton.getX(), lobbyRefreshButton.getY()+row_height*1.25f);
-        lobbyCreateSizeSelectBox.setPosition(lobbyBackButton.getX(), lobbyCreateTextField.getY());
-        lobbyCreateSizeSelectBox.setSize(lobbyBackButton.getWidth(), lobbyBackButton.getHeight());
+        lobbyCreateSizeSelectBox.setPosition(lobbyListBackButton.getX(), lobbyCreateTextField.getY());
+        lobbyCreateSizeSelectBox.setSize(lobbyListBackButton.getWidth(), lobbyListBackButton.getHeight());
 
         backgroundImage.setZIndex(1);
         lobbyListBubbleImage.setZIndex(2);
-        fadeImage.setZIndex(3);
         outputLabel.setZIndex(3);
-        stage.addActor(fadeImage);
+
+        stage.clear();
+
+        stage.addActor(backgroundImage);
         stage.addActor(outputLabel);
+        stage.addActor(rocketImage);
+        stage.addActor(exhaustImage);
+        stage.addActor(lobbyListBubbleImage);
+        mainUIActors.add(createLobbyButton);
+        mainUIActors.add(findLobbyButton);
+        mainUIActors.add(mrServerBubbleLabel);
+        for (Actor actor: mainUIActors){
+            stage.addActor(actor);
+        }
+        stage.addActor(outputLabel); // OutputLabel for debugging purposes
+        whiteImage.setSize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
+        whiteImage.setPosition(0,0);
+        stage.addActor(whiteImage);
 
         createLobbyButton.addListener(new InputListener(){
             @Override
@@ -160,10 +197,57 @@ public class LobbyView extends View{
                 buttonClickAudio.play(0.8f);
                 outputLabel.setText("Create Lobby");
                 showCreateLobbyWindow();
+            }
+            @Override
+            public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) {
+                outputLabel.setText("createLobbyButton");
+            }
+        });
+        findLobbyButton.addListener(new InputListener(){
+            @Override
+            public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
+                return true;
+            }
+            @Override
+            public void touchUp (InputEvent event, float x, float y, int pointer, int button) {
+                buttonClickAudio.play(0.8f);
+                showLobbyListWindow();
+            }
+            @Override
+            public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) {
+                outputLabel.setText("findLobbyButton");
+            }
+        });
+        lobbyListBackButton.addListener(new InputListener(){
+            @Override
+            public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
+                return true;
+            }
+            @Override
+            public void touchUp (InputEvent event, float x, float y, int pointer, int button) {
+                buttonClickAudio.play(0.8f);
+                Gdx.input.setOnscreenKeyboardVisible(false);
+                stage.unfocusAll();
+                try{
+                    if(lobby.getPlayers().size() == 1){
+                        playerController.deleteLobby(lobby.getID());
+                    }
+                    else{
+                        playerController.leaveLobby(lobby.getID());
+                    }
+
+                }catch(NullPointerException e){
+
+                }
 
+                showMainLobbyWindow();
+            }
+            @Override
+            public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) {
+                outputLabel.setText("lobbyListBackButton");
             }
         });
-        joinLobbyButton.addListener(new InputListener(){
+        lobbyListRefreshButton.addListener(new InputListener(){
             @Override
             public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
                 return true;
@@ -171,10 +255,15 @@ public class LobbyView extends View{
             @Override
             public void touchUp (InputEvent event, float x, float y, int pointer, int button) {
                 buttonClickAudio.play(0.8f);
-                outputLabel.setText("Touch up a Button");
-                showJoinLobbyWindow();
+                outputLabel.setText("Lobby refreshed!");
+                lobbyListRefresh();
+            }
+            @Override
+            public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) {
+                outputLabel.setText("lobbyListRefreshButton");
             }
         });
+
         lobbyBackButton.addListener(new InputListener(){
             @Override
             public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
@@ -183,10 +272,73 @@ public class LobbyView extends View{
             @Override
             public void touchUp (InputEvent event, float x, float y, int pointer, int button) {
                 buttonClickAudio.play(0.8f);
-                outputLabel.setText("Back button");
+                Gdx.input.setOnscreenKeyboardVisible(false);
+                stage.unfocusAll();
+
+                while(playerController.getLobby() == null){System.out.println("NOT FINDING A LOBBY");}
+
+                if(playerController.getLobby().getPlayers().size() == 1){
+                    System.out.println("Deleting lobby " + playerController.getLobby().getName());
+                    playerController.deleteLobby(lobby.getID());
+                }
+                else{
+                    System.out.println("Leaving lobby " + playerController.getLobby().getName());
+                    playerController.leaveLobby(lobby.getID());
+                }
+
                 showMainLobbyWindow();
+
+            }
+            @Override
+            public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) {
+                outputLabel.setText("LobbybackButton");
+            }
+        });
+
+        joinLobbyButton.addListener(new InputListener(){
+            @Override
+            public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
+                return true;
+            }
+            @Override
+            public void touchUp (InputEvent event, float x, float y, int pointer, int button) {
+                //if(lobby != null) playerController.leaveLobby(lobby.getID());
+
+                if(getLobbyByStringHashMap.containsKey(lobbyListStrings.getSelected())){
+                    Thread thread2 = new Thread(){
+                        public void run(){
+                            for(Lobby lobby : playerController.getLobbyList()){
+                                System.out.println("LobbyId available: " +lobby.getID());
+                            }
+                            playerController.joinLobby(getLobbyByStringHashMap.get(lobbyListStrings.getSelected()));
+                            System.out.println("joining lobby with lobbyID: " + lobbyListStrings.getSelectedIndex());
+                            while (playerController.getLobby() == null) {
+                                System.out.println("Waiting for lobby");
+                            }
+                            Lobby lobby = playerController.getLobby();
+                            System.out.println("Lobby loaded " + lobby);
+                        }
+                    };
+                    thread2.start();
+                    try {
+                        thread2.join();
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                    Gdx.input.setOnscreenKeyboardVisible(false);
+                    showLobbyWindow();
+                    lobbyRefresh();
+                }
+                else{
+                    outputLabel.setText("LobbyListHash did not contain the selected key.");
+                }
+            }
+            @Override
+            public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) {
+                outputLabel.setText("joinLobbyButton");
             }
         });
+
         lobbyRefreshButton.addListener(new InputListener(){
             @Override
             public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
@@ -198,7 +350,12 @@ public class LobbyView extends View{
                 outputLabel.setText("Lobby refreshed!");
                 lobbyRefresh();
             }
+            @Override
+            public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) {
+                outputLabel.setText("lobbyRefreshButton");
+            }
         });
+
         lobbyCreateTextField.addListener(new InputListener(){
             @Override
             public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
@@ -217,149 +374,222 @@ public class LobbyView extends View{
                 }
             }
         });
+        startLobbyButton.addListener(new InputListener(){
+            @Override
+            public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
+                buttonClickAudio.play(0.80f);
+                if(!lobbyCreateTextField.getText().isEmpty()){
+                    Thread thread2 = new Thread(){
+                        public void run(){
+                            playerController.createLobby(lobbyCreateTextField.getText(), lobbyCreateSizeSelectBox.getSelected());
+                            System.out.println("Creating lobby '" + lobbyCreateTextField.getText() + "' with maxSize " + lobbyCreateSizeSelectBox.getSelected());
+                            while (playerController.getLobby() == null) {
+                                System.out.println("Waiting for lobby object from server..");
+                            }
+                            while(playerController.getLobby().getID() == -1){
+                                System.out.println("Waiting for lobby object from server. Current id is -1..");
+                            }
+
+                            Lobby lobby = playerController.getLobby();
+                            System.out.println("Lobby loaded successfully.  '" + playerController.getLobby().getName() + "', maxPlayers: " + lobby.getMaxPlayers() + ", NumOfPlayersInLobby: " + lobby.getPlayers().size());
+
+                            playerController.joinLobby(playerController.getLobby().getID());
+                            while(playerController.getLobby().getPlayers().size() > 0){System.out.println("NOT JOINED LOBBY YET");}
+                        }
+                    };
+                    thread2.start();
+                    Gdx.input.setOnscreenKeyboardVisible(false);
+                    showLobbyWindow();
+                    try {
+                        thread2.join();
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                    //lobby = playerController.getLobby();
+                    lobbyRefresh();
+                }
+                else{
+                    outputLabel.setText("Lobby has no name, hehe");
+                }
+                return true;
+            }
+        });
     }
 
-    private void showCreateLobbyWindow(){
-        mrServerBubbleLabel.remove();
-        joinLobbyButton.remove();
-        createLobbyButton.remove();
+    private void clearActors(){
+        for (Actor actor: mainUIActors){
+            actor.remove();
+        }
+        mainUIActors.clear();
 
-        stage.addActor(lobbyBackButton);
-        stage.addActor(lobbyCreateTextField);
-        stage.addActor(lobbyCreateSizeSelectBox);
+    }
+    private void drawGrid(){
+        if(shapeRenderer == null){
+            shapeRenderer = new ShapeRenderer(); // Used for draw debugging
+        }
+        shapeRenderer.begin(ShapeRenderer.ShapeType.Line);
+        shapeRenderer.setColor(1, 0, 0, 0.75f); // Red line
+        for (int i = 0; i < 12; i++) {
+            shapeRenderer.rect(col_width*i, 0, 1, Gdx.graphics.getHeight());
+            shapeRenderer.rect(0, row_height*i, Gdx.graphics.getWidth(), 1);
+        }
+        shapeRenderer.end();
     }
 
-    private Table lobbyRoomTable;
-    private void showJoinLobbyWindow(){
-        lobbyRoomTable = new Table();
-        mrServerBubbleLabel.remove();
-        joinLobbyButton.remove();
-        createLobbyButton.remove();
-        stage.addActor(lobbyRoomTable);
-        stage.addActor(lobbyBackButton);
-        stage.addActor(lobbyRefreshButton);
-        lobbyRefresh();
+    private ScrollPane scrollPane;
+    private volatile ArrayList<Lobby> currentLobbyList;
+    private List<String> lobbyListStrings;
+    private HashMap<String, Integer> getLobbyByStringHashMap;
 
-    }
+    public void lobbyListRefresh(){
 
-    List<String> lobbyNames = Arrays.asList("Hello", "World!", "How", "Are", "You", "Lobby1", "Norway", "Oh yes", "No girls", "Only boys", "NTNU");
-    List<String> lobbySize = Arrays.asList("2", "4", "6");
-    private void lobbyRefresh(){
-        if(lobbyRoomTable != null){
-            lobbyRoomTable.clear();
-            // models.get(availableLobbies);
-            lobbyRoomTable.setSize(col_width*2.5f, row_height*3f);
-            lobbyRoomTable.setPosition(lobbyListBubbleImage.getX()+lobbyListBubbleImage.getWidth()*0.1f, row_height*8f);
-            Label availableLobbyLabel = new Label("Available Lobbies", skin);
-            lobbyRoomTable.addActor(availableLobbyLabel);
-            for (int i=0; i<4; i++) {
-                Label lobbyEntry = new Label("LobbyName: "+ lobbyNames.get((int) MathUtils.random(lobbyNames.size()-1)) + ", LobbySize = " + lobbySize.get((int) MathUtils.random(lobbySize.size()-1)), skin);
-                lobbyEntry.setWrap(true);
-                lobbyRoomTable.addActor(lobbyEntry);
+        Thread thread2 = new Thread(){
+            public void run(){
+                playerController.setLobbies(null);
+                playerController.lobbyGetList();
+                while (playerController.getLobbyList() == null) {
+                    System.out.println("Waiting for lobby" + currentLobbyList);
+                }
+                ArrayList<Lobby> lobbyList = playerController.getLobbyList();
+                System.out.println("Lobby loaded " + lobbyList + " Number of available lobbies are " + lobbyList.size());
             }
-        }
-    }
-
-    private void showMainLobbyWindow(){
-        if(lobbyRoomTable != null){
-            lobbyRoomTable.remove();
-        }
-        stage.addActor(createLobbyButton);
-        stage.addActor(joinLobbyButton);
-        stage.addActor(mrServerBubbleLabel);
+        };
+        thread2.start();
         try {
-            lobbyBackButton.remove();
-            lobbyRefreshButton.remove();
-            lobbyCreateTextField.remove();
-            lobbyCreateSizeSelectBox.remove();
+            thread2.join();
+            System.out.println("LobbyCount AFTER" + playerController.getLobbyList().size());
+            System.out.println("LobbyCount AFTER NUM OF PLAYERS" + playerController.getLobbyList().get(0).getPlayers().size());
+        } catch (Exception e) {
 
-        } finally {
-            // Do nothing here
         }
-    }
 
+        lobbyListStrings = new List(skin, "plain");
+        lobbyListStrings.setColor(1f, 1f, 1f, 1);
+        currentLobbyList = playerController.getLobbyList();
+        String[] strings;
 
+        if(getLobbyByStringHashMap == null) getLobbyByStringHashMap = new HashMap<>();
+        else getLobbyByStringHashMap.clear();
 
-    @Override
-    public void handleInput() {
-        if(Gdx.input.isTouched()) {
-            int x = Gdx.input.getX();
-            int y = Gdx.input.getY();
-        }/*
-        if(Gdx.input.isButtonJustPressed(1)){
-            sound.stop();
-            gvm.set(new PlayView(gvm, playerController, assetManager));
-            dispose();
+        if(currentLobbyList.size() > 0){
+            strings = new String[currentLobbyList.size()];
+            for (int i = 0; i < currentLobbyList.size(); i++) {
+                strings[i] = currentLobbyList.get(i).getName() + "\t" + currentLobbyList.get(i).getPlayers().size()+ "/" + currentLobbyList.get(i).getMaxPlayers();
+                getLobbyByStringHashMap.put(strings[i], currentLobbyList.get(i).getID());
+            }
+        }
+        else{
+            strings = new String[1];
+            strings[0] = "No lobbies currently available.";
         }
-        */
-    }
 
-    @Override
-    public void update(float dt) {
-        stage.act(dt);
-        handleInput();
+        if(scrollPane != null) scrollPane.remove();
 
-    }
+        lobbyListStrings.setItems(strings);
+        scrollPane = new ScrollPane(lobbyListStrings);
+        scrollPane.setBounds(0, 0, col_width*4f, row_height*4);
+        scrollPane.setPosition(col_width*0.25f, row_height*6);
+        scrollPane.setSmoothScrolling(false);
+        scrollPane.setTransform(true);
 
-    @Override
-    public void render(float dt) {
-        if(!transitionFinished){
-            fadeToWhiteTransition(dt);
+        mainUIActors.add(scrollPane);
+        for (Actor actor: mainUIActors){
+            stage.addActor(actor);
         }
-        else{
-            stage.draw();
+    }
+    private void showCreateLobbyWindow(){
+        clearActors();
+        mainUIActors.add(lobbyListBackButton);
+        mainUIActors.add(lobbyCreateTextField);
+        mainUIActors.add(lobbyCreateSizeSelectBox);
+        mainUIActors.add(startLobbyButton);
+        lobbyListBackButton.setY(startLobbyButton.getY());
+        for (Actor actor: mainUIActors){
+            stage.addActor(actor);
         }
-        drawGrid();
     }
-
-    private void addActorsAfterTransition(){
-        stage.addActor(backgroundImage);
-        stage.addActor(outputLabel);
-        stage.addActor(rocketImage);
-        stage.addActor(exhaustImage);
-        stage.addActor(lobbyListBubbleImage);
-        stage.addActor(createLobbyButton);
-        stage.addActor(joinLobbyButton);
-        stage.addActor(mrServerBubbleLabel);
+    private void showLobbyListWindow(){
+        clearActors();
+        mainUIActors.add(lobbyListBackButton);
+        mainUIActors.add(lobbyListRefreshButton);
+        mainUIActors.add(joinLobbyButton);
+        joinLobbyButton.setPosition(col_width*4, row_height*3);
+        lobbyListRefreshButton.setY(row_height*3);
+        lobbyListBackButton.setY(row_height*3);
+
+        for (Actor actor: mainUIActors){
+            stage.addActor(actor);
+        }
+        lobbyListRefresh();
     }
 
-    private float alphaFade1 = 1;
-    private float alphaFade2 = 1;
-
-    /*
-    Helper class.
-    Creates the logic for transitioning between two states.
-    Fades from a texture region to white, then from white to the current stage.
-     */
-    private void fadeToWhiteTransition(float dt){
-        if (fadeIn) {
-            if (alphaFade1 <= 0) {
-                fadeIn = false;
-                stage.clear();
-                addActorsAfterTransition();
-                outputLabel.setText("Fade to white is complete.");
+    float[] player1Pos = {col_width*3.75f, row_height*2};
+    float[] player2Pos = {col_width*3.5f, row_height*1.5f};
+
+    float[] player3Pos = {col_width*4.3f, row_height*2};
+    float[] player4Pos = {col_width*4.1f, row_height*1.5f};
+
+    float[] player5Pos = {col_width*5, row_height*2};
+    float[] player6Pos = {col_width*4.8f, row_height*1.5f};
+
+    private Lobby lobby;
+    private ArrayList<Player> playersInLobby;
+    ArrayList<float[]> playerPositions= new ArrayList<>(Arrays.asList(player1Pos, player2Pos, player3Pos, player4Pos, player5Pos, player6Pos));;
+
+    private final ArrayList<PlayerAvatar> availableAvatars;
+    private ArrayList<PlayerAvatar> lobbyAvatars = new ArrayList<>();
+
+    private void lobbyRefresh(){
+        try{
+
+            Thread thread2 = new Thread(){
+                public void run(){
+                    playerController.lobbyGetList();
+                }
+            };
+            thread2.start();
+            try {
+                thread2.join();
+            } catch (InterruptedException e) {
+                e.printStackTrace();
             }
-            else{
-                fadeImage.setColor(1, 1, 1, alphaFade1);
-                alphaFade1 -= dt/fadeTransitionLength;
-                outputLabel.setText("Fading to white.");
-                stage.draw();
+            lobbyAvatars.clear();
+            lobby = playerController.getLobby();
+            playersInLobby = lobby.getPlayers();
+            //System.out.println("My avatar Index: "+ playerController.getPlayer().getIndexAvatar());
+            //System.out.println("Number of players in lobby: "+ lobby.getPlayers().size());
+
+            for(int i = 0; i<playersInLobby.size(); i++){
+                //System.out.println("This players ID: "+ playersInLobby.get(i).getID() + " avatarIndex: "+ playersInLobby.get(i).getIndexAvatar());
+                PlayerAvatar pa = availableAvatars.get(playersInLobby.get(i).getIndexAvatar());
+                pa.setScale(0.3f, 0.3f);
+                pa.setOrigin(0, 0);
+                pa.setPosition(playerPositions.get(i)[0], playerPositions.get(i)[1]);
+                lobbyAvatars.add(pa);
             }
+        }catch (Exception e){
+            //System.out.println("Cannot refresh lobby at this time.");
         }
-        else {
-            if(alphaFade2 <= 0){
-                outputLabel.setText("Fade to normal state is complete.");
-                transitionFinished = true;
-                stage.draw();
-            }
-            else{
-                outputLabel.setText("Fade from white to background image.");
-                backgroundImage.setColor(1, 1, 1, 1-alphaFade2);
-                alphaFade2 -= dt/fadeTransitionLength;
-                stage.draw();
-            }
+    }
+
+    private void showLobbyWindow(){
+        clearActors();
+        mainUIActors.add(lobbyBackButton);
+        mainUIActors.add(lobbyRefreshButton);
+
+        for (Actor actor: mainUIActors){
+            stage.addActor(actor);
         }
+    }
+    private void showMainLobbyWindow(){
+        clearActors();
+        mainUIActors.add(createLobbyButton);
+        mainUIActors.add(findLobbyButton);
+        mainUIActors.add(mrServerBubbleLabel);
 
+        for (Actor actor: mainUIActors){
+            stage.addActor(actor);
+        }
     }
 
     @Override
@@ -370,19 +600,60 @@ public class LobbyView extends View{
         sound.dispose();
          */
     }
+    @Override
+    public void handleInput() {
+        if(Gdx.input.isTouched()) {
+            int x = Gdx.input.getX();
+            int y = Gdx.input.getY();
+        }
+    }
 
-    private ShapeRenderer shapeRenderer;
-    // For debugging purposes only..
-    private void drawGrid(){
-        if(shapeRenderer == null){
-            shapeRenderer = new ShapeRenderer(); // Used for draw debugging
+    float updateAvatarTimer = 0;
+    float updateAvatarFrequency = 0.120f; //update every 250ms
+    float refreshLobbyTimer = 1;
+
+    @Override
+    public void render(float dt) {
+        Gdx.gl.glClearColor(1, 1, 1, 1);
+        updateAvatarTimer+= dt;
+
+        if(refreshLobbyTimer >= 1) {
+            lobbyRefresh();
+            refreshLobbyTimer=0;
         }
-        shapeRenderer.begin(ShapeRenderer.ShapeType.Line);
-        shapeRenderer.setColor(1, 0, 0, 0.75f); // Red line
-        for (int i = 0; i < 12; i++) {
-            shapeRenderer.rect(col_width*i, 0, 1, Gdx.graphics.getHeight());
-            shapeRenderer.rect(0, row_height*i, Gdx.graphics.getWidth(), 1);
+        else {
+            refreshLobbyTimer += dt;
         }
-        shapeRenderer.end();
+
+        if(startFadeFromWhiteToBlank){
+            whiteImage.setColor(1, 1, 1, alphaFadeValue);
+            alphaFadeValue -= dt/fadeTransitionLength;
+            if(alphaFadeValue <= 0){
+                startFadeFromWhiteToBlank = false;
+                whiteImage.setZIndex(0);
+            }
+        }
+        else if(startRocketTransition){
+
+        }
+        stage.draw();
+        stage.getBatch().begin();
+        for(PlayerAvatar playerAvatar : lobbyAvatars){
+            if(updateAvatarTimer>= updateAvatarFrequency){
+                playerAvatar.updateTexture();
+            }
+            playerAvatar.draw(stage.getBatch());
+        }
+        if(updateAvatarTimer>= updateAvatarFrequency){
+            updateAvatarTimer=0;
+        }
+        stage.getBatch().end();
+        drawGrid();
+    }
+
+    @Override
+    public void update(float dt) {
+        stage.act(dt);
+        handleInput();
     }
 }
diff --git a/CheckersClient/core/src/com/mygdx/game/views/MenuLoadingView.java b/CheckersClient/core/src/com/mygdx/game/views/MenuLoadingView.java
deleted file mode 100644
index 86567c1e037742b47b148188e9f22a152d47c888..0000000000000000000000000000000000000000
--- a/CheckersClient/core/src/com/mygdx/game/views/MenuLoadingView.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package com.mygdx.game.views;
-
-import com.badlogic.gdx.assets.AssetManager;
-import com.badlogic.gdx.graphics.Texture;
-import com.badlogic.gdx.math.MathUtils;
-import com.badlogic.gdx.scenes.scene2d.Stage;
-import com.badlogic.gdx.scenes.scene2d.ui.Skin;
-import com.mygdx.game.controllers.PlayerController;
-import com.mygdx.game.views.enums.MenuAssets;
-
-public class MenuLoadingView extends View {
-
-    private Texture background;
-    private Texture playBtn;
-
-    public MenuLoadingView(GameViewManager gvm, PlayerController playerController, AssetManager assetManager, Stage stage, Skin skin) {
-        super(gvm, playerController, assetManager, stage, skin);
-
-        // Loading Menu Assets in the background.
-        for(MenuAssets asset : MenuAssets.values()) {
-            assetManager.load(asset.path, asset.classType);
-        }
-
-        background = new Texture ("Pause/PauseBackground.png");
-        playBtn = new Texture ("Pause/PauseButton.png");
-
-    }
-
-    @Override
-    protected void handleInput() {
-
-    }
-
-    @Override
-    public void update(float dt) {
-        assetManager.update();
-        if(assetManager.isFinished()){
-            gvm.set(new MenuView(gvm, playerController, assetManager, stage, skin));
-        }
-        else{
-            System.out.print("LOADING... ");
-            System.out.print( (int) MathUtils.floor(assetManager.getProgress()*100));
-            System.out.print("%");
-            System.out.println("");
-        }
-    }
-
-    @Override
-    public void render(float dt) {
-
-        stage.draw();
-    }
-
-    @Override
-    public void dispose() {
-        // background.dispose();
-        //playBtn.dispose();
-    }
-}
diff --git a/CheckersClient/core/src/com/mygdx/game/views/MenuView.java b/CheckersClient/core/src/com/mygdx/game/views/MenuView.java
index b9e5014899aa2fcd3501c692ab478489250aa1be..14cccc5dd20e4feb1f7181b4a8e5a2ad23110b91 100644
--- a/CheckersClient/core/src/com/mygdx/game/views/MenuView.java
+++ b/CheckersClient/core/src/com/mygdx/game/views/MenuView.java
@@ -6,8 +6,7 @@ import com.badlogic.gdx.audio.Music;
 import com.badlogic.gdx.audio.Sound;
 import com.badlogic.gdx.graphics.Pixmap;
 import com.badlogic.gdx.graphics.Texture;
-import com.badlogic.gdx.graphics.g3d.utils.MeshBuilder;
-import com.badlogic.gdx.graphics.glutils.FrameBuffer;
+import com.badlogic.gdx.graphics.g2d.TextureRegion;
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
 import com.badlogic.gdx.scenes.scene2d.Actor;
 import com.badlogic.gdx.scenes.scene2d.InputEvent;
@@ -15,37 +14,66 @@ import com.badlogic.gdx.scenes.scene2d.InputListener;
 import com.badlogic.gdx.scenes.scene2d.Stage;
 import com.badlogic.gdx.scenes.scene2d.ui.Button;
 import com.badlogic.gdx.scenes.scene2d.ui.Image;
+import com.badlogic.gdx.scenes.scene2d.ui.ImageButton;
 import com.badlogic.gdx.scenes.scene2d.ui.Label;
 import com.badlogic.gdx.scenes.scene2d.ui.Skin;
 import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
 import com.badlogic.gdx.scenes.scene2d.ui.TextField;
+import com.badlogic.gdx.scenes.scene2d.utils.Drawable;
+import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable;
 import com.badlogic.gdx.utils.Align;
 import com.mygdx.game.controllers.PlayerController;
+import com.mygdx.game.views.enums.CharacterAssets;
 import com.mygdx.game.views.enums.LobbyAssets;
 import com.mygdx.game.views.enums.MenuAssets;
+import com.mygdx.game.views.tokens.PlayerAvatar;
+
+import java.util.ArrayList;
+import java.util.Arrays;
 
 public class MenuView extends View{
 
-    private Texture background;
+    private boolean startFadeFromWhiteToBlank;
+    private boolean startFadeFromBlankToWhite;
+
+    private Button formButton;
+
     private Image backgroundImage;
     private Image formImage;
-    private Texture form;
-    private Texture formButtonTex;
-    private Sound loopAudio;
-    private Button formButton;
-    private TextField usernameTextField;
-    private Texture readyBtn;
+    private Image connectionBarImage;
+    private Image connectionBarGreenCircle;
+    private Image connectionBarRedCircle;
+
     private Music music;
+
+    private ShapeRenderer shapeRenderer;
+
     private Sound buttonClickAudio;
     private Sound transitionAudio;
-    private ShapeRenderer shapeRenderer;
-    int Help_Guides = 12;
-    int row_height = Gdx.graphics.getHeight() / Help_Guides;
-    int col_width = Gdx.graphics.getWidth() / Help_Guides;
+
+    private Texture background;
+    private Texture form;
+    private Texture formButtonTex;
+
+    private TextField usernameTextField;
+
     private Label outputLabel;
-    private Texture bufferTexture;
+    private Image whiteImage;
+    private float fadeTransitionLength = 1f;
+    private float alphaFadeValue = 1;
+
 
-    public MenuView(final GameViewManager gvm, final PlayerController playerController, final AssetManager assetManager, final Stage stage, final Skin skin) {
+    private ImageButton nextAvatarButton;
+    private ImageButton previousAvatarButton;
+    private Image avatarPortraitImage;
+    private String currentAvatar;
+
+
+    private ArrayList<PlayerAvatar> availableAvatars;
+    int currentIndexAvatar = 0;
+
+
+    public MenuView(final GameViewManager gvm, final PlayerController playerController, AssetManager assetManager, final Stage stage, Skin skin) {
         super(gvm, playerController, assetManager, stage, skin);
 
         for(LobbyAssets asset : LobbyAssets.values()) {
@@ -60,17 +88,12 @@ public class MenuView extends View{
 
         form = (Texture) assetManager.get(MenuAssets.FORM.path, MenuAssets.FORM.classType);
 
-        music = Gdx.audio.newMusic(Gdx.files.internal(MenuAssets.LOOP_AUDIO.path));
-        music.setVolume(1);
-        music.setLooping(true);
-        music.play();
-
         this.formImage = new Image(form);
         formImage.setPosition(col_width*5, row_height*5);
         formImage.setAlign((Align.center));
 
         formButtonTex = (Texture) assetManager.get(MenuAssets.FORM_BUTTON.path, MenuAssets.FORM_BUTTON.classType);
-        this.loopAudio = (Sound) assetManager.get(MenuAssets.LOOP_AUDIO.path, MenuAssets.LOOP_AUDIO.classType);
+        music = Gdx.audio.newMusic(Gdx.files.internal(MenuAssets.LOOP_AUDIO.path));
         buttonClickAudio = (Sound) assetManager.get(MenuAssets.BUTTON_CLICK_AUDIO.path, MenuAssets.BUTTON_CLICK_AUDIO.classType);
         transitionAudio = (Sound) assetManager.get(MenuAssets.TRANSITION_AUDIO.path, MenuAssets.TRANSITION_AUDIO.classType);
 
@@ -82,41 +105,144 @@ public class MenuView extends View{
         usernameTextField = new TextField("", skin);
         usernameTextField.setMessageText("Your name ..");
         usernameTextField.setSize(col_width*2, row_height*1);
-        usernameTextField.setPosition(col_width*5-usernameTextField.getMaxWidth(),row_height*6.5f-usernameTextField.getMaxHeight()/2);
-
+        usernameTextField.setPosition(col_width*5-usernameTextField.getMaxWidth(),row_height*8.15f-usernameTextField.getMaxHeight()/2);
 
-        formButton = new TextButton("Enter",skin,"small");
-        formButton.setSize(col_width*2,(float)(row_height*0.5));
-        formButton.setPosition(col_width*6-formButton.getWidth()/2,row_height*5-formButton.getHeight()/2);
+        formButton = new TextButton("Enter",skin,"default");
+        formButton.setPosition(col_width*6-formButton.getWidth()/2,row_height*2.25f-formButton.getHeight()/2);
 
         formImage.setPosition(col_width*6-formImage.getWidth()/2, row_height*6-formImage.getHeight()/2);
 
+        Pixmap tablePixmap = new Pixmap(1,1, Pixmap.Format.RGB565);
+        tablePixmap.setColor(1, 1, 1, 1);
+        tablePixmap.fill();
+        whiteImage = new Image(new Texture(tablePixmap));
+        whiteImage.setSize(Gdx.graphics.getWidth(), Gdx.graphics.getHeight());
+        whiteImage.setPosition(0,0);
+
+        startFadeFromBlankToWhite = false;
+        startFadeFromWhiteToBlank = true;
+
+        music.setVolume(1);
+        music.setLooping(true);
+        music.play();
+        availableAvatars = new ArrayList<>();
+
+        // SPRITES
+        Texture anim_tex_1 = assetManager.get(CharacterAssets.ASIAN_GIRL_ANIM_FRAME1.path, Texture.class);
+        Texture anim_tex_2 = assetManager.get(CharacterAssets.ASIAN_GIRL_ANIM_FRAME2.path, Texture.class);
+        Texture anim_tex_3 = assetManager.get(CharacterAssets.ASIAN_GIRL_ANIM_FRAME3.path, Texture.class);
+        Texture portrait = assetManager.get(CharacterAssets.ASIAN_GIRL_PORTRAIT.path, Texture.class);
+        ArrayList<Texture> anim_tex_arr = new ArrayList<>(Arrays.asList(anim_tex_1, anim_tex_2, anim_tex_3));
+        PlayerAvatar asianGirlAvatar = new PlayerAvatar(anim_tex_arr, portrait, "Small Girl");
+        availableAvatars.add(asianGirlAvatar);
+
+        anim_tex_1 = assetManager.get(CharacterAssets.GRANDMA_ANIM_FRAME1.path, Texture.class);
+        anim_tex_2 = assetManager.get(CharacterAssets.GRANDMA_ANIM_FRAME2.path, Texture.class);
+        anim_tex_3 = assetManager.get(CharacterAssets.GRANDMA_ANIM_FRAME3.path, Texture.class);
+        portrait = assetManager.get(CharacterAssets.GRANDMA_PORTRAIT.path, Texture.class);
+        anim_tex_arr = new ArrayList<>(Arrays.asList(anim_tex_1, anim_tex_2, anim_tex_3));
+        PlayerAvatar grandmaAvatar = new PlayerAvatar(anim_tex_arr, portrait, "Grandma");
+        availableAvatars.add(grandmaAvatar);
+
+        anim_tex_1 = assetManager.get(CharacterAssets.HIGHSCHOOL_GUY_ANIM_FRAME1.path, Texture.class);
+        anim_tex_2 = assetManager.get(CharacterAssets.HIGHSCHOOL_GUY_ANIM_FRAME2.path, Texture.class);
+        anim_tex_3 = assetManager.get(CharacterAssets.HIGHSCHOOL_GUY_ANIM_FRAME3.path, Texture.class);
+        portrait = assetManager.get(CharacterAssets.HIGHSCHOOL_GUY_PORTRAIT.path, Texture.class);
+        anim_tex_arr = new ArrayList<>(Arrays.asList(anim_tex_1, anim_tex_2, anim_tex_3));
+        PlayerAvatar highSchoolGuy = new PlayerAvatar(anim_tex_arr, portrait, "High School Guy");
+        availableAvatars.add(highSchoolGuy);
+
+        anim_tex_1 = assetManager.get(CharacterAssets.HIPSTER_GIRL_ANIM_FRAME1.path, Texture.class);
+        anim_tex_2 = assetManager.get(CharacterAssets.HIPSTER_GIRL_ANIM_FRAME2.path, Texture.class);
+        anim_tex_3 = assetManager.get(CharacterAssets.HIPSTER_GIRL_ANIM_FRAME3.path, Texture.class);
+        portrait = assetManager.get(CharacterAssets.HIPSTER_GIRL_PORTRAIT.path, Texture.class);
+        anim_tex_arr = new ArrayList<>(Arrays.asList(anim_tex_1, anim_tex_2, anim_tex_3));
+        PlayerAvatar hipsterGirl = new PlayerAvatar(anim_tex_arr, portrait, "Fashion Girl");
+        availableAvatars.add(hipsterGirl);
+
+        anim_tex_1 = assetManager.get(CharacterAssets.REGULAR_GUY_ANIM_FRAME1.path, Texture.class);
+        anim_tex_2 = assetManager.get(CharacterAssets.REGULAR_GUY_ANIM_FRAME2.path, Texture.class);
+        anim_tex_3 = assetManager.get(CharacterAssets.REGULAR_GUY_ANIM_FRAME3.path, Texture.class);
+        portrait = assetManager.get(CharacterAssets.REGULAR_GUY_PORTRAIT.path, Texture.class);
+        anim_tex_arr = new ArrayList<>(Arrays.asList(anim_tex_1, anim_tex_2, anim_tex_3));
+        PlayerAvatar regularGuy = new PlayerAvatar(anim_tex_arr, portrait, "Regular Guy");
+        availableAvatars.add(regularGuy);
+
+        anim_tex_1 = assetManager.get(CharacterAssets.ROCKET_GUY_ANIM_FRAME1.path, Texture.class);
+        anim_tex_2 = assetManager.get(CharacterAssets.ROCKET_GUY_ANIM_FRAME2.path, Texture.class);
+        anim_tex_3 = assetManager.get(CharacterAssets.ROCKET_GUY_ANIM_FRAME3.path, Texture.class);
+        portrait = assetManager.get(CharacterAssets.ROCKET_GUY_PORTRAIT.path, Texture.class);
+        anim_tex_arr = new ArrayList<>(Arrays.asList(anim_tex_1, anim_tex_2, anim_tex_3));
+        PlayerAvatar rocketGuy = new PlayerAvatar(anim_tex_arr, portrait, "Rocket Guy");
+        availableAvatars.add(rocketGuy);
+
+        Drawable drawable = new TextureRegionDrawable(new TextureRegion(assetManager.get(MenuAssets.NEXT_AVATAR_BUTTON.path, Texture.class)));
+        nextAvatarButton = new ImageButton(drawable);
+
+        TextureRegion texReg = new TextureRegion(assetManager.get(MenuAssets.NEXT_AVATAR_BUTTON.path, Texture.class));
+        texReg.flip(true,false);
+        Drawable flippedDrawable = new TextureRegionDrawable(texReg);
+        previousAvatarButton = new ImageButton(flippedDrawable);
+
+        Drawable portraitDrawable = new TextureRegionDrawable(new TextureRegion(availableAvatars.get(currentIndexAvatar).getPortrait()));
+        avatarPortraitImage = new Image(portraitDrawable);
+        avatarPortraitImage.setBounds(0, 0, col_width*1.8f, col_width*1.8f);
+
+        avatarPortraitImage.setPosition(formImage.getX()+formImage.getWidth()/2-avatarPortraitImage.getWidth()/2, formImage.getY()+row_height*2);
+        nextAvatarButton.setPosition(avatarPortraitImage.getX()+ avatarPortraitImage.getWidth()+col_width*0.8f-nextAvatarButton.getWidth(), avatarPortraitImage.getY()+ avatarPortraitImage.getHeight()/2-nextAvatarButton.getHeight()/2);
+        previousAvatarButton.setPosition(avatarPortraitImage.getX()-col_width*0.8f, avatarPortraitImage.getY()+ avatarPortraitImage.getHeight()/2-previousAvatarButton.getHeight()/2);
+
+
+        connectionBarImage = new Image(assetManager.get(MenuAssets.CONNECTION_BAR.path, Texture.class));
+        connectionBarGreenCircle = new Image(assetManager.get(MenuAssets.GREEN_CIRCLE_SMALL.path, Texture.class));
+        connectionBarRedCircle = new Image(assetManager.get(MenuAssets.RED_CIRCLE_SMALL.path, Texture.class));
+
+        connectionBarImage.setPosition(Gdx.graphics.getWidth()-connectionBarImage.getWidth(), Gdx.graphics.getHeight()-connectionBarImage.getHeight());
+        connectionBarRedCircle.setPosition(connectionBarImage.getX()+connectionBarImage.getWidth()*0.75f, connectionBarImage.getY()+connectionBarImage.getHeight()/2-connectionBarRedCircle.getHeight()/2);
+        connectionBarGreenCircle.setPosition(connectionBarImage.getX()+connectionBarImage.getWidth()*0.75f, connectionBarImage.getY()+connectionBarImage.getHeight()/2-connectionBarGreenCircle.getHeight()/2);
+
+        previousAvatarButton.addListener(new InputListener(){
+            @Override
+            public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
+                buttonClickAudio.play(0.8f);
+                if(currentIndexAvatar >0){
+                    currentIndexAvatar -= 1;
+                }
+                updateAvatarPortrait();
+                outputLabel.setText("PREV AVATAR: current avatar is: " + currentAvatar);
+                return true;
+            }
+
+        });
+
+        nextAvatarButton.addListener(new InputListener(){
+            @Override
+            public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
+                buttonClickAudio.play(0.8f);
+                if(currentIndexAvatar <availableAvatars.size()-1){
+                    currentIndexAvatar += 1;
+                }
+                updateAvatarPortrait();
+                outputLabel.setText("NEXT AVATAR: current avatar is: " + availableAvatars.get(currentIndexAvatar).getName());
+                return true;
+            }
+        });
 
         // Adding listeners
         formButton.addListener(new InputListener(){
-
             @Override
             public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
                 if(!usernameTextField.equals("Your name ..")){
                     buttonClickAudio.play(0.70f);
                     transitionAudio.play(0.50f);
-                    FrameBuffer fbo;
-                    fbo = new FrameBuffer(Pixmap.Format.RGB888, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false);
-                    fbo.begin();
-                    /*
-                    stage.getBatch().begin();
-                    stage.getBatch().draw(background, 0, 0);
-                    stage.getBatch().draw(form, Gdx.graphics.getWidth()/2-form.getWidth()/2, Gdx.graphics.getHeight()/2-form.getHeight()/2);
-                    stage.getBatch().end();
-                     */
-                    stage.draw();
-                    fbo.end();
-                    gvm.push(new LobbyView(gvm, playerController, assetManager, stage, skin, fbo));
+                    startFadeFromBlankToWhite = true;
+                    whiteImage.setZIndex(stage.getActors().size);
+                    playerController.updateIndexAvatar(currentIndexAvatar);
                 }
                 return true;
             }
         });
-       usernameTextField.addListener(new InputListener(){
+        usernameTextField.addListener(new InputListener(){
             @Override
             public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
                 buttonClickAudio.play(0.8f);
@@ -128,61 +254,68 @@ public class MenuView extends View{
             public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor) {
                 buttonClickAudio.play(0.8f);
                 if(usernameTextField.getText().isEmpty()){
-                    playerController.setPlayerName(usernameTextField.getText());
+                    playerController.getPlayer().setPlayerName(usernameTextField.getText());
                     outputLabel.setText("");
                 }
             }
         });
-
-       //Stratas
-        /*
-        backgroundImage.setZIndex(1);
-        formImage.setZIndex(2);
-        usernameTextField.setZIndex(3);
-        formButton.setZIndex(3);
-        outputLabel.setZIndex(3);
-
-         */
-        //loopAudio.loop(0.9f);
-        // Adding the initial actors in the scene
         stage.addActor(backgroundImage);
+        stage.addActor(connectionBarImage);
+        stage.addActor(connectionBarRedCircle);
         stage.addActor(outputLabel);
         stage.addActor(formImage);
         stage.addActor(usernameTextField);
         stage.addActor(formButton);
-
+        stage.addActor(nextAvatarButton);
+        stage.addActor(previousAvatarButton);
+        stage.addActor(avatarPortraitImage);
+        stage.addActor(whiteImage);
     }
 
+    private void updateAvatarPortrait(){
+        Drawable portraitDrawable = new TextureRegionDrawable(new TextureRegion(availableAvatars.get(currentIndexAvatar).getPortrait()));
+        avatarPortraitImage.setDrawable(portraitDrawable);
+    }
 
     @Override
     public void handleInput() {
-        if(Gdx.input.isTouched()) {
-            int x = Gdx.input.getX();
-            int y = Gdx.input.getY();
-        }/*
-        if(Gdx.input.isButtonJustPressed(1)){
-<<<<<<< HEAD
-            sound.stop();
-            gvm.set(new PlayView(gvm, playerController, assetManager));
-=======
-            music.stop();
-            gvm.set(new PlayView(gvm, super.playerController));
->>>>>>> master
-            dispose();
-        }
-        */
+
     }
 
+
     @Override
     public void update(float dt) {
         assetManager.update();
         stage.act(dt);
         handleInput();
-
     }
 
     @Override
     public void render(float dt) {
+        Gdx.gl.glClearColor(1, 1, 1, 1);
+        if(startFadeFromWhiteToBlank){
+            whiteImage.setColor(1, 1, 1, alphaFadeValue);
+            alphaFadeValue -= dt/(fadeTransitionLength)/0.5;
+            outputLabel.setText("alphaFadeValue: " +alphaFadeValue);
+            if(alphaFadeValue <= 0){
+                startFadeFromWhiteToBlank = false;
+                whiteImage.setZIndex(0);
+            }
+        }
+        else if(startFadeFromBlankToWhite){
+            whiteImage.setColor(1, 1, 1, alphaFadeValue);
+            alphaFadeValue += dt/fadeTransitionLength;
+            outputLabel.setText("alphaFadeValue: " +alphaFadeValue);
+            if(alphaFadeValue >= 1){
+                startFadeFromBlankToWhite = false;
+                gvm.push(new LobbyView(gvm, playerController, assetManager, stage, skin, availableAvatars));
+            }
+        }
+
+        if(playerController.getPlayer() != null){
+            stage.addActor(connectionBarGreenCircle);
+            connectionBarRedCircle.remove();
+        }
         stage.draw();
         drawGrid();
     }
diff --git a/CheckersClient/core/src/com/mygdx/game/views/View.java b/CheckersClient/core/src/com/mygdx/game/views/View.java
index a702c0dcf6db495332d8e3cc5e376636560a53e0..36018df802ea679bbc9c3fe2c24326a063b962a4 100644
--- a/CheckersClient/core/src/com/mygdx/game/views/View.java
+++ b/CheckersClient/core/src/com/mygdx/game/views/View.java
@@ -1,6 +1,7 @@
 package com.mygdx.game.views;
 
 import com.badlogic.gdx.ApplicationAdapter;
+import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.assets.AssetManager;
 import com.badlogic.gdx.graphics.OrthographicCamera;
 import com.badlogic.gdx.math.Vector3;
@@ -13,11 +14,15 @@ public abstract class View extends ApplicationAdapter {
     protected OrthographicCamera cam;
     protected Vector3 mouse;
     protected final GameViewManager gvm;
-    protected PlayerController playerController;
-    protected AssetManager assetManager;
-    protected Stage stage;
+    protected final PlayerController playerController;
+    protected final AssetManager assetManager;
+    protected final Stage stage;
     protected Skin skin;
 
+    public final int Help_Guides = 12;
+    public final int row_height = Gdx.graphics.getHeight() / Help_Guides;
+    public final int col_width = Gdx.graphics.getWidth() / Help_Guides;
+
     protected View(GameViewManager gvm, PlayerController playerController, AssetManager assetManager, Stage stage, Skin skin){
         this.gvm = gvm;
         this.stage = stage;
diff --git a/CheckersClient/core/src/com/mygdx/game/views/enums/CharacterAssets.java b/CheckersClient/core/src/com/mygdx/game/views/enums/CharacterAssets.java
new file mode 100644
index 0000000000000000000000000000000000000000..faa815eedbc5537d6efecfd5fe59f6f9342646a0
--- /dev/null
+++ b/CheckersClient/core/src/com/mygdx/game/views/enums/CharacterAssets.java
@@ -0,0 +1,44 @@
+package com.mygdx.game.views.enums;
+
+import com.badlogic.gdx.graphics.Texture;
+
+public enum CharacterAssets {
+
+    ASIAN_GIRL_ANIM_FRAME1("characters/AsianGirl1@1x.png", Texture.class),
+    ASIAN_GIRL_ANIM_FRAME2("characters/AsianGirl2@1x.png", Texture.class),
+    ASIAN_GIRL_ANIM_FRAME3("characters/AsianGirl3@1x.png", Texture.class),
+    ASIAN_GIRL_PORTRAIT("characters/AsianGirlPortrait@1x.png", Texture.class),
+
+    GRANDMA_ANIM_FRAME1("characters/Grandma1@1x.png", Texture.class),
+    GRANDMA_ANIM_FRAME2("characters/Grandma2@1x.png", Texture.class),
+    GRANDMA_ANIM_FRAME3("characters/Grandma3@1x.png", Texture.class),
+    GRANDMA_PORTRAIT("characters/GrandmaPortrait@1x.png", Texture.class),
+
+    HIGHSCHOOL_GUY_ANIM_FRAME1("characters/HighSchoolGuy1@1x.png", Texture.class),
+    HIGHSCHOOL_GUY_ANIM_FRAME2("characters/HighSchoolGuy2@1x.png", Texture.class),
+    HIGHSCHOOL_GUY_ANIM_FRAME3("characters/HighSchoolGuy3@1x.png", Texture.class),
+    HIGHSCHOOL_GUY_PORTRAIT("characters/HighSchoolGuyPortrait@1x.png", Texture.class),
+
+    HIPSTER_GIRL_ANIM_FRAME1("characters/HipsterGirl1@1x.png", Texture.class),
+    HIPSTER_GIRL_ANIM_FRAME2("characters/HipsterGirl2@1x.png", Texture.class),
+    HIPSTER_GIRL_ANIM_FRAME3("characters/HipsterGirl3@1x.png", Texture.class),
+    HIPSTER_GIRL_PORTRAIT("characters/HipsterGirlPortrait@1x.png", Texture.class),
+
+    REGULAR_GUY_ANIM_FRAME1("characters/RegularGuy1@1x.png", Texture.class),
+    REGULAR_GUY_ANIM_FRAME2("characters/RegularGuy2@1x.png", Texture.class),
+    REGULAR_GUY_ANIM_FRAME3("characters/RegularGuy3@1x.png", Texture.class),
+    REGULAR_GUY_PORTRAIT("characters/RegularGuyPortrait@1x.png", Texture.class),
+
+    ROCKET_GUY_ANIM_FRAME1("characters/RocketGuy1@1x.png", Texture.class),
+    ROCKET_GUY_ANIM_FRAME2("characters/RocketGuy2@1x.png", Texture.class),
+    ROCKET_GUY_ANIM_FRAME3("characters/RocketGuy3@1x.png", Texture.class),
+    ROCKET_GUY_PORTRAIT("characters/RocketGuyPortrait@1x.png", Texture.class);
+
+    public final String path;
+    public final Class classType;
+
+    private CharacterAssets(String menuAssetPath, Class classType) {
+        this.path = menuAssetPath;
+        this.classType = classType;
+    }
+}
\ No newline at end of file
diff --git a/CheckersClient/core/src/com/mygdx/game/views/enums/MenuAssets.java b/CheckersClient/core/src/com/mygdx/game/views/enums/MenuAssets.java
index b4489177112b3c9816ceeab337af0c3fb244280f..3a6f241eebaffbb325068a599752ef4778f7f175 100644
--- a/CheckersClient/core/src/com/mygdx/game/views/enums/MenuAssets.java
+++ b/CheckersClient/core/src/com/mygdx/game/views/enums/MenuAssets.java
@@ -11,7 +11,13 @@ public enum MenuAssets {
     FORM("Menu/1x/MainMenuForm.png", Texture.class),
     LOOP_AUDIO("Menu/MenuLoop.mp3",Sound .class),
     BUTTON_CLICK_AUDIO("Menu/ButtonClick1.mp3",Sound .class),
-    TRANSITION_AUDIO("Menu/1.5s_fade.mp3",Sound .class);
+    TRANSITION_AUDIO("Menu/1.5s_fade.mp3",Sound .class),
+
+    NEXT_AVATAR_BUTTON("Menu/1x/flipButton.png",Texture.class),
+    CONNECTION_BAR("Menu/1x/ConnectionBar.png",Texture.class),
+    GREEN_CIRCLE_SMALL("Menu/1x/GreenCircleSmall.png",Texture.class),
+    RED_CIRCLE_SMALL("Menu/1x/RedCircleSmall.png",Texture.class);
+
 
     public final String path;
     public final Class classType;
diff --git a/CheckersClient/core/src/com/mygdx/game/views/enums/PlayAssets.java b/CheckersClient/core/src/com/mygdx/game/views/enums/PlayAssets.java
new file mode 100644
index 0000000000000000000000000000000000000000..9fee46ac3851906d102cfe957ab88c3bca2471e9
--- /dev/null
+++ b/CheckersClient/core/src/com/mygdx/game/views/enums/PlayAssets.java
@@ -0,0 +1,21 @@
+package com.mygdx.game.views.enums;
+
+import com.badlogic.gdx.audio.Sound;
+import com.badlogic.gdx.graphics.Texture;
+
+
+public enum PlayAssets {
+
+    GAME_BOARD("Game/GameBoard/1x/GameBoard@1x.png", Texture.class),
+    BALL("Game/1x/Ball.png", Texture.class),
+    LOOP_AUDIO("Game/Audio/GameLoop.mp3",Sound.class),
+    TRANSITION_AUDIO("Game/Audio/TransitionFX.mp3",Sound.class);
+
+    public final String path;
+    public final Class classType;
+
+    PlayAssets(String menuAssetPath, Class classType) {
+        this.path = menuAssetPath;
+        this.classType = classType;
+    }
+}
diff --git a/CheckersClient/core/src/com/mygdx/game/views/tokens/PlayerAvatar.java b/CheckersClient/core/src/com/mygdx/game/views/tokens/PlayerAvatar.java
new file mode 100644
index 0000000000000000000000000000000000000000..9d3a3777e46d3bae5cf50bf061fec5fd610a789a
--- /dev/null
+++ b/CheckersClient/core/src/com/mygdx/game/views/tokens/PlayerAvatar.java
@@ -0,0 +1,54 @@
+//
+// Source code recreated from a .class file by IntelliJ IDEA
+// (powered by Fernflower decompiler)
+//
+
+package com.mygdx.game.views.tokens;
+
+import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.graphics.g2d.Sprite;
+import java.util.ArrayList;
+
+public class PlayerAvatar extends Sprite {
+    private final ArrayList<Texture> textureArray;
+    private final Texture portrait;
+    private final String name;
+    private int currentTexture = 0;
+    private boolean reversed = false;
+
+    public PlayerAvatar(ArrayList<Texture> textureArray, Texture portrait, String name) {
+        super(textureArray.get(0));
+        this.textureArray = textureArray;
+        this.portrait = portrait;
+        this.name = name;
+        setTexture(textureArray.get(currentTexture));
+    }
+
+    public void updateTexture() {
+        if (this.reversed) {
+            --this.currentTexture;
+            if (this.currentTexture <= 0) {
+                this.reversed = false;
+            }
+        } else {
+            ++this.currentTexture;
+            if (this.currentTexture == this.textureArray.size() - 1) {
+                this.reversed = true;
+            }
+        }
+        //System.out.println("Updating texture. Current texture Int: " + currentTexture + "  numOfTextures: " + textureArray.size());
+        setTexture(textureArray.get(currentTexture));
+    }
+
+    public ArrayList<Texture> getTextures() {
+        return this.textureArray;
+    }
+
+    public Texture getPortrait() {
+        return this.portrait;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+}
diff --git a/CheckersServer/.idea/caches/build_file_checksums.ser b/CheckersServer/.idea/caches/build_file_checksums.ser
index cded6a6adf181af804787500f203a3a24ec0611d..480a5d2f508b4aad98032d39a6cb4fff257b0c33 100644
Binary files a/CheckersServer/.idea/caches/build_file_checksums.ser and b/CheckersServer/.idea/caches/build_file_checksums.ser differ
diff --git a/CheckersServer/.idea/libraries/Gradle__CheckersServer_core_core_1_0.xml b/CheckersServer/.idea/libraries/Gradle__CheckersServer_core_core_1_0.xml
new file mode 100644
index 0000000000000000000000000000000000000000..50fec341c8000eb96f59c19192ccb94fd1f8912d
--- /dev/null
+++ b/CheckersServer/.idea/libraries/Gradle__CheckersServer_core_core_1_0.xml
@@ -0,0 +1,9 @@
+<component name="libraryTable">
+  <library name="Gradle: CheckersServer.core.core-1.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/core/build/libs/core-1.0.jar!/" />
+    </CLASSES>
+    <JAVADOC />
+    <SOURCES />
+  </library>
+</component>
\ No newline at end of file
diff --git a/CheckersServer/.idea/libraries/Gradle__CheckersServer_desktop_desktop_1_0.xml b/CheckersServer/.idea/libraries/Gradle__CheckersServer_desktop_desktop_1_0.xml
new file mode 100644
index 0000000000000000000000000000000000000000..369215da594e454a7837187b554b3dc8ecc711ec
--- /dev/null
+++ b/CheckersServer/.idea/libraries/Gradle__CheckersServer_desktop_desktop_1_0.xml
@@ -0,0 +1,9 @@
+<component name="libraryTable">
+  <library name="Gradle: CheckersServer.desktop.desktop-1.0">
+    <CLASSES>
+      <root url="jar://$PROJECT_DIR$/desktop/build/libs/desktop-1.0.jar!/" />
+    </CLASSES>
+    <JAVADOC />
+    <SOURCES />
+  </library>
+</component>
\ No newline at end of file
diff --git a/CheckersServer/build.gradle b/CheckersServer/build.gradle
index c5f57c6b5dcd11f5867a795bf1dcec2c4fe27208..5c2215da91e6b1acf38c9b87f66c340d43d3d0f7 100644
--- a/CheckersServer/build.gradle
+++ b/CheckersServer/build.gradle
@@ -10,7 +10,7 @@ buildscript {
         google()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:3.5.4'
+        classpath 'com.android.tools.build:gradle:4.1.3'
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
 
 
diff --git a/CheckersServer/core/src/com/mygdx/game/controller/CameraController.kt b/CheckersServer/core/src/com/mygdx/game/controller/CameraController.kt
deleted file mode 100644
index 132c9615d9d596862f77abe67fd9035d73672b7a..0000000000000000000000000000000000000000
--- a/CheckersServer/core/src/com/mygdx/game/controller/CameraController.kt
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.mygdx.game.controller
-
-class CameraController {
-}
\ No newline at end of file
diff --git a/CheckersServer/core/src/com/mygdx/game/controller/NetworkController.java b/CheckersServer/core/src/com/mygdx/game/controller/NetworkController.java
index 18c9ad7015af7207b2eeee3a46afa3d8edbbf8ff..5520677151edabdba4005f42c891100d79aac05d 100644
--- a/CheckersServer/core/src/com/mygdx/game/controller/NetworkController.java
+++ b/CheckersServer/core/src/com/mygdx/game/controller/NetworkController.java
@@ -10,11 +10,12 @@ import com.mygdx.game.model.Player;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.HashSet;
 
 public class NetworkController {
 
-    private final int MAX_PLAYERS = 2;
-    private final int MAX_LOBBIES = 2;
+    private final int MAX_PLAYERS = 8;
+    private final int MAX_LOBBIES = 40;
 
     private ArrayList<Player> players;
     private ArrayList<Lobby> lobbies;
@@ -47,14 +48,23 @@ public class NetworkController {
                 }
             }
             public void disconnected (Connection connection) {
+                for (Lobby lobby : getLobbies()){
+                    for (int playerId: lobby.getPlayersID()){
+                        if(connection.getID() == playerId){
+                            System.out.println("Aye captain");
+                           //leaveLobby(connection.getID(),lobby.getID());
+                           //if(lobby.getPlayersCount()==0) deleteLobby(lobby.getID());
+                        }
+                    }
+                }
                 playerKick(connection.getID());
             }
         });
     }
 
-    public Player playerJoin(int newID){
+    public Player playerJoin(int newID, int indexAvatar){
         if(players.size() < MAX_PLAYERS){
-            Player player = new Player(newID);
+            Player player = new Player(newID, indexAvatar);
             players.add(player);
             return player;
         }
@@ -63,13 +73,24 @@ public class NetworkController {
 
     public void playerKick(int id){
         int index = players.indexOf(new Player(id));
-        if (index!= -1) players.remove(index);
+        if (index!= -1) {
+            for(Lobby lobby : lobbies){
+                if(lobby.getPlayersID().contains(id)){
+                    ArrayList<Connection> connections = getConnections(lobby);
+                    cLobbyLeave command =  new cLobbyLeave(leaveLobby(id, lobby.getID()));
+                    for(Connection c : connections){
+                        c.sendTCP(command);
+                    }
+                }
+            }
+            players.remove(index);
+        }
     }
 
-    public Lobby createLobby(int MAX_PLAYERS){
+    public Lobby createLobby(String name, int MAX_PLAYERS){
         if(lobbies.size() < MAX_LOBBIES){
             lobby_id++;
-            Lobby lobby = new Lobby(lobby_id, MAX_PLAYERS);
+            Lobby lobby = new Lobby(lobby_id, name, MAX_PLAYERS);
             lobbies.add(lobby);
             return lobby;
         }
@@ -83,36 +104,50 @@ public class NetworkController {
     }
 
     public Lobby joinLobby(int playerID, int lobbyID){
-        int lobby_idx = lobbies.indexOf(new Lobby(lobbyID));
-        int player_idx =  players.indexOf(new Player(playerID));
-        if (lobby_idx != -1 && player_idx != -1) {
-            Lobby lobby = lobbies.get(lobby_idx);
-            Player player = players.get(player_idx);
+        Lobby lobby = getLobby(lobbyID);
+        Player player = getPlayer(playerID);
+        if (lobby.getID() != -1 && player.getID() != -1) {
             if(lobby.playerJoin(player) != -1){
-                lobbies.set(lobby_idx, lobby);
+                lobbies.set(lobbies.indexOf(lobby), lobby);
                 return lobby;
             }
         }
         return new Lobby(-1);
     }
 
-    public int leaveLobby(int playerID, int lobbyID){
-        int lobby_idx = lobbies.indexOf(new Lobby(lobbyID));
-        int player_idx =  players.indexOf(new Player(playerID));
-        if (lobby_idx != -1 && player_idx != -1) {
-            Lobby lobby = lobbies.get(lobby_idx);
-            Player player = players.get(player_idx);
+    public Lobby leaveLobby(int playerID, int lobbyID){
+        Lobby lobby = getLobby(lobbyID);
+        Player player = getPlayer(playerID);
+        if (lobby.getID() != -1 && player.getID() != -1) {
             if(lobby.playerKick(player) != -1){
-                if(lobby.getPlayersCount() == 0) deleteLobby(lobby_idx);
-                else lobbies.set(lobby_idx, lobby);
-                return 0;
+                if(lobby.getPlayersCount() == 0) deleteLobby(lobbyID);
+                else lobbies.set(lobbies.indexOf(lobby), lobby);
+                return lobby;
             }
         }
-        return -1;
+        return new Lobby(-1);
+    }
+
+    public Lobby getLobby(int lobbyID){
+        int lobby_idx = lobbies.indexOf(new Lobby(lobbyID));
+        if (lobby_idx != -1){
+            return lobbies.get(lobby_idx);
+        }
+        return new Lobby(-1);
+    }
+
+    public Player getPlayer(int playerID){
+        int player_idx =  players.indexOf(new Player(playerID));
+        if (player_idx != -1){
+            return players.get(player_idx);
+        }
+        return new Player(-1);
     }
 
     public ArrayList<Lobby> getLobbies(){ return lobbies; }
 
+    public ArrayList<Player> getPlayers(){ return players; }
+
     public void registerClasses(){
         kryo.register(ArrayList.class, 100);
         kryo.register(Lobby.class, 5);
@@ -125,10 +160,18 @@ public class NetworkController {
         kryo.register(cLobbyLeave.class, 22);
         kryo.register(cLobbyDelete.class, 23);
         kryo.register(cLobbyGetList.class, 24);
+        kryo.register(cSetIndexAvatar.class, 25);
     }
 
     public NetworkController getNetworkController() { return this; }
 
-    public Connection[] getConnections(){ return server.getConnections(); }
+    public ArrayList<Connection> getConnections(Lobby lobby){
+        HashSet<Integer> players_id = lobby.getPlayersID();
+        ArrayList<Connection> connections = new ArrayList<Connection>();
+        for (Connection c : server.getConnections()) {
+            if (players_id.contains((Integer) c.getID())) connections.add(c);
+        }
+        return connections;
+    }
 
 }
diff --git a/CheckersServer/core/src/com/mygdx/game/controller/commands/cLobbyCreate.java b/CheckersServer/core/src/com/mygdx/game/controller/commands/cLobbyCreate.java
index e0a85104aacf5e6967b3de07f8ae197eb8a16f60..06c2633c9e2718e9766088afad23cf65728902cc 100644
--- a/CheckersServer/core/src/com/mygdx/game/controller/commands/cLobbyCreate.java
+++ b/CheckersServer/core/src/com/mygdx/game/controller/commands/cLobbyCreate.java
@@ -6,6 +6,8 @@ import com.mygdx.game.controller.commands.Command;
 import com.mygdx.game.model.Lobby;
 import com.mygdx.game.model.Player;
 
+import java.util.ArrayList;
+
 public class cLobbyCreate extends Command {
 
     public cLobbyCreate() { super("cLobbyCreate"); }
@@ -14,9 +16,10 @@ public class cLobbyCreate extends Command {
 
     @Override
     public void execute(NetworkController net, Connection connection){
-        if(data instanceof Integer){
-            int MAX_PLAYERS = (int) data;
-            data = net.createLobby(MAX_PLAYERS);
+        if(data instanceof ArrayList){
+            String name = (String) ((ArrayList) data).get(0);
+            int MAX_PLAYERS = (int) ((ArrayList) data).get(1);
+            data = net.createLobby(name, MAX_PLAYERS);
             System.out.printf("Request to create lobby received. Returning Lobby w. ID: %d \n", ((Lobby)data).getID());
             connection.sendTCP(this);
         }
diff --git a/CheckersServer/core/src/com/mygdx/game/controller/commands/cLobbyDelete.java b/CheckersServer/core/src/com/mygdx/game/controller/commands/cLobbyDelete.java
index 09736981208b8473d4c22158ceb726f9be2c91fb..029006dfdf6409a238319fef327e5c869f907c43 100644
--- a/CheckersServer/core/src/com/mygdx/game/controller/commands/cLobbyDelete.java
+++ b/CheckersServer/core/src/com/mygdx/game/controller/commands/cLobbyDelete.java
@@ -14,23 +14,14 @@ public class cLobbyDelete extends Command{
     public void execute(NetworkController net, Connection connection){
         if(data instanceof Integer) {
             int lobby_id = (int) data;
-            int lobby_idx = net.getLobbies().indexOf(new Lobby(lobby_id));
-            if (lobby_idx != -1) {
-                //Notify all players in the lobby
-                Lobby lobby = net.getLobbies().get(lobby_idx);
-                HashSet<Integer> players_id = lobby.getPlayersID();
-                data = (Integer) net.deleteLobby(lobby_id);
-                for (Connection c : net.getConnections()) {
-                    if (players_id.contains((Integer) c.getID())) c.sendTCP(this);
-                }
-            }
-            else {
-                //Notify the sender only
-                data = (Integer) net.deleteLobby(lobby_id);
-                connection.sendTCP(this);
-            }
+            Lobby lobby = net.getLobby(lobby_id);
+            //Notify all players in the lobby
+            data = (Integer) net.deleteLobby(lobby_id);
             System.out.printf("Request from Player w. ID: %d to delete Lobby w. ID: %d. Returning code: %d \n",
                     connection.getID(), lobby_id, ((Integer) data));
+            for (Connection c : net.getConnections(lobby)) {
+                c.sendTCP(this);
+            }
         }
     }
 }
diff --git a/CheckersServer/core/src/com/mygdx/game/controller/commands/cLobbyGetList.java b/CheckersServer/core/src/com/mygdx/game/controller/commands/cLobbyGetList.java
index b49e1547e05e03677e92cb7d6e57731a9dec7fd6..6ccd56a74c4d2f52823b12bc1e2627b77048e14d 100644
--- a/CheckersServer/core/src/com/mygdx/game/controller/commands/cLobbyGetList.java
+++ b/CheckersServer/core/src/com/mygdx/game/controller/commands/cLobbyGetList.java
@@ -16,5 +16,6 @@ public class cLobbyGetList extends Command{
         data = net.getLobbies();
         System.out.printf("Request to get list of lobbies from Client. Returning: %s \n", data.toString());
         connection.sendTCP(this);
+        System.out.println("Number of available lobbies" + net.getLobbies().size());
     }
 }
diff --git a/CheckersServer/core/src/com/mygdx/game/controller/commands/cLobbyJoin.java b/CheckersServer/core/src/com/mygdx/game/controller/commands/cLobbyJoin.java
index 6cb5990df1c0873976f41488d239ec621bed8d71..e27c87eb04923377c80eea1d421a2d05ec27327f 100644
--- a/CheckersServer/core/src/com/mygdx/game/controller/commands/cLobbyJoin.java
+++ b/CheckersServer/core/src/com/mygdx/game/controller/commands/cLobbyJoin.java
@@ -17,7 +17,9 @@ public class cLobbyJoin extends Command{
             data = net.joinLobby(connection.getID(), lobby_id);
             System.out.printf("Request from Player w. ID: %d to join Lobby w. ID: %d. Returning Lobby w. ID: %d \n",
                     connection.getID(), lobby_id, ((Lobby)data).getID());
-            connection.sendTCP(this);
+            for (Connection c : net.getConnections(net.getLobby(lobby_id))) {
+                c.sendTCP(this);
+            }
         }
     }
 }
diff --git a/CheckersServer/core/src/com/mygdx/game/controller/commands/cLobbyLeave.java b/CheckersServer/core/src/com/mygdx/game/controller/commands/cLobbyLeave.java
index 12ff2fa5f909ba25b1c94f7ec6b61c8cf9da0ffa..f8665622965d4e6a4606a3fe930f7cf786c62e55 100644
--- a/CheckersServer/core/src/com/mygdx/game/controller/commands/cLobbyLeave.java
+++ b/CheckersServer/core/src/com/mygdx/game/controller/commands/cLobbyLeave.java
@@ -4,20 +4,27 @@ import com.esotericsoftware.kryonet.Connection;
 import com.mygdx.game.controller.NetworkController;
 import com.mygdx.game.model.Lobby;
 
+import java.util.ArrayList;
 import java.util.HashSet;
 
 public class cLobbyLeave extends Command{
 
     public cLobbyLeave() { super("cLobbyLeave"); }
 
+    public cLobbyLeave(Lobby lobby) { super("cLobbyLeave", lobby); }
+
     @Override
     public void execute(NetworkController net, Connection connection){
         if(data instanceof Integer) {
             int lobby_id = (int) data;
-            data = (Integer) net.leaveLobby(connection.getID(),lobby_id);
-            System.out.printf("Request from Player w. ID: %d to leave Lobby w. ID: %d. Returning code: %d \n",
-                    connection.getID(), lobby_id, ((Integer)data));
-            connection.sendTCP(this);
+            Lobby lobby = net.getLobby(lobby_id);
+            ArrayList<Connection> connections = net.getConnections(lobby);
+            data = net.leaveLobby(connection.getID(),lobby_id);
+            System.out.printf("Request from Player w. ID: %d to leave Lobby w. ID: %d. Returning Lobby w. ID: %d \n",
+                    connection.getID(), lobby_id, ((Lobby)data).getID());
+            for (Connection c : connections) {
+                c.sendTCP(this);
+            }
         }
     }
 }
diff --git a/CheckersServer/core/src/com/mygdx/game/controller/commands/cPlayerJoin.java b/CheckersServer/core/src/com/mygdx/game/controller/commands/cPlayerJoin.java
index 5bca00f6ca8b356c64af42ec2c8fe08f67097dc3..c99cadce1f7c244f7dd26c2586647b8326fb577d 100644
--- a/CheckersServer/core/src/com/mygdx/game/controller/commands/cPlayerJoin.java
+++ b/CheckersServer/core/src/com/mygdx/game/controller/commands/cPlayerJoin.java
@@ -14,9 +14,12 @@ public class cPlayerJoin extends Command {
 
     @Override
     public void execute(NetworkController net, Connection connection){
-        data = net.playerJoin(connection.getID());
-        System.out.printf("Request to join from Client. Returning ID: %d \n", ((Player)data).getID());
-        connection.sendTCP(this);
-        if(((Player)data).getID() == -1) connection.close();
+        if (data instanceof Integer){
+            int indexAvatar = (int) data;
+            data = net.playerJoin(connection.getID(), indexAvatar);
+            System.out.printf("Request to join from Client. Returning ID: %d \n", ((Player)data).getID());
+            connection.sendTCP(this);
+            if(((Player)data).getID() == -1) connection.close();
+        }
     }
 }
diff --git a/CheckersServer/core/src/com/mygdx/game/controller/commands/cSetIndexAvatar.java b/CheckersServer/core/src/com/mygdx/game/controller/commands/cSetIndexAvatar.java
new file mode 100644
index 0000000000000000000000000000000000000000..a3dc1e88d5891fc0ee138c48e3186c142c6b39b3
--- /dev/null
+++ b/CheckersServer/core/src/com/mygdx/game/controller/commands/cSetIndexAvatar.java
@@ -0,0 +1,35 @@
+package com.mygdx.game.controller.commands;
+
+import com.esotericsoftware.kryonet.Connection;
+import com.mygdx.game.controller.NetworkController;
+import com.mygdx.game.model.Player;
+
+import java.util.HashSet;
+
+public class cSetIndexAvatar extends Command {
+
+    public cSetIndexAvatar() { super("cLobbyJoin"); }
+
+    public cSetIndexAvatar(int indexAvatar) {
+        super("cSetIndexAvatar", indexAvatar);
+    }
+
+    @Override
+    public void execute(NetworkController net, Connection connection){
+        if(data instanceof Integer){
+            int indexAvatar = (int) data;
+            if (indexAvatar == -1) System.out.println("Failed to set index avatar.");
+            else {
+                for (Player p : net.getPlayers()) {
+                    if(p.getID() == connection.getID()){
+                        p.setIndexAvatar(indexAvatar);
+                        connection.sendTCP(this);
+                    }
+                    else{
+                        connection.sendTCP(new cSetIndexAvatar(-1));
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/CheckersServer/core/src/com/mygdx/game/managers/ViewManager.kt b/CheckersServer/core/src/com/mygdx/game/managers/ViewManager.kt
deleted file mode 100644
index 1313b07b8081f83d858636c649b39a408cf1ed81..0000000000000000000000000000000000000000
--- a/CheckersServer/core/src/com/mygdx/game/managers/ViewManager.kt
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.mygdx.game.managers
-
-class ViewManager {
-}
\ No newline at end of file
diff --git a/CheckersServer/core/src/com/mygdx/game/model/Lobby.java b/CheckersServer/core/src/com/mygdx/game/model/Lobby.java
index d558e7b2bb432894d846e8986a90bc1bb192f317..57eb0c96655bf2236e828692b88130fc4000b314 100644
--- a/CheckersServer/core/src/com/mygdx/game/model/Lobby.java
+++ b/CheckersServer/core/src/com/mygdx/game/model/Lobby.java
@@ -6,6 +6,7 @@ import java.util.HashSet;
 public class Lobby {
 
     private int ID;
+    private String name;
     private int MAX_PLAYERS;
     private ArrayList<Player> players;
 
@@ -16,14 +17,15 @@ public class Lobby {
         players = new ArrayList<Player>();
     }
 
-    public Lobby(int ID, int MAX_PLAYERS){
+    public Lobby(int ID, String name, int MAX_PLAYERS){
         this.ID = ID;
+        this.name = name;
         this.MAX_PLAYERS = MAX_PLAYERS;
         players = new ArrayList<Player>();
     }
 
     public int playerJoin(Player player){
-        if(players.size() < MAX_PLAYERS){
+        if(players.size() < MAX_PLAYERS && !getPlayersID().contains(player.getID())){
             players.add(player);
             return 0;
         }
@@ -62,6 +64,7 @@ public class Lobby {
     public String toString() {
         return "Lobby{" +
                 "ID=" + ID +
+                ", name='" + name + '\'' +
                 ", MAX_PLAYERS=" + MAX_PLAYERS +
                 ", players=" + players +
                 '}';
diff --git a/CheckersServer/core/src/com/mygdx/game/model/Player.java b/CheckersServer/core/src/com/mygdx/game/model/Player.java
index dcdbf53880bf6148551ec35aeb51bf52d017b6e2..2797bc0136acc153b84b08f80ef547ddf9e8b8fe 100644
--- a/CheckersServer/core/src/com/mygdx/game/model/Player.java
+++ b/CheckersServer/core/src/com/mygdx/game/model/Player.java
@@ -3,11 +3,16 @@ package com.mygdx.game.model;
 public class Player {
 
     private int ID;
+    private int indexAvatar;
+    private String playerName;
 
     public Player(){}
 
-    public Player(int ID){
+    public Player(int ID){ this.ID = ID; }
+
+    public Player(int ID, int indexAvatar){
         this.ID = ID;
+        this.indexAvatar = indexAvatar;
     }
 
     public int getID(){ return ID; }
@@ -27,4 +32,15 @@ public class Player {
                 '}';
     }
 
+    public void setIndexAvatar(int indexAvatar){
+        this.indexAvatar = indexAvatar;
+    }
+
+    public int getPlayerAvatar(int indexAvatar){
+        return this.indexAvatar;
+    }
+
+    public void setPlayerName(String playerName) {
+        this.playerName = playerName;
+    }
 }
diff --git a/CheckersServer/core/src/com/mygdx/game/singletons/AssetLoader.kt b/CheckersServer/core/src/com/mygdx/game/singletons/AssetLoader.kt
deleted file mode 100644
index 18c8c08a3333370e4e003f0b0019270a5f8fe7c7..0000000000000000000000000000000000000000
--- a/CheckersServer/core/src/com/mygdx/game/singletons/AssetLoader.kt
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.mygdx.game.singletons
-
-class AssetLoader {
-}
\ No newline at end of file
diff --git a/CheckersServer/core/src/com/mygdx/game/views/AbstractView.kt b/CheckersServer/core/src/com/mygdx/game/views/AbstractView.kt
deleted file mode 100644
index a6cdbeb1eb6158a79c848759219690491cb88d41..0000000000000000000000000000000000000000
--- a/CheckersServer/core/src/com/mygdx/game/views/AbstractView.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.mygdx.game.views
-
-abstract class AbstractView {
-
-}
\ No newline at end of file
diff --git a/CheckersServer/core/src/com/mygdx/game/views/JoinView.kt b/CheckersServer/core/src/com/mygdx/game/views/JoinView.kt
deleted file mode 100644
index 2564b4066b150acea47b864812f917a1d1c0f90a..0000000000000000000000000000000000000000
--- a/CheckersServer/core/src/com/mygdx/game/views/JoinView.kt
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.mygdx.game.views
-
-class JoinView {
-}
\ No newline at end of file
diff --git a/CheckersServer/core/src/com/mygdx/game/views/LoadingView.kt b/CheckersServer/core/src/com/mygdx/game/views/LoadingView.kt
deleted file mode 100644
index 817f848849cfb382d9c19f2b617598acb4bb8bce..0000000000000000000000000000000000000000
--- a/CheckersServer/core/src/com/mygdx/game/views/LoadingView.kt
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.mygdx.game.views
-
-class LoadingView : WaitingView() {
-}
\ No newline at end of file
diff --git a/CheckersServer/core/src/com/mygdx/game/views/LobbyView.kt b/CheckersServer/core/src/com/mygdx/game/views/LobbyView.kt
deleted file mode 100644
index 0db2ca11a2a33c8425cc298d64d333bca1d07b48..0000000000000000000000000000000000000000
--- a/CheckersServer/core/src/com/mygdx/game/views/LobbyView.kt
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.mygdx.game.views
-
-class LobbyView {
-}
\ No newline at end of file
diff --git a/CheckersServer/core/src/com/mygdx/game/views/LoginView.kt b/CheckersServer/core/src/com/mygdx/game/views/LoginView.kt
deleted file mode 100644
index c7557ddd383976a73e3af964301a27618e395cbe..0000000000000000000000000000000000000000
--- a/CheckersServer/core/src/com/mygdx/game/views/LoginView.kt
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.mygdx.game.views
-
-class LoginView {
-}
\ No newline at end of file
diff --git a/CheckersServer/core/src/com/mygdx/game/views/WaitingView.kt b/CheckersServer/core/src/com/mygdx/game/views/WaitingView.kt
deleted file mode 100644
index 38edc85c3f81329ca929b58ba92e46a6e4c9f1bf..0000000000000000000000000000000000000000
--- a/CheckersServer/core/src/com/mygdx/game/views/WaitingView.kt
+++ /dev/null
@@ -1,4 +0,0 @@
-package com.mygdx.game.views
-
-open class WaitingView{
-}
\ No newline at end of file