diff --git a/src/main/java/com/comandante/creeper/Main.java b/src/main/java/com/comandante/creeper/Main.java
index 10b88c2775b4077e9567b7b984448d6928ae3d5b..054b787d8ded15d9aef44ae4bd2be0263a97d3de 100644
--- a/src/main/java/com/comandante/creeper/Main.java
+++ b/src/main/java/com/comandante/creeper/Main.java
@@ -7,7 +7,6 @@ import com.comandante.creeper.managers.EntityManager;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.managers.PlayerManager;
 import com.comandante.creeper.managers.RoomManager;
-import com.comandante.creeper.model.Player;
 import com.comandante.creeper.model.PlayerMetadata;
 import com.comandante.creeper.model.Stats;
 import com.comandante.creeper.model.StatsBuilder;
@@ -29,16 +28,17 @@ public class Main {
                 .make();
 
         RoomManager roomManager = new RoomManager();
-        EntityManager entityManager = new EntityManager(roomManager, db);
         PlayerManager playerManager = new PlayerManager(db);
 
+        EntityManager entityManager = new EntityManager(roomManager, playerManager, db);
+
         Stats chrisBrianStats = new StatsBuilder().setStrength(7).setWillpower(8).setAim(6).setAgile(5).setArmorRating(4).setMeleSkill(10).setHealth(100).setWeaponRatingMin(10).setWeaponRatingMax(20).setNumberweaponOfRolls(1).createStats();
-        if (playerManager.getPlayerMetadata(new Player("chris").getPlayerId()) == null) {
+        if (playerManager.getPlayerMetadata(createPlayerId("chris")) == null) {
             System.out.println("Creating Chris User.");
             playerManager.savePlayerMetadata(new PlayerMetadata("chris", "poop", new String(Base64.encodeBase64("chris".getBytes())), chrisBrianStats));
         }
 
-        if (playerManager.getPlayerMetadata(new Player("brian").getPlayerId()) == null) {
+        if (playerManager.getPlayerMetadata(createPlayerId("chris")) == null) {
             System.out.println("Creating Brian User.");
             playerManager.savePlayerMetadata(new PlayerMetadata("brian", "poop", new String(Base64.encodeBase64("brian".getBytes())), chrisBrianStats));
         }
@@ -67,4 +67,8 @@ public class Main {
 
         System.out.println("Creeper started.");
     }
+
+    public static String createPlayerId(String playerName) {
+        return new String(Base64.encodeBase64(playerName.getBytes()));
+    }
 }
diff --git a/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java b/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java
index e7c3cd9d4719b1955999e3b05d59e94465d31dcb..7ccd1e13d63473d21dece5ccaca5f286bfb89c03 100644
--- a/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java
+++ b/src/main/java/com/comandante/creeper/command/DefaultCommandHandler.java
@@ -1,6 +1,7 @@
 package com.comandante.creeper.command;
 
 
+import com.comandante.creeper.Main;
 import com.comandante.creeper.command.commands.DropCommand;
 import com.comandante.creeper.command.commands.GossipCommand;
 import com.comandante.creeper.command.commands.InventoryCommand;
@@ -15,7 +16,6 @@ import com.comandante.creeper.command.commands.UseCommand;
 import com.comandante.creeper.command.commands.WhoCommand;
 import com.comandante.creeper.command.commands.WhoamiCommand;
 import com.comandante.creeper.managers.GameManager;
-import com.comandante.creeper.model.Player;
 import com.comandante.creeper.server.CreeperSession;
 import org.jboss.netty.channel.MessageEvent;
 
@@ -33,7 +33,7 @@ public class DefaultCommandHandler {
         String originalMessage = (String) e.getMessage();
         e.getChannel();
         String rootCommand = originalMessage.split(" ")[0].toLowerCase();
-        String playerId = new Player(creeperSession.getUsername().get()).getPlayerId();
+        String playerId = Main.createPlayerId(creeperSession.getUsername().get());
         if (GossipCommand.validTriggers.contains(rootCommand)) {
             GossipCommand gossipCommand = new GossipCommand(playerId, gameManager, originalMessage);
             commandService.processCommand(gossipCommand);
diff --git a/src/main/java/com/comandante/creeper/managers/EntityManager.java b/src/main/java/com/comandante/creeper/managers/EntityManager.java
index e5bfbebf230fd981e26ae4082406d40838923c2f..87ae9e3b8768f1b71c6b748abb8f392a0c98c127 100644
--- a/src/main/java/com/comandante/creeper/managers/EntityManager.java
+++ b/src/main/java/com/comandante/creeper/managers/EntityManager.java
@@ -3,6 +3,7 @@ package com.comandante.creeper.managers;
 import com.comandante.creeper.model.CreeperEntity;
 import com.comandante.creeper.Items.Item;
 import com.comandante.creeper.Items.ItemSerializer;
+import com.comandante.creeper.model.Player;
 import com.comandante.creeper.model.Room;
 import com.comandante.creeper.npc.Npc;
 import org.mapdb.DB;
@@ -22,15 +23,17 @@ public class EntityManager {
     private final ExecutorService tickService = Executors.newFixedThreadPool(1);
     private final ExecutorService ticketRunnerService = Executors.newFixedThreadPool(10);
     private final RoomManager roomManager;
+    private final PlayerManager playerManager;
     private final DB db;
 
-    public EntityManager(RoomManager roomManager, DB db) {
+    public EntityManager(RoomManager roomManager, PlayerManager playerManager, DB db) {
         this.roomManager = roomManager;
         if (db.exists("itemMap")) {
             this.items = db.get("itemMap");
         } else {
             this.items = db.createHashMap("itemMap").valueSerializer(new ItemSerializer()).make();
         }
+        this.playerManager = playerManager;
         this.db = db;
         tickService.submit(new Ticker());
     }
@@ -66,6 +69,13 @@ public class EntityManager {
         return npcs.get(npcId);
     }
 
+    public void updateNpcHealth(String npcId, int amt) {
+        synchronized (npcId){
+            Npc npcEntity = getNpcEntity(npcId);
+            npcEntity.getStats().setHealth(npcEntity.getStats().getHealth() + amt);
+        }
+    }
+
     public Item getItemEntity(String itemId) {
         return items.get(itemId);
     }
@@ -81,6 +91,11 @@ public class EntityManager {
                         Map.Entry<Integer, Room> next = rooms.next();
                         ticketRunnerService.submit(next.getValue());
                     }
+                    Iterator<Map.Entry<String, Player>> players = playerManager.getPlayers();
+                    while (players.hasNext()) {
+                        Map.Entry<String, Player> next = players.next();
+                        ticketRunnerService.submit(next.getValue());
+                    }
                 } catch (InterruptedException ie) {
                     throw new RuntimeException("Problem with ticker.");
                 }
diff --git a/src/main/java/com/comandante/creeper/managers/NewUserRegistrationManager.java b/src/main/java/com/comandante/creeper/managers/NewUserRegistrationManager.java
index 7e188150ee47f8c8002daac12ae878e699da1e05..84d5cf56ffee74bdbd6c3fb4e17db0c27f093166 100644
--- a/src/main/java/com/comandante/creeper/managers/NewUserRegistrationManager.java
+++ b/src/main/java/com/comandante/creeper/managers/NewUserRegistrationManager.java
@@ -1,7 +1,7 @@
 package com.comandante.creeper.managers;
 
 
-import com.comandante.creeper.model.Player;
+import com.comandante.creeper.Main;
 import com.comandante.creeper.model.PlayerMetadata;
 import com.comandante.creeper.model.PlayerStats;
 import com.comandante.creeper.server.CreeperSession;
@@ -35,7 +35,7 @@ public class NewUserRegistrationManager {
     }
 
     private boolean setDesiredUsername(CreeperSession session, MessageEvent e) {
-        PlayerMetadata playerMetadata = playerManager.getPlayerMetadata(new Player((String) e.getMessage()).getPlayerId());
+        PlayerMetadata playerMetadata = playerManager.getPlayerMetadata(Main.createPlayerId((String) e.getMessage()));
         if (playerMetadata != null) {
             e.getChannel().write("Username is in use.\r\n");
             newUserRegistrationFlow(session, e);
@@ -58,7 +58,7 @@ public class NewUserRegistrationManager {
             return;
         }
         session.setPassword(Optional.of(password));
-        PlayerMetadata playerMetadata = new PlayerMetadata(session.getUsername().get(), session.getPassword().get(), new Player(session.getUsername().get()).getPlayerId(), PlayerStats.DEFAULT_PLAYER.createStats());
+        PlayerMetadata playerMetadata = new PlayerMetadata(session.getUsername().get(), session.getPassword().get(), Main.createPlayerId(session.getUsername().get()), PlayerStats.DEFAULT_PLAYER.createStats());
         playerManager.savePlayerMetadata(playerMetadata);
         e.getChannel().write("User created.\r\n");
         session.setState(CreeperSession.State.newUserRegCompleted);
diff --git a/src/main/java/com/comandante/creeper/managers/PlayerManager.java b/src/main/java/com/comandante/creeper/managers/PlayerManager.java
index 6d8e92bb11a583c00ae3ada4a4ebfdef3a5e5e3d..15e3846e99904fcfb1352b4db93bdc50fdc45da8 100644
--- a/src/main/java/com/comandante/creeper/managers/PlayerManager.java
+++ b/src/main/java/com/comandante/creeper/managers/PlayerManager.java
@@ -118,4 +118,13 @@ public class PlayerManager {
         return playerStats.toString();
     }
 
+    public void updatePlayerHealth(String playerId, int amount) {
+        synchronized (playerId) {
+            PlayerMetadata playerMetadata = getPlayerMetadata(playerId);
+            Stats stats = playerMetadata.getStats();
+            stats.setHealth(stats.getHealth() + amount);
+            savePlayerMetadata(playerMetadata);
+        }
+    }
+
 }
diff --git a/src/main/java/com/comandante/creeper/model/FightManager.java b/src/main/java/com/comandante/creeper/model/FightManager.java
index 7fe1f3cd1626d7a4db5fff2ec81dc947e61fd407..80ec2e5b6f13a5a61044060480d567da795364e3 100644
--- a/src/main/java/com/comandante/creeper/model/FightManager.java
+++ b/src/main/java/com/comandante/creeper/model/FightManager.java
@@ -39,11 +39,14 @@ public class FightManager {
 
         if (playerStats.getHealth() <= 0) {
             channelUtils.write(player.getPlayerId(), "You died.");
+            channelUtils.writeToRoom(player.getPlayerId(), player.getPlayerName() + " is now dead.");
             return;
         }
 
         if (npcStats.getHealth() <= 0) {
             channelUtils.write(player.getPlayerId(), "You killed " + npc.getName());
+            channelUtils.writeToRoom(player.getPlayerId(), npc.getDieMessage());
+            entityManager.deleteNpcEntity(npc.getEntityId());
             return;
         }
     }
@@ -64,7 +67,7 @@ public class FightManager {
             damageToVictim = getAttack(challenger, victim);
         }
         if (damageToVictim > 0) {
-            doDamage(victim, damageToVictim);
+            doNpcDamage(npc.getEntityId(), damageToVictim);
             channelUtils.writeNoPrompt(player.getPlayerId(), damageToVictim + " damage done to " + npc.getName());
         } else {
             channelUtils.writeNoPrompt(player.getPlayerId(), "You miss " + npc.getName());
@@ -75,15 +78,19 @@ public class FightManager {
         int chanceToHitBack = getChanceToHit(victim, challenger);
         int damageBack = getAttack(victim, challenger);
         if (randInt(0, 100) < chanceToHitBack) {
-            doDamage(challenger, damageBack);
+            doPlayerDamage(player.getPlayerId(), damageBack);
             channelUtils.writeNoPrompt(player.getPlayerId(), npc.getName() + " damages you for " + damageBack);
         } else {
             channelUtils.writeNoPrompt(player.getPlayerId(), npc.getName() + " misses you");
         }
     }
 
-    private static void doDamage(Stats stats, int damageAmount) {
-        stats.setHealth(stats.getHealth() - damageAmount);
+    private void doPlayerDamage(String playerId, int damageAmount) {
+        playerManager.updatePlayerHealth(playerId, -damageAmount);
+    }
+
+    private void doNpcDamage(String npcId, int damageAmount) {
+        entityManager.updateNpcHealth(npcId, -damageAmount);
     }
 
     private static int getChanceToHit(Stats challenger, Stats victim) {
diff --git a/src/main/java/com/comandante/creeper/model/Player.java b/src/main/java/com/comandante/creeper/model/Player.java
index e0ab45c381eece6198fb1757e9873d2aa286e3d5..1a39254026bf023da6fd0be2a51cdd18ea7b65d9 100644
--- a/src/main/java/com/comandante/creeper/model/Player.java
+++ b/src/main/java/com/comandante/creeper/model/Player.java
@@ -1,6 +1,8 @@
 package com.comandante.creeper.model;
 
 
+import com.comandante.creeper.Main;
+import com.comandante.creeper.managers.GameManager;
 import com.google.common.base.Optional;
 import org.apache.commons.codec.binary.Base64;
 import org.jboss.netty.channel.Channel;
@@ -10,9 +12,11 @@ public class Player extends CreeperEntity {
     private String playerName;
     private Channel channel;
     private Optional<String> returnDirection = Optional.absent();
+    private final GameManager gameManager;
 
-    public Player(String playerName) {
+    public Player(String playerName, GameManager gameManager) {
         this.playerName = playerName;
+        this.gameManager = gameManager;
     }
 
     public String getPlayerName() {
@@ -46,5 +50,10 @@ public class Player extends CreeperEntity {
     @Override
     public void run() {
 
+        if (gameManager.getPlayerManager().getPlayerMetadata(Main.createPlayerId(playerName)).getStats().getHealth() < 100) {
+            gameManager.getPlayerManager().updatePlayerHealth(Main.createPlayerId(playerName), 10);
+            gameManager.getChannelUtils().write(Main.createPlayerId(playerName), "Health healed by 10.");
+        }
+
     }
 }
diff --git a/src/main/java/com/comandante/creeper/npc/Derper.java b/src/main/java/com/comandante/creeper/npc/Derper.java
index 29c67c93a4deab8fca0a8b9588c7096a3b09feb3..fd9aea0c582e2520f7a7099e664f014a293d7e95 100644
--- a/src/main/java/com/comandante/creeper/npc/Derper.java
+++ b/src/main/java/com/comandante/creeper/npc/Derper.java
@@ -18,11 +18,12 @@ public class Derper extends Npc {
     private final Random random;
     private final static String colorName = new StringBuilder()
             .append(GREEN)
-            .append("Federation Sentry")
+            .append("derper")
             .append(RESET).toString();
 
+
     public Derper(GameManager gameManager, Integer roomId) {
-        super(gameManager, roomId, NAME, colorName, 0, NpcStats.JOE_NPC.createStats());
+        super(gameManager, roomId, NAME, colorName, 0, NpcStats.JOE_NPC.createStats(), "derper's face is melted");
         this.random = new Random();
     }
 
diff --git a/src/main/java/com/comandante/creeper/npc/Npc.java b/src/main/java/com/comandante/creeper/npc/Npc.java
index 696aa76dcaa2f75ad4f998264557624209762c32..3d2049a64848dbf5e223bf93abc95cbc3b5ca5c9 100644
--- a/src/main/java/com/comandante/creeper/npc/Npc.java
+++ b/src/main/java/com/comandante/creeper/npc/Npc.java
@@ -21,6 +21,7 @@ public abstract class Npc extends CreeperEntity {
     private final String name;
     private final String colorName;
     private final Stats stats;
+    private final String dieMessage;
 
     @Override
     public void run() {
@@ -31,13 +32,14 @@ public abstract class Npc extends CreeperEntity {
         return colorName;
     }
 
-    protected Npc(GameManager gameManager, Integer roomId, String name, String colorName, long lastPhraseTimestamp, Stats stats) {
+    protected Npc(GameManager gameManager, Integer roomId, String name, String colorName, long lastPhraseTimestamp, Stats stats, String dieMessage) {
         this.gameManager = gameManager;
         this.roomId = roomId;
         this.name = name;
         this.colorName = colorName;
         this.lastPhraseTimestamp = lastPhraseTimestamp;
         this.stats = stats;
+        this.dieMessage = dieMessage;
     }
 
     public Stats getStats() {
@@ -60,6 +62,10 @@ public abstract class Npc extends CreeperEntity {
         return name;
     }
 
+    public String getDieMessage() {
+        return dieMessage;
+    }
+
     public void npcSay(Integer roomId, String message) {
         StringBuilder sb = new StringBuilder();
         sb.append(RED);
diff --git a/src/main/java/com/comandante/creeper/server/ChannelUtils.java b/src/main/java/com/comandante/creeper/server/ChannelUtils.java
index ed4085e3c75597f1ec8747d1942cb3cc0f73ad4b..06864bbe6c77fe2e1ec3248637de97452ff6f23a 100644
--- a/src/main/java/com/comandante/creeper/server/ChannelUtils.java
+++ b/src/main/java/com/comandante/creeper/server/ChannelUtils.java
@@ -5,6 +5,8 @@ import com.comandante.creeper.managers.RoomManager;
 import com.comandante.creeper.model.Player;
 import com.comandante.creeper.model.Room;
 
+import java.util.Set;
+
 public class ChannelUtils {
 
     private final PlayerManager playerManager;
@@ -25,6 +27,19 @@ public class ChannelUtils {
         player.getChannel().write(playerManager.getPrompt(playerId, playerCurrentRoom.getRoomId()));
     }
 
+    public void writeToRoom(String playerId, String message) {
+        Room playerCurrentRoom = roomManager.getPlayerCurrentRoom(playerManager.getPlayer(playerId)).get();
+        Set<String> presentPlayerIds = playerCurrentRoom.getPresentPlayerIds();
+        for (String id : presentPlayerIds) {
+            Player presentPlayer = playerManager.getPlayer(id);
+            if (presentPlayer.getPlayerId().equals(playerId)) {
+                write(playerId, message);
+            } else {
+                writeNoPrompt(presentPlayer.getPlayerId(), message);
+            }
+        }
+    }
+
     public void write(String playerId, String message) {
         write(playerId, message, true);
     }
diff --git a/src/main/java/com/comandante/creeper/server/CreeperMapDBAuthenticator.java b/src/main/java/com/comandante/creeper/server/CreeperMapDBAuthenticator.java
index 37bebb6ed38d641776e09341b547ce1a612523fc..52b609f04216052ccbc6a513fb3e21191f1106f3 100644
--- a/src/main/java/com/comandante/creeper/server/CreeperMapDBAuthenticator.java
+++ b/src/main/java/com/comandante/creeper/server/CreeperMapDBAuthenticator.java
@@ -1,5 +1,6 @@
 package com.comandante.creeper.server;
 
+import com.comandante.creeper.Main;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.model.Player;
 import com.comandante.creeper.model.PlayerMetadata;
@@ -15,7 +16,7 @@ public class CreeperMapDBAuthenticator implements CreeperAuthenticator {
 
     @Override
     public boolean authenticateAndRegisterPlayer(String username, String password, Channel channel) {
-        PlayerMetadata playerMetadata = gameManager.getPlayerManager().getPlayerMetadata(new Player(username).getPlayerId());
+        PlayerMetadata playerMetadata = gameManager.getPlayerManager().getPlayerMetadata(Main.createPlayerId(username));
         if (playerMetadata == null) {
             return false;
         }
@@ -25,7 +26,7 @@ public class CreeperMapDBAuthenticator implements CreeperAuthenticator {
         if (gameManager.getPlayerManager().doesPlayerExist(username)) {
             gameManager.getPlayerManager().removePlayer(username);
         }
-        Player player = new Player(username);
+        Player player = new Player(username, gameManager);
         player.setChannel(channel);
         gameManager.getPlayerManager().addPlayer(player);
         if (!gameManager.getRoomManager().getPlayerCurrentRoom(player).isPresent()) {