diff --git a/.gitignore b/.gitignore
index 48d950c0fa160766965bddfc4b73b5634369becb..e07b2b7780a254b48db55558d430c526b42bc545 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,6 +12,7 @@ target/
 .idea/**/usage.statistics.xml
 .idea/**/dictionaries
 .idea/**/shelf
+/src/main/resources/player
 
 # AWS User-specific
 .idea/**/aws.xml
@@ -129,4 +130,4 @@ build/
 
 # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
 hs_err_pid*
-replay_pid*
\ No newline at end of file
+replay_pid*
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 206a4832ae92354aef8616735cb9491c04be0a41..3e8fc97af92a71ba1950a931d66e9ec580b21a19 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -19,12 +19,20 @@ build-battlearena:
   script:
   - "echo 'Starting Build Stage'"
   - "mvn compile -X"
+  only:
+    refs:
+    - development
+    - main
 test-battlearena:
   stage: test
   image: maven:3.9.4-eclipse-temurin-20
   script:
   - "echo 'Starting Test Stage'"
   - "mvn test"
+  only:
+    refs:
+    - development
+    - main
   artifacts:
     reports:
       junit:
diff --git a/.idea/misc.xml b/.idea/misc.xml
index fc45e5d1ccd129776fae9a28db0af25398ca6ad2..c6e9a72a96bffb6ce40ce23e0f9e0623a701311a 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,4 +1,3 @@
-<?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="ExternalStorageConfigurationManager" enabled="true" />
   <component name="MavenProjectsManager">
diff --git a/Documentation/BattleArenaClassDiagram.drawio b/Documentation/BattleArenaClassDiagram.drawio
new file mode 100644
index 0000000000000000000000000000000000000000..4b1ca48d09f3a185063c5910374bb7cec1e51383
--- /dev/null
+++ b/Documentation/BattleArenaClassDiagram.drawio
@@ -0,0 +1,487 @@
+<mxGraphModel dx="0" dy="0" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="0" pageScale="1" background="none" math="0" shadow="0">
+  <root>
+    <mxCell id="0" />
+    <mxCell id="1" parent="0" />
+    <mxCell id="node52" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt;enumeration&amp;gt;&amp;gt;&lt;/i&gt;&lt;br/&gt;&lt;b&gt;AccountType&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ AccountType(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ valueOf(String): AccountType&lt;br/&gt;+ values(): AccountType[]&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="2392" y="3395" width="230" height="131" as="geometry" />
+    </mxCell>
+    <mxCell id="node62" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;AppSettings&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ AppSettings(int, int): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- musicVolume: int&lt;br/&gt;- sfxVolume: int&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; musicVolume: int&lt;br/&gt; sfxVolume: int&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="5532" y="2894" width="179" height="156" as="geometry" />
+    </mxCell>
+    <mxCell id="node28" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;AzureDB&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ AzureDB(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ getStatistics(String): PlayerStatistics&lt;br/&gt;+ getCommunityMapByID(String): MapData&lt;br/&gt;+ resetPlayerStats(PlayerAccount): void&lt;br/&gt;+ checkCredentials(String): String&lt;br/&gt;+ uploadCommunityMap(MapData): void&lt;br/&gt;+ getLoginData(): void&lt;br/&gt;+ createPlayer(String, String): void&lt;br/&gt;+ updatePlayerStats(PlayerStatistics, PlayerAccount): void&lt;br/&gt;+ connect(): Connection&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; coreMaps: ArrayList&amp;lt;MapData&amp;gt;&lt;br/&gt; communityMapsList: ArrayList&amp;lt;MapInfo&amp;gt;&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="1855" y="1974" width="395" height="317" as="geometry" />
+    </mxCell>
+    <mxCell id="node31" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;BackgroundTile&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ BackgroundTile(Image, boolean, boolean, SFXLoop): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- tileSprite: Image&lt;br/&gt;- soundEffect: SFXLoop&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; collision: boolean&lt;br/&gt; tileSprite: Image&lt;br/&gt; soundEffect: SFXLoop&lt;br/&gt; destruction: boolean&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="3437" y="1831" width="374" height="202" as="geometry" />
+    </mxCell>
+    <mxCell id="node24" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;BigBomb&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ BigBomb(int, int, GraphicsContext, int): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- boxCollider: BoundingBox&lt;br/&gt;- OBJECT_STATUS: ObjectStatus&lt;br/&gt;- OBJECT_TYPE: ObjectType&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ healPlayer(int): void&lt;br/&gt;+ spawnExplosion(int, int, GraphicsContext): void&lt;br/&gt;+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void&lt;br/&gt;+ renderEntity(GraphicsContext): void&lt;br/&gt;+ loadEntitySprites(): void&lt;br/&gt;+ updateEntity(GameSceneController, GraphicsContext): void&lt;br/&gt;+ spawnItems(int, int, GraphicsContext): void&lt;br/&gt;+ checkExplosionSpawn(GraphicsContext, int): void&lt;br/&gt;+ attack(IEntity, GraphicsContext): void&lt;br/&gt;+ updateEntityWalkAnimation(): void&lt;br/&gt;+ initializeEntity(): void&lt;br/&gt;+ gotHit(int): void&lt;br/&gt;+ checkTilePlacing(int, int): int&lt;br/&gt;+ placeBombAction(IEntity, GraphicsContext): void&lt;br/&gt;- updateAnimation(): void&lt;br/&gt;+ changeCheckedTileDestructable(GraphicsContext): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; objectStatus: ObjectStatus&lt;br/&gt; entityDirection: EntityDirection&lt;br/&gt; OBJECT_TYPE: ObjectType&lt;br/&gt; OBJECT_STATUS: ObjectStatus&lt;br/&gt; entitySpeed: int&lt;br/&gt; health: int&lt;br/&gt; mapPosX: int&lt;br/&gt; player: int&lt;br/&gt; mapPosY: int&lt;br/&gt; maxEntityHealth: int&lt;br/&gt; boxCollider: BoundingBox&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="1092" y="705" width="446" height="759" as="geometry" />
+    </mxCell>
+    <mxCell id="node3" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;BigBombItemFrame&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ BigBombItemFrame(int, int, GraphicsContext): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- OBJECT_STATUS: ObjectStatus&lt;br/&gt;- boxCollider: BoundingBox&lt;br/&gt;- OBJECT_TYPE: ObjectType&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void&lt;br/&gt;+ updateEntity(GameSceneController, GraphicsContext): void&lt;br/&gt;+ initializeEntity(): void&lt;br/&gt;+ renderEntity(GraphicsContext): void&lt;br/&gt;+ gotHit(int): void&lt;br/&gt;+ healPlayer(int): void&lt;br/&gt;+ attack(IEntity, GraphicsContext): void&lt;br/&gt;+ loadEntitySprites(): void&lt;br/&gt;+ updateEntityWalkAnimation(): void&lt;br/&gt;+ placeBombAction(IEntity, GraphicsContext): void&lt;br/&gt;- updateAnimation(): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; objectStatus: ObjectStatus&lt;br/&gt; entityDirection: EntityDirection&lt;br/&gt; OBJECT_TYPE: ObjectType&lt;br/&gt; OBJECT_STATUS: ObjectStatus&lt;br/&gt; entitySpeed: int&lt;br/&gt; health: int&lt;br/&gt; mapPosX: int&lt;br/&gt; player: int&lt;br/&gt; mapPosY: int&lt;br/&gt; maxEntityHealth: int&lt;br/&gt; boxCollider: BoundingBox&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="160" y="762" width="446" height="644" as="geometry" />
+    </mxCell>
+    <mxCell id="node16" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt;enumeration&amp;gt;&amp;gt;&lt;/i&gt;&lt;br/&gt;&lt;b&gt;Biom&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ Biom(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ values(): Biom[]&lt;br/&gt;+ valueOf(String): Biom&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="5004" y="3395" width="177" height="131" as="geometry" />
+    </mxCell>
+    <mxCell id="node54" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;BlastDownItemFrame&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ BlastDownItemFrame(int, int, GraphicsContext): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- boxCollider: BoundingBox&lt;br/&gt;- OBJECT_TYPE: ObjectType&lt;br/&gt;- OBJECT_STATUS: ObjectStatus&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ attack(IEntity, GraphicsContext): void&lt;br/&gt;- updateAnimation(): void&lt;br/&gt;+ healPlayer(int): void&lt;br/&gt;+ placeBombAction(IEntity, GraphicsContext): void&lt;br/&gt;+ updateEntityWalkAnimation(): void&lt;br/&gt;+ loadEntitySprites(): void&lt;br/&gt;+ initializeEntity(): void&lt;br/&gt;+ updateEntity(GameSceneController, GraphicsContext): void&lt;br/&gt;+ gotHit(int): void&lt;br/&gt;+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void&lt;br/&gt;+ renderEntity(GraphicsContext): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; objectStatus: ObjectStatus&lt;br/&gt; entityDirection: EntityDirection&lt;br/&gt; OBJECT_TYPE: ObjectType&lt;br/&gt; OBJECT_STATUS: ObjectStatus&lt;br/&gt; entitySpeed: int&lt;br/&gt; health: int&lt;br/&gt; mapPosX: int&lt;br/&gt; player: int&lt;br/&gt; mapPosY: int&lt;br/&gt; maxEntityHealth: int&lt;br/&gt; boxCollider: BoundingBox&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="3422" y="762" width="446" height="644" as="geometry" />
+    </mxCell>
+    <mxCell id="node97" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;BlastUpItemFrame&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ BlastUpItemFrame(int, int, GraphicsContext): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- OBJECT_STATUS: ObjectStatus&lt;br/&gt;- OBJECT_TYPE: ObjectType&lt;br/&gt;- boxCollider: BoundingBox&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ healPlayer(int): void&lt;br/&gt;- updateAnimation(): void&lt;br/&gt;+ initializeEntity(): void&lt;br/&gt;+ placeBombAction(IEntity, GraphicsContext): void&lt;br/&gt;+ gotHit(int): void&lt;br/&gt;+ loadEntitySprites(): void&lt;br/&gt;+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void&lt;br/&gt;+ updateEntityWalkAnimation(): void&lt;br/&gt;+ attack(IEntity, GraphicsContext): void&lt;br/&gt;+ updateEntity(GameSceneController, GraphicsContext): void&lt;br/&gt;+ renderEntity(GraphicsContext): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; objectStatus: ObjectStatus&lt;br/&gt; entityDirection: EntityDirection&lt;br/&gt; OBJECT_TYPE: ObjectType&lt;br/&gt; OBJECT_STATUS: ObjectStatus&lt;br/&gt; entitySpeed: int&lt;br/&gt; health: int&lt;br/&gt; mapPosX: int&lt;br/&gt; player: int&lt;br/&gt; mapPosY: int&lt;br/&gt; maxEntityHealth: int&lt;br/&gt; boxCollider: BoundingBox&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="3888" y="762" width="446" height="644" as="geometry" />
+    </mxCell>
+    <mxCell id="node34" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;Bomb&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ Bomb(int, int, GraphicsContext, int): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- boxCollider: BoundingBox&lt;br/&gt;- OBJECT_TYPE: ObjectType&lt;br/&gt;- OBJECT_STATUS: ObjectStatus&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ gotHit(int): void&lt;br/&gt;+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void&lt;br/&gt;+ renderEntity(GraphicsContext): void&lt;br/&gt;+ checkTilePlacing(int, int): int&lt;br/&gt;+ checkExplosionSpawn(GraphicsContext, int): void&lt;br/&gt;+ updateEntity(GameSceneController, GraphicsContext): void&lt;br/&gt;+ loadEntitySprites(): void&lt;br/&gt;+ updateEntityWalkAnimation(): void&lt;br/&gt;+ initializeEntity(): void&lt;br/&gt;+ healPlayer(int): void&lt;br/&gt;- updateAnimation(): void&lt;br/&gt;+ spawnExplosion(int, int, GraphicsContext): void&lt;br/&gt;+ placeBombAction(IEntity, GraphicsContext): void&lt;br/&gt;+ spawnItems(int, int, GraphicsContext): void&lt;br/&gt;+ changeCheckedTileDestructable(GraphicsContext): void&lt;br/&gt;+ attack(IEntity, GraphicsContext): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; objectStatus: ObjectStatus&lt;br/&gt; entityDirection: EntityDirection&lt;br/&gt; OBJECT_TYPE: ObjectType&lt;br/&gt; OBJECT_STATUS: ObjectStatus&lt;br/&gt; entitySpeed: int&lt;br/&gt; health: int&lt;br/&gt; mapPosX: int&lt;br/&gt; player: int&lt;br/&gt; mapPosY: int&lt;br/&gt; maxEntityHealth: int&lt;br/&gt; boxCollider: BoundingBox&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="2490" y="705" width="446" height="759" as="geometry" />
+    </mxCell>
+    <mxCell id="node88" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;BombClockItemFrame&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ BombClockItemFrame(int, int, GraphicsContext): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- boxCollider: BoundingBox&lt;br/&gt;- OBJECT_TYPE: ObjectType&lt;br/&gt;- OBJECT_STATUS: ObjectStatus&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ initializeEntity(): void&lt;br/&gt;+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void&lt;br/&gt;+ healPlayer(int): void&lt;br/&gt;+ updateEntityWalkAnimation(): void&lt;br/&gt;+ loadEntitySprites(): void&lt;br/&gt;+ renderEntity(GraphicsContext): void&lt;br/&gt;- updateAnimation(): void&lt;br/&gt;+ updateEntity(GameSceneController, GraphicsContext): void&lt;br/&gt;+ placeBombAction(IEntity, GraphicsContext): void&lt;br/&gt;+ attack(IEntity, GraphicsContext): void&lt;br/&gt;+ gotHit(int): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; objectStatus: ObjectStatus&lt;br/&gt; entityDirection: EntityDirection&lt;br/&gt; OBJECT_TYPE: ObjectType&lt;br/&gt; OBJECT_STATUS: ObjectStatus&lt;br/&gt; entitySpeed: int&lt;br/&gt; health: int&lt;br/&gt; mapPosX: int&lt;br/&gt; player: int&lt;br/&gt; mapPosY: int&lt;br/&gt; maxEntityHealth: int&lt;br/&gt; boxCollider: BoundingBox&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="2956" y="762" width="446" height="644" as="geometry" />
+    </mxCell>
+    <mxCell id="node60" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;ButtonTransition&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ ButtonTransition(Button): &lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="821" y="3672" width="208" height="58" as="geometry" />
+    </mxCell>
+    <mxCell id="node41" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;Client&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ Client(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ stopConnection(): void&lt;br/&gt;+ startConnection(String, int): void&lt;br/&gt;+ convertStringToArray(String): int[]&lt;br/&gt;+ sendCords(int[]): int[]&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="2011" y="3199" width="259" height="151" as="geometry" />
+    </mxCell>
+    <mxCell id="node95" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;CollisionHandler&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ CollisionHandler(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ handleBoxCollision(BoundingBox, BoundingBox): boolean&lt;br/&gt;+ handleMapCollision(IEntity, int, GameSceneController): boolean&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="5235" y="3199" width="441" height="113" as="geometry" />
+    </mxCell>
+    <mxCell id="node14" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;CommunityMapController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ CommunityMapController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ initialize(URL, ResourceBundle): void&lt;br/&gt;- backButton(): void&lt;br/&gt;- setTableView(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="4428" y="1658" width="273" height="138" as="geometry" />
+    </mxCell>
+    <mxCell id="node99" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;ConnectionHandler&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ ConnectionHandler(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- enemyX: int&lt;br/&gt;- playerWalkDirection: int&lt;br/&gt;- pX: int&lt;br/&gt;- playerAttacking: int&lt;br/&gt;- playerID: int&lt;br/&gt;- enemyClass: int&lt;br/&gt;- enemyWalkDirection: int&lt;br/&gt;- ipaddress: String&lt;br/&gt;- pY: int&lt;br/&gt;- playerClass: int&lt;br/&gt;- enemyHealth: int&lt;br/&gt;- playerHealth: int&lt;br/&gt;- enemyAttacking: int&lt;br/&gt;- enemyY: int&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ startHandler(): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; ipaddress: String&lt;br/&gt; enemyHealth: int&lt;br/&gt; playerHealth: int&lt;br/&gt; enemyAttacking: boolean&lt;br/&gt; enemyClass: EntityClass&lt;br/&gt; pY: int&lt;br/&gt; playerClass: EntityClass&lt;br/&gt; pX: int&lt;br/&gt; playerWalkDirection: EntityDirection&lt;br/&gt; enemyY: int&lt;br/&gt; enemyX: int&lt;br/&gt; playerAttacking: boolean&lt;br/&gt; playerID: int&lt;br/&gt; enemyWalkDirection: EntityDirection&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="1233" y="1658" width="271" height="736" as="geometry" />
+    </mxCell>
+    <mxCell id="node109" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;ConnectionThread&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ ConnectionThread(Client): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ run(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="-96" y="2917" width="214" height="89" as="geometry" />
+    </mxCell>
+    <mxCell id="node9" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;CreateAccountController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ CreateAccountController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- getSelected(): void&lt;br/&gt;- create(): void&lt;br/&gt;- switchScene(String): void&lt;br/&gt;- back(): void&lt;br/&gt;+ initialize(URL, ResourceBundle): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="3679" y="2894" width="273" height="174" as="geometry" />
+    </mxCell>
+    <mxCell id="node49" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;CreateMediaPlayer&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ CreateMediaPlayer(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ getMediaPlayer(MediaView, File, boolean, BorderPane[]): MediaPlayer&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="5226" y="3395" width="483" height="89" as="geometry" />
+    </mxCell>
+    <mxCell id="node74" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;CreditsController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ CreditsController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- createMediaPlayer(): void&lt;br/&gt;- videoEnd(): void&lt;br/&gt;+ initialize(URL, ResourceBundle): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="3847" y="3199" width="273" height="138" as="geometry" />
+    </mxCell>
+    <mxCell id="node64" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;CryptoException&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ CryptoException(String, Throwable): &lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="499" y="3672" width="277" height="58" as="geometry" />
+    </mxCell>
+    <mxCell id="node100" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;CryptoUtils&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ CryptoUtils(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ decrypt(File): String[]&lt;br/&gt;+ check_if_file_already_encrypted(File): boolean&lt;br/&gt;+ encrypt(File, boolean): int&lt;br/&gt;- doCrypto(int, String, File): String[]&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="681" y="3199" width="331" height="151" as="geometry" />
+    </mxCell>
+    <mxCell id="node111" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;DataItem&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ DataItem(String): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- name: SimpleStringProperty&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ nameProperty(): SimpleStringProperty&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; name: String&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="4423" y="1842" width="282" height="149" as="geometry" />
+    </mxCell>
+    <mxCell id="node90" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;DatabaseException&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ DatabaseException(String): &lt;br/&gt;+ DatabaseException(): &lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="4695" y="3545" width="219" height="83" as="geometry" />
+    </mxCell>
+    <mxCell id="node43" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;Driver&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ Driver(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ start(Stage): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="4188" y="3545" width="153" height="89" as="geometry" />
+    </mxCell>
+    <mxCell id="node75" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt;enumeration&amp;gt;&amp;gt;&lt;/i&gt;&lt;br/&gt;&lt;b&gt;EntityClass&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ EntityClass(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ valueOf(String): EntityClass&lt;br/&gt;+ values(): EntityClass[]&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="3734" y="3395" width="216" height="131" as="geometry" />
+    </mxCell>
+    <mxCell id="node21" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt;enumeration&amp;gt;&amp;gt;&lt;/i&gt;&lt;br/&gt;&lt;b&gt;EntityDirection&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ EntityDirection(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ values(): EntityDirection[]&lt;br/&gt;+ valueOf(String): EntityDirection&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="1832" y="3395" width="239" height="131" as="geometry" />
+    </mxCell>
+    <mxCell id="node26" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;EntityFactory&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ EntityFactory(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ createEntity(EntityType, GraphicsContext, InputHandler, EntityClass, GameSceneController, PlayerMode): IEntity&lt;br/&gt;+ createBombs(ObjectType, int, int, GraphicsContext, int): IEntity&lt;br/&gt;+ createMarker(ObjectType, int, int, GraphicsContext, int): IEntity&lt;br/&gt;+ createGameplayObject(ObjectType, int, int, GraphicsContext): IEntity&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="160" y="3199" width="476" height="151" as="geometry" />
+    </mxCell>
+    <mxCell id="node57" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt;enumeration&amp;gt;&amp;gt;&lt;/i&gt;&lt;br/&gt;&lt;b&gt;EntityType&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ EntityType(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ values(): EntityType[]&lt;br/&gt;+ valueOf(String): EntityType&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="3995" y="3395" width="214" height="131" as="geometry" />
+    </mxCell>
+    <mxCell id="node40" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;Explosion&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ Explosion(int, int, GraphicsContext): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- OBJECT_TYPE: ObjectType&lt;br/&gt;- OBJECT_STATUS: ObjectStatus&lt;br/&gt;- boxCollider: BoundingBox&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ updateEntityWalkAnimation(): void&lt;br/&gt;+ initializeEntity(): void&lt;br/&gt;+ loadEntitySprites(): void&lt;br/&gt;+ updateEntity(GameSceneController, GraphicsContext): void&lt;br/&gt;- updateAnimation(): void&lt;br/&gt;+ gotHit(int): void&lt;br/&gt;+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void&lt;br/&gt;+ placeBombAction(IEntity, GraphicsContext): void&lt;br/&gt;+ renderEntity(GraphicsContext): void&lt;br/&gt;+ healPlayer(int): void&lt;br/&gt;+ attack(IEntity, GraphicsContext): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; objectStatus: ObjectStatus&lt;br/&gt; entityDirection: EntityDirection&lt;br/&gt; OBJECT_TYPE: ObjectType&lt;br/&gt; OBJECT_STATUS: ObjectStatus&lt;br/&gt; entitySpeed: int&lt;br/&gt; health: int&lt;br/&gt; mapPosX: int&lt;br/&gt; player: int&lt;br/&gt; mapPosY: int&lt;br/&gt; maxEntityHealth: int&lt;br/&gt; boxCollider: BoundingBox&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="4820" y="762" width="446" height="644" as="geometry" />
+    </mxCell>
+    <mxCell id="node44" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;GSONException&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ GSONException(): &lt;br/&gt;+ GSONException(String): &lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="5205" y="3545" width="199" height="83" as="geometry" />
+    </mxCell>
+    <mxCell id="node87" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt;enumeration&amp;gt;&amp;gt;&lt;/i&gt;&lt;br/&gt;&lt;b&gt;GameMode&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ GameMode(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ values(): GameMode[]&lt;br/&gt;+ valueOf(String): GameMode&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="3470" y="3395" width="219" height="131" as="geometry" />
+    </mxCell>
+    <mxCell id="node23" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;GameOverController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ GameOverController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- mainMenu(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="1413" y="3545" width="209" height="89" as="geometry" />
+    </mxCell>
+    <mxCell id="node7" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;GameSceneController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ GameSceneController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;~ tileManager: TileManager&lt;br/&gt;~ player: IEntity&lt;br/&gt;~ scaledTileSize: int&lt;br/&gt;~ enemy: IEntity&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- updateContent(): void&lt;br/&gt;- checkDeath(): void&lt;br/&gt;- renderGameplayObjects(GraphicsContext): void&lt;br/&gt;- resume(): void&lt;br/&gt;- renderContent(GraphicsContext): void&lt;br/&gt;- healthBar(): void&lt;br/&gt;+ initialize(URL, ResourceBundle): void&lt;br/&gt;- setScene(): void&lt;br/&gt;- pauseMenu(): void&lt;br/&gt;- removeBlur(): void&lt;br/&gt;- setBlur(): void&lt;br/&gt;- updateGameplayObjects(): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; scaledTileSize: int&lt;br/&gt; tileManager: TileManager&lt;br/&gt; enemy: IEntity&lt;br/&gt; player: IEntity&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="2710" y="1658" width="344" height="529" as="geometry" />
+    </mxCell>
+    <mxCell id="node39" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt;enumeration&amp;gt;&amp;gt;&lt;/i&gt;&lt;br/&gt;&lt;b&gt;GameState&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- GameState(String): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- path: String&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ values(): GameState[]&lt;br/&gt;+ valueOf(String): GameState&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; path: String&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="4582" y="2894" width="216" height="161" as="geometry" />
+    </mxCell>
+    <mxCell id="node98" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;GsonHandler&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ GsonHandler(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ saveSettings(AppSettings): void&lt;br/&gt;+ saveMaps(ArrayList&amp;lt;MapData&amp;gt;, MapType): void&lt;br/&gt;+ loadSettings(): AppSettings&lt;br/&gt;+ loadAccount(): PlayerAccount&lt;br/&gt;+ loadMaps(MapType): ArrayList&amp;lt;MapData&amp;gt;&lt;br/&gt;+ loadStats(): PlayerStatistics&lt;br/&gt;+ saveStats(PlayerStatistics): void&lt;br/&gt;+ saveAccount(PlayerAccount): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="578" y="2894" width="345" height="243" as="geometry" />
+    </mxCell>
+    <mxCell id="node11" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;HashGenerator&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ HashGenerator(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ hashAndHex(String): String&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="894" y="3545" width="216" height="89" as="geometry" />
+    </mxCell>
+    <mxCell id="node8" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;Heart&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ Heart(int, int, GraphicsContext): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- OBJECT_STATUS: ObjectStatus&lt;br/&gt;- OBJECT_TYPE: ObjectType&lt;br/&gt;- boxCollider: BoundingBox&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ updateEntityWalkAnimation(): void&lt;br/&gt;+ initializeEntity(): void&lt;br/&gt;+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void&lt;br/&gt;+ placeBombAction(IEntity, GraphicsContext): void&lt;br/&gt;+ attack(IEntity, GraphicsContext): void&lt;br/&gt;+ renderEntity(GraphicsContext): void&lt;br/&gt;+ healPlayer(int): void&lt;br/&gt;+ loadEntitySprites(): void&lt;br/&gt;+ updateEntity(GameSceneController, GraphicsContext): void&lt;br/&gt;+ gotHit(int): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; objectStatus: ObjectStatus&lt;br/&gt; entityDirection: EntityDirection&lt;br/&gt; OBJECT_TYPE: ObjectType&lt;br/&gt; OBJECT_STATUS: ObjectStatus&lt;br/&gt; entitySpeed: int&lt;br/&gt; health: int&lt;br/&gt; mapPosX: int&lt;br/&gt; player: int&lt;br/&gt; mapPosY: int&lt;br/&gt; maxEntityHealth: int&lt;br/&gt; boxCollider: BoundingBox&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="4354" y="774" width="446" height="621" as="geometry" />
+    </mxCell>
+    <mxCell id="node13" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt;interface&amp;gt;&amp;gt;&lt;/i&gt;&lt;br/&gt;&lt;b&gt;IEntity&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ placeBombAction(IEntity, GraphicsContext): void&lt;br/&gt;+ updateEntity(GameSceneController, GraphicsContext): void&lt;br/&gt;+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void&lt;br/&gt;+ attack(IEntity, GraphicsContext): void&lt;br/&gt;+ gotHit(int): void&lt;br/&gt;+ healPlayer(int): void&lt;br/&gt;+ renderEntity(GraphicsContext): void&lt;br/&gt;+ updateEntityWalkAnimation(): void&lt;br/&gt;+ loadEntitySprites(): void&lt;br/&gt;+ initializeEntity(): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; objectStatus: ObjectStatus&lt;br/&gt; entityDirection: EntityDirection&lt;br/&gt; OBJECT_TYPE: ObjectType&lt;br/&gt; OBJECT_STATUS: ObjectStatus&lt;br/&gt; entitySpeed: int&lt;br/&gt; health: int&lt;br/&gt; mapPosX: int&lt;br/&gt; player: int&lt;br/&gt; mapPosY: int&lt;br/&gt; maxEntityHealth: int&lt;br/&gt; boxCollider: BoundingBox&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="2723" y="-14" width="446" height="519" as="geometry" />
+    </mxCell>
+    <mxCell id="node5" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;IPAddressValidator&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ IPAddressValidator(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ validate(String): boolean&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="2163" y="3545" width="199" height="89" as="geometry" />
+    </mxCell>
+    <mxCell id="node50" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt;interface&amp;gt;&amp;gt;&lt;/i&gt;&lt;br/&gt;&lt;b&gt;ISQLDataBase&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ uploadCommunityMap(MapData): void&lt;br/&gt;+ getStatistics(String): PlayerStatistics&lt;br/&gt;+ updatePlayerStats(PlayerStatistics, PlayerAccount): void&lt;br/&gt;+ connect(): Connection&lt;br/&gt;+ getCommunityMapByID(String): MapData&lt;br/&gt;+ checkCredentials(String): String&lt;br/&gt;+ createPlayer(String, String): void&lt;br/&gt;+ resetPlayerStats(PlayerAccount): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; coreMaps: ArrayList&amp;lt;MapData&amp;gt;&lt;br/&gt; communityMapsList: ArrayList&amp;lt;MapInfo&amp;gt;&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="2063" y="1658" width="395" height="266" as="geometry" />
+    </mxCell>
+    <mxCell id="node20" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt;interface&amp;gt;&amp;gt;&lt;/i&gt;&lt;br/&gt;&lt;b&gt;ITile&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; collision: boolean&lt;br/&gt; tileSprite: Image&lt;br/&gt; soundEffect: SFXLoop&lt;br/&gt; destruction: boolean&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="3532" y="1658" width="184" height="154" as="geometry" />
+    </mxCell>
+    <mxCell id="node1" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;Initializer&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ Initializer(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ launchConnectionHandler(String): void&lt;br/&gt;+ getPlayerMode(ConnectionHandler): void&lt;br/&gt;+ launchGameServer(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="3498" y="3199" width="304" height="138" as="geometry" />
+    </mxCell>
+    <mxCell id="node83" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;InputHandler&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- InputHandler(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- moveDown: boolean&lt;br/&gt;- sdMoveDown: boolean&lt;br/&gt;- moveRight: boolean&lt;br/&gt;- bomb: boolean&lt;br/&gt;- isPause: boolean&lt;br/&gt;- attack: boolean&lt;br/&gt;- sdAttack: boolean&lt;br/&gt;- moveLeft: boolean&lt;br/&gt;- sdMoveUp: boolean&lt;br/&gt;- sdBomb: boolean&lt;br/&gt;- moveUp: boolean&lt;br/&gt;- sdMoveLeft: boolean&lt;br/&gt;- sdMoveRight: boolean&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ handleKeyRelease(KeyEvent): void&lt;br/&gt;+ handleKeyPress(KeyEvent): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; attack: boolean&lt;br/&gt; sdMoveLeft: boolean&lt;br/&gt; sdAttack: boolean&lt;br/&gt; sdMoveRight: boolean&lt;br/&gt; moveRight: boolean&lt;br/&gt; sdMoveUp: boolean&lt;br/&gt; moveDown: boolean&lt;br/&gt; isPause: boolean&lt;br/&gt; moveLeft: boolean&lt;br/&gt; sdMoveDown: boolean&lt;br/&gt; instance: InputHandler&lt;br/&gt; bomb: boolean&lt;br/&gt; sdBomb: boolean&lt;br/&gt; moveUp: boolean&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="1549" y="1658" width="261" height="736" as="geometry" />
+    </mxCell>
+    <mxCell id="node81" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;IntroController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ IntroController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- videoEnd(): void&lt;br/&gt;- nextVideo(): void&lt;br/&gt;+ initialize(URL, ResourceBundle): void&lt;br/&gt;- createMediaPlayer(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="1693" y="3199" width="273" height="151" as="geometry" />
+    </mxCell>
+    <mxCell id="node71" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;LoadingScreenController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ LoadingScreenController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- loadStatistics(): void&lt;br/&gt;- setLoadingTips(): void&lt;br/&gt;+ initialize(URL, ResourceBundle): void&lt;br/&gt;- setImages(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="1057" y="3199" width="273" height="151" as="geometry" />
+    </mxCell>
+    <mxCell id="node48" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;LoginController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ LoginController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- switchScene(String): void&lt;br/&gt;- login(): void&lt;br/&gt;- back(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="4765" y="3199" width="205" height="138" as="geometry" />
+    </mxCell>
+    <mxCell id="node78" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;Main&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ Main(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ main(String[]): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="3979" y="3545" width="164" height="89" as="geometry" />
+    </mxCell>
+    <mxCell id="node72" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;MainMenuController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ MainMenuController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- statisticsScene(): void&lt;br/&gt;- playScene(): void&lt;br/&gt;- mapScene(): void&lt;br/&gt;- exit(): void&lt;br/&gt;- switchScene(String): void&lt;br/&gt;- settingsScene(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="2428" y="2894" width="208" height="197" as="geometry" />
+    </mxCell>
+    <mxCell id="node84" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;MapData&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;# MapData(String, String, int, int, String): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- mapData: String&lt;br/&gt;- mapName: String&lt;br/&gt;- mapWidth: int&lt;br/&gt;- mapHeight: int&lt;br/&gt;- mapID: String&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; mapData: String&lt;br/&gt; mapHeight: int&lt;br/&gt; mapName: String&lt;br/&gt; mapID: String&lt;br/&gt; mapWidth: int&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="4750" y="1658" width="292" height="294" as="geometry" />
+    </mxCell>
+    <mxCell id="node37" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;MapForgeController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ MapForgeController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- updateMapScene(): void&lt;br/&gt;- backButton(): void&lt;br/&gt;- mapEditorScene(): void&lt;br/&gt;- switchScene(String): void&lt;br/&gt;- communityMapScene(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="4315" y="2894" width="222" height="174" as="geometry" />
+    </mxCell>
+    <mxCell id="node19" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;MapInfo&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;# MapInfo(String, String, int, int, int): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- mapID: String&lt;br/&gt;- mapDownloads: int&lt;br/&gt;- mapWidth: int&lt;br/&gt;- mapHeight: int&lt;br/&gt;- mapName: String&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; mapHeight: int&lt;br/&gt; mapDownloads: int&lt;br/&gt; mapName: String&lt;br/&gt; mapID: String&lt;br/&gt; mapWidth: int&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="5087" y="1658" width="267" height="294" as="geometry" />
+    </mxCell>
+    <mxCell id="node38" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;MapSelectionController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ MapSelectionController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- backButton(): void&lt;br/&gt;+ initialize(URL, ResourceBundle): void&lt;br/&gt;- gameScene(): void&lt;br/&gt;- setTexture(): void&lt;br/&gt;- setMap(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="3997" y="2894" width="273" height="174" as="geometry" />
+    </mxCell>
+    <mxCell id="node66" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt;enumeration&amp;gt;&amp;gt;&lt;/i&gt;&lt;br/&gt;&lt;b&gt;MapType&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ MapType(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ valueOf(String): MapType&lt;br/&gt;+ values(): MapType[]&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="4509" y="3395" width="205" height="131" as="geometry" />
+    </mxCell>
+    <mxCell id="node107" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;Marker&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ Marker(int, int, GraphicsContext, int): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- player: int&lt;br/&gt;- OBJECT_TYPE: ObjectType&lt;br/&gt;- boxCollider: BoundingBox&lt;br/&gt;- OBJECT_STATUS: ObjectStatus&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ gotHit(int): void&lt;br/&gt;+ initializeEntity(): void&lt;br/&gt;+ loadEntitySprites(): void&lt;br/&gt;+ updateEntity(GameSceneController, GraphicsContext): void&lt;br/&gt;+ placeBombAction(IEntity, GraphicsContext): void&lt;br/&gt;+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void&lt;br/&gt;+ renderEntity(GraphicsContext): void&lt;br/&gt;+ attack(IEntity, GraphicsContext): void&lt;br/&gt;+ healPlayer(int): void&lt;br/&gt;+ updateEntityWalkAnimation(): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; objectStatus: ObjectStatus&lt;br/&gt; entityDirection: EntityDirection&lt;br/&gt; OBJECT_TYPE: ObjectType&lt;br/&gt; OBJECT_STATUS: ObjectStatus&lt;br/&gt; entitySpeed: int&lt;br/&gt; health: int&lt;br/&gt; mapPosX: int&lt;br/&gt; player: int&lt;br/&gt; mapPosY: int&lt;br/&gt; maxEntityHealth: int&lt;br/&gt; boxCollider: BoundingBox&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="2024" y="762" width="446" height="644" as="geometry" />
+    </mxCell>
+    <mxCell id="node17" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;MenuBorderPaneController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ MenuBorderPaneController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- easterEgg(): void&lt;br/&gt;+ initialize(URL, ResourceBundle): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="1226" y="3395" width="273" height="113" as="geometry" />
+    </mxCell>
+    <mxCell id="node18" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;MultiplayerController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ MultiplayerController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- multiplayerCreateScene(): void&lt;br/&gt;- multiplayerJoinScene(): void&lt;br/&gt;- switchScene(String): void&lt;br/&gt;- backButton(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="2315" y="3199" width="237" height="151" as="geometry" />
+    </mxCell>
+    <mxCell id="node106" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;MultiplayerCreateController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ MultiplayerCreateController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- switchScene(String): void&lt;br/&gt;- start(): void&lt;br/&gt;- backButton(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="4165" y="3199" width="264" height="138" as="geometry" />
+    </mxCell>
+    <mxCell id="node58" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;MultiplayerJoinController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ MultiplayerJoinController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- switchScene(String): void&lt;br/&gt;- backButton(): void&lt;br/&gt;- connect(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="4474" y="3199" width="246" height="138" as="geometry" />
+    </mxCell>
+    <mxCell id="node2" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;MusicPlayer&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- MusicPlayer(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- scheduler: ScheduledExecutorService&lt;br/&gt;- mediaPlayer: MediaPlayer&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- updateMusic(): void&lt;br/&gt;- playRandomMusic(): void&lt;br/&gt;- stopMusic(): void&lt;br/&gt;+ startGameStateMonitoring(): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; scheduler: ScheduledExecutorService&lt;br/&gt; mediaPlayer: MediaPlayer&lt;br/&gt; musicPlayerGameState: GameState&lt;br/&gt; volume: int&lt;br/&gt; instance: MusicPlayer&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="4096" y="1658" width="282" height="322" as="geometry" />
+    </mxCell>
+    <mxCell id="node35" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;NetworkPlayerTwo&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ NetworkPlayerTwo(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- health: int&lt;br/&gt;- boxCollider: BoundingBox&lt;br/&gt;- entityDirection: EntityDirection&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- initializePlayerStats(): void&lt;br/&gt;- loadSentinelsSprites(): void&lt;br/&gt;+ updateEntityWalkAnimation(): void&lt;br/&gt;- loadLowBornSprites(): void&lt;br/&gt;- loadWeaponSprites(): void&lt;br/&gt;- loadHumanSprites(): void&lt;br/&gt;- hitEnemy(IEntity, BoundingBox): void&lt;br/&gt;+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void&lt;br/&gt;+ attack(IEntity, GraphicsContext): void&lt;br/&gt;- loadHighBornSprites(): void&lt;br/&gt;+ placeBombAction(IEntity, GraphicsContext): void&lt;br/&gt;+ renderEntity(GraphicsContext): void&lt;br/&gt;+ gotHit(int): void&lt;br/&gt;+ healPlayer(int): void&lt;br/&gt;+ loadEntitySprites(): void&lt;br/&gt;- updateHealth(): void&lt;br/&gt;+ initializeEntity(): void&lt;br/&gt;+ updateEntity(GameSceneController, GraphicsContext): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; objectStatus: ObjectStatus&lt;br/&gt; entityDirection: EntityDirection&lt;br/&gt; OBJECT_TYPE: ObjectType&lt;br/&gt; OBJECT_STATUS: ObjectStatus&lt;br/&gt; entitySpeed: int&lt;br/&gt; health: int&lt;br/&gt; mapPosX: int&lt;br/&gt; player: int&lt;br/&gt; mapPosY: int&lt;br/&gt; maxEntityHealth: int&lt;br/&gt; boxCollider: BoundingBox&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="626" y="682" width="446" height="805" as="geometry" />
+    </mxCell>
+    <mxCell id="node22" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;NotAnIpAddressException&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ NotAnIpAddressException(String): &lt;br/&gt;+ NotAnIpAddressException(): &lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="4386" y="3545" width="264" height="83" as="geometry" />
+    </mxCell>
+    <mxCell id="node94" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt;enumeration&amp;gt;&amp;gt;&lt;/i&gt;&lt;br/&gt;&lt;b&gt;ObjectStatus&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ ObjectStatus(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ values(): ObjectStatus[]&lt;br/&gt;+ valueOf(String): ObjectStatus&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="2667" y="3395" width="228" height="131" as="geometry" />
+    </mxCell>
+    <mxCell id="node77" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt;enumeration&amp;gt;&amp;gt;&lt;/i&gt;&lt;br/&gt;&lt;b&gt;ObjectType&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ ObjectType(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ valueOf(String): ObjectType&lt;br/&gt;+ values(): ObjectType[]&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="3206" y="3395" width="219" height="131" as="geometry" />
+    </mxCell>
+    <mxCell id="node82" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;OracleDB&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ OracleDB(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ getCommunityMapByID(String): MapData&lt;br/&gt;+ uploadCommunityMap(MapData): void&lt;br/&gt;+ getStatistics(String): PlayerStatistics&lt;br/&gt;+ updatePlayerStats(PlayerStatistics, PlayerAccount): void&lt;br/&gt;+ connect(): Connection&lt;br/&gt;+ createPlayer(String, String): void&lt;br/&gt;+ checkCredentials(String): String&lt;br/&gt;+ getLoginData(): void&lt;br/&gt;+ resetPlayerStats(PlayerAccount): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; coreMaps: ArrayList&amp;lt;MapData&amp;gt;&lt;br/&gt; communityMapsList: ArrayList&amp;lt;MapInfo&amp;gt;&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="2270" y="1974" width="395" height="317" as="geometry" />
+    </mxCell>
+    <mxCell id="node96" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;Parser&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ Parser(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ ipAddressValid(String): void&lt;br/&gt;+ volumeValid(int): void&lt;br/&gt;+ usernameValid(String): void&lt;br/&gt;+ mapNameValid(String): void&lt;br/&gt;+ sha1HexHashValid(String): void&lt;br/&gt;+ mapDataValid(String): void&lt;br/&gt;+ playerStatsValid(PlayerStatistics): void&lt;br/&gt;+ passwordValid(String): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="968" y="2894" width="283" height="243" as="geometry" />
+    </mxCell>
+    <mxCell id="node46" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;ParserException&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ ParserException(): &lt;br/&gt;+ ParserException(String): &lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="4959" y="3545" width="201" height="83" as="geometry" />
+    </mxCell>
+    <mxCell id="node36" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;PauseController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ PauseController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- settings(): void&lt;br/&gt;- resume(): void&lt;br/&gt;- mainMenu(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="5015" y="3199" width="175" height="138" as="geometry" />
+    </mxCell>
+    <mxCell id="node80" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;PauseSettingsController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ PauseSettingsController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- setSfxVolume(): void&lt;br/&gt;- backButton(): void&lt;br/&gt;- setMusicVolume(): void&lt;br/&gt;+ initialize(URL, ResourceBundle): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="1375" y="3199" width="273" height="151" as="geometry" />
+    </mxCell>
+    <mxCell id="node53" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;Persistence&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- Persistence(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- statistics: PlayerStatistics&lt;br/&gt;- coreMaps: ArrayList&amp;lt;MapData&amp;gt;&lt;br/&gt;- account: PlayerAccount&lt;br/&gt;- communityMaps: ArrayList&amp;lt;MapData&amp;gt;&lt;br/&gt;- settings: AppSettings&lt;br/&gt;- communityMapsListRemote: ArrayList&amp;lt;MapInfo&amp;gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ updateCoreMaps(): void&lt;br/&gt;+ getCommunityMap(String): void&lt;br/&gt;+ verifyAppSettings(): void&lt;br/&gt;+ resetPlayerStatistics(): void&lt;br/&gt;+ resetCoreMaps(): void&lt;br/&gt;+ loadPlayerStatistics(): void&lt;br/&gt;+ verifyCoreMaps(): void&lt;br/&gt;+ verifyCommunityMaps(): void&lt;br/&gt;+ loadCommunityMaps(): void&lt;br/&gt;+ loadPlayerAccount(): void&lt;br/&gt;+ login(String, String): void&lt;br/&gt;+ saveCreatedMap(MapData, boolean): void&lt;br/&gt;+ updatePlayerStatistics(int, int, int, int, boolean): void&lt;br/&gt;+ resetPlayerAccount(): void&lt;br/&gt;+ verifyPlayerAccount(): void&lt;br/&gt;+ resetSettings(): void&lt;br/&gt;+ saveSettings(): void&lt;br/&gt;+ createAccount(String, String, AccountType): void&lt;br/&gt;+ loadSettings(): void&lt;br/&gt;+ resetCommunityMaps(): void&lt;br/&gt;+ savePlayerStatistics(): void&lt;br/&gt;+ createRemoteCommunityMapsList(): void&lt;br/&gt;+ loadCoreMaps(): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; instance: Persistence&lt;br/&gt; coreMaps: ArrayList&amp;lt;MapData&amp;gt;&lt;br/&gt; statistics: PlayerStatistics&lt;br/&gt; communityMaps: ArrayList&amp;lt;MapData&amp;gt;&lt;br/&gt; settings: AppSettings&lt;br/&gt; communityMapsListRemote: ArrayList&amp;lt;MapInfo&amp;gt;&lt;br/&gt; account: PlayerAccount&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="815" y="1658" width="373" height="897" as="geometry" />
+    </mxCell>
+    <mxCell id="node30" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;PlaceholderController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ PlaceholderController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ initialize(URL, ResourceBundle): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="576" y="3545" width="273" height="89" as="geometry" />
+    </mxCell>
+    <mxCell id="node86" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;PlayController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ PlayController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- multiplayerScene(): void&lt;br/&gt;- localScene(): void&lt;br/&gt;- switchScene(String): void&lt;br/&gt;- backButton(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="2869" y="3199" width="205" height="151" as="geometry" />
+    </mxCell>
+    <mxCell id="node68" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;Player&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ Player(GraphicsContext, InputHandler, EntityClass, GameSceneController, PlayerMode): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- mapPosX: int&lt;br/&gt;- boxCollider: BoundingBox&lt;br/&gt;- mapPosY: int&lt;br/&gt;- health: int&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- initializePlayerStats(): void&lt;br/&gt;+ initializeEntity(): void&lt;br/&gt;- performEntityCollision(boolean): void&lt;br/&gt;+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void&lt;br/&gt;- performEntityMovement(boolean, GraphicsContext): void&lt;br/&gt;- updateAttackRate(): void&lt;br/&gt;+ updateBlastradius(int): int&lt;br/&gt;+ gotHit(int): void&lt;br/&gt;- updateInvincibility(): void&lt;br/&gt;+ renderEntity(GraphicsContext): void&lt;br/&gt;- updateBombPlacementRate(): void&lt;br/&gt;- placeMarker(int, int, GraphicsContext): boolean&lt;br/&gt;- findNearestTpTile(int, int, GraphicsContext): boolean&lt;br/&gt;+ loadEntitySprites(): void&lt;br/&gt;- loadLowBornSprites(): void&lt;br/&gt;- removeMarker(boolean): boolean&lt;br/&gt;+ attack(IEntity, GraphicsContext): void&lt;br/&gt;- updateBombPlacementRate(int): int&lt;br/&gt;+ placeBombAction(IEntity, GraphicsContext): void&lt;br/&gt;- hitEnemy(IEntity, BoundingBox): void&lt;br/&gt;- loadSentinelsSprites(): void&lt;br/&gt;+ updateEntity(GameSceneController, GraphicsContext): void&lt;br/&gt;- loadWeaponSprites(): void&lt;br/&gt;+ healPlayer(int): void&lt;br/&gt;- loadHumanSprites(): void&lt;br/&gt;+ updateEntityWalkAnimation(): void&lt;br/&gt;- checkTilePlacing(int, int): boolean&lt;br/&gt;- loadHighBornSprites(): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; objectStatus: ObjectStatus&lt;br/&gt; entityDirection: EntityDirection&lt;br/&gt; OBJECT_TYPE: ObjectType&lt;br/&gt; OBJECT_STATUS: ObjectStatus&lt;br/&gt; entitySpeed: int&lt;br/&gt; health: int&lt;br/&gt; mapPosX: int&lt;br/&gt; player: int&lt;br/&gt; mapPosY: int&lt;br/&gt; maxEntityHealth: int&lt;br/&gt; boxCollider: BoundingBox&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="5286" y="555" width="446" height="1058" as="geometry" />
+    </mxCell>
+    <mxCell id="node92" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;PlayerAccount&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ PlayerAccount(String, String, AccountType): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- accountPassword: String&lt;br/&gt;- accountType: AccountType&lt;br/&gt;- playerName: String&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; playerName: String&lt;br/&gt; accountType: AccountType&lt;br/&gt; accountPassword: String&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="2058" y="2894" width="325" height="202" as="geometry" />
+    </mxCell>
+    <mxCell id="node10" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;PlayerCreateController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ PlayerCreateController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- createScene(): void&lt;br/&gt;- loginScene(): void&lt;br/&gt;- exit(): void&lt;br/&gt;- switchScene(String): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="2597" y="3199" width="227" height="151" as="geometry" />
+    </mxCell>
+    <mxCell id="node89" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt;enumeration&amp;gt;&amp;gt;&lt;/i&gt;&lt;br/&gt;&lt;b&gt;PlayerMode&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ PlayerMode(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ valueOf(String): PlayerMode&lt;br/&gt;+ values(): PlayerMode[]&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="2940" y="3395" width="221" height="131" as="geometry" />
+    </mxCell>
+    <mxCell id="node69" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;PlayerStatistics&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ PlayerStatistics(int, int, int, int, int, int): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- blocksDestroyed: int&lt;br/&gt;- gamesLost: int&lt;br/&gt;- kills: int&lt;br/&gt;- deaths: int&lt;br/&gt;- gameTime: int&lt;br/&gt;- gamesWon: int&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;# addGamesWon(): void&lt;br/&gt;# addDeaths(int): void&lt;br/&gt;# addBlocksDestroyed(int): void&lt;br/&gt;# addGameTime(int): void&lt;br/&gt;# addKills(int): void&lt;br/&gt;# addGamesLost(): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; gameTimeInHours: int&lt;br/&gt; gamesWon: int&lt;br/&gt; gameTime: int&lt;br/&gt; kills: int&lt;br/&gt; gamesLost: int&lt;br/&gt; blocksDestroyed: int&lt;br/&gt; deaths: int&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="3099" y="1658" width="293" height="506" as="geometry" />
+    </mxCell>
+    <mxCell id="node79" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;RuntimeInfo&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- RuntimeInfo(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- playerID: int&lt;br/&gt;- connectionHandler: ConnectionHandler&lt;br/&gt;- gameWon: boolean&lt;br/&gt;- server: Server&lt;br/&gt;- enemyPlayerMode: PlayerMode&lt;br/&gt;- mapDataGame: String&lt;br/&gt;- playerOneClass: EntityClass&lt;br/&gt;- mapBiom: Biom&lt;br/&gt;- blocksDestroyed: int&lt;br/&gt;- gameMode: GameMode&lt;br/&gt;- gameplayObjects: List&amp;lt;IEntity&amp;gt;&lt;br/&gt;- enemyPlayerClass: EntityClass&lt;br/&gt;- kills: int&lt;br/&gt;- gameState: GameState&lt;br/&gt;- deaths: int&lt;br/&gt;- playerMode: PlayerMode&lt;br/&gt;- gameTime: int&lt;br/&gt;- playerTwoClass: EntityClass&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ resetGameStats(): void&lt;br/&gt;+ addBlockDestroyed(): void&lt;br/&gt;+ generateMap(String, String): MapData&lt;br/&gt;+ addGameTime(): void&lt;br/&gt;+ addDeath(): void&lt;br/&gt;+ addKill(): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; gameTime: int&lt;br/&gt; playerOneClass: EntityClass&lt;br/&gt; gameMap: MapData&lt;br/&gt; gameplayObjects: List&amp;lt;IEntity&amp;gt;&lt;br/&gt; kills: int&lt;br/&gt; blocksDestroyed: int&lt;br/&gt; server: Server&lt;br/&gt; mapBiom: Biom&lt;br/&gt; deaths: int&lt;br/&gt; playerTwoClass: EntityClass&lt;br/&gt; mapDataGame: String&lt;br/&gt; instance: RuntimeInfo&lt;br/&gt; playerMode: PlayerMode&lt;br/&gt; gameMode: GameMode&lt;br/&gt; gameWon: boolean&lt;br/&gt; enemyPlayerMode: PlayerMode&lt;br/&gt; connectionHandler: ConnectionHandler&lt;br/&gt; gameState: GameState&lt;br/&gt; playerID: int&lt;br/&gt; enemyPlayerClass: EntityClass&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="478" y="1658" width="292" height="1081" as="geometry" />
+    </mxCell>
+    <mxCell id="node102" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt;enumeration&amp;gt;&amp;gt;&lt;/i&gt;&lt;br/&gt;&lt;b&gt;SFX&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- SFX(String): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- path: String&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ values(): SFX[]&lt;br/&gt;+ valueOf(String): SFX&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; path: String&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="5316" y="2894" width="171" height="161" as="geometry" />
+    </mxCell>
+    <mxCell id="node63" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt;enumeration&amp;gt;&amp;gt;&lt;/i&gt;&lt;br/&gt;&lt;b&gt;SFXLoop&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- SFXLoop(String): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- path: String&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ values(): SFXLoop[]&lt;br/&gt;+ valueOf(String): SFXLoop&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; path: String&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="4843" y="2894" width="202" height="161" as="geometry" />
+    </mxCell>
+    <mxCell id="node59" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;SQLException&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ SQLException(): &lt;br/&gt;+ SQLException(String): &lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="5449" y="3545" width="186" height="83" as="geometry" />
+    </mxCell>
+    <mxCell id="node12" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;SceneLoader&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ SceneLoader(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ loadScene(String): Pane&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="2407" y="3545" width="195" height="89" as="geometry" />
+    </mxCell>
+    <mxCell id="node65" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;Server&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ Server(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- started: boolean&lt;br/&gt;- playerCount: int&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ startServer(): void&lt;br/&gt;+ stopServer(): void&lt;br/&gt;+ start(int): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; playerCount: int&lt;br/&gt; started: boolean&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="3875" y="1658" width="158" height="230" as="geometry" />
+    </mxCell>
+    <mxCell id="node110" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;ServerHandler&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ ServerHandler(Socket): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ run(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="3856" y="1985" width="195" height="89" as="geometry" />
+    </mxCell>
+    <mxCell id="node103" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;SettingsController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ SettingsController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- backButton(): void&lt;br/&gt;- account(): void&lt;br/&gt;- setMusicVolume(): void&lt;br/&gt;- switchScene(String): void&lt;br/&gt;- creditScene(): void&lt;br/&gt;+ initialize(URL, ResourceBundle): void&lt;br/&gt;- setSfxVolume(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="1740" y="2894" width="273" height="220" as="geometry" />
+    </mxCell>
+    <mxCell id="node101" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;SfxOnce&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ SfxOnce(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- isNotPlaying: boolean&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ run(): void&lt;br/&gt;+ startSound(SFX): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; isNotPlaying: boolean&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="5090" y="2894" width="181" height="161" as="geometry" />
+    </mxCell>
+    <mxCell id="node61" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;SkinSelectionController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ SkinSelectionController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- skinSelection(ToggleGroup): void&lt;br/&gt;- gameScene(): void&lt;br/&gt;- backButton(): void&lt;br/&gt;+ initialize(URL, ResourceBundle): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; imageWidth: ImageView[]&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="3043" y="2894" width="273" height="179" as="geometry" />
+    </mxCell>
+    <mxCell id="node105" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;SkinSelectionMultiplayerController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ SkinSelectionMultiplayerController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- skinSelection(ToggleGroup): void&lt;br/&gt;- backButton(): void&lt;br/&gt;- gameScene(): void&lt;br/&gt;+ initialize(URL, ResourceBundle): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; imageWidth: ImageView[]&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="2681" y="2894" width="317" height="179" as="geometry" />
+    </mxCell>
+    <mxCell id="node25" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;SoundEffectsVolume&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ SoundEffectsVolume(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; sfxVolume: int&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="1155" y="3545" width="213" height="89" as="geometry" />
+    </mxCell>
+    <mxCell id="node76" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;SoundFileManager&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ SoundFileManager(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;# getFilePathsFromResources(Path): List&amp;lt;Path&amp;gt;&lt;br/&gt;# getRandomFilePath(List&amp;lt;Path&amp;gt;): String&lt;br/&gt;# convertPathToResourcePath(String): String&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="3119" y="3199" width="334" height="138" as="geometry" />
+    </mxCell>
+    <mxCell id="node6" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;StatisticsController&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ StatisticsController(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ iniPieChartWL(): void&lt;br/&gt;- setLabels(): void&lt;br/&gt;+ initialize(URL, ResourceBundle): void&lt;br/&gt;+ mainMenuScene(): void&lt;br/&gt;+ iniPieChartKD(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="3361" y="2894" width="273" height="174" as="geometry" />
+    </mxCell>
+    <mxCell id="node51" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;TeleportationItemFrame&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ TeleportationItemFrame(int, int, GraphicsContext): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- OBJECT_STATUS: ObjectStatus&lt;br/&gt;- OBJECT_TYPE: ObjectType&lt;br/&gt;- boxCollider: BoundingBox&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ healPlayer(int): void&lt;br/&gt;+ loadEntitySprites(): void&lt;br/&gt;+ updateEntity(GameSceneController, GraphicsContext): void&lt;br/&gt;+ checkGameplayObjectInteraction(IEntity, GraphicsContext): void&lt;br/&gt;+ updateEntityWalkAnimation(): void&lt;br/&gt;+ placeBombAction(IEntity, GraphicsContext): void&lt;br/&gt;+ attack(IEntity, GraphicsContext): void&lt;br/&gt;+ initializeEntity(): void&lt;br/&gt;- updateAnimation(): void&lt;br/&gt;+ renderEntity(GraphicsContext): void&lt;br/&gt;+ gotHit(int): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; objectStatus: ObjectStatus&lt;br/&gt; entityDirection: EntityDirection&lt;br/&gt; OBJECT_TYPE: ObjectType&lt;br/&gt; OBJECT_STATUS: ObjectStatus&lt;br/&gt; entitySpeed: int&lt;br/&gt; health: int&lt;br/&gt; mapPosX: int&lt;br/&gt; player: int&lt;br/&gt; mapPosY: int&lt;br/&gt; maxEntityHealth: int&lt;br/&gt; boxCollider: BoundingBox&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="1558" y="762" width="446" height="644" as="geometry" />
+    </mxCell>
+    <mxCell id="node108" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;TestMap&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ TestMap(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ main(String[]): void&lt;br/&gt;+ start(Stage): void&lt;br/&gt;- handleKeyPress(KeyCode, ConnectionHandler): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="160" y="2894" width="373" height="138" as="geometry" />
+    </mxCell>
+    <mxCell id="node32" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;ThreadCreateAcc&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ ThreadCreateAcc(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ startThread(String, String, AccountType): void&lt;br/&gt;+ run(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="160" y="3395" width="334" height="113" as="geometry" />
+    </mxCell>
+    <mxCell id="node4" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;ThreadDLCommMap&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ ThreadDLCommMap(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ run(): void&lt;br/&gt;+ startThread(String): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="4254" y="3395" width="210" height="113" as="geometry" />
+    </mxCell>
+    <mxCell id="node104" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;ThreadGetMapList&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ ThreadGetMapList(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ run(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="2647" y="3545" width="194" height="89" as="geometry" />
+    </mxCell>
+    <mxCell id="node70" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;ThreadLogin&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ ThreadLogin(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ startThread(String, String): void&lt;br/&gt;+ run(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="1544" y="3395" width="243" height="113" as="geometry" />
+    </mxCell>
+    <mxCell id="node15" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;ThreadRstStats&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ ThreadRstStats(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ run(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="3548" y="3545" width="171" height="89" as="geometry" />
+    </mxCell>
+    <mxCell id="node0" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;ThreadSaveCommMap&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ ThreadSaveCommMap(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ run(): void&lt;br/&gt;+ startThread(MapData, boolean): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="907" y="3395" width="274" height="113" as="geometry" />
+    </mxCell>
+    <mxCell id="node91" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;ThreadSaveStats&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ ThreadSaveStats(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ run(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="2886" y="3545" width="183" height="89" as="geometry" />
+    </mxCell>
+    <mxCell id="node56" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;ThreadStartup1&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ ThreadStartup1(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ run(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="3764" y="3545" width="170" height="89" as="geometry" />
+    </mxCell>
+    <mxCell id="node93" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;ThreadStartup2&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ ThreadStartup2(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ run(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="3331" y="3545" width="172" height="89" as="geometry" />
+    </mxCell>
+    <mxCell id="node42" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;ThreadStartup3&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ ThreadStartup3(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ run(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="3114" y="3545" width="172" height="89" as="geometry" />
+    </mxCell>
+    <mxCell id="node27" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt;enumeration&amp;gt;&amp;gt;&lt;/i&gt;&lt;br/&gt;&lt;b&gt;ThreadStatus&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ ThreadStatus(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ values(): ThreadStatus[]&lt;br/&gt;+ valueOf(String): ThreadStatus&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="2116" y="3395" width="231" height="131" as="geometry" />
+    </mxCell>
+    <mxCell id="node47" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;ThreadUpdateMaps&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ ThreadUpdateMaps(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ run(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="1667" y="3545" width="204" height="89" as="geometry" />
+    </mxCell>
+    <mxCell id="node85" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;ThreadUpdateStats&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ ThreadUpdateStats(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ run(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="1916" y="3545" width="202" height="89" as="geometry" />
+    </mxCell>
+    <mxCell id="node29" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;Threads&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- Threads(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- threadUpdateStatsMsg: String&lt;br/&gt;- threadDLCommMap: ThreadStatus&lt;br/&gt;- threadUpdateMapsMsg: String&lt;br/&gt;- threadSaveStatsMsg: String&lt;br/&gt;- threadLogin: ThreadStatus&lt;br/&gt;- threadRstStats: ThreadStatus&lt;br/&gt;- threadUpdateMaps: ThreadStatus&lt;br/&gt;- threadLoginMsg: String&lt;br/&gt;- threadStartup3Msg: String&lt;br/&gt;- threadCreateAccMsg: String&lt;br/&gt;- threadDLCommMapMsg: String&lt;br/&gt;- threadStartup1: ThreadStatus&lt;br/&gt;- threadSaveStats: ThreadStatus&lt;br/&gt;- threadStartup1Msg: String&lt;br/&gt;- threadSaveCommMapMsg: String&lt;br/&gt;- threadCommMapList: ThreadStatus&lt;br/&gt;- threadCommMapListMsg: String&lt;br/&gt;- threadStartup2Msg: String&lt;br/&gt;- threadUpdateStats: ThreadStatus&lt;br/&gt;- threadStartup2: ThreadStatus&lt;br/&gt;- threadStartup3: ThreadStatus&lt;br/&gt;- threadRstStatsMsg: String&lt;br/&gt;- threadCreateAcc: ThreadStatus&lt;br/&gt;- threadSaveCommMap: ThreadStatus&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; threadStartup1: ThreadStatus&lt;br/&gt; threadStartup3: ThreadStatus&lt;br/&gt; threadCommMapList: ThreadStatus&lt;br/&gt; threadSaveStats: ThreadStatus&lt;br/&gt; threadRstStats: ThreadStatus&lt;br/&gt; threadUpdateMapsMsg: String&lt;br/&gt; threadStartup2Msg: String&lt;br/&gt; threadSaveStatsMsg: String&lt;br/&gt; threadDLCommMapMsg: String&lt;br/&gt; threadLoginMsg: String&lt;br/&gt; threadDLCommMap: ThreadStatus&lt;br/&gt; threadUpdateMaps: ThreadStatus&lt;br/&gt; threadCommMapListMsg: String&lt;br/&gt; threadCreateAccMsg: String&lt;br/&gt; threadStartup3Msg: String&lt;br/&gt; instance: Threads&lt;br/&gt; threadStartup2: ThreadStatus&lt;br/&gt; threadSaveCommMap: ThreadStatus&lt;br/&gt; threadLogin: ThreadStatus&lt;br/&gt; threadUpdateStatsMsg: String&lt;br/&gt; threadCreateAcc: ThreadStatus&lt;br/&gt; threadSaveCommMapMsg: String&lt;br/&gt; threadRstStatsMsg: String&lt;br/&gt; threadStartup1Msg: String&lt;br/&gt; threadUpdateStats: ThreadStatus&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="160" y="1658" width="273" height="1191" as="geometry" />
+    </mxCell>
+    <mxCell id="node33" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;TileFactory&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ TileFactory(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ createTile(TileType, TileType, Image, SFXLoop): ITile&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="160" y="3545" width="371" height="89" as="geometry" />
+    </mxCell>
+    <mxCell id="node55" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;TileManager&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ TileManager(GraphicsContext, int, int, int, String, Biom): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ tileMap: int[][]&lt;br/&gt;- tileSet: ITile[]&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- generateMap(String, int, int): void&lt;br/&gt;+ renderMap(): void&lt;br/&gt;- createTiles(Biom): void&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt; tileSet: ITile[]&lt;br/&gt; tileMap: int[][]&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="1296" y="2894" width="399" height="230" as="geometry" />
+    </mxCell>
+    <mxCell id="node73" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;i&gt;&amp;lt;&amp;lt;enumeration&amp;gt;&amp;gt;&lt;/i&gt;&lt;br/&gt;&lt;b&gt;TileType&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ TileType(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ valueOf(String): TileType&lt;br/&gt;+ values(): TileType[]&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="4759" y="3395" width="200" height="131" as="geometry" />
+    </mxCell>
+    <mxCell id="node45" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;ToggleButtonTransition&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ ToggleButtonTransition(ToggleButton): &lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="160" y="3672" width="294" height="58" as="geometry" />
+    </mxCell>
+    <mxCell id="node112" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;UpdateThread&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;- UpdateThread(ConnectionHandler): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ run(): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="-158" y="3211" width="273" height="89" as="geometry" />
+    </mxCell>
+    <mxCell id="node67" parent="1" vertex="1" value="&lt;p style=&quot;margin:0px;margin-top:4px;text-align:center;&quot;&gt;&lt;b&gt;WalkEffects&lt;/b&gt;&lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ WalkEffects(): &lt;/p&gt;&lt;hr size=&quot;1&quot;/&gt;&lt;p style=&quot;margin:0 0 0 4px;line-height:1.6;&quot;&gt;+ run(): void&lt;br/&gt;+ startWalkSound(GameSceneController): void&lt;/p&gt;" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;">
+      <mxGeometry x="539" y="3395" width="323" height="113" as="geometry" />
+    </mxCell>
+    <mxCell id="edge0" edge="1" value="" parent="1" source="node28" target="node50" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;">
+      <mxGeometry width="50" height="50" relative="1" as="geometry">
+        <Array as="points">
+          <mxPoint x="2053" y="1949" />
+          <mxPoint x="2260" y="1949" />
+        </Array>
+      </mxGeometry>
+    </mxCell>
+    <mxCell id="edge3" edge="1" value="" parent="1" source="node31" target="node20" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;">
+      <mxGeometry width="50" height="50" relative="1" as="geometry">
+        <Array as="points" />
+      </mxGeometry>
+    </mxCell>
+    <mxCell id="edge2" edge="1" value="" parent="1" source="node24" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;">
+      <mxGeometry width="50" height="50" relative="1" as="geometry">
+        <Array as="points">
+          <mxPoint x="1315" y="530" />
+          <mxPoint x="2946" y="530" />
+        </Array>
+      </mxGeometry>
+    </mxCell>
+    <mxCell id="edge13" edge="1" value="" parent="1" source="node3" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;">
+      <mxGeometry width="50" height="50" relative="1" as="geometry">
+        <Array as="points">
+          <mxPoint x="383" y="530" />
+          <mxPoint x="2946" y="530" />
+        </Array>
+      </mxGeometry>
+    </mxCell>
+    <mxCell id="edge9" edge="1" value="" parent="1" source="node54" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;">
+      <mxGeometry width="50" height="50" relative="1" as="geometry">
+        <Array as="points">
+          <mxPoint x="3645" y="530" />
+          <mxPoint x="2946" y="530" />
+        </Array>
+      </mxGeometry>
+    </mxCell>
+    <mxCell id="edge10" edge="1" value="" parent="1" source="node97" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;">
+      <mxGeometry width="50" height="50" relative="1" as="geometry">
+        <Array as="points">
+          <mxPoint x="4111" y="530" />
+          <mxPoint x="2946" y="530" />
+        </Array>
+      </mxGeometry>
+    </mxCell>
+    <mxCell id="edge7" edge="1" value="" parent="1" source="node34" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;">
+      <mxGeometry width="50" height="50" relative="1" as="geometry">
+        <Array as="points">
+          <mxPoint x="2713" y="530" />
+          <mxPoint x="2946" y="530" />
+        </Array>
+      </mxGeometry>
+    </mxCell>
+    <mxCell id="edge8" edge="1" value="" parent="1" source="node88" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;">
+      <mxGeometry width="50" height="50" relative="1" as="geometry">
+        <Array as="points">
+          <mxPoint x="3179" y="530" />
+          <mxPoint x="2946" y="530" />
+        </Array>
+      </mxGeometry>
+    </mxCell>
+    <mxCell id="edge16" edge="1" value="" parent="1" source="node109" target="node99" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=circlePlus;startFill=0;endArrow=none;strokeColor=#820000;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=0.000;entryDx=0;entryDy=0;">
+      <mxGeometry width="50" height="50" relative="1" as="geometry">
+        <Array as="points">
+          <mxPoint x="11" y="1606" />
+          <mxPoint x="1369" y="1606" />
+        </Array>
+      </mxGeometry>
+    </mxCell>
+    <mxCell id="edge17" edge="1" value="" parent="1" source="node111" target="node14" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=circlePlus;startFill=0;endArrow=none;strokeColor=#820000;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;">
+      <mxGeometry width="50" height="50" relative="1" as="geometry">
+        <Array as="points" />
+      </mxGeometry>
+    </mxCell>
+    <mxCell id="edge12" edge="1" value="" parent="1" source="node40" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;">
+      <mxGeometry width="50" height="50" relative="1" as="geometry">
+        <Array as="points">
+          <mxPoint x="5043" y="530" />
+          <mxPoint x="2946" y="530" />
+        </Array>
+      </mxGeometry>
+    </mxCell>
+    <mxCell id="edge11" edge="1" value="" parent="1" source="node8" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;">
+      <mxGeometry width="50" height="50" relative="1" as="geometry">
+        <Array as="points">
+          <mxPoint x="4577" y="530" />
+          <mxPoint x="2946" y="530" />
+        </Array>
+      </mxGeometry>
+    </mxCell>
+    <mxCell id="edge6" edge="1" value="" parent="1" source="node107" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;">
+      <mxGeometry width="50" height="50" relative="1" as="geometry">
+        <Array as="points">
+          <mxPoint x="2247" y="530" />
+          <mxPoint x="2946" y="530" />
+        </Array>
+      </mxGeometry>
+    </mxCell>
+    <mxCell id="edge1" edge="1" value="" parent="1" source="node35" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;">
+      <mxGeometry width="50" height="50" relative="1" as="geometry">
+        <Array as="points">
+          <mxPoint x="849" y="530" />
+          <mxPoint x="2946" y="530" />
+        </Array>
+      </mxGeometry>
+    </mxCell>
+    <mxCell id="edge5" edge="1" value="" parent="1" source="node82" target="node50" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;">
+      <mxGeometry width="50" height="50" relative="1" as="geometry">
+        <Array as="points">
+          <mxPoint x="2468" y="1949" />
+          <mxPoint x="2260" y="1949" />
+        </Array>
+      </mxGeometry>
+    </mxCell>
+    <mxCell id="edge14" edge="1" value="" parent="1" source="node68" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;">
+      <mxGeometry width="50" height="50" relative="1" as="geometry">
+        <Array as="points">
+          <mxPoint x="5509" y="530" />
+          <mxPoint x="2946" y="530" />
+        </Array>
+      </mxGeometry>
+    </mxCell>
+    <mxCell id="edge18" edge="1" value="" parent="1" source="node110" target="node65" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=circlePlus;startFill=0;endArrow=none;strokeColor=#820000;exitX=0.500;exitY=0.001;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;">
+      <mxGeometry width="50" height="50" relative="1" as="geometry">
+        <Array as="points" />
+      </mxGeometry>
+    </mxCell>
+    <mxCell id="edge4" edge="1" value="" parent="1" source="node51" target="node13" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;">
+      <mxGeometry width="50" height="50" relative="1" as="geometry">
+        <Array as="points">
+          <mxPoint x="1781" y="530" />
+          <mxPoint x="2946" y="530" />
+        </Array>
+      </mxGeometry>
+    </mxCell>
+    <mxCell id="edge15" edge="1" value="" parent="1" source="node112" target="node108" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=circlePlus;startFill=0;endArrow=none;strokeColor=#820000;exitX=0.500;exitY=0.001;exitDx=0;exitDy=0;entryX=0.000;entryY=0.957;entryDx=0;entryDy=0;">
+      <mxGeometry width="50" height="50" relative="1" as="geometry">
+        <Array as="points">
+          <mxPoint x="-21" y="3017" />
+        </Array>
+      </mxGeometry>
+    </mxCell>
+  </root>
+</mxGraphModel>
\ No newline at end of file
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/CreateAccountController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/CreateAccountController.java
index 26fedf89d991531bea80c5d98b1b4022bf3d81ff..88f6abb7be99ae40d5a1f51f376e00577af530f8 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/CreateAccountController.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/CreateAccountController.java
@@ -31,7 +31,7 @@ public class CreateAccountController implements Initializable {
     private String selectedButton;
     private final SceneLoader sceneLoader = new SceneLoader();
     private final Persistence persistence = Persistence.getInstance();
-    private static final Logger log = LogManager.getLogger(SceneLoader.class);
+    private static final Logger log = LogManager.getLogger(CreateAccountController.class);
 
     @Override
     public void initialize(URL url, ResourceBundle resourceBundle) {
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/Enum/GameState.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/Enum/GameState.java
index ae6aecc05a1481b74063a0a7978f0644a6d056a0..d17c0fcd373e70c274dd666e42bc7faa51d062ee 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/Enum/GameState.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/Enum/GameState.java
@@ -11,7 +11,7 @@ public enum GameState {
     MEMES("src/main/resources/sound/music/memes"),
     TEST("src/main/resources/sound/music/wrongFile");
 
-    private String path;
+    private final String path;
     GameState(String path){
         this.path = path;
     }
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameOverController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameOverController.java
index f36ed3cc4c9964c3ecd77c33c2ba74e09e9575b9..b66e62eb43cb6ca4bd54e86f8d201b5a71fb73dc 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameOverController.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameOverController.java
@@ -1,5 +1,7 @@
 package de.hdm_stuttgart.battlearena.Controller;
 
+import de.hdm_stuttgart.battlearena.Controller.Enum.GameState;
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo;
 import javafx.fxml.FXML;
 import javafx.fxml.FXMLLoader;
 import javafx.scene.layout.VBox;
@@ -13,6 +15,7 @@ public class GameOverController {
 
     @FXML
     private void mainMenu() throws IOException {
+        RuntimeInfo.getInstance().setGameState(GameState.MENU);
         parent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/MenuBorderPane.fxml"))));
     }
 }
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameSceneController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameSceneController.java
index 461b939f5a41131f81508444ddfc493c10b1f1a6..089bf0d34e638f0f18d6525d62fefe2502f51066 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameSceneController.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/GameSceneController.java
@@ -1,7 +1,6 @@
 package de.hdm_stuttgart.battlearena.Controller;
 
 import de.hdm_stuttgart.battlearena.Controller.Utilities.SceneLoader;
-import de.hdm_stuttgart.battlearena.Controller.Utilities.ScreenDimensionCalculator;
 import de.hdm_stuttgart.battlearena.Controller.Enum.GameMode;
 import de.hdm_stuttgart.battlearena.Controller.Enum.GameState;
 import de.hdm_stuttgart.battlearena.Controller.Enum.PlayerMode;
@@ -18,7 +17,6 @@ import de.hdm_stuttgart.battlearena.Model.Map.TileManager;
 import javafx.animation.AnimationTimer;
 import javafx.fxml.FXML;
 import javafx.fxml.Initializable;
-import javafx.geometry.Rectangle2D;
 import javafx.scene.Node;
 import javafx.scene.canvas.Canvas;
 import javafx.scene.canvas.GraphicsContext;
@@ -47,19 +45,15 @@ public class GameSceneController implements Initializable {
     @FXML
     private Pane playerPane, enemyPane;
     @FXML
-    private Label playerHp, enemyHp, time, round;
+    private Label playerHp, enemyHp;
     @FXML
     private StackPane stackPane;
     private final Pane pause = new SceneLoader().loadScene("Pause"), gameOver = new SceneLoader().loadScene("GameOver");
-
     private final long targetFrameTime = 1_000_000_000 / 80; // sets the target frame time to 12.5 ms (80fps)
     private long lastFrame = 0;
     private boolean wasPaused;
     private final Screen screen = Screen.getPrimary();
-    private final Rectangle2D visualBounds = screen.getVisualBounds();
     final private double healthBarWidth = screen.getBounds().getWidth() / 5;
-    ScreenDimensionCalculator screenCalculator = new ScreenDimensionCalculator();
-
     private GraphicsContext graphicsContext2D;
     InputHandler inputHandler = InputHandler.getInstance();
     RuntimeInfo runtimeInfo = RuntimeInfo.getInstance();
@@ -67,7 +61,7 @@ public class GameSceneController implements Initializable {
     IEntity player;
     IEntity enemy;
     EntityClass playerOneClass = runtimeInfo.getPlayerOneClass();
-    EntityClass playerTwoClass = runtimeInfo.getPlayerTwoClass();
+    EntityClass playerTwoClass = runtimeInfo.getPlayerTwoClass(); // null
     TileManager tileManager;
 
     //map data
@@ -85,20 +79,20 @@ public class GameSceneController implements Initializable {
         graphicsContext2D = canvas2D.getGraphicsContext2D();
         graphicsContext2D.setImageSmoothing(false);
 
-        player = EntityFactory.createEntity(EntityType.PLAYER, graphicsContext2D, inputHandler,
-                playerOneClass, this, PlayerMode.PLAYER_ONE);
         if (gameMode == GameMode.NETWORK) {
+            player = EntityFactory.createEntity(EntityType.PLAYER, graphicsContext2D, inputHandler,
+                    playerOneClass, this, runtimeInfo.getPlayerMode());
             enemy = EntityFactory.createEntity(EntityType.NETWORK_PLAYER_TWO, graphicsContext2D, inputHandler,
-                    playerTwoClass, this, PlayerMode.PLAYER_TWO);
+                    playerTwoClass, this, runtimeInfo.getEnemyPlayerMode());
         } else {
+            player = EntityFactory.createEntity(EntityType.PLAYER, graphicsContext2D, inputHandler,
+                    playerOneClass, this, PlayerMode.PLAYER_ONE);
             enemy = EntityFactory.createEntity(EntityType.PLAYER, graphicsContext2D, inputHandler,
                     playerTwoClass, this, PlayerMode.PLAYER_TWO);
         }
-
         tileManager = new TileManager(graphicsContext2D, diffTileCount, horizontalTileCount,
                 verticalTileCount, runtimeInfo.getMapDataGame(), biom);
 
-
         runtimeInfo.setGameState(GameState.PLAYING);
 
         gameLoop = new AnimationTimer() {
@@ -204,7 +198,6 @@ public class GameSceneController implements Initializable {
         player.attack(enemy, graphicsContext2D);
         enemy.attack(player, graphicsContext2D);
         updateGameplayObjects();
-        updateExplosionspawns();
         player.checkGameplayObjectInteraction(player, graphicsContext2D);
         enemy.checkGameplayObjectInteraction(enemy, graphicsContext2D);
         player.placeBombAction(player, graphicsContext2D);
@@ -245,7 +238,8 @@ public class GameSceneController implements Initializable {
             for (IEntity gameplayObject : gameplayObjects) {
                 gameplayObject.renderEntity(graphicsContext);
             }
-        } catch (ConcurrentModificationException ignore){}
+        } catch (ConcurrentModificationException ignore) {
+        }
     }
 
     private void updateGameplayObjects() {
@@ -255,13 +249,6 @@ public class GameSceneController implements Initializable {
         runtimeInfo.setGameplayObjects(updateList);
         log.debug("Gameplay objects updated");
     }
-    private void updateExplosionspawns() {
-        List<IEntity> explosionspawns = runtimeInfo.getExplosionspawns();
-        List<IEntity> updateList = explosionspawns.stream().filter(obj -> obj.getOBJECT_STATUS() != ObjectStatus.USED)
-                .collect(Collectors.toList());
-        runtimeInfo.setExplosionspawns(updateList);
-        log.debug("explosions objects updated");
-    }
 
     public IEntity getEnemy() {
         return enemy;
@@ -278,8 +265,4 @@ public class GameSceneController implements Initializable {
     public int getScaledTileSize() {
         return scaledTileSize;
     }
-
-    public InputHandler getInputHandler() {
-        return inputHandler;
-    }
 }
\ No newline at end of file
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/IntroController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/IntroController.java
index f875d299f5c512438c5f1934ef0b51367fa5331b..0aa1b58bf445dbeb94742e27650e6fa735c7d802 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/IntroController.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/IntroController.java
@@ -1,7 +1,6 @@
 package de.hdm_stuttgart.battlearena.Controller;
 
 import de.hdm_stuttgart.battlearena.Controller.Utilities.CreateMediaPlayer;
-import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence;
 import javafx.fxml.FXML;
 import javafx.fxml.FXMLLoader;
 import javafx.fxml.Initializable;
@@ -9,8 +8,6 @@ import javafx.scene.Cursor;
 import javafx.scene.layout.BorderPane;
 import javafx.scene.media.MediaPlayer;
 import javafx.scene.media.MediaView;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
 
 import java.io.File;
 import java.io.IOException;
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/LoadingScreenController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/LoadingScreenController.java
index de2023cc0c55ea0b9e660b45e2cc4651fd8b4b69..9c3db0597ec76ba2dd675171be9e7e680a6a9897 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/LoadingScreenController.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/LoadingScreenController.java
@@ -1,12 +1,11 @@
 package de.hdm_stuttgart.battlearena.Controller;
 
+import de.hdm_stuttgart.battlearena.Controller.Enum.GameMode;
 import de.hdm_stuttgart.battlearena.Controller.Enum.GameState;
+import 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.Exceptions.DatabaseException;
-import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence;
-import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo;
-import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ThreadStartup1;
-import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ThreadStartup2;
+import de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities.Initializer;
 import javafx.application.Platform;
 import javafx.fxml.FXML;
 import javafx.fxml.FXMLLoader;
@@ -65,11 +64,13 @@ public class LoadingScreenController implements Initializable {
     };
 
     private final List<String> shuffledTips = Arrays.asList(loadingTips);
-    private static final Logger log = LogManager.getLogger(Persistence.class);
+    private static final Logger log = LogManager.getLogger(LoadingScreenController.class);
     private final Rectangle2D screen = Screen.getPrimary().getVisualBounds();
     private final ThreadStartup1 thread1 = new ThreadStartup1();
     private final ThreadStartup2 thread2 = new ThreadStartup2();
     private final Persistence persistence = Persistence.getInstance();
+    private final RuntimeInfo runtimeInfo = RuntimeInfo.getInstance();
+    private boolean isStarted = false;
 
     Thread tipsThread = new Thread(() -> {
         try {
@@ -104,21 +105,38 @@ public class LoadingScreenController implements Initializable {
         thread2.start();
     });
 
+    Thread multiplayerLoadingScreenThread = new Thread(() -> {
+        while (!isStarted) {
+            System.out.println(runtimeInfo.getServer().getPlayerCount()); //Do not remove print statement. GameScene does not load without it LUL.
+            if (runtimeInfo.getServer().getPlayerCount() == 2) {
+                try {
+                    tipsThread.interrupt();
+                    Initializer initializer = new Initializer();
+                    initializer.getPlayerMode(runtimeInfo.getConnectionHandler());
+                    RuntimeInfo.getInstance().setGameState(GameState.PLAYING);
+                    parent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/GameScene.fxml"))));
+                    isStarted = true;
+                } catch (Exception e) {
+                    log.error(e);
+                    throw new RuntimeException(e);
+                }
+            }
+        }
+    });
+
     @Override
     public void initialize(URL url, ResourceBundle resourceBundle) {
         Collections.shuffle(shuffledTips);
         setImages();
-
         tipsThread.start();
-        thread1.start();
-        waitingForThread1.start(); // basically thread1.join() but making it in separate thread otherwise it will block JavaFX thread
-        try {
-            log.debug("Executing waitingForThread2");
-            thread2.join();
-        } catch (InterruptedException e) {
-            throw new RuntimeException(e);
+
+        if (runtimeInfo.getGameMode() != GameMode.NETWORK) {
+            thread1.start();
+            waitingForThread1.start(); // basically thread1.join() but making it in separate thread otherwise it will block JavaFX thread
+            loadStatistics.start();
+        } else {
+            multiplayerLoadingScreenThread.start();
         }
-        loadStatistics.start();
     }
 
     private void setImages() {
@@ -145,6 +163,7 @@ public class LoadingScreenController implements Initializable {
                 setLoadingTips();
             }
         }
+
         if (counter == loadingTips.length) {
             Collections.shuffle(shuffledTips);
             counter = 0;
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/LoginController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/LoginController.java
index 1cf040890ea9f3498669680c7ddeefb72e69964d..0acc6fd59bd0ba1a9acde88fcfe974d1ae71cf1a 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/LoginController.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/LoginController.java
@@ -22,7 +22,7 @@ public class LoginController {
     private Label errorMessage;
     private final SceneLoader sceneLoader = new SceneLoader();
     private final Persistence persistence = Persistence.getInstance();
-    private static final Logger log = LogManager.getLogger(Persistence.class);
+    private static final Logger log = LogManager.getLogger(LoginController.class);
 
     private void switchScene(String name) {
         parent.getChildren().clear();
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MainMenuController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MainMenuController.java
index fb877b68420a3898f7a8c6e700093816342d0bbe..4902b0cd1b9a0b1842e69d25b9d150280442aad1 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MainMenuController.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MainMenuController.java
@@ -19,7 +19,7 @@ public class MainMenuController {
     private final SceneLoader sceneLoader = new SceneLoader();
     private final Persistence persistence = Persistence.getInstance();
     private final MusicPlayer player = MusicPlayer.getInstance();
-    private static final Logger log = LogManager.getLogger(Persistence.class);
+    private static final Logger log = LogManager.getLogger(MainMenuController.class);
 
     private void switchScene(String name) {
         parent.getChildren().clear();
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MenuBorderPaneController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MenuBorderPaneController.java
index 550fe92967678b0752a46bb94a39543c8859dd36..41b0e3616f643fcb00c1e7d275b974ecfc3a7d37 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MenuBorderPaneController.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MenuBorderPaneController.java
@@ -3,13 +3,11 @@ package de.hdm_stuttgart.battlearena.Controller;
 import de.hdm_stuttgart.battlearena.Controller.Enum.GameState;
 import de.hdm_stuttgart.battlearena.Controller.Utilities.CreateMediaPlayer;
 import de.hdm_stuttgart.battlearena.Controller.Utilities.SceneLoader;
-import de.hdm_stuttgart.battlearena.Main.Driver;
 import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.AccountType;
 import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence;
 import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo;
 import javafx.fxml.FXML;
 import javafx.fxml.Initializable;
-import javafx.fxml.LoadException;
 import javafx.geometry.Rectangle2D;
 import javafx.scene.control.Button;
 import javafx.scene.image.ImageView;
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerCreateController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerCreateController.java
index 6db97dfe730df0204ee53741f896e596fce5ebfe..cfa73e3ee51fd0a84ee771de2511d06095057748 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerCreateController.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerCreateController.java
@@ -1,17 +1,55 @@
 package de.hdm_stuttgart.battlearena.Controller;
 
 import de.hdm_stuttgart.battlearena.Controller.Utilities.SceneLoader;
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo;
+import de.hdm_stuttgart.battlearena.Model.Multiplayer.Server;
+import de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities.Initializer;
+import de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities.NotAnIpAddressException;
 import javafx.fxml.FXML;
+import javafx.scene.control.Label;
+import javafx.scene.control.TextField;
 import javafx.scene.layout.VBox;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.io.IOException;
 
 public class MultiplayerCreateController {
     @FXML
     private VBox parent;
+    @FXML
+    private TextField ip;
+    @FXML
+    private Label errorMessage;
     private final SceneLoader sceneLoader = new SceneLoader();
+    Initializer initializer = new Initializer();
+    private static final Logger log = LogManager.getLogger(MultiplayerCreateController.class);
+    RuntimeInfo runtimeInfo = RuntimeInfo.getInstance();
+
+    Thread serverThread = new Thread(() -> {
+        try {
+            initializer.launchGameServer();
+            initializer.launchConnectionHandler(ip.getText());
+        } catch (InterruptedException | IOException e) {
+            log.error(e);
+        } catch (NotAnIpAddressException e) {
+            errorMessage.setText(e.getMessage());
+        }
+    });
+
+    @FXML
+    private void start() {
+        serverThread.start();
+        switchScene("SkinSelectionMultiplayer");
+    }
 
     @FXML
     private void backButton() {
+        switchScene("Multiplayer");
+    }
+
+    private void switchScene(String name) {
         parent.getChildren().clear();
-        parent.getChildren().add(sceneLoader.loadScene("Multiplayer"));
+        parent.getChildren().add(sceneLoader.loadScene(name));
     }
 }
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerJoinController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerJoinController.java
index 0aefd1003845e6971d2a025ba5d13c48cf257a33..62f6a9b1ed6a80e112be49a007f34eb143407b23 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerJoinController.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/MultiplayerJoinController.java
@@ -1,17 +1,51 @@
 package de.hdm_stuttgart.battlearena.Controller;
 
+import de.hdm_stuttgart.battlearena.Controller.Enum.GameMode;
 import de.hdm_stuttgart.battlearena.Controller.Utilities.SceneLoader;
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo;
+import de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities.Initializer;
+import de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities.NotAnIpAddressException;
 import javafx.fxml.FXML;
+import javafx.scene.control.Label;
+import javafx.scene.control.TextField;
 import javafx.scene.layout.VBox;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.io.IOException;
 
 public class MultiplayerJoinController {
     @FXML
     private VBox parent;
+    @FXML
+    private TextField ip;
+    @FXML
+    private Label errorMessage;
     private final SceneLoader sceneLoader = new SceneLoader();
+    private static final Logger log = LogManager.getLogger(MultiplayerJoinController.class);
+
+    @FXML
+    private void connect() {
+        try {
+            errorMessage.setText("Connecting...");
+            new Initializer().launchConnectionHandler(ip.getText());
+            RuntimeInfo.getInstance().setGameMode(GameMode.NETWORK);
+            switchScene("SkinSelectionMultiplayer");
+        } catch (NotAnIpAddressException e) {
+            errorMessage.setText(e.getMessage());
+        } catch (IOException | InterruptedException e) {
+            errorMessage.setText("Connection failed");
+            log.error(e);
+        }
+    }
 
     @FXML
     private void backButton() {
+        switchScene("Multiplayer");
+    }
+
+    private void switchScene(String name) {
         parent.getChildren().clear();
-        parent.getChildren().add(sceneLoader.loadScene("Multiplayer"));
+        parent.getChildren().add(sceneLoader.loadScene(name));
     }
 }
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/PlaceholderController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/PlaceholderController.java
index 139f1cd114edb2e156f3bcf9fdeeae75cfbf4eb3..e542322cc2e0da3b706482c378817eea4e70b4e2 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/PlaceholderController.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/PlaceholderController.java
@@ -8,7 +8,6 @@ import javafx.fxml.FXMLLoader;
 import javafx.fxml.Initializable;
 import javafx.scene.control.Button;
 import javafx.scene.layout.BorderPane;
-import javafx.scene.media.Media;
 import javafx.scene.media.MediaPlayer;
 import javafx.scene.media.MediaView;
 
@@ -25,7 +24,7 @@ public class PlaceholderController implements Initializable {
     private MediaView mediaView;
     @FXML
     private Button button;
-    private MediaPlayer mediaPlayer, musicPlayer;
+    private MediaPlayer mediaPlayer;
 
     @Override
     public void initialize(URL url, ResourceBundle resourceBundle) {
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/SettingsController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/SettingsController.java
index 2163a27e169bdaa55513f3c9cfc7512ab3681c48..ea1c8ba437d65722e5e0fed8d5484fdb053ad813 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/SettingsController.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/SettingsController.java
@@ -2,7 +2,6 @@ package de.hdm_stuttgart.battlearena.Controller;
 
 import de.hdm_stuttgart.battlearena.Controller.Enum.GameState;
 import de.hdm_stuttgart.battlearena.Controller.Utilities.SceneLoader;
-import de.hdm_stuttgart.battlearena.Main.Driver;
 import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence;
 import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo;
 import de.hdm_stuttgart.battlearena.Model.Sound.MusicPlayer;
@@ -13,7 +12,6 @@ import javafx.fxml.Initializable;
 import javafx.fxml.LoadException;
 import javafx.scene.control.Slider;
 import javafx.scene.layout.VBox;
-import javafx.scene.media.MediaException;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/SkinSelectionController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/SkinSelectionController.java
index c2c46b708b48a44a2e79e39de12be7c08b49a7f2..271e1bf0790bb460bf3746adc9f9afcfd51d9b1e 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/SkinSelectionController.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/SkinSelectionController.java
@@ -1,9 +1,11 @@
 package de.hdm_stuttgart.battlearena.Controller;
 
+import de.hdm_stuttgart.battlearena.Controller.Enum.GameMode;
 import de.hdm_stuttgart.battlearena.Controller.Utilities.SceneLoader;
 import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo;
 import de.hdm_stuttgart.battlearena.Model.Entity.EntityClass;
 import javafx.fxml.FXML;
+import javafx.fxml.FXMLLoader;
 import javafx.fxml.Initializable;
 import javafx.geometry.Rectangle2D;
 import javafx.scene.control.Label;
@@ -16,6 +18,7 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
 import java.net.URL;
+import java.util.Objects;
 import java.util.ResourceBundle;
 
 public class SkinSelectionController implements Initializable {
@@ -29,7 +32,7 @@ public class SkinSelectionController implements Initializable {
     private Label errorMsg;
     private String playerOneSkin, playerTwoSkin;
     private final RuntimeInfo runtimeInfo = RuntimeInfo.getInstance();
-    private static final Logger log = LogManager.getLogger(MapSelectionController.class);
+    private static final Logger log = LogManager.getLogger(SkinSelectionController.class);
 
     @Override
     public void initialize(URL url, ResourceBundle resourceBundle) {
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/SkinSelectionMultiplayerController.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/SkinSelectionMultiplayerController.java
new file mode 100644
index 0000000000000000000000000000000000000000..3c6805699b015f38354bbc35a0a22d093ac5f996
--- /dev/null
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/SkinSelectionMultiplayerController.java
@@ -0,0 +1,94 @@
+package de.hdm_stuttgart.battlearena.Controller;
+
+import de.hdm_stuttgart.battlearena.Controller.Enum.GameMode;
+import de.hdm_stuttgart.battlearena.Controller.Utilities.SceneLoader;
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.MapData;
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence;
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo;
+import de.hdm_stuttgart.battlearena.Model.Entity.EntityClass;
+import de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities.Initializer;
+import javafx.fxml.FXML;
+import javafx.fxml.FXMLLoader;
+import javafx.fxml.Initializable;
+import javafx.geometry.Rectangle2D;
+import javafx.scene.control.ToggleButton;
+import javafx.scene.control.ToggleGroup;
+import javafx.scene.image.ImageView;
+import javafx.scene.layout.VBox;
+import javafx.stage.Screen;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Objects;
+import java.util.ResourceBundle;
+
+public class SkinSelectionMultiplayerController implements Initializable {
+    @FXML
+    private VBox parent;
+    @FXML
+    private ToggleGroup toggleGroup;
+    @FXML
+    private ImageView selection1, selection2, selection3;
+    private String playerSkin;
+    private final RuntimeInfo runtimeInfo = RuntimeInfo.getInstance();
+    private final ArrayList<MapData> coreMaps = Persistence.getInstance().getCoreMaps();
+    private static final Logger log = LogManager.getLogger(SkinSelectionMultiplayerController.class);
+
+    @Override
+    public void initialize(URL url, ResourceBundle resourceBundle) {
+        skinSelection(toggleGroup);
+        setImageWidth(selection1, selection2, selection3);
+    }
+
+    private void skinSelection(ToggleGroup player) {
+        player.selectedToggleProperty().addListener((observableValue, oldToggle, newToggle) -> {
+            if (player.getSelectedToggle() != null) {
+                ToggleButton selected = (ToggleButton) player.getSelectedToggle();
+                playerSkin = selected.getText();
+                switch (playerSkin) {
+                    case "High Born":
+                        runtimeInfo.setPlayerOneClass(EntityClass.HIGH_BORN);
+                        break;
+                    case "Human":
+                        runtimeInfo.setPlayerOneClass(EntityClass.HUMAN);
+                        break;
+                    case "Sentinel":
+                        runtimeInfo.setPlayerOneClass(EntityClass.SENTINELS);
+                }
+            }
+        });
+    }
+
+    private void setImageWidth(ImageView... imageViews) { // the ... allows for zero or more arguments seperated by a comma, will pass argument as an array
+        Rectangle2D screen = Screen.getPrimary().getVisualBounds();
+        final double imageWidth = screen.getWidth() * 0.1;
+        for (ImageView image : imageViews) {
+            image.setFitWidth(imageWidth);
+            image.setPreserveRatio(true);
+        }
+    }
+
+    @FXML
+    private void backButton() {
+        parent.getChildren().clear();
+        parent.getChildren().add(new SceneLoader().loadScene("Multiplayer"));
+        runtimeInfo.setGameMode(GameMode.LOCAL);
+    }
+
+    @FXML
+    private void gameScene() throws IOException {
+        log.info("Player skin: " + playerSkin);
+        runtimeInfo.setGameMap(coreMaps.get(0));
+        if (runtimeInfo.getGameMode() == GameMode.NETWORK) {
+            Initializer initializer = new Initializer();
+            initializer.getPlayerMode(runtimeInfo.getConnectionHandler());
+            parent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/GameScene.fxml"))));
+        } else {
+            runtimeInfo.setGameMode(GameMode.NETWORK);
+            parent.getScene().setRoot(FXMLLoader.load(Objects.requireNonNull(getClass().getResource("/fxml/LoadingScreen.fxml"))));
+        }
+    }
+}
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/ButtonTransition.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/ButtonTransition.java
index 8e59516428834ab48bf7a9b2cfebb1760ad63308..48c95a665a3e61823e47cf131198184847f85b85 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/ButtonTransition.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/ButtonTransition.java
@@ -16,18 +16,14 @@ public class ButtonTransition extends ButtonSkin {
         fadeIn.setToY(1.1);
 
 //        this ensures that any JavaFX related code is run on the JavaFX application thread
-        button.setOnMouseEntered(e -> {
-            Platform.runLater(fadeIn::playFromStart);
-        });
+        button.setOnMouseEntered(e -> Platform.runLater(fadeIn::playFromStart));
 
 //        set transition for mouse exiting buttonButtonTransitionScale
         final ScaleTransition fadeOut = new ScaleTransition(Duration.millis(150));
         fadeOut.setNode(button);
         fadeOut.setToX(1.0);
         fadeOut.setToY(1.0);
-        button.setOnMouseExited(e -> {
-            Platform.runLater(fadeOut::playFromStart);
-        });
+        button.setOnMouseExited(e -> Platform.runLater(fadeOut::playFromStart));
 
         button.setScaleX(1.0);
         button.setScaleY(1.0);
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/ScreenDimensionCalculator.java b/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/ScreenDimensionCalculator.java
deleted file mode 100644
index 4dee18cfe414ec04cc2323954e0ae0d77a128902..0000000000000000000000000000000000000000
--- a/src/main/java/de/hdm_stuttgart/battlearena/Controller/Utilities/ScreenDimensionCalculator.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package de.hdm_stuttgart.battlearena.Controller.Utilities;
-
-public class ScreenDimensionCalculator {
-    public double calculateDiagonalInches(double width, double height, double dpi) {
-        double diagonalPixels = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2));
-        double diagonalInches = diagonalPixels / dpi;
-        System.out.println("diagonal pixels: " + diagonalPixels);
-        System.out.println("width: " + width);
-        System.out.println("height: " + height);
-        return diagonalInches;
-    }
-}
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Main/Driver.java b/src/main/java/de/hdm_stuttgart/battlearena/Main/Driver.java
index 2a12b7cc499eb7f2caf792c736de439c1fe4201a..4cc0b10fdd140e0d268494a47bd01293760d091a 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Main/Driver.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Main/Driver.java
@@ -6,8 +6,6 @@ import de.hdm_stuttgart.battlearena.Model.Inputs.InputHandler;
 
 import de.hdm_stuttgart.battlearena.Model.Sound.MusicPlayer;
 import javafx.application.Application;
-import javafx.application.Platform;
-import javafx.event.EventHandler;
 import javafx.fxml.FXMLLoader;
 import javafx.fxml.LoadException;
 import javafx.geometry.Rectangle2D;
@@ -19,7 +17,6 @@ import javafx.stage.Screen;
 import javafx.stage.Stage;
 
 import javafx.stage.StageStyle;
-import javafx.stage.WindowEvent;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
@@ -70,13 +67,8 @@ public class Driver extends Application {
         stage.setOnCloseRequest(windowEvent -> MusicPlayer.getInstance().getScheduler().shutdown());
 
 
+
         stage.show();
         log.debug("Project started successfully!");
-
-//        Exiting program if an exception occurs
-//        Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> {
-//            log.error(throwable.getMessage());
-//            System.exit(1);
-//        });
     }
 }
\ No newline at end of file
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/AzureDB.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/AzureDB.java
index 8e16f88034bbed8454aff16b5a2ca82406cb42b0..1d6efb78a6b90f1b6a27e222c82ceb6076f76513 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/AzureDB.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/AzureDB.java
@@ -14,9 +14,9 @@ import java.util.ArrayList;
 
 public class AzureDB implements ISQLDataBase {
 
-    private static String user="";
-    private static String password="";
-    private static String[] parts= new String[2];
+    private static String user = "";
+    private static String password = "";
+    private static String[] parts = new String[2];
     static File encryptedFile = new File("src\\main\\resources\\database\\AzureDB_logindetails");
     private static final Logger log = LogManager.getLogger(OracleDB.class);
 
@@ -38,8 +38,7 @@ public class AzureDB implements ISQLDataBase {
             log.info("Connecting to SQL database ...");
 
             return connection;
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new SQLException("SQL connection error! " + e.getMessage());
         }
@@ -47,7 +46,7 @@ public class AzureDB implements ISQLDataBase {
 
     @Override
     public ArrayList<MapData> getCoreMaps() throws SQLException {
-        try(Connection connection = connect()) {
+        try (Connection connection = connect()) {
             ArrayList<MapData> newMaps = new ArrayList<MapData>();
             String sql = "SELECT * FROM CoreMaps";
             PreparedStatement stmt = connection.prepareStatement(sql);
@@ -55,15 +54,14 @@ public class AzureDB implements ISQLDataBase {
             log.info("Sending SQL statement.");
             ResultSet rs = stmt.executeQuery();
 
-            while(rs.next()){
+            while (rs.next()) {
                 newMaps.add(new MapData(rs.getString("map_id"), rs.getString("map_name"), rs.getInt("map_width"), rs.getInt("map_height"), rs.getString("map_data")));
             }
             rs.close();
             stmt.close();
             log.info("Core-Maps retrieved successfully from SQL server!");
             return newMaps;
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new SQLException("Error retrieving Core-Maps from SQL server! " + e.getMessage());
         }
@@ -71,7 +69,7 @@ public class AzureDB implements ISQLDataBase {
 
     @Override
     public ArrayList<MapInfo> getCommunityMapsList() throws SQLException {
-        try(Connection connection = connect()) {
+        try (Connection connection = connect()) {
             ArrayList<MapInfo> tempList = new ArrayList<MapInfo>();
             String sql = "SELECT map_id, map_name, map_width, map_height, map_downloads FROM communitymaps";
             PreparedStatement stmt = connection.prepareStatement(sql);
@@ -79,15 +77,14 @@ public class AzureDB implements ISQLDataBase {
             log.info("Sending SQL statement.");
             ResultSet rs = stmt.executeQuery();
 
-            while(rs.next()){
+            while (rs.next()) {
                 tempList.add(new MapInfo(rs.getString("map_id"), rs.getString("map_name"), rs.getInt("map_width"), rs.getInt("map_height"), rs.getInt("map_downloads")));
             }
             rs.close();
             stmt.close();
             log.info("Community-Map names retrieved successfully from SQL server!");
             return tempList;
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new SQLException("Error retrieving Community-Map names from SQL server! " + e.getMessage());
         }
@@ -95,26 +92,25 @@ public class AzureDB implements ISQLDataBase {
 
     @Override
     public PlayerStatistics getStatistics(String playerName) throws SQLException {
-        try(Connection connection = connect()) {
+        try (Connection connection = connect()) {
             String sql = "SELECT games_won, games_lost, kills, deaths, blocks_destroyed, ingame_time FROM players WHERE player_name = ?";
             PreparedStatement stmt = connection.prepareStatement(sql);
             stmt.setString(1, playerName);
 
             log.info("Sending SQL statement.");
             ResultSet rs = stmt.executeQuery();
-            if(!rs.isBeforeFirst()){             //if no data matches
+            if (!rs.isBeforeFirst()) {             //if no data matches
                 throw new SQLException("No match on SQL database!");
             }
             PlayerStatistics stats = new PlayerStatistics(0, 0, 0, 0, 0, 0);
-            while(rs.next()) {
+            while (rs.next()) {
                 stats = new PlayerStatistics(rs.getInt("games_won"), rs.getInt("games_lost"), rs.getInt("kills"), rs.getInt("deaths"), rs.getInt("blocks_destroyed"), rs.getInt("ingame_time"));
             }
             rs.close();
             stmt.close();
             log.info("Player statistics retrieved successfully from SQL server!");
             return stats;
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new SQLException("Error retrieving player statistics from SQL server! " + e.getMessage());
         }
@@ -122,7 +118,7 @@ public class AzureDB implements ISQLDataBase {
 
     @Override
     public MapData getCommunityMapByID(String mapID) throws SQLException {
-        try(Connection connection = connect()) {
+        try (Connection connection = connect()) {
             String sql = "SELECT * FROM communitymaps WHERE map_ID = ?";
             PreparedStatement stmt = connection.prepareStatement(sql);
             stmt.setString(1, mapID);
@@ -130,10 +126,10 @@ public class AzureDB implements ISQLDataBase {
             log.info("Sending SQL statement.");
             ResultSet rs = stmt.executeQuery();
             MapData mapChosen = new MapData("", "",0,0, "");
-            if(!rs.isBeforeFirst()){             //if no data matches
+            if (!rs.isBeforeFirst()) {             //if no data matches
                 throw new SQLException("No match on SQL database!");
             }
-            while(rs.next()) {
+            while (rs.next()) {
                 mapChosen = new MapData(rs.getString("map_id"), rs.getString("map_name"), rs.getInt("map_width"), rs.getInt("map_height"), rs.getString("map_data"));
             }
             rs.close();
@@ -148,8 +144,7 @@ public class AzureDB implements ISQLDataBase {
             stmt2.close();
 
             return mapChosen;
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new SQLException("Error retrieving Community-Map from SQL server! " + e.getMessage());
         }
@@ -157,7 +152,7 @@ public class AzureDB implements ISQLDataBase {
 
     @Override
     public String checkCredentials(String playerName) throws SQLException {
-        try(Connection connection = connect()) {
+        try (Connection connection = connect()) {
             String sql = "SELECT player_pw FROM players WHERE player_name = ?";
             PreparedStatement stmt = connection.prepareStatement(sql);
             stmt.setString(1, playerName);
@@ -166,15 +161,14 @@ public class AzureDB implements ISQLDataBase {
             ResultSet rs = stmt.executeQuery();
 
             String password = "";
-            while(rs.next()) {
+            while (rs.next()) {
                 password = rs.getString("player_pw");
             }
             rs.close();
             stmt.close();
             log.info("Player credentials retrieved successfully from SQL server!");
             return password;
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new SQLException("Error retrieving retrieving player credentials from SQL server! " + e.getMessage());
         }
@@ -182,7 +176,7 @@ public class AzureDB implements ISQLDataBase {
 
     @Override
     public void uploadCommunityMap(MapData map) throws SQLException {
-        try(Connection connection = connect()) {
+        try (Connection connection = connect()) {
             String sql = "INSERT INTO communitymaps (map_id, map_name, map_width, map_height, map_data, map_downloads) VALUES (?, ?, ?, ?, ?, 0)";
             PreparedStatement stmt = connection.prepareStatement(sql);
             stmt.setString(1, map.getMapID());
@@ -196,8 +190,7 @@ public class AzureDB implements ISQLDataBase {
 
             stmt.close();
             log.info("Community-Map uploaded successfully to SQL server!");
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new SQLException("Error uploading created Community-Map to SQL server! " + e.getMessage());
         }
@@ -205,7 +198,7 @@ public class AzureDB implements ISQLDataBase {
 
     @Override
     public void createPlayer(String playerName, String playerPW) throws SQLException {
-        try(Connection connection = connect()) {
+        try (Connection connection = connect()) {
             String sql = "INSERT INTO players (player_name, player_pw, games_won, games_lost, kills, deaths, blocks_destroyed, ingame_time) VALUES (?, ?, 0, 0, 0, 0, 0, 0)";
             PreparedStatement stmt = connection.prepareStatement(sql);
             stmt.setString(1, playerName);
@@ -216,8 +209,7 @@ public class AzureDB implements ISQLDataBase {
 
             stmt.close();
             log.info("Online account created successfully on SQL server!");
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new SQLException("Error creating online account on SQL server! " + e.getMessage());
         }
@@ -225,7 +217,7 @@ public class AzureDB implements ISQLDataBase {
 
     @Override
     public void updatePlayerStats(PlayerStatistics stats, PlayerAccount account) throws SQLException {
-        try(Connection connection = connect()) {
+        try (Connection connection = connect()) {
             String sql = "UPDATE players SET games_won = ?, games_lost = ?, kills = ?, deaths = ?, blocks_destroyed = ?, ingame_time = ? WHERE player_name = ?";
             PreparedStatement stmt = connection.prepareStatement(sql);
             stmt.setInt(1, stats.getGamesWon());
@@ -241,16 +233,15 @@ public class AzureDB implements ISQLDataBase {
 
             stmt.close();
             log.info("Player statistics updated successfully on SQL server!");
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new SQLException("Error updating player statistics on SQL server! " + e.getMessage());
         }
     }
 
     @Override
-    public void resetPlayerStats(PlayerAccount account) throws SQLException{        //verification of player credentials necessary beforehand (use methode "verifyAccountData" in "Persistence.java)
-        try(Connection connection = connect()) {
+    public void resetPlayerStats(PlayerAccount account) throws SQLException {        //verification of player credentials necessary beforehand (use methode "verifyAccountData" in "Persistence.java)
+        try (Connection connection = connect()) {
             String sql = "UPDATE players SET games_won = 0, games_lost = 0, kills = 0, deaths = 0, blocks_destroyed = 0, ingame_time = 0 WHERE player_name = ?";
             PreparedStatement stmt = connection.prepareStatement(sql);
             stmt.setString(1, account.getPlayerName());
@@ -260,8 +251,7 @@ public class AzureDB implements ISQLDataBase {
 
             stmt.close();
             log.info("Player statistics reset successfully on SQL server!");
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new SQLException("Error resetting player statistics on SQL server! " + e.getMessage());
         }
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
index 4ddb26cd2de6356b40b45af16dad0b9dfeb7f4d8..ada0dc3e9e1fd99ce9a5bf7e5206e0e1841b60d2 100644
--- 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
@@ -1,7 +1,6 @@
 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
index 8403ea2c46b21e5b8349917316f7414eb1a74710..5fa5b0c2eb54a7948a422b171efb1dd408ac7408 100644
--- 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
@@ -1,7 +1,6 @@
 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
index 48ef20b9c36ce3e1758460adb489b643a7175c8e..7e9a02ed7a353a50cf23459ce8a6ccc0e7accd45 100644
--- 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
@@ -1,7 +1,6 @@
 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/Exceptions/DatabaseException.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/DatabaseException.java
index 57a4b7f978103f55a4a83525db1353be7b1fe4fb..9d842c7919a299a53cde5e0dce14505bb98027d4 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/DatabaseException.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/DatabaseException.java
@@ -1,7 +1,6 @@
 package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions;
 
 public class DatabaseException extends Exception{
-
     public DatabaseException() {}
 
     public DatabaseException(String message2)
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/GSONException.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/GSONException.java
index f16aa2d2831903fca6ccbd1555c798b53132f872..4b8cfb31dea5ad3e091acb433f61cf9faba0d4f3 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/GSONException.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/GSONException.java
@@ -1,7 +1,6 @@
 package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions;
 
 public class GSONException extends Exception{
-
     public GSONException() {}
 
     public GSONException(String message2)
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/ParserException.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/ParserException.java
index 27bd887ed9a7b5cb604d63e2194c818c91cae56a..ff4458f2d1241fc1358a4ef3568942d6a38b786d 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/ParserException.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/ParserException.java
@@ -1,7 +1,6 @@
 package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions;
 
 public class ParserException extends Exception{
-
     public ParserException() {}
 
     public ParserException(String message2)
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/SQLException.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/SQLException.java
index adbdfa7fac0321fd39687bd957c7f05f542aaaa9..461594c0b5ab8d4e85944d525d782886e6c965c6 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/SQLException.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Exceptions/SQLException.java
@@ -1,7 +1,6 @@
 package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions;
 
 public class SQLException extends Exception{
-
     public SQLException() {}
 
     public SQLException(String message2)
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ISQLDataBase.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ISQLDataBase.java
index 7a169c9b21d76b2a7eba64b8899dbb5e397b22cb..f53480c304df467419f286c2af3462151d76f48c 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ISQLDataBase.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ISQLDataBase.java
@@ -12,13 +12,21 @@ public interface ISQLDataBase {
 
     //CRUD Operations in SQL
     ArrayList<MapData> getCoreMaps() throws SQLException;
+
     ArrayList<MapInfo> getCommunityMapsList() throws SQLException;
+
     MapData getCommunityMapByID(String mapID) throws SQLException;
+
     void uploadCommunityMap(MapData map) throws SQLException;
+
     void createPlayer(String playerName, String playerPW) throws SQLException;
+
     String checkCredentials(String playerName) throws SQLException;
+
     PlayerStatistics getStatistics(String playerName) throws SQLException;
+
     void updatePlayerStats(PlayerStatistics stats, PlayerAccount account) throws SQLException;
+
     void resetPlayerStats(PlayerAccount account) throws SQLException;
 
 }
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/OracleDB.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/OracleDB.java
index e4d80741bd5d8bdf62937dab1c4cc04ea18df1ab..e0c0418ae46b126673e102c4d1c7fdf4106c1f30 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/OracleDB.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/OracleDB.java
@@ -14,9 +14,9 @@ import oracle.jdbc.pool.OracleDataSource;
 
 public class OracleDB implements ISQLDataBase {
 
-    private static String user="";
-    private static String password="";
-    private static String[] parts= new String[2];
+    private static String user = "";
+    private static String password = "";
+    private static String[] parts = new String[2];
     static File encryptedFile = new File("src\\main\\resources\\database\\OracleDB_logindetails");
     private static final Logger log = LogManager.getLogger(OracleDB.class);
 
@@ -39,8 +39,7 @@ public class OracleDB implements ISQLDataBase {
             log.info("Connecting to SQL database ...");
 
             return conn;
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new SQLException("SQL connection error! " + e.getMessage());
         }
@@ -48,7 +47,7 @@ public class OracleDB implements ISQLDataBase {
 
     @Override
     public ArrayList<MapData> getCoreMaps() throws SQLException {
-        try(Connection connection = connect()) {
+        try (Connection connection = connect()) {
             ArrayList<MapData> newMaps = new ArrayList<MapData>();
             String sql = "SELECT * FROM battlearenadata.coremaps";
             PreparedStatement stmt = connection.prepareStatement(sql);
@@ -56,15 +55,14 @@ public class OracleDB implements ISQLDataBase {
             log.info("Sending SQL statement.");
             ResultSet rs = stmt.executeQuery();
 
-            while(rs.next()){
+            while (rs.next()) {
                 newMaps.add(new MapData(rs.getString("map_id"), rs.getString("map_name"), rs.getInt("map_width"), rs.getInt("map_height"), rs.getString("map_data")));
             }
             rs.close();
             stmt.close();
             log.info("Core-Maps retrieved successfully from SQL server!");
             return newMaps;
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new SQLException("Error retrieving Core-Maps from SQL server! " + e.getMessage());
         }
@@ -72,7 +70,7 @@ public class OracleDB implements ISQLDataBase {
 
     @Override
     public ArrayList<MapInfo> getCommunityMapsList() throws SQLException {
-        try(Connection connection = connect()) {
+        try (Connection connection = connect()) {
             ArrayList<MapInfo> tempList = new ArrayList<MapInfo>();
             String sql = "SELECT map_id, map_name, map_width, map_height, map_downloads FROM battlearenadata.communitymaps";
             PreparedStatement stmt = connection.prepareStatement(sql);
@@ -80,15 +78,14 @@ public class OracleDB implements ISQLDataBase {
             log.info("Sending SQL statement.");
             ResultSet rs = stmt.executeQuery();
 
-            while(rs.next()){
+            while (rs.next()) {
                 tempList.add(new MapInfo(rs.getString("map_id"), rs.getString("map_name"), rs.getInt("map_width"), rs.getInt("map_height"), rs.getInt("map_downloads")));
             }
             rs.close();
             stmt.close();
             log.info("Community-Map names retrieved successfully from SQL server!");
             return tempList;
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new SQLException("Error retrieving Community-Map names from SQL server! " + e.getMessage());
         }
@@ -96,26 +93,25 @@ public class OracleDB implements ISQLDataBase {
 
     @Override
     public PlayerStatistics getStatistics(String playerName) throws SQLException {
-        try(Connection connection = connect()) {
+        try (Connection connection = connect()) {
             String sql = "SELECT games_won, games_lost, kills, deaths, blocks_destroyed, ingame_time FROM battlearenadata.players WHERE player_name = ?";
             PreparedStatement stmt = connection.prepareStatement(sql);
             stmt.setString(1, playerName);
 
             log.info("Sending SQL statement.");
             ResultSet rs = stmt.executeQuery();
-            if(!rs.isBeforeFirst()){             //if no data matches
+            if (!rs.isBeforeFirst()) {             //if no data matches
                 throw new SQLException("No match on SQL database!");
             }
             PlayerStatistics stats = new PlayerStatistics(0, 0, 0, 0, 0, 0);
-            while(rs.next()) {
+            while (rs.next()) {
                 stats = new PlayerStatistics(rs.getInt("games_won"), rs.getInt("games_lost"), rs.getInt("kills"), rs.getInt("deaths"), rs.getInt("blocks_destroyed"), rs.getInt("ingame_time"));
             }
             rs.close();
             stmt.close();
             log.info("Player statistics retrieved successfully from SQL server!");
             return stats;
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new SQLException("Error retrieving player statistics from SQL server! " + e.getMessage());
         }
@@ -123,7 +119,7 @@ public class OracleDB implements ISQLDataBase {
 
     @Override
     public MapData getCommunityMapByID(String mapID) throws SQLException {
-        try(Connection connection = connect()) {
+        try (Connection connection = connect()) {
             String sql = "SELECT * FROM battlearenadata.communitymaps WHERE map_ID = ?";
             PreparedStatement stmt = connection.prepareStatement(sql);
             stmt.setString(1, mapID);
@@ -131,10 +127,10 @@ public class OracleDB implements ISQLDataBase {
             log.info("Sending SQL statement.");
             ResultSet rs = stmt.executeQuery();
             MapData mapChosen = new MapData("", "",0,0, "");
-            if(!rs.isBeforeFirst()){             //if no data matches
+            if (!rs.isBeforeFirst()) {             //if no data matches
                 throw new SQLException("No match on SQL database!");
             }
-            while(rs.next()) {
+            while (rs.next()) {
                 mapChosen = new MapData(rs.getString("map_id"), rs.getString("map_name"), rs.getInt("map_width"), rs.getInt("map_height"), rs.getString("map_data"));
             }
             rs.close();
@@ -149,8 +145,7 @@ public class OracleDB implements ISQLDataBase {
             stmt2.close();
 
             return mapChosen;
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new SQLException("Error retrieving Community-Map from SQL server! " + e.getMessage());
         }
@@ -158,7 +153,7 @@ public class OracleDB implements ISQLDataBase {
 
     @Override
     public String checkCredentials(String playerName) throws SQLException {
-        try(Connection connection = connect()) {
+        try (Connection connection = connect()) {
             String sql = "SELECT player_pw FROM battlearenadata.players WHERE player_name = ?";
             PreparedStatement stmt = connection.prepareStatement(sql);
             stmt.setString(1, playerName);
@@ -167,15 +162,14 @@ public class OracleDB implements ISQLDataBase {
             ResultSet rs = stmt.executeQuery();
 
             String password = "";
-            while(rs.next()) {
+            while (rs.next()) {
                 password = rs.getString("player_pw");
             }
             rs.close();
             stmt.close();
             log.info("Player credentials retrieved successfully from SQL server!");
             return password;
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new SQLException("Error retrieving retrieving player credentials from SQL server! " + e.getMessage());
         }
@@ -183,7 +177,7 @@ public class OracleDB implements ISQLDataBase {
 
     @Override
     public void uploadCommunityMap(MapData map) throws SQLException {
-        try(Connection connection = connect()) {
+        try (Connection connection = connect()) {
             String sql = "INSERT INTO battlearenadata.communitymaps (map_id, map_name, map_width, map_height, map_data, map_downloads) VALUES (?, ?, ?, ?, ?, 0)";
             PreparedStatement stmt = connection.prepareStatement(sql);
             stmt.setString(1, map.getMapID());
@@ -197,8 +191,7 @@ public class OracleDB implements ISQLDataBase {
 
             stmt.close();
             log.info("Community-Map uploaded successfully to SQL server!");
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new SQLException("Error uploading created Community-Map to SQL server! " + e.getMessage());
         }
@@ -206,7 +199,7 @@ public class OracleDB implements ISQLDataBase {
 
     @Override
     public void createPlayer(String playerName, String playerPW) throws SQLException {
-        try(Connection connection = connect()) {
+        try (Connection connection = connect()) {
             String sql = "INSERT INTO battlearenadata.players (player_name, player_pw, games_won, games_lost, kills, deaths, blocks_destroyed, ingame_time) VALUES (?, ?, 0, 0, 0, 0, 0, 0)";
             PreparedStatement stmt = connection.prepareStatement(sql);
             stmt.setString(1, playerName);
@@ -217,8 +210,7 @@ public class OracleDB implements ISQLDataBase {
 
             stmt.close();
             log.info("Online account created successfully on SQL server!");
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new SQLException("Error creating online account on SQL server! " + e.getMessage());
         }
@@ -226,7 +218,7 @@ public class OracleDB implements ISQLDataBase {
 
     @Override
     public void updatePlayerStats(PlayerStatistics stats, PlayerAccount account) throws SQLException {
-        try(Connection connection = connect()) {
+        try (Connection connection = connect()) {
             String sql = "UPDATE battlearenadata.players SET games_won = ?, games_lost = ?, kills = ?, deaths = ?, blocks_destroyed = ?, ingame_time = ? WHERE player_name = ?";
             PreparedStatement stmt = connection.prepareStatement(sql);
             stmt.setInt(1, stats.getGamesWon());
@@ -242,16 +234,15 @@ public class OracleDB implements ISQLDataBase {
 
             stmt.close();
             log.info("Player statistics updated successfully on SQL server!");
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new SQLException("Error updating player statistics on SQL server! " + e.getMessage());
         }
     }
 
     @Override
-    public void resetPlayerStats(PlayerAccount account) throws SQLException{        //verification of player credentials necessary beforehand (use methode "verifyAccountData" in "Persistence.java)
-        try(Connection connection = connect()) {
+    public void resetPlayerStats(PlayerAccount account) throws SQLException {        //verification of player credentials necessary beforehand (use methode "verifyAccountData" in "Persistence.java)
+        try (Connection connection = connect()) {
             String sql = "UPDATE battlearenadata.players SET games_won = 0, games_lost = 0, kills = 0, deaths = 0, blocks_destroyed = 0, ingame_time = 0 WHERE player_name = ?";
             PreparedStatement stmt = connection.prepareStatement(sql);
             stmt.setString(1, account.getPlayerName());
@@ -261,8 +252,7 @@ public class OracleDB implements ISQLDataBase {
 
             stmt.close();
             log.info("Player statistics reset successfully on SQL server!");
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new SQLException("Error resetting player statistics on SQL server! " + e.getMessage());
         }
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 8573fd96e8bfca773e552ca7b50c3d612304ee55..d79787ae1bba5f047366fccea040ad3c1ddd0f8b 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
@@ -28,10 +28,10 @@ public class Persistence {
     private ArrayList<MapInfo> communityMapsListRemote;  //for community map browser
 
 
+    private Persistence() {
+    }
 
-    private Persistence (){}
-
-    public static Persistence getInstance(){
+    public static Persistence getInstance() {
         return persistenceSingleton;
     }
 
@@ -63,8 +63,7 @@ public class Persistence {
         try {
             account = gsonHandler.loadAccount();
             log.info("Player account successfully loaded!");
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new DatabaseException("Loading player account data from local storage failed!");
         }
@@ -80,21 +79,17 @@ public class Persistence {
                 Parser.playerStatsValid(statistics);
             }
             log.info("Player statistics successfully loaded!");
-        }
-        catch(SQLException e){
+        } catch (SQLException e) {
             log.error(e);
-            if(e.getMessage().contains("ORA-17868") | e.getMessage().contains("ORA-01017")){
+            if (e.getMessage().contains("ORA-17868") | e.getMessage().contains("ORA-01017")) {
                 throw new DatabaseException("No connection to SQL server!");
-            }
-            else{
+            } else {
                 throw new DatabaseException("Unknown Database Error. Retrieving statistics from SQL server failed!");
             }
-        }
-        catch(GSONException e){
+        } catch (GSONException e) {
             log.error(e);
             throw new DatabaseException(e.getMessage());
-        }
-        catch (ParserException e) {
+        } catch (ParserException e) {
             throw new RuntimeException("Player statistics data corrupted!");
         }
     }
@@ -104,8 +99,7 @@ public class Persistence {
             coreMaps = gsonHandler.loadMaps(MapType.COREMAP);
             log.info("Core-Maps successfully loaded from file!");
             //createCoreMapsList();
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new DatabaseException("Loading core maps from local storage failed!");
         }
@@ -116,8 +110,7 @@ public class Persistence {
             communityMaps = gsonHandler.loadMaps(MapType.COMMUNITYMAP);
             log.info("Community-Maps successfully loaded from file!");
             //createLocalCommunityMapsList();
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new DatabaseException("Loading community maps from local storage failed!");
         }
@@ -127,8 +120,7 @@ public class Persistence {
         try {
             settings = gsonHandler.loadSettings();
             log.info("Application settings successfully loaded from file!");
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new DatabaseException("Loading settings from local storage failed!");
         }
@@ -140,21 +132,19 @@ public class Persistence {
             gsonHandler.saveMaps(coreMaps, MapType.COREMAP);
             //createCoreMapsList();
             log.info("Core-Maps successfully updated from SQL-Server!");
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
-            if(e.getMessage().contains("ORA-17868") | e.getMessage().contains("ORA-01017")){
+            if (e.getMessage().contains("ORA-17868") | e.getMessage().contains("ORA-01017")) {
                 throw new DatabaseException("No connection to SQL server!");
-            }
-            else{
+            } else {
                 throw new DatabaseException("Unknown Database Error. Retrieving Core-Map update failed!");
             }
         }
     }
 
     public synchronized void getCommunityMap(String mapID) throws DatabaseException {
-        for(int i = 0; communityMaps.size() > i; i++){
-            if(communityMaps.get(i).getMapID().equals(mapID)){
+        for (int i = 0; communityMaps.size() > i; i++) {
+            if (communityMaps.get(i).getMapID().equals(mapID)) {
                 throw new DatabaseException("Identical map already saved locally. See map name: " + communityMaps.get(i).getMapID());
             }
         }
@@ -163,31 +153,27 @@ public class Persistence {
             gsonHandler.saveMaps(communityMaps, MapType.COMMUNITYMAP);
             //createLocalCommunityMapsList();
             log.info("Community Map successfully retrieved from SQL-Server!");
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
-            if(e.getMessage().contains("ORA-17868") | e.getMessage().contains("ORA-01017")){
+            if (e.getMessage().contains("ORA-17868") | e.getMessage().contains("ORA-01017")) {
                 throw new DatabaseException("No connection to SQL server!");
-            }
-            else if(e.getMessage().equals("No match on Database!")){
+            } else if (e.getMessage().equals("No match on Database!")) {
                 throw new DatabaseException("No map existing for mapID: " + mapID);
-            }
-            else{
+            } else {
                 throw new DatabaseException("Unknown Database Error. Retrieving Community-Map failed!");
             }
         }
     }
 
-    public synchronized void saveSettings(){
-        try{
-        gsonHandler.saveSettings(settings);
-        }
-        catch(Exception e){
+    public synchronized void saveSettings() {
+        try {
+            gsonHandler.saveSettings(settings);
+        } catch (Exception e) {
             log.error(e);
         }
     }
 
-    public synchronized void savePlayerStatistics() throws DatabaseException{     //on shutdown of game
+    public synchronized void savePlayerStatistics() {     //on shutdown of game
         try {
             Parser.playerStatsValid(statistics);
             if (account.getAccountType() == AccountType.LOCAL) {
@@ -196,8 +182,7 @@ public class Persistence {
                 db.updatePlayerStats(statistics, account);
             }
             log.info("Statistics successfully saved!");
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
         }
     }
@@ -205,27 +190,25 @@ public class Persistence {
     public synchronized 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())){
+            for (int i = 0; communityMaps.size() > i; i++) {
+                if (communityMaps.get(i).getMapID().equals(map.getMapID())) {
                     throw new DatabaseException("Identical map already saved locally. See map name: " + communityMaps.get(i).getMapID());
                 }
             }
             communityMaps.add(map);
             gsonHandler.saveMaps(communityMaps, MapType.COMMUNITYMAP);
             log.info("Newly created map stored successfully in JSON!");
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
-            if(e.getMessage().contains("Identical map already saved")){
+            if (e.getMessage().contains("Identical map already saved")) {
                 part1 = e.getMessage();
             }
         }
-        if(doUpload) {
+        if (doUpload) {
             try {
                 db.uploadCommunityMap(map);
                 log.info("Newly created Community-Map successfully published!");
-            }
-            catch (Exception e) {
+            } 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!");
@@ -238,23 +221,21 @@ public class Persistence {
         }
     }
 
-    public synchronized void updatePlayerStatistics(int kills, int deaths, int gameTime, int blocksDestroyed, boolean gameWon) throws DatabaseException{  //after game round; only update stats in RAM, not in persistence (run savePlayerStatistics() method at end of program to save stats to persistence)
+    public synchronized void updatePlayerStatistics(int kills, int deaths, int gameTime, int blocksDestroyed, boolean gameWon) throws DatabaseException {  //after game round; only update stats in RAM, not in persistence (run savePlayerStatistics() method at end of program to save stats to persistence)
         try {
             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){
+            if (gameWon) {
                 statistics.addGamesWon();
-            }
-            else{
+            } else {
                 statistics.addGamesLost();
             }
             RuntimeInfo.getInstance().resetGameStats();
             log.info("Statistics successfully updated!");
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
         }
     }
@@ -262,50 +243,42 @@ public class Persistence {
     public synchronized void createAccount(String playerName, String password, AccountType type) throws DatabaseException { //for local account submit empty string
         try {
             Parser.usernameValid(playerName);
-            if(type == AccountType.LOCAL) {
+            if (type == AccountType.LOCAL) {
                 account = new PlayerAccount(playerName, "", type);
-            }
-            else if(type == AccountType.ONLINE) {
+            } else if (type == AccountType.ONLINE) {
                 Parser.passwordValid(password);
                 String hashedPassword = HashGenerator.hashAndHex(password);
                 db.createPlayer(playerName, hashedPassword);
                 account = new PlayerAccount(playerName, hashedPassword, type);
-            }
-            else{
+            } else {
                 throw new DatabaseException("Corrupted Account-Type. Please restart game.");
             }
             gsonHandler.saveAccount(account);
             log.info("Player account successfully created!");
-        }
-        catch(ParserException e){
+        } catch (ParserException e) {
             log.error(e);
             throw new DatabaseException(e.getMessage());
-        }
-        catch(SQLException e){
+        } catch (SQLException e) {
             log.error(e);
-            if(e.getMessage().contains("ORA-17868") | e.getMessage().contains("ORA-01017")){
+            if (e.getMessage().contains("ORA-17868") | e.getMessage().contains("ORA-01017")) {
                 throw new DatabaseException("No connection to SQL server! Do you want to create a local account?");
-            }
-            else if(e.getMessage().equals("ORA-00001")){
+            } else if (e.getMessage().equals("ORA-00001")) {
                 throw new DatabaseException("Player name already taken. Please change name, use local account or login with existing account!");
-            }
-            else{
+            } else {
                 throw new DatabaseException("Connection to SQL server failed! Do you want to create a local account?");
             }
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new DatabaseException("Error creating account. Please restart game or download game files again.");
         }
     }
 
-    public synchronized void createRemoteCommunityMapsList(){        //for Map-Browser
+    public synchronized void createRemoteCommunityMapsList() {        //for Map-Browser
         try {
             communityMapsListRemote = db.getCommunityMapsList();
             log.info("MapList successfully retrieved from server!");
             //log.info(communityMapsListRemote.get(0).getMapName());                 //for testing purposes
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
         }
     }
@@ -319,97 +292,87 @@ public class Persistence {
             } else if (account.getAccountType() == AccountType.ONLINE) {
                 Parser.usernameValid(account.getPlayerName());
                 Parser.sha1HexHashValid(account.getAccountPassword());
-                if (!(account.getAccountPassword().equals(db.checkCredentials(account.getPlayerName())))){
+                if (!(account.getAccountPassword().equals(db.checkCredentials(account.getPlayerName())))) {
                     throw new DatabaseException("Locally stored password does not match online password. Please reenter credentials!");
                 }
-            }
-            else{   //probably obsolete, because GsonHandler would already throw Exception, if no AccountType could be loaded; anyway here, because own safety better than external safety
+            } else {   //probably obsolete, because GsonHandler would already throw Exception, if no AccountType could be loaded; anyway here, because own safety better than external safety
                 throw new DatabaseException("AccountType invalid - accountData corrupted! Please create new Account or login with existing!");
             }
             log.info("Player account successfully verified!");
-        }
-        catch(ParserException e){
+        } catch (ParserException e) {
             log.error(e);
             throw new DatabaseException(e.getMessage());
-        }
-        catch(SQLException e){
+        } catch (SQLException e) {
             log.error(e);
-            if(e.getMessage().contains("ORA-17868") | e.getMessage().contains("ORA-01017")){
+            if (e.getMessage().contains("ORA-17868") | e.getMessage().contains("ORA-01017")) {
                 throw new DatabaseException("No connection to SQL server! Do you want to continue without tracking statistics?");
-            }
-            else if(e.getMessage().contains("No match on SQL database!")){
+            } else if (e.getMessage().contains("No match on SQL database!")) {
                 throw new DatabaseException("No entry for player name " + account.getPlayerName() + " on SQL server. Please create account or login with different username!");
-            }
-            else{
+            } else {
                 throw new DatabaseException("Connection to SQL server failed! Do you want to continue without tracking statistics");
             }
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new DatabaseException("Loading player account data from local storage failed! Please create new account!");
         }
     }
 
-    public synchronized void verifyCoreMaps() throws DatabaseException{
+    public synchronized void verifyCoreMaps() throws DatabaseException {
         try {
             for (int i = 0; coreMaps.size() > i; i++) {
                 Parser.mapDataValid(coreMaps.get(i).getMapData());
                 Parser.mapNameValid(coreMaps.get(i).getMapName());
                 Parser.sha1HexHashValid(coreMaps.get(i).getMapID());
-                if(!HashGenerator.hashAndHex(coreMaps.get(i).getMapData()).equals(coreMaps.get(i).getMapID())){
+                if (!HashGenerator.hashAndHex(coreMaps.get(i).getMapData()).equals(coreMaps.get(i).getMapID())) {
                     throw new DatabaseException("mapData Hash does not match mapID!");
                 }
             }
             log.info("Core-Maps data is valid!");
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new DatabaseException(e.getMessage());
         }
     }
 
-    public synchronized void verifyCommunityMaps() throws DatabaseException{
+    public synchronized void verifyCommunityMaps() throws DatabaseException {
         try {
             for (int i = 0; communityMaps.size() > i; i++) {
                 Parser.mapDataValid(communityMaps.get(i).getMapData());
                 Parser.mapNameValid(communityMaps.get(i).getMapName());
                 Parser.sha1HexHashValid(communityMaps.get(i).getMapID());
-                if(!HashGenerator.hashAndHex(communityMaps.get(i).getMapData()).equals(communityMaps.get(i).getMapID())){
+                if (!HashGenerator.hashAndHex(communityMaps.get(i).getMapData()).equals(communityMaps.get(i).getMapID())) {
                     throw new DatabaseException("mapData Hash does not match mapID!");
                 }
             }
             log.info("Community-Maps data is valid!");
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new DatabaseException(e.getMessage());
         }
     }
 
-    public synchronized void verifyAppSettings() throws DatabaseException{
+    public synchronized void verifyAppSettings() throws DatabaseException {
         try {
             Parser.volumeValid(settings.getSfxVolume());
             Parser.volumeValid(settings.getMusicVolume());
             log.info("Settings data is valid!");
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
             throw new DatabaseException(e.getMessage());
         }
     }
 
-    public synchronized void resetPlayerAccount() throws DatabaseException{
-        try{
+    public synchronized void resetPlayerAccount() throws DatabaseException {
+        try {
             account = new PlayerAccount("", "", AccountType.NONE);
             gsonHandler.saveAccount(account);
             log.info("Player account successfully reset!");
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
         }
     }
 
-    public synchronized void resetPlayerStatistics() throws DatabaseException{
+    public synchronized void resetPlayerStatistics() throws DatabaseException {
         try {
             if (account.getAccountType() == AccountType.LOCAL) {
                 statistics = new PlayerStatistics(0, 0, 0, 0, 0, 0);
@@ -420,23 +383,21 @@ public class Persistence {
                 statistics = new PlayerStatistics(0, 0, 0, 0, 0, 0);
             }
             log.info("Player statistics successfully reset on local storage!");
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
         }
     }
 
-    public synchronized void resetSettings(){
+    public synchronized void resetSettings() {
         try {
             settings = new AppSettings(50, 50);
             gsonHandler.saveSettings(settings);
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
         }
     }
 
-    public synchronized void resetCoreMaps(){
+    public synchronized void resetCoreMaps() {
         try {
             coreMaps = new ArrayList<MapData>();
             coreMaps.add(new MapData("b3d1910a7c4f0c5f4987e9af701a8fdd841b9cb2", "SE3", 18, 18, "10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 0 0 0 16 0 0 0 16 0 16 16 16 0 0 0 0 10 10 0 0 0 16 0 0 0 16 0 16 0 0 0 0 0 0 10 10 0 0 0 16 0 0 0 16 0 16 16 16 0 0 0 0 10 10 0 0 0 16 0 16 0 16 0 16 0 0 0 0 0 0 10 10 0 0 0 0 16 0 16 0 0 16 16 16 0 0 0 0 10 10 0 1 1 0 1 1 0 0 0 0 1 1 0 1 1 0 10 10 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 10 10 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 10 10 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 10 10 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 10 10 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 10 10 0 0 11 10 10 0 11 10 10 0 0 11 10 10 0 0 10 10 0 0 11 0 0 0 11 0 0 0 0 0 0 11 0 0 10 10 0 0 11 10 10 0 11 10 10 0 0 11 10 10 0 0 10 10 0 0 0 0 11 0 11 0 0 0 0 0 0 11 0 0 10 10 0 0 11 10 10 0 11 10 10 0 0 11 10 10 0 0 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10"));
@@ -450,21 +411,19 @@ public class Persistence {
             coreMaps.add(new MapData("09f4fbab8fd30c11a585ade60258aadebb424c23", "HelloWorld", 18, 18, "10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 10 11 0 11 0 11 10 0 11 0 0 11 0 0 11 10 10 10 10 11 0 11 0 11 0 0 11 0 0 11 0 0 11 0 11 10 10 11 10 10 0 11 10 0 11 0 0 11 0 0 11 0 11 10 10 11 0 11 0 11 0 0 11 0 0 11 0 0 11 0 11 10 10 11 0 11 0 11 10 0 11 10 0 11 10 0 11 10 10 10 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 10 0 0 0 0 0 0 16 16 16 16 0 0 0 0 0 0 10 10 0 0 0 0 0 16 16 16 16 16 16 0 0 0 0 0 10 10 0 0 0 0 16 16 16 16 16 16 16 16 0 0 0 0 10 10 0 0 0 0 16 16 16 16 16 16 16 16 0 0 0 0 10 10 0 0 0 0 16 16 16 16 16 16 16 16 0 0 0 0 10 10 0 0 0 0 16 16 16 16 16 16 16 16 0 0 0 0 10 10 0 0 0 0 0 16 16 16 16 16 16 0 0 0 0 0 10 10 0 0 0 0 0 0 16 16 16 16 0 0 0 0 0 0 10 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10"));
             gsonHandler.saveMaps(coreMaps, MapType.COREMAP);
             log.info("Core maps successfully reset on local storage!");
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
         }
     }
 
-    public synchronized void resetCommunityMaps(){
+    public synchronized void resetCommunityMaps() {
         try {
             communityMaps = new ArrayList<MapData>();
             communityMaps.add(new MapData("fbf44184867512faecc195ae75ca55d5ab7bad2d", "Arena3", 18, 18, "12 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 12 12 1 1 1 1 1 1 1 8 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 12"));
             communityMaps.add(new MapData("1c23b362fd666c5fb7ed60ca611b17246424e49f", "Arena4", 18, 18, "12 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 12 12 1 1 1 1 1 1 1 8 4 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 12 12 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 12"));
             gsonHandler.saveMaps(communityMaps, MapType.COMMUNITYMAP);
             log.info("Community maps successfully reset on local storage!");
-        }
-        catch(Exception e){
+        } catch (Exception e) {
             log.error(e);
         }
     }
@@ -479,8 +438,7 @@ public class Persistence {
             } else {
                 throw new DatabaseException("Wrong password!");
             }
-        }
-        catch (GSONException | SQLException e) {
+        } catch (GSONException | SQLException e) {
             throw new RuntimeException(e);
         }
     }
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/PlayerStatistics.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/PlayerStatistics.java
index 94ff1e2b259a517f7a3a91997c2ce0b29f214aee..fa2a0549c781b0ff67f2e65dc57846332657ef78 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/PlayerStatistics.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/PlayerStatistics.java
@@ -4,7 +4,6 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 
 public class PlayerStatistics {
-    private static final Logger log = LogManager.getLogger(PlayerStatistics.class);
 
     private int gamesWon = 0;
     private int gamesLost = 0;
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 30d2ba1fcd4d47519db2a1a4c8fec007398ffcbb..f127303eda39038e0983eee63a4cf4b40fa1afac 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.Controller.Enum.PlayerMode;
 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;
@@ -9,6 +10,8 @@ import de.hdm_stuttgart.battlearena.Model.Entity.EntityClass;
 import de.hdm_stuttgart.battlearena.Model.Entity.IEntity;
 import de.hdm_stuttgart.battlearena.Model.Map.Biom;
 
+import de.hdm_stuttgart.battlearena.Model.Multiplayer.ConnectionHandler;
+import de.hdm_stuttgart.battlearena.Model.Multiplayer.Server;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
@@ -33,7 +36,7 @@ public class RuntimeInfo {
 
     private List<IEntity> gameplayObjects = new ArrayList<>();
 
-    private List<IEntity> explosionspawns = new ArrayList<>();
+    private List<IEntity> explosionSpawns = new ArrayList<>();
 
 
     //Stats Tracking during Gameplay
@@ -41,12 +44,19 @@ public class RuntimeInfo {
     private int deaths = 0;
     private int blocksDestroyed = 0;
     private int gameTime = 0;
-    private boolean gameWon = true;
 
+    //multiplayer
+    private Server server;
+    private ConnectionHandler connectionHandler;
+    private boolean gameWon = true;
 
-    private RuntimeInfo() {
-    }
+    //multiplayerID
+    private int playerID;
+    private PlayerMode playerMode;
+    private PlayerMode enemyPlayerMode;
+    private EntityClass enemyPlayerClass = EntityClass.HUMAN;
 
+    private RuntimeInfo() {}
 
     public static RuntimeInfo getInstance() {
         return runtimeInfoSingleton;
@@ -128,14 +138,6 @@ public class RuntimeInfo {
         this.gameplayObjects = gameplayObjects;
     }
 
-    public List<IEntity> getExplosionspawns() {
-        return explosionspawns;
-    }
-
-    public void setExplosionspawns(List<IEntity> explosionspawns) {
-        this.explosionspawns = explosionspawns;
-    }
-
     public String getMapDataGame() {
         return mapDataGame;
     }
@@ -196,4 +198,47 @@ public class RuntimeInfo {
         this.gameWon = gameWon;
     }
 
-}
+    public Server getServer() {
+        return server;
+    }
+
+    public void setServer(Server server) {
+        this.server = server;
+    }
+
+    public ConnectionHandler getConnectionHandler() {
+        return connectionHandler;
+    }
+
+    public void setConnectionHandler(ConnectionHandler connectionHandler) {
+        this.connectionHandler = connectionHandler;
+    }
+
+    public PlayerMode getPlayerMode() {
+        return playerMode;
+    }
+
+    public void setPlayerMode(PlayerMode playerMode) {
+        this.playerMode = playerMode;
+    }
+
+    public PlayerMode getEnemyPlayerMode() {
+        return enemyPlayerMode;
+    }
+
+    public void setEnemyPlayerMode(PlayerMode enemyPlayerMode) {
+        this.enemyPlayerMode = enemyPlayerMode;
+    }
+
+    public EntityClass getEnemyPlayerClass() {
+        return enemyPlayerClass;
+    }
+
+    public void setEnemyPlayerClass(EntityClass enemyPlayerClass) {
+        this.enemyPlayerClass = enemyPlayerClass;
+    }
+
+    public void setPlayerID(int playerID) {
+        this.playerID = playerID;
+    }
+}
\ No newline at end of file
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
index e7f37c6deec9db193b2f3ac8410cf28cbf44b202..10a021420c10b8eb82acea10f89901a3606d803c 100644
--- 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
@@ -5,7 +5,7 @@ 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{
+public class ThreadCreateAcc extends Thread {
 
     private static final Logger log = LogManager.getLogger(ThreadCreateAcc.class);
     private String playerName;
@@ -14,7 +14,6 @@ public class ThreadCreateAcc extends Thread{
 
     @Override
     public void run() {
-
         Persistence persistenceInst = Persistence.getInstance();
         Threads threadsInstance = Threads.getInstance();
 
@@ -32,11 +31,10 @@ public class ThreadCreateAcc extends Thread{
         }
     }
 
-    public void startThread(String playerName, String password, AccountType type){
+    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
index 76bf3c0ebcc16150b3e34d907faaf0b5c33794e7..ea558470b9a3714c6bda5f3d43fb7b34db936df0 100644
--- 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
@@ -4,14 +4,13 @@ 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{
+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();
         Threads threadsInstance = Threads.getInstance();
 
@@ -29,9 +28,8 @@ public class ThreadDLCommMap extends Thread{
         }
     }
 
-    public void startThread(String mapID){
+    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
index 0062eaf71c227ed5aa6614307e6024357f691560..17843eda61f907a564069eab04fe86a4b70c4be8 100644
--- 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
@@ -10,7 +10,6 @@ public class ThreadGetMapList extends Thread {
 
     @Override
     public void run() {
-
         Persistence persistenceInst = Persistence.getInstance();
         Threads threadsInstance = Threads.getInstance();
 
@@ -27,5 +26,4 @@ public class ThreadGetMapList extends Thread {
             threadsInstance.setThreadCommMapList(ThreadStatus.FAILED);
         }
     }
-
 }
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadLogin.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadLogin.java
index b6bb5e6c7c647dfe372702933672eead65c56b02..dc256d4e3652115582272ae402f3ea9c125c554e 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadLogin.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadLogin.java
@@ -12,7 +12,6 @@ public class ThreadLogin extends Thread{
 
     @Override
     public void run() {
-
         Persistence persistenceInst = Persistence.getInstance();
         Threads threadsInstance = Threads.getInstance();
 
@@ -35,5 +34,4 @@ public class ThreadLogin extends Thread{
         this.password = password;
         start();
     }
-
 }
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
index c815c70fc73043c305ddad9e575ac662207a50ac..28ceaa854c70c2911583b3971797e1793909bb2a 100644
--- 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
@@ -10,7 +10,6 @@ public class ThreadRstStats extends Thread {
 
     @Override
     public void run() {
-
         Persistence persistenceInst = Persistence.getInstance();
         Threads threadsInstance = Threads.getInstance();
 
@@ -27,5 +26,4 @@ public class ThreadRstStats extends Thread {
             threadsInstance.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
index 47877f48acc768333279887fd1a899bdb046ac65..6d2db4d96ef3dd2826511bfdddac8f085f41fd5e 100644
--- 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
@@ -4,15 +4,13 @@ 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{
-
+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();
         Threads threadsInstance = Threads.getInstance();
 
@@ -30,10 +28,9 @@ public class ThreadSaveCommMap extends Thread{
         }
     }
 
-    public void startThread(MapData map, boolean doUpload){     //user can check box to optionally publish map on SQL server
+    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
index 3b6c425300db7c7790908c47e36e2282e788b33e..7c9822eed63a6f2cb58b98a460e3b83767add688 100644
--- 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
@@ -10,7 +10,6 @@ public class ThreadSaveStats extends Thread{
 
     @Override
     public void run() {
-
         Persistence persistenceInst = Persistence.getInstance();
         Threads threadsInstance = Threads.getInstance();
 
@@ -27,5 +26,4 @@ public class ThreadSaveStats extends Thread{
             threadsInstance.setThreadSaveStats(ThreadStatus.FAILED);
         }
     }
-
 }
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup1.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup1.java
index 3b8016b8ed5629b16ef2d949f6fc9a0376f51ad1..f4c3818fccb1a7bcd694d7dad603d49177774166 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup1.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup1.java
@@ -4,13 +4,12 @@ import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs.ThreadStatus
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
-public class ThreadStartup1 extends Thread{
+public class ThreadStartup1 extends Thread {
 
     private static final Logger log = LogManager.getLogger(ThreadStartup1.class);
 
     @Override
     public void run() {
-
         Persistence persistenceInst = Persistence.getInstance();
         Threads threadsInstance = Threads.getInstance();
 
@@ -32,5 +31,4 @@ public class ThreadStartup1 extends Thread{
             threadsInstance.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
index 50ba60bf4edc9c10f56ed27e7833a65ae3e808d6..a48be9b921331a712ea10130ebbd60d9d9318eb2 100644
--- 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
@@ -11,7 +11,6 @@ public class ThreadStartup2 extends Thread{
 
     @Override
     public void run() {
-
         Persistence persistenceInst = Persistence.getInstance();
         Threads threadsInstance = Threads.getInstance();
 
@@ -31,5 +30,4 @@ public class ThreadStartup2 extends Thread{
             threadsInstance.setThreadStartup2(ThreadStatus.FAILED);
         }
     }
-
 }
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup3.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup3.java
index 738c4add7276cc2706a23204b0b7daef94e51975..4ee8d1519d998fe2164fac16be14e7ad5d62ac4d 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup3.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/ThreadStartup3.java
@@ -11,7 +11,6 @@ public class ThreadStartup3 extends Thread{
 
     @Override
     public void run() {
-
         Persistence persistenceInst = Persistence.getInstance();
         Threads threadsInstance = Threads.getInstance();
 
@@ -31,5 +30,4 @@ public class ThreadStartup3 extends Thread{
             threadsInstance.setThreadStartup3(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
index f0bc303975da0e08d54330a3331e9dca7bee1577..0fc9fc54a43891008353f38e2c2c53666a11d708 100644
--- 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
@@ -10,7 +10,6 @@ public class ThreadUpdateMaps extends Thread{
 
     @Override
     public void run() {
-
         Persistence persistenceInst = Persistence.getInstance();
         Threads threadsInstance = Threads.getInstance();
 
@@ -27,5 +26,4 @@ public class ThreadUpdateMaps extends Thread{
             threadsInstance.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
index 44ae6fe13e20f599800784e95dc6b0bd9a8ca9b7..a29f9d7d03b53ee32eaff9ca17463c2796fe3e07 100644
--- 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
@@ -10,7 +10,6 @@ public class ThreadUpdateStats extends Thread{
 
     @Override
     public void run() {
-
         Persistence persistenceInst = Persistence.getInstance();
         RuntimeInfo runtimeInfoInst = RuntimeInfo.getInstance();
         Threads threadsInstance = Threads.getInstance();
@@ -33,5 +32,4 @@ public class ThreadUpdateStats extends Thread{
             threadsInstance.setThreadUpdateStats(ThreadStatus.FAILED);
         }
     }
-
 }
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Threads.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Threads.java
index ebf4876b70d047545985366e5983fdd7438a97ec..0cbdadeb5c19b6e17ce5d0d2326c417d43b81f24 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Threads.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Threads.java
@@ -5,8 +5,6 @@ import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
 public class Threads {
-
-    private static final Logger log = LogManager.getLogger(Threads.class);
     private static final Threads threadsSingleton = new Threads();
 
     //Thread Status-Updates
@@ -36,9 +34,12 @@ public class Threads {
     private String threadLoginMsg;
 
 
+    private Threads() {
+    }
+
+    ;
 
-    private Threads(){};
-    public static Threads getInstance(){
+    public static Threads getInstance() {
         return threadsSingleton;
     }
 
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/CryptoUtils.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/CryptoUtils.java
index 757543af9f7227b44495bed77f991b06ca34716a..91d58b53960c81ea1ee7234517614733d0da7956 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/CryptoUtils.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/CryptoUtils.java
@@ -21,23 +21,23 @@ public class CryptoUtils{
     private static String parts[] = new String[2];
     private static final String ALGORITHM = "AES";
     private static final String TRANSFORMATION = "AES/ECB/PKCS5Padding";
-    private static String key = "Peters Olivenöl";
+    private static final String key = "Peters Olivenöl";
     private static String  encrypted_as_word = "encrypted;";
-    private static boolean alreadyencrypted = false;
+    private static boolean alreadyEncrypted = false;
     private static boolean multipleencryptions = false;
     private static int encryptionreturn;
 
     private static final Logger log = LogManager.getLogger(CryptoUtils.class);
 
 
-    public static int encrypt(File inputFile,  boolean multipleencryptions) throws CryptoException {
-        alreadyencrypted = check_if_file_already_encrypted(inputFile);
-        if(multipleencryptions){
+    public static int encrypt(File inputFile,  boolean multipleEncryptions) throws CryptoException {
+        alreadyEncrypted = check_if_file_already_encrypted(inputFile);
+        if(multipleEncryptions){
             doCrypto(Cipher.ENCRYPT_MODE, key, inputFile);
             log.info("This File can be encrypted multiple times");
             return encryptionreturn = 0;
         }
-        else if(!alreadyencrypted && !multipleencryptions){
+        else if(!alreadyEncrypted && !multipleEncryptions){
             doCrypto(Cipher.ENCRYPT_MODE, key, inputFile);
             log.info("This File can only be encryptet once and this is now!");
             return encryptionreturn = 1;
@@ -87,73 +87,9 @@ public class CryptoUtils{
         String filename =  inputFile.getName();
         //log.info("filename: " + filename);
             if(filename.contains(encrypted_as_word)){
-                return alreadyencrypted =true;
+                return alreadyEncrypted =true;
             }
         inputFile.renameTo(new File("src\\main\\resources\\database\\" + encrypted_as_word + filename));
-        return alreadyencrypted = false;
+        return alreadyEncrypted = false;
     }
-
-       /*public static String[] doCrypto(int cipherMode, String key, File inputFile) throws CryptoException {
-        try {
-
-            String filename = inputFile.getName();
-            //String encrypted_as_word = "encrypted;";
-            byte[] encryptet_as_word_as_bytes = encrypted_as_word.getBytes();
-
-            Key secretKey = new SecretKeySpec(key.getBytes(), ALGORITHM);
-            Cipher cipher = Cipher.getInstance(TRANSFORMATION);
-            cipher.init(cipherMode, secretKey);
-
-            FileInputStream inputStream = new FileInputStream(inputFile);
-            byte[] inputBytes = new byte[(int) inputFile.length()];
-            inputStream.read(inputBytes);   //liest from inputstream into BufferArray
-
-            String inputbytes = new String(inputBytes, StandardCharsets.UTF_8);
-            String[] wellencrypted = inputbytes.split(";");
-
-            log.info("encrypted_as_word.substring(0,encrypted_as_word.length()-1): " + encrypted_as_word.substring(0,encrypted_as_word.length()-1));
-
-            if(wellencrypted[0].equals(encrypted_as_word.substring(0,encrypted_as_word.length()-1))){
-                wellencrypted = Arrays.copyOfRange(wellencrypted,1,wellencrypted.length);
-                inputBytes = wellencrypted[0].getBytes();
-                log.info("Das Wort encrypted ist enthalten!");
-                log.info("inputBytes: " + new String(inputBytes, StandardCharsets.UTF_8));
-
-            }
-            log.info("wellencrypted[0]: " +wellencrypted[0]);
-            log.info("wel[0]: " + wel[0]);
-             log.info("inputbytes: " + inputbytes);
-            log.info("inputBytes: " + new String(inputBytes, StandardCharsets.UTF_8));
-
-            byte[] outputBytes = cipher.doFinal(inputBytes);
-
-
-            String completeString = new String(outputBytes, StandardCharsets.UTF_8);
-            log.info("completeString/outputBytes: " + completeString);
-            parts = completeString.split(";");
-
-                if(cipherMode == Cipher.ENCRYPT_MODE){
-                    FileOutputStream outputStream = new FileOutputStream(inputFile);
-                    ByteArrayOutputStream outputStream12 = new ByteArrayOutputStream( );
-                    outputStream12.write(encryptet_as_word_as_bytes);
-                    outputStream12.write(outputBytes);
-                    byte combined[] = outputStream12.toByteArray( );
-                    String combinedbytes = new String(combined, StandardCharsets.UTF_8);
-                    log.info("combined: " + combinedbytes);
-
-
-                    outputStream.write(combined);//outputBytes
-
-                    outputStream.close();
-                }
-
-            inputStream.close();
-
-        } catch (NoSuchPaddingException | NoSuchAlgorithmException
-                 | InvalidKeyException | BadPaddingException
-                 | IllegalBlockSizeException | IOException ex) {
-            throw new CryptoException("Error encrypting/decrypting file", ex);
-        }
-        return parts;
-    }*/
 }
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/HashGenerator.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/HashGenerator.java
index b6bead225f6a2d53dd83766c6af73a6204be0afc..78940e7633cccc7329b12ccc02ce22a00758d6aa 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/HashGenerator.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/HashGenerator.java
@@ -1,26 +1,19 @@
 package de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Utilities;
 
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
 
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 
 public class HashGenerator {
-
-    private static final Logger log = LogManager.getLogger(HashGenerator.class);
-
     public static String hashAndHex(String input) throws NoSuchAlgorithmException {
         //Generates SHA1 Hash from input string and converts bytes from hash to hexadecimal resulting in hexadecimal String
         MessageDigest sha1 = MessageDigest.getInstance("SHA1");
         byte[] sha1Hash = sha1.digest((input).getBytes());
         String result = "";
-        for (int i=0; i < sha1Hash.length; i++) {
+        for (byte hash : sha1Hash) {
             result +=
-                    Integer.toString( ( sha1Hash[i] & 0xff ) + 0x100, 16).substring( 1 );
+                    Integer.toString((hash & 0xff) + 0x100, 16).substring(1);
         }
         return result;
     }
-
-
 }
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/Parser.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/Parser.java
index f3742c57e27bee0a60f44ffb66395754a57088a5..c207fa9533c4bc37f72f4a6307fd455d6a92dccf 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/Parser.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/DataStorage/Classes/Utilities/Parser.java
@@ -21,17 +21,17 @@ public class Parser {
         int minUsernameLength = 4;
         int maxUsernameLength = 40;
 
-        if(username.length() < minUsernameLength){
+        if (username.length() < minUsernameLength) {
             throw new ParserException("Username too short! Min length is " + minUsernameLength + " characters.");
         }
-        if(username.length() > maxUsernameLength){
+        if (username.length() > maxUsernameLength) {
             throw new ParserException("Username too long! Max length is " + maxUsernameLength + " characters.");
         }
 
         Pattern pat = Pattern.compile("[^a-z0-9_-]", Pattern.CASE_INSENSITIVE);
         Matcher mat = pat.matcher(username);
         boolean result = mat.find();
-        if(result){
+        if (result) {
             throw new ParserException("Forbidden characters used! Only user letters A-Z or numbers 0-9 or symbols '-' or '_' !");
         }
     }
@@ -40,17 +40,17 @@ public class Parser {
         int minPasswordLength = 4;
         int maxPasswordLength = 40;
 
-        if(password.length() < minPasswordLength){
+        if (password.length() < minPasswordLength) {
             throw new ParserException("Password too short! Min length is " + minPasswordLength + " characters.");
         }
-        if(password.length() > maxPasswordLength){
+        if (password.length() > maxPasswordLength) {
             throw new ParserException("Password too long! Max length is " + maxPasswordLength + " characters.");
         }
 
         Pattern pat = Pattern.compile("[^a-z0-9_-]", Pattern.CASE_INSENSITIVE);
         Matcher mat = pat.matcher(password);
         boolean result = mat.find();
-        if(result){
+        if (result) {
             throw new ParserException("Forbidden characters used! Only user letters A-Z or numbers 0-9 or symbols '-' or '_' !");
         }
     }
@@ -59,17 +59,17 @@ public class Parser {
         int minMapNameLength = 3;
         int maxMapNameLength = 30;
 
-        if(mapName.length() < minMapNameLength){
+        if (mapName.length() < minMapNameLength) {
             throw new ParserException("Map-Name too short! Min length is " + minMapNameLength + " characters.");
         }
-        if(mapName.length() > maxMapNameLength){
+        if (mapName.length() > maxMapNameLength) {
             throw new ParserException("Map-Name too long! Max length is " + maxMapNameLength + " characters.");
         }
 
         Pattern pat = Pattern.compile("[^a-z0-9_-]", Pattern.CASE_INSENSITIVE);
         Matcher mat = pat.matcher(mapName);
         boolean result = mat.find();
-        if(result){
+        if (result) {
             throw new ParserException("Forbidden characters used! Only user letters A-Z or numbers 0-9 or symbols '-' or '_' !");
         }
     }
@@ -77,14 +77,14 @@ public class Parser {
     public static void sha1HexHashValid(String mapID) throws ParserException {
         int hashLength = 40;
 
-        if(mapID.length() != hashLength){
+        if (mapID.length() != hashLength) {
             throw new ParserException("SHA1 hash length not correct. Must have length of " + hashLength + " characters!");
         }
 
         Pattern pat = Pattern.compile("[^a-f0-9]");         //maybe make case-insensitive -> letters can be uppercase and still be valid hex number
         Matcher mat = pat.matcher(mapID);
         boolean result = mat.find();
-        if(result){
+        if (result) {
             throw new ParserException("Forbidden characters used! SHA1 hash only consists out of letters a-f and/or numbers 0-9!");
         }
     }
@@ -97,43 +97,43 @@ public class Parser {
         int octetMinDecValue = 0;
         int octetMaxDecValue = 255;
 
-        if(address.equals("localhost")){
+        if (address.equals("localhost")) {
             return;
         }
 
-        if(addressLength > addressMaxLength){
+        if (addressLength > addressMaxLength) {
             throw new ParserException("IP-Address too long. Must have maximum length of " + addressMaxLength + " characters including octet dividers (.) !");
         }
 
-        if(addressLength < addressMinLength){
+        if (addressLength < addressMinLength) {
             throw new ParserException("IP-Address too short. Must have minimum length of " + addressMinLength + " characters including octet dividers (.) !");
         }
 
-        if(address.charAt(0) == '.' | address.charAt(addressLength - 1) == '.'){
+        if (address.charAt(0) == '.' | address.charAt(addressLength - 1) == '.') {
             throw new ParserException("IP-Address must not start nor end with octet dividers (.) !");
         }
 
         int counter = 0;
-        for(int i = 0; addressLength > i ; i++){
-            if(address.charAt(i) == '.'){
+        for (int i = 0; addressLength > i; i++) {
+            if (address.charAt(i) == '.') {
                 counter++;
             }
         }
-        if(counter != 3){
+        if (counter != 3) {
             throw new ParserException("IP-Address must contain exactly 3 octet dividers (.) !");
         }
 
-        for(int i = 0; addressLength > i ; i++){
-            if(address.charAt(i) == '.' && address.charAt(i + 1) == '.'){
+        for (int i = 0; addressLength > i; i++) {
+            if (address.charAt(i) == '.' && address.charAt(i + 1) == '.') {
                 throw new ParserException("IP-Address must not contain two or more consecutive dividers (.) without number in between!");
             }
         }
 
         Pattern pat = Pattern.compile("[^0-9.]");
-        for(int i = 0; addressLength > i ; i++){
-            Matcher mat = pat.matcher(address.substring(i, i+1));
+        for (int i = 0; addressLength > i; i++) {
+            Matcher mat = pat.matcher(address.substring(i, i + 1));
             boolean result = mat.find();
-            if(result){
+            if (result) {
                 throw new ParserException("IP address must consist out of numbers 0-9 and separators (.) !");
             }
         }
@@ -141,19 +141,18 @@ public class Parser {
         counter = 0;
         int[] positions = new int[4];
         positions[0] = 0;
-        for(int i = 0; addressLength > i ; i++){
-            if(address.charAt(i) == '.'){
+        for (int i = 0; addressLength > i; i++) {
+            if (address.charAt(i) == '.') {
                 counter++;
                 positions[counter] = i + 1;
             }
         }
-        for(int i = 0; positions.length > i; i++){
-            if(positions.length - 1 > i) {
+        for (int i = 0; positions.length > i; i++) {
+            if (positions.length - 1 > i) {
                 if (Integer.parseInt(address.substring(positions[i], positions[i + 1] - 1)) > octetMaxDecValue) {
                     throw new ParserException("Octets of IP-address must not exceed 255!");
                 }
-            }
-            else{
+            } else {
                 if (Integer.parseInt(address.substring(positions[i], addressLength)) > octetMaxDecValue) {
                     throw new ParserException("Octets of IP-address must not exceed 255!");
                 }
@@ -185,39 +184,39 @@ public class Parser {
         int maxMapDataLength = spacesAmount + borderTilesAmount * Integer.toString(indestructibleTileMaxNumber).length() + spawnTilesAmount * Integer.toString(walkableTileMaxNumber).length() + fieldTilesAmount * Integer.toString(destructibleTileMaxNumber).length();           //"Integer.toString(destructibleTileMaxNumber).length()" results in number of digits of destructibleTileMaxNumber
         int minMapDataLength = spacesAmount + borderTilesAmount * Integer.toString(indestructibleTileMinNumber).length() + spawnTilesAmount * Integer.toString(walkableTileMinNumber).length() + fieldTilesAmount * Integer.toString(walkableTileMinNumber).length();
 
-        if(actualMapDataLength > maxMapDataLength){
+        if (actualMapDataLength > maxMapDataLength) {
             throw new ParserException("Map-Data corrupted - mapData String must not exceed length of " + maxMapDataLength + " chars including spaces for " + mapWidth + "x" + mapHeight + " Tiles map!");
         }
 
-        if(actualMapDataLength < minMapDataLength){
+        if (actualMapDataLength < minMapDataLength) {
             throw new ParserException("Map-Data corrupted - minimum length of mapData String must be " + minMapDataLength + " chars including spaces for " + mapWidth + "x" + mapHeight + " Tiles map!");
         }
 
-        if(mapData.charAt(0) == ' ' | mapData.charAt(actualMapDataLength - 1) == ' '){
+        if (mapData.charAt(0) == ' ' | mapData.charAt(actualMapDataLength - 1) == ' ') {
             throw new ParserException("Map-Data corrupted - must not start nor end with space!");
         }
 
-        for(int i = 0; actualMapDataLength > i ; i++){
-            if(mapData.charAt(i) == ' ' && mapData.charAt(i + 1) == ' '){
+        for (int i = 0; actualMapDataLength > i; i++) {
+            if (mapData.charAt(i) == ' ' && mapData.charAt(i + 1) == ' ') {
                 throw new ParserException("Map-Data corrupted - must not contain two or more consecutive spaces without number in between!");
             }
         }
 
         int counter = 0;
-        for(int i = 0; i < actualMapDataLength; i++){
-            if((mapData.charAt(i) == ' ')){
+        for (int i = 0; i < actualMapDataLength; i++) {
+            if ((mapData.charAt(i) == ' ')) {
                 counter++;
             }
         }
-        if(counter != spacesAmount){
+        if (counter != spacesAmount) {
             throw new ParserException("Map-Data corrupted - number of spaces must be " + spacesAmount + "!");
         }
 
         Pattern pat = Pattern.compile("[^0-9 ]");
-        for(int i = 0; actualMapDataLength > i ; i++){
-            Matcher mat = pat.matcher(mapData.substring(i, i+1));
+        for (int i = 0; actualMapDataLength > i; i++) {
+            Matcher mat = pat.matcher(mapData.substring(i, i + 1));
             boolean result = mat.find();
-            if(result){
+            if (result) {
                 throw new ParserException("Map-Data corrupted - must consist out of numbers 0-9 and space as separator!");
             }
         }
@@ -225,19 +224,18 @@ public class Parser {
         counter = 0;
         int[] positions = new int[totalTilesAmount];
         positions[0] = 0;
-        for(int i = 0; actualMapDataLength > i ; i++){
-            if(mapData.charAt(i) == ' '){
+        for (int i = 0; actualMapDataLength > i; i++) {
+            if (mapData.charAt(i) == ' ') {
                 counter++;
                 positions[counter] = i + 1;
             }
         }
-        for(int i = 0; positions.length > i; i++){
-            if(positions.length - 1 > i) {
+        for (int i = 0; positions.length > i; i++) {
+            if (positions.length - 1 > i) {
                 if (Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) > maxTileNumber | Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) < minTileNumber) {
                     throw new ParserException("Map-Data corrupted - Tile number must be between " + minTileNumber + " and " + maxTileNumber + "!");
                 }
-            }
-            else{
+            } else {
                 if (Integer.parseInt(mapData.substring(positions[i], actualMapDataLength)) > maxTileNumber | Integer.parseInt(mapData.substring(positions[i], actualMapDataLength)) < minTileNumber) {
                     throw new ParserException("Map-Data corrupted - Tile number must be between " + minTileNumber + " and " + maxTileNumber + "!");
                 }
@@ -272,20 +270,19 @@ public class Parser {
         */
 
         //corner Tiles included
-        for(int i = 0; i < mapWidth; i++){
-            if(Integer.parseInt(mapData.substring(positions[i], positions[i+1] - 1)) > indestructibleTileMaxNumber | Integer.parseInt(mapData.substring(positions[i], positions[i+1] - 1)) < indestructibleTileMinNumber){
+        for (int i = 0; i < mapWidth; i++) {
+            if (Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) > indestructibleTileMaxNumber | Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) < indestructibleTileMinNumber) {
                 throw new ParserException("Map-Data corrupted - Top-Line must be border tiles!");
             }
         }
 
         //corner Tiles included
-        for(int i = positions.length - mapWidth; i < positions.length; i++){
-            if(positions.length - 1 > i) {
+        for (int i = positions.length - mapWidth; i < positions.length; i++) {
+            if (positions.length - 1 > i) {
                 if (Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) > indestructibleTileMaxNumber | Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) < indestructibleTileMinNumber) {
                     throw new ParserException("Map-Data corrupted - Bottom-Line must be border tiles!");
                 }
-            }
-            else{
+            } else {
                 if (Integer.parseInt(mapData.substring(positions[i], actualMapDataLength)) > indestructibleTileMaxNumber | Integer.parseInt(mapData.substring(positions[i], actualMapDataLength)) < indestructibleTileMinNumber) {
                     throw new ParserException("Map-Data corrupted - Bottom-Line must be border tiles!");
                 }
@@ -293,66 +290,66 @@ public class Parser {
         }
 
         //corner Tiles excluded
-        for(int i = mapWidth; i < positions.length - mapWidth; i = i + mapWidth){
-            if(i % mapWidth == 0 && Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) > indestructibleTileMaxNumber | Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) < indestructibleTileMinNumber){
+        for (int i = mapWidth; i < positions.length - mapWidth; i = i + mapWidth) {
+            if (i % mapWidth == 0 && Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) > indestructibleTileMaxNumber | Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) < indestructibleTileMinNumber) {
                 throw new ParserException("Map-Data corrupted - Left Edge must be border tiles!");
             }
         }
 
         //corner Tiles excluded
-        for(int i = mapWidth - 1; i < positions.length - mapWidth; i = i + mapWidth){
-            if((i + 1) % mapWidth == 0 && Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) > indestructibleTileMaxNumber | Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) < indestructibleTileMinNumber){
+        for (int i = mapWidth - 1; i < positions.length - mapWidth; i = i + mapWidth) {
+            if ((i + 1) % mapWidth == 0 && Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) > indestructibleTileMaxNumber | Integer.parseInt(mapData.substring(positions[i], positions[i + 1] - 1)) < indestructibleTileMinNumber) {
                 throw new ParserException("Map-Data corrupted - Right Edge must be border tiles!");
             }
         }
 
-        if(Integer.parseInt(mapData.substring(positions[mapWidth + 1], positions[mapWidth + 2] - 1)) < walkableTileMinNumber | Integer.parseInt(mapData.substring(positions[mapWidth + 1], positions[mapWidth + 2] - 1)) > walkableTileMaxNumber){
+        if (Integer.parseInt(mapData.substring(positions[mapWidth + 1], positions[mapWidth + 2] - 1)) < walkableTileMinNumber | Integer.parseInt(mapData.substring(positions[mapWidth + 1], positions[mapWidth + 2] - 1)) > walkableTileMaxNumber) {
             throw new ParserException("Map-Data corrupted - Player spawn top left must use walkable tile!");
         }
 
-        if(Integer.parseInt(mapData.substring(positions[(mapWidth*2) - 2], positions[(mapWidth*2) - 1] - 1)) < walkableTileMinNumber | Integer.parseInt(mapData.substring(positions[(mapWidth*2) - 2], positions[(mapWidth*2) - 1] - 1)) > walkableTileMaxNumber){
+        if (Integer.parseInt(mapData.substring(positions[(mapWidth * 2) - 2], positions[(mapWidth * 2) - 1] - 1)) < walkableTileMinNumber | Integer.parseInt(mapData.substring(positions[(mapWidth * 2) - 2], positions[(mapWidth * 2) - 1] - 1)) > walkableTileMaxNumber) {
             throw new ParserException("Map-Data corrupted - Player spawn top right must use walkable tile!");
         }
 
-        if(Integer.parseInt(mapData.substring(positions[positions.length - (mapWidth*2) + 1], positions[positions.length - (mapWidth*2) + 2] - 1)) < walkableTileMinNumber | Integer.parseInt(mapData.substring(positions[positions.length - (mapWidth*2) + 1], positions[positions.length - (mapWidth*2) + 2] - 1)) > walkableTileMaxNumber) {
+        if (Integer.parseInt(mapData.substring(positions[positions.length - (mapWidth * 2) + 1], positions[positions.length - (mapWidth * 2) + 2] - 1)) < walkableTileMinNumber | Integer.parseInt(mapData.substring(positions[positions.length - (mapWidth * 2) + 1], positions[positions.length - (mapWidth * 2) + 2] - 1)) > walkableTileMaxNumber) {
             throw new ParserException("Map-Data corrupted - Player spawn bottom left must use walkable tile!");
         }
 
-        if(Integer.parseInt(mapData.substring(positions[positions.length - mapWidth - 2], positions[positions.length - mapWidth - 1] - 1)) < walkableTileMinNumber | Integer.parseInt(mapData.substring(positions[positions.length - mapWidth - 2], positions[positions.length - mapWidth - 1] - 1)) > walkableTileMaxNumber){
+        if (Integer.parseInt(mapData.substring(positions[positions.length - mapWidth - 2], positions[positions.length - mapWidth - 1] - 1)) < walkableTileMinNumber | Integer.parseInt(mapData.substring(positions[positions.length - mapWidth - 2], positions[positions.length - mapWidth - 1] - 1)) > walkableTileMaxNumber) {
             throw new ParserException("Map-Data corrupted - Player spawn bottom right must use walkable tile!");
         }
     }
 
-    public static void playerStatsValid(PlayerStatistics stats) throws ParserException{
+    public static void playerStatsValid(PlayerStatistics stats) throws ParserException {
 
-        if(stats.getGamesWon() < 0){
+        if (stats.getGamesWon() < 0) {
             throw new ParserException("Player statistics data corrupted - Minimum value for won games is 0!");
         }
 
-        if(stats.getGamesLost() < 0){
+        if (stats.getGamesLost() < 0) {
             throw new ParserException("Player statistics data corrupted - Minimum value for lost games is 0!");
         }
 
-        if(stats.getKills() < 0){
+        if (stats.getKills() < 0) {
             throw new ParserException("Player statistics data corrupted - Minimum value for kills is 0!");
         }
 
-        if(stats.getDeaths() < 0){
+        if (stats.getDeaths() < 0) {
             throw new ParserException("Player statistics data corrupted - Minimum value for deaths is 0!");
         }
 
-        if(stats.getBlocksDestroyed() < 0){
+        if (stats.getBlocksDestroyed() < 0) {
             throw new ParserException("Player statistics data corrupted - Minimum value for destroyed blocks is 0!");
         }
 
-        if(stats.getGameTime() < 0){
+        if (stats.getGameTime() < 0) {
             throw new ParserException("Player statistics data corrupted - Minimum value for ingame time is 0 seconds!");
         }
     }
 
-    public static void volumeValid(int volume) throws ParserException{
+    public static void volumeValid(int volume) throws ParserException {
 
-        if(volume > 100 | volume < 0){
+        if (volume > 100 | volume < 0) {
             throw new ParserException("Volume must be between 0 and 100!");
         }
 
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/CollisionHandler.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/CollisionHandler.java
index 675946aeef36f7e8453278393e233e854c76b04c..a89e0ded4bcd7abf0c4edf354f0e8b50af067dff 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/CollisionHandler.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/CollisionHandler.java
@@ -9,7 +9,6 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 
 public class CollisionHandler {
-
     private static final Logger log = LogManager.getLogger(CollisionHandler.class);
 
     public CollisionHandler() {
@@ -65,5 +64,4 @@ public class CollisionHandler {
                 return true;
         }
     }
-
 }
\ No newline at end of file
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EntityFactory.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EntityFactory.java
index e15dec5063e815dd25224490547277fc1838eb45..c16e0d357cc67e33a2f8c9610f909a743ee76162 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EntityFactory.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EntityFactory.java
@@ -11,7 +11,6 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 
 public class EntityFactory {
-
     private static final Logger log = LogManager.getLogger(EntityFactory.class);
 
     public static IEntity createEntity(EntityType entityType, GraphicsContext gameScene, InputHandler inputHandler,
@@ -23,8 +22,7 @@ public class EntityFactory {
             log.debug("Entity " + entityType + " created");
             return new NetworkPlayerTwo();
         }
-
-        throw new IllegalArgumentException ("Entity type not supported " + entityType);
+        throw new IllegalArgumentException("Entity type not supported " + entityType);
     }
 
     public static IEntity createGameplayObject(ObjectType objectType, int cordX, int cordY, GraphicsContext graphicsContext) {
@@ -45,7 +43,8 @@ public class EntityFactory {
         }
         throw new IllegalArgumentException();
     }
-    public static IEntity createBombs(ObjectType objectType, int cordX, int cordY, GraphicsContext graphicsContext,int blastradius) {
+
+    public static IEntity createBombs(ObjectType objectType, int cordX, int cordY, GraphicsContext graphicsContext, int blastradius) {
         if (objectType == ObjectType.BOMB) {
             return new Bomb(cordX, cordY, graphicsContext, blastradius);
         } else if (objectType == ObjectType.BIG_BOMB) {
@@ -53,7 +52,8 @@ public class EntityFactory {
         }
         throw new IllegalArgumentException();
     }
-    public static IEntity createMarker(ObjectType objectType, int cordX, int cordY, GraphicsContext graphicsContext,int player) {
+
+    public static IEntity createMarker(ObjectType objectType, int cordX, int cordY, GraphicsContext graphicsContext, int player) {
         if (objectType == ObjectType.MARKER) {
             return new Marker(cordX, cordY, graphicsContext, player);
         }
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EntityType.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EntityType.java
index 108c4c2037dbcb53d090dc19a59b9b79450d6b68..2095e4fd46941101e1db718aa9187df35114948b 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EntityType.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/EntityType.java
@@ -3,5 +3,5 @@ package de.hdm_stuttgart.battlearena.Model.Entity;
 public enum EntityType {
     PLAYER,
     NETWORK_PLAYER_TWO,
-    LOKAL_PLAYER_TWO
+    LOCAL_PLAYER_TWO
 }
\ No newline at end of file
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BigBomb.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BigBomb.java
index 3b1ba423cb2771dd0a4d0f076757980ecbb32388..72a8aef6ccddc8a433a9f26b144fc4a757cd0e71 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BigBomb.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BigBomb.java
@@ -20,7 +20,6 @@ import java.util.List;
 import java.util.Objects;
 
 public class BigBomb implements IEntity {
-
     private static final Logger log = LogManager.getLogger(BigBomb.class);
     RuntimeInfo runtimeInfo = RuntimeInfo.getInstance();
     private final int posX;
@@ -33,7 +32,7 @@ public class BigBomb implements IEntity {
     private final ObjectType OBJECT_TYPE = ObjectType.BOMB;
     private ObjectStatus OBJECT_STATUS = ObjectStatus.UNUSED;
     private final int scaledTileSize = 48;
-    private int blastradius = 18;
+    private int blastRadius = 18;
 
     public BigBomb(int posX, int posY, GraphicsContext graphicsContext, int blastradius) {
         this.posX = posX;
@@ -107,11 +106,9 @@ public class BigBomb implements IEntity {
             } else if (frameIndex == 5) {
                 frameIndex = 6;
 
-                checkExplosionSpawn(graphicsContext, blastradius);
+                checkExplosionSpawn(graphicsContext, blastRadius);
 
                 //soundEffects.playSoundEffectOnce(SFX.BOMB);
-
-
                 OBJECT_STATUS = ObjectStatus.USED;
             }
             frameCounter = 0;
@@ -129,48 +126,50 @@ public class BigBomb implements IEntity {
         int yDown = yTile;
         int xLeft = xTile;
 
-        spawnExplosion(yTile, xTile,graphicsContext);
+        spawnExplosion(yTile, xTile, graphicsContext);
 
         isDestructible = checkTilePlacing(yTile, xTile);
         if (isDestructible != 0) {
-            spawnExplosion(yTile,xTile,graphicsContext);
+            spawnExplosion(yTile, xTile, graphicsContext);
             for (int i = 0; i < blastradius; i++) {
                 yDown += 1;
                 yUp -= 1;
                 xRight += 1;
                 xLeft -= 1;
-                if(yDown < 18 && yDown >= 0 && xTile < 18 && xTile >= 0) {
+                if (yDown < 18 && yDown >= 0 && xTile < 18 && xTile >= 0) {
                     isDestructible = checkTilePlacing(yDown, xTile);
                     if (isDestructible != 0 && !stopDown) {
                         spawnExplosion(yDown, xTile, graphicsContext);
-                        if(isDestructible == 2){
+                        if (isDestructible == 2) {
                             stopDown = true;
                         }
                     } else {
                         stopDown = true;
                     }
                 }
-                if(yUp < 18 && yUp >= 0 && xTile < 18 && xTile >= 0) {
+                if (yUp < 18 && yUp >= 0 && xTile < 18 && xTile >= 0) {
                     isDestructible = checkTilePlacing(yUp, xTile);
                     if (isDestructible != 0 && !stopUp) {
                         spawnExplosion(yUp, xTile, graphicsContext);
-                        if(isDestructible == 2){
+                        if (isDestructible == 2) {
                             stopUp = true;
                         }
                     } else {
                         stopUp = true;
                     }
-                }if(yTile < 18 && yTile >= 0 && xRight < 18 && xRight >= 0) {
+                }
+                if (yTile < 18 && yTile >= 0 && xRight < 18 && xRight >= 0) {
                     isDestructible = checkTilePlacing(yTile, xRight);
                     if (isDestructible != 0 && !stopRight) {
                         spawnExplosion(yTile, xRight, graphicsContext);
-                        if(isDestructible == 2){
+                        if (isDestructible == 2) {
                             stopRight = true;
                         }
                     } else {
                         stopRight = true;
                     }
-                }if(yTile < 18 && yTile >= 0 && xLeft < 18 && xLeft >= 0) {
+                }
+                if (yTile < 18 && yTile >= 0 && xLeft < 18 && xLeft >= 0) {
                     isDestructible = checkTilePlacing(yTile, xLeft);
                     if (isDestructible != 0 && !stopLeft) {
                         spawnExplosion(yTile, xLeft, graphicsContext);
@@ -186,16 +185,16 @@ public class BigBomb implements IEntity {
     }
 
     public int checkTilePlacing(int y, int x) {     //Change it with a DestructionHandler like CollisionHandler //tileSet[xTile].getDestruction();
-        if(TileManager.tileMap[y][x] >= 20){
+        if (TileManager.tileMap[y][x] >= 20) {
             return 2;       //Last spawn, in this direction
-        }else if(TileManager.tileMap[y][x] <= 9){
+        } else if (TileManager.tileMap[y][x] <= 9) {
             return 1;       //Keep Going
-        }else{
+        } else {
             return 0;       //dont continue
         }
     }
 
-    public void spawnExplosion(int spawnCordY, int spawnCordX, GraphicsContext graphicsContext){
+    public void spawnExplosion(int spawnCordY, int spawnCordX, GraphicsContext graphicsContext) {
         List<IEntity> explosionspawns = runtimeInfo.getGameplayObjects();
         IEntity explosion = EntityFactory.createGameplayObject(ObjectType.EXPLOSION, spawnCordX * scaledTileSize, spawnCordY * scaledTileSize, graphicsContext);
         explosionspawns.add(explosion);
@@ -204,8 +203,8 @@ public class BigBomb implements IEntity {
         changeCheckedTileDestructable(graphicsContext);
     }
 
-    public void changeCheckedTileDestructable(GraphicsContext graphicsContext){
-        int x,y;
+    public void changeCheckedTileDestructable(GraphicsContext graphicsContext) {
+        int x, y;
         List<IEntity> gameplayObjects = runtimeInfo.getGameplayObjects();
         List<IEntity> explosionList = gameplayObjects.stream().filter(obj -> obj.getOBJECT_TYPE() == ObjectType.EXPLOSION)
                 .toList();
@@ -221,13 +220,13 @@ public class BigBomb implements IEntity {
         }
     }
 
-    public void spawnItems(int x, int y,GraphicsContext graphicsContext){
-        final double dropChanceBigBombItemFrame = 0.1;
+    public void spawnItems(int x, int y, GraphicsContext graphicsContext) {
+        final double dropChanceBigBombItemFrame = 0.11;
         final double dropChanceHeart = 0.15;
-        final double dropChanceBlastUpItemFrame = 0.15;
-        final double dropChanceBlastDownItemFrame = 0.15;
-        final double dropChanceBombClock = 0.1;
-        final double dropChanceTeleportItemFrame = 0.15;
+        final double dropChanceBlastUpItemFrame = 0.13;
+        final double dropChanceBlastDownItemFrame = 0.13;
+        final double dropChanceBombClock = 0.08;
+        final double dropChanceTeleportItemFrame = 0.13;
         double randomDropChance = Math.random() * 1;
 
         SfxOnce t = new SfxOnce();
@@ -239,36 +238,31 @@ public class BigBomb implements IEntity {
             gameplayObjects.add(heart);
             runtimeInfo.setGameplayObjects(gameplayObjects);
             log.info("BigBombItemFrame dropped");
-        }
-        else if (randomDropChance < dropChanceHeart + dropChanceBigBombItemFrame) {
+        } else if (randomDropChance < dropChanceHeart + dropChanceBigBombItemFrame) {
             List<IEntity> gameplayObjects = runtimeInfo.getGameplayObjects();
             IEntity bigBombItemFrame = EntityFactory.createGameplayObject(ObjectType.HEART, x, y, graphicsContext);
             gameplayObjects.add(bigBombItemFrame);
             runtimeInfo.setGameplayObjects(gameplayObjects);
             log.debug("heart dropped");
-        }
-        else if (randomDropChance < dropChanceHeart + dropChanceBigBombItemFrame + dropChanceBlastUpItemFrame) {
+        } else if (randomDropChance < dropChanceHeart + dropChanceBigBombItemFrame + dropChanceBlastUpItemFrame) {
             List<IEntity> gameplayObjects = runtimeInfo.getGameplayObjects();
             IEntity blastUpItemFrame = EntityFactory.createGameplayObject(ObjectType.BLASTUP_ITEMFRAME, x, y, graphicsContext);
             gameplayObjects.add(blastUpItemFrame);
             runtimeInfo.setGameplayObjects(gameplayObjects);
             log.info("BlastUpItemFrame dropped");
-        }
-        else if (randomDropChance < dropChanceHeart + dropChanceBigBombItemFrame + dropChanceBlastUpItemFrame + dropChanceBlastDownItemFrame) {
+        } else if (randomDropChance < dropChanceHeart + dropChanceBigBombItemFrame + dropChanceBlastUpItemFrame + dropChanceBlastDownItemFrame) {
             List<IEntity> gameplayObjects = runtimeInfo.getGameplayObjects();
             IEntity blastDownItemFrame = EntityFactory.createGameplayObject(ObjectType.BLASTDOWN_ITEMFRAME, x, y, graphicsContext);
             gameplayObjects.add(blastDownItemFrame);
             runtimeInfo.setGameplayObjects(gameplayObjects);
             log.info("BlastUpItemFrame dropped");
-        }
-        else if (randomDropChance < dropChanceHeart + dropChanceBigBombItemFrame + dropChanceBlastUpItemFrame + dropChanceBlastDownItemFrame + dropChanceBombClock) {
+        } else if (randomDropChance < dropChanceHeart + dropChanceBigBombItemFrame + dropChanceBlastUpItemFrame + dropChanceBlastDownItemFrame + dropChanceBombClock) {
             List<IEntity> gameplayObjects = runtimeInfo.getGameplayObjects();
             IEntity bombClockItemFrame = EntityFactory.createGameplayObject(ObjectType.BOMBCLOCK_ITEMFRAME, x, y, graphicsContext);
             gameplayObjects.add(bombClockItemFrame);
             runtimeInfo.setGameplayObjects(gameplayObjects);
             log.info("BombClockItemFrame dropped");
-        }
-        else if (randomDropChance < dropChanceHeart + dropChanceBigBombItemFrame + dropChanceBlastUpItemFrame + dropChanceBombClock + dropChanceTeleportItemFrame) {
+        } else if (randomDropChance < dropChanceHeart + dropChanceBigBombItemFrame + dropChanceBlastUpItemFrame + dropChanceBombClock + dropChanceTeleportItemFrame) {
             List<IEntity> gameplayObjects = runtimeInfo.getGameplayObjects();
             IEntity teleportItemFrame = EntityFactory.createGameplayObject(ObjectType.TELEPORT_ITEMFRAME, x, y, graphicsContext);
             gameplayObjects.add(teleportItemFrame);
@@ -328,7 +322,7 @@ public class BigBomb implements IEntity {
     }
 
     @Override
-    public int getplayer() {
+    public int getPlayer() {
         return 0;
     }
 
@@ -341,5 +335,4 @@ public class BigBomb implements IEntity {
     public int getMaxEntityHealth() {
         return 0;
     }
-
 }
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BigBombItemFrame.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BigBombItemFrame.java
index 442b1d287d94128f63fd6789af450137f51b6c7c..2c9c53758d65ce4a63da09b8a41ff2ef0283fb66 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BigBombItemFrame.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BigBombItemFrame.java
@@ -149,7 +149,7 @@ public class BigBombItemFrame implements IEntity {
     }
 
     @Override
-    public int getplayer() {
+    public int getPlayer() {
         return 0;
     }
 
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BlastDownItemFrame.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BlastDownItemFrame.java
index 0bca8c9f47862d873f9594f135e5d0825a793725..6ee6a5cfec3880090d275f1a4590faa01cddeb0c 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BlastDownItemFrame.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BlastDownItemFrame.java
@@ -18,7 +18,6 @@ public class BlastDownItemFrame implements IEntity {
     private static final Logger log = LogManager.getLogger(BlastDownItemFrame.class);
     private final int posX;
     private final int posY;
-
     private int frameIndex = 0;
     private int frameCounter = 0;
     private Image[] frames = new Image[4];
@@ -147,7 +146,7 @@ public class BlastDownItemFrame implements IEntity {
     }
 
     @Override
-    public int getplayer() {
+    public int getPlayer() {
         return 0;
     }
 
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BlastUpItemFrame.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BlastUpItemFrame.java
index 7b242d0a590a7a1da232db5890fa9ea762b2a2b3..b04eb3faabea4ff9d7dc4fd2add7402882a85842 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BlastUpItemFrame.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BlastUpItemFrame.java
@@ -18,7 +18,6 @@ public class BlastUpItemFrame implements IEntity {
     private static final Logger log = LogManager.getLogger(BlastUpItemFrame.class);
     private final int posX;
     private final int posY;
-
     private int frameIndex = 0;
     private int frameCounter = 0;
     private Image[] frames = new Image[4];
@@ -52,33 +51,29 @@ public class BlastUpItemFrame implements IEntity {
 
     @Override
     public void updateEntity(GameSceneController gameScene, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void checkGameplayObjectInteraction(IEntity entity, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void placeBombAction(IEntity entity, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void attack(IEntity entity, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void updateEntityWalkAnimation() {
-
     }
 
     public void renderEntity(GraphicsContext graphicsContext) {
         graphicsContext.drawImage(frames[frameIndex], posX, posY, 48, 48);
         updateAnimation();
     }
+
     private void updateAnimation() {
         frameCounter++;
 
@@ -98,7 +93,6 @@ public class BlastUpItemFrame implements IEntity {
 
     @Override
     public void healPlayer(int heal) {
-
     }
 
     @Override
@@ -118,7 +112,6 @@ public class BlastUpItemFrame implements IEntity {
 
     @Override
     public void gotHit(int damageDone) {
-
     }
 
     @Override
@@ -147,8 +140,7 @@ public class BlastUpItemFrame implements IEntity {
     }
 
     @Override
-
-    public int getplayer() {
+    public int getPlayer() {
         return 0;
     }
 
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Bomb.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Bomb.java
index 2bc09d2104c33cef19efee6fe4bdd051a742b1f6..f46b8c5926227c9bdda7b52da365cbc0e57cdfb5 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Bomb.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Bomb.java
@@ -29,18 +29,14 @@ public class Bomb implements IEntity {
     private BoundingBox boxCollider;
     private final ObjectType OBJECT_TYPE = ObjectType.BOMB;
     private ObjectStatus OBJECT_STATUS = ObjectStatus.UNUSED;
-
     private final int scaledTileSize = 48;
-    private int blastradius;
-
-    //private SoundEffects soundEffects;
+    private final int blastRadius;
 
-
-    public Bomb(int posX, int posY, GraphicsContext graphicsContext, int blastradius) {
+    public Bomb(int posX, int posY, GraphicsContext graphicsContext, int blastRadius) {
         this.posX = posX;
         this.posY = posY;
         this.graphicsContext = graphicsContext;
-        this.blastradius = blastradius;
+        this.blastRadius = blastRadius;
         initializeEntity();
     }
 
@@ -62,38 +58,30 @@ public class Bomb implements IEntity {
 
     @Override
     public void updateEntity(GameSceneController gameScene, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void checkGameplayObjectInteraction(IEntity entity, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void placeBombAction(IEntity entity, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void attack(IEntity entity, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void updateEntityWalkAnimation() {
-
     }
 
     public void renderEntity(GraphicsContext graphicsContext) {
-
         graphicsContext.drawImage(frames[frameIndex], posX, posY, 48, 48);
         updateAnimation();
     }
 
     private void updateAnimation() {        //Easily add more frames
-
-
         frameCounter++;
 
         if (frameCounter > 18) {
@@ -112,10 +100,7 @@ public class Bomb implements IEntity {
             } else if (frameIndex == 5) {
                 frameIndex = 6;
 
-                checkExplosionSpawn(graphicsContext, blastradius);
-
-                //soundEffects.playSoundEffectOnce(SFX.BOMB);
-
+                checkExplosionSpawn(graphicsContext, blastRadius);
 
                 OBJECT_STATUS = ObjectStatus.USED;
             }
@@ -124,7 +109,6 @@ public class Bomb implements IEntity {
     }
 
     public void checkExplosionSpawn(GraphicsContext graphicsContext, int blastradius) {
-
         int isDestructible;
         boolean stopDown = false, stopUp = false, stopRight = false, stopLeft = false;
 
@@ -192,7 +176,7 @@ public class Bomb implements IEntity {
         }
     }
 
-    public void spawnExplosion(int spawnCordY, int spawnCordX, GraphicsContext graphicsContext){
+    public void spawnExplosion(int spawnCordY, int spawnCordX, GraphicsContext graphicsContext) {
         List<IEntity> explosionspawns = runtimeInfo.getGameplayObjects();
         IEntity explosion = EntityFactory.createGameplayObject(ObjectType.EXPLOSION, spawnCordX * scaledTileSize, spawnCordY * scaledTileSize, graphicsContext);
         explosionspawns.add(explosion);
@@ -330,7 +314,7 @@ public class Bomb implements IEntity {
     }
 
     @Override
-    public int getplayer() {
+    public int getPlayer() {
         return 0;
     }
 
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BombClockItemFrame.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BombClockItemFrame.java
index d1fbbb357926b7fb947ac987918e10c13e881953..d363c05afbe2d0979800d75bfd6f0c82f33e1d80 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BombClockItemFrame.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/BombClockItemFrame.java
@@ -20,7 +20,7 @@ public class BombClockItemFrame implements IEntity {
 
     private int frameIndex = 0;
     private int frameCounter = 0;
-    private Image[] frames = new Image[4];
+    private final Image[] frames = new Image[4];
     private final GraphicsContext graphicsContext;
     private BoundingBox boxCollider;
     private final ObjectType OBJECT_TYPE = ObjectType.BOMBCLOCK_ITEMFRAME;
@@ -51,33 +51,29 @@ public class BombClockItemFrame implements IEntity {
 
     @Override
     public void updateEntity(GameSceneController gameScene, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void checkGameplayObjectInteraction(IEntity entity, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void placeBombAction(IEntity entity, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void attack(IEntity entity, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void updateEntityWalkAnimation() {
-
     }
 
     public void renderEntity(GraphicsContext graphicsContext) {
         graphicsContext.drawImage(frames[frameIndex], posX, posY, 48, 48);
         updateAnimation();
     }
+
     private void updateAnimation() {
         frameCounter++;
 
@@ -97,7 +93,6 @@ public class BombClockItemFrame implements IEntity {
 
     @Override
     public void healPlayer(int heal) {
-
     }
 
     @Override
@@ -117,7 +112,6 @@ public class BombClockItemFrame implements IEntity {
 
     @Override
     public void gotHit(int damageDone) {
-
     }
 
     @Override
@@ -146,7 +140,7 @@ public class BombClockItemFrame implements IEntity {
     }
 
     @Override
-    public int getplayer() {
+    public int getPlayer() {
         return 0;
     }
 
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Explosion.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Explosion.java
index c0edb59df1d96100d297b5fe89343ad57e073d56..2cff5d06a24336159863a24261f69ed19200fff3 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Explosion.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Explosion.java
@@ -6,22 +6,20 @@ import de.hdm_stuttgart.battlearena.Model.Entity.IEntity;
 import javafx.geometry.BoundingBox;
 import javafx.scene.canvas.GraphicsContext;
 import javafx.scene.image.Image;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
 
 import java.util.Objects;
 
 public class Explosion implements IEntity {
-    private static final Logger log = LogManager.getLogger(Explosion.class);
     private final int posX;
     private final int posY;
     private int frameIndex = 0;
     private int frameCounter = 0;
-    private Image[] frames = new Image[6];
+    private final Image[] frames = new Image[6];
     private final GraphicsContext graphicsContext;
     private BoundingBox boxCollider;
     private final ObjectType OBJECT_TYPE = ObjectType.EXPLOSION;
     private ObjectStatus OBJECT_STATUS = ObjectStatus.UNUSED;
+
     public Explosion(int posX, int posY, GraphicsContext graphicsContext) {
         this.posX = posX;
         this.posY = posY;
@@ -29,11 +27,13 @@ public class Explosion implements IEntity {
 
         initializeEntity();
     }
+
     @Override
     public void initializeEntity() {
         loadEntitySprites();
-        boxCollider = new BoundingBox(posX+12, posY+12, 24, 24);
+        boxCollider = new BoundingBox(posX + 12, posY + 12, 24, 24);
     }
+
     @Override
     public void loadEntitySprites() {
         frames[0] = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/objects/vfx/bigexplosion.png")));
@@ -43,27 +43,22 @@ public class Explosion implements IEntity {
 
     @Override
     public void updateEntity(GameSceneController gameScene, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void checkGameplayObjectInteraction(IEntity entity, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void placeBombAction(IEntity entity, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void attack(IEntity entity, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void updateEntityWalkAnimation() {
-
     }
 
     @Override
@@ -71,6 +66,7 @@ public class Explosion implements IEntity {
         graphicsContext.drawImage(frames[frameIndex], posX, posY, 48, 48);
         updateAnimation();
     }
+
     private void updateAnimation() {        //Easily add more frames
         frameCounter++;
 
@@ -78,8 +74,7 @@ public class Explosion implements IEntity {
             if (frameIndex == 0) {
                 frameIndex = 1;
             } else if (frameIndex == 1) {
-                frameIndex = 2;
-            } else if (frameIndex == 2) {
+
                 OBJECT_STATUS = ObjectStatus.USED;
             }
             frameCounter = 0;
@@ -88,7 +83,6 @@ public class Explosion implements IEntity {
 
     @Override
     public void healPlayer(int heal) {
-
     }
 
     @Override
@@ -136,7 +130,9 @@ public class Explosion implements IEntity {
     }
 
     @Override
-    public int getplayer() { return 0;}
+    public int getPlayer() {
+        return 0;
+    }
 
     @Override
     public int getHealth() {
@@ -145,8 +141,6 @@ public class Explosion implements IEntity {
 
     @Override
     public int getMaxEntityHealth() {
-
         return 0;
     }
-
 }
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Heart.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Heart.java
index 0245be324c69a0f99fb53b5b3b51aba876ae421f..d308806d75da919877ac425eea7be4ee86435536 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Heart.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Heart.java
@@ -8,15 +8,10 @@ import javafx.geometry.BoundingBox;
 import javafx.scene.canvas.GraphicsContext;
 import javafx.scene.image.Image;
 
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.LogManager;
 
 import java.util.Objects;
 
 public class Heart implements IEntity {
-
-    private static final Logger log = LogManager.getLogger(Heart.class);
-
     private final int posX;
     private final int posY;
     private Image sprite;
@@ -46,27 +41,22 @@ public class Heart implements IEntity {
 
     @Override
     public void updateEntity(GameSceneController gameScene, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void checkGameplayObjectInteraction(IEntity entity, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void placeBombAction(IEntity entity, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void attack(IEntity entity, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void updateEntityWalkAnimation() {
-
     }
 
     @Override
@@ -76,7 +66,6 @@ public class Heart implements IEntity {
 
     @Override
     public void healPlayer(int heal) {
-
     }
 
     @Override
@@ -96,7 +85,6 @@ public class Heart implements IEntity {
 
     @Override
     public void gotHit(int damageDone) {
-
     }
 
     @Override
@@ -125,7 +113,7 @@ public class Heart implements IEntity {
     }
 
     @Override
-    public int getplayer() {
+    public int getPlayer() {
         return 0;
     }
 
@@ -138,5 +126,4 @@ public class Heart implements IEntity {
     public int getMaxEntityHealth() {
         return 0;
     }
-
 }
\ No newline at end of file
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Marker.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Marker.java
index 428abb7a82ab72ff63718c8ee8e64865ca6db296..e4ae26b62ecb83635dccd6ea2ee87ee1110eb925 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Marker.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/Marker.java
@@ -1,30 +1,20 @@
 package de.hdm_stuttgart.battlearena.Model.Entity.GameplayObjects;
 
 import de.hdm_stuttgart.battlearena.Controller.GameSceneController;
-import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo;
 import de.hdm_stuttgart.battlearena.Model.Entity.EntityDirection;
-import de.hdm_stuttgart.battlearena.Model.Entity.EntityFactory;
 import de.hdm_stuttgart.battlearena.Model.Entity.IEntity;
 
-import de.hdm_stuttgart.battlearena.Model.Map.TileManager;
 import javafx.geometry.BoundingBox;
 import javafx.scene.canvas.GraphicsContext;
 import javafx.scene.image.Image;
-
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.LogManager;
-
-import java.util.List;
 import java.util.Objects;
 
 public class Marker implements IEntity {
-    private static final Logger log = LogManager.getLogger(Marker.class);
-    RuntimeInfo runtimeInfo = RuntimeInfo.getInstance();
     private final int posX;
     private final int posY;
     private final int player;
-    private int frameIndex = 0;
-    private int frameCounter = 0;
+    private final int frameIndex = 0;
+    private final int frameCounter = 0;
     private Image sprite;
     private final GraphicsContext graphicsContext;
     private BoundingBox boxCollider;
@@ -56,27 +46,22 @@ public class Marker implements IEntity {
 
     @Override
     public void updateEntity(GameSceneController gameScene, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void checkGameplayObjectInteraction(IEntity entity, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void placeBombAction(IEntity entity, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void attack(IEntity entity, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void updateEntityWalkAnimation() {
-
     }
 
     public void renderEntity(GraphicsContext graphicsContext) {
@@ -85,7 +70,6 @@ public class Marker implements IEntity {
 
     @Override
     public void healPlayer(int heal) {
-
     }
 
     @Override
@@ -133,7 +117,7 @@ public class Marker implements IEntity {
         OBJECT_STATUS = objectStatus;
     }
     @Override
-    public int getplayer(){
+    public int getPlayer(){
         return player;
     }
 
@@ -146,6 +130,5 @@ public class Marker implements IEntity {
     public int getMaxEntityHealth() {
         return 0;
     }
-
 }
 
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/TeleportationItemFrame.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/TeleportationItemFrame.java
index 447266fa9b65a3e9c6e517f765e75ea949673861..b56406798920927182f9af8b6d61a9266076ec98 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/TeleportationItemFrame.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/GameplayObjects/TeleportationItemFrame.java
@@ -6,19 +6,15 @@ import de.hdm_stuttgart.battlearena.Model.Entity.IEntity;
 import javafx.geometry.BoundingBox;
 import javafx.scene.canvas.GraphicsContext;
 import javafx.scene.image.Image;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
 
 import java.util.Objects;
 
-
 public class TeleportationItemFrame implements IEntity {
-    private static final Logger log = LogManager.getLogger(TeleportationItemFrame.class);
     private final int posX;
     private final int posY;
     private int frameIndex = 0;
     private int frameCounter = 0;
-    private Image[] frames = new Image[4];
+    private final Image[] frames = new Image[4];
     private final GraphicsContext graphicsContext;
     private BoundingBox boxCollider;
     private final ObjectType OBJECT_TYPE = ObjectType.TELEPORT_ITEMFRAME;
@@ -49,33 +45,29 @@ public class TeleportationItemFrame implements IEntity {
 
     @Override
     public void updateEntity(GameSceneController gameScene, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void checkGameplayObjectInteraction(IEntity entity, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void placeBombAction(IEntity entity, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void attack(IEntity entity, GraphicsContext graphicsContext) {
-
     }
 
     @Override
     public void updateEntityWalkAnimation() {
-
     }
 
     public void renderEntity(GraphicsContext graphicsContext) {
         graphicsContext.drawImage(frames[frameIndex], posX, posY, 48, 48);
         updateAnimation();
     }
+
     private void updateAnimation() {
         frameCounter++;
 
@@ -95,7 +87,6 @@ public class TeleportationItemFrame implements IEntity {
 
     @Override
     public void healPlayer(int heal) {
-
     }
 
     @Override
@@ -115,7 +106,6 @@ public class TeleportationItemFrame implements IEntity {
 
     @Override
     public void gotHit(int damageDone) {
-
     }
 
     @Override
@@ -144,7 +134,7 @@ public class TeleportationItemFrame implements IEntity {
     }
 
     @Override
-    public int getplayer() {
+    public int getPlayer() {
         return 0;
     }
 
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/IEntity.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/IEntity.java
index 336332169b1e9c5e90438cc9672426bf53a84838..8e49f1cd21bbe8c56bc6270e6404bad32a8c65d8 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/IEntity.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/IEntity.java
@@ -7,7 +7,6 @@ import javafx.geometry.BoundingBox;
 import javafx.scene.canvas.GraphicsContext;
 
 public interface IEntity {
-
     void initializeEntity();
 
     void loadEntitySprites();
@@ -45,7 +44,7 @@ public interface IEntity {
 
     void setObjectStatus(ObjectStatus objectStatus);
 
-    int getplayer();
+    int getPlayer();
 
     int getHealth();
     int getMaxEntityHealth();
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/NetworkPlayerTwo.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/NetworkPlayerTwo.java
index cdd2277a1710c10a8ec54d9539123fda0e22161c..ce3b51d1e7067dc470f1928e234c12cf24ccbf44 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/NetworkPlayerTwo.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/NetworkPlayerTwo.java
@@ -2,72 +2,277 @@ package de.hdm_stuttgart.battlearena.Model.Entity;
 
 import de.hdm_stuttgart.battlearena.Controller.GameSceneController;
 
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo;
 import de.hdm_stuttgart.battlearena.Model.Entity.GameplayObjects.ObjectStatus;
 import de.hdm_stuttgart.battlearena.Model.Entity.GameplayObjects.ObjectType;
+import de.hdm_stuttgart.battlearena.Model.Multiplayer.ConnectionHandler;
+import de.hdm_stuttgart.battlearena.Model.Sound.SFX;
 import javafx.geometry.BoundingBox;
 import javafx.scene.canvas.GraphicsContext;
+import javafx.scene.image.Image;
 import javafx.scene.paint.Color;
 
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 
-class NetworkPlayerTwo implements IEntity{
+import java.util.Objects;
+
+class NetworkPlayerTwo implements IEntity {
 
     private static final Logger log = LogManager.getLogger(NetworkPlayerTwo.class);
+    RuntimeInfo runtimeInfo = RuntimeInfo.getInstance();
+
+    ConnectionHandler connectionHandler = runtimeInfo.getConnectionHandler();
 
-    private final BoundingBox boxCollider = new BoundingBox(300, 200, 48, 48);
+    private BoundingBox boxCollider;
 
     private EntityDirection entityDirection = EntityDirection.DOWN;
 
-    private int entitySpeed = 3;
+    private final EntityClass entityClass = connectionHandler.getEnemyClass();
+
+    private Image directionDownOne,
+            directionDownTwo,
+            directionUpOne,
+            directionUpTwo,
+            directionLeftOne,
+            directionLeftTwo,
+            directionRightOne,
+            directionRightTwo;
+
+    private Image swordDown,
+            swordUp,
+            swordLeft,
+            swordRight;
 
+    private int spriteCounter = 0;
+    private int spriteNumber = 1;
     private int health = 10;
+    private int maxPlayerHealth;
+    private int damage;
+
+    private int playerHeight = 20;
+    private int playerWidth = 19;
+
+    private int playerX;
+    private int playerY;
 
     @Override
     public void initializeEntity() {
+        playerX = connectionHandler.getEnemyX();
+        playerY = connectionHandler.getEnemyY();
+
+        runtimeInfo.setEnemyPlayerClass(entityClass);
+        loadEntitySprites();
+        initializePlayerStats();
 
+        boxCollider = new BoundingBox(playerX, playerY, 48, 48);
     }
 
     @Override
     public void loadEntitySprites() {
+        try {
+            if (entityClass == EntityClass.HUMAN) {
+                loadHumanSprites();
+                loadWeaponSprites();
+            } else if (entityClass == EntityClass.HIGH_BORN) {
+                loadHighBornSprites();
+                loadWeaponSprites();
+            } else if (entityClass == EntityClass.LOW_BORN) {
+                loadLowBornSprites();
+                loadWeaponSprites();
+            } else {
+                loadSentinelsSprites();
+                loadWeaponSprites();
+            }
+        } catch (Exception e) {
+            log.error(e);
+        }
+    }
 
+    private void initializePlayerStats() {
+        if (entityClass == EntityClass.HUMAN) {
+            maxPlayerHealth = 50;
+            health = 50;
+            damage = 5;
+        } else if (entityClass == EntityClass.HIGH_BORN) {
+            maxPlayerHealth = 100;
+            health = 75;
+            damage = 2;
+        } else if (entityClass == EntityClass.LOW_BORN) {
+            maxPlayerHealth = 10;
+            health = 10;
+            damage = 10;
+        } else {
+            maxPlayerHealth = 40;
+            health = 15;
+            damage = 7;
+        }
     }
 
-    @Override
-    public void updateEntity(GameSceneController gameScene, GraphicsContext graphicsContext) {
+    private void loadHumanSprites() {
+        directionDownOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/human/HumanDown00.png")));
+        directionDownTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/human/HumanDown01.png")));
+        directionUpOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/human/HumanUp00.png")));
+        directionUpTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/human/HumanUp01.png")));
+        directionLeftOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/human/HumanLeft00.png")));
+        directionLeftTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/human/HumanLeft01.png")));
+        directionRightOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/human/HumanRight00.png")));
+        directionRightTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/human/HumanRight01.png")));
+    }
 
+    private void loadHighBornSprites() {
+        directionDownOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/high_born/HighBornDown00.png")));
+        directionDownTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/high_born/HighBornDown01.png")));
+        directionUpOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/upOne.png")));
+        directionUpTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/upTwo.png")));
+        directionLeftOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/leftOne.png")));
+        directionLeftTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/leftTwo.png")));
+        directionRightOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/rightOne.png")));
+        directionRightTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/rightTwo.png")));
     }
 
-    @Override
-    public void checkGameplayObjectInteraction(IEntity entity, GraphicsContext graphicsContext) {
+    private void loadLowBornSprites() {
+        directionDownOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/HumanDown01.png")));
+        directionDownTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/HumanDown02.png")));
+        directionUpOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/upOne.png")));
+        directionUpTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/upTwo.png")));
+        directionLeftOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/leftOne.png")));
+        directionLeftTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/leftTwo.png")));
+        directionRightOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/rightOne.png")));
+        directionRightTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/rightTwo.png")));
+    }
 
+    private void loadSentinelsSprites() {
+        directionDownOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/sentinels/SentinelDown00.png")));
+        directionDownTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/sentinels/SentinelDown01.png")));
+        directionUpOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/upOne.png")));
+        directionUpTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/upTwo.png")));
+        directionLeftOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/leftOne.png")));
+        directionLeftTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/leftTwo.png")));
+        directionRightOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/rightOne.png")));
+        directionRightTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/rightTwo.png")));
+    }
+
+    private void loadWeaponSprites() {
+        swordUp = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/weapons/SwordUp.png")));
+        swordDown = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/weapons/SwordDown.png")));
+        swordLeft = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/weapons/SwordLeft.png")));
+        swordRight = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/weapons/SwordRight.png")));
     }
 
     @Override
-    public void placeBombAction(IEntity entity, GraphicsContext graphicsContext) {
+    public void updateEntity(GameSceneController gameScene, GraphicsContext graphicsContext) {
+        playerX = connectionHandler.getEnemyX();
+        playerY = connectionHandler.getEnemyY();
+        updateHealth();
+        entityDirection = connectionHandler.getEnemyWalkDirection();
+        boxCollider = new BoundingBox(playerX, playerY, 48, 48);
+    }
 
+    private void updateHealth() {
+        health = connectionHandler.getEnemyHealth();
     }
 
+    @Override
+    public void checkGameplayObjectInteraction(IEntity entity, GraphicsContext graphicsContext) {}
+
+    @Override
+    public void placeBombAction(IEntity entity, GraphicsContext graphicsContext) {}
+
     @Override
     public void attack(IEntity entity, GraphicsContext graphicsContext) {
+        BoundingBox hitBox;
+        int attackRange = 30;
+        int attackWidth = 10;
+
+        if (connectionHandler.getEnemyAttacking()){
+            if (entityDirection == EntityDirection.UP) {
+                hitBox = new BoundingBox(playerX + playerWidth, playerY - 10, attackWidth, attackRange);
+                graphicsContext.drawImage(swordUp, playerX + 8, playerY - 10, 32, 32);
+                hitEnemy(entity, hitBox);
+            } else if (entityDirection == EntityDirection.DOWN) {
+                hitBox = new BoundingBox(playerX + playerWidth, playerY + playerHeight, attackWidth, attackRange);
+                graphicsContext.drawImage(swordDown, playerX + 8, playerY + playerHeight, 32, 32);
+                hitEnemy(entity, hitBox);
+            } else if (entityDirection == EntityDirection.LEFT) {
+                hitBox = new BoundingBox(playerX - attackWidth, playerY + ((double) playerHeight / 2),
+                        attackRange, attackWidth);
+                graphicsContext.drawImage(swordLeft, playerX - 8, playerY + 8, 32, 32);
+                hitEnemy(entity, hitBox);
+            } else {
+                hitBox = new BoundingBox(playerX + playerWidth + attackWidth, playerY + ((double) playerHeight / 2),
+                        attackRange, attackWidth);
+                graphicsContext.drawImage(swordRight, playerX + playerWidth + 8, playerY + 8, 32, 32);
+                hitEnemy(entity, hitBox);
+            }
+        }
+    }
 
+    private void hitEnemy(IEntity entity, BoundingBox hitBox) {
+        if (hitBox.intersects(entity.getBoxCollider())) {
+            entity.gotHit(damage);
+            log.info("Hit enemy");
+        }
     }
 
     @Override
     public void updateEntityWalkAnimation() {
-
+        spriteCounter++;
+
+        if (spriteCounter > 10) {
+            if (spriteNumber == 1) {
+                spriteNumber = 2;
+            } else if (spriteNumber == 2) {
+                spriteNumber = 1;
+            }
+            spriteCounter = 0;
+        }
     }
 
     @Override
     public void renderEntity(GraphicsContext graphicsContext) {
-        graphicsContext.setFill(Color.BLACK);
-        graphicsContext.fillRect(300, 200, 48, 48);
+        Image playerSprite = null;
+
+        switch (entityDirection) {
+            case UP:
+                if (spriteNumber == 1) {
+                    playerSprite = directionUpOne;
+                }
+                if (spriteNumber == 2) {
+                    playerSprite = directionUpTwo;
+                }
+                break;
+            case DOWN:
+                if (spriteNumber == 1) {
+                    playerSprite = directionDownOne;
+                }
+                if (spriteNumber == 2) {
+                    playerSprite = directionDownTwo;
+                }
+                break;
+            case LEFT:
+                if (spriteNumber == 1) {
+                    playerSprite = directionLeftOne;
+                }
+                if (spriteNumber == 2) {
+                    playerSprite = directionLeftTwo;
+                }
+                break;
+            case RIGHT:
+                if (spriteNumber == 1) {
+                    playerSprite = directionRightOne;
+                }
+                if (spriteNumber == 2) {
+                    playerSprite = directionRightTwo;
+                }
+                break;
+        }
+
+        graphicsContext.drawImage(playerSprite, playerX, playerY, 48, 48);
     }
 
     @Override
     public void healPlayer(int heal) {
-        log.info("Network player health: " + health);
-        health -= heal;
     }
 
     @Override
@@ -89,16 +294,17 @@ class NetworkPlayerTwo implements IEntity{
     public void gotHit(int damageDone) {
         log.debug("Network player health: " + health);
         health -= damageDone;
+        connectionHandler.setEnemyHealth(health -= damageDone);
     }
 
     @Override
     public int getMapPosX() {
-        return 0;
+        return playerX;
     }
 
     @Override
     public int getMapPosY() {
-        return 0;
+        return playerY;
     }
 
     @Override
@@ -113,12 +319,10 @@ class NetworkPlayerTwo implements IEntity{
 
     @Override
     public void setObjectStatus(ObjectStatus objectStatus) {
-
     }
 
     @Override
-
-    public int getplayer() {
+    public int getPlayer() {
         return 0;
     }
 
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/Player.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/Player.java
index 656ab67605d8efd00ed6a75b1bd06cfb96b77003..ab57c5f658d6fe1e58c861eeca0ceafdb8a382c1 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/Player.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Entity/Player.java
@@ -1,16 +1,16 @@
 package de.hdm_stuttgart.battlearena.Model.Entity;
 
+import de.hdm_stuttgart.battlearena.Controller.Enum.GameMode;
 import de.hdm_stuttgart.battlearena.Controller.Enum.PlayerMode;
 import de.hdm_stuttgart.battlearena.Controller.GameSceneController;
 import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo;
-import de.hdm_stuttgart.battlearena.Model.Entity.GameplayObjects.Heart;
 import de.hdm_stuttgart.battlearena.Model.Entity.GameplayObjects.ObjectStatus;
 import de.hdm_stuttgart.battlearena.Model.Entity.GameplayObjects.ObjectType;
 import de.hdm_stuttgart.battlearena.Model.Inputs.InputHandler;
 import de.hdm_stuttgart.battlearena.Model.Map.TileManager;
+import de.hdm_stuttgart.battlearena.Model.Multiplayer.ConnectionHandler;
 import de.hdm_stuttgart.battlearena.Model.Sound.SFX;
 import de.hdm_stuttgart.battlearena.Model.Sound.SfxOnce;
-import de.hdm_stuttgart.battlearena.Model.Sound.SoundEffectsVolume;
 import de.hdm_stuttgart.battlearena.Model.Sound.WalkEffects;
 import javafx.geometry.BoundingBox;
 import javafx.scene.canvas.GraphicsContext;
@@ -23,26 +23,16 @@ import java.util.Objects;
 
 
 class Player implements IEntity {
-
     private static final Logger log = LogManager.getLogger(Player.class);
-
     private final PlayerMode PLAYER_MODE;
-
     InputHandler inputHandler;
-
     RuntimeInfo runtimeInfo = RuntimeInfo.getInstance();
-
     CollisionHandler collisionHandler = new CollisionHandler();
-
     GraphicsContext gameScene;
-
     GameSceneController gameSceneController;
-
+    ConnectionHandler connectionHandler;
     private BoundingBox boxCollider;
 
-    private SoundEffectsVolume sfx = new SoundEffectsVolume();
-
-
     private Image directionDownOne,
             directionDownTwo,
             directionUpOne,
@@ -58,21 +48,15 @@ class Player implements IEntity {
             swordRight;
 
     private final EntityClass entityClass;
-
     private int spriteCounter = 0;
     private int spriteNumber = 1;
-
     private final int playerWidth = 19;
     private final int playerHeight = 20;
-
     private int scaledTileSize;
-
     private int mapPosX;
     private int mapPosY;
-
     private int lastMapPosX;
     private int lastMapPosY;
-
     private int playerSpeed;
     private EntityDirection playerDirection;
     private int health;
@@ -90,8 +74,8 @@ class Player implements IEntity {
     private boolean markerPlacedPlayerTwo = false;
     private boolean isTeleportItemFrame = false;
     private boolean isDead = false;
-    private int blastradius = 1;
-    private final int pixelpadding = 30;
+    private int blastRadius = 1;
+    private final int pixelPadding = 30;
 
     public Player(GraphicsContext gameScene, InputHandler inputHandler, EntityClass entityClass,
                   GameSceneController gameSceneController, PlayerMode PLAYER_MODE) {
@@ -108,12 +92,23 @@ class Player implements IEntity {
     @Override
     public void initializeEntity() {
         scaledTileSize = gameSceneController.getScaledTileSize();
-        if (PLAYER_MODE == PlayerMode.PLAYER_ONE) {
-            mapPosX = 60;
-            mapPosY = 60;
-        } else if (PLAYER_MODE == PlayerMode.PLAYER_TWO) {
-            mapPosX = 760;
-            mapPosY = 735;
+        if (runtimeInfo.getGameMode() == GameMode.LOCAL) {
+            if (PLAYER_MODE == PlayerMode.PLAYER_ONE) {
+                mapPosX = 60;
+                mapPosY = 60;
+            } else if (PLAYER_MODE == PlayerMode.PLAYER_TWO) {
+                mapPosX = 760;
+                mapPosY = 735;
+            }
+        } else {
+            if (runtimeInfo.getEnemyPlayerMode() == PlayerMode.PLAYER_ONE) {
+                mapPosX = 60;
+                mapPosY = 60;
+            } else {
+                mapPosX = 760;
+                mapPosY = 735;
+            }
+            connectionHandler = runtimeInfo.getConnectionHandler();
         }
 
         initializePlayerStats();
@@ -182,12 +177,12 @@ class Player implements IEntity {
     private void loadHighBornSprites() {
         directionDownOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/high_born/HighBornDown00.png")));
         directionDownTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/high_born/HighBornDown01.png")));
-        directionUpOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/upOne.png")));
-        directionUpTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/upTwo.png")));
-        directionLeftOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/leftOne.png")));
-        directionLeftTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/leftTwo.png")));
-        directionRightOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/rightOne.png")));
-        directionRightTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/rightTwo.png")));
+        directionUpOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/high_born/HighBornUp00.png")));
+        directionUpTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/high_born/HighBornUp01.png")));
+        directionLeftOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/high_born/HighBornLeft00.png")));
+        directionLeftTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/high_born/HighBornLeft01.png")));
+        directionRightOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/high_born/HighBornRight00.png")));
+        directionRightTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/high_born/HighBornRight01.png")));
     }
 
     private void loadLowBornSprites() {
@@ -204,12 +199,12 @@ class Player implements IEntity {
     private void loadSentinelsSprites() {
         directionDownOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/sentinels/SentinelDown00.png")));
         directionDownTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/sentinels/SentinelDown01.png")));
-        directionUpOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/upOne.png")));
-        directionUpTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/upTwo.png")));
-        directionLeftOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/leftOne.png")));
-        directionLeftTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/leftTwo.png")));
-        directionRightOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/rightOne.png")));
-        directionRightTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/rightTwo.png")));
+        directionUpOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/sentinels/SentinelUp00.png")));
+        directionUpTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/sentinels/SentinelUp01.png")));
+        directionLeftOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/sentinels/SentinelLeft00.png")));
+        directionLeftTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/sentinels/SentinelLeft01.png")));
+        directionRightOne = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/sentinels/SentinelRight00.png")));
+        directionRightTwo = new Image(Objects.requireNonNull(getClass().getResourceAsStream("/textures/player/sentinels/SentinelRight01.png")));
     }
 
     private void loadWeaponSprites() {
@@ -221,7 +216,7 @@ class Player implements IEntity {
 
     @Override
     public void updateEntity(GameSceneController gameScene, GraphicsContext graphicsContext) {
-        if (PLAYER_MODE == PlayerMode.PLAYER_ONE) {
+        if (PLAYER_MODE == PlayerMode.PLAYER_ONE || runtimeInfo.getGameMode() == GameMode.NETWORK) {
             updateInvincibility();
             updateAttackRate();
             updateBombPlacementRate();
@@ -295,13 +290,12 @@ class Player implements IEntity {
     }
 
     private void performEntityMovement(boolean isWalkableTile, GraphicsContext graphicsContext) {
-        int xTile = (pixelpadding + mapPosX) / scaledTileSize;
-        int yTile = (pixelpadding + mapPosY) / scaledTileSize;
+        int xTile = (pixelPadding + mapPosX) / scaledTileSize;
+        int yTile = (pixelPadding + mapPosY) / scaledTileSize;
         int lastxTile = xTile;
         int lastyTile = yTile;
 
 
-
         if (PLAYER_MODE == PlayerMode.PLAYER_ONE && !markerPlacedPlayerOne) {
             markerPlacedPlayerOne = findNearestTpTile(yTile, xTile, graphicsContext);
         }
@@ -316,19 +310,31 @@ class Player implements IEntity {
             switch (playerDirection) {
                 case UP:
                     mapPosY -= playerSpeed;
+                    if (runtimeInfo.getGameMode() == GameMode.NETWORK) {
+                        connectionHandler.setpY(mapPosY);
+                    }
                     break;
                 case DOWN:
                     mapPosY += playerSpeed;
+                    if (runtimeInfo.getGameMode() == GameMode.NETWORK) {
+                        connectionHandler.setpY(mapPosY);
+                    }
                     break;
                 case LEFT:
                     mapPosX -= playerSpeed;
+                    if (runtimeInfo.getGameMode() == GameMode.NETWORK) {
+                        connectionHandler.setpX(mapPosX);
+                    }
                     break;
                 case RIGHT:
                     mapPosX += playerSpeed;
+                    if (runtimeInfo.getGameMode() == GameMode.NETWORK) {
+                        connectionHandler.setpX(mapPosX);
+                    }
             }
         }
-        xTile = (pixelpadding + mapPosX) / scaledTileSize;
-        yTile = (pixelpadding + mapPosY) / scaledTileSize;
+        xTile = (pixelPadding + mapPosX) / scaledTileSize;
+        yTile = (pixelPadding + mapPosY) / scaledTileSize;
 
         if (PLAYER_MODE == PlayerMode.PLAYER_ONE && lastxTile != xTile || PLAYER_MODE == PlayerMode.PLAYER_ONE && lastyTile != yTile) {
             markerPlacedPlayerOne = removeMarker(markerPlacedPlayerOne);
@@ -429,7 +435,7 @@ class Player implements IEntity {
         List<IEntity> gameplayObjects = runtimeInfo.getGameplayObjects();
         if (markerPlacedPlayer == markerPlacedPlayerOne) {
             for (IEntity gameplayObject : gameplayObjects) {
-                if (gameplayObject.getOBJECT_TYPE() == ObjectType.MARKER && gameplayObject.getplayer() == 1) {
+                if (gameplayObject.getOBJECT_TYPE() == ObjectType.MARKER && gameplayObject.getPlayer() == 1) {
                     log.debug("Removed Marker Player 1");
 
                     gameplayObject.setObjectStatus(ObjectStatus.USED);
@@ -437,7 +443,7 @@ class Player implements IEntity {
             }
         } else if (markerPlacedPlayer == markerPlacedPlayerTwo) {
             for (IEntity gameplayObject : gameplayObjects) {
-                if (gameplayObject.getOBJECT_TYPE() == ObjectType.MARKER && gameplayObject.getplayer() == 2) {
+                if (gameplayObject.getOBJECT_TYPE() == ObjectType.MARKER && gameplayObject.getPlayer() == 2) {
                     log.debug("Removed Marker Player 2");
 
                     gameplayObject.setObjectStatus(ObjectStatus.USED);
@@ -492,7 +498,7 @@ class Player implements IEntity {
                     isBlastUpItemFrame = true;
                     SfxOnce t = new SfxOnce();
                     t.startSound(SFX.POWERUP);
-                    blastradius = updateBlastradius(blastradius);
+                    blastRadius = updateBlastradius(blastRadius);
                     gameplayObject.setObjectStatus(ObjectStatus.USED);
                 }
             } else if (gameplayObject.getOBJECT_TYPE() == ObjectType.BLASTDOWN_ITEMFRAME) {
@@ -501,7 +507,7 @@ class Player implements IEntity {
                     isBlastDownItemFrame = true;
                     SfxOnce t = new SfxOnce();
                     t.startSound(SFX.POWERUP);
-                    blastradius = updateBlastradius(blastradius);
+                    blastRadius = updateBlastradius(blastRadius);
                     gameplayObject.setObjectStatus(ObjectStatus.USED);
                 }
             } else if (gameplayObject.getOBJECT_TYPE() == ObjectType.BOMBCLOCK_ITEMFRAME) {
@@ -528,21 +534,20 @@ class Player implements IEntity {
 
     @Override
     public void placeBombAction(IEntity entity, GraphicsContext graphicsContext) {
-
         List<IEntity> gameplayObjects = runtimeInfo.getGameplayObjects();
         if (inputHandler.isBomb() && PLAYER_MODE == PlayerMode.PLAYER_ONE && bombPlacementRate == 0 ||
                 inputHandler.isSdBomb() && PLAYER_MODE == PlayerMode.PLAYER_TWO && bombPlacementRate == 0) {
 
-            blastradius = updateBlastradius(blastradius);
+            blastRadius = updateBlastradius(blastRadius);
             if (isBigBombItemFrame && !isTeleportItemFrame) {
                 log.debug("We have Big_Bomb ItemFrames in the List");
                 bombPlacementRate = updateBombPlacementRate(bombPlacementRate);
-                int xTile = (pixelpadding + mapPosX) / scaledTileSize;
-                int yTile = (pixelpadding + mapPosY) / scaledTileSize;
+                int xTile = (pixelPadding + mapPosX) / scaledTileSize;
+                int yTile = (pixelPadding + mapPosY) / scaledTileSize;
                 if (TileManager.tileMap[yTile][xTile] < 10) {
                     SfxOnce t = new SfxOnce();
                     t.startSound(SFX.BOMB);
-                    IEntity bigbomb = EntityFactory.createBombs(ObjectType.BIG_BOMB, xTile * scaledTileSize, yTile * scaledTileSize, graphicsContext, blastradius);
+                    IEntity bigbomb = EntityFactory.createBombs(ObjectType.BIG_BOMB, xTile * scaledTileSize, yTile * scaledTileSize, graphicsContext, blastRadius);
                     gameplayObjects.add(bigbomb);
                     runtimeInfo.setGameplayObjects(gameplayObjects);
                     log.debug("Bigbomb placed");
@@ -551,7 +556,7 @@ class Player implements IEntity {
             } else if (PLAYER_MODE == PlayerMode.PLAYER_ONE && isTeleportItemFrame) {
                 bombPlacementRate = 25;
                 for (IEntity gameplayObject : gameplayObjects) {
-                    if (gameplayObject.getOBJECT_TYPE() == ObjectType.MARKER && gameplayObject.getplayer() == 1) {
+                    if (gameplayObject.getOBJECT_TYPE() == ObjectType.MARKER && gameplayObject.getPlayer() == 1) {
                         mapPosX = gameplayObject.getMapPosX();
                         mapPosY = gameplayObject.getMapPosY();
                         log.info("Teleport Player 1");
@@ -563,7 +568,7 @@ class Player implements IEntity {
             } else if (PLAYER_MODE == PlayerMode.PLAYER_TWO && isTeleportItemFrame) {
                 bombPlacementRate = 25;
                 for (IEntity gameplayObject : gameplayObjects) {
-                    if (gameplayObject.getOBJECT_TYPE() == ObjectType.MARKER && gameplayObject.getplayer() == 2) {
+                    if (gameplayObject.getOBJECT_TYPE() == ObjectType.MARKER && gameplayObject.getPlayer() == 2) {
                         mapPosX = gameplayObject.getMapPosX();
                         mapPosY = gameplayObject.getMapPosY();
                         log.info("Teleport Player 2");
@@ -575,13 +580,13 @@ class Player implements IEntity {
             } else if (!isTeleportItemFrame) {
                 log.debug("No BigBomb Itemframes in the List");
                 bombPlacementRate = bombReducedPlacementRate;
-                int xTile = (pixelpadding + mapPosX) / scaledTileSize;
-                int yTile = (pixelpadding + mapPosY) / scaledTileSize;
+                int xTile = (pixelPadding + mapPosX) / scaledTileSize;
+                int yTile = (pixelPadding + mapPosY) / scaledTileSize;
 
                 if (TileManager.tileMap[yTile][xTile] < 10) {
                     SfxOnce t = new SfxOnce();
                     t.startSound(SFX.BOMB);
-                    IEntity bomb = EntityFactory.createBombs(ObjectType.BOMB, xTile * scaledTileSize, yTile * scaledTileSize, graphicsContext, blastradius);
+                    IEntity bomb = EntityFactory.createBombs(ObjectType.BOMB, xTile * scaledTileSize, yTile * scaledTileSize, graphicsContext, blastRadius);
                     gameplayObjects.add(bomb);
                     runtimeInfo.setGameplayObjects(gameplayObjects);
                     log.info("bomb placed");
@@ -611,9 +616,7 @@ class Player implements IEntity {
             }
             isBlastDownItemFrame = false;
         }
-
         return blastradius;
-
     }
 
     @Override
@@ -628,33 +631,26 @@ class Player implements IEntity {
         if (inputHandler.isAttack() && PLAYER_MODE == PlayerMode.PLAYER_ONE && attackRate == 0 ||
                 inputHandler.isSdAttack() && PLAYER_MODE == PlayerMode.PLAYER_TWO && attackRate == 0) {
 
-            attackRate = 50;
+            attackRate = 25;
             SfxOnce sfx = new SfxOnce();
             sfx.startSound(SFX.SWORD_SWING);
 
-
             if (playerDirection == EntityDirection.UP) {
                 hitBox = new BoundingBox(mapPosX + playerWidth, mapPosY - 10, attackWidth, attackRange);
-                graphicsContext.strokeRect(mapPosX + playerWidth, mapPosY - 10, attackWidth, attackRange);
                 graphicsContext.drawImage(swordUp, mapPosX + 8, mapPosY - 10, 32, 32);
                 hitEnemy(entity, hitBox);
             } else if (playerDirection == EntityDirection.DOWN) {
                 hitBox = new BoundingBox(mapPosX + playerWidth, mapPosY + playerHeight, attackWidth, attackRange);
-                graphicsContext.strokeRect(mapPosX + playerWidth, mapPosY + playerHeight, attackWidth, attackRange);
                 graphicsContext.drawImage(swordDown, mapPosX + 8, mapPosY + playerHeight, 32, 32);
                 hitEnemy(entity, hitBox);
             } else if (playerDirection == EntityDirection.LEFT) {
                 hitBox = new BoundingBox(mapPosX - attackWidth, mapPosY + ((double) playerHeight / 2),
                         attackRange, attackWidth);
-                graphicsContext.strokeRect(mapPosX - attackWidth, mapPosY + ((double) playerHeight / 2),
-                        attackRange, attackWidth);
                 graphicsContext.drawImage(swordLeft, mapPosX - 8, mapPosY + 8, 32, 32);
                 hitEnemy(entity, hitBox);
             } else {
                 hitBox = new BoundingBox(mapPosX + playerWidth + attackWidth, mapPosY + ((double) playerHeight / 2),
                         attackRange, attackWidth);
-                graphicsContext.strokeRect(mapPosX + playerWidth + attackWidth, mapPosY + ((double) playerHeight / 2),
-                        attackRange, attackWidth);
                 graphicsContext.drawImage(swordRight, mapPosX + playerWidth + 8, mapPosY + 8, 32, 32);
                 hitEnemy(entity, hitBox);
             }
@@ -672,7 +668,6 @@ class Player implements IEntity {
 
     @Override
     public void updateEntityWalkAnimation() {
-
         spriteCounter++;
         if (spriteCounter > 10) {
             if (spriteNumber == 1) {
@@ -692,9 +687,6 @@ class Player implements IEntity {
     public void renderEntity(GraphicsContext graphicsContext) {
         Image playerSprite = null;
 
-        //for debugging collision
-        graphicsContext.strokeRect(mapPosX + 15, mapPosY + 10, playerWidth, playerHeight);
-
         switch (playerDirection) {
             case UP:
                 if (spriteNumber == 1) {
@@ -729,7 +721,6 @@ class Player implements IEntity {
                 }
                 break;
         }
-
         graphicsContext.drawImage(playerSprite, mapPosX, mapPosY, 48, 48);
     }
 
@@ -743,7 +734,7 @@ class Player implements IEntity {
                 t.startSound(SFX.DAMAGETAKEN);
                 iFrameCounter = 100;
             } else {
-                if(!isDead){
+                if (!isDead) {
                     SfxOnce t = new SfxOnce();
                     t.startSound(SFX.DEAD);
                     log.info("Dead");
@@ -751,11 +742,12 @@ class Player implements IEntity {
                 isDead = true;
                 health = 0;
                 iFrameCounter = 100;
+                runtimeInfo.setDeaths(runtimeInfo.getDeaths() + 1);
+                runtimeInfo.setKills(runtimeInfo.getKills() + 1);
                 runtimeInfo.setGameWon(true);
             }
             log.info("DamageTaken, current Health: " + health);
         }
-
     }
 
     @Override
@@ -822,8 +814,7 @@ class Player implements IEntity {
     }
 
     @Override
-    public int getplayer() {
+    public int getPlayer() {
         return 0;
     }
-
 }
\ No newline at end of file
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Inputs/InputHandler.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Inputs/InputHandler.java
index 27aed7d1928df8251c351e81c4b0c9cc27c63aec..c01a89dcfbcbfa51c90c6c74474047f4231b623f 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Inputs/InputHandler.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Inputs/InputHandler.java
@@ -7,12 +7,11 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 
 public class InputHandler {
-
     private static final Logger log = LogManager.getLogger(InputHandler.class);
-
     private static final InputHandler inputHandler = new InputHandler();
 
-    private InputHandler(){}
+    private InputHandler() {
+    }
 
     public static InputHandler getInstance() {
         return inputHandler;
@@ -172,11 +171,11 @@ public class InputHandler {
         return sdAttack;
     }
 
-    public boolean isBomb(){
+    public boolean isBomb() {
         return bomb;
     }
 
-    public boolean isSdBomb(){
+    public boolean isSdBomb() {
         return sdBomb;
     }
 }
\ No newline at end of file
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/BackgroundTile.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/BackgroundTile.java
index 75ec8fc3846abe20d4fc2d51966a192aa3f41b2b..64988e3e1fc377e4210c7b080f5b3f1b4fb10f2e 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/BackgroundTile.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/BackgroundTile.java
@@ -12,13 +12,13 @@ class BackgroundTile implements ITile{
 
     private final Image tileSprite;
     private final boolean isWalkable, isDestructible;
-    private SFXLoop soundeffect;
+    private final SFXLoop soundEffect;
 
     public BackgroundTile(Image tileSprite, boolean isWalkable, boolean isDestructible, SFXLoop sfx) {
         this.tileSprite = tileSprite;
         this.isWalkable = isWalkable;
         this.isDestructible = isDestructible;
-        this.soundeffect = sfx;
+        this.soundEffect = sfx;
     }
 
     @Override
@@ -39,8 +39,8 @@ class BackgroundTile implements ITile{
     }
 
     @Override
-    public SFXLoop getSoundeffect(){
+    public SFXLoop getSoundEffect(){
         log.debug("SFX returned");
-        return soundeffect;
+        return soundEffect;
     }
 }
\ No newline at end of file
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/ITile.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/ITile.java
index f0290e1bceb21f6a78d5c07f873c11391dd822fa..ce45e9c8e7bc14de48aadb21c07fcae6b6ff421d 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/ITile.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/ITile.java
@@ -7,5 +7,5 @@ public interface ITile {
     boolean getCollision();
     boolean getDestruction();
     Image getTileSprite();
-    SFXLoop getSoundeffect();
+    SFXLoop getSoundEffect();
 }
\ No newline at end of file
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/TileFactory.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/TileFactory.java
index 7c10e8b13b9d11b5cda2f27af0be4a882118fa18..9086080570b14636b3161cda912f0a34d24f31f8 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/TileFactory.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/TileFactory.java
@@ -7,10 +7,8 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 
 public class TileFactory {
-
     private static final Logger log = LogManager.getLogger(TileFactory.class);
 
-
     public static ITile createTile(TileType tileType, TileType tileType2, Image tileSprite, SFXLoop sfx) {
         if (tileType == TileType.WALKABLE && tileType2 == TileType.DESTRUCTIBLE) {
             log.info("Tile with type: " + tileType + " " + tileType2 + " created.");
@@ -25,9 +23,7 @@ public class TileFactory {
             log.info("Tile with type: " + tileType + " " + tileType2 +" created.");
             return new BackgroundTile(tileSprite, false, false, sfx);
         }
-
         log.error("TileType: " + tileType + " not supported!");
         throw new IllegalArgumentException("TileType: " + tileType + " not supported!");
     }
-
 }
\ No newline at end of file
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/TileManager.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/TileManager.java
index 7a16ccab61c682931409be6ca486023c52cd5f9c..21bbb90e5e3b444948d453595aa9dd432755f181 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/TileManager.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Map/TileManager.java
@@ -11,16 +11,12 @@ import org.apache.logging.log4j.LogManager;
 import java.util.Objects;
 
 public class TileManager {
-
     private static final Logger log = LogManager.getLogger(TileManager.class);
-
     private final GraphicsContext graphicsContext2D;
     private final ITile[] tileSet;
     public static int[][] tileMap;
-
     private final int horizontalTileCount;
     private final int verticalTileCount;
-
     public TileManager(GraphicsContext graphicsContext2D, int diffTileCount,
                        int horizontalTileCount, int verticalTileCount, String mapString, Biom biom) {
         this.graphicsContext2D = graphicsContext2D;
@@ -326,7 +322,7 @@ public class TileManager {
 
     public void renderMap() {
         int currentTile;
-        int scaledTileSize = 48; //todo: later replace "48" with value from gameScene.
+        int scaledTileSize = 48;
         int tilePosX;
         int tilePosY;
 
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Client.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Client.java
index 9817c0d2601718d4b0ce6d731097a6466eb2abe9..6ec67e8faa749b4da26922c7844f9de326d33619 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Client.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Client.java
@@ -20,7 +20,7 @@ public class Client {
         in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
     }
 
-    public int[] sendcords(int[] cords) throws IOException {
+    public int[] sendCords(int[] cords) throws IOException {
         String message = String.join(",", Arrays.stream(cords).mapToObj(String::valueOf).toArray(String[]::new));
         out.println(message);
       //  log.info("Sent coordinates: " + message);
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/ConnectionHandler.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/ConnectionHandler.java
index 48c31a576c546179217c67ec02df6f7041b555ea..9ae74030739ad5862ef80571e79bd9d6acc29ec3 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/ConnectionHandler.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/ConnectionHandler.java
@@ -2,22 +2,21 @@ package de.hdm_stuttgart.battlearena.Model.Multiplayer;
 
 import de.hdm_stuttgart.battlearena.Model.Entity.EntityClass;
 import de.hdm_stuttgart.battlearena.Model.Entity.EntityDirection;
+import de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities.IPAddressValidator;
+import de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities.NotAnIpAddressException;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
 import java.io.IOException;
 import java.util.Arrays;
-import java.util.concurrent.TimeUnit;
 
 public class ConnectionHandler {
-
     private static int pX = 0;
     private static int pY = 0;
     private static int enemyX = 0;
     private static int enemyY = 0;
     private static int playerID = 0;
-
-    private static int playerAttacking = 1;
+    private static int playerAttacking = 0;
     private static int enemyAttacking = 0;
     private static int playerClass = 0;
     private static int enemyClass = 0;
@@ -25,7 +24,7 @@ public class ConnectionHandler {
     private static int enemyWalkDirection = 0;
     private static int playerHealth = 10;
     private static int enemyHealth = 10;
-    private static int[] coordinates = {pX,pY,playerID,playerAttacking,playerClass,playerWalkDirection,playerHealth};
+    private static int[] playerInformation = {pX, pY, playerID, playerAttacking, playerClass, playerWalkDirection, playerHealth};
     private static String ipaddress = "localhost";
     private static final Logger log = LogManager.getLogger(ConnectionHandler.class);
 
@@ -48,8 +47,8 @@ public class ConnectionHandler {
         public void run() {
             try {
                 while (!Thread.interrupted()) {
-                    System.out.println(Arrays.toString(coordinates));
-                    int[] cords = client.sendcords(coordinates);
+                    System.out.println(Arrays.toString(playerInformation));
+                    int[] cords = client.sendCords(playerInformation);
                     enemyX = cords[0];
                     enemyY = cords[1];
                     playerID = cords[2];
@@ -58,13 +57,13 @@ public class ConnectionHandler {
                     enemyWalkDirection = cords[5];
                     enemyHealth = cords[6];
                     // Assign the Values to the message to send:
-                    coordinates[0] = pX;
-                    coordinates[1] = pY;
-                    coordinates[2] = playerID;
-                    coordinates[3] = playerAttacking;
-                    coordinates[4] = playerClass;
-                    coordinates[5] = playerWalkDirection;
-                    coordinates[6] = playerHealth;
+                    playerInformation[0] = pX;
+                    playerInformation[1] = pY;
+                    playerInformation[2] = playerID;
+                    playerInformation[3] = playerAttacking;
+                    playerInformation[4] = playerClass;
+                    playerInformation[5] = playerWalkDirection;
+                    playerInformation[6] = playerHealth;
                     Thread.sleep(60);
                 }
             } catch (InterruptedException | IOException e) {
@@ -97,14 +96,16 @@ public class ConnectionHandler {
 
         return enemyX;
     }
+
     public int getEnemyY() {
 
         return enemyY;
     }
 
+
     //Getters and Setter for all other information that are not coordinates:
 
-    public static boolean getPlayerAttacking() {
+    public boolean getPlayerAttacking() {
         if (playerAttacking == 1){
             return true;
         } else {
@@ -112,7 +113,7 @@ public class ConnectionHandler {
         }
     }
 
-    public static void setPlayerAttacking(boolean attack) {
+    public void setPlayerAttacking(boolean attack) {
         if (attack){
             ConnectionHandler.playerAttacking = 1;
         } else {
@@ -120,7 +121,7 @@ public class ConnectionHandler {
         }
     }
 
-    public static boolean getEnemyAttacking() {
+    public boolean getEnemyAttacking() {
         if (enemyAttacking == 1){
             return true;
         } else {
@@ -128,7 +129,7 @@ public class ConnectionHandler {
         }
     }
 
-    public static void setEnemyAttacking(boolean attack) {
+    public void setEnemyAttacking(boolean attack) {
         if (attack){
             ConnectionHandler.enemyAttacking = 1;
         } else {
@@ -136,7 +137,7 @@ public class ConnectionHandler {
         }
     }
 
-    public static EntityClass getPlayerClass() {
+    public EntityClass getPlayerClass() {
         if (playerClass == 1) {
             return EntityClass.HIGH_BORN;
         } else if (playerClass == 2) {
@@ -148,19 +149,19 @@ public class ConnectionHandler {
         }
     }
 
-    public static void setPlayerClass(EntityClass player) {
+    public void setPlayerClass(EntityClass player) {
         if (player == EntityClass.HUMAN){
             ConnectionHandler.playerClass = 0;
         } else if (player == EntityClass.HIGH_BORN) {
             ConnectionHandler.playerClass = 1;
-        } else if (player == EntityClass.LOW_BORN){
+        } else if (player == EntityClass.LOW_BORN) {
             ConnectionHandler.playerClass = 2;
         } else {
             ConnectionHandler.playerClass = 3;
         }
     }
 
-    public static EntityClass getEnemyClass() {
+    public EntityClass getEnemyClass() {
         if (enemyClass == 1) {
             return EntityClass.HIGH_BORN;
         } else if (enemyClass == 2) {
@@ -172,31 +173,31 @@ public class ConnectionHandler {
         }
     }
 
-    public static void setEnemyClass(EntityClass player) {
+    public void setEnemyClass(EntityClass player) {
         if (player == EntityClass.HUMAN){
             ConnectionHandler.enemyClass = 0;
         } else if (player == EntityClass.HIGH_BORN) {
             ConnectionHandler.enemyClass = 1;
-        } else if (player == EntityClass.LOW_BORN){
+        } else if (player == EntityClass.LOW_BORN) {
             ConnectionHandler.enemyClass = 2;
         } else {
             ConnectionHandler.enemyClass = 3;
         }
     }
 
-    public static EntityDirection getPlayerWalkDirection() {
+    public EntityDirection getPlayerWalkDirection() {
         if (playerWalkDirection == 1){
             return EntityDirection.RIGHT;
-        } else if (playerWalkDirection == 2){
+        } else if (playerWalkDirection == 2) {
             return EntityDirection.DOWN;
-        } else if (playerWalkDirection == 3){
+        } else if (playerWalkDirection == 3) {
             return EntityDirection.LEFT;
         } else {
             return EntityDirection.UP;
         }
     }
 
-    public static void setPlayerWalkDirection(EntityDirection walk) {
+    public void setPlayerWalkDirection(EntityDirection walk) {
         if (walk == EntityDirection.RIGHT) {
             ConnectionHandler.playerWalkDirection = 1;
         } else if (walk == EntityDirection.DOWN) {
@@ -208,19 +209,19 @@ public class ConnectionHandler {
         }
     }
 
-    public static EntityDirection getEnemyWalkDirection() {
+    public EntityDirection getEnemyWalkDirection() {
         if (enemyWalkDirection == 1){
             return EntityDirection.RIGHT;
-        } else if (enemyWalkDirection == 2){
+        } else if (enemyWalkDirection == 2) {
             return EntityDirection.DOWN;
-        } else if (enemyWalkDirection == 3){
+        } else if (enemyWalkDirection == 3) {
             return EntityDirection.LEFT;
         } else {
             return EntityDirection.UP;
         }
     }
 
-    public static void setEnemyWalkDirection(EntityDirection walk) {
+    public void setEnemyWalkDirection(EntityDirection walk) {
         if (walk == EntityDirection.RIGHT) {
             ConnectionHandler.enemyWalkDirection = 1;
         } else if (walk == EntityDirection.DOWN) {
@@ -232,24 +233,29 @@ public class ConnectionHandler {
         }
     }
 
-    public static int getPlayerHealth() {
+    public int getPlayerHealth() {
         return playerHealth;
     }
 
-    public static void setPlayerHealth(int playerHealth) {
+    public void setPlayerHealth(int playerHealth) {
         ConnectionHandler.playerHealth = playerHealth;
     }
 
-    public static int getEnemyHealth() {
+    public int getEnemyHealth() {
         return enemyHealth;
     }
 
-    public static void setEnemyHealth(int enemyHealth) {
+    public void setEnemyHealth(int enemyHealth) {
         ConnectionHandler.enemyHealth = enemyHealth;
     }
 
-    public static void setIpaddress(String ipaddress) {
-        ConnectionHandler.ipaddress = ipaddress;
+    public void setIpaddress(String ipaddress) throws NotAnIpAddressException {
+        if (!IPAddressValidator.validate(ipaddress)) {
+            throw new NotAnIpAddressException("Invalid IP Address!");
+        } else {
+            ConnectionHandler.ipaddress = ipaddress;
+        }
     }
+
 }
 
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Server.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Server.java
index 946bf73ae679fd9072b5706157079a968a7c4dd8..a4c9c442ff8bfba378c17f4721e55abe1dd6e775 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Server.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Server.java
@@ -6,9 +6,6 @@ import org.apache.logging.log4j.Logger;
 import java.net.*;
 import java.io.*;
 import java.util.Arrays;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
 
 public class Server {
 
@@ -29,14 +26,14 @@ public class Server {
     private static int enemyWalkDirection = 0;
     private static int playerHealth = 0;
     private static int enemyHealth = 0;
-    private static int playercount = 0;
+    private static int playerCount = 0;
     private static int[] cords;
-    private static int[] returncords = {enemyx,enemyy,playerID,enemyAttacking,enemyClass,enemyWalkDirection,enemyHealth};
+    private static int[] returncords = {enemyx, enemyy, playerID, enemyAttacking, enemyClass, enemyWalkDirection, enemyHealth};
     private boolean started = false;
     private static String ipaddress = "localhost";
 
 //Uncomment these lines to test the server starting manually:
-   /* public static void main(String[] args) throws IOException { //main method for testing purposes
+    /* public static void main(String[] args) throws IOException { //main method for testing purposes
         Server server = new Server();
         log.info("server starting...");
         server.start(4444);
@@ -59,6 +56,7 @@ public class Server {
             while (true) {
                 try {
                     new ServerHandler(serverSocket.accept()).start();
+
                 } catch (IOException e) {
                     e.printStackTrace();
                 }
@@ -68,6 +66,24 @@ public class Server {
         log.info("requests accepting Thread started!");
     }
 
+    public void stopServer() {
+        isServerRunning = false;
+        try {
+            serverSocket.close(); // Close the server socket to break out of accept() in the main thread
+        } catch (IOException e) {
+            log.error("Error closing server socket: " + e.getMessage());
+        }
+    }
+
+    public boolean isStarted() {
+        return started;
+    }
+
+    public int getPlayerCount() {
+        return playerCount;
+    }
+
+    //Inner class ServerHandler
     private static class ServerHandler extends Thread {
         private final Socket clientSocket;
         private PrintWriter out;
@@ -78,104 +94,90 @@ public class Server {
         }
 
         public synchronized void run() {
-                try {
-                    BufferedReader localIn = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
-                    PrintWriter localOut = new PrintWriter(clientSocket.getOutputStream(), true);
-
-                    String inputLine;
-                    while ((inputLine = localIn.readLine()) != null) {  //only runs if there is a request from a server
-                        // Assuming that the input line is a comma-separated list of integers
-                        String[] coordinates = inputLine.split(",");
-                        cords = new int[coordinates.length];
-                        for (int i = 0; i < coordinates.length; i++) {
-                            cords[i] = Integer.parseInt(coordinates[i]);
+            try {
+
+                BufferedReader localIn = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
+                PrintWriter localOut = new PrintWriter(clientSocket.getOutputStream(), true);
+
+                String inputLine;
+                while ((inputLine = localIn.readLine()) != null) {  //only runs if there is a request from a server
+                    // Assuming that the input line is a comma-separated list of integers
+                    String[] coordinates = inputLine.split(",");
+                    cords = new int[coordinates.length];
+                    for (int i = 0; i < coordinates.length; i++) {
+                        cords[i] = Integer.parseInt(coordinates[i]);
+                    }
+
+                    //first connect of a client:
+                    if (playerCount == 0) {
+                        //first player to connect
+                        playerCount++;
+                        returncords[2] = 1;
+
+                    } else if (playerCount == 1) {
+                        //second player to connect
+                        if (cords[2] == 1) {
+                            returncords[2] = 1;
+                        } else {
+                            playerCount++;
+                            returncords[2] = 2;
                         }
 
-                        //first connect of a client:
-                        if(playercount == 0){
-                            //first player to connect
-                            playercount++;
+                    } else if (playerCount == 2) {
+
+                        //check which client has connected
+                        if (cords[2] == 1) {
+                            //player
+                            px = cords[0];
+                            py = cords[1];
+                            playerAttacking = cords[3];
+                            playerClass = cords[4];
+                            playerWalkDirection = cords[5];
+                            playerHealth = cords[6];
+
+                            //set the cords to return:
+                            returncords[0] = enemyx;
+                            returncords[1] = enemyy;
+                            returncords[3] = enemyAttacking;
+                            returncords[4] = enemyClass;
+                            returncords[5] = enemyWalkDirection;
+                            returncords[6] = enemyHealth;
+
+                            //set playerID:
                             returncords[2] = 1;
 
-                        } else if(playercount == 1){
-                            //second player to connect
-                            if(cords[2] == 1){
-                                returncords[2] = 1;
-                            } else {
-                                playercount++;
-                                returncords[2] = 2;
-                            }
-
-                        } else if(playercount == 2){
-
-                            //check which client has connected
-                            if (cords[2] == 1) {
-                                //player
-                                px = cords[0];
-                                py = cords[1];
-                                playerAttacking = cords[3];
-                                playerClass = cords[4];
-                                playerWalkDirection = cords[5];
-                                playerHealth = cords[6];
-
-                                //set the cords to return:
-                                returncords[0] = enemyx;
-                                returncords[1] = enemyy;
-                                returncords[3] = enemyAttacking;
-                                returncords[4] = enemyClass;
-                                returncords[5] = enemyWalkDirection;
-                                returncords[6] = enemyHealth;
-
-                                //set playerID:
-                                returncords[2] = 1;
-
-                            } else if(cords[2] == 2) {
-                                //enemy
-                                enemyx = cords[0];
-                                enemyy = cords[1];
-                                enemyAttacking = cords[3];
-                                enemyClass = cords[4];
-                                enemyWalkDirection = cords[5];
-                                enemyHealth = cords[6];
-
-                                //set the cords to return:
-                                returncords[0] = px;
-                                returncords[1] = py;
-                                returncords[3] = playerAttacking;
-                                returncords[4] = playerClass;
-                                returncords[5] = playerWalkDirection;
-                                returncords[6] = playerHealth;
-
-                                //set playerID:
-                                returncords[2] = 2;
-                            }
+                        } else if (cords[2] == 2) {
+                            //enemy
+                            enemyx = cords[0];
+                            enemyy = cords[1];
+                            enemyAttacking = cords[3];
+                            enemyClass = cords[4];
+                            enemyWalkDirection = cords[5];
+                            enemyHealth = cords[6];
+
+                            //set the cords to return:
+                            returncords[0] = px;
+                            returncords[1] = py;
+                            returncords[3] = playerAttacking;
+                            returncords[4] = playerClass;
+                            returncords[5] = playerWalkDirection;
+                            returncords[6] = playerHealth;
+
+                            //set playerID:
+                            returncords[2] = 2;
                         }
+                    }
 
-                        localOut.println(Arrays.toString(returncords));
-                        localOut.flush();
+                    localOut.println(Arrays.toString(returncords));
+                    localOut.flush();
 
-                        log.info("Player (X Y) : " + px + " " + py + " Attacking : " + playerAttacking + " direction : " + playerWalkDirection + " HP: " + playerHealth);
-                        log.info("Enemy (X Y) : " + enemyx + " " + enemyy + " Attacking : " + enemyAttacking + " direction : " + enemyWalkDirection + " HP: " + enemyHealth);
+                    log.info("Player (X Y) : " + px + " " + py + " Attacking : " + playerAttacking + " direction : " + playerWalkDirection + " HP: " + playerHealth);
+                    log.info("Enemy (X Y) : " + enemyx + " " + enemyy + " Attacking : " + enemyAttacking + " direction : " + enemyWalkDirection + " HP: " + enemyHealth);
 
-                    }
-                } catch (IOException e) {
-                    throw new RuntimeException(e);
                 }
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
         }
     }
-
-    public void stopServer() {
-        isServerRunning = false;
-        try {
-            serverSocket.close(); // Close the server socket to break out of accept() in the main thread
-        } catch (IOException e) {
-            log.error("Error closing server socket: " + e.getMessage());
-        }
-    }
-
-    public boolean isStarted() {
-        return started;
-    }
-
-
 }
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/TestMap.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/TestMap.java
index f6d7fdf0800d787b23fb6df532afdb898733d53c..2773462b4c8691b5df945ae5c32a9a62266efd71 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/TestMap.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/TestMap.java
@@ -1,5 +1,6 @@
 package de.hdm_stuttgart.battlearena.Model.Multiplayer;
 
+import de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities.NotAnIpAddressException;
 import javafx.application.Application;
 import javafx.scene.Scene;
 import javafx.scene.input.KeyCode;
@@ -21,6 +22,12 @@ public class TestMap extends Application {
     public void start(Stage primaryStage) throws IOException, InterruptedException {
 
         ConnectionHandler handler = new ConnectionHandler();
+        try {
+            handler.setIpaddress("localhost");
+        } catch (NotAnIpAddressException e) {
+            e.printStackTrace();
+        }
+
         handler.startHandler();
 
         TimeUnit.SECONDS.sleep(1);
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/IPAddressValidator.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/IPAddressValidator.java
new file mode 100644
index 0000000000000000000000000000000000000000..a292a067c397cc204f39a399fc6f1945b808ee86
--- /dev/null
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/IPAddressValidator.java
@@ -0,0 +1,16 @@
+package de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class IPAddressValidator {
+
+    private static final String IPADDRESS_PATTERN =
+            "^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
+    private static final Pattern pattern = Pattern.compile(IPADDRESS_PATTERN);
+    public static boolean validate(final String ip) {
+        Matcher matcher = pattern.matcher(ip);
+        return matcher.matches();
+    }
+
+}
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/Initializer.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/Initializer.java
new file mode 100644
index 0000000000000000000000000000000000000000..3622881d7ec09a2eb0af32f791de4656576a4d47
--- /dev/null
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/Initializer.java
@@ -0,0 +1,39 @@
+package de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities;
+
+import de.hdm_stuttgart.battlearena.Controller.Enum.PlayerMode;
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo;
+import de.hdm_stuttgart.battlearena.Model.Multiplayer.ConnectionHandler;
+import de.hdm_stuttgart.battlearena.Model.Multiplayer.Server;
+
+import java.io.IOException;
+
+public class Initializer {
+
+    RuntimeInfo runtimeInfo = RuntimeInfo.getInstance();
+
+    public void launchGameServer() throws IOException {
+        Server server = new Server();
+        server.startServer();
+        runtimeInfo.setServer(server);
+    }
+
+    public void launchConnectionHandler(String ipAddress) throws IOException, InterruptedException, NotAnIpAddressException {
+        ConnectionHandler connectionHandler = new ConnectionHandler();
+        connectionHandler.setIpaddress(ipAddress);
+        connectionHandler.startHandler();
+        runtimeInfo.setConnectionHandler(connectionHandler);
+        RuntimeInfo.getInstance().setPlayerID(connectionHandler.getPlayerID());
+    }
+
+    //initialize playerMode in runtimeInfo must be executed bevor the game scene gets initialized
+    public void getPlayerMode(ConnectionHandler connectionHandler) {
+        int playerId = connectionHandler.getPlayerID();
+        if (playerId == 1) {
+            runtimeInfo.setPlayerMode(PlayerMode.PLAYER_ONE);
+            runtimeInfo.setEnemyPlayerMode(PlayerMode.PLAYER_TWO);
+        } else {
+            runtimeInfo.setPlayerMode(PlayerMode.PLAYER_TWO);
+            runtimeInfo.setEnemyPlayerMode(PlayerMode.PLAYER_ONE);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/NotAnIpAddressException.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/NotAnIpAddressException.java
new file mode 100644
index 0000000000000000000000000000000000000000..fc447ea0ac3d5e7546123467b1b1f330d7076d60
--- /dev/null
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/NotAnIpAddressException.java
@@ -0,0 +1,10 @@
+package de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities;
+
+public class NotAnIpAddressException extends Exception{
+    public NotAnIpAddressException(){
+
+    }
+    public NotAnIpAddressException(String message){
+        super(message);
+    }
+}
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/MusicPlayer.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/MusicPlayer.java
index 8adefbeed048c39ccdb4b251af3fc60dcde3a5b9..5e4fa7cfd6d7c38887d774210d8be8158c49860b 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/MusicPlayer.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/MusicPlayer.java
@@ -14,45 +14,35 @@ import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 
-public class MusicPlayer{
-
-
-
+public class MusicPlayer {
     private static final Logger log = LogManager.getLogger(MusicPlayer.class);
-
-    private static final MusicPlayer  musicPlayerSingleton = new MusicPlayer();
-
+    private static final MusicPlayer musicPlayerSingleton = new MusicPlayer();
     private final Persistence persistence = Persistence.getInstance();
-
-
     private MediaPlayer mediaPlayer;
     private GameState currentGameState;
-    private SoundFileManager fileManager = new SoundFileManager();
-
+    private final SoundFileManager fileManager = new SoundFileManager();
     private ScheduledExecutorService scheduler;
 
-    private MusicPlayer(){}
-
-
-
+    private MusicPlayer() {
+    }
 
-    public void startGameStateMonitoring(){
+    public void startGameStateMonitoring() {
         scheduler = Executors.newSingleThreadScheduledExecutor();
-        scheduler.scheduleAtFixedRate(()->{
-           GameState newGameState = RuntimeInfo.getInstance().getGameState();
-           if(currentGameState != newGameState){
-               currentGameState = newGameState;
-               updateMusic();
-           }
-        },0,1, TimeUnit.MILLISECONDS);
-
+        scheduler.scheduleAtFixedRate(() -> {
+            GameState newGameState = RuntimeInfo.getInstance().getGameState();
+            if (currentGameState != newGameState) {
+                currentGameState = newGameState;
+                updateMusic();
+            }
+        }, 0, 1, TimeUnit.MILLISECONDS);
     }
 
-    private void updateMusic(){
+    private void updateMusic() {
         stopMusic();
         playRandomMusic();
     }
@@ -60,7 +50,7 @@ public class MusicPlayer{
     private void playRandomMusic() {
         String path = currentGameState.getPath();
         log.info(path);
-        if(!path.isEmpty()) {
+        if (!path.isEmpty()) {
             Path pathTypeOfMusic = Paths.get(path);
 
             List<Path> musicPaths;
@@ -70,51 +60,50 @@ public class MusicPlayer{
                 throw new RuntimeException(e);
             }
 
-                String randomPath = fileManager.getRandomFilePath(musicPaths);
-                String resource = fileManager.convertPathToResourcePath(randomPath);
-                musicPaths.clear();
-
-                Thread thread = new Thread(() -> {
-                    try {
-                        Media media = new Media(getClass().getResource(resource).toExternalForm());
-                        mediaPlayer = new MediaPlayer(media);
-                        mediaPlayer.setOnEndOfMedia(() -> playRandomMusic());
-                        mediaPlayer.setVolume((double) persistence.getSettings().getMusicVolume() / 100);
-                        mediaPlayer.play();
-                        log.info("Music is playing");
-                    }catch (MediaException mediaException){
-                       log.warn("unsupported media");
-                    }
-                });
-                thread.setDaemon(true);
-                thread.start();
-
+            String randomPath = fileManager.getRandomFilePath(musicPaths);
+            String resource = fileManager.convertPathToResourcePath(randomPath);
+            musicPaths.clear();
+
+            Thread thread = new Thread(() -> {
+                try {
+                    Media media = new Media(Objects.requireNonNull(getClass().getResource(resource)).toExternalForm());
+                    mediaPlayer = new MediaPlayer(media);
+                    mediaPlayer.setOnEndOfMedia(this::playRandomMusic);
+                    mediaPlayer.setVolume((double) persistence.getSettings().getMusicVolume() / 100);
+                    mediaPlayer.play();
+                    log.info("Music is playing");
+                } catch (MediaException mediaException) {
+                    log.warn("unsupported media");
+                }
+            });
+            thread.setDaemon(true);
+            thread.start();
         }
     }
 
-
-    private void stopMusic(){
+    private void stopMusic() {
         if (mediaPlayer != null) {
             mediaPlayer.dispose(); // Dispose of the MediaPlayer instance to ensure stoping
         }
     }
 
-
-    public void setVolume(int volume){
+    public void setVolume(int volume) {
         persistence.getSettings().setMusicVolume(volume);
         mediaPlayer.setVolume((double) volume / 100);
     }
+    public ScheduledExecutorService getScheduler() {
+        return scheduler;
+    }
 
-    public int getVolume(){
-        return persistence.getSettings().getMusicVolume();
+    public GameState getMusicPlayerGameState() {
+        return currentGameState;
     }
-    public ScheduledExecutorService getScheduler(){return scheduler;}
-    public GameState getMusicPlayerGameState(){return currentGameState;}
 
     public MediaPlayer getMediaPlayer() {
         return mediaPlayer;
     }
 
-    public static MusicPlayer getInstance(){return musicPlayerSingleton;}
-
+    public static MusicPlayer getInstance() {
+        return musicPlayerSingleton;
+    }
 }
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SFX.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SFX.java
index e9f147928e38ff48aad113e33f4b910f65e5a5ae..0a11caf368b8ffec0ec63806b1bb27af9d68d941 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SFX.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SFX.java
@@ -21,7 +21,7 @@ public enum SFX {
     DAMAGETAKEN("src/main/resources/sound/sfx/otSFX/dieSounds/hurt.wav");
 
 
-    private String path;
+    private final String path;
 
     SFX(String path) {
         this.path = path;
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SFXLoop.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SFXLoop.java
index 4ba107d82289306dac34ec6d9ffe1824c61c7124..181eb64c921bc1ecdcfd3f24badf1ef7826dc3dd 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SFXLoop.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SFXLoop.java
@@ -5,9 +5,7 @@ public enum SFXLoop {
     GRASS("src/main/resources/sound/sfx/steps/grass"),
     STONE("src/main/resources/sound/sfx/steps/stone");
 
-
-
-    private String path;
+    private final String path;
     SFXLoop(String path){
         this.path = path;
     }
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SfxOnce.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SfxOnce.java
index 5ba46507ba8ff65d43731dda20d52cd721ac97ef..1a54dde4ef7f1c6349b83ce3ba217ec3556eb609 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SfxOnce.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SfxOnce.java
@@ -5,23 +5,33 @@ import javafx.scene.media.AudioClip;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 
+import java.util.Objects;
+
 public class SfxOnce extends Thread {
     private static final Logger log = LogManager.getLogger(SfxOnce.class);
     private SFX sfx;
-    private Persistence persistence = Persistence.getInstance();
+    private boolean isNotPlaying;
+    private final Persistence persistence = Persistence.getInstance();
 
     @Override
     public void run() {
         String path = sfx.getPath();
         log.info(path);
         String resource = path.substring(18); // Begins at Ressource Folder
-        AudioClip audioClip = new AudioClip(getClass().getResource(resource).toExternalForm());
+        AudioClip audioClip = new AudioClip(Objects.requireNonNull(getClass().getResource(resource)).toExternalForm());
         audioClip.setVolume((double) persistence.getSettings().getSfxVolume() / 100);
+        this.isNotPlaying = false;
         audioClip.play();
     }
 
     public void startSound(SFX sfx) {
-        this.sfx = sfx;
-        start();
+            this.sfx = sfx;
+
+            start();
+
+    }
+
+    public boolean isNotPlaying() {
+        return isNotPlaying;
     }
 }
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SoundEffectsVolume.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SoundEffectsVolume.java
index dd0e5778676fe573fb34eafd04d58fcebb23fee3..edc7aa7111dee711f6e560cec00cad40889480c2 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SoundEffectsVolume.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SoundEffectsVolume.java
@@ -1,15 +1,9 @@
 package de.hdm_stuttgart.battlearena.Model.Sound;
 
 import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-
 
 public class SoundEffectsVolume {
-    private static final Logger log = LogManager.getLogger(SoundEffectsVolume.class);
-
-    private Persistence persistence = Persistence.getInstance();
-
+    private final Persistence persistence = Persistence.getInstance();
 
     public void setSfxVolume(int volume){
         persistence.getSettings().setSfxVolume(volume);
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SoundFileManager.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SoundFileManager.java
index 374036a8ff834065a960166e5e82fa97b7bebb9e..9beacfbf10b361dbe9229e49dc65ed99c9045c14 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SoundFileManager.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/SoundFileManager.java
@@ -1,8 +1,5 @@
 package de.hdm_stuttgart.battlearena.Model.Sound;
 
-import org.apache.logging.log4j.Logger;
-import org.apache.logging.log4j.LogManager;
-
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -13,7 +10,6 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 class SoundFileManager {
-    private static final Logger log = LogManager.getLogger(SoundFileManager.class);
     protected List<Path> getFilePathsFromResources(Path folderPath) throws IOException {
         List<Path> result;
         try (Stream<Path> walk = Files.walk(folderPath)) {
@@ -28,12 +24,10 @@ class SoundFileManager {
         int min = 0;
         int max = paths.size() - 1;
         int randomIndex = random.nextInt(max - min + 1 ) + min;
-        String randomPath = paths.get(randomIndex).toString();
-        return randomPath;
+        return paths.get(randomIndex).toString();
     }
     protected String convertPathToResourcePath(String randomPath){
         String normalizedPath = Paths.get(randomPath).toString().replace('\\', '/');
-        String resource = normalizedPath.substring(18); //18 = Begins at a at resourceFolder Level
-        return resource;
+        return normalizedPath.substring(18);
     }
 }
diff --git a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/WalkEffects.java b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/WalkEffects.java
index 8a7183ac456aaf490e6da256daf4118dcd88f488..4c5cdf1aa290ee25ea53e6296307861ffd4500c8 100644
--- a/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/WalkEffects.java
+++ b/src/main/java/de/hdm_stuttgart/battlearena/Model/Sound/WalkEffects.java
@@ -13,12 +13,13 @@ import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.List;
+import java.util.Objects;
 
 public class WalkEffects extends Thread{
     private static final Logger log = LogManager.getLogger(WalkEffects.class);
     private GameSceneController gameSceneController;
-    private SoundFileManager fileManager = new SoundFileManager();
-    private Persistence persistence = Persistence.getInstance();
+    private final SoundFileManager fileManager = new SoundFileManager();
+    private final Persistence persistence = Persistence.getInstance();
 
     @Override
     public void run() {
@@ -29,7 +30,7 @@ public class WalkEffects extends Thread{
         int playerPosX = player.getMapPosX();
         int playerPosY = player.getMapPosY();
         int mapTile = map[playerPosY/48][playerPosX/48];
-        SFXLoop sfx = tileSet[mapTile].getSoundeffect();
+        SFXLoop sfx = tileSet[mapTile].getSoundEffect();
         if(!(sfx == SFXLoop.NONE)) {
             Path path = Paths.get(sfx.getPath());
             List<Path> sfxPaths = null;
@@ -41,7 +42,7 @@ public class WalkEffects extends Thread{
             String randomPath = fileManager.getRandomFilePath(sfxPaths);
             String resource = fileManager.convertPathToResourcePath(randomPath);
 
-                AudioClip effect = new AudioClip(getClass().getResource(resource).toString());
+                AudioClip effect = new AudioClip(Objects.requireNonNull(getClass().getResource(resource)).toString());
                 effect.setVolume((double) persistence.getSettings().getSfxVolume() /100);
                 effect.play();
 
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
index 69c2210f37444080a8aa333616150fb0213c888e..cdcc19126a5093828ff6a7385daac63b5eed3fa2 100644
--- a/src/main/java/module-info.java
+++ b/src/main/java/module-info.java
@@ -19,6 +19,7 @@ module gui {
     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;
     exports de.hdm_stuttgart.battlearena.Model.Entity;
@@ -27,7 +28,10 @@ module gui {
     exports de.hdm_stuttgart.battlearena.Controller.Utilities;
     exports de.hdm_stuttgart.battlearena.Model.Multiplayer;
     exports de.hdm_stuttgart.battlearena.Model.Entity.GameplayObjects to javafx.fxml;
+    exports de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities;
     exports de.hdm_stuttgart.battlearena.Model.Sound;
     exports de.hdm_stuttgart.battlearena.Model.DataStorage.Classes;
     exports de.hdm_stuttgart.battlearena.Controller.Enum;
+    exports de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions;
+    exports de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.ENUMs;
 }
\ No newline at end of file
diff --git a/src/main/resources/fxml/GameScene.fxml b/src/main/resources/fxml/GameScene.fxml
index fcac9451049054bb9d6bb1fd3f5234f2db55be84..69f148c14eb421bae8ee120b8063eb326cb8709d 100644
--- a/src/main/resources/fxml/GameScene.fxml
+++ b/src/main/resources/fxml/GameScene.fxml
@@ -64,10 +64,10 @@
                <children>
                   <Pane VBox.vgrow="ALWAYS" />
                   <Label text="Time:" />
-                  <Label fx:id="time" text="00:30" />
+                  <Label text="00:00" />
                   <Pane VBox.vgrow="ALWAYS" />
                   <Label text="Round:" />
-                  <Label fx:id="round" text="1/3" />
+                  <Label text="1/3" />
                   <Pane VBox.vgrow="ALWAYS" />
                </children>
             </VBox>
diff --git a/src/main/resources/fxml/MultiplayerCreate.fxml b/src/main/resources/fxml/MultiplayerCreate.fxml
index d12125df3dd7a924880ef1b6ea27e85e567c9a40..9c714097d08c32d5e637f2325e0275e1770913f2 100644
--- a/src/main/resources/fxml/MultiplayerCreate.fxml
+++ b/src/main/resources/fxml/MultiplayerCreate.fxml
@@ -2,7 +2,7 @@
 
 <?import javafx.geometry.Insets?>
 <?import javafx.scene.control.Button?>
-<?import javafx.scene.control.RadioButton?>
+<?import javafx.scene.control.Label?>
 <?import javafx.scene.control.TextField?>
 <?import javafx.scene.layout.AnchorPane?>
 <?import javafx.scene.layout.HBox?>
@@ -13,33 +13,21 @@
 <VBox fx:id="parent" alignment="CENTER" prefHeight="400.0" prefWidth="600.0" spacing="20.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.hdm_stuttgart.battlearena.Controller.MultiplayerCreateController">
    <children>
       <Pane VBox.vgrow="ALWAYS" />
+      <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Multiplayer demo test" />
       <HBox alignment="TOP_CENTER" spacing="20.0">
          <children>
-            <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Text:" />
-            <TextField alignment="CENTER" />
+            <Text strokeType="OUTSIDE" strokeWidth="0.0" text="IP-Adresse:" />
+            <TextField fx:id="ip" alignment="CENTER" />
          </children>
          <VBox.margin>
             <Insets top="50.0" />
          </VBox.margin>
       </HBox>
-      <HBox alignment="TOP_CENTER" maxWidth="-Infinity" spacing="20.0">
-         <children>
-            <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Text:" />
-            <TextField alignment="CENTER" />
-         </children>
-      </HBox>
-      <HBox alignment="TOP_CENTER" spacing="10.0">
-         <children>
-            <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Text:" />
-            <RadioButton mnemonicParsing="false" text="Yes" />
-            <RadioButton mnemonicParsing="false" text="No" />
-         </children>
-      </HBox>
       <AnchorPane minHeight="-Infinity" prefHeight="39.0" prefWidth="600.0">
          <children>
             <VBox alignment="TOP_CENTER" layoutX="250.0" prefHeight="200.0" prefWidth="100.0" AnchorPane.leftAnchor="250.0" AnchorPane.rightAnchor="250.0">
                <children>
-                  <Text strokeType="OUTSIDE" strokeWidth="0.0" text="Text" />
+                  <Label fx:id="errorMessage" />
                </children>
             </VBox>
          </children>
@@ -47,7 +35,7 @@
             <Insets top="20.0" />
          </VBox.margin>
       </AnchorPane>
-      <Button mnemonicParsing="false" text="Start" />
+      <Button mnemonicParsing="false" onAction="#start" text="Start" />
       <Button mnemonicParsing="false" onAction="#backButton" text="Back" />
       <Pane VBox.vgrow="ALWAYS" />
       <Pane VBox.vgrow="ALWAYS" />
diff --git a/src/main/resources/fxml/MultiplayerJoin.fxml b/src/main/resources/fxml/MultiplayerJoin.fxml
index 50328301d12e960ca362bc1a19d067f58d41a4d9..df006bb5e12a3979e4744b1bef644c4de09d29e6 100644
--- a/src/main/resources/fxml/MultiplayerJoin.fxml
+++ b/src/main/resources/fxml/MultiplayerJoin.fxml
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <?import javafx.scene.control.Button?>
+<?import javafx.scene.control.Label?>
 <?import javafx.scene.control.TextField?>
 <?import javafx.scene.layout.Pane?>
 <?import javafx.scene.layout.VBox?>
@@ -10,9 +11,9 @@
    <children>
       <Pane maxHeight="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" />
       <Text strokeType="OUTSIDE" strokeWidth="0.0" text="IP Adress:" />
-      <TextField alignment="CENTER" maxWidth="-Infinity" />
-      <Button mnemonicParsing="false" text="Connect" VBox.vgrow="ALWAYS" />
-      <Text strokeType="OUTSIDE" strokeWidth="0.0" text="[Error Message]" />
+      <TextField fx:id="ip" alignment="CENTER" maxWidth="-Infinity" />
+      <Button mnemonicParsing="false" onAction="#connect" text="Connect" VBox.vgrow="ALWAYS" />
+      <Label fx:id="errorMessage" alignment="CENTER" contentDisplay="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" wrapText="true" VBox.vgrow="ALWAYS" />
       <Pane maxHeight="1.7976931348623157E308" prefHeight="200.0" prefWidth="200.0" VBox.vgrow="ALWAYS" />
       <Button alignment="CENTER" mnemonicParsing="false" onAction="#backButton" text="Back" />
       <Pane maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="20.0" VBox.vgrow="ALWAYS" />
diff --git a/src/main/resources/fxml/SkinSelectionMultiplayer.fxml b/src/main/resources/fxml/SkinSelectionMultiplayer.fxml
new file mode 100644
index 0000000000000000000000000000000000000000..6cbd1f4fa4eda9d1119884b20551244c8c286a71
--- /dev/null
+++ b/src/main/resources/fxml/SkinSelectionMultiplayer.fxml
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?import javafx.scene.control.Button?>
+<?import javafx.scene.control.Label?>
+<?import javafx.scene.control.ToggleButton?>
+<?import javafx.scene.control.ToggleGroup?>
+<?import javafx.scene.image.Image?>
+<?import javafx.scene.image.ImageView?>
+<?import javafx.scene.layout.HBox?>
+<?import javafx.scene.layout.VBox?>
+
+<VBox fx:id="parent" alignment="CENTER" prefHeight="400.0" prefWidth="600.0" spacing="20.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.hdm_stuttgart.battlearena.Controller.SkinSelectionMultiplayerController">
+   <children>
+      <Label text="Select a character" />
+      <HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0" spacing="40.0">
+         <children>
+            <ToggleButton contentDisplay="TOP" mnemonicParsing="false" styleClass="skinSelection" text="High Born">
+               <graphic>
+                  <ImageView fx:id="selection1" fitHeight="700.0" fitWidth="700.0" pickOnBounds="true" preserveRatio="true">
+                     <image>
+                        <Image url="@../textures/player/high_res/highBorn.png" />
+                     </image>
+                  </ImageView>
+               </graphic>
+               <toggleGroup>
+                  <ToggleGroup fx:id="toggleGroup" />
+               </toggleGroup>
+            </ToggleButton>
+            <ToggleButton contentDisplay="TOP" mnemonicParsing="false" styleClass="skinSelection" text="Human" toggleGroup="$toggleGroup">
+               <graphic>
+                  <ImageView fx:id="selection2" fitHeight="700.0" fitWidth="700.0" pickOnBounds="true" preserveRatio="true">
+                     <image>
+                        <Image url="@../textures/player/high_res/human.png" />
+                     </image>
+                  </ImageView>
+               </graphic>
+            </ToggleButton>
+            <ToggleButton contentDisplay="TOP" mnemonicParsing="false" styleClass="skinSelection" text="Sentinel" toggleGroup="$toggleGroup">
+               <graphic>
+                  <ImageView fx:id="selection3" fitHeight="700.0" fitWidth="700.0" pickOnBounds="true" preserveRatio="true">
+                     <image>
+                        <Image url="@../textures/player/high_res/sentinel.png" />
+                     </image>
+                  </ImageView>
+               </graphic>
+            </ToggleButton>
+         </children>
+      </HBox>
+      <Button mnemonicParsing="false" onAction="#gameScene" text="Next" />
+      <Button mnemonicParsing="false" onAction="#backButton" text="Back" />
+   </children>
+</VBox>
diff --git a/src/main/resources/player/appSettings.json b/src/main/resources/player/appSettings.json
index 921bbf90278d492de2b539de81a82125ac7e11d6..ac6b7e58fa58ee25e2070c5cdfb9b8324bdddc6b 100644
--- a/src/main/resources/player/appSettings.json
+++ b/src/main/resources/player/appSettings.json
@@ -1,4 +1,4 @@
 {
-  "sfxVolume": 46,
-  "musicVolume": 46
+  "sfxVolume": 50,
+  "musicVolume": 50
 }
\ No newline at end of file
diff --git a/src/main/resources/player/playerAccount.json b/src/main/resources/player/playerAccount.json
index 21486d136b1a3c3d8208708e1b4fbc47b86c115d..9a62cf578b5cf130a5df3b05ca58d9b120c9e6ae 100644
--- a/src/main/resources/player/playerAccount.json
+++ b/src/main/resources/player/playerAccount.json
@@ -1,5 +1,5 @@
 {
-  "playerName": "Mikazu",
-  "accountPassword": "a78ee63a19597e48bce0b72d6079b8cfa5b6c976",
-  "accountType": "ONLINE"
+  "playerName": "",
+  "accountPassword": "",
+  "accountType": "NONE"
 }
\ No newline at end of file
diff --git a/src/main/resources/textures/player/high_born/HighBornLeft00.png b/src/main/resources/textures/player/high_born/HighBornLeft00.png
new file mode 100644
index 0000000000000000000000000000000000000000..193e2793a8d393c40bd664f2c63fa94fec490871
Binary files /dev/null and b/src/main/resources/textures/player/high_born/HighBornLeft00.png differ
diff --git a/src/main/resources/textures/player/high_born/HighBornLeft01.png b/src/main/resources/textures/player/high_born/HighBornLeft01.png
new file mode 100644
index 0000000000000000000000000000000000000000..88351737d1c88425b50fab1f4adee8d58fe6f542
Binary files /dev/null and b/src/main/resources/textures/player/high_born/HighBornLeft01.png differ
diff --git a/src/main/resources/textures/player/high_born/HighBornRight00.png b/src/main/resources/textures/player/high_born/HighBornRight00.png
new file mode 100644
index 0000000000000000000000000000000000000000..4bdaedb2875887d116078749083287178d7f3ea4
Binary files /dev/null and b/src/main/resources/textures/player/high_born/HighBornRight00.png differ
diff --git a/src/main/resources/textures/player/high_born/HighBornRight01.png b/src/main/resources/textures/player/high_born/HighBornRight01.png
new file mode 100644
index 0000000000000000000000000000000000000000..ad61763d16ede5343988afd6b7d43e175eb816b2
Binary files /dev/null and b/src/main/resources/textures/player/high_born/HighBornRight01.png differ
diff --git a/src/main/resources/textures/player/high_born/HighBornUp00.png b/src/main/resources/textures/player/high_born/HighBornUp00.png
new file mode 100644
index 0000000000000000000000000000000000000000..472dbe8910d5fe29a33d12b8fc2e08e543dd1b39
Binary files /dev/null and b/src/main/resources/textures/player/high_born/HighBornUp00.png differ
diff --git a/src/main/resources/textures/player/high_born/HighBornUp01.png b/src/main/resources/textures/player/high_born/HighBornUp01.png
new file mode 100644
index 0000000000000000000000000000000000000000..6b75b7bb9c4782f08a9df99868d46e79a1c6c9b2
Binary files /dev/null and b/src/main/resources/textures/player/high_born/HighBornUp01.png differ
diff --git a/src/main/resources/textures/player/sentinels/SentinelLeft00.png b/src/main/resources/textures/player/sentinels/SentinelLeft00.png
new file mode 100644
index 0000000000000000000000000000000000000000..8eacc435ee4dace2b91edafabd1f899172ad6e4f
Binary files /dev/null and b/src/main/resources/textures/player/sentinels/SentinelLeft00.png differ
diff --git a/src/main/resources/textures/player/sentinels/SentinelLeft01.png b/src/main/resources/textures/player/sentinels/SentinelLeft01.png
new file mode 100644
index 0000000000000000000000000000000000000000..4af0e22a9ab12a12f9a9be7341d788fa91eee276
Binary files /dev/null and b/src/main/resources/textures/player/sentinels/SentinelLeft01.png differ
diff --git a/src/main/resources/textures/player/sentinels/SentinelRight00.png b/src/main/resources/textures/player/sentinels/SentinelRight00.png
new file mode 100644
index 0000000000000000000000000000000000000000..fc0148e611b10c843834f512efb0ca2dc7686329
Binary files /dev/null and b/src/main/resources/textures/player/sentinels/SentinelRight00.png differ
diff --git a/src/main/resources/textures/player/sentinels/SentinelRight01.png b/src/main/resources/textures/player/sentinels/SentinelRight01.png
new file mode 100644
index 0000000000000000000000000000000000000000..b8ba03c3ee0247b87e1bc077bba179b554a22867
Binary files /dev/null and b/src/main/resources/textures/player/sentinels/SentinelRight01.png differ
diff --git a/src/main/resources/textures/player/sentinels/SentinelUp00.png b/src/main/resources/textures/player/sentinels/SentinelUp00.png
new file mode 100644
index 0000000000000000000000000000000000000000..f6d4c22d631e96f85f6f6e0914fae2c6e1556fbc
Binary files /dev/null and b/src/main/resources/textures/player/sentinels/SentinelUp00.png differ
diff --git a/src/main/resources/textures/player/sentinels/SentinelUp01.png b/src/main/resources/textures/player/sentinels/SentinelUp01.png
new file mode 100644
index 0000000000000000000000000000000000000000..b9e36ac5ae3221b359417f50ba48835809d1bb2b
Binary files /dev/null and b/src/main/resources/textures/player/sentinels/SentinelUp01.png differ
diff --git a/src/test/java/SoundEffectsTest.java b/src/test/java/SoundEffectsTest.java
deleted file mode 100644
index 890ff6f49ac91687c757a08f287fc34d7396bfcf..0000000000000000000000000000000000000000
--- a/src/test/java/SoundEffectsTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions.DatabaseException;
-import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence;
-import de.hdm_stuttgart.battlearena.Model.Sound.SoundEffectsVolume;
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.junit.jupiter.api.BeforeEach;
-
-public class SoundEffectsTest {
-    private static final Logger log = LogManager.getLogger(SoundEffectsTest.class);
-
-    private SoundEffectsVolume soundEffects;
-    private Persistence persistence;
-
-    @BeforeEach
-    void SetUp(){
-        soundEffects = new SoundEffectsVolume();
-        persistence = Persistence.getInstance();
-        try {
-            persistence.loadSettings();
-        } catch (DatabaseException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-
-    /*void playSoundEffectOnceTest(){
-        soundEffects.playSoundEffectOnce(SFX.BOMB);
-        Assertions.assertTrue(soundEffects.isSoundEffectPlayedTest());
-    }
-
-    @Test
-    void playSoundEffectOnceVolumeTest(){
-        soundEffects.playSoundEffectOnce(SFX.SWORD_HIT);
-        soundEffects.setSfxVolume(50);
-        Assertions.assertAll(()->{
-            Assertions.assertTrue(soundEffects.isSoundEffectPlayedTest());
-            Assertions.assertEquals(50, persistence.getSettings().getSfxVolume());
-        });
-    }*/
-
-
-
-}
diff --git a/src/test/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/ConnectionHandlerTest.java b/src/test/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/ConnectionHandlerTest.java
index fa4a0e2aee3c7a7338b65f7c61f830c171e7cb36..c4b558a00b8f92e604fe2a1a554788da42faaa8d 100644
--- a/src/test/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/ConnectionHandlerTest.java
+++ b/src/test/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/ConnectionHandlerTest.java
@@ -49,95 +49,95 @@ class ConnectionHandlerTest {
 
     @Test
     void getPlayerAttacking() {
-        assertEquals(true,ConnectionHandler.getPlayerAttacking());
+        assertEquals(true,handler.getPlayerAttacking());
     }
 
     @Test
     void setPlayerAttacking() {
-        ConnectionHandler.setPlayerAttacking(false);
-        assertEquals(false,ConnectionHandler.getPlayerAttacking());
-        ConnectionHandler.setPlayerAttacking(true);
+        handler.setPlayerAttacking(false);
+        assertEquals(false,handler.getPlayerAttacking());
+        handler.setPlayerAttacking(true);
     }
 
     @Test
     void getEnemyAttacking() {
-        assertEquals(false,ConnectionHandler.getEnemyAttacking());
+        assertEquals(false,handler.getEnemyAttacking());
     }
 
     @Test
     void setEnemyAttacking() {
-        ConnectionHandler.setEnemyAttacking(true);
-        assertEquals(true,ConnectionHandler.getEnemyAttacking());
-        ConnectionHandler.setEnemyAttacking(false);
+        handler.setEnemyAttacking(true);
+        assertEquals(true,handler.getEnemyAttacking());
+        handler.setEnemyAttacking(false);
     }
 
     @Test
     void getPlayerClass() {
-        assertEquals(EntityClass.HUMAN, ConnectionHandler.getPlayerClass());
+        assertEquals(EntityClass.HUMAN, handler.getPlayerClass());
 
     }
 
     @Test
     void setPlayerClass() {
-        ConnectionHandler.setPlayerClass(EntityClass.HIGH_BORN);
-        assertEquals(EntityClass.HIGH_BORN, ConnectionHandler.getPlayerClass());
-        ConnectionHandler.setPlayerClass(EntityClass.HUMAN);
+        handler.setPlayerClass(EntityClass.HIGH_BORN);
+        assertEquals(EntityClass.HIGH_BORN, handler.getPlayerClass());
+        handler.setPlayerClass(EntityClass.HUMAN);
     }
 
     @Test
     void getEnemyClass() {
-        assertEquals(EntityClass.HUMAN, ConnectionHandler.getEnemyClass());
+        assertEquals(EntityClass.HUMAN, handler.getEnemyClass());
     }
 
     @Test
     void setEnemyClass() {
-        ConnectionHandler.setEnemyClass(EntityClass.HIGH_BORN);
-        assertEquals(EntityClass.HIGH_BORN, ConnectionHandler.getEnemyClass());
-        ConnectionHandler.setEnemyClass(EntityClass.HUMAN);
+        handler.setEnemyClass(EntityClass.HIGH_BORN);
+        assertEquals(EntityClass.HIGH_BORN, handler.getEnemyClass());
+        handler.setEnemyClass(EntityClass.HUMAN);
     }
 
     @Test
     void getPlayerWalkDirection() {
-        assertEquals(EntityDirection.DOWN, ConnectionHandler.getPlayerWalkDirection());
+        assertEquals(EntityDirection.DOWN, handler.getPlayerWalkDirection());
     }
 
     @Test
     void setPlayerWalkDirection() {
-        ConnectionHandler.setPlayerWalkDirection(EntityDirection.UP);
-        assertEquals(EntityDirection.UP, ConnectionHandler.getPlayerWalkDirection());
-        ConnectionHandler.setPlayerWalkDirection(EntityDirection.DOWN);
+        handler.setPlayerWalkDirection(EntityDirection.UP);
+        assertEquals(EntityDirection.UP, handler.getPlayerWalkDirection());
+        handler.setPlayerWalkDirection(EntityDirection.DOWN);
     }
 
     @Test
     void getEnemyWalkDirection() {
-        assertEquals(EntityDirection.DOWN, ConnectionHandler.getPlayerWalkDirection());
+        assertEquals(EntityDirection.DOWN, handler.getPlayerWalkDirection());
     }
 
     @Test
     void setEnemyWalkDirection() {
-        ConnectionHandler.setEnemyWalkDirection(EntityDirection.UP);
-        assertEquals(EntityDirection.UP, ConnectionHandler.getEnemyWalkDirection());
+        handler.setEnemyWalkDirection(EntityDirection.UP);
+        assertEquals(EntityDirection.UP, handler.getEnemyWalkDirection());
     }
 
     @Test
     void getPlayerHealth() {
-        assertEquals(10, ConnectionHandler.getPlayerHealth());
+        assertEquals(10, handler.getPlayerHealth());
     }
 
     @Test
     void setPlayerHealth() {
-        ConnectionHandler.setPlayerHealth(5);
-        assertEquals(5, ConnectionHandler.getPlayerHealth());
+        handler.setPlayerHealth(5);
+        assertEquals(5, handler.getPlayerHealth());
     }
 
     @Test
     void getEnemyHealth() {
-        assertEquals(10, ConnectionHandler.getEnemyHealth());
+        assertEquals(10, handler.getEnemyHealth());
     }
 
     @Test
     void setEnemyHealth() {
-        ConnectionHandler.setEnemyHealth(5);
-        assertEquals(5, ConnectionHandler.getEnemyHealth());
+        handler.setEnemyHealth(5);
+        assertEquals(5, handler.getEnemyHealth());
     }
 }
\ No newline at end of file
diff --git a/src/test/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/IPAddressValidatorTest.java b/src/test/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/IPAddressValidatorTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..25760d673c71f7a0a9fe48b0c2836632748bcd18
--- /dev/null
+++ b/src/test/java/de/hdm_stuttgart/battlearena/Model/Multiplayer/Utilities/IPAddressValidatorTest.java
@@ -0,0 +1,14 @@
+package de.hdm_stuttgart.battlearena.Model.Multiplayer.Utilities;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class IPAddressValidatorTest {
+
+    @Test
+    void validate() {
+        assertTrue(IPAddressValidator.validate("192.168.0.1"));
+        assertFalse(IPAddressValidator.validate("aaabbb"));
+    }
+}
\ No newline at end of file
diff --git a/src/test/java/MusicPlayerTest.java b/src/test/java/de/hdm_stuttgart/battlearena/Model/Sound/MusicPlayerTest.java
similarity index 78%
rename from src/test/java/MusicPlayerTest.java
rename to src/test/java/de/hdm_stuttgart/battlearena/Model/Sound/MusicPlayerTest.java
index e1f7d5829785962f744ae4c0ab7dd6ef8f7c51ec..376ac88464fa7010d91c31a8f97069a5b316fd65 100644
--- a/src/test/java/MusicPlayerTest.java
+++ b/src/test/java/de/hdm_stuttgart/battlearena/Model/Sound/MusicPlayerTest.java
@@ -1,19 +1,15 @@
+package de.hdm_stuttgart.battlearena.Model.Sound;
+
 import de.hdm_stuttgart.battlearena.Controller.Enum.GameState;
 import de.hdm_stuttgart.battlearena.Main.Driver;
 import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions.DatabaseException;
 import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence;
 import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.RuntimeInfo;
-import de.hdm_stuttgart.battlearena.Model.Sound.MusicPlayer;
-import javafx.application.Application;
 import javafx.application.Platform;
 import javafx.scene.media.MediaPlayer;
-import javafx.stage.Stage;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
-import org.junit.jupiter.api.AfterEach;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.*;
 import org.testfx.api.FxToolkit;
 
 import java.util.concurrent.TimeUnit;
@@ -21,19 +17,29 @@ import java.util.concurrent.TimeoutException;
 
 import static org.testfx.util.WaitForAsyncUtils.sleep;
 
-public class MusicPlayerTest extends Application {
+public class MusicPlayerTest {
     private static final Logger log = LogManager.getLogger(MusicPlayerTest.class);
 
-    Persistence persistence;
-    RuntimeInfo runtimeInfo;
-    MusicPlayer musicPlayer;
-    @BeforeEach
-    void setup(){
-    persistence = Persistence.getInstance();
-    musicPlayer = MusicPlayer.getInstance();
-    runtimeInfo = RuntimeInfo.getInstance();
+    private static Persistence persistence;
+    private static RuntimeInfo runtimeInfo;
+    private static MusicPlayer musicPlayer;
+
+    @BeforeAll
+    static void setUpClass() {
+        try {
+            FxToolkit.registerPrimaryStage();
+        } catch (TimeoutException e) {
+            throw new RuntimeException(e);
+        }
+
+    }
+
+    @BeforeAll
+    static void setUp() {
+        persistence = Persistence.getInstance();
+        musicPlayer = MusicPlayer.getInstance();
+        runtimeInfo = RuntimeInfo.getInstance();
 
-    runtimeInfo.setGameState(GameState.NONE);
         try {
             persistence.loadSettings();
         } catch (DatabaseException e) {
@@ -41,16 +47,16 @@ public class MusicPlayerTest extends Application {
         }
 
         try {
-            FxToolkit.registerPrimaryStage();
+            FxToolkit.setupApplication(() -> new Driver());
         } catch (TimeoutException e) {
             throw new RuntimeException(e);
         }
+
     }
 
-    @AfterEach
-    void tearDown(){
+    @AfterAll
+    static void tearDownClass() {
         runtimeInfo.setGameState(GameState.NONE);
-        musicPlayer.getScheduler().shutdown();
         try {
             FxToolkit.cleanupStages();
         } catch (TimeoutException e) {
@@ -58,23 +64,21 @@ public class MusicPlayerTest extends Application {
         }
     }
 
-
     @Test
-    void startMusicTest(){
+    public void startMusicTest() {
         Platform.runLater(()->{
             musicPlayer.startGameStateMonitoring();
             runtimeInfo.setGameState(GameState.MENU);
         });
 
         sleep(200, TimeUnit.MILLISECONDS);
-
-        MediaPlayer player = musicPlayer.getMediaPlayer();
+        MediaPlayer mediaPlayer = musicPlayer.getMediaPlayer();
         Assertions.assertAll(()->{
             // Test: Gamestate wird geupdatet in der Runtimeinfo sowie in der MusicPlayer-Klasse
             Assertions.assertEquals(GameState.MENU, runtimeInfo.getGameState());
             Assertions.assertEquals(GameState.MENU, musicPlayer.getMusicPlayerGameState());
-            Assertions.assertNotNull(player);
-            Assertions.assertEquals(MediaPlayer.Status.PLAYING, player.getStatus());
+            Assertions.assertNotNull(mediaPlayer);
+            Assertions.assertEquals(MediaPlayer.Status.PLAYING, mediaPlayer.getStatus());
         });
     }
 
@@ -88,7 +92,7 @@ public class MusicPlayerTest extends Application {
                     runtimeInfo.setGameState(GameState.TEST);
                 });
             });
-            Assertions.assertTrue(musicPlayer.getMediaPlayer() == null);
+
         });
     }
 
@@ -128,8 +132,4 @@ public class MusicPlayerTest extends Application {
         });
     }
 
-    @Override
-    public void start(Stage stage) throws Exception {
-        new Driver().start(stage);
-    }
 }
diff --git a/src/test/java/de/hdm_stuttgart/battlearena/Model/Sound/SfxOnceTest.java b/src/test/java/de/hdm_stuttgart/battlearena/Model/Sound/SfxOnceTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..637676bfe529fa41380ef3ddad67c04a04e6e85f
--- /dev/null
+++ b/src/test/java/de/hdm_stuttgart/battlearena/Model/Sound/SfxOnceTest.java
@@ -0,0 +1,83 @@
+package de.hdm_stuttgart.battlearena.Model.Sound;
+
+import de.hdm_stuttgart.battlearena.Main.Driver;
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Exceptions.DatabaseException;
+import de.hdm_stuttgart.battlearena.Model.DataStorage.Classes.Persistence;
+import javafx.application.Platform;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.testfx.api.FxToolkit;
+
+import java.util.concurrent.TimeoutException;
+
+public class SfxOnceTest {
+    private static final Logger log = LogManager.getLogger(SfxOnceTest.class);
+
+    private static SoundEffectsVolume soundEffectsVolume;
+    private static Persistence persistence;
+    SfxOnce sfx;
+
+    @BeforeAll
+    public static void setUpClass() {
+        try {
+            FxToolkit.registerPrimaryStage();
+        } catch (TimeoutException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @BeforeAll
+    public static void setUp(){
+        persistence = Persistence.getInstance();
+        soundEffectsVolume = new SoundEffectsVolume();
+
+        try {
+            persistence.loadSettings();
+        } catch (DatabaseException e) {
+            throw new RuntimeException(e);
+        }
+
+        try {
+            FxToolkit.setupApplication(() -> new Driver());
+        } catch (TimeoutException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @AfterAll
+    public static void tearDownClass(){
+        try {
+            FxToolkit.cleanupStages();
+        } catch (TimeoutException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Test
+    public void startOTSFXTest(){
+        sfx = new SfxOnce();
+            Platform.runLater(() -> {
+                sfx.startSound(SFX.BOMB);
+            });
+
+        Assertions.assertFalse(sfx.isNotPlaying());
+    }
+
+    @Test
+    public void setSoundEffectsVolumeTest(){
+        sfx = new SfxOnce();
+        Platform.runLater(()->{
+            sfx.startSound(SFX.COIN_COLLECTED);
+        });
+        soundEffectsVolume.setSfxVolume(50);
+
+        Assertions.assertAll(()->{
+            Assertions.assertEquals(50, persistence.getSettings().getSfxVolume());
+            Assertions.assertFalse(sfx.isNotPlaying());
+        });
+    }
+}