diff --git a/core/assets-raw/sprites/ui/icons/icon-settings.png b/core/assets-raw/sprites/ui/icons/icon-settings.png
index a1e2dad31c..8c0cfc49f6 100644
Binary files a/core/assets-raw/sprites/ui/icons/icon-settings.png and b/core/assets-raw/sprites/ui/icons/icon-settings.png differ
diff --git a/core/assets/sprites/sprites.png b/core/assets/sprites/sprites.png
index 33ad1545c8..94daf26dec 100644
Binary files a/core/assets/sprites/sprites.png and b/core/assets/sprites/sprites.png differ
diff --git a/core/src/io/anuke/mindustry/Vars.java b/core/src/io/anuke/mindustry/Vars.java
index 941b44b71a..3e6b6d593f 100644
--- a/core/src/io/anuke/mindustry/Vars.java
+++ b/core/src/io/anuke/mindustry/Vars.java
@@ -23,10 +23,10 @@ import java.util.Locale;
 
 public class Vars{
 	public static final String versionName = "Mindustry";
+	public static final String versionType = "Beta";
 	public static final byte versionBuild = 20;
 	public static final byte versionMajor = 3;
 	public static final byte versionMinor = 3;
-	public static final String versionType = "Beta";
 
 	public static final boolean testAndroid = false;
 	//shorthand for whether or not this is running on android
diff --git a/core/src/io/anuke/mindustry/core/NetClient.java b/core/src/io/anuke/mindustry/core/NetClient.java
index f28dff41f5..8658182f9a 100644
--- a/core/src/io/anuke/mindustry/core/NetClient.java
+++ b/core/src/io/anuke/mindustry/core/NetClient.java
@@ -34,12 +34,13 @@ import java.nio.ByteBuffer;
 import static io.anuke.mindustry.Vars.*;
 
 public class NetClient extends Module {
-    boolean connecting = false;
-    boolean gotData = false;
-    boolean kicked = false;
-    IntSet recieved = new IntSet();
-    float playerSyncTime = 2;
-    float dataTimeout = 60*18; //18 seconds timeout
+    private final static float dataTimeout = 60*18; //18 seconds timeout
+    private final static float playerSyncTime = 2;
+
+    private boolean connecting = false;
+    private boolean gotData = false;
+    private boolean kicked = false;
+    private IntSet recieved = new IntSet();
 
     public NetClient(){
 
diff --git a/core/src/io/anuke/mindustry/entities/Player.java b/core/src/io/anuke/mindustry/entities/Player.java
index 305c70c297..d0332bb426 100644
--- a/core/src/io/anuke/mindustry/entities/Player.java
+++ b/core/src/io/anuke/mindustry/entities/Player.java
@@ -256,6 +256,8 @@ public class Player extends SyncEntity{
 
 	@Override
 	public void write(ByteBuffer data) {
+		//TODO written angle is always 0
+
 		data.putFloat(x);
 		data.putFloat(y);
 		data.putFloat(angle);
diff --git a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java
index e69aa70c6c..dd73be6517 100644
--- a/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java
+++ b/core/src/io/anuke/mindustry/ui/fragments/HudFragment.java
@@ -24,6 +24,7 @@ public class HudFragment implements Fragment{
 	private ImageButton menu, flip;
 	private Table respawntable;
 	private Table wavetable;
+	private Label infolabel;
 	private boolean shown = true;
 
 	public void build(){
@@ -54,10 +55,12 @@ public class HudFragment implements Fragment{
 						if (shown) {
 							blockfrag.toggle(false, dur, in);
 							wavetable.actions(Actions.translateBy(0, wavetable.getHeight() + dsize, dur, in), Actions.call(() -> shown = false));
+							infolabel.actions(Actions.translateBy(0, wavetable.getHeight(), dur, in), Actions.call(() -> shown = false));
 						} else {
 							shown = true;
 							blockfrag.toggle(true, dur, in);
 							wavetable.actions(Actions.translateBy(0, -wavetable.getTranslation().y, dur, in));
+							infolabel.actions(Actions.translateBy(0, -infolabel.getTranslation().y, dur, in));
 						}
 
 					}).get();
@@ -78,6 +81,24 @@ public class HudFragment implements Fragment{
 						}
 					}).get();
 
+					new imagebutton("icon-settings", isize, () -> {
+						if (Net.active() && android) {
+							if (ui.chatfrag.chatOpen()) {
+								ui.chatfrag.hide();
+							} else {
+								ui.chatfrag.toggle();
+							}
+						} else {
+							ui.settings.show();
+						}
+					}).update(i -> {
+						if (Net.active() && android) {
+							i.getStyle().imageUp = Core.skin.getDrawable("icon-chat");
+						} else {
+							i.getStyle().imageUp = Core.skin.getDrawable("icon-settings");
+						}
+					}).get();
+
 				}}.end();
 
 				row();
@@ -92,20 +113,14 @@ public class HudFragment implements Fragment{
 
 				visible(() -> !state.is(State.menu));
 
-				Label fps = new Label(() -> (Settings.getBool("fps") ? (Gdx.graphics.getFramesPerSecond() + " FPS") +
-						(threads.isEnabled() ?  " / " + threads.getFPS() + " TPS" : "") + (Net.client() && !gwt ? " / Ping: " + Net.getPing() : "") : ""));
+				infolabel = new Label(() -> (Settings.getBool("fps") ? (Gdx.graphics.getFramesPerSecond() + " FPS") +
+						(threads.isEnabled() ?  " / " + threads.getFPS() + " TPS" : "") + (Net.client() && !gwt ? "\nPing: " + Net.getPing() : "") : ""));
 				row();
-				add(fps).size(-1);
+				add(infolabel).size(-1);
 
 			}}.end();
 
-			new imagebutton("icon-chat", 40f, () -> {
-				if (ui.chatfrag.chatOpen()) {
-					ui.chatfrag.hide();
-				} else {
-					ui.chatfrag.toggle();
-				}
-			}).visible(() -> Net.active() && android).top().left().size(58f).get();
+
 
 		}}.end();
 
@@ -181,12 +196,14 @@ public class HudFragment implements Fragment{
 					getEnemiesRemaining() :
 						(control.tutorial().active() || state.mode.disableWaveTimer) ? "$text.waiting"
 								: Bundles.format("text.wave.waiting", (int) (state.wavetime / 60f)))
-				.minWidth(126).padLeft(-6).padRight(-12).left();
+				.minWidth(126).padLeft(-6).left();
 
 				margin(10f);
 				get().marginLeft(6);
 			}}.left().end();
 
+			add().growX();
+
 			playButton(uheight);
 		}}.height(uheight).fillX().expandX().end().get();
 		wavetable.getParent().getParent().swapActor(wavetable.getParent(), menu.getParent());
@@ -195,7 +212,7 @@ public class HudFragment implements Fragment{
 	private void playButton(float uheight){
 		new imagebutton("icon-play", 30f, () -> {
 			state.wavetime = 0f;
-		}).height(uheight).fillX().right().padTop(-8f).padBottom(-12f).padRight(-36).width(40f).update(l->{
+		}).height(uheight).fillX().right().padTop(-8f).padBottom(-12f).padLeft(-15).padRight(-10).width(40f).update(l->{
 			boolean vis = state.enemies <= 0 && (Net.server() || !Net.active());
 			boolean paused = state.is(State.paused) || !vis;
 			
diff --git a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java
index 8cc02fed83..03af96f574 100644
--- a/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java
+++ b/core/src/io/anuke/mindustry/ui/fragments/MenuFragment.java
@@ -97,8 +97,9 @@ public class MenuFragment implements Fragment{
 
 		//version info
 		new table(){{
+			visible(() -> state.is(State.menu));
 			abottom().aleft();
-			new label(versionName + " " + versionMajor + "." + versionMinor + " " + versionType + " | build " + versionBuild);
+			new label(versionName + " " + versionMajor + "." + versionMinor + " " + versionType + " / build " + versionBuild);
 		}}.end();
 	}
 }