diff --git a/src/main/java/com/comandante/creeper/MBeanRefresherService.java b/src/main/java/com/comandante/creeper/MBeanRefresherService.java
new file mode 100644
index 0000000000000000000000000000000000000000..91b6a7c170789d383d156d6c2c5e9261b4b6db9e
--- /dev/null
+++ b/src/main/java/com/comandante/creeper/MBeanRefresherService.java
@@ -0,0 +1,27 @@
+package com.comandante.creeper;
+
+
+import com.comandante.creeper.managers.GameManager;
+import com.google.common.util.concurrent.AbstractScheduledService;
+import org.mapdb.DB;
+
+import java.util.concurrent.TimeUnit;
+
+public class MBeanRefresherService extends AbstractScheduledService {
+
+    private final GameManager gameManager;
+
+    public MBeanRefresherService(GameManager gameManager) {
+        this.gameManager = gameManager;
+    }
+
+    @Override
+    protected void runOneIteration() throws Exception {
+        gameManager.getPlayerManagementManager().createAndRegisterAllPlayerManagementMBeans();
+    }
+
+    @Override
+    protected Scheduler scheduler() {
+        return Scheduler.newFixedRateSchedule(2, 2, TimeUnit.MINUTES);
+    }
+}
diff --git a/src/main/java/com/comandante/creeper/Main.java b/src/main/java/com/comandante/creeper/Main.java
index fb7e1ef2b1c39a8ddeeb9d79971baf272566f2de..1704c5a22c3694764097ac5018b4a3dbcf6c7a78 100644
--- a/src/main/java/com/comandante/creeper/Main.java
+++ b/src/main/java/com/comandante/creeper/Main.java
@@ -99,9 +99,8 @@ public class Main {
         worldExporter.readWorldFromDisk();
 
         startUpMessage("Creating and registering Player Management MBeans.");
-        PlayerManagementManager playerManagementManager = new PlayerManagementManager(gameManager);
-        playerManagementManager.processPlayersMarkedForDeletion();
-        playerManagementManager.createAndRegisterAllPlayerManagementMBeans();
+        gameManager.getPlayerManagementManager().processPlayersMarkedForDeletion();
+        gameManager.getPlayerManagementManager().createAndRegisterAllPlayerManagementMBeans();
 
         startUpMessage("Configuring commands");
         ConfigureCommands.configure(gameManager);
@@ -139,6 +138,10 @@ public class Main {
             startUpMessage("Starting irc server.");
             configureIrc(gameManager);
         }
+
+        MBeanRefresherService mBeanRefresherService = new MBeanRefresherService(gameManager);
+        mBeanRefresherService.startAsync();
+        startUpMessage("MBean Refresher Service started.");
     }
 
     public static void startUpMessage(String message) {
diff --git a/src/main/java/com/comandante/creeper/command/LookCommand.java b/src/main/java/com/comandante/creeper/command/LookCommand.java
index a3d053f0ff69745c99aef3e6f458d11b083960eb..e1906d972bb749763671d4074e8f24403cc76832 100644
--- a/src/main/java/com/comandante/creeper/command/LookCommand.java
+++ b/src/main/java/com/comandante/creeper/command/LookCommand.java
@@ -30,6 +30,10 @@ public class LookCommand extends Command {
             }
             originalMessageParts.remove(0);
             String target = Joiner.on(" ").join(originalMessageParts);
+            if (target.equalsIgnoreCase("self")) {
+                write(player.getLookString() + "\r\n");
+                return;
+            }
             //Notables
             for (Map.Entry<String, String> notable : currentRoom.getNotables().entrySet()) {
                 if (notable.getKey().equalsIgnoreCase(target)) {
@@ -39,7 +43,7 @@ public class LookCommand extends Command {
             //Players
             Set<Player> presentPlayers = roomManager.getPresentPlayers(currentRoom);
             for (Player presentPlayer : presentPlayers) {
-                if (presentPlayer != null && presentPlayer.getPlayerName().equals(target)) {
+                if (presentPlayer != null && presentPlayer.getPlayerName().equalsIgnoreCase(target)) {
                     write(presentPlayer.getLookString() + "\r\n");
                     if (!presentPlayer.getPlayerId().equals(playerId)) {
                         channelUtils.write(presentPlayer.getPlayerId(), player.getPlayerName() + " looks at you.", true);
@@ -50,7 +54,7 @@ public class LookCommand extends Command {
             for (String npcId : npcIds) {
                 Npc currentNpc = gameManager.getEntityManager().getNpcEntity(npcId);
                 if (currentNpc.getValidTriggers().contains(target)) {
-                    write(gameManager.getLookString(currentNpc) + "\r\n");
+                    write(gameManager.getLookString(currentNpc, player) + "\r\n");
                 }
             }
         } finally {
diff --git a/src/main/java/com/comandante/creeper/command/admin/SystemInfo.java b/src/main/java/com/comandante/creeper/command/SystemInfo.java
old mode 100755
new mode 100644
similarity index 96%
rename from src/main/java/com/comandante/creeper/command/admin/SystemInfo.java
rename to src/main/java/com/comandante/creeper/command/SystemInfo.java
index 19a45f77d72853987038e2179bf076415c70a47c..64e9fab8a16a65d71ab39999829dfbc6c0cc060e
--- a/src/main/java/com/comandante/creeper/command/admin/SystemInfo.java
+++ b/src/main/java/com/comandante/creeper/command/SystemInfo.java
@@ -1,4 +1,4 @@
-package com.comandante.creeper.command.admin;
+package com.comandante.creeper.command;
 
 import com.comandante.creeper.Main;
 import com.comandante.creeper.command.Command;
@@ -21,10 +21,9 @@ public class SystemInfo extends Command {
     final static List<String> validTriggers = Arrays.asList("sysinfo", "systeminfo", "sys");
     final static String description = "Display System information.";
     final static String correctUsage = "systeminfo";
-    final static Set<PlayerRole> roles = Sets.newHashSet(PlayerRole.ADMIN);
 
     public SystemInfo(GameManager gameManager) {
-        super(gameManager, validTriggers, description, correctUsage, roles);
+        super(gameManager, validTriggers, description, correctUsage);
     }
 
     @Override
diff --git a/src/main/java/com/comandante/creeper/command/admin/UsersCommand.java b/src/main/java/com/comandante/creeper/command/UsersCommand.java
old mode 100755
new mode 100644
similarity index 95%
rename from src/main/java/com/comandante/creeper/command/admin/UsersCommand.java
rename to src/main/java/com/comandante/creeper/command/UsersCommand.java
index 18e629efd66b2be39063fdf754aad74d98924e20..ad5371b3e74b08c1e1a8dfa4c601c20b1f91156e
--- a/src/main/java/com/comandante/creeper/command/admin/UsersCommand.java
+++ b/src/main/java/com/comandante/creeper/command/UsersCommand.java
@@ -1,4 +1,4 @@
-package com.comandante.creeper.command.admin;
+package com.comandante.creeper.command;
 
 import com.comandante.creeper.command.Command;
 import com.comandante.creeper.managers.GameManager;
@@ -25,10 +25,9 @@ public class UsersCommand extends Command {
     final static List<String> validTriggers = Arrays.asList("users");
     final static String description = "Display extended inforation about who is logged in.";
     final static String correctUsage = "users";
-    final static Set<PlayerRole> roles = Sets.newHashSet(PlayerRole.ADMIN);
 
     public UsersCommand(GameManager gameManager) {
-        super(gameManager, validTriggers, description, correctUsage, roles);
+        super(gameManager, validTriggers, description, correctUsage);
     }
 
     @Override
diff --git a/src/main/java/com/comandante/creeper/managers/GameManager.java b/src/main/java/com/comandante/creeper/managers/GameManager.java
index a3af98697c22b79b54d6cf912a498fbe3c008ca8..1e977b3f1bbcc91cdcc851ffc0d89a538c18c08d 100755
--- a/src/main/java/com/comandante/creeper/managers/GameManager.java
+++ b/src/main/java/com/comandante/creeper/managers/GameManager.java
@@ -67,6 +67,7 @@ public class GameManager {
     private final TimeTracker timeTracker;
     private final ItemUseHandler itemUseHandler;
     private final NpcMover npcMover;
+    private final PlayerManagementManager playerManagementManager;
 
     public GameManager(CreeperConfiguration creeperConfiguration, RoomManager roomManager, PlayerManager playerManager, EntityManager entityManager, MapsManager mapsManager, ChannelUtils channelUtils) {
         this.roomManager = roomManager;
@@ -92,6 +93,11 @@ public class GameManager {
         this.entityManager.addEntity(itemDecayManager);
         this.itemUseHandler = new ItemUseHandler(this);
         this.npcMover = new NpcMover(this);
+        this.playerManagementManager = new PlayerManagementManager(this);
+    }
+
+    public PlayerManagementManager getPlayerManagementManager() {
+        return playerManagementManager;
     }
 
     public NpcMover getNpcMover() {
@@ -410,11 +416,15 @@ public class GameManager {
         }
     }
 
-    public String getLookString(Npc npc) {
+    public String getLookString(Npc npc, Player player) {
         StringBuilder sb = new StringBuilder();
         // passing an empty createState because of the "difference calculation"
         sb.append(Color.MAGENTA + "-+=[ " + Color.RESET).append(npc.getColorName()).append(Color.MAGENTA + " ]=+- " + Color.RESET).append("\r\n");
-        sb.append("Level: " + npc.getLevel()).append("\r\n");
+        ExperienceManager.ExperienceType experienceType = ExperienceManager.getExperienceType(npc, player);
+        sb.append(experienceType.getColor());
+        sb.append("Level: ").append(npc.getLevel());
+        sb.append(Color.RESET);
+        sb.append("\r\n");
         sb.append(Color.MAGENTA + "Stats--------------------------------" + Color.RESET).append("\r\n");
         sb.append(buildLookString(npc.getColorName(), npc.getStats(), new StatsBuilder().createStats())).append("\r\n");
         if (npc.getEffects() != null && npc.getEffects().size() > 0) {
@@ -616,14 +626,15 @@ public class GameManager {
             PlayerMetadata playerMetadata = getPlayerManager().getPlayerMetadata(playerId);
             long amount = damageEntry.getValue();
             double pct = (double) amount / totalDamageDone;
+            Player player = getPlayerManager().getPlayer(playerId);
             if (pct >= .90) {
-                damagePcts.put(playerId, npc.getPctOFExperience(1, Levels.getLevel(playerMetadata.getStats().getExperience())));
+                damagePcts.put(playerId, npc.getPctOFExperience(1, player));
             } else if (pct >= 0.25) {
-                damagePcts.put(playerId, npc.getPctOFExperience(.8, Levels.getLevel(playerMetadata.getStats().getExperience())));
+                damagePcts.put(playerId, npc.getPctOFExperience(.8, player));
             } else if (pct >= 0.10) {
-                damagePcts.put(playerId, npc.getPctOFExperience(.5, Levels.getLevel(playerMetadata.getStats().getExperience())));
+                damagePcts.put(playerId, npc.getPctOFExperience(.5, player));
             } else {
-                damagePcts.put(playerId, npc.getPctOFExperience(.25, Levels.getLevel(playerMetadata.getStats().getExperience())));
+                damagePcts.put(playerId, npc.getPctOFExperience(.25, player));
             }
         }
         return damagePcts;
diff --git a/src/main/java/com/comandante/creeper/npc/Npc.java b/src/main/java/com/comandante/creeper/npc/Npc.java
index 41913f252752995716819006361cfe246fe254bf..b6b57dd6c09bee959e5b0810e1fbde5f247de816 100644
--- a/src/main/java/com/comandante/creeper/npc/Npc.java
+++ b/src/main/java/com/comandante/creeper/npc/Npc.java
@@ -9,6 +9,7 @@ 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.ExperienceManager;
 import com.comandante.creeper.player.Player;
 import com.comandante.creeper.server.Color;
 import com.comandante.creeper.spawner.SpawnRule;
@@ -232,12 +233,12 @@ public class Npc extends CreeperEntity {
         return effects;
     }
 
-    public long getExperience() {
-        return getStats().getExperience();
+    public long getExperience(Player player) {
+        return ExperienceManager.getXp(this, player);
     }
 
-    public double getPctOFExperience(double pct, long playerLevel) {
-        return getExperience() * pct;
+    public double getPctOFExperience(double pct, Player player) {
+        return getExperience(player) * pct;
     }
 
     public void addDamageToMap(String playerId, long amt) {
diff --git a/src/main/java/com/comandante/creeper/player/ExperienceManager.java b/src/main/java/com/comandante/creeper/player/ExperienceManager.java
index 5269af8068b29fa1789d88c808759dd45ce46bab..4c88a998cc24fe125ee666b80fbbd2b5bde81d45 100644
--- a/src/main/java/com/comandante/creeper/player/ExperienceManager.java
+++ b/src/main/java/com/comandante/creeper/player/ExperienceManager.java
@@ -1,26 +1,47 @@
 package com.comandante.creeper.player;
 
 import com.comandante.creeper.npc.Npc;
+import com.comandante.creeper.server.Color;
 
 public class ExperienceManager {
 
     // http://wowwiki.wikia.com/wiki/Formulas:Mob_XP
 
-    enum ExperienceType {
-        RED,
-        ORANGE,
-        YELLOW,
-        GREEN,
-        GRAY;
+    public enum ExperienceType {
+        RED(Color.RED),
+        CYAN(Color.CYAN),
+        YELLOW(Color.YELLOW),
+        GREEN(Color.GREEN),
+        GRAY(Color.WHITE);
+
+        String color;
+
+        ExperienceType(String color) {
+            this.color = color;
+        }
+
+        public String getColor() {
+            return color;
+        }
+    }
+
+    public static long getXp(Npc npc, Player player) {
+        if (player.getLevel() == npc.getLevel()) {
+            return getBaseXp(player.getLevel());
+        } else if (player.getLevel() < npc.getLevel()) {
+            return getHigherLevelNpcXp(npc.getLevel(), player.getLevel());
+        } else {
+            return getLowerLevelNpcXp(npc.getLevel(), player.getLevel());
+        }
     }
 
-    private ExperienceType getExperienceType(Npc npc, Player player) {
+    public static ExperienceType getExperienceType(Npc npc, Player player) {
         long npcLevel = npc.getLevel();
         long playerLevel = player.getLevel();
         if (npcLevel >= (playerLevel + 5)) {
             return ExperienceType.RED;
         } else if ((npcLevel == (playerLevel + 3)) || npcLevel == (playerLevel + 4)) {
-            return ExperienceType.ORANGE;
+            return ExperienceType.CYAN;
         } else if ((npcLevel == (playerLevel + 2)) || (npcLevel == (playerLevel - 2))) {
             return ExperienceType.YELLOW;
         } else if ((npcLevel <= (playerLevel - 3)) && npcLevel > getGrayLevel(playerLevel)) {
@@ -76,19 +97,26 @@ public class ExperienceManager {
         } else {
             return 18;
         }
+    }
 
+    public static long getBaseXp(long playerLevel) {
+        return (playerLevel * 5) + 235;
     }
 
+    public static long getHigherLevelNpcXp(long npcLevel, long playerLevel) {
+        return (long) (getBaseXp(playerLevel) * (1 + .05 * (npcLevel - playerLevel)));
+    }
+
+    public static long getLowerLevelNpcXp(long npcLevel, long playerLevel) {
+        if (getGrayLevel(playerLevel) >= npcLevel) {
+            return 0;
+        }
+        return getBaseXp(playerLevel) * (1 - (playerLevel - npcLevel)/getZeroDifference(playerLevel));
+    }
 
     public static void main(String[] args) {
         for (int i = 0; i < 70; i++) {
             System.out.println("Level: " + i + " Gray Level: " + getGrayLevel(i) + " zero-difference:" + getZeroDifference(i) );
         }
     }
-
-    //public long getBasicExperienceGained(Npc npc, Player player) {
-     //   long level = player.getLevel();
-
-//    }
-
 }
diff --git a/src/main/java/com/comandante/creeper/player/PlayerManagementManager.java b/src/main/java/com/comandante/creeper/player/PlayerManagementManager.java
index 3a5bc235c6c2b0f6f18f3349cfffaa18e2c1b4a0..2d7689282dbc2dc56c8c3f78366ac07e22b04cdb 100644
--- a/src/main/java/com/comandante/creeper/player/PlayerManagementManager.java
+++ b/src/main/java/com/comandante/creeper/player/PlayerManagementManager.java
@@ -24,7 +24,10 @@ public class PlayerManagementManager {
             String playerId = entry.getKey();
             PlayerMetadata playerMetadata = entry.getValue();
             PlayerManagement playerManagement = new PlayerManagement(gameManager, playerId);
-            mbs.registerMBean(playerManagement, new ObjectName("CreeperManagement:00=Players,name=" + playerMetadata.getPlayerName()));
+            ObjectName objectName = new ObjectName("CreeperManagement:00=Players,name=" + playerMetadata.getPlayerName());
+            if (!mbs.isRegistered(objectName)) {
+                mbs.registerMBean(playerManagement, objectName);
+            }
         }
     }
 
diff --git a/src/main/java/com/comandante/creeper/server/CreeperAuthenticationHandler.java b/src/main/java/com/comandante/creeper/server/CreeperAuthenticationHandler.java
index efd8a6caf6ca29b2483a470f9ae7e0f5ce3151ab..56ef4df0cc6bcb5fb22aea53394965bc8fb0117e 100644
--- a/src/main/java/com/comandante/creeper/server/CreeperAuthenticationHandler.java
+++ b/src/main/java/com/comandante/creeper/server/CreeperAuthenticationHandler.java
@@ -15,37 +15,6 @@ public class CreeperAuthenticationHandler extends SimpleChannelUpstreamHandler {
     private final CreeperAuthenticator creeperAuthenticator;
     private static final Logger log = Logger.getLogger(CreeperAuthenticationHandler.class);
 
-
-
-    private static final String LOGO = "        ,---__,------__---.\r\n" +
-            "      ,'////<: =     ]\\\\\\\\\\`.\r\n" +
-            "     ///__---^~~\"\"\"~~^---__\\\\\\\r\n" +
-            "    //,' D E T E C T I V E `.\\\\\r\n" +
-            "   /  \\   __---^~~~^---__   /  \\\r\n" +
-            "  /,.  \\,'   /.-----.\\   `./  ,.\\\r\n" +
-            " //  `.     MMM ,^. MMM     ,'  \\\\\r\n" +
-            "//.--. ~~^^---^~   ~^---^^~~ .--.\\\\\r\n" +
-            "/  '> \\  __--'^^~~~^^`--__  / <'   \\\r\n" +
-            "\\   / _-^  o   L   I   c  ^-_ \\   /\r\n" +
-            " \\  ,'  P  __--^^^^^--__  E  `.  /\r\n" +
-            "  \\ \\   ,-^             ^-.   / /\r\n" +
-            "  i  \\,' ,^-__-^~/\\^-__-^. `./  i\r\n" +
-            "  |     /|#`|`.| ||**\\ */-\\     |\r\n" +
-            "  !     '>#| `|`.||--/* \\*<'    !\r\n" +
-            "  /     /|#|_|#_|||________\\    \\    - Creeper Rule Violators -\r\n" +
-            " /      \\   *   *||.| |#| |/     \\   - WILL BE PLACED IN MUD JAIL-\r\n" +
-            "i        \\**\\ */-[]|`.|#| /       i\r\n" +
-            "|         \\-/* \\/~~\\`|`.|/        |\r\n" +
-            "|   /`.    `. ./_[]_\\.`,'   ,'\\   |\r\n" +
-            "!  /   `-.   ^|______|^  ,-'   \\  !\r\n" +
-            " \\ `.     ~~^--_____--^~~     ,' /\r\n" +
-            "  \\  `-_      CREEPER      _-'  /\r\n" +
-            "   `.   ^~--._________.--~^   ,'\r\n" +
-            "     ^-_                   _-^\r\n" +
-            "        ^~--__ 4 2 0 __--~^\r\n" +
-            "              `.   ,'\r\n" +
-            "                `-'\r\n";
-
     public CreeperAuthenticationHandler(GameManager gameManager) {
         this.gameManager = gameManager;
         this.creeperAuthenticator = new GameAuth(gameManager);
@@ -64,7 +33,6 @@ public class CreeperAuthenticationHandler extends SimpleChannelUpstreamHandler {
     public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
         StringBuilder stringBuilder = new StringBuilder();
         stringBuilder
-                .append(LOGO)
                 .append(RESET + "\r\n")
                 .append("First time here? Type \"tupac\".\r\n")
                 .append("username: ");