diff --git a/pom.xml b/pom.xml
index fd49aa2d5cd023c2a8e021a3cfa1610101746843..00cecae4b603bb2ef7a769e8effa5db5010b47d5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -94,6 +94,7 @@
             <artifactId>gson</artifactId>
             <version>2.10.1</version>
         </dependency>
+
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/AccountType.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/AccountType.java
deleted file mode 100644
index 145d7a4f6f54bad787231fc80b276a2abaae261b..0000000000000000000000000000000000000000
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/AccountType.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes;
-
-public enum AccountType {
-
-    NONE,
-    LOCAL,
-    ONLINE
-
-}
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/AccountType.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/AccountType.java
new file mode 100644
index 0000000000000000000000000000000000000000..4ddb26cd2de6356b40b45af16dad0b9dfeb7f4d8
--- /dev/null
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/AccountType.java
@@ -0,0 +1,9 @@
+package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs;
+
+public enum AccountType {
+
+    NONE,
+    LOCAL,
+    ONLINE
+
+}
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/MapType.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/MapType.java
new file mode 100644
index 0000000000000000000000000000000000000000..8403ea2c46b21e5b8349917316f7414eb1a74710
--- /dev/null
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/MapType.java
@@ -0,0 +1,8 @@
+package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs;
+
+public enum MapType {
+
+    COREMAP,
+    COMMUNITYMAP
+
+}
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/ThreadStatus.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/ThreadStatus.java
new file mode 100644
index 0000000000000000000000000000000000000000..fb75fb7eef6bf215cb9545b3e455c243d5ef4123
--- /dev/null
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ENUMs/ThreadStatus.java
@@ -0,0 +1,9 @@
+package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs;
+
+public enum ThreadStatus {
+
+    RUNNING,
+    FAILED,
+    FINISHED
+
+}
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/GsonHandler.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/GsonHandler.java
index 308b553a68422590c8a0619baa336e91ee513bb2..0b6bb2a2974338947bbbd2a7f299ef52077dfd59 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/GsonHandler.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/GsonHandler.java
@@ -3,6 +3,7 @@ package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import com.google.gson.reflect.TypeToken;
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.MapType;
 import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions.GSONException;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -145,5 +146,4 @@ public class GsonHandler {
         }
     }
 
-
 }
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/MapType.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/MapType.java
deleted file mode 100644
index d7738b3c5205d4f217e2a27f0e88578cc34f6fa1..0000000000000000000000000000000000000000
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/MapType.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes;
-
-public enum MapType {
-
-    COREMAP,
-    COMMUNITYMAP
-
-}
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Persistence.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Persistence.java
index 638529da884c6bd83ae1f34bf67c653b6c73b89e..a27908ba0c61f640c24d0b1b8b788bfa0a52b8be 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Persistence.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Persistence.java
@@ -1,5 +1,7 @@
 package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes;
 
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.AccountType;
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.MapType;
 import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions.GSONException;
 import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions.ParserException;
 import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions.SQLException;
@@ -22,7 +24,7 @@ public class Persistence {
     private PlayerStatistics statistics;
     private PlayerAccount account;
     private AppSettings settings;
-    protected ArrayList<MapInfo> communityMapsListRemote;  //for community map browser
+    private ArrayList<MapInfo> communityMapsListRemote;  //for community map browser
 
 
 
@@ -170,24 +172,6 @@ public class Persistence {
         }
     }
 
-/*    public MapData getGameMap(String mapSelected, boolean choseCoremaps) throws DatabaseException{
-        String mapID = mapSelected.substring(mapSelected.indexOf("(") + 1, mapSelected.length() - 1);
-        if (choseCoremaps) {
-            for (int index = 0; index < coreMaps.size(); index++) {
-                if (coreMaps.get(index).getMapID().equals(mapID)) {
-                    return coreMaps.get(index);
-                }
-            }
-        } else {
-            for (int index = 0; index < communityMaps.size(); index++) {
-                if (communityMaps.get(index).getMapID().equals(mapID)) {
-                    return coreMaps.get(index);
-                }
-            }
-        }
-        throw new DatabaseException("Database error - Map not found!");
-    }*/
-
     public void saveSettings(){
         try{
         gsonHandler.saveSettings(settings);
@@ -211,7 +195,8 @@ public class Persistence {
         }
     }
 
-    public void saveCreatedMapLocally(MapData map) throws DatabaseException {
+    public void saveCreatedMap(MapData map, boolean doUpload) throws DatabaseException {
+        String part1 = "";
         try {
             for(int i = 0; communityMaps.size() > i; i++){
                 if(communityMaps.get(i).getMapID().equals(map.getMapID())){
@@ -220,51 +205,50 @@ public class Persistence {
             }
             communityMaps.add(map);
             gsonHandler.saveMaps(communityMaps, MapType.COMMUNITYMAP);
-            //createLocalCommunityMapsList();
             log.info("Newly created map stored successfully in JSON!");
         }
         catch(Exception e){
             log.error(e);
-            if(e.getMessage().contains("Identical map already saved") | e.getMessage().contains("ORA-01017")){
-                throw new DatabaseException(e.getMessage());
-            }
-            else{
-                throw new DatabaseException("Unknown Database Error. Saving newly created Community-Map locally failed!");
+            if(e.getMessage().contains("Identical map already saved")){
+                part1 = e.getMessage();
+            }
+        }
+        if(doUpload) {
+            try {
+                db.uploadCommunityMap(map);
+                log.info("Newly created Community-Map successfully published!");
+            }
+            catch (Exception e) {
+                log.error(e);
+                if (e.getMessage().contains("ORA-17868") | e.getMessage().contains("ORA-01017")) {
+                    throw new DatabaseException(part1 + "\nNo connection to SQL server! Saving to SQL communityMap server failed!");
+                } else if (e.getMessage().contains("ORA-00001")) {
+                    throw new DatabaseException(part1 + "\nMap already existing on communityMaps server!\n Look for mapID: " + map.getMapID());
+                } else {
+                    throw new DatabaseException(part1 + "\nUnknown Database Error. Saving to SQL communityMap server failed!");
+                }
             }
         }
     }
 
-    public void uploadCreatedMap(MapData map) throws DatabaseException {
+    public void updatePlayerStatistics(int kills, int deaths, int gameTime, int blocksDestroyed, boolean gameWon) throws DatabaseException{  //after game round
         try {
-            db.uploadCommunityMap(map);
-            log.info("Newly created Community-Map successfully published!");
-        }
-        catch(Exception e){
-            log.error(e);
-            if(e.getMessage().contains("ORA-17868") | e.getMessage().contains("ORA-01017")){
-                throw new DatabaseException("No connection to SQL server!");
-            }
-            else if(e.getMessage().contains("ORA-00001")){
-                throw new DatabaseException("Map already existing on communityMaps server!\n Look for mapID: " + map.getMapID());
+            Parser.playerStatsValid(new PlayerStatistics(0, 0, kills, deaths, blocksDestroyed, gameTime)); //temp instance of PLayerStatistics to validate new values
+            statistics.addKills(kills);
+            statistics.addDeaths(deaths);
+            statistics.addGameTime(gameTime);
+            statistics.addBlocksDestroyed(blocksDestroyed);
+            if(gameWon){
+                statistics.addGamesWon();
             }
             else{
-                throw new DatabaseException("Unknown Database Error. Saving to SQL communityMap server failed!");
+                statistics.addGamesLost();
             }
+            log.info("Statistics successfully updated!");
         }
-    }
-
-    public void updatePlayerStatistics(int kills, int deaths, int gameTime, int blocksDestroyed, boolean gameWon) throws DatabaseException{  //after game round
-        statistics.addKills(kills);
-        statistics.addDeaths(deaths);
-        statistics.addGameTime(gameTime);
-        statistics.addBlocksDestroyed(blocksDestroyed);
-        if(gameWon){
-            statistics.addGamesWon();
-        }
-        else{
-            statistics.addGamesLost();
+        catch(Exception e){
+            log.error(e);
         }
-        log.info("Statistics successfully updated!");
     }
 
     public void createAccount(String playerName, String password, AccountType type) throws DatabaseException {
@@ -331,7 +315,7 @@ public class Persistence {
                     throw new DatabaseException("Locally stored password does not match online password. Please reenter credentials!");
                 }
             }
-            else{   //überflüssig, da GSON schon beim laden der Daten meckern würde, wenn er den Accounttype nicht finden kann
+            else{   //eigentlich überflüssig, da GSON schon beim Laden der Daten meckern würde, wenn er den Accounttype nicht finden kann
                 throw new DatabaseException("AccountType invalid - accountData corrupted! Please create new Account or login with existing!");
             }
             log.info("Player account successfully verified!");
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/PlayerAccount.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/PlayerAccount.java
index a028edd30e66fc1116615efb7764503e3746469a..ae1e60649de3d31e4a1b99e70de92a9bfbfe0c53 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/PlayerAccount.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/PlayerAccount.java
@@ -1,5 +1,7 @@
 package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes;
 
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.AccountType;
+
 public class PlayerAccount {
 
     private String playerName;
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/RuntimeInfo.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/RuntimeInfo.java
index 14d1a3995c5cc6e831b18324cd91f745b58bdc1b..5564faa20622c1380dbaaaf80e2df616cebe5c7d 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/RuntimeInfo.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/RuntimeInfo.java
@@ -2,6 +2,7 @@ package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes;
 
 import de.hdm_stuttgart.battlearena.Controller.Enum.GameMode;
 import de.hdm_stuttgart.battlearena.Controller.Enum.GameState;
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.ThreadStatus;
 import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions.ParserException;
 import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Utilities.HashGenerator;
 import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Utilities.Parser;
@@ -23,6 +24,39 @@ public class RuntimeInfo {
     private EntityClass playerOneClass = EntityClass.HUMAN;
     private EntityClass playerTwoClass = EntityClass.HUMAN;
 
+    //Thread Status-Updates
+    private ThreadStatus threadStartup1;
+    private String threadStartup1Msg;
+    private ThreadStatus threadStartup2;
+    private String threadStartup2Msg;
+    private ThreadStatus threadUpdateMaps;
+    private String threadUpdateMapsMsg;
+    private ThreadStatus threadUpdateStats;
+    private String threadUpdateStatsMsg;
+    private ThreadStatus threadDLCommMap;
+    private String threadDLCommMapMsg;
+    private ThreadStatus threadSaveCommMap;
+    private String threadSaveCommMapMsg;
+    private ThreadStatus threadCommMapList;
+    private String threadCommMapListMsg;
+    private ThreadStatus threadRstStats;
+    private String threadRstStatsMsg;
+    private ThreadStatus threadSaveStats;
+    private String threadSaveStatsMsg;
+    private ThreadStatus threadCreateAcc;
+    private String threadCreateAccMsg;
+
+    //Stats Tracking during Gameplay
+    private int kills;
+    private int deaths;
+    private int blocksDestroyed;
+    private int gameTime;
+    private boolean gameWon;
+
+
+
+
+
 
     private RuntimeInfo(){};
 
@@ -30,10 +64,6 @@ public class RuntimeInfo {
         return runtimeInfoSingleton;
     }
 
-    public String getMapDataGame() {
-        return mapDataGame;
-    }
-
     public MapData generateMap(String mapName, String mapData) throws ParserException {
         try {
             Parser.mapDataValid(mapData);
@@ -88,4 +118,208 @@ public class RuntimeInfo {
         this.playerTwoClass = playerTwoClass;
     }
 
+    public String getMapDataGame() {
+        return mapDataGame;
+    }
+
+    public ThreadStatus getThreadStartup1() {
+        return threadStartup1;
+    }
+
+    public void setThreadStartup1(ThreadStatus threadStartup1) {
+        this.threadStartup1 = threadStartup1;
+    }
+
+    public String getThreadStartup1Msg() {
+        return threadStartup1Msg;
+    }
+
+    public void setThreadStartup1Msg(String threadStartup1Msg) {
+        this.threadStartup1Msg = threadStartup1Msg;
+    }
+
+    public ThreadStatus getThreadStartup2() {
+        return threadStartup2;
+    }
+
+    public void setThreadStartup2(ThreadStatus threadStartup2) {
+        this.threadStartup2 = threadStartup2;
+    }
+
+    public String getThreadStartup2Msg() {
+        return threadStartup2Msg;
+    }
+
+    public void setThreadStartup2Msg(String threadStartup2Msg) {
+        this.threadStartup2Msg = threadStartup2Msg;
+    }
+
+    public ThreadStatus getThreadUpdateMaps() {
+        return threadUpdateMaps;
+    }
+
+    public void setThreadUpdateMaps(ThreadStatus threadUpdateMaps) {
+        this.threadUpdateMaps = threadUpdateMaps;
+    }
+
+    public String getThreadUpdateMapsMsg() {
+        return threadUpdateMapsMsg;
+    }
+
+    public void setThreadUpdateMapsMsg(String threadUpdateMapsMsg) {
+        this.threadUpdateMapsMsg = threadUpdateMapsMsg;
+    }
+
+    public ThreadStatus getThreadUpdateStats() {
+        return threadUpdateStats;
+    }
+
+    public void setThreadUpdateStats(ThreadStatus threadUpdateStats) {
+        this.threadUpdateStats = threadUpdateStats;
+    }
+
+    public String getThreadUpdateStatsMsg() {
+        return threadUpdateStatsMsg;
+    }
+
+    public void setThreadUpdateStatsMsg(String threadUpdateStatsMsg) {
+        this.threadUpdateStatsMsg = threadUpdateStatsMsg;
+    }
+
+    public ThreadStatus getThreadDLCommMap() {
+        return threadDLCommMap;
+    }
+
+    public void setThreadDLCommMap(ThreadStatus threadDLCommMap) {
+        this.threadDLCommMap = threadDLCommMap;
+    }
+
+    public String getThreadDLCommMapMsg() {
+        return threadDLCommMapMsg;
+    }
+
+    public void setThreadDLCommMapMsg(String threadDLCommMapMsg) {
+        this.threadDLCommMapMsg = threadDLCommMapMsg;
+    }
+
+    public ThreadStatus getThreadSaveCommMap() {
+        return threadSaveCommMap;
+    }
+
+    public void setThreadSaveCommMap(ThreadStatus threadSaveCommMap) {
+        this.threadSaveCommMap = threadSaveCommMap;
+    }
+
+    public String getThreadSaveCommMapMsg() {
+        return threadSaveCommMapMsg;
+    }
+
+    public void setThreadSaveCommMapMsg(String threadSaveCommMapMsg) {
+        this.threadSaveCommMapMsg = threadSaveCommMapMsg;
+    }
+
+    public ThreadStatus getThreadCommMapList() {
+        return threadCommMapList;
+    }
+
+    public void setThreadCommMapList(ThreadStatus threadCommMapList) {
+        this.threadCommMapList = threadCommMapList;
+    }
+
+    public String getThreadCommMapListMsg() {
+        return threadCommMapListMsg;
+    }
+
+    public void setThreadCommMapListMsg(String threadCommMapListMsg) {
+        this.threadCommMapListMsg = threadCommMapListMsg;
+    }
+
+    public ThreadStatus getThreadRstStats() {
+        return threadRstStats;
+    }
+
+    public void setThreadRstStats(ThreadStatus threadRstStats) {
+        this.threadRstStats = threadRstStats;
+    }
+
+    public String getThreadRstStatsMsg() {
+        return threadRstStatsMsg;
+    }
+
+    public void setThreadRstStatsMsg(String threadRstStatsMsg) {
+        this.threadRstStatsMsg = threadRstStatsMsg;
+    }
+
+    public ThreadStatus getThreadSaveStats() {
+        return threadSaveStats;
+    }
+
+    public void setThreadSaveStats(ThreadStatus threadSaveStats) {
+        this.threadSaveStats = threadSaveStats;
+    }
+
+    public String getThreadSaveStatsMsg() {
+        return threadSaveStatsMsg;
+    }
+
+    public void setThreadSaveStatsMsg(String threadSaveStatsMsg) {
+        this.threadSaveStatsMsg = threadSaveStatsMsg;
+    }
+
+    public ThreadStatus getThreadCreateAcc() {
+        return threadCreateAcc;
+    }
+
+    public void setThreadCreateAcc(ThreadStatus threadCreateAcc) {
+        this.threadCreateAcc = threadCreateAcc;
+    }
+
+    public String getThreadCreateAccMsg() {
+        return threadCreateAccMsg;
+    }
+
+    public void setThreadCreateAccMsg(String threadCreateAccMsg) {
+        this.threadCreateAccMsg = threadCreateAccMsg;
+    }
+
+    public int getKills() {
+        return kills;
+    }
+
+    public void setKills(int kills) {
+        this.kills = kills;
+    }
+
+    public int getDeaths() {
+        return deaths;
+    }
+
+    public void setDeaths(int deaths) {
+        this.deaths = deaths;
+    }
+
+    public int getBlocksDestroyed() {
+        return blocksDestroyed;
+    }
+
+    public void setBlocksDestroyed(int blocksDestroyed) {
+        this.blocksDestroyed = blocksDestroyed;
+    }
+
+    public int getGameTime() {
+        return gameTime;
+    }
+
+    public void setGameTime(int gameTime) {
+        this.gameTime = gameTime;
+    }
+
+    public boolean isGameWon() {
+        return gameWon;
+    }
+
+    public void setGameWon(boolean gameWon) {
+        this.gameWon = gameWon;
+    }
+
 }
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadCreateAcc.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadCreateAcc.java
new file mode 100644
index 0000000000000000000000000000000000000000..e89ddac66104f2cb0603cf82060beab366839d3a
--- /dev/null
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadCreateAcc.java
@@ -0,0 +1,42 @@
+package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes;
+
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.AccountType;
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.ThreadStatus;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class ThreadCreateAcc extends Thread{
+
+    private static final Logger log = LogManager.getLogger(ThreadCreateAcc.class);
+    private String playerName;
+    private String password;
+    private AccountType type;
+
+    @Override
+    public void run() {
+
+        Persistence persistenceInst = Persistence.getInstance();
+        RuntimeInfo runtimeInfoInst = RuntimeInfo.getInstance();
+
+        try {
+            runtimeInfoInst.setThreadCreateAccMsg("");
+            runtimeInfoInst.setThreadCreateAcc(ThreadStatus.RUNNING);
+            persistenceInst.createAccount(playerName, password, type);
+            log.info("Create account thread finished successfully!");
+            runtimeInfoInst.setThreadCreateAcc(ThreadStatus.FINISHED);
+        } catch (Exception e) {
+            log.error(e);
+            runtimeInfoInst.setThreadCreateAccMsg(e.getMessage());
+            log.info("Create account thread failed!");
+            runtimeInfoInst.setThreadCreateAcc(ThreadStatus.FAILED);
+        }
+    }
+
+    public void startThread(String playerName, String password, AccountType type){
+        this.playerName = playerName;
+        this.password = password;
+        this.type = type;
+        start();
+    }
+
+}
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadDLCommMap.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadDLCommMap.java
new file mode 100644
index 0000000000000000000000000000000000000000..8f83215abbb4dfe4f45b64f7ae6f8fb445158311
--- /dev/null
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadDLCommMap.java
@@ -0,0 +1,37 @@
+package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes;
+
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.ThreadStatus;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class ThreadDLCommMap extends Thread{
+
+    private static final Logger log = LogManager.getLogger(ThreadDLCommMap.class);
+    private String mapID;
+
+    @Override
+    public void run() {
+
+        Persistence persistenceInst = Persistence.getInstance();
+        RuntimeInfo runtimeInfoInst = RuntimeInfo.getInstance();
+
+        try {
+            runtimeInfoInst.setThreadDLCommMapMsg("");
+            runtimeInfoInst.setThreadDLCommMap(ThreadStatus.RUNNING);
+            persistenceInst.getCommunityMap(mapID);
+            log.info("Download Community-Map thread finished successfully!");
+            runtimeInfoInst.setThreadDLCommMap(ThreadStatus.FINISHED);
+        } catch (Exception e) {
+            log.error(e);
+            runtimeInfoInst.setThreadDLCommMapMsg(e.getMessage());
+            log.info("Download Community-Map thread failed!");
+            runtimeInfoInst.setThreadDLCommMap(ThreadStatus.FAILED);
+        }
+    }
+
+    public void startThread(String mapID){
+        this.mapID = mapID;
+        start();
+    }
+
+}
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadGetMapList.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadGetMapList.java
new file mode 100644
index 0000000000000000000000000000000000000000..49478417c2fcdc7268a18d6f78589858bc2d8d8c
--- /dev/null
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadGetMapList.java
@@ -0,0 +1,31 @@
+package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes;
+
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.ThreadStatus;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class ThreadGetMapList extends Thread {
+
+    private static final Logger log = LogManager.getLogger(ThreadGetMapList.class);
+
+    @Override
+    public void run() {
+
+        Persistence persistenceInst = Persistence.getInstance();
+        RuntimeInfo runtimeInfoInst = RuntimeInfo.getInstance();
+
+        try {
+            runtimeInfoInst.setThreadCommMapListMsg("");
+            runtimeInfoInst.setThreadCommMapList(ThreadStatus.RUNNING);
+            persistenceInst.createRemoteCommunityMapsList();
+            log.info("Retrieving Community-Map-List thread finished successfully!");
+            runtimeInfoInst.setThreadCommMapList(ThreadStatus.FINISHED);
+        } catch (Exception e) {
+            log.error(e);
+            runtimeInfoInst.setThreadCommMapListMsg(e.getMessage());
+            log.info("Retrieving Community-Map-List thread failed!");
+            runtimeInfoInst.setThreadCommMapList(ThreadStatus.FAILED);
+        }
+    }
+
+}
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadRstStats.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadRstStats.java
new file mode 100644
index 0000000000000000000000000000000000000000..117fd08d7655da86f083dd6774342db8a97dee64
--- /dev/null
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadRstStats.java
@@ -0,0 +1,31 @@
+package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes;
+
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.ThreadStatus;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class ThreadRstStats extends Thread {
+
+    private static final Logger log = LogManager.getLogger(ThreadRstStats.class);
+
+    @Override
+    public void run() {
+
+        Persistence persistenceInst = Persistence.getInstance();
+        RuntimeInfo runtimeInfoInst = RuntimeInfo.getInstance();
+
+        try {
+            runtimeInfoInst.setThreadRstStatsMsg("");
+            runtimeInfoInst.setThreadRstStats(ThreadStatus.RUNNING);
+            persistenceInst.resetPlayerStatistics();
+            log.info("Reset Player-Statistics thread finished successfully!");
+            runtimeInfoInst.setThreadRstStats(ThreadStatus.FINISHED);
+        } catch (Exception e) {
+            log.error(e);
+            runtimeInfoInst.setThreadRstStatsMsg(e.getMessage());
+            log.info("Reset Player-Statistics thread failed!");
+            runtimeInfoInst.setThreadRstStats(ThreadStatus.FAILED);
+        }
+    }
+
+}
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadSaveCommMap.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadSaveCommMap.java
new file mode 100644
index 0000000000000000000000000000000000000000..984c6654c9a0acbea0c7601ab3b9edea8a18ff7e
--- /dev/null
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadSaveCommMap.java
@@ -0,0 +1,39 @@
+package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes;
+
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.ThreadStatus;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class ThreadSaveCommMap extends Thread{
+
+    private static final Logger log = LogManager.getLogger(ThreadSaveCommMap.class);
+    private MapData map;
+    private boolean doUpload;
+
+    @Override
+    public void run() {
+
+        Persistence persistenceInst = Persistence.getInstance();
+        RuntimeInfo runtimeInfoInst = RuntimeInfo.getInstance();
+
+        try {
+            runtimeInfoInst.setThreadSaveCommMapMsg("");
+            runtimeInfoInst.setThreadSaveCommMap(ThreadStatus.RUNNING);
+            persistenceInst.saveCreatedMap(map, doUpload);
+            log.info("Uploading Community-Map thread finished successfully!");
+            runtimeInfoInst.setThreadSaveCommMap(ThreadStatus.FINISHED);
+        } catch (Exception e) {
+            log.error(e);
+            runtimeInfoInst.setThreadSaveCommMapMsg(e.getMessage());
+            log.info("Uploading Community-Map thread failed!");
+            runtimeInfoInst.setThreadSaveCommMap(ThreadStatus.FAILED);
+        }
+    }
+
+    public void startThread(MapData map, boolean doUpload){     //user can check box to optionally publish map on SQL server
+        this.map = map;
+        this.doUpload = doUpload;
+        start();
+    }
+
+}
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadSaveStats.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadSaveStats.java
new file mode 100644
index 0000000000000000000000000000000000000000..ce753f13a26da1dbfd9976de6ac633a04ff968af
--- /dev/null
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadSaveStats.java
@@ -0,0 +1,31 @@
+package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes;
+
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.ThreadStatus;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class ThreadSaveStats extends Thread{
+
+    private static final Logger log = LogManager.getLogger(ThreadSaveStats.class);
+
+    @Override
+    public void run() {
+
+        Persistence persistenceInst = Persistence.getInstance();
+        RuntimeInfo runtimeInfoInst = RuntimeInfo.getInstance();
+
+        try {
+            runtimeInfoInst.setThreadSaveStatsMsg("");
+            runtimeInfoInst.setThreadSaveStats(ThreadStatus.RUNNING);
+            persistenceInst.savePlayerStatistics();
+            log.info("Save Player-Statistics thread finished successfully!");
+            runtimeInfoInst.setThreadSaveStats(ThreadStatus.FINISHED);
+        } catch (Exception e) {
+            log.error(e);
+            runtimeInfoInst.setThreadSaveStatsMsg(e.getMessage());
+            log.info("Save Player-Statistics thread failed!");
+            runtimeInfoInst.setThreadSaveStats(ThreadStatus.FAILED);
+        }
+    }
+
+}
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/StartupThread.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup1.java
similarity index 51%
rename from src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/StartupThread.java
rename to src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup1.java
index a7ad2fddfea2cc499a0de9994f1bfe2b193f87aa..d7b273ce47aa67bf2c9d1a9326cb7ac5be732cee 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/StartupThread.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup1.java
@@ -1,18 +1,22 @@
 package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes;
 
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.ThreadStatus;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
-public class StartupThread extends Thread{
+public class ThreadStartup1 extends Thread{
 
-    private static final Logger log = LogManager.getLogger(StartupThread.class);
+    private static final Logger log = LogManager.getLogger(ThreadStartup1.class);
 
     @Override
     public void run() {
 
         Persistence persistenceInst = Persistence.getInstance();
+        RuntimeInfo runtimeInfoInst = RuntimeInfo.getInstance();
 
         try {
+            runtimeInfoInst.setThreadStartup1Msg("");
+            runtimeInfoInst.setThreadStartup1(ThreadStatus.RUNNING);
             persistenceInst.loadSettings();
             persistenceInst.loadCoreMaps();
             persistenceInst.loadCommunityMaps();
@@ -20,8 +24,12 @@ public class StartupThread extends Thread{
             persistenceInst.verifyCoreMaps();
             persistenceInst.verifyCommunityMaps();
             log.info("Startup routine part1 complete!");
+            runtimeInfoInst.setThreadStartup1(ThreadStatus.FINISHED);
         } catch (Exception e) {
             log.error(e);
+            runtimeInfoInst.setThreadStartup1Msg(e.getMessage());
+            log.info("Startup routine part1 failed!");
+            runtimeInfoInst.setThreadStartup1(ThreadStatus.FAILED);
         }
     }
 
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup2.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup2.java
new file mode 100644
index 0000000000000000000000000000000000000000..4d9a3a57c6c76bf29425ecd0ce5f62a1dcc43d40
--- /dev/null
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup2.java
@@ -0,0 +1,31 @@
+package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes;
+
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.ThreadStatus;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class ThreadStartup2 extends Thread{
+
+    private static final Logger log = LogManager.getLogger(ThreadStartup2.class);
+
+    @Override
+    public void run() {
+
+        Persistence persistenceInst = Persistence.getInstance();
+        RuntimeInfo runtimeInfoInst = RuntimeInfo.getInstance();
+
+        try {
+            runtimeInfoInst.setThreadStartup2Msg("");
+            runtimeInfoInst.setThreadStartup2(ThreadStatus.RUNNING);
+            persistenceInst.loadPlayerAccount();
+            log.info("Startup routine part2 complete!");
+            runtimeInfoInst.setThreadStartup2(ThreadStatus.FINISHED);
+        } catch (Exception e) {
+            log.error(e);
+            runtimeInfoInst.setThreadStartup2Msg(e.getMessage());
+            log.info("Startup routine part2 failed!");
+            runtimeInfoInst.setThreadStartup2(ThreadStatus.FAILED);
+        }
+    }
+
+}
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadUpdateMaps.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadUpdateMaps.java
new file mode 100644
index 0000000000000000000000000000000000000000..793298791e2bda9e8da1af2a9796165878863eb7
--- /dev/null
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadUpdateMaps.java
@@ -0,0 +1,31 @@
+package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes;
+
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.ThreadStatus;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class ThreadUpdateMaps extends Thread{
+
+    private static final Logger log = LogManager.getLogger(ThreadUpdateMaps.class);
+
+    @Override
+    public void run() {
+
+        Persistence persistenceInst = Persistence.getInstance();
+        RuntimeInfo runtimeInfoInst = RuntimeInfo.getInstance();
+
+        try {
+            runtimeInfoInst.setThreadUpdateMapsMsg("");
+            runtimeInfoInst.setThreadUpdateMaps(ThreadStatus.RUNNING);
+            persistenceInst.updateCoreMaps();
+            log.info("Update Core-Maps thread finished successfully!");
+            runtimeInfoInst.setThreadUpdateMaps(ThreadStatus.FINISHED);
+        } catch (Exception e) {
+            log.error(e);
+            runtimeInfoInst.setThreadUpdateMapsMsg(e.getMessage());
+            log.info("Update Core-Maps thread failed!");
+            runtimeInfoInst.setThreadUpdateMaps(ThreadStatus.FAILED);
+        }
+    }
+
+}
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadUpdateStats.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadUpdateStats.java
new file mode 100644
index 0000000000000000000000000000000000000000..f8869a397009d5b29511440ea4843ae5a7382567
--- /dev/null
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadUpdateStats.java
@@ -0,0 +1,36 @@
+package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes;
+
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.ThreadStatus;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+public class ThreadUpdateStats extends Thread{
+
+    private static final Logger log = LogManager.getLogger(ThreadUpdateStats.class);
+
+    @Override
+    public void run() {
+
+        Persistence persistenceInst = Persistence.getInstance();
+        RuntimeInfo runtimeInfoInst = RuntimeInfo.getInstance();
+
+        try {
+            runtimeInfoInst.setThreadUpdateStatsMsg("");
+            runtimeInfoInst.setThreadUpdateStats(ThreadStatus.RUNNING);
+            persistenceInst.updatePlayerStatistics(runtimeInfoInst.getKills(), runtimeInfoInst.getDeaths(), runtimeInfoInst.getGameTime(), runtimeInfoInst.getBlocksDestroyed(), runtimeInfoInst.isGameWon());
+            runtimeInfoInst.setKills(0);
+            runtimeInfoInst.setDeaths(0);
+            runtimeInfoInst.setGameTime(0);
+            runtimeInfoInst.setBlocksDestroyed(0);
+            runtimeInfoInst.setGameWon(false);
+            log.info("Update statistics thread finished successfully!");
+            runtimeInfoInst.setThreadUpdateStats(ThreadStatus.FINISHED);
+        } catch (Exception e) {
+            log.error(e);
+            runtimeInfoInst.setThreadUpdateStatsMsg(e.getMessage());
+            log.info("Update statistics thread failed!");
+            runtimeInfoInst.setThreadUpdateStats(ThreadStatus.FAILED);
+        }
+    }
+
+}
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index 7170d5f5377d9044dc83b6f3705c684f0db71786..f0029279f9b345c8bca30dd1ea57552d991b6c83 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -16,6 +16,7 @@ module gui {
     opens de.hdm_stuttgart.battlearena to javafx.fxml;
     opens de.hdm_stuttgart.battlearena.Model.Sound to javafx.media;
     opens de.hdm_stuttgart.battlearena.Controller.Utilities to javafx.fxml;
+    opens de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs to com.google.gson;
 
     exports de.hdm_stuttgart.battlearena.Main;
     exports de.hdm_stuttgart.battlearena.Controller;
@@ -23,4 +24,4 @@ module gui {
     exports de.hdm_stuttgart.battlearena.Model.Inputs;
     exports de.hdm_stuttgart.battlearena.Model.Map;
     exports de.hdm_stuttgart.battlearena.Controller.Utilities;
-}
\ No newline at end of file
+}