diff --git a/src/main/java/com/comandante/creeper/managers/GameManager.java b/src/main/java/com/comandante/creeper/managers/GameManager.java
index 6a3ab9d367601908c4b0b06e570cd3afc7e2e82c..8e8c91970cd0e752616cd5c2e1a932bec7246a40 100755
--- a/src/main/java/com/comandante/creeper/managers/GameManager.java
+++ b/src/main/java/com/comandante/creeper/managers/GameManager.java
@@ -383,7 +383,10 @@ public class GameManager {
                 entityManager.saveItem(itemEntity);
                 return true;
             } else {
+                Item itemEntity = entityManager.getItemEntity(itemId);
                 channelUtils.write(player.getPlayerId(), "Your inventory is full, drop some items to free up room.\r\n");
+                player.getCurrentRoom().addPresentItem(itemId);
+                roomSay(player.getCurrentRoom().getRoomId(), player.getPlayerName() + " dropped " + itemEntity.getItemName(), player.getPlayerId());
                 return false;
             }
         }
diff --git a/src/main/java/com/comandante/creeper/npc/Npc.java b/src/main/java/com/comandante/creeper/npc/Npc.java
index d3d9f9d33f9d3d2beb9393091db147976668dc90..c79b4912e183b01a27a12b0acc7c6285f9701b8f 100644
--- a/src/main/java/com/comandante/creeper/npc/Npc.java
+++ b/src/main/java/com/comandante/creeper/npc/Npc.java
@@ -7,10 +7,7 @@ import com.comandante.creeper.Items.Rarity;
 import com.comandante.creeper.entity.CreeperEntity;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.managers.SentryManager;
-import com.comandante.creeper.player.CoolDown;
-import com.comandante.creeper.player.CoolDownType;
-import com.comandante.creeper.player.Levels;
-import com.comandante.creeper.player.Player;
+import com.comandante.creeper.player.*;
 import com.comandante.creeper.server.Color;
 import com.comandante.creeper.spawner.SpawnRule;
 import com.comandante.creeper.spells.Effect;
@@ -60,6 +57,7 @@ public class Npc extends CreeperEntity {
     private Room currentRoom;
     private int effectsTickBucket = 0;
     private Set<CoolDown> coolDowns = Sets.newHashSet();
+    private final ExperienceManager experienceManager = new ExperienceManager();
 
 
     protected Npc(GameManager gameManager, String name, String colorName, long lastPhraseTimestamp, Stats stats, String dieMessage, Temperament temperament, Set<Area> roamAreas, Set<String> validTriggers, Loot loot, Set<SpawnRule> spawnRules) {
@@ -136,36 +134,38 @@ public class Npc extends CreeperEntity {
             if (npcStatsChange.getPlayer().isActive(CoolDownType.DEATH) && !npcStatsChange.isItemDamage()) {
                 return;
             }
-            if (isAlive.get()) {
-                if (npcStatsChange.getStats() != null) {
-                    for (String message : npcStatsChange.getDamageStrings()) {
-                        if (!npcStatsChange.getPlayer().isActive(CoolDownType.DEATH)) {
-                            gameManager.getChannelUtils().write(npcStatsChange.getPlayer().getPlayerId(), message + "\r\n", true);
-                        }
-                    }
-                    StatsHelper.combineStats(getStats(), npcStatsChange.getStats());
-                    long amt = npcStatsChange.getStats().getCurrentHealth();
-                    long damageReportAmt = -npcStatsChange.getStats().getCurrentHealth();
-                    if (getStats().getCurrentHealth() < 0) {
-                        damageReportAmt = -amt + getStats().getCurrentHealth();
-                        getStats().setCurrentHealth(0);
-                    }
-                    long damage = 0;
-                    if (getPlayerDamageMap().containsKey(npcStatsChange.getPlayer().getPlayerId())) {
-                        damage = getPlayerDamageMap().get(npcStatsChange.getPlayer().getPlayerId());
-                    }
-                    addDamageToMap(npcStatsChange.getPlayer().getPlayerId(), damage + damageReportAmt);
-                    if (getStats().getCurrentHealth() == 0) {
-                        killNpc(npcStatsChange.getPlayer());
-                        return;
-                    }
+            if (!isAlive.get()) {
+                return;
+            }
+            if (npcStatsChange.getStats() == null) {
+                return;
+            }
+            for (String message : npcStatsChange.getDamageStrings()) {
+                if (!npcStatsChange.getPlayer().isActive(CoolDownType.DEATH)) {
+                    gameManager.getChannelUtils().write(npcStatsChange.getPlayer().getPlayerId(), message + "\r\n", true);
                 }
-                if (npcStatsChange.getPlayerStatsChange() != null) {
-                    for (String message : npcStatsChange.getPlayerDamageStrings()) {
-                        if (!npcStatsChange.getPlayer().isActive(CoolDownType.DEATH)) {
-                            gameManager.getChannelUtils().write(npcStatsChange.getPlayer().getPlayerId(), message + "\r\n", true);
-                            npcStatsChange.getPlayer().updatePlayerHealth(npcStatsChange.getPlayerStatsChange().getCurrentHealth(), this);
-                        }
+            }
+            StatsHelper.combineStats(getStats(), npcStatsChange.getStats());
+            long amt = npcStatsChange.getStats().getCurrentHealth();
+            long damageReportAmt = -npcStatsChange.getStats().getCurrentHealth();
+            if (getStats().getCurrentHealth() < 0) {
+                damageReportAmt = -amt + getStats().getCurrentHealth();
+                getStats().setCurrentHealth(0);
+            }
+            long damage = 0;
+            if (getPlayerDamageMap().containsKey(npcStatsChange.getPlayer().getPlayerId())) {
+                damage = getPlayerDamageMap().get(npcStatsChange.getPlayer().getPlayerId());
+            }
+            addDamageToMap(npcStatsChange.getPlayer().getPlayerId(), damage + damageReportAmt);
+            if (getStats().getCurrentHealth() == 0) {
+                killNpc(npcStatsChange.getPlayer());
+                return;
+            }
+            if (npcStatsChange.getPlayerStatsChange() != null) {
+                for (String message : npcStatsChange.getPlayerDamageStrings()) {
+                    if (!npcStatsChange.getPlayer().isActive(CoolDownType.DEATH)) {
+                        gameManager.getChannelUtils().write(npcStatsChange.getPlayer().getPlayerId(), message + "\r\n", true);
+                        npcStatsChange.getPlayer().updatePlayerHealth(npcStatsChange.getPlayerStatsChange().getCurrentHealth(), this);
                     }
                 }
             }
@@ -242,7 +242,7 @@ public class Npc extends CreeperEntity {
             int playerLevel = (int) Levels.getLevel(gameManager.getStatsModifierFactory().getStatsModifier(player).getExperience());
             int npcLevel = (int) Levels.getLevel(this.getStats().getExperience());
 
-            long xpEarned = (long) (getNpcXp(playerLevel, npcLevel) * playerDamagePercentValue);
+            long xpEarned = (long) (experienceManager.calculateNpcXp(playerLevel, npcLevel) * playerDamagePercentValue);
             p.addExperience(xpEarned);
             p.addNpcKillLog(getName());
             gameManager.getChannelUtils().write(p.getPlayerId(), getBattleReport(xpEarned) + "\r\n", true);
@@ -265,23 +265,6 @@ public class Npc extends CreeperEntity {
         this.currentRoom = currentRoom;
     }
 
-    private int getNpcXp(int playerLevel, int npcLevel) {
-        if (npcLevel >= playerLevel) {
-            double temp = ((playerLevel * 5) + 45) * (1 + (0.05 * (npcLevel - playerLevel)));
-            double tempCap = ((playerLevel * 5) + 45) * 1.2;
-            if (temp > tempCap) {
-                return (int) Math.floor(tempCap);
-            } else {
-                return (int) Math.floor(temp);
-            }
-        } else {
-            if (getLevelColor(playerLevel).equals(NpcLevelColor.WHITE)) {
-                return 0;
-            } else {
-                return (int) (Math.floor((playerLevel * 5) + 45) * (1 - (playerLevel - npcLevel) / getZD(playerLevel)));
-            }
-        }
-    }
 
     private String getBattleReport(long xpEarned) {
         StringBuilder sb = new StringBuilder();
@@ -318,88 +301,7 @@ public class Npc extends CreeperEntity {
         return sb.toString();
     }
 
-    public NpcLevelColor getLevelColor(int playerLevel) {
-        int npcLevel = (int) Levels.getLevel(this.getStats().getExperience());
 
-        if (playerLevel + 5 <= npcLevel) {
-            return NpcLevelColor.RED;
-        } else {
-            switch (npcLevel - playerLevel) {
-                case 4:
-                case 3:
-                    return NpcLevelColor.ORANGE;
-                case 2:
-                case 1:
-                case 0:
-                case -1:
-                case -3:
-                    return NpcLevelColor.YELLOW;
-                default:
-                    if (playerLevel <= 5) {
-                        return NpcLevelColor.GREEN;
-                    } else {
-                        if (playerLevel <= 50) {
-                            if (npcLevel <= (playerLevel - 5 - Math.floor(playerLevel / 10))) {
-                                return NpcLevelColor.WHITE;
-                            } else {
-                                return NpcLevelColor.GREEN;
-                            }
-                        } else {
-                            // Player is over level 50
-                            if (npcLevel <= (playerLevel - 1 - Math.floor(playerLevel / 5))) {
-                                return NpcLevelColor.WHITE;
-                            } else {
-                                return NpcLevelColor.GREEN;
-                            }
-                        }
-                    }
-            }
-        }
-    }
-
-    private int getZD(int lvl) {
-        if (lvl <= 7) {
-            return 5;
-        }
-        if (lvl <= 9) {
-            return 6;
-        }
-        if (lvl <= 11) {
-            return 7;
-        }
-        if (lvl <= 15) {
-            return 8;
-        }
-        if (lvl <= 19) {
-            return 9;
-        }
-        if (lvl <= 29) {
-            return 11;
-        }
-        if (lvl <= 39) {
-            return 12;
-        }
-        if (lvl <= 49) {
-            return 13;
-        }
-        if (lvl <= 59) {
-            return 14;
-        }
-        if (lvl <= 69) {
-            return 15;
-        }
-        if (lvl <= 79) {
-            return 16;
-        }
-        if (lvl <= 89) {
-            return 17;
-        }
-        if (lvl <= 99) {
-            return 18;
-        } else {
-            return 19;
-        }
-    }
 
     public String getColorName() {
         return colorName;
@@ -503,23 +405,27 @@ public class Npc extends CreeperEntity {
         this.coolDowns.add(coolDown);
     }
 
+    public NpcLevelColor getLevelColor(int playerLevel) {
+        return experienceManager.getLevelColor(playerLevel, (int) Levels.getLevel(this.getStats().getExperience()));
+    }
+
     public enum NpcLevelColor {
 
-        RED(Color.RED + "Red"),
-        ORANGE(Color.CYAN + "Cyan"),
-        YELLOW(Color.YELLOW + "Yellow"),
-        GREEN(Color.GREEN + "Green"),
-        WHITE(Color.WHITE + "White");
+    RED(Color.RED + "Red"),
+    ORANGE(Color.CYAN + "Cyan"),
+    YELLOW(Color.YELLOW + "Yellow"),
+    GREEN(Color.GREEN + "Green"),
+    WHITE(Color.WHITE + "White");
 
-        private final String color;
+    private final String color;
 
-        NpcLevelColor(String color) {
-            this.color = color;
-        }
+    NpcLevelColor(String color) {
+        this.color = color;
+    }
 
-        public String getColor() {
-            return "(" + Color.BOLD_ON + color + Color.RESET + ")";
-        }
+    public String getColor() {
+        return "(" + Color.BOLD_ON + color + Color.RESET + ")";
     }
+}
 
 }
diff --git a/src/main/java/com/comandante/creeper/player/ExperienceManager.java b/src/main/java/com/comandante/creeper/player/ExperienceManager.java
index 632f5c9d19cc1901e13bc7fa8c80faca536fad56..a87ec2dadb1ccf13ef77c1201ebded77a8cd23bf 100644
--- a/src/main/java/com/comandante/creeper/player/ExperienceManager.java
+++ b/src/main/java/com/comandante/creeper/player/ExperienceManager.java
@@ -1,5 +1,114 @@
 package com.comandante.creeper.player;
 
+import com.comandante.creeper.npc.Npc;
+
 public class ExperienceManager {
 
+    public int calculateNpcXp(int playerLevel, int npcLevel) {
+        float xp = 0;
+        if (npcLevel == playerLevel) {
+            xp = (playerLevel * 5 + 45);
+        }
+        if (npcLevel > playerLevel) {
+            float i = playerLevel * 5 + 45;
+            float diff = npcLevel - playerLevel;
+            float modifier = 1 + .2f * (diff);
+            xp = i * modifier;
+        }
+        if (npcLevel < playerLevel) {
+            if (getLevelColor(playerLevel, npcLevel).equals(Npc.NpcLevelColor.WHITE)) {
+                xp = 0;
+            } else {
+                float levelDif = playerLevel - npcLevel;
+                xp = (playerLevel * 5 + 45) * (1 - (levelDif / getZD(playerLevel)));
+            }
+        }
+        if (xp == 0) {
+            return 0;
+        }
+        return (int) Math.floor(xp + 0.5);
+    }
+
+
+    public Npc.NpcLevelColor getLevelColor(int playerLevel, int npcLevel) {
+        if (playerLevel + 5 <= npcLevel) {
+            return Npc.NpcLevelColor.RED;
+        } else {
+            switch (npcLevel - playerLevel) {
+                case 4:
+                case 3:
+                    return Npc.NpcLevelColor.ORANGE;
+                case 2:
+                case 1:
+                case 0:
+                case -1:
+                case -2:
+                    return Npc.NpcLevelColor.YELLOW;
+                default:
+                    if (playerLevel <= 5) {
+                        return Npc.NpcLevelColor.GREEN;
+                    } else {
+                        if (playerLevel <= 50) {
+                            if (npcLevel <= (playerLevel - 5 - Math.floor(playerLevel / 10))) {
+                                return Npc.NpcLevelColor.WHITE;
+                            } else {
+                                return Npc.NpcLevelColor.GREEN;
+                            }
+                        } else {
+                            // Player is over level 50
+                            if (npcLevel <= (playerLevel - 1 - Math.floor(playerLevel / 5))) {
+                                return Npc.NpcLevelColor.WHITE;
+                            } else {
+                                return Npc.NpcLevelColor.GREEN;
+                            }
+                        }
+                    }
+            }
+        }
+    }
+
+    private int getZD(int lvl) {
+        if (lvl <= 7) {
+            return 5;
+        }
+        if (lvl <= 9) {
+            return 6;
+        }
+        if (lvl <= 11) {
+            return 7;
+        }
+        if (lvl <= 15) {
+            return 8;
+        }
+        if (lvl <= 19) {
+            return 9;
+        }
+        if (lvl <= 29) {
+            return 11;
+        }
+        if (lvl <= 39) {
+            return 12;
+        }
+        if (lvl <= 49) {
+            return 13;
+        }
+        if (lvl <= 59) {
+            return 14;
+        }
+        if (lvl <= 69) {
+            return 15;
+        }
+        if (lvl <= 79) {
+            return 16;
+        }
+        if (lvl <= 89) {
+            return 17;
+        }
+        if (lvl <= 99) {
+            return 18;
+        } else {
+            return 19;
+        }
+    }
+
 }
diff --git a/src/main/java/com/comandante/creeper/player/Player.java b/src/main/java/com/comandante/creeper/player/Player.java
index 504166ab18360c9902ca7c85eeffa1e36f170bea..2f736a9bbbeee031dd1b35ccfdfd4e9073d78c06 100755
--- a/src/main/java/com/comandante/creeper/player/Player.java
+++ b/src/main/java/com/comandante/creeper/player/Player.java
@@ -104,13 +104,17 @@ public class Player extends CreeperEntity {
         synchronized (interner.intern(playerId)) {
             PlayerMetadata playerMetadata = gameManager.getPlayerManager().getPlayerMetadata(playerId);
             Stats stats = getPlayerStatsWithEquipmentAndLevel();
-            if (!isActive(CoolDownType.DEATH)) {
-                if (playerMetadata.getStats().getCurrentHealth() < stats.getMaxHealth()) {
-                    updatePlayerHealth((int) (stats.getMaxHealth() * .05), null);
-                }
-                if (playerMetadata.getStats().getCurrentMana() < stats.getMaxMana()) {
-                    addMana((int) (stats.getMaxMana() * .03));
-                }
+            if (isActive(CoolDownType.NPC_FIGHT)) {
+                return;
+            }
+            if (isActive(CoolDownType.DEATH)) {
+                return;
+            }
+            if (playerMetadata.getStats().getCurrentHealth() < stats.getMaxHealth()) {
+                updatePlayerHealth((int) (stats.getMaxHealth() * .05), null);
+            }
+            if (playerMetadata.getStats().getCurrentMana() < stats.getMaxMana()) {
+                addMana((int) (stats.getMaxMana() * .03));
             }
         }
     }
@@ -879,6 +883,7 @@ public class Player extends CreeperEntity {
         synchronized (interner.intern(playerId)) {
             if (gameManager.getEntityManager().getNpcEntity(npc.getEntityId()) != null) {
                 if (!doesActiveFightExist(npc)) {
+                    addCoolDown(new CoolDown(CoolDownType.NPC_FIGHT));
                     ActiveFight activeFight = new ActiveFight(npc.getEntityId(), false);
                     activeFights.put(System.nanoTime(), activeFight);
                     return true;
@@ -982,8 +987,9 @@ public class Player extends CreeperEntity {
             }
             if (damageToVictim > 0) {
                 if (randInt(0, 100) > 95) {
-                    final String fightMsg = Color.BOLD_ON + Color.RED + "[attack] " + Color.RESET + Color.YELLOW + "The " + npc.getColorName() + " was caught off guard by the attack! " + "+" + NumberFormat.getNumberInstance(Locale.US).format(damageToVictim) + Color.RESET + Color.BOLD_ON + Color.RED + " DAMAGE" + Color.RESET + " done to " + npc.getColorName();
-                    npcStatsChangeBuilder.setStats(new StatsBuilder().setCurrentHealth(-(damageToVictim * 3)).createStats());
+                    long criticalDamage = damageToVictim * 3;
+                    final String fightMsg = Color.BOLD_ON + Color.RED + "[attack] " + Color.RESET + Color.YELLOW + "The " + npc.getColorName() + " was caught off guard by the attack! " + "+" + NumberFormat.getNumberInstance(Locale.US).format(criticalDamage) + Color.RESET + Color.BOLD_ON + Color.RED + " DAMAGE" + Color.RESET + " done to " + npc.getColorName();
+                    npcStatsChangeBuilder.setStats(new StatsBuilder().setCurrentHealth(-(criticalDamage)).createStats());
                     npcStatsChangeBuilder.setDamageStrings(Collections.singletonList(fightMsg));
                 } else {
                     final String fightMsg = Color.BOLD_ON + Color.RED + "[attack] " + Color.RESET + Color.YELLOW + "+" + NumberFormat.getNumberInstance(Locale.US).format(damageToVictim) + Color.RESET + Color.BOLD_ON + Color.RED + " DAMAGE" + Color.RESET + " done to " + npc.getColorName();
diff --git a/src/test/com/comandante/creeper/player/ExperienceManagerTest.java b/src/test/com/comandante/creeper/player/ExperienceManagerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..e97784c345acaee7104d4ebb7b6db35a2c375b11
--- /dev/null
+++ b/src/test/com/comandante/creeper/player/ExperienceManagerTest.java
@@ -0,0 +1,44 @@
+package com.comandante.creeper.player;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+
+public class ExperienceManagerTest {
+
+    private ExperienceManager experienceManager;
+
+    @Before
+    public void setUp() throws Exception {
+        experienceManager = new ExperienceManager();
+    }
+
+    @Test
+    public void testXp() throws Exception {
+        int playerLevel = 20;
+        Assert.assertEquals(0, experienceManager.calculateNpcXp(playerLevel, 13));
+        Assert.assertEquals(0, experienceManager.calculateNpcXp(playerLevel, 12));
+        Assert.assertEquals(232, experienceManager.calculateNpcXp(playerLevel, 23));
+        Assert.assertEquals(203, experienceManager.calculateNpcXp(playerLevel, 22));
+        Assert.assertEquals(174, experienceManager.calculateNpcXp(playerLevel, 21));
+        Assert.assertEquals(145, experienceManager.calculateNpcXp(playerLevel, 20));
+        Assert.assertEquals(132, experienceManager.calculateNpcXp(playerLevel, 19));
+        Assert.assertEquals(119, experienceManager.calculateNpcXp(playerLevel, 18));
+        int npcLevel = 3;
+        for (int i = 0; i < 10; i++) {
+            System.out.println("Player Level: " + i + " xp gained: " + experienceManager.calculateNpcXp(i, npcLevel));
+        }
+    }
+
+
+    @Test
+    public void testSpread() throws Exception {
+        //System.out.println("Player Level: " + 28 + " " + experienceManager.getLevelColor(28, 25) + " " + experienceManager.calculateNpcXp(28, 25));
+//        System.out.println("Player Level: " + 29 + " " + experienceManager.getLevelColor(29, 25) + " " + experienceManager.calculateNpcXp(29, 25));
+
+        for (int i = 15; i < 30; i++) {
+            System.out.println("Player Level: " + i + " " + experienceManager.getLevelColor(i, 25) + " " + experienceManager.calculateNpcXp(i, 25));
+      }
+    }
+}
\ No newline at end of file
diff --git a/src/test/com/comandante/creeper/player/NpcTestHarness.java b/src/test/com/comandante/creeper/player/NpcTestHarness.java
index 03340228f1fa27a38b7a2e650dd03baff8db40e3..6594b564049a075c7b67769e402c08cf020b05e4 100644
--- a/src/test/com/comandante/creeper/player/NpcTestHarness.java
+++ b/src/test/com/comandante/creeper/player/NpcTestHarness.java
@@ -46,10 +46,14 @@ public class NpcTestHarness {
     public void setUp() throws Exception {
         ChannelCommunicationUtils channelUtils = new ChannelCommunicationUtils() {
             @Override
-            public void write(String playerId, String message) {}
+            public void write(String playerId, String message) {
+                //System.out.println(message);
+            }
 
             @Override
-            public void write(String playerId, String message, boolean leadingBlankLine) {}
+            public void write(String playerId, String message, boolean leadingBlankLine) {
+                // System.out.println(message);
+            }
         };
         CreeperConfiguration creeperConfiguration = new CreeperConfiguration(new MapConfiguration(Maps.newHashMap()));
         DB db = DBMaker.newMemoryDB().closeOnJvmShutdown().make();
@@ -67,34 +71,57 @@ public class NpcTestHarness {
     }
 
     @Test
-    public void testCombat() throws Exception {
+    public void testAnotherCombat() throws Exception {
+        Set<Item> equipment = Sets.newHashSet();
+        equipment.add(ItemType.BERSEKER_BOOTS.create());
+        //equipment.add(ItemType.BERSERKER_BATON.create());
+        equipment.add(ItemType.BERSERKER_CHEST.create());
+        equipment.add(ItemType.BERSEKER_SHORTS.create());
+        String username = UUID.randomUUID().toString();
+        Player player = createRandomPlayer(username, 0);
+        equipArmor(player, equipment);
         List<Npc> npcsFromFile = NpcExporter.getNpcsFromFile(gameManager);
         Npc treeBerseker = npcsFromFile.stream().filter(npc -> npc.getName().equals("tree berserker")).collect(Collectors.toList()).get(0);
+        Npc npc = new NpcBuilder(treeBerseker).createNpc();
+        gameManager.getEntityManager().addEntity(npc);
+        player.getCurrentRoom().addPresentNpc(npc.getEntityId());
+        player.addActiveFight(npc);
+        conductFight(player, npc);
+    }
+
+    @Test
+    public void testCombat() throws Exception {
+        List<Npc> npcsFromFile = NpcExporter.getNpcsFromFile(gameManager);
+        Npc treeBerseker = npcsFromFile.stream().filter(npc -> npc.getName().equals("swamp berserker")).collect(Collectors.toList()).get(0);
         int totalIterations = 100;
         Player player;
         Npc npc = null;
-        Table t = new Table(7, BorderStyle.BLANKS,
+        Table t = new Table(8, BorderStyle.BLANKS,
                 ShownBorders.NONE);
         t.setColumnWidth(0, 20, 20);
         t.setColumnWidth(1, 15, 20);
-        t.setColumnWidth(2, 16, 16);
-        t.setColumnWidth(3, 16, 16);
-        t.setColumnWidth(4, 16, 16);
-        t.setColumnWidth(5, 16, 16);
+        t.setColumnWidth(2, 13, 16);
+        t.setColumnWidth(3, 10, 16);
+        t.setColumnWidth(4, 13, 16);
+        t.setColumnWidth(5, 10, 16);
+        t.setColumnWidth(6, 13, 16);
         //t.setColumnWidth(6, 16, 16);
 
         t.addCell("Npc");
         t.addCell("Player Level");
-        t.addCell("Player Win Pct");
-        t.addCell("Npc Win Pct");
-        t.addCell("Avg Rounds");
+        t.addCell("Player Win");
+        t.addCell("Npc Win");
+        t.addCell("Avg Turns");
         t.addCell("Avg Gold");
+        t.addCell("XP Earned");
         t.addCell("Drops");
         Set<Item> equipment = Sets.newHashSet();
         equipment.add(ItemType.BERSEKER_BOOTS.create());
-        //equipment.add(ItemType.BERSERKER_BATON.create());
+        equipment.add(ItemType.BERSERKER_BATON.create());
         equipment.add(ItemType.BERSERKER_CHEST.create());
         equipment.add(ItemType.BERSEKER_SHORTS.create());
+        equipment.add(ItemType.BERSERKER_BRACERS.create());
+        equipment.add(ItemType.BERSEKER_HELM.create());
 
         for (int level = 0; level < 10; level++) {
             int playerWins = 0;
@@ -107,6 +134,7 @@ public class NpcTestHarness {
                 player = createRandomPlayer(username, level);
                 equipArmor(player, equipment);
                 npc = new NpcBuilder(treeBerseker).createNpc();
+                npc.setCurrentRoom(player.getCurrentRoom());
                 gameManager.getEntityManager().addEntity(npc);
                 player.getCurrentRoom().addPresentNpc(npc.getEntityId());
                 player.addActiveFight(npc);
@@ -133,20 +161,26 @@ public class NpcTestHarness {
             float npcWinPercent = (npcWins * 100.0f) / totalIterations;
             t.addCell(npc.getName());
             t.addCell(String.valueOf(level));
-            t.addCell(String.valueOf(playerWinPercent)+"%");
-            t.addCell(String.valueOf(npcWinPercent)+"%");
+            t.addCell(String.valueOf(playerWinPercent) + "%");
+            t.addCell(String.valueOf(npcWinPercent) + "%");
             t.addCell(String.valueOf(totalFightRounds / totalIterations));
-            t.addCell(String.valueOf(totalGold / playerWins));
+            if (totalGold == 0 || playerWins == 0) {
+                t.addCell("0");
+            } else {
+                t.addCell(String.valueOf(totalGold / playerWins));
+            }
+            t.addCell(String.valueOf(new ExperienceManager().calculateNpcXp(level, (int) Levels.getLevel(npc.getStats().getExperience()))));
             StringBuilder sb = new StringBuilder();
             drops.entrySet().stream().map(entry -> entry.getKey() + "(" + entry.getValue().get() + ")").forEach(s -> sb.append(s).append(","));
             t.addCell(sb.toString());
         }
+        System.out.println("#### 100 round fight simulation results ####");
         System.out.println(t.render());
 
-       // Stats difference = StatsHelper.getDifference(player.getPlayerStatsWithEquipmentAndLevel(), new PlayerStats().DEFAULT_PLAYER.createStats());
-       // String player1 = gameManager.buildLookString("player", player.getPlayerStatsWithEquipmentAndLevel(),difference );
-       // System.out.println(player1);
-       // System.out.println("");
+        // Stats difference = StatsHelper.getDifference(player.getPlayerStatsWithEquipmentAndLevel(), new PlayerStats().DEFAULT_PLAYER.createStats());
+        // String player1 = gameManager.buildLookString("player", player.getPlayerStatsWithEquipmentAndLevel(),difference );
+        // System.out.println(player1);
+        // System.out.println("");
 
     }
 
@@ -195,5 +229,4 @@ public class NpcTestHarness {
         PlayerMetadata playerMetadata = new PlayerMetadata(username, password, Main.createPlayerId(username), PlayerStats.DEFAULT_PLAYER.createStats(), 0, Sets.newHashSet(PlayerRole.MORTAL), new String[0], 0, new String[0], Maps.newHashMap());
         gameManager.getPlayerManager().savePlayerMetadata(playerMetadata);
     }
-
 }
diff --git a/world/npcs/swampberserker.json b/world/npcs/swampberserker.json
new file mode 100644
index 0000000000000000000000000000000000000000..632c7224d21150c134ddc11092eb5d06349b75cf
--- /dev/null
+++ b/world/npcs/swampberserker.json
@@ -0,0 +1,44 @@
+{
+  "name": "swamp berserker",
+  "colorName": "swamp \u001B[1m\u001B[35mberserker\u001B[0m",
+  "dieMessage": "a swamp \u001B[1m\u001B[35mberserker\u001B[0m breathes his last breath in a pool of \u001B[1m\u001B[31mblood\u001B[0m",
+  "temperament": "passive",
+  "loot": {
+    "lootGoldMin": 7,
+    "lootGoldMax": 14,
+    "lootItems": [3]
+  },
+  "roamAreas": [
+    "north1_zone"
+  ],
+  "stats": {
+    "agile": 1,
+    "aim": 1,
+    "armorRating": 6,
+    "currentHealth": 105,
+    "currentMana": 105,
+    "experience": 22500,
+    "maxHealth": 105,
+    "maxMana": 105,
+    "meleSkill": 16,
+    "numberOfWeaponRolls": 1,
+    "strength": 10,
+    "weaponRatingMax": 15,
+    "weaponRatingMin": 9,
+    "willPower": 1
+  },
+  "spawnAreas": {
+    "north1_zone": {
+      "randomChance": 100,
+      "maxPerRoom": 6,
+      "spawnIntervalTicks": 600,
+      "maxInstances": 24
+    }
+  },
+  "validTriggers": [
+    "s",
+    "swamp berserker",
+    "berserker",
+    "b"
+  ]
+}
diff --git a/world/npcs/treeberserker.json b/world/npcs/treeberserker.json
index 5c1479b8e865c169bead77a6126b0299bff79b11..9f7926592374dcc771e0759a3a06754d823e4418 100755
--- a/world/npcs/treeberserker.json
+++ b/world/npcs/treeberserker.json
@@ -17,7 +17,7 @@
     "armorRating": 3,
     "currentHealth": 90,
     "currentMana": 90,
-    "experience": 22600,
+    "experience": 2500,
     "maxHealth": 90,
     "maxMana": 90,
     "meleSkill": 12,