diff --git a/src/main/java/com/comandante/creeper/managers/GameManager.java b/src/main/java/com/comandante/creeper/managers/GameManager.java
index 1fd932d57640dc26798ccad7eb44d83daee17c0c..4877279bf24cb00281ad663f070ee07cdc313c0d 100644
--- a/src/main/java/com/comandante/creeper/managers/GameManager.java
+++ b/src/main/java/com/comandante/creeper/managers/GameManager.java
@@ -34,10 +34,16 @@ public class GameManager {
 
     private final RoomManager roomManager;
     private final PlayerManager playerManager;
+    private final NewUserRegistrationManager newUserRegistrationManager;
+
+    public NewUserRegistrationManager getNewUserRegistrationManager() {
+        return newUserRegistrationManager;
+    }
 
     public GameManager(RoomManager roomManager, PlayerManager playerManager) {
         this.roomManager = roomManager;
         this.playerManager = playerManager;
+        this.newUserRegistrationManager = new NewUserRegistrationManager(playerManager);
     }
 
     public RoomManager getRoomManager() {
diff --git a/src/main/java/com/comandante/creeper/managers/NewUserRegistrationManager.java b/src/main/java/com/comandante/creeper/managers/NewUserRegistrationManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..642c242010c6394f2b3874941733a46921ebfc09
--- /dev/null
+++ b/src/main/java/com/comandante/creeper/managers/NewUserRegistrationManager.java
@@ -0,0 +1,60 @@
+package com.comandante.creeper.managers;
+
+
+import com.comandante.creeper.model.Player;
+import com.comandante.creeper.model.PlayerMetadata;
+import com.comandante.creeper.server.CreeperSession;
+import com.google.common.base.Optional;
+import org.jboss.netty.channel.MessageEvent;
+
+public class NewUserRegistrationManager {
+
+    private final PlayerManager playerManager;
+
+    public NewUserRegistrationManager(PlayerManager playerManager) {
+        this.playerManager = playerManager;
+    }
+
+    public void handle(CreeperSession session, MessageEvent e) {
+        switch (session.getState()) {
+            case newUserPromptedForUsername:
+                if (setDesiredUsername(session, e)) {
+                    promptForDesirePassword(session, e);
+                }
+                break;
+            case newUserPromptedForPassword:
+                createUser(session, e);
+                break;
+        }
+    }
+
+    public void newUserRegistrationFlow(CreeperSession session, MessageEvent e) {
+        e.getChannel().write("desired username: ");
+        session.setState(CreeperSession.State.newUserPromptedForUsername);
+    }
+
+    private boolean setDesiredUsername(CreeperSession session, MessageEvent e) {
+        PlayerMetadata playerMetadata = playerManager.getPlayerMetadata(new Player((String) e.getMessage()).getPlayerId());
+        if (playerMetadata != null) {
+            e.getChannel().write("Username is in use.\r\n");
+            newUserRegistrationFlow(session, e);
+            return false;
+        }
+        session.setUsername(Optional.of((String)e.getMessage()));
+        return true;
+    }
+
+    private void promptForDesirePassword(CreeperSession session, MessageEvent e) {
+        e.getChannel().write("desired password: ");
+        session.setState(CreeperSession.State.newUserPromptedForPassword);
+    }
+
+    private void createUser(CreeperSession session, MessageEvent e) {
+        session.setPassword(Optional.of((String) e.getMessage()));
+        PlayerMetadata playerMetadata = new PlayerMetadata(session.getUsername().get(), session.getPassword().get(), new Player(session.getUsername().get()).getPlayerId());
+        playerManager.savePlayerMetadata(playerMetadata);
+        e.getChannel().write("User created.\r\n");
+        session.setState(CreeperSession.State.newUserRegCompleted);
+    }
+
+}
diff --git a/src/main/java/com/comandante/creeper/server/CreeperServerHandler.java b/src/main/java/com/comandante/creeper/server/CreeperServerHandler.java
index 4f74191a3fc61c97801f8ec890efc14c23abce77..cd282fbe14d659f80f6d50ac7a43f7c05cee3ee5 100644
--- a/src/main/java/com/comandante/creeper/server/CreeperServerHandler.java
+++ b/src/main/java/com/comandante/creeper/server/CreeperServerHandler.java
@@ -31,7 +31,8 @@ public class CreeperServerHandler extends SimpleChannelUpstreamHandler {
 
     @Override
     public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
-        e.getChannel().write("\r\n\r\n\r\n\r\n" + GameManager.LOGO + "\r\n" + GameManager.VERSION + "\r\n\r\n\r\n\r\n");
+//        e.getChannel().write("\r\n\r\n\r\n\r\n" + GameManager.LOGO + "\r\n" + GameManager.VERSION + "\r\n\r\n\r\n\r\n");
+        e.getChannel().write("First time here? Type \"new\".\r\n");
         e.getChannel().write("username: ");
         CreeperSession creeperSession = new CreeperSession();
         creeperSession.setState(CreeperSession.State.promptedForUsername);
@@ -42,6 +43,12 @@ public class CreeperServerHandler extends SimpleChannelUpstreamHandler {
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws InterruptedException {
         CreeperSession creeperSession = (CreeperSession) ctx.getAttachment();
         if (!creeperSession.isAuthed()) {
+            if (creeperSession.state.equals(CreeperSession.State.newUserPromptedForUsername) || creeperSession.state.equals(CreeperSession.State.newUserPromptedForPassword)) {
+                gameManager.getNewUserRegistrationManager().handle(creeperSession, e);
+                if (!creeperSession.state.equals(CreeperSession.State.newUserRegCompleted)) {
+                    return;
+                }
+            }
             doAuthentication(ctx, e);
             if (creeperSession.isAuthed()) {
                 gameManager.currentRoomLogic(creeperSession, e);
@@ -59,6 +66,10 @@ public class CreeperServerHandler extends SimpleChannelUpstreamHandler {
         CreeperSession creeperSession = (CreeperSession) ctx.getAttachment();
         if (creeperSession.getState().equals(CreeperSession.State.promptedForUsername)) {
             creeperSession.setUsername(Optional.of(message));
+            if (creeperSession.getUsername().isPresent() && creeperSession.getUsername().get().equals("new")) {
+                gameManager.getNewUserRegistrationManager().newUserRegistrationFlow(creeperSession, e);
+                return;
+            }
             creeperSession.setState(CreeperSession.State.promptedForPassword);
             e.getChannel().write("password: ");
             return;
@@ -74,7 +85,7 @@ public class CreeperServerHandler extends SimpleChannelUpstreamHandler {
         } else {
             creeperSession.setAuthed(true);
             creeperSession.setState(CreeperSession.State.authed);
-            e.getChannel().write("Welcome back.\r\n");
+            e.getChannel().write("Welcome to creeper.\r\n");
         }
     }
 
diff --git a/src/main/java/com/comandante/creeper/server/CreeperSession.java b/src/main/java/com/comandante/creeper/server/CreeperSession.java
index 20a79908a4d4c4209b6ad6f3980bb058dd15edf9..0e0520363f3713747dc8422898e92cadd1dd44a3 100644
--- a/src/main/java/com/comandante/creeper/server/CreeperSession.java
+++ b/src/main/java/com/comandante/creeper/server/CreeperSession.java
@@ -9,9 +9,12 @@ public class CreeperSession {
     private boolean isAuthed = false;
     State state;
 
-    enum State {
+    public enum State {
         promptedForPassword,
         promptedForUsername,
+        newUserPromptedForUsername,
+        newUserPromptedForPassword,
+        newUserRegCompleted,
         authed
     }