From 630819552751fe45a3fecebfac9584046e6e35fe Mon Sep 17 00:00:00 2001
From: Chris Kearney <chris@kearneymail.com>
Date: Sun, 7 Aug 2016 15:44:44 -0700
Subject: [PATCH] refactor'd the Command structure to get rid of the
 "configure(e)" concept and the try {}/finally stuff

---
 .../creeper/command/CastCommand.java          |   7 +-
 .../creeper/command/ColorsCommand.java        |  41 +++----
 .../comandante/creeper/command/Command.java   | 114 +++++++++---------
 .../creeper/command/CommandRunnable.java      |   6 +
 .../creeper/command/CoolDownCommand.java      |   8 +-
 .../creeper/command/CountdownCommand.java     |  54 ++++-----
 .../creeper/command/DelCommand.java           |   7 +-
 .../creeper/command/DropCommand.java          |   7 +-
 .../creeper/command/EquipCommand.java         |   7 +-
 .../creeper/command/FightKillCommand.java     |   7 +-
 .../creeper/command/ForageCommand.java        |   7 +-
 .../creeper/command/GoldCommand.java          |   7 +-
 .../creeper/command/GossipCommand.java        |  21 ++--
 .../creeper/command/HelpCommand.java          |   7 +-
 .../creeper/command/InventoryCommand.java     |   7 +-
 .../creeper/command/LookCommand.java          |   9 +-
 .../creeper/command/LootCommand.java          |  23 ++--
 .../creeper/command/MapCommand.java           |  18 ++-
 .../creeper/command/MovementCommand.java      |  37 +++---
 .../creeper/command/NexusCommand.java         |   7 +-
 .../comandante/creeper/command/OpCommand.java |  13 +-
 .../creeper/command/OpenCommand.java          |  19 +--
 .../creeper/command/PickUpCommand.java        |   6 +-
 .../creeper/command/QuitCommand.java          |  13 +-
 .../creeper/command/RecentChangesCommand.java |  14 ++-
 .../creeper/command/RecentGossipCommand.java  |   7 +-
 .../creeper/command/SayCommand.java           |  19 ++-
 .../creeper/command/SetCommand.java           |   7 +-
 .../creeper/command/ShowCommand.java          |   7 +-
 .../creeper/command/TalkCommand.java          |  14 +--
 .../creeper/command/TellCommand.java          |   6 +-
 .../creeper/command/TimeCommand.java          |   7 +-
 .../creeper/command/UnequipCommand.java       |   7 +-
 .../creeper/command/UnknownCommand.java       |   7 +-
 .../creeper/command/UseCommand.java           |   7 +-
 .../creeper/command/WhoCommand.java           |   9 +-
 .../creeper/command/WhoamiCommand.java        |   7 +-
 .../comandante/creeper/command/XpCommand.java |   7 +-
 .../creeper/command/admin/AreaCommand.java    |  12 +-
 .../command/admin/BounceIrcBotCommand.java    |  12 +-
 .../creeper/command/admin/BuildCommand.java   |   4 +-
 .../command/admin/DescriptionCommand.java     |  14 +--
 .../command/admin/GiveGoldCommand.java        |  11 +-
 .../command/admin/GiveHealthCommand.java      |  11 +-
 .../creeper/command/admin/InfoCommand.java    |   7 +-
 .../command/admin/NotablesCommand.java        |   8 +-
 .../command/admin/NpcLocationCommand.java     |   8 +-
 .../command/admin/ReloadNpcsCommand.java      |  15 ++-
 .../command/admin/SaveWorldCommand.java       |   8 +-
 .../creeper/command/admin/SpawnCommand.java   |   9 +-
 .../creeper/command/admin/SystemInfo.java     |   8 +-
 .../creeper/command/admin/TagRoomCommand.java |  12 +-
 .../command/admin/TeleportCommand.java        |  12 +-
 .../creeper/command/admin/TitleCommand.java   |   8 +-
 .../creeper/command/admin/UsersCommand.java   |   8 +-
 .../bank/commands/DepositCommand.java         |   3 +-
 .../merchant/bank/commands/DoneCommand.java   |   4 +-
 .../bank/commands/WithdrawalCommand.java      |   3 +-
 .../creeper/merchant/lockers/DoneCommand.java |   4 +-
 .../com/comandante/creeper/player/Player.java |   2 +-
 .../creeper/player/PlayerManager.java         |   4 +
 .../creeper/player/PlayerMovement.java        |   7 --
 .../creeper/server/CreeperSession.java        |  12 +-
 63 files changed, 328 insertions(+), 455 deletions(-)
 create mode 100644 src/main/java/com/comandante/creeper/command/CommandRunnable.java

diff --git a/src/main/java/com/comandante/creeper/command/CastCommand.java b/src/main/java/com/comandante/creeper/command/CastCommand.java
index ee7da4e6..4509b6ee 100644
--- a/src/main/java/com/comandante/creeper/command/CastCommand.java
+++ b/src/main/java/com/comandante/creeper/command/CastCommand.java
@@ -27,8 +27,7 @@ public class CastCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        try {
-            ;
+        this.execCommand(ctx, e, () -> {
             if (player.getCurrentHealth() <= 0) {
                 write("You have no health and as such you can not attack.");
                 return;
@@ -81,8 +80,6 @@ public class CastCommand extends Command {
                     return;
                 }
             }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/command/ColorsCommand.java b/src/main/java/com/comandante/creeper/command/ColorsCommand.java
index cae99b1a..576e3ef2 100644
--- a/src/main/java/com/comandante/creeper/command/ColorsCommand.java
+++ b/src/main/java/com/comandante/creeper/command/ColorsCommand.java
@@ -21,27 +21,24 @@ public class ColorsCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
-            write ("BLACK: " + Color.BLACK + "This is an example of the color." + Color.RESET + "\r\n");
-            write ("BLUE: " + Color.BLUE + "This is an example of the color." + Color.RESET + "\r\n");
-            write ("CYAN: " + Color.CYAN + "This is an example of the color." + Color.RESET + "\r\n");
-            write ("GREEN: " + Color.GREEN + "This is an example of the color." + Color.RESET + "\r\n");
-            write ("MAGENTA: " + Color.MAGENTA + "This is an example of the color." + Color.RESET + "\r\n");
-            write ("RED: " + Color.RED + "This is an example of the color." + Color.RESET + "\r\n");
-            write ("WHITE: " + Color.WHITE + "This is an example of the color." + Color.RESET + "\r\n");
-            write ("YELLOW: " + Color.YELLOW + "This is an example of the color." + Color.RESET + "\r\n");
-            write ("\r\n\r\nBOLD COLORS\r\n");
-            write ("BLACK: " + Color.BOLD_ON + Color.BLACK + "This is an example of the color." + Color.RESET + "\r\n");
-            write ("BLUE: "  + Color.BOLD_ON + Color.BLUE + "This is an example of the color." + Color.RESET + "\r\n");
-            write ("CYAN: "  + Color.BOLD_ON + Color.CYAN + "This is an example of the color." + Color.RESET + "\r\n");
-            write ("GREEN: "  + Color.BOLD_ON + Color.GREEN + "This is an example of the color." + Color.RESET + "\r\n");
-            write ("MAGENTA: "  + Color.BOLD_ON + Color.MAGENTA + "This is an example of the color." + Color.RESET + "\r\n");
-            write ("RED: "  + Color.BOLD_ON  + Color.RED + "This is an example of the color." + Color.RESET + "\r\n");
-            write ("WHITE: "  + Color.BOLD_ON + Color.WHITE + "This is an example of the color." + Color.RESET + "\r\n");
-            write ("YELLOW: "  + Color.BOLD_ON + Color.YELLOW + "This is an example of the color." + Color.RESET + "\r\n");
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        execCommand(ctx, e, () -> {
+            write("BLACK: " + Color.BLACK + "This is an example of the color." + Color.RESET + "\r\n");
+            write("BLUE: " + Color.BLUE + "This is an example of the color." + Color.RESET + "\r\n");
+            write("CYAN: " + Color.CYAN + "This is an example of the color." + Color.RESET + "\r\n");
+            write("GREEN: " + Color.GREEN + "This is an example of the color." + Color.RESET + "\r\n");
+            write("MAGENTA: " + Color.MAGENTA + "This is an example of the color." + Color.RESET + "\r\n");
+            write("RED: " + Color.RED + "This is an example of the color." + Color.RESET + "\r\n");
+            write("WHITE: " + Color.WHITE + "This is an example of the color." + Color.RESET + "\r\n");
+            write("YELLOW: " + Color.YELLOW + "This is an example of the color." + Color.RESET + "\r\n");
+            write("\r\n\r\nBOLD COLORS\r\n");
+            write("BLACK: " + Color.BOLD_ON + Color.BLACK + "This is an example of the color." + Color.RESET + "\r\n");
+            write("BLUE: " + Color.BOLD_ON + Color.BLUE + "This is an example of the color." + Color.RESET + "\r\n");
+            write("CYAN: " + Color.BOLD_ON + Color.CYAN + "This is an example of the color." + Color.RESET + "\r\n");
+            write("GREEN: " + Color.BOLD_ON + Color.GREEN + "This is an example of the color." + Color.RESET + "\r\n");
+            write("MAGENTA: " + Color.BOLD_ON + Color.MAGENTA + "This is an example of the color." + Color.RESET + "\r\n");
+            write("RED: " + Color.BOLD_ON + Color.RED + "This is an example of the color." + Color.RESET + "\r\n");
+            write("WHITE: " + Color.BOLD_ON + Color.WHITE + "This is an example of the color." + Color.RESET + "\r\n");
+            write("YELLOW: " + Color.BOLD_ON + Color.YELLOW + "This is an example of the color." + Color.RESET + "\r\n");
+        });
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/Command.java b/src/main/java/com/comandante/creeper/command/Command.java
index 09e7ef68..b6f30262 100644
--- a/src/main/java/com/comandante/creeper/command/Command.java
+++ b/src/main/java/com/comandante/creeper/command/Command.java
@@ -43,6 +43,7 @@ public abstract class Command extends SimpleChannelUpstreamHandler {
     public List<String> originalMessageParts;
     public WorldExporter worldExporter;
     public static final Logger log = Logger.getLogger(Command.class);
+    public String rootCommand;
 
     protected Command(GameManager gameManager, List<String> validTriggers, String description, String correctUsage) {
         this(gameManager, validTriggers, description, correctUsage, Sets.<PlayerRole>newHashSet());
@@ -64,54 +65,83 @@ public abstract class Command extends SimpleChannelUpstreamHandler {
         this.roles = roles;
     }
 
+    private void init(MessageEvent e) {
+        this.creeperSession = (CreeperSession) e.getChannel().getAttachment();;
+        this.originalMessageParts = getOriginalMessageParts(e);
+        this.rootCommand = getRootCommand(e);
+        this.player = playerManager.getPlayer(Main.createPlayerId(creeperSession.getUsername().get()));
+        this.playerId = player.getPlayerId();
+        this.currentRoom = gameManager.getRoomManager().getPlayerCurrentRoom(player).get();
+        this.mapMatrix = mapsManager.getFloorMatrixMaps().get(currentRoom.getFloorId());
+        this.currentRoomCoords = mapMatrix.getCoords(currentRoom.getRoomId());
+    }
+
     @Override
     public void handleUpstream(ChannelHandlerContext ctx, ChannelEvent e) throws Exception {
         try {
             if (e instanceof MessageEvent) {
-                this.creeperSession = extractCreeperSession(e.getChannel());
-                this.originalMessageParts = getOriginalMessageParts((MessageEvent) e);
-                this.player = playerManager.getPlayer(extractPlayerId(creeperSession));
-                this.playerId = player.getPlayerId();
-                this.currentRoom = gameManager.getRoomManager().getPlayerCurrentRoom(player).get();
-                this.mapMatrix = mapsManager.getFloorMatrixMaps().get(currentRoom.getFloorId());
-                this.currentRoomCoords = mapMatrix.getCoords(currentRoom.getRoomId());
+                init((MessageEvent) e);
             }
         } finally {
             super.handleUpstream(ctx, e);
         }
     }
 
-    @Override
-    public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        try {
-            CreeperSession creeperSession = extractCreeperSession(e.getChannel());
-            e.getChannel().getPipeline().remove(ctx.getHandler());
-            if (creeperSession.getGrabMerchant().isPresent()) {
-                return;
+    public void execCommandThreadSafe(ChannelHandlerContext ctx, MessageEvent e, Class c, CommandRunnable commandRunnable) throws Exception {
+        synchronized (c) {
+            try {
+                commandRunnable.run();
+            } catch (Exception ex) {
+                log.error("Problem running command.", ex);
+            } finally {
+                removeCurrentHandlerAndWritePrompt(ctx, e);
+                ctx.sendUpstream(e);
             }
-            String playerId = extractPlayerId(creeperSession);
-            String prompt = gameManager.buildPrompt(playerId);
-            gameManager.getChannelUtils().write(playerId, prompt, true);
+        }
+    }
+
+    public void execCommandBackgroundThread(ChannelHandlerContext ctx, MessageEvent e, CommandRunnable commandRunnable) throws Exception {
+        try {
+            new Thread(() -> {
+                try {
+                    commandRunnable.run();
+                } catch (Exception ex) {
+                    log.error("Problem running command.", ex);
+                }
+            }).start();
         } finally {
-            super.messageReceived(ctx, e);
+            removeCurrentHandlerAndWritePrompt(ctx, e);
+            ctx.sendUpstream(e);
         }
     }
 
-    public CreeperSession extractCreeperSession(Channel channel) {
-        return (CreeperSession) channel.getAttachment();
+    public void execCommand(ChannelHandlerContext ctx, MessageEvent e, CommandRunnable commandRunnable) throws Exception {
+        try {
+            commandRunnable.run();
+        } finally {
+            removeCurrentHandlerAndWritePrompt(ctx, e);
+            ctx.sendUpstream(e);
+        }
     }
 
+    private void removeCurrentHandlerAndWritePrompt(ChannelHandlerContext ctx, MessageEvent e) {
+        removeCurrentHandlerAndWritePrompt(ctx, e, true);
+    }
 
-    public String extractPlayerId(CreeperSession creeperSession) {
-        return Main.createPlayerId(creeperSession.getUsername().get());
+    public void removeCurrentHandlerAndWritePrompt(ChannelHandlerContext ctx, MessageEvent e, boolean newLine) {
+        e.getChannel().getPipeline().remove(ctx.getHandler());
+        if (creeperSession.getGrabMerchant().isPresent()) {
+            return;
+        }
+        gameManager.getChannelUtils().write(playerId, getPrompt(), newLine);
     }
 
-    public String getRootCommand(MessageEvent e) {
+    private String getRootCommand(MessageEvent e) {
         String origMessage = (String) e.getMessage();
         return origMessage.split(" ")[0].toLowerCase();
     }
 
-    public List<String> getOriginalMessageParts(MessageEvent e) {
+    private List<String> getOriginalMessageParts(MessageEvent e) {
         String origMessage = (String) e.getMessage();
         return new ArrayList<>(Arrays.asList(origMessage.split(" ")));
     }
@@ -128,11 +158,11 @@ public abstract class Command extends SimpleChannelUpstreamHandler {
         gameManager.writeToPlayerCurrentRoom(playerId, msg);
     }
 
-    public void currentRoomLogic() {
+    public void printCurrentRoomInformation() {
         gameManager.currentRoomLogic(playerId);
     }
 
-    public void currentRoomLogic(Room playerCurrentRoom) {
+    public void printCurrentRoomInformation(Room playerCurrentRoom) {
         gameManager.currentRoomLogic(playerId, playerCurrentRoom);
     }
 
@@ -144,42 +174,10 @@ public abstract class Command extends SimpleChannelUpstreamHandler {
         return description;
     }
 
-    public static boolean isInteger(String s) {
-        try {
-            Integer.parseInt(s);
-        } catch(NumberFormatException e) {
-            return false;
-        } catch(NullPointerException e) {
-            return false;
-        }
-        // only got here if we didn't return false
-        return true;
-    }
-
     public Command copy() throws ClassNotFoundException,
             InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
         Class<Command> clazz = (Class<Command>) this.getClass();
         return clazz.getConstructor(GameManager.class).newInstance(gameManager);
     }
 
-    public <T> T createObj(String nameclass) throws ClassNotFoundException,
-            InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
-
-        Class<T> clazz = (Class<T>) Class.forName(nameclass);
-
-        // assumes the target class has a no-args Constructor
-        return clazz.getConstructor(GameManager.class).newInstance(gameManager);
-    }
-
-    public static boolean isLong(String s) {
-        try {
-            Long.parseLong(s);
-        } catch(NumberFormatException e) {
-            return false;
-        } catch(NullPointerException e) {
-            return false;
-        }
-        // only got here if we didn't return false
-        return true;
-    }
 }
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/command/CommandRunnable.java b/src/main/java/com/comandante/creeper/command/CommandRunnable.java
new file mode 100644
index 00000000..2389edbe
--- /dev/null
+++ b/src/main/java/com/comandante/creeper/command/CommandRunnable.java
@@ -0,0 +1,6 @@
+package com.comandante.creeper.command;
+
+
+public interface CommandRunnable {
+    void run() throws java.lang.Exception;
+}
diff --git a/src/main/java/com/comandante/creeper/command/CoolDownCommand.java b/src/main/java/com/comandante/creeper/command/CoolDownCommand.java
index da6f57c1..7dace727 100644
--- a/src/main/java/com/comandante/creeper/command/CoolDownCommand.java
+++ b/src/main/java/com/comandante/creeper/command/CoolDownCommand.java
@@ -19,15 +19,13 @@ public class CoolDownCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             if (player.isActiveCoolDown()) {
                 write(gameManager.renderCoolDownString(player.getCoolDowns()));
             } else {
                 write("No active cooldowns.\r\n");
             }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
+
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/command/CountdownCommand.java b/src/main/java/com/comandante/creeper/command/CountdownCommand.java
index 9151639a..155e7190 100644
--- a/src/main/java/com/comandante/creeper/command/CountdownCommand.java
+++ b/src/main/java/com/comandante/creeper/command/CountdownCommand.java
@@ -10,6 +10,8 @@ import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.channel.MessageEvent;
 
 import java.util.*;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
 
 public class CountdownCommand extends Command {
 
@@ -23,39 +25,29 @@ public class CountdownCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
-            new Thread(new PrintCountdown(playerManager, channelUtils)).start();
-        } finally {
-            super.messageReceived(ctx, e);
-        }
-    }
-
-    public static class PrintCountdown implements Runnable {
-
-        private PlayerManager playerManager;
-        private ChannelCommunicationUtils channelUtils;
-
-        public PrintCountdown(PlayerManager playerManager, ChannelCommunicationUtils channelUtils) {
-            this.playerManager = playerManager;
-            this.channelUtils = channelUtils;
-        }
-
-        @Override
-        public void run() {
-            ArrayList<String> strings = Lists.newArrayList("... ***** COUNTDOWN ***** ...", ".             5             .", ".             4             .", ".             3             .", ".             2             .", ".             1             .", "... *****   SMOKE!  ***** ...");
-            for (String s : strings) {
-                Iterator<Map.Entry<String, Player>> players = playerManager.getPlayers();
-                while (players.hasNext()) {
-                    Map.Entry<String, Player> next = players.next();
-                    channelUtils.write(next.getValue().getPlayerId(), Color.BOLD_ON + Color.GREEN + s + Color.RESET + "\r\n", true);
-                }
+        execCommandBackgroundThread(ctx, e, () -> {
+            ArrayList<String> countDownMessages =
+                    Lists.newArrayList("... ***** COUNTDOWN ***** ...",
+                            ".             5             .",
+                            ".             4             .",
+                            ".             3             .",
+                            ".             2             .",
+                            ".             1             .",
+                            "... *****   SMOKE!  ***** ...");
+
+
+            countDownMessages.forEach(message -> {
+                writeMessageToEveryPlayer(message);
                 try {
                     Thread.sleep(900);
-                } catch (InterruptedException e) {
-                    e.printStackTrace();
+                } catch (InterruptedException ex) {
+                    log.error("Problem while printing countdown message", ex);
                 }
-            }
-        }
+            });
+        });
+    }
+
+    private void writeMessageToEveryPlayer(String message) {
+        playerManager.getAllPlayersMap().forEach((playerId1, player1) -> channelUtils.write(playerId1, Color.BOLD_ON + Color.GREEN + message + Color.RESET + "\r\n", true));
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/DelCommand.java b/src/main/java/com/comandante/creeper/command/DelCommand.java
index 32c8a176..d25cc8ba 100644
--- a/src/main/java/com/comandante/creeper/command/DelCommand.java
+++ b/src/main/java/com/comandante/creeper/command/DelCommand.java
@@ -22,7 +22,12 @@ public class DelCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
+        execCommand(ctx, e, new CommandRunnable() {
+            @Override
+            public void run() {
+
+            }
+        });
         try {
            if (originalMessageParts.size() <= 1) {
                 write(returnAllSettings());
diff --git a/src/main/java/com/comandante/creeper/command/DropCommand.java b/src/main/java/com/comandante/creeper/command/DropCommand.java
index b35c7430..0f90e752 100644
--- a/src/main/java/com/comandante/creeper/command/DropCommand.java
+++ b/src/main/java/com/comandante/creeper/command/DropCommand.java
@@ -21,8 +21,7 @@ public class DropCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             if (originalMessageParts.size() == 1) {
                 write("No item specified.");
                 return;
@@ -40,8 +39,6 @@ public class DropCommand extends Command {
                     return;
                 }
             }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/EquipCommand.java b/src/main/java/com/comandante/creeper/command/EquipCommand.java
index 1db17521..eba3949e 100644
--- a/src/main/java/com/comandante/creeper/command/EquipCommand.java
+++ b/src/main/java/com/comandante/creeper/command/EquipCommand.java
@@ -21,8 +21,7 @@ public class EquipCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             if (originalMessageParts.size() == 1) {
                 write("No equipment item specified.");
                 return;
@@ -44,8 +43,6 @@ public class EquipCommand extends Command {
             } else {
                 write("Your inventory is empty.");
             }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/command/FightKillCommand.java b/src/main/java/com/comandante/creeper/command/FightKillCommand.java
index e7d91f5a..6abad331 100644
--- a/src/main/java/com/comandante/creeper/command/FightKillCommand.java
+++ b/src/main/java/com/comandante/creeper/command/FightKillCommand.java
@@ -23,8 +23,7 @@ public class FightKillCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             if (player.getCurrentHealth() <= 0) {
                 write("You have no health and as such you can not attack.");
                 return;
@@ -57,8 +56,6 @@ public class FightKillCommand extends Command {
                 }
             }
             write("There's no NPC here to fight by that name.");
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/ForageCommand.java b/src/main/java/com/comandante/creeper/command/ForageCommand.java
index 0315af61..dd05e16e 100644
--- a/src/main/java/com/comandante/creeper/command/ForageCommand.java
+++ b/src/main/java/com/comandante/creeper/command/ForageCommand.java
@@ -19,11 +19,6 @@ public class ForageCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        try {
-            ;
-            gameManager.getForageManager().getForageForRoom(currentRoom, player);
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        execCommand(ctx, e, () -> gameManager.getForageManager().getForageForRoom(currentRoom, player));
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/command/GoldCommand.java b/src/main/java/com/comandante/creeper/command/GoldCommand.java
index 117390fc..a407223d 100644
--- a/src/main/java/com/comandante/creeper/command/GoldCommand.java
+++ b/src/main/java/com/comandante/creeper/command/GoldCommand.java
@@ -23,11 +23,6 @@ public class GoldCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
-          write("You have " + NumberFormat.getNumberInstance(Locale.US).format(playerManager.getPlayerMetadata(playerId).getGold()) + Color.YELLOW + " gold." + Color.RESET);
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        execCommand(ctx, e, () -> write("You have " + NumberFormat.getNumberInstance(Locale.US).format(playerManager.getPlayerMetadata(playerId).getGold()) + Color.YELLOW + " gold." + Color.RESET));
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/command/GossipCommand.java b/src/main/java/com/comandante/creeper/command/GossipCommand.java
index 8f17295f..a3e312fc 100644
--- a/src/main/java/com/comandante/creeper/command/GossipCommand.java
+++ b/src/main/java/com/comandante/creeper/command/GossipCommand.java
@@ -10,6 +10,7 @@ import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.channel.MessageEvent;
 
 import java.util.*;
+import java.util.function.BiConsumer;
 
 import static com.comandante.creeper.server.Color.*;
 
@@ -25,8 +26,7 @@ public class GossipCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             if (originalMessageParts.size() == 1) {
                 write("Nothing to gossip about?");
                 return;
@@ -41,21 +41,16 @@ public class GossipCommand extends Command {
             } catch (Exception ex) {
                 log.error("Problem executing bot command from gossip channel!", ex);
             }
-            Iterator<Map.Entry<String, Player>> players = playerManager.getPlayers();
-            String gossipMessage = null;
-            while (players.hasNext()) {
-                final Player next = players.next().getValue();
-                gossipMessage =   WHITE + "[" + RESET + MAGENTA + player.getPlayerName() +  WHITE + "] " + RESET + CYAN + msg + RESET;
-                if (next.getPlayerId().equals(playerId)) {
+            String gossipMessage = WHITE + "[" + RESET + MAGENTA + this.player.getPlayerName() +  WHITE + "] " + RESET + CYAN + msg + RESET;
+            playerManager.getAllPlayersMap().forEach((s, destinationPlayer) -> {
+                if (destinationPlayer.getPlayerId().equals(playerId)) {
                     write(gossipMessage);
                 } else {
-                    channelUtils.write(next.getPlayerId(), gossipMessage + "\r\n", true);
+                    channelUtils.write(destinationPlayer.getPlayerId(), gossipMessage + "\r\n", true);
                 }
-            }
+            });
             gameManager.getGossipCache().addGossipLine(gossipMessage);
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 
     private String getBotCommandOutput(String cmd) {
diff --git a/src/main/java/com/comandante/creeper/command/HelpCommand.java b/src/main/java/com/comandante/creeper/command/HelpCommand.java
index 6dd31b14..57c162ff 100644
--- a/src/main/java/com/comandante/creeper/command/HelpCommand.java
+++ b/src/main/java/com/comandante/creeper/command/HelpCommand.java
@@ -27,8 +27,7 @@ public class HelpCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             StringBuilder sb = new StringBuilder();
             Table t = new Table(2, BorderStyle.CLASSIC_COMPATIBLE,
                     ShownBorders.HEADER_FIRST_AND_LAST_COLLUMN);
@@ -52,8 +51,6 @@ public class HelpCommand extends Command {
             sb.append(t.render());
             sb.append("\r\n");
             write(sb.toString());
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/InventoryCommand.java b/src/main/java/com/comandante/creeper/command/InventoryCommand.java
index 482680f3..118faadd 100644
--- a/src/main/java/com/comandante/creeper/command/InventoryCommand.java
+++ b/src/main/java/com/comandante/creeper/command/InventoryCommand.java
@@ -24,8 +24,7 @@ public class InventoryCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        this.execCommand(ctx, e, () -> {
             List<Item> inventory = player.getInventory();
             if (inventory == null) {
                 write("You aren't carrying anything.");
@@ -37,8 +36,6 @@ public class InventoryCommand extends Command {
             String join = StringUtils.join(player.getRolledUpIntentory().toArray(), "\r\n");
             inventoryString.append(join);
             write(inventoryString.toString());
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/LookCommand.java b/src/main/java/com/comandante/creeper/command/LookCommand.java
index c62f2d91..8c370980 100644
--- a/src/main/java/com/comandante/creeper/command/LookCommand.java
+++ b/src/main/java/com/comandante/creeper/command/LookCommand.java
@@ -23,10 +23,9 @@ public class LookCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             if (originalMessageParts.size() == 1) {
-                currentRoomLogic();
+                printCurrentRoomInformation();
                 return;
             }
             originalMessageParts.remove(0);
@@ -57,8 +56,6 @@ public class LookCommand extends Command {
                     write(gameManager.getLookString(currentNpc, Levels.getLevel(gameManager.getStatsModifierFactory().getStatsModifier(player).getExperience())) + "\r\n");
                 }
             }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/LootCommand.java b/src/main/java/com/comandante/creeper/command/LootCommand.java
index d3878dde..68ede92d 100644
--- a/src/main/java/com/comandante/creeper/command/LootCommand.java
+++ b/src/main/java/com/comandante/creeper/command/LootCommand.java
@@ -12,6 +12,7 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Locale;
 import java.util.Set;
+import java.util.function.Consumer;
 
 public class LootCommand extends Command {
 
@@ -25,10 +26,9 @@ public class LootCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             if (originalMessageParts.size() > 1) {
-                for (Item item : player.getInventory()) {
+                player.getInventory().forEach(item -> {
                     if (item.getItemTypeId() == Item.CORPSE_ID_RESERVED) {
                         Loot loot = item.getLoot();
                         if (loot != null) {
@@ -38,22 +38,19 @@ public class LootCommand extends Command {
                                 player.incrementGold(gold);
                             }
                             Set<Item> items = lootManager.lootItemsReturn(loot);
-                            for (Item i: items) {
-                                    gameManager.acquireItem(player, i.getItemId());
-                                    write("You looted " + i.getItemName() +  " from a " + item.getItemName() + ".\r\n");
-                                }
+                            items.forEach(i -> {
+                                gameManager.acquireItem(player, i.getItemId());
+                                write("You looted " + i.getItemName() + " from a " + item.getItemName() + ".\r\n");
+                            });
                             if (gold < 0 && items.size() == 0) {
                                 write("You looted nothing from " + item.getItemName() + "\r\n");
                             }
                         }
                         player.removeInventoryId(item.getItemId());
                         entityManager.removeItem(item);
-                        return;
                     }
-                }
+                });
             }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
-}
\ No newline at end of file
+}
diff --git a/src/main/java/com/comandante/creeper/command/MapCommand.java b/src/main/java/com/comandante/creeper/command/MapCommand.java
index f896400a..769779c8 100644
--- a/src/main/java/com/comandante/creeper/command/MapCommand.java
+++ b/src/main/java/com/comandante/creeper/command/MapCommand.java
@@ -5,6 +5,7 @@ import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.player.Player;
 import com.comandante.creeper.world.Coords;
 import com.comandante.creeper.world.Room;
+import org.apache.commons.lang.math.NumberUtils;
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.channel.MessageEvent;
 
@@ -24,26 +25,23 @@ public class MapCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
-            if (originalMessageParts.size() > 1 && isInteger(originalMessageParts.get(1))) {
+        execCommand(ctx, e, () -> {
+            if (originalMessageParts.size() > 1 && NumberUtils.isNumber(originalMessageParts.get(1))) {
                 int max = Integer.parseInt(originalMessageParts.get(1));
                 write(mapsManager.drawMap(currentRoom.getRoomId(), new Coords(max, max)));
             } else {
-                Player player = playerManager.getPlayer(playerId);
-                final Room playerCurrentRoom = roomManager.getPlayerCurrentRoom(player).get();
+                Player player1 = playerManager.getPlayer(playerId);
+                final Room playerCurrentRoom = roomManager.getPlayerCurrentRoom(player1).get();
                 StringBuilder sb = new StringBuilder();
 
                 if (playerCurrentRoom.getMapData().isPresent()) {
                     sb.append(playerCurrentRoom.getMapData().get()).append("\r\n");
-                    channelUtils.write(player.getPlayerId(), sb.toString());
+                    channelUtils.write(player1.getPlayerId(), sb.toString());
                 } else {
-                    channelUtils.write(player.getPlayerId(), "No map data.");
+                    channelUtils.write(player1.getPlayerId(), "No map data.");
                 }
             }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
 
diff --git a/src/main/java/com/comandante/creeper/command/MovementCommand.java b/src/main/java/com/comandante/creeper/command/MovementCommand.java
index 4a1e2812..6fac2a96 100644
--- a/src/main/java/com/comandante/creeper/command/MovementCommand.java
+++ b/src/main/java/com/comandante/creeper/command/MovementCommand.java
@@ -35,66 +35,63 @@ public class MovementCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        try {
-            ;
+        this.execCommand(ctx, e, () -> {
             if (player.isActiveFights()) {
-                write("You can't move while in a fight!");
+                MovementCommand.this.write("You can't move while in a fight!");
                 return;
             }
             if (player.isActive(CoolDownType.DEATH)) {
-                write("You are dead and can not move.");
+                MovementCommand.this.write("You are dead and can not move.");
                 return;
             }
             for (String effectId : playerManager.getPlayerMetadata(playerId).getEffects()) {
                 Effect effect = gameManager.getEntityManager().getEffectEntity(effectId);
                 if (effect.isFrozenMovement()) {
-                    write("You are frozen and can not move.");
+                    MovementCommand.this.write("You are frozen and can not move.");
                     return;
                 }
             }
-            final String command = getRootCommand(e);
+            final String command = rootCommand;
             PlayerMovement playerMovement = null;
             if (!validTriggers.contains(command.toLowerCase())) {
                 throw new RuntimeException("Malformed movement command.");
             } else if (northTriggers.contains(command.toLowerCase()) && currentRoom.getNorthId().isPresent()) {
                 Room destinationRoom = roomManager.getRoom(currentRoom.getNorthId().get());
-                playerMovement = new PlayerMovement(player, currentRoom.getRoomId(), destinationRoom.getRoomId(), this, "exited to the north.", "south");
+                playerMovement = new PlayerMovement(player, currentRoom.getRoomId(), destinationRoom.getRoomId(), "exited to the north.", "south");
             } else if (southTriggers.contains(command.toLowerCase()) && currentRoom.getSouthId().isPresent()) {
                 Room destinationRoom = roomManager.getRoom(currentRoom.getSouthId().get());
-                playerMovement = new PlayerMovement(player, currentRoom.getRoomId(), destinationRoom.getRoomId(), this, "exited to the south.", "north");
+                playerMovement = new PlayerMovement(player, currentRoom.getRoomId(), destinationRoom.getRoomId(), "exited to the south.", "north");
             } else if (eastTriggers.contains(command.toLowerCase()) && currentRoom.getEastId().isPresent()) {
                 Room destinationRoom = roomManager.getRoom(currentRoom.getEastId().get());
-                playerMovement = new PlayerMovement(player, currentRoom.getRoomId(), destinationRoom.getRoomId(), this, "exited to the east.", "west");
+                playerMovement = new PlayerMovement(player, currentRoom.getRoomId(), destinationRoom.getRoomId(), "exited to the east.", "west");
             } else if (westTriggers.contains(command.toLowerCase()) && currentRoom.getWestId().isPresent()) {
                 Room destinationRoom = roomManager.getRoom(currentRoom.getWestId().get());
-                playerMovement = new PlayerMovement(player, currentRoom.getRoomId(), destinationRoom.getRoomId(), this, "exited to the west.", "east");
+                playerMovement = new PlayerMovement(player, currentRoom.getRoomId(), destinationRoom.getRoomId(), "exited to the west.", "east");
             } else if (upTriggers.contains(command.toLowerCase()) && currentRoom.getUpId().isPresent()) {
                 Room destinationRoom = roomManager.getRoom(currentRoom.getUpId().get());
-                playerMovement = new PlayerMovement(player, currentRoom.getRoomId(), destinationRoom.getRoomId(), this, "exited up.", "down");
+                playerMovement = new PlayerMovement(player, currentRoom.getRoomId(), destinationRoom.getRoomId(), "exited up.", "down");
             } else if (downTriggers.contains(command.toLowerCase()) && currentRoom.getDownId().isPresent()) {
                 Room destinationRoom = roomManager.getRoom(currentRoom.getDownId().get());
-                playerMovement = new PlayerMovement(player, currentRoom.getRoomId(), destinationRoom.getRoomId(), this, "exited down.", "up");
+                playerMovement = new PlayerMovement(player, currentRoom.getRoomId(), destinationRoom.getRoomId(), "exited down.", "up");
             } else if (enterTriggers.contains(command.toLowerCase())) {
-                Optional<RemoteExit> remoteExitOptional = doesEnterExitExist();
+                Optional<RemoteExit> remoteExitOptional = MovementCommand.this.doesEnterExitExist();
                 if (remoteExitOptional.isPresent()) {
                     Room destinationRoom = roomManager.getRoom(remoteExitOptional.get().getRoomId());
-                    playerMovement = new PlayerMovement(player, currentRoom.getRoomId(), destinationRoom.getRoomId(), this, "entered " + remoteExitOptional.get().getExitDetail() + ".", "N/A");
+                    playerMovement = new PlayerMovement(player, currentRoom.getRoomId(), destinationRoom.getRoomId(), "entered " + remoteExitOptional.get().getExitDetail() + ".", "N/A");
                 } else {
-                    write("There's no where to go with that name. (" + command + ")");
+                    MovementCommand.this.write("There's no where to go with that name. (" + command + ")");
                     return;
                 }
             } else {
-                write("There's no exit in that direction. (" + command + ")");
+                MovementCommand.this.write("There's no exit in that direction. (" + command + ")");
                 return;
             }
             player.movePlayer(playerMovement);
             if (playerMovement != null) {
                 player.setReturnDirection(Optional.of(playerMovement.getReturnDirection()));
-                currentRoomLogic(roomManager.getRoom(playerMovement.getDestinationRoomId()));
+                MovementCommand.this.printCurrentRoomInformation(roomManager.getRoom(playerMovement.getDestinationRoomId()));
             }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 
     private Optional<RemoteExit> doesEnterExitExist() {
diff --git a/src/main/java/com/comandante/creeper/command/NexusCommand.java b/src/main/java/com/comandante/creeper/command/NexusCommand.java
index 6be9c002..be8c757e 100644
--- a/src/main/java/com/comandante/creeper/command/NexusCommand.java
+++ b/src/main/java/com/comandante/creeper/command/NexusCommand.java
@@ -20,8 +20,7 @@ public class NexusCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             if (gameManager.getCreeperConfiguration().isIrcEnabled) {
                 originalMessageParts.remove(0);
                 String transferPhrase = Joiner.on(" ").join(originalMessageParts);
@@ -29,8 +28,6 @@ public class NexusCommand extends Command {
                     gameManager.getIrcBotService().getBot().getUserChannelDao().getChannel(gameManager.getCreeperConfiguration().ircChannel).send().message(player.getPlayerName() + ": " + transferPhrase);
                 }
             }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/command/OpCommand.java b/src/main/java/com/comandante/creeper/command/OpCommand.java
index 45bac4b2..4088c41b 100644
--- a/src/main/java/com/comandante/creeper/command/OpCommand.java
+++ b/src/main/java/com/comandante/creeper/command/OpCommand.java
@@ -32,8 +32,7 @@ public class OpCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             //ghetto and will only work for one channel bots.
             if (originalMessageParts.size() <= 1) {
                 return;
@@ -48,11 +47,9 @@ public class OpCommand extends Command {
             }
             ImmutableSortedSet<Channel> channels = user.getChannels();
             for (Channel channel : channels) {
-                    channel.send().op(user);
-                    write("Ops given in channel " + channel.getName());
-                }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+                channel.send().op(user);
+                write("Ops given in channel " + channel.getName());
+            }
+        });
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/OpenCommand.java b/src/main/java/com/comandante/creeper/command/OpenCommand.java
index bd6aee75..6c2a1ac2 100644
--- a/src/main/java/com/comandante/creeper/command/OpenCommand.java
+++ b/src/main/java/com/comandante/creeper/command/OpenCommand.java
@@ -5,18 +5,14 @@ import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.merchant.Merchant;
 import com.comandante.creeper.merchant.lockers.LockerCommand;
 import com.google.common.base.Joiner;
-import com.google.common.base.Optional;
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.channel.MessageEvent;
-import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 
-/**
- * Created by kearney on 6/12/15.
- */
 public class OpenCommand extends Command {
 
     final static List<String> validTriggers = Arrays.asList("open", "o");
@@ -29,10 +25,10 @@ public class OpenCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        OpenCommand openCommand = this;
+        execCommand(ctx, e, () -> {
             if (creeperSession.getGrabMerchant().isPresent()) {
-                creeperSession.setGrabMerchant(Optional.<CreeperEntry<Merchant, SimpleChannelUpstreamHandler>>absent());
+                creeperSession.setGrabMerchant(Optional.empty());
                 return;
             }
             originalMessageParts.remove(0);
@@ -45,12 +41,9 @@ public class OpenCommand extends Command {
                 if (merchant.getValidTriggers().contains(desiredMerchantTalk)) {
                     write(merchant.getWelcomeMessage() + "\r\n");
                     write(LockerCommand.getPrompt());
-                    creeperSession.setGrabMerchant(Optional.of(
-                            new CreeperEntry<Merchant, SimpleChannelUpstreamHandler>(merchant, this)));
+                    creeperSession.setGrabMerchant(Optional.of(new CreeperEntry<>(merchant, openCommand)));
                 }
             }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/command/PickUpCommand.java b/src/main/java/com/comandante/creeper/command/PickUpCommand.java
index cb725135..6a8614db 100644
--- a/src/main/java/com/comandante/creeper/command/PickUpCommand.java
+++ b/src/main/java/com/comandante/creeper/command/PickUpCommand.java
@@ -22,7 +22,7 @@ public class PickUpCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        try {
+        execCommand(ctx, e, () -> {
             Set<String> itemIds = currentRoom.getItemIds();
             originalMessageParts.remove(0);
             String desiredPickUpItem = Joiner.on(" ").join(originalMessageParts);
@@ -38,8 +38,6 @@ public class PickUpCommand extends Command {
                     }
                 }
             }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/QuitCommand.java b/src/main/java/com/comandante/creeper/command/QuitCommand.java
index 2d0c398c..f21ee77d 100644
--- a/src/main/java/com/comandante/creeper/command/QuitCommand.java
+++ b/src/main/java/com/comandante/creeper/command/QuitCommand.java
@@ -19,11 +19,12 @@ public class QuitCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        if (player.getActiveFights().size() > 0) {
-            write("You can't quit in the middle of a fight!");
-        } else {
-            gameManager.getPlayerManager().removePlayer(creeperSession.getUsername().get());
-        }
+        execCommand(ctx, e, () -> {
+            if (player.getActiveFights().size() > 0) {
+                write("You can't quit in the middle of a fight!");
+            } else {
+                gameManager.getPlayerManager().removePlayer(creeperSession.getUsername().get());
+            }
+        });
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/RecentChangesCommand.java b/src/main/java/com/comandante/creeper/command/RecentChangesCommand.java
index c1a64a9a..997b9660 100644
--- a/src/main/java/com/comandante/creeper/command/RecentChangesCommand.java
+++ b/src/main/java/com/comandante/creeper/command/RecentChangesCommand.java
@@ -7,6 +7,7 @@ import org.jboss.netty.channel.MessageEvent;
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.concurrent.ExecutionException;
 
 public class RecentChangesCommand extends Command {
 
@@ -20,11 +21,12 @@ public class RecentChangesCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
-            write(RecentChangesManager.getRecentChanges());
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        execCommandBackgroundThread(ctx, e, () -> {
+            try {
+                write(RecentChangesManager.getRecentChanges());
+            } catch (ExecutionException ex) {
+                log.error("Unable to retrieve recent changes.", ex);
+            }
+        });
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/RecentGossipCommand.java b/src/main/java/com/comandante/creeper/command/RecentGossipCommand.java
index 6b7ddad0..ea11c2fd 100644
--- a/src/main/java/com/comandante/creeper/command/RecentGossipCommand.java
+++ b/src/main/java/com/comandante/creeper/command/RecentGossipCommand.java
@@ -20,8 +20,7 @@ public class RecentGossipCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             List<String> recent = null;
             if (originalMessageParts.size() > 1) {
                 String size = originalMessageParts.get(1);
@@ -38,8 +37,6 @@ public class RecentGossipCommand extends Command {
             for (String line : recent) {
                 write(line + "\r\n");
             }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/SayCommand.java b/src/main/java/com/comandante/creeper/command/SayCommand.java
index 27c79df2..11715d00 100644
--- a/src/main/java/com/comandante/creeper/command/SayCommand.java
+++ b/src/main/java/com/comandante/creeper/command/SayCommand.java
@@ -26,20 +26,19 @@ public class SayCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             originalMessageParts.remove(0);
             String message = Joiner.on(" ").join(originalMessageParts);
             Set<Player> presentPlayers = roomManager.getPresentPlayers(currentRoom);
             for (Player presentPlayer : presentPlayers) {
-                StringBuilder stringBuilder = new StringBuilder();
-                stringBuilder.append(RED);
-                stringBuilder.append("<").append(player.getPlayerName()).append("> ").append(message);
-                stringBuilder.append(RESET);
+                StringBuilder sb = new StringBuilder();
+                sb.append(RED);
+                sb.append("<").append(player.getPlayerName()).append("> ").append(message);
+                sb.append(RESET);
                 if (presentPlayer.getPlayerId().equals(playerId)) {
-                    write(stringBuilder.toString());
+                    write(sb.toString());
                 } else {
-                    channelUtils.write(presentPlayer.getPlayerId(), stringBuilder.append("\r\n").toString(), true);
+                    channelUtils.write(presentPlayer.getPlayerId(), sb.append("\r\n").toString(), true);
                 }
             }
             if (gameManager.getCreeperConfiguration().isIrcEnabled && (Objects.equals(gameManager.getCreeperConfiguration().ircBridgeRoomId, currentRoom.getRoomId()))) {
@@ -47,8 +46,6 @@ public class SayCommand extends Command {
                     gameManager.getIrcBotService().getBot().getUserChannelDao().getChannel(gameManager.getCreeperConfiguration().ircChannel).send().message(player.getPlayerName() + ": " + message);
                 }
             }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/SetCommand.java b/src/main/java/com/comandante/creeper/command/SetCommand.java
index ab1e597a..e6757008 100644
--- a/src/main/java/com/comandante/creeper/command/SetCommand.java
+++ b/src/main/java/com/comandante/creeper/command/SetCommand.java
@@ -21,8 +21,7 @@ public class SetCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             write("'set help' for full settings help.\r\n");
             if (originalMessageParts.size() <= 1) {
                 write(returnAllSettings());
@@ -42,9 +41,7 @@ public class SetCommand extends Command {
             } else {
                 write ("Unknown Setting.\r\n");
             }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 
     private String returnAllSettings() {
diff --git a/src/main/java/com/comandante/creeper/command/ShowCommand.java b/src/main/java/com/comandante/creeper/command/ShowCommand.java
index 0ef1a975..d60622c0 100644
--- a/src/main/java/com/comandante/creeper/command/ShowCommand.java
+++ b/src/main/java/com/comandante/creeper/command/ShowCommand.java
@@ -19,8 +19,7 @@ public class ShowCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             if (originalMessageParts.size() <= 1) {
                 return;
             }
@@ -34,8 +33,6 @@ public class ShowCommand extends Command {
                     }
                 }
             }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/command/TalkCommand.java b/src/main/java/com/comandante/creeper/command/TalkCommand.java
index a7eec7a0..6abae374 100644
--- a/src/main/java/com/comandante/creeper/command/TalkCommand.java
+++ b/src/main/java/com/comandante/creeper/command/TalkCommand.java
@@ -8,13 +8,13 @@ import com.comandante.creeper.merchant.MerchantCommandHandler;
 import com.comandante.creeper.merchant.bank.commands.BankCommand;
 import com.comandante.creeper.merchant.lockers.LockerCommand;
 import com.google.common.base.Joiner;
-import com.google.common.base.Optional;
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.channel.MessageEvent;
 import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 
 public class TalkCommand extends Command {
@@ -29,10 +29,10 @@ public class TalkCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        TalkCommand talkCommand = this;
+        execCommand(ctx, e, () -> {
             if (creeperSession.getGrabMerchant().isPresent()) {
-                creeperSession.setGrabMerchant(Optional.<CreeperEntry<Merchant, SimpleChannelUpstreamHandler>>absent());
+                creeperSession.setGrabMerchant(Optional.empty());
                 return;
             }
             originalMessageParts.remove(0);
@@ -50,11 +50,9 @@ public class TalkCommand extends Command {
                         write(LockerCommand.getPrompt());
                     }
                     creeperSession.setGrabMerchant(Optional.of(
-                            new CreeperEntry<Merchant, SimpleChannelUpstreamHandler>(merchant, this)));
+                            new CreeperEntry<>(merchant, talkCommand)));
                 }
             }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/command/TellCommand.java b/src/main/java/com/comandante/creeper/command/TellCommand.java
index 57c6267d..3a95fa8b 100644
--- a/src/main/java/com/comandante/creeper/command/TellCommand.java
+++ b/src/main/java/com/comandante/creeper/command/TellCommand.java
@@ -24,7 +24,7 @@ public class TellCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        try {
+        execCommand(ctx, e, () -> {
             if (originalMessageParts.size() < 3) {
                 write("tell failed, no message to send.");
                 return;
@@ -50,8 +50,6 @@ public class TellCommand extends Command {
             stringBuilder.append(RESET);
             channelUtils.write(desintationPlayer.getPlayerId(), destinationPlayercolor + stringBuilder.append("\r\n").toString(), true);
             write(stringBuilder.toString());
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/TimeCommand.java b/src/main/java/com/comandante/creeper/command/TimeCommand.java
index c00d5eb1..f714398c 100644
--- a/src/main/java/com/comandante/creeper/command/TimeCommand.java
+++ b/src/main/java/com/comandante/creeper/command/TimeCommand.java
@@ -20,12 +20,9 @@ public class TimeCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             TimeTracker.TimeOfDay timeOfDay = gameManager.getTimeTracker().getTimeOfDay();
             write(timeOfDay.color + timeOfDay + Color.RESET);
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/command/UnequipCommand.java b/src/main/java/com/comandante/creeper/command/UnequipCommand.java
index 15312ea8..ac4e54fe 100644
--- a/src/main/java/com/comandante/creeper/command/UnequipCommand.java
+++ b/src/main/java/com/comandante/creeper/command/UnequipCommand.java
@@ -22,8 +22,7 @@ public class UnequipCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             if (originalMessageParts.size() == 1) {
                 write("No equipment item specified.");
                 return;
@@ -38,8 +37,6 @@ public class UnequipCommand extends Command {
                 }
             }
             write("Item is not currently equipped.");
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/command/UnknownCommand.java b/src/main/java/com/comandante/creeper/command/UnknownCommand.java
index 94f41c3a..9a76b079 100644
--- a/src/main/java/com/comandante/creeper/command/UnknownCommand.java
+++ b/src/main/java/com/comandante/creeper/command/UnknownCommand.java
@@ -12,11 +12,6 @@ public class UnknownCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
-            write(getPrompt(), false);
-            e.getChannel().getPipeline().remove(ctx.getHandler());
-        } finally {
-        }
+        removeCurrentHandlerAndWritePrompt(ctx, e, false);
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/UseCommand.java b/src/main/java/com/comandante/creeper/command/UseCommand.java
index 21d9775e..e04458b6 100644
--- a/src/main/java/com/comandante/creeper/command/UseCommand.java
+++ b/src/main/java/com/comandante/creeper/command/UseCommand.java
@@ -22,8 +22,7 @@ public class UseCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             if (originalMessageParts.size() == 1) {
                 write("No item specified.");
                 return;
@@ -36,8 +35,6 @@ public class UseCommand extends Command {
                 return;
             }
             gameManager.getItemUseHandler().handle(player, inventoryItem);
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/WhoCommand.java b/src/main/java/com/comandante/creeper/command/WhoCommand.java
index 892c4fc0..c89def62 100755
--- a/src/main/java/com/comandante/creeper/command/WhoCommand.java
+++ b/src/main/java/com/comandante/creeper/command/WhoCommand.java
@@ -27,10 +27,9 @@ public class WhoCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             StringBuilder output = new StringBuilder();
-           // output.append(Color.MAGENTA + "Who--------------------------------" + Color.RESET).append("\r\n");
+            // output.append(Color.MAGENTA + "Who--------------------------------" + Color.RESET).append("\r\n");
             Table t = new Table(4, BorderStyle.BLANKS,
                     ShownBorders.NONE);
             t.setColumnWidth(0, 14, 24);
@@ -49,8 +48,6 @@ public class WhoCommand extends Command {
             }
             output.append(t.render());
             write(output.toString());
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/WhoamiCommand.java b/src/main/java/com/comandante/creeper/command/WhoamiCommand.java
index beabc935..6c73a13d 100644
--- a/src/main/java/com/comandante/creeper/command/WhoamiCommand.java
+++ b/src/main/java/com/comandante/creeper/command/WhoamiCommand.java
@@ -18,11 +18,6 @@ public class WhoamiCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
-            write(player.getPlayerName());
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        execCommand(ctx, e, () -> write(player.getPlayerName()));
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/XpCommand.java b/src/main/java/com/comandante/creeper/command/XpCommand.java
index d7d27b0c..85dc03f4 100644
--- a/src/main/java/com/comandante/creeper/command/XpCommand.java
+++ b/src/main/java/com/comandante/creeper/command/XpCommand.java
@@ -31,8 +31,7 @@ public class XpCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             PlayerMetadata playerMetadata = playerManager.getPlayerMetadata(player.getPlayerId());
             long nextLevel = Levels.getLevel(playerMetadata.getStats().getExperience()) + 1;
             long expToNextLevel = Levels.getXp(nextLevel) - playerMetadata.getStats().getExperience();
@@ -52,9 +51,7 @@ public class XpCommand extends Command {
             table.addCell(String.valueOf(round(meter.getFifteenMinuteRate())));
 
             write(NumberFormat.getNumberInstance(Locale.US).format(expToNextLevel) + " experience to level " + nextLevel + ".\r\n" + table.render());
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 
     public static double round(double value) {
diff --git a/src/main/java/com/comandante/creeper/command/admin/AreaCommand.java b/src/main/java/com/comandante/creeper/command/admin/AreaCommand.java
index a58a566f..9d20b36a 100644
--- a/src/main/java/com/comandante/creeper/command/admin/AreaCommand.java
+++ b/src/main/java/com/comandante/creeper/command/admin/AreaCommand.java
@@ -1,6 +1,7 @@
 package com.comandante.creeper.command.admin;
 
 import com.comandante.creeper.command.Command;
+import com.comandante.creeper.command.CommandRunnable;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.player.PlayerRole;
 import com.comandante.creeper.world.Area;
@@ -25,11 +26,10 @@ public class AreaCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             if (originalMessageParts.size() == 1) {
                 Set<Area> areas = currentRoom.getAreas();
-                for (Area area: areas) {
+                for (Area area : areas) {
                     write(area.getName() + "\r\n");
                 }
                 return;
@@ -37,7 +37,7 @@ public class AreaCommand extends Command {
             String s = originalMessageParts.get(1);
             List<String> strings = Arrays.asList(s.split(","));
             Set<Area> newAreas = Sets.newConcurrentHashSet();
-            for (String string: strings) {
+            for (String string : strings) {
                 String trim = string.trim();
                 Area byName = Area.getByName(trim);
                 if (byName != null) {
@@ -48,8 +48,6 @@ public class AreaCommand extends Command {
                     write(byName + " is not a known area in the code base.");
                 }
             }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/admin/BounceIrcBotCommand.java b/src/main/java/com/comandante/creeper/command/admin/BounceIrcBotCommand.java
index 7b6e56d9..30fd2fe2 100644
--- a/src/main/java/com/comandante/creeper/command/admin/BounceIrcBotCommand.java
+++ b/src/main/java/com/comandante/creeper/command/admin/BounceIrcBotCommand.java
@@ -1,6 +1,7 @@
 package com.comandante.creeper.command.admin;
 
 import com.comandante.creeper.command.Command;
+import com.comandante.creeper.command.CommandRunnable;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.player.PlayerRole;
 import com.google.common.collect.Sets;
@@ -25,9 +26,8 @@ public class BounceIrcBotCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        try {
-            synchronized (BounceIrcBotCommand.class) {
-                ;
+        execCommandThreadSafe(ctx, e, BounceIrcBotCommand.class, () -> {
+            try {
                 MultiBotManager<PircBotX> manager = gameManager.getIrcBotService().getManager();
                 write("IRC Bot Service shutting down.\r\n");
                 manager.stopAndWait();
@@ -36,9 +36,9 @@ public class BounceIrcBotCommand extends Command {
                 multiBotManager.start();
                 gameManager.getIrcBotService().setManager(multiBotManager);
                 write("IRC Bot Service started.\r\n");
+            } catch (Exception ex) {
+                log.error("Unable to restart IRC service", ex);
             }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/command/admin/BuildCommand.java b/src/main/java/com/comandante/creeper/command/admin/BuildCommand.java
index 1a866f3c..1ae0f18b 100644
--- a/src/main/java/com/comandante/creeper/command/admin/BuildCommand.java
+++ b/src/main/java/com/comandante/creeper/command/admin/BuildCommand.java
@@ -159,7 +159,7 @@ public class BuildCommand extends Command {
         rebuildExits(currentRoom, mapMatrix);
         processExits(basicRoom, mapMatrix);
         mapsManager.generateAllMaps();
-        player.movePlayer(new PlayerMovement(player, currentRoom.getRoomId(), basicRoom.getRoomId(), null, "", ""));
+        player.movePlayer(new PlayerMovement(player, currentRoom.getRoomId(), basicRoom.getRoomId(), "", ""));
         gameManager.currentRoomLogic(player.getPlayerId());
         write("Room Created.");
     }
@@ -218,7 +218,7 @@ public class BuildCommand extends Command {
         }
         mapsManager.addFloorMatrix(newFloorModel.getId(), matrixFromCsv);
         mapsManager.generateAllMaps();
-        player.movePlayer(new PlayerMovement(player, currentRoom.getRoomId(), newRoom.getRoomId(), null, "", ""));
+        player.movePlayer(new PlayerMovement(player, currentRoom.getRoomId(), newRoom.getRoomId(), "", ""));
         gameManager.currentRoomLogic(player.getPlayerId());
     }
 
diff --git a/src/main/java/com/comandante/creeper/command/admin/DescriptionCommand.java b/src/main/java/com/comandante/creeper/command/admin/DescriptionCommand.java
index 16a462ad..34b42d7d 100644
--- a/src/main/java/com/comandante/creeper/command/admin/DescriptionCommand.java
+++ b/src/main/java/com/comandante/creeper/command/admin/DescriptionCommand.java
@@ -2,11 +2,11 @@ package com.comandante.creeper.command.admin;
 
 import com.comandante.creeper.CreeperEntry;
 import com.comandante.creeper.command.Command;
+import com.comandante.creeper.command.CommandRunnable;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.player.PlayerRole;
 import com.comandante.creeper.server.MultiLineInputManager;
 import com.google.common.base.Joiner;
-import com.google.common.base.Optional;
 import com.google.common.collect.Sets;
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.channel.MessageEvent;
@@ -27,14 +27,14 @@ public class DescriptionCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        DescriptionCommand descriptionCommand = this;
+        execCommand(ctx, e, () -> {
             if (creeperSession.getGrabMultiLineInput().isPresent()) {
                 MultiLineInputManager multiLineInputManager = gameManager.getMultiLineInputManager();
                 UUID uuid = creeperSession.getGrabMultiLineInput().get().getKey();
                 String multiLineInput = multiLineInputManager.retrieveMultiLineInput(uuid);
                 currentRoom.setRoomDescription(multiLineInput);
-                creeperSession.setGrabMultiLineInput(Optional.<CreeperEntry<UUID, Command>>absent());
+                creeperSession.setGrabMultiLineInput(Optional.empty());
                 return;
             }
             if (originalMessageParts.size() > 1) {
@@ -54,9 +54,7 @@ public class DescriptionCommand extends Command {
             }
             write("You are now in multi-line mode.  Type \"done\" on an empty line to exit and save.\r\n");
             creeperSession.setGrabMultiLineInput(Optional.of(
-                    new CreeperEntry<UUID, Command>(gameManager.getMultiLineInputManager().createNewMultiLineInput(), this)));
-        } finally {
-           super.messageReceived(ctx, e);
-        }
+                    new CreeperEntry<>(gameManager.getMultiLineInputManager().createNewMultiLineInput(), descriptionCommand)));
+        });
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/admin/GiveGoldCommand.java b/src/main/java/com/comandante/creeper/command/admin/GiveGoldCommand.java
index 0def91d4..0eeae1d8 100644
--- a/src/main/java/com/comandante/creeper/command/admin/GiveGoldCommand.java
+++ b/src/main/java/com/comandante/creeper/command/admin/GiveGoldCommand.java
@@ -1,10 +1,12 @@
 package com.comandante.creeper.command.admin;
 
 import com.comandante.creeper.command.Command;
+import com.comandante.creeper.command.CommandRunnable;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.player.Player;
 import com.comandante.creeper.player.PlayerRole;
 import com.google.common.collect.Sets;
+import org.apache.commons.lang.math.NumberUtils;
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.channel.MessageEvent;
 
@@ -26,8 +28,7 @@ public class GiveGoldCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             if (!player.getPlayerName().equals("fibs")) {
                 write("This attempt to cheat has been logged.");
                 return;
@@ -35,7 +36,7 @@ public class GiveGoldCommand extends Command {
             if (originalMessageParts.size() > 2) {
                 String destinationPlayerName = originalMessageParts.get(1);
                 String amt = originalMessageParts.get(2);
-                if (!isInteger(amt)) {
+                if (!NumberUtils.isNumber(amt)) {
                     write("Third option to givegold needs to be an integer amount.");
                     return;
                 }
@@ -47,8 +48,6 @@ public class GiveGoldCommand extends Command {
                 playerByUsername.incrementGold(Integer.parseInt(amt));
                 write("The amount of " + amt + " gold has been placed into " + destinationPlayerName + "'s inventory.");
             }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/command/admin/GiveHealthCommand.java b/src/main/java/com/comandante/creeper/command/admin/GiveHealthCommand.java
index 66150c62..806fcff6 100644
--- a/src/main/java/com/comandante/creeper/command/admin/GiveHealthCommand.java
+++ b/src/main/java/com/comandante/creeper/command/admin/GiveHealthCommand.java
@@ -1,10 +1,12 @@
 package com.comandante.creeper.command.admin;
 
 import com.comandante.creeper.command.Command;
+import com.comandante.creeper.command.CommandRunnable;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.player.Player;
 import com.comandante.creeper.player.PlayerRole;
 import com.google.common.collect.Sets;
+import org.apache.commons.lang.math.NumberUtils;
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.channel.MessageEvent;
 
@@ -26,8 +28,7 @@ public class GiveHealthCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             if (!player.getPlayerName().equals("fibs")) {
                 write("This attempt to cheat has been logged.");
                 return;
@@ -35,7 +36,7 @@ public class GiveHealthCommand extends Command {
             if (originalMessageParts.size() > 2) {
                 String destinationPlayerName = originalMessageParts.get(1);
                 String amt = originalMessageParts.get(2);
-                if (!isInteger(amt)) {
+                if (!NumberUtils.isNumber(amt)) {
                     write("Third option to givehealth needs to be an integer amount.");
                     return;
                 }
@@ -47,8 +48,6 @@ public class GiveHealthCommand extends Command {
                 playerByUsername.incrementGold(Integer.parseInt(amt));
                 write("The amount of " + amt + " gold has been placed into " + destinationPlayerName + "'s inventory.");
             }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/command/admin/InfoCommand.java b/src/main/java/com/comandante/creeper/command/admin/InfoCommand.java
index 6542db73..c9be087f 100644
--- a/src/main/java/com/comandante/creeper/command/admin/InfoCommand.java
+++ b/src/main/java/com/comandante/creeper/command/admin/InfoCommand.java
@@ -23,11 +23,8 @@ public class InfoCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             write("roomId: " + currentRoom.getRoomId());
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/command/admin/NotablesCommand.java b/src/main/java/com/comandante/creeper/command/admin/NotablesCommand.java
index a99b0d51..c26a20f2 100644
--- a/src/main/java/com/comandante/creeper/command/admin/NotablesCommand.java
+++ b/src/main/java/com/comandante/creeper/command/admin/NotablesCommand.java
@@ -1,6 +1,7 @@
 package com.comandante.creeper.command.admin;
 
 import com.comandante.creeper.command.Command;
+import com.comandante.creeper.command.CommandRunnable;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.player.PlayerRole;
 import com.google.common.collect.Sets;
@@ -21,13 +22,10 @@ public class NotablesCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             for (Map.Entry<String, String> notable : currentRoom.getNotables().entrySet()) {
                 write(notable.getKey() + " : " + notable.getValue() + "\r\n");
             }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/admin/NpcLocationCommand.java b/src/main/java/com/comandante/creeper/command/admin/NpcLocationCommand.java
index 2ce5388c..b9867f3a 100644
--- a/src/main/java/com/comandante/creeper/command/admin/NpcLocationCommand.java
+++ b/src/main/java/com/comandante/creeper/command/admin/NpcLocationCommand.java
@@ -1,6 +1,7 @@
 package com.comandante.creeper.command.admin;
 
 import com.comandante.creeper.command.Command;
+import com.comandante.creeper.command.CommandRunnable;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.npc.Npc;
 import com.comandante.creeper.player.PlayerRole;
@@ -27,8 +28,7 @@ public class NpcLocationCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             Map<String, Set<Room>> npcMap = Maps.newTreeMap();
             Iterator<Map.Entry<String, Npc>> iterator = entityManager.getNpcs().entrySet().iterator();
             while (iterator.hasNext()) {
@@ -60,8 +60,6 @@ public class NpcLocationCommand extends Command {
                 }
             }
             write(resp.toString());
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/admin/ReloadNpcsCommand.java b/src/main/java/com/comandante/creeper/command/admin/ReloadNpcsCommand.java
index a8c5b321..bf4d515c 100755
--- a/src/main/java/com/comandante/creeper/command/admin/ReloadNpcsCommand.java
+++ b/src/main/java/com/comandante/creeper/command/admin/ReloadNpcsCommand.java
@@ -2,12 +2,14 @@ package com.comandante.creeper.command.admin;
 
 import com.comandante.creeper.ConfigureNpc;
 import com.comandante.creeper.command.Command;
+import com.comandante.creeper.command.CommandRunnable;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.player.PlayerRole;
 import com.google.common.collect.Sets;
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.channel.MessageEvent;
 
+import java.io.IOException;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
@@ -26,12 +28,13 @@ public class ReloadNpcsCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommandThreadSafe(ctx, e, ReloadNpcsCommand.class, () -> {
             gameManager.removeAllNpcs();
-            ConfigureNpc.configureAllNpcs(gameManager);
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+            try {
+                ConfigureNpc.configureAllNpcs(gameManager);
+            } catch (IOException ex) {
+                log.error("Unable to configure NPCS from disk.");
+            }
+        });
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/command/admin/SaveWorldCommand.java b/src/main/java/com/comandante/creeper/command/admin/SaveWorldCommand.java
index 83a533a3..b4a2ca83 100644
--- a/src/main/java/com/comandante/creeper/command/admin/SaveWorldCommand.java
+++ b/src/main/java/com/comandante/creeper/command/admin/SaveWorldCommand.java
@@ -1,6 +1,7 @@
 package com.comandante.creeper.command.admin;
 
 import com.comandante.creeper.command.Command;
+import com.comandante.creeper.command.CommandRunnable;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.player.PlayerRole;
 import com.google.common.collect.Sets;
@@ -24,12 +25,9 @@ public class SaveWorldCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommandThreadSafe(ctx, e, SaveWorldCommand.class, () -> {
             worldExporter.saveWorld();
             write("World saved.");
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/admin/SpawnCommand.java b/src/main/java/com/comandante/creeper/command/admin/SpawnCommand.java
index 33575cd2..7d035384 100644
--- a/src/main/java/com/comandante/creeper/command/admin/SpawnCommand.java
+++ b/src/main/java/com/comandante/creeper/command/admin/SpawnCommand.java
@@ -3,6 +3,7 @@ package com.comandante.creeper.command.admin;
 import com.comandante.creeper.Items.ItemType;
 import com.comandante.creeper.Items.Loot;
 import com.comandante.creeper.command.Command;
+import com.comandante.creeper.command.CommandRunnable;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.npc.Npc;
 import com.comandante.creeper.npc.NpcBuilder;
@@ -14,6 +15,7 @@ import com.google.common.collect.Sets;
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.channel.MessageEvent;
 
+import java.io.FileNotFoundException;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
@@ -31,8 +33,7 @@ public class SpawnCommand  extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             List<Npc> npcsFromFile = NpcExporter.getNpcsFromFile(gameManager);
             if (originalMessageParts.size() == 1) {
                 write(getHeader());
@@ -56,9 +57,7 @@ public class SpawnCommand  extends Command {
                 }
                 write("No npc found with name: " + targetNpc + "\r\n");
             }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 
     public String getHeader() {
diff --git a/src/main/java/com/comandante/creeper/command/admin/SystemInfo.java b/src/main/java/com/comandante/creeper/command/admin/SystemInfo.java
index 484d77be..80875f16 100755
--- a/src/main/java/com/comandante/creeper/command/admin/SystemInfo.java
+++ b/src/main/java/com/comandante/creeper/command/admin/SystemInfo.java
@@ -2,6 +2,7 @@ package com.comandante.creeper.command.admin;
 
 import com.comandante.creeper.Main;
 import com.comandante.creeper.command.Command;
+import com.comandante.creeper.command.CommandRunnable;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.player.PlayerRole;
 import com.comandante.creeper.server.Color;
@@ -29,8 +30,7 @@ public class SystemInfo extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             String os_name = System.getProperty("os.name", "OS_NAME");
             String os_version = System.getProperty("os.version", "OS_VERSION");
             String java_version = System.getProperty("java.version", "JAVA_VERSION");
@@ -69,9 +69,7 @@ public class SystemInfo extends Command {
                     .append(Color.RESET)
                     .append(Main.getCreeperVersion())
                     .append("\r\n").toString());
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 
     public static String getDurationBreakdown(long millis) {
diff --git a/src/main/java/com/comandante/creeper/command/admin/TagRoomCommand.java b/src/main/java/com/comandante/creeper/command/admin/TagRoomCommand.java
index e4c159dd..9094d70d 100644
--- a/src/main/java/com/comandante/creeper/command/admin/TagRoomCommand.java
+++ b/src/main/java/com/comandante/creeper/command/admin/TagRoomCommand.java
@@ -1,6 +1,7 @@
 package com.comandante.creeper.command.admin;
 
 import com.comandante.creeper.command.Command;
+import com.comandante.creeper.command.CommandRunnable;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.player.PlayerRole;
 import com.google.common.collect.Sets;
@@ -25,14 +26,11 @@ public class TagRoomCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             originalMessageParts.remove(0);
             if (originalMessageParts.get(0).equalsIgnoreCase("list")) {
                 StringBuilder sb = new StringBuilder();
-                Iterator<String> iterator = currentRoom.getRoomTags().iterator();
-                while (iterator.hasNext()) {
-                    String tag = iterator.next();
+                for (String tag : currentRoom.getRoomTags()) {
                     sb.append(tag).append("\n");
                 }
                 write("tag\n---");
@@ -41,8 +39,6 @@ public class TagRoomCommand extends Command {
             }
             currentRoom.addTag(originalMessageParts.get(0));
             write(String.format("tagged world with tag: \"%s\".", originalMessageParts.get(0)));
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/admin/TeleportCommand.java b/src/main/java/com/comandante/creeper/command/admin/TeleportCommand.java
index a1c0ead0..25ba1f24 100644
--- a/src/main/java/com/comandante/creeper/command/admin/TeleportCommand.java
+++ b/src/main/java/com/comandante/creeper/command/admin/TeleportCommand.java
@@ -2,6 +2,7 @@ package com.comandante.creeper.command.admin;
 
 
 import com.comandante.creeper.command.Command;
+import com.comandante.creeper.command.CommandRunnable;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.player.CoolDownType;
 import com.comandante.creeper.player.Player;
@@ -31,8 +32,7 @@ public class TeleportCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             if (originalMessageParts.size() <= 1) {
                 return;
             }
@@ -58,7 +58,7 @@ public class TeleportCommand extends Command {
                 if (next.getValue().getPlayerName().equals(desiredId)) {
                     Room playerCurrentRoom = roomManager.getPlayerCurrentRoom(next.getValue()).get();
                     Integer destinationRoomId = playerCurrentRoom.getRoomId();
-                    PlayerMovement playerMovement = new PlayerMovement(player, gameManager.getRoomManager().getPlayerCurrentRoom(player).get().getRoomId(), playerCurrentRoom.getRoomId(), null, "vanished into the heavens.", "");
+                    PlayerMovement playerMovement = new PlayerMovement(player, gameManager.getRoomManager().getPlayerCurrentRoom(player).get().getRoomId(), playerCurrentRoom.getRoomId(), "vanished into the heavens.", "");
                     gameManager.writeToRoom(destinationRoomId, teleportMessage);
                     channelUtils.write(playerId, teleportMessage);
                     player.movePlayer(playerMovement);
@@ -70,7 +70,7 @@ public class TeleportCommand extends Command {
             while (rooms.hasNext()) {
                 Map.Entry<Integer, Room> next = rooms.next();
                 if (Integer.toString(next.getKey()).equals(desiredId)) {
-                    PlayerMovement playerMovement = new PlayerMovement(player, gameManager.getRoomManager().getPlayerCurrentRoom(player).get().getRoomId(), Integer.parseInt(desiredId), null, "vanished into the heavens.", "");
+                    PlayerMovement playerMovement = new PlayerMovement(player, gameManager.getRoomManager().getPlayerCurrentRoom(player).get().getRoomId(), Integer.parseInt(desiredId), "vanished into the heavens.", "");
                     gameManager.writeToRoom(Integer.parseInt(desiredId), teleportMessage);
                     channelUtils.write(playerId, teleportMessage);
                     player.movePlayer(playerMovement);
@@ -78,8 +78,6 @@ public class TeleportCommand extends Command {
                     return;
                 }
             }
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
\ No newline at end of file
diff --git a/src/main/java/com/comandante/creeper/command/admin/TitleCommand.java b/src/main/java/com/comandante/creeper/command/admin/TitleCommand.java
index 010cc5c5..81078c08 100644
--- a/src/main/java/com/comandante/creeper/command/admin/TitleCommand.java
+++ b/src/main/java/com/comandante/creeper/command/admin/TitleCommand.java
@@ -1,6 +1,7 @@
 package com.comandante.creeper.command.admin;
 
 import com.comandante.creeper.command.Command;
+import com.comandante.creeper.command.CommandRunnable;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.player.PlayerRole;
 import com.google.common.base.Joiner;
@@ -26,13 +27,10 @@ public class TitleCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             originalMessageParts.remove(0);
             currentRoom.setRoomTitle(Joiner.on(" ").join(originalMessageParts));
             write("Titled saved.");
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
diff --git a/src/main/java/com/comandante/creeper/command/admin/UsersCommand.java b/src/main/java/com/comandante/creeper/command/admin/UsersCommand.java
index bcb5f952..10e6d0c5 100755
--- a/src/main/java/com/comandante/creeper/command/admin/UsersCommand.java
+++ b/src/main/java/com/comandante/creeper/command/admin/UsersCommand.java
@@ -1,6 +1,7 @@
 package com.comandante.creeper.command.admin;
 
 import com.comandante.creeper.command.Command;
+import com.comandante.creeper.command.CommandRunnable;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.player.Player;
 import com.comandante.creeper.player.PlayerRole;
@@ -33,8 +34,7 @@ public class UsersCommand extends Command {
 
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
-        ;
-        try {
+        execCommand(ctx, e, () -> {
             Table t = new Table(4, BorderStyle.BLANKS,
                     ShownBorders.NONE);
             t.setColumnWidth(0, 14, 24);
@@ -66,8 +66,6 @@ public class UsersCommand extends Command {
                 t.addCell(idleTime);
             }
             write(t.render());
-        } finally {
-            super.messageReceived(ctx, e);
-        }
+        });
     }
 }
diff --git a/src/main/java/com/comandante/creeper/merchant/bank/commands/DepositCommand.java b/src/main/java/com/comandante/creeper/merchant/bank/commands/DepositCommand.java
index 80678b0b..40190be5 100644
--- a/src/main/java/com/comandante/creeper/merchant/bank/commands/DepositCommand.java
+++ b/src/main/java/com/comandante/creeper/merchant/bank/commands/DepositCommand.java
@@ -4,6 +4,7 @@ package com.comandante.creeper.merchant.bank.commands;
 import com.comandante.creeper.command.Command;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.server.Color;
+import org.apache.commons.lang.math.NumberUtils;
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.channel.MessageEvent;
 
@@ -25,7 +26,7 @@ public class DepositCommand extends BankCommand {
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
         configure(e);
         try {
-            if (originalMessageParts.size() > 1 && Command.isLong(originalMessageParts.get(1))) {
+            if (originalMessageParts.size() > 1 && NumberUtils.isNumber(originalMessageParts.get(1))) {
                 long depositAmt = Long.parseLong(originalMessageParts.get(1));
                 if (areFundsAvailable(depositAmt)) {
                     player.transferGoldToBank(depositAmt);
diff --git a/src/main/java/com/comandante/creeper/merchant/bank/commands/DoneCommand.java b/src/main/java/com/comandante/creeper/merchant/bank/commands/DoneCommand.java
index e2201dcd..e243a3c1 100644
--- a/src/main/java/com/comandante/creeper/merchant/bank/commands/DoneCommand.java
+++ b/src/main/java/com/comandante/creeper/merchant/bank/commands/DoneCommand.java
@@ -4,13 +4,13 @@ package com.comandante.creeper.merchant.bank.commands;
 import com.comandante.creeper.CreeperEntry;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.merchant.Merchant;
-import com.google.common.base.Optional;
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.channel.MessageEvent;
 import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 
 public class DoneCommand extends BankCommand {
 
@@ -25,7 +25,7 @@ public class DoneCommand extends BankCommand {
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
         configure(e);
         gameManager.getChannelUtils().write(playerId, "Thanks, COME AGAIN." + "\r\n", true);
-        creeperSession.setGrabMerchant(Optional.<CreeperEntry<Merchant, SimpleChannelUpstreamHandler>>absent());
+        creeperSession.setGrabMerchant(Optional.<CreeperEntry<Merchant, SimpleChannelUpstreamHandler>>empty());
         e.getChannel().getPipeline().remove("executed_command");
         e.getChannel().getPipeline().remove("executed_bank_command");
         String s = gameManager.buildPrompt(playerId);
diff --git a/src/main/java/com/comandante/creeper/merchant/bank/commands/WithdrawalCommand.java b/src/main/java/com/comandante/creeper/merchant/bank/commands/WithdrawalCommand.java
index 378ecbfa..578ab5ce 100644
--- a/src/main/java/com/comandante/creeper/merchant/bank/commands/WithdrawalCommand.java
+++ b/src/main/java/com/comandante/creeper/merchant/bank/commands/WithdrawalCommand.java
@@ -3,6 +3,7 @@ package com.comandante.creeper.merchant.bank.commands;
 import com.comandante.creeper.command.Command;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.server.Color;
+import org.apache.commons.lang.math.NumberUtils;
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.channel.MessageEvent;
 
@@ -24,7 +25,7 @@ public class WithdrawalCommand extends BankCommand {
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
         configure(e);
         try {
-            if (originalMessageParts.size() > 1 && Command.isInteger(originalMessageParts.get(1))) {
+            if (originalMessageParts.size() > 1 && NumberUtils.isNumber(originalMessageParts.get(1))) {
                 int withdrawalAmount = Integer.parseInt(originalMessageParts.get(1));
                 if (areBankFundsAvailable(withdrawalAmount)) {
                     player.transferBankGoldToPlayer(withdrawalAmount);
diff --git a/src/main/java/com/comandante/creeper/merchant/lockers/DoneCommand.java b/src/main/java/com/comandante/creeper/merchant/lockers/DoneCommand.java
index ec47ee73..35111419 100644
--- a/src/main/java/com/comandante/creeper/merchant/lockers/DoneCommand.java
+++ b/src/main/java/com/comandante/creeper/merchant/lockers/DoneCommand.java
@@ -3,13 +3,13 @@ package com.comandante.creeper.merchant.lockers;
 import com.comandante.creeper.CreeperEntry;
 import com.comandante.creeper.managers.GameManager;
 import com.comandante.creeper.merchant.Merchant;
-import com.google.common.base.Optional;
 import org.jboss.netty.channel.ChannelHandlerContext;
 import org.jboss.netty.channel.MessageEvent;
 import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 
 public class DoneCommand extends LockerCommand {
 
@@ -23,7 +23,7 @@ public class DoneCommand extends LockerCommand {
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
         configure(e);
-        creeperSession.setGrabMerchant(Optional.<CreeperEntry<Merchant, SimpleChannelUpstreamHandler>>absent());
+        creeperSession.setGrabMerchant(Optional.<CreeperEntry<Merchant, SimpleChannelUpstreamHandler>>empty());
         e.getChannel().getPipeline().remove("executed_command");
         e.getChannel().getPipeline().remove("executed_locker_command");
         String s = gameManager.buildPrompt(playerId);
diff --git a/src/main/java/com/comandante/creeper/player/Player.java b/src/main/java/com/comandante/creeper/player/Player.java
index 9b165419..0fb4b409 100755
--- a/src/main/java/com/comandante/creeper/player/Player.java
+++ b/src/main/java/com/comandante/creeper/player/Player.java
@@ -161,7 +161,7 @@ public class Player extends CreeperEntity {
                 CoolDown death = new CoolDown(CoolDownType.DEATH);
                 addCoolDown(death);
                 gameManager.writeToPlayerCurrentRoom(getPlayerId(), getPlayerName() + " is now dead." + "\r\n");
-                PlayerMovement playerMovement = new PlayerMovement(this, gameManager.getRoomManager().getPlayerCurrentRoom(this).get().getRoomId(), GameManager.LOBBY_ID, null, "vanished into the ether.", "");
+                PlayerMovement playerMovement = new PlayerMovement(this, gameManager.getRoomManager().getPlayerCurrentRoom(this).get().getRoomId(), GameManager.LOBBY_ID, "vanished into the ether.", "");
                 movePlayer(playerMovement);
                 gameManager.currentRoomLogic(getPlayerId());
                 String prompt = gameManager.buildPrompt(playerId);
diff --git a/src/main/java/com/comandante/creeper/player/PlayerManager.java b/src/main/java/com/comandante/creeper/player/PlayerManager.java
index 7c790e73..c0287937 100644
--- a/src/main/java/com/comandante/creeper/player/PlayerManager.java
+++ b/src/main/java/com/comandante/creeper/player/PlayerManager.java
@@ -67,6 +67,10 @@ public class PlayerManager {
         return players.entrySet().iterator();
     }
 
+    public Map<String, Player> getAllPlayersMap() {
+        return players;
+    }
+
     public void removePlayer(String username) {
         Player player = getPlayerByUsername(username);
         if (player.getChannel() != null && player.getChannel().isConnected()) {
diff --git a/src/main/java/com/comandante/creeper/player/PlayerMovement.java b/src/main/java/com/comandante/creeper/player/PlayerMovement.java
index bd9509f8..faf8f9d3 100644
--- a/src/main/java/com/comandante/creeper/player/PlayerMovement.java
+++ b/src/main/java/com/comandante/creeper/player/PlayerMovement.java
@@ -7,20 +7,17 @@ public class PlayerMovement {
     private final Player player;
     private final Integer sourceRoomId;
     private final Integer destinationRoomId;
-    private final MovementCommand command;
     private final String roomExitMessage;
     private final String returnDirection;
 
     public PlayerMovement(Player player,
                           Integer sourceRoomId,
                           Integer destinationRoomId,
-                          MovementCommand command,
                           String roomExitMessage,
                           String returnDirection) {
         this.player = player;
         this.sourceRoomId = sourceRoomId;
         this.destinationRoomId = destinationRoomId;
-        this.command = command;
         this.roomExitMessage = roomExitMessage;
         this.returnDirection = returnDirection;
 
@@ -45,8 +42,4 @@ public class PlayerMovement {
     public String getRoomExitMessage() {
         return roomExitMessage;
     }
-
-    public MovementCommand getCommand() {
-        return command;
-    }
 }
diff --git a/src/main/java/com/comandante/creeper/server/CreeperSession.java b/src/main/java/com/comandante/creeper/server/CreeperSession.java
index b50e1323..4ba51950 100644
--- a/src/main/java/com/comandante/creeper/server/CreeperSession.java
+++ b/src/main/java/com/comandante/creeper/server/CreeperSession.java
@@ -15,8 +15,8 @@ public class CreeperSession {
     private Optional<String> password = Optional.absent();
     private boolean isAuthed = false;
     private AtomicBoolean isAbleToDoAbility = new AtomicBoolean(false);
-    private Optional<CreeperEntry<UUID, Command>> grabMultiLineInput = Optional.absent();
-    private Optional<CreeperEntry<Merchant, SimpleChannelUpstreamHandler>> grabMerchant = Optional.absent();
+    private java.util.Optional<CreeperEntry<UUID, Command>> grabMultiLineInput = java.util.Optional.empty();
+    private java.util.Optional<CreeperEntry<Merchant, SimpleChannelUpstreamHandler>> grabMerchant = java.util.Optional.empty();
     private String lastMessage;
     private final Long initialLoginTime;
     private Long lastActivity;
@@ -86,11 +86,11 @@ public class CreeperSession {
         return this.isAbleToDoAbility.get();
     }
 
-    public Optional<CreeperEntry<UUID, Command>> getGrabMultiLineInput() {
+    public java.util.Optional<CreeperEntry<UUID, Command>> getGrabMultiLineInput() {
         return grabMultiLineInput;
     }
 
-    public void setGrabMultiLineInput(Optional<CreeperEntry<UUID, Command>> grabMultiLineInput) {
+    public void setGrabMultiLineInput(java.util.Optional<CreeperEntry<UUID, Command>> grabMultiLineInput) {
         this.grabMultiLineInput = grabMultiLineInput;
     }
 
@@ -102,11 +102,11 @@ public class CreeperSession {
         this.isAbleToDoAbility = isAbleToDoAbility;
     }
 
-    public Optional<CreeperEntry<Merchant, SimpleChannelUpstreamHandler>> getGrabMerchant() {
+    public java.util.Optional<CreeperEntry<Merchant, SimpleChannelUpstreamHandler>> getGrabMerchant() {
         return grabMerchant;
     }
 
-    public void setGrabMerchant(Optional<CreeperEntry<Merchant, SimpleChannelUpstreamHandler>> grabMerchant) {
+    public void setGrabMerchant(java.util.Optional<CreeperEntry<Merchant, SimpleChannelUpstreamHandler>> grabMerchant) {
         this.grabMerchant = grabMerchant;
     }
 
-- 
GitLab