diff --git a/src/main/java/com/comandante/creeper/Main.java b/src/main/java/com/comandante/creeper/Main.java
index b81534fffda9397e46ce1584ee1845d7332cc1e9..87a6b65e0f0c1bf4c9afb81199354c2b070eca75 100644
--- a/src/main/java/com/comandante/creeper/Main.java
+++ b/src/main/java/com/comandante/creeper/Main.java
@@ -2,10 +2,18 @@ package com.comandante.creeper;
 
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.managers.PlayerManager;
+import com.comandante.creeper.managers.PlayerManagerMapDB;
 import com.comandante.creeper.managers.RoomManager;
+import com.comandante.creeper.model.Player;
+import com.comandante.creeper.model.PlayerMetadata;
 import com.comandante.creeper.model.Room;
 import com.comandante.creeper.server.CreeperServer;
 import com.google.common.base.Optional;
+import org.apache.commons.codec.binary.Base64;
+import org.mapdb.DB;
+import org.mapdb.DBMaker;
+
+import java.io.File;
 
 public class Main {
 
@@ -24,10 +32,26 @@ public class Main {
         roomManager.addRoom(hallway);
         roomManager.addRoom(intake);
         roomManager.addRoom(janitorialCloset);
-        PlayerManager playerManager = new PlayerManager();
+
+        DB db = DBMaker.newFileDB(new File("creeperDb"))
+                .closeOnJvmShutdown()
+                .encryptionEnable("creepandicrawl")
+                .make();
+
+        PlayerManager playerManager = new PlayerManagerMapDB(db);
+        if (playerManager.getPlayerMetadata(new Player("chris").getPlayerId()) == null) {
+            System.out.println("Creating Chris User.");
+            playerManager.savePlayerMetadata(new PlayerMetadata("chris", "poop", new String(Base64.encodeBase64("chris".getBytes()))));
+        }
+
+        if (playerManager.getPlayerMetadata(new Player("brian").getPlayerId()) == null) {
+            System.out.println("Creating Brian User.");
+            playerManager.savePlayerMetadata(new PlayerMetadata("brian", "poop", new String(Base64.encodeBase64("brian".getBytes()))));
+        }
+
         GameManager gameManager = new GameManager(roomManager, playerManager);
 
-        CreeperServer creeperServer = new CreeperServer(8080);
+        CreeperServer creeperServer = new CreeperServer(8080, db);
         creeperServer.run(gameManager);
 
         System.out.println("Creeper started.");
diff --git a/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java b/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java
index ae5a02d351c26ab96079a72466060a9b94246c56..4f3ae61076ab5190be134eb30873074e070b983c 100644
--- a/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java
+++ b/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java
@@ -12,9 +12,9 @@ import org.jboss.netty.channel.MessageEvent;
 
 public class DefaultCommandHandler {
 
-    GameManager gameManager;
-    CreeperSession creeperSession;
-    MessageEvent event;
+    private final GameManager gameManager;
+    private final CreeperSession creeperSession;
+    private final MessageEvent event;
 
     public DefaultCommandHandler(GameManager gameManager, CreeperSession creeperSession, MessageEvent event) {
         this.gameManager = gameManager;
diff --git a/src/main/java/com/comandante/creeper/managers/PlayerManager.java b/src/main/java/com/comandante/creeper/managers/PlayerManager.java
index 411b3264df7e78275d4868d9e9cb4fb80adffa24..c147bce5adcc49447831b348e778bb28ca79aeb9 100644
--- a/src/main/java/com/comandante/creeper/managers/PlayerManager.java
+++ b/src/main/java/com/comandante/creeper/managers/PlayerManager.java
@@ -1,43 +1,25 @@
 package com.comandante.creeper.managers;
 
-
 import com.comandante.creeper.model.Player;
-import org.apache.commons.codec.binary.Base64;
+import com.comandante.creeper.model.PlayerMetadata;
 
 import java.util.Iterator;
-import java.util.concurrent.ConcurrentHashMap;
-
-public class PlayerManager {
+import java.util.Map;
 
-    private ConcurrentHashMap<String, Player> players = new ConcurrentHashMap<String, Player>();
+public interface PlayerManager {
+    PlayerMetadata getPlayerMetadata(String playerId);
 
-    public Player addPlayer(Player player) {
-        return players.putIfAbsent(player.getPlayerId(), player);
-    }
+    void savePlayerMetadata(PlayerMetadata playerMetadata);
 
-    public Player getPlayerByUsername(String username) {
-   //     HTreeMap<String, Player> objectObjectHTreeMap = DBMaker.newTempHashMap();
+    Player addPlayer(Player player);
 
-        return getPlayer(new String(Base64.encodeBase64(username.getBytes())));
-    }
+    Player getPlayerByUsername(String username);
 
-    public Player getPlayer(String playerId) {
-        return players.get(playerId);
-    }
+    Player getPlayer(String playerId);
 
-    public Iterator<java.util.Map.Entry<String, Player>> getPlayers() {
-        return players.entrySet().iterator();
-    }
+    Iterator<Map.Entry<String, Player>> getPlayers();
 
-    public void removePlayer(String username) {
-        Player player = getPlayerByUsername(username);
-        if (player.getChannel() != null && player.getChannel().isConnected()) {
-            player.getChannel().disconnect();
-        }
-        players.remove(player.getPlayerId());
-    }
+    void removePlayer(String username);
 
-    public boolean doesPlayerExist(String username) {
-       return players.containsKey(new String(Base64.encodeBase64(username.getBytes())));
-    }
+    boolean doesPlayerExist(String username);
 }
diff --git a/src/main/java/com/comandante/creeper/managers/PlayerManagerMapDB.java b/src/main/java/com/comandante/creeper/managers/PlayerManagerMapDB.java
new file mode 100644
index 0000000000000000000000000000000000000000..2dc61e42570259dd37f113bc1e1f71adade56292
--- /dev/null
+++ b/src/main/java/com/comandante/creeper/managers/PlayerManagerMapDB.java
@@ -0,0 +1,74 @@
+package com.comandante.creeper.managers;
+
+
+import com.comandante.creeper.model.PlayerMetadataSerializer;
+import com.comandante.creeper.model.Player;
+import com.comandante.creeper.model.PlayerMetadata;
+import org.apache.commons.codec.binary.Base64;
+import org.mapdb.DB;
+import org.mapdb.HTreeMap;
+
+import java.util.Iterator;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class PlayerManagerMapDB implements PlayerManager {
+
+    private ConcurrentHashMap<String, Player> players = new ConcurrentHashMap<String, Player>();
+    private HTreeMap<String, PlayerMetadata> playerMetadataStore;
+    private final DB db;
+
+    public PlayerManagerMapDB(DB db) {
+        this.db = db;
+        if (db.exists("playerMetadata")) {
+            this.playerMetadataStore = db.get("playerMetadata");
+        } else {
+            this.playerMetadataStore = db.createHashMap("playerMetadata").valueSerializer(new PlayerMetadataSerializer()).make();
+        }
+    }
+
+    @Override
+    public PlayerMetadata getPlayerMetadata(String playerId) {
+        return playerMetadataStore.get(playerId);
+    }
+
+    @Override
+    public void savePlayerMetadata(PlayerMetadata playerMetadata) {
+        playerMetadataStore.put(playerMetadata.getPlayerId(), playerMetadata);
+        db.commit();
+    }
+
+    @Override
+    public Player addPlayer(Player player) {
+        return players.putIfAbsent(player.getPlayerId(), player);
+    }
+
+    @Override
+    public Player getPlayerByUsername(String username) {
+        return getPlayer(new String(Base64.encodeBase64(username.getBytes())));
+    }
+
+    @Override
+    public Player getPlayer(String playerId) {
+        return players.get(playerId);
+    }
+
+    @Override
+    public Iterator<java.util.Map.Entry<String, Player>> getPlayers() {
+        return players.entrySet().iterator();
+    }
+
+    @Override
+    public void removePlayer(String username) {
+        Player player = getPlayerByUsername(username);
+        if (player.getChannel() != null && player.getChannel().isConnected()) {
+            player.getChannel().disconnect();
+        }
+        players.remove(player.getPlayerId());
+    }
+
+    @Override
+    public boolean doesPlayerExist(String username) {
+        return players.containsKey(new String(Base64.encodeBase64(username.getBytes())));
+    }
+
+}
diff --git a/src/main/java/com/comandante/creeper/model/PlayerMetadata.java b/src/main/java/com/comandante/creeper/model/PlayerMetadata.java
new file mode 100644
index 0000000000000000000000000000000000000000..9a2e8d074b4eb91438687f44c5acf7a716eb9fc6
--- /dev/null
+++ b/src/main/java/com/comandante/creeper/model/PlayerMetadata.java
@@ -0,0 +1,108 @@
+package com.comandante.creeper.model;
+
+
+import java.io.Serializable;
+
+public class PlayerMetadata implements Serializable {
+
+    String playerName;
+    String password;
+    String playerId;
+    int health;
+    int stamina;
+    int strength;
+    int dexterity;
+
+    public PlayerMetadata(String playerName, String password, String playerId) {
+        this.playerName = playerName;
+        this.password = password;
+        this.playerId = playerId;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public String getPlayerId() {
+        return playerId;
+    }
+
+    public String getPlayerName() {
+        return playerName;
+    }
+
+    public int getHealth() {
+        return health;
+    }
+
+    public int getStamina() {
+        return stamina;
+    }
+
+    public int getStrength() {
+        return strength;
+    }
+
+    public int getDexterity() {
+        return dexterity;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        PlayerMetadata that = (PlayerMetadata) o;
+
+        if (dexterity != that.dexterity) return false;
+        if (health != that.health) return false;
+        if (stamina != that.stamina) return false;
+        if (strength != that.strength) return false;
+        if (!password.equals(that.password)) return false;
+        if (!playerId.equals(that.playerId)) return false;
+        if (!playerName.equals(that.playerName)) return false;
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = playerName.hashCode();
+        result = 31 * result + password.hashCode();
+        result = 31 * result + playerId.hashCode();
+        result = 31 * result + health;
+        result = 31 * result + stamina;
+        result = 31 * result + strength;
+        result = 31 * result + dexterity;
+        return result;
+    }
+
+    public void setPlayerName(String playerName) {
+        this.playerName = playerName;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public void setPlayerId(String playerId) {
+        this.playerId = playerId;
+    }
+
+    public void setHealth(int health) {
+        this.health = health;
+    }
+
+    public void setStamina(int stamina) {
+        this.stamina = stamina;
+    }
+
+    public void setStrength(int strength) {
+        this.strength = strength;
+    }
+
+    public void setDexterity(int dexterity) {
+        this.dexterity = dexterity;
+    }
+
+}
diff --git a/src/main/java/com/comandante/creeper/model/PlayerMetadataSerializer.java b/src/main/java/com/comandante/creeper/model/PlayerMetadataSerializer.java
new file mode 100644
index 0000000000000000000000000000000000000000..b1a01c99f6149102ce1dcf3bae3d5f9f8d3997cc
--- /dev/null
+++ b/src/main/java/com/comandante/creeper/model/PlayerMetadataSerializer.java
@@ -0,0 +1,38 @@
+package com.comandante.creeper.model;
+
+import org.mapdb.Serializer;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.io.Serializable;
+
+public class PlayerMetadataSerializer implements Serializer<PlayerMetadata>, Serializable {
+
+    @Override
+    public void serialize(DataOutput out, PlayerMetadata value) throws IOException {
+        out.writeUTF(value.getPlayerName());
+        out.writeUTF(value.getPassword());
+        out.writeUTF(value.getPlayerId());
+        out.writeInt(value.getDexterity());
+        out.writeInt(value.getHealth());
+        out.writeInt(value.getStamina());
+        out.writeInt(value.getStrength());
+    }
+
+    @Override
+    public PlayerMetadata deserialize(DataInput in, int available) throws IOException {
+        PlayerMetadata playerMetadata = new PlayerMetadata(in.readUTF(), in.readUTF(), in.readUTF());
+        playerMetadata.setDexterity(in.readInt());
+        playerMetadata.setHealth(in.readInt());
+        playerMetadata.setStamina(in.readInt());
+        playerMetadata.setStrength(in.readInt());
+        return playerMetadata;
+    }
+
+    @Override
+    public int fixedSize() {
+        return -1;
+    }
+}
+
diff --git a/src/main/java/com/comandante/creeper/server/CreeperMapDBAuthenticator.java b/src/main/java/com/comandante/creeper/server/CreeperMapDBAuthenticator.java
new file mode 100644
index 0000000000000000000000000000000000000000..17b9076602b43ecae6ce486c68b01a29c2a6c945
--- /dev/null
+++ b/src/main/java/com/comandante/creeper/server/CreeperMapDBAuthenticator.java
@@ -0,0 +1,36 @@
+package com.comandante.creeper.server;
+
+import com.comandante.creeper.managers.GameManager;
+import com.comandante.creeper.model.Player;
+import com.comandante.creeper.model.PlayerMetadata;
+import org.jboss.netty.channel.Channel;
+
+public class CreeperMapDBAuthenticator implements CreeperAuthenticator {
+
+    private final GameManager gameManager;
+
+    public CreeperMapDBAuthenticator(GameManager gameManager) {
+        this.gameManager = gameManager;
+    }
+
+    @Override
+    public boolean authenticateAndRegisterPlayer(String username, String password, Channel channel) {
+        PlayerMetadata playerMetadata = gameManager.getPlayerManager().getPlayerMetadata(new Player(username).getPlayerId());
+        if (playerMetadata == null) {
+            return false;
+        }
+        if (!playerMetadata.getPassword().equals(password)) {
+            return false;
+        }
+        if (gameManager.getPlayerManager().doesPlayerExist(username)) {
+            gameManager.getPlayerManager().removePlayer(username);
+        }
+        Player player = new Player(username);
+        player.setChannel(channel);
+        gameManager.getPlayerManager().addPlayer(player);
+        if (!gameManager.getPlayerCurrentRoom(player).isPresent()) {
+            gameManager.placePlayerInLobby(player);
+        }
+        return true;
+    }
+}
diff --git a/src/main/java/com/comandante/creeper/server/CreeperServer.java b/src/main/java/com/comandante/creeper/server/CreeperServer.java
index 0004dfd44af9e2c7d0c7070f40aaadcb93c20545..a881d5f15feba2f33c7754cba37b58ca1ca69e63 100644
--- a/src/main/java/com/comandante/creeper/server/CreeperServer.java
+++ b/src/main/java/com/comandante/creeper/server/CreeperServer.java
@@ -4,6 +4,7 @@ package com.comandante.creeper.server;
 import com.comandante.creeper.managers.GameManager;
 import org.jboss.netty.bootstrap.ServerBootstrap;
 import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
+import org.mapdb.DB;
 
 import java.net.InetSocketAddress;
 import java.util.concurrent.Executors;
@@ -11,14 +12,16 @@ import java.util.concurrent.Executors;
 public class CreeperServer {
 
     private final int port;
+    private final DB db;
 
-    public CreeperServer(int port) {
+    public CreeperServer(int port, DB db) {
         this.port = port;
+        this.db = db;
     }
 
     public void run(GameManager gameManager) throws Exception {
         ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
-        CreeperServerHandler handler = new CreeperServerHandler(new CreeperSimpleAuthenticator(gameManager), gameManager);
+        CreeperServerHandler handler = new CreeperServerHandler(new CreeperMapDBAuthenticator(gameManager), gameManager);
         bootstrap.setPipelineFactory(new CreeperServerPipelineFactory(handler));
         bootstrap.bind(new InetSocketAddress(8080));
     }
diff --git a/src/main/java/com/comandante/creeper/server/CreeperSimpleAuthenticator.java b/src/main/java/com/comandante/creeper/server/CreeperSimpleAuthenticator.java
deleted file mode 100644
index 3af0e7d06f6bfa69ee3a9f36205cb738530afdad..0000000000000000000000000000000000000000
--- a/src/main/java/com/comandante/creeper/server/CreeperSimpleAuthenticator.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package com.comandante.creeper.server;
-
-import com.comandante.creeper.managers.GameManager;
-import com.comandante.creeper.model.Player;
-import org.jboss.netty.channel.Channel;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class CreeperSimpleAuthenticator implements CreeperAuthenticator {
-
-    GameManager gameManager;
-
-    public CreeperSimpleAuthenticator(GameManager gameManager) {
-        this.gameManager = gameManager;
-    }
-
-    private static final Map<String, String> userMap;
-    static {
-        userMap = new HashMap<String, String>();
-        userMap.put("chris", "poop");
-        userMap.put("brian", "poop");
-        userMap.put("sean", "poop");
-    }
-
-    @Override
-    public boolean authenticateAndRegisterPlayer(String userName, String passWord, Channel channel) {
-        String userPassword = userMap.get(userName);
-        if (userPassword == null) {
-            return false;
-        }
-        if (!userPassword.equals(passWord)) {
-            return false;
-        }
-        if (gameManager.getPlayerManager().doesPlayerExist(userName)) {
-            gameManager.getPlayerManager().removePlayer(userName);
-        }
-        Player player = new Player(userName);
-        player.setChannel(channel);
-        gameManager.getPlayerManager().addPlayer(player);
-        if (!gameManager.getPlayerCurrentRoom(player).isPresent()) {
-            gameManager.placePlayerInLobby(player);
-        }
-        return true;
-    }
-}