diff --git a/src/main/java/com/syncleus/aethermud/command/commands/DropCommand.java b/src/main/java/com/syncleus/aethermud/command/commands/DropCommand.java
index 0c03964427ecf28a6f468644faa2ee91b8156844..1e382f17b8a462e2551e103816a9b2e8adf74d62 100644
--- a/src/main/java/com/syncleus/aethermud/command/commands/DropCommand.java
+++ b/src/main/java/com/syncleus/aethermud/command/commands/DropCommand.java
@@ -15,7 +15,7 @@
  */
 package com.syncleus.aethermud.command.commands;
 
-import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.items.Item;
 import com.syncleus.aethermud.core.GameManager;
 import com.google.common.base.Joiner;
 import org.jboss.netty.channel.ChannelHandlerContext;
@@ -43,7 +43,7 @@ public class DropCommand extends Command {
             }
             originalMessageParts.remove(0);
             String itemTarget = Joiner.on(" ").join(originalMessageParts);
-            for (ItemPojo item : player.getInventory()) {
+            for (Item item : player.getInventory()) {
                 if (item.getItemTriggers().contains(itemTarget)) {
                     item.setWithPlayer(false);
                     gameManager.placeItemInRoom(currentRoom.getRoomId(), item.getItemId());
diff --git a/src/main/java/com/syncleus/aethermud/command/commands/EquipCommand.java b/src/main/java/com/syncleus/aethermud/command/commands/EquipCommand.java
index ea73fb3791cf525cace69899fd11cd5d4620af99..19ed11e65e1aeac7699361d2d1ed8c22ddebcd56 100644
--- a/src/main/java/com/syncleus/aethermud/command/commands/EquipCommand.java
+++ b/src/main/java/com/syncleus/aethermud/command/commands/EquipCommand.java
@@ -15,7 +15,7 @@
  */
 package com.syncleus.aethermud.command.commands;
 
-import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.items.Item;
 import com.syncleus.aethermud.core.GameManager;
 import com.google.common.base.Joiner;
 import org.jboss.netty.channel.ChannelHandlerContext;
@@ -43,9 +43,9 @@ public class EquipCommand extends Command {
             }
             originalMessageParts.remove(0);
             String itemTarget = Joiner.on(" ").join(originalMessageParts);
-            List<ItemPojo> inventory = player.getInventory();
+            List<Item> inventory = player.getInventory();
             if (inventory != null) {
-                for (ItemPojo item : inventory) {
+                for (Item item : inventory) {
                     if (item.getItemTriggers().contains(itemTarget)) {
                         if (item.getEquipment() == null) {
                             write("Item is not equipable.");
diff --git a/src/main/java/com/syncleus/aethermud/command/commands/InventoryCommand.java b/src/main/java/com/syncleus/aethermud/command/commands/InventoryCommand.java
index 9e86eba5c5757659ab0335132d6a305492507274..6cc9d39e673e544c5befb94bf0e1836a270aae9c 100644
--- a/src/main/java/com/syncleus/aethermud/command/commands/InventoryCommand.java
+++ b/src/main/java/com/syncleus/aethermud/command/commands/InventoryCommand.java
@@ -16,7 +16,7 @@
 package com.syncleus.aethermud.command.commands;
 
 
-import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.items.Item;
 import com.syncleus.aethermud.core.GameManager;
 import org.apache.commons.lang.StringUtils;
 import org.jboss.netty.channel.ChannelHandlerContext;
@@ -40,7 +40,7 @@ public class InventoryCommand extends Command {
     @Override
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
         this.execCommand(ctx, e, () -> {
-            List<ItemPojo> inventory = player.getInventory();
+            List<Item> inventory = player.getInventory();
             if (inventory == null) {
                 write("You aren't carrying anything.");
                 return;
diff --git a/src/main/java/com/syncleus/aethermud/command/commands/LootCommand.java b/src/main/java/com/syncleus/aethermud/command/commands/LootCommand.java
index 84855b3f79122bfe9249a060c04d105c88c6eba7..e33e6ece3c4d2e965ef44fe19653819c395d321e 100644
--- a/src/main/java/com/syncleus/aethermud/command/commands/LootCommand.java
+++ b/src/main/java/com/syncleus/aethermud/command/commands/LootCommand.java
@@ -16,7 +16,7 @@
 package com.syncleus.aethermud.command.commands;
 
 import com.syncleus.aethermud.core.GameManager;
-import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.items.Item;
 import com.syncleus.aethermud.items.Loot;
 import com.syncleus.aethermud.server.communication.Color;
 import org.jboss.netty.channel.ChannelHandlerContext;
@@ -42,8 +42,8 @@ public class LootCommand extends Command {
     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
         execCommand(ctx, e, () -> {
             if (originalMessageParts.size() > 1) {
-                for (ItemPojo item : player.getInventory()) {
-                    if (item.getInternalItemName().equals(ItemPojo.CORPSE_INTENAL_NAME)) {
+                for (Item item : player.getInventory()) {
+                    if (item.getInternalItemName().equals(Item.CORPSE_INTENAL_NAME)) {
                         Loot loot = item.getLoot();
                         if (loot != null) {
                             int gold = lootManager.lootGoldAmountReturn(loot);
@@ -51,8 +51,8 @@ public class LootCommand extends Command {
                                 write("You looted " + NumberFormat.getNumberInstance(Locale.US).format(gold) + Color.YELLOW + " gold" + Color.RESET + " from a " + item.getItemName() + ".\r\n");
                                 player.incrementGold(gold);
                             }
-                            Set<ItemPojo> items = lootManager.lootItemsReturn(loot);
-                            for (ItemPojo i: items) {
+                            Set<Item> items = lootManager.lootItemsReturn(loot);
+                            for (Item i: items) {
                                 gameManager.acquireItem(player, i.getItemId(), true);
                                 write("You looted " + i.getItemName() +  " from a " + item.getItemName() + ".\r\n");
                             }
diff --git a/src/main/java/com/syncleus/aethermud/command/commands/PickUpCommand.java b/src/main/java/com/syncleus/aethermud/command/commands/PickUpCommand.java
index 136efc4780556b009b9e506c2f9e64872c6ff736..a94643f4247d4ebfef57662fc09a7fda1f675397 100644
--- a/src/main/java/com/syncleus/aethermud/command/commands/PickUpCommand.java
+++ b/src/main/java/com/syncleus/aethermud/command/commands/PickUpCommand.java
@@ -15,7 +15,7 @@
  */
 package com.syncleus.aethermud.command.commands;
 
-import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.items.Item;
 import com.syncleus.aethermud.core.GameManager;
 import com.google.common.base.Joiner;
 import org.jboss.netty.channel.ChannelHandlerContext;
@@ -43,7 +43,7 @@ public class PickUpCommand extends Command {
             originalMessageParts.remove(0);
             String desiredPickUpItem = Joiner.on(" ").join(originalMessageParts);
             for (String next : itemIds) {
-                Optional<ItemPojo> itemEntityOptional = entityManager.getItemEntity(next);
+                Optional<Item> itemEntityOptional = entityManager.getItemEntity(next);
                 if (!itemEntityOptional.isPresent()) {
                     continue;
                 }
diff --git a/src/main/java/com/syncleus/aethermud/command/commands/ShowCommand.java b/src/main/java/com/syncleus/aethermud/command/commands/ShowCommand.java
index 666d746f4fb9c888e9a7635cbae19980d4faa280..4324607df7d121d5413fa57616b82517e5fdba97 100644
--- a/src/main/java/com/syncleus/aethermud/command/commands/ShowCommand.java
+++ b/src/main/java/com/syncleus/aethermud/command/commands/ShowCommand.java
@@ -15,7 +15,7 @@
  */
 package com.syncleus.aethermud.command.commands;
 
-import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.items.Item;
 import com.syncleus.aethermud.core.GameManager;
 import com.google.common.base.Joiner;
 import org.jboss.netty.channel.ChannelHandlerContext;
@@ -41,7 +41,7 @@ public class ShowCommand extends Command {
             }
             originalMessageParts.remove(0);
             String target = Joiner.on(" ").join(originalMessageParts);
-            for (ItemPojo next : player.getInventory()) {
+            for (Item next : player.getInventory()) {
                 for (String s : next.getItemTriggers()) {
                     if (s.equalsIgnoreCase(target)) {
                         writeToRoom(player.getPlayerName() + " whips out " + next.getItemName() + ".\r\n");
diff --git a/src/main/java/com/syncleus/aethermud/command/commands/UnequipCommand.java b/src/main/java/com/syncleus/aethermud/command/commands/UnequipCommand.java
index 042bea43d3d4a24d912df01916732e72ff72a3d6..56dbe5df985500ae4917db4b1ea67778df2f7a44 100644
--- a/src/main/java/com/syncleus/aethermud/command/commands/UnequipCommand.java
+++ b/src/main/java/com/syncleus/aethermud/command/commands/UnequipCommand.java
@@ -16,7 +16,7 @@
 package com.syncleus.aethermud.command.commands;
 
 
-import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.items.Item;
 import com.syncleus.aethermud.core.GameManager;
 import com.google.common.base.Joiner;
 import org.jboss.netty.channel.ChannelHandlerContext;
@@ -44,8 +44,8 @@ public class UnequipCommand extends Command {
             }
             originalMessageParts.remove(0);
             String itemTarget = Joiner.on(" ").join(originalMessageParts);
-            Set<ItemPojo> equipment = player.getEquipment();
-            for (ItemPojo item : equipment) {
+            Set<Item> equipment = player.getEquipment();
+            for (Item item : equipment) {
                 if (item.getItemTriggers().contains(itemTarget)) {
                     player.unEquip(item);
                     return;
diff --git a/src/main/java/com/syncleus/aethermud/command/commands/UseCommand.java b/src/main/java/com/syncleus/aethermud/command/commands/UseCommand.java
index c36726359ae7b7e0763e19f6ea6f2b2433ed558a..4370d81ba280c639efa28a21627af70333a08ff4 100644
--- a/src/main/java/com/syncleus/aethermud/command/commands/UseCommand.java
+++ b/src/main/java/com/syncleus/aethermud/command/commands/UseCommand.java
@@ -17,7 +17,7 @@ package com.syncleus.aethermud.command.commands;
 
 
 import com.syncleus.aethermud.core.GameManager;
-import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.items.Item;
 import com.google.common.base.Joiner;
 import com.google.common.base.Strings;
 import org.apache.commons.lang.StringUtils;
@@ -49,7 +49,7 @@ public class UseCommand extends Command {
                 return;
             }
 
-            Optional<ItemPojo> inventoryItemOptional = player.getInventoryItem(useItemOn.getItem());
+            Optional<Item> inventoryItemOptional = player.getInventoryItem(useItemOn.getItem());
             if (!inventoryItemOptional.isPresent()) {
                 write("Useable item is not found in your inventory.\r\n");
                 return;
diff --git a/src/main/java/com/syncleus/aethermud/core/GameManager.java b/src/main/java/com/syncleus/aethermud/core/GameManager.java
index c4856db6deb9fad8ffb362fb8116519e3975788a..3c9aac2e0d115ed29ac45e757a002304663f1075 100644
--- a/src/main/java/com/syncleus/aethermud/core/GameManager.java
+++ b/src/main/java/com/syncleus/aethermud/core/GameManager.java
@@ -343,12 +343,12 @@ public class GameManager {
         }
 
         for (String itemId : playerCurrentRoom.getItemIds()) {
-            Optional<ItemPojo> itemOptional = entityManager.getItemEntity(itemId);
+            Optional<Item> itemOptional = entityManager.getItemEntity(itemId);
             if (!itemOptional.isPresent()) {
                 playerCurrentRoom.removePresentItem(itemId);
                 continue;
             }
-            ItemPojo item = itemOptional.get();
+            Item item = itemOptional.get();
             sb.append("   ").append(item.getRestingName()).append("\r\n");
         }
 
@@ -465,11 +465,11 @@ public class GameManager {
     }
 
     public void placeItemInRoom(Integer roomId, String itemId) {
-        Optional<ItemPojo> itemOptional = entityManager.getItemEntity(itemId);
+        Optional<Item> itemOptional = entityManager.getItemEntity(itemId);
         if (!itemOptional.isPresent()) {
             throw new IllegalArgumentException("itemId not valid.");
         }
-        ItemPojo item = itemOptional.get();
+        Item item = itemOptional.get();
         roomManager.getRoom(roomId).addPresentItem(item.getItemId());
     }
 
@@ -494,21 +494,21 @@ public class GameManager {
         synchronized (interner.intern(itemId)) {
             Stats playerStatsWithEquipmentAndLevel = player.getPlayerStatsWithEquipmentAndLevel();
             if (player.getInventory().size() < playerStatsWithEquipmentAndLevel.getInventorySize()) {
-                Optional<ItemPojo> itemOptional = entityManager.getItemEntity(itemId);
+                Optional<Item> itemOptional = entityManager.getItemEntity(itemId);
                 if (!itemOptional.isPresent()) {
                     return false;
                 }
-                ItemPojo itemEntity = itemOptional.get();
+                Item itemEntity = itemOptional.get();
                 itemEntity.setWithPlayer(true);
                 player.addInventoryId(itemId);
                 entityManager.saveItem(itemEntity);
                 return true;
             } else {
-                Optional<ItemPojo> itemOptional = entityManager.getItemEntity(itemId);
+                Optional<Item> itemOptional = entityManager.getItemEntity(itemId);
                 if (!itemOptional.isPresent()) {
                     return false;
                 }
-                ItemPojo itemEntity = itemOptional.get();
+                Item itemEntity = itemOptional.get();
                 channelUtils.write(player.getPlayerId(), "Your inventory is full, drop some items to free up room.\r\n");
                 if (isFromLoot) {
                     player.getCurrentRoom().addPresentItem(itemId);
diff --git a/src/main/java/com/syncleus/aethermud/entity/EntityManager.java b/src/main/java/com/syncleus/aethermud/entity/EntityManager.java
index 74f18c31b3f9a666f2f7e32d844f5ce2994f173e..48e6f2040b2733fbccc481aef62673263fd75bbf 100644
--- a/src/main/java/com/syncleus/aethermud/entity/EntityManager.java
+++ b/src/main/java/com/syncleus/aethermud/entity/EntityManager.java
@@ -17,18 +17,15 @@ package com.syncleus.aethermud.entity;
 
 import com.google.common.base.Function;
 import com.syncleus.aethermud.Main;
-import com.syncleus.aethermud.core.GameManager;
 import com.syncleus.aethermud.core.SentryManager;
-import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.items.Item;
 import com.syncleus.aethermud.items.ItemBuilder;
 import com.syncleus.aethermud.npc.NpcSpawn;
 import com.syncleus.aethermud.player.Player;
 import com.syncleus.aethermud.player.PlayerManager;
-import com.syncleus.aethermud.storage.AetherMudStorage;
 import com.syncleus.aethermud.storage.graphdb.GraphDbAetherMudStorage;
 import com.syncleus.aethermud.storage.graphdb.GraphStorageFactory;
 import com.syncleus.aethermud.storage.graphdb.model.ItemData;
-import com.syncleus.aethermud.storage.graphdb.model.PlayerData;
 import com.syncleus.aethermud.world.RoomManager;
 import com.syncleus.aethermud.world.model.Room;
 import org.apache.log4j.Logger;
@@ -84,11 +81,11 @@ public class EntityManager {
         }
     }
 
-    public ItemData saveItem(ItemPojo item) {
+    public ItemData saveItem(Item item) {
         return this.transact(storage -> storage.saveItem(item));
     }
 
-    public void removeItem(ItemPojo item) {
+    public void removeItem(Item item) {
         this.consume(storage -> storage.removeItem(item.getItemId()));
     }
 
@@ -96,10 +93,10 @@ public class EntityManager {
         this.consume(storage -> storage.removeItem(itemId));
     }
 
-    public Optional<ItemPojo> getItemEntity(String itemId) {
+    public Optional<Item> getItemEntity(String itemId) {
         return this.transactRead(storage -> {
             Optional<ItemData> item = storage.getItemEntity(itemId);
-            return item.map(itemName -> new ItemBuilder().from(itemName).create());
+            return item.map(itemData -> new ItemBuilder().from(ItemData.copyItem(itemData)).create());
         });
     }
 
diff --git a/src/main/java/com/syncleus/aethermud/items/ForageManager.java b/src/main/java/com/syncleus/aethermud/items/ForageManager.java
index 74d8e74ee6b265a5fb5532be7d416aa6e6aef1bc..0e9198830059bd03d0e518e7f2f6b72e1ea9c36f 100644
--- a/src/main/java/com/syncleus/aethermud/items/ForageManager.java
+++ b/src/main/java/com/syncleus/aethermud/items/ForageManager.java
@@ -92,7 +92,7 @@ public class ForageManager {
                     totalForageXp += forage.getForageExperience();
                     for (long i = 0; i < numberToHarvest; i++) {
                         countOfForagesFound++;
-                        ItemPojo item = new ItemBuilder().from(itemMetadata).create();
+                        Item item = new ItemBuilder().from(itemMetadata).create();
                         gameManager.getEntityManager().saveItem(item);
                         gameManager.acquireItem(player, item.getItemId());
                     }
diff --git a/src/main/java/com/syncleus/aethermud/items/Item.java b/src/main/java/com/syncleus/aethermud/items/Item.java
index 7a146b201ad4728a2af59beb7e00bf8950326323..d12c09b9c6653ddbc756ca381729579aad55dcc7 100644
--- a/src/main/java/com/syncleus/aethermud/items/Item.java
+++ b/src/main/java/com/syncleus/aethermud/items/Item.java
@@ -15,88 +15,242 @@
  */
 package com.syncleus.aethermud.items;
 
+
 import com.syncleus.aethermud.core.service.TimeTracker;
 import com.syncleus.aethermud.stats.Stats;
+import com.google.common.collect.Lists;
 
+import java.io.Serializable;
 import java.util.List;
 import java.util.Set;
-
-public interface Item {
-    Stats getItemApplyStats();
-
-    List<TimeTracker.TimeOfDay> getValidTimeOfDays();
-
-    void setValidTimeOfDays(List<TimeTracker.TimeOfDay> validTimeOfDays);
-
-    void setValidTimeOfDays(Set<TimeTracker.TimeOfDay> validTimeOfDays);
-
-    boolean isDisposable();
-
-    int getMaxUses();
-
-    boolean isWithPlayer();
-
-    void setWithPlayer(boolean isWithPlayer);
-
-    int getNumberOfUses();
-
-    void setNumberOfUses(int numberOfUses);
-
-    String getItemId();
-
-    String getInternalItemName();
-
-    String getItemName();
-
-    String getItemDescription();
-
-    List<String> getItemTriggers();
-
-    void setItemTriggers(List<String> itemTriggers);
-
-    String getRestingName();
-
-    int getItemHalfLifeTicks();
-
-    Loot getLoot();
-
-    void setEquipment(Equipment equipment);
-
-    void setHasBeenWithPlayer(boolean hasBeenWithPlayer);
-
-    Equipment getEquipment();
-
-    Rarity getRarity();
-
-    int getValueInGold();
-
-    void setEffects(Set<Effect> effects);
-
-    Set<Effect> getEffects();
-
-    void setItemName(String itemName);
-
-    void setItemDescription(String itemDescription);
-
-    void setInternalItemName(String internalItemName);
-
-    void setRestingName(String restingName);
-
-    void setItemId(String itemId);
-
-    void setLoot(Loot loot);
-
-    void setItemHalfLifeTicks(int itemHalfLifeTicks);
-
-    void setRarity(Rarity rarity);
-
-    void setValueInGold(int valueInGold);
-
-    void setMaxUses(int maxUses);
-
-    void setDisposable(boolean disposable);
-
-    void setItemApplyStats(Stats itemApplyStats);
-
-    boolean isHasBeenWithPlayer();
+import java.util.UUID;
+
+public class Item implements Serializable {
+
+    private String itemName;
+    private String itemDescription;
+    private String internalItemName;
+    private List<String> itemTriggers;
+    private String restingName;
+    private String itemId;
+    private int numberOfUses;
+    private boolean isWithPlayer;
+    private Loot loot;
+    private int itemHalfLifeTicks;
+    private Equipment equipment;
+    private Rarity rarity;
+    private int valueInGold;
+    private Set<Effect> effects;
+    private boolean hasBeenWithPlayer;
+    private int maxUses;
+    private boolean isDisposable;
+    private List<TimeTracker.TimeOfDay> validTimeOfDays;
+    private Stats itemApplyStats;
+
+    public static final String CORPSE_INTENAL_NAME = "corpse";
+
+    public Item() {
+    }
+
+    protected Item(String itemName, String itemDescription, String internalItemName, List<String> itemTriggers, String restingName, String itemId, int numberOfUses, boolean isWithPlayer, Loot loot, int itemHalfLifeTicks, Equipment equipment, Rarity rarity, int valueInGold, Set<Effect> effects, boolean hasBeenWithPlayer, int maxUses, boolean isDisposable, Set<TimeTracker.TimeOfDay> validTimeOfDays, Stats itemApplyStats) {
+        this.itemName = itemName;
+        this.itemDescription = itemDescription;
+        this.internalItemName = internalItemName;
+        this.itemTriggers = itemTriggers;
+        this.restingName = restingName;
+        this.itemId = itemId;
+        this.numberOfUses = numberOfUses;
+        this.isWithPlayer = isWithPlayer;
+        this.loot = loot;
+        this.itemHalfLifeTicks = itemHalfLifeTicks;
+        this.equipment = equipment;
+        this.rarity = rarity;
+        this.valueInGold = valueInGold;
+        this.effects = effects;
+        this.hasBeenWithPlayer = hasBeenWithPlayer;
+        this.maxUses = maxUses;
+        this.isDisposable = isDisposable;
+        this.validTimeOfDays = ( validTimeOfDays == null ? Lists.newArrayList() : Lists.newArrayList(validTimeOfDays));
+        this.itemApplyStats = itemApplyStats;
+    }
+
+    public Stats getItemApplyStats() {
+        return itemApplyStats;
+    }
+
+    public List<TimeTracker.TimeOfDay> getValidTimeOfDays() {
+        return validTimeOfDays;
+    }
+
+    public void setValidTimeOfDays(Set<TimeTracker.TimeOfDay> validTimeOfDays) {
+        this.validTimeOfDays = Lists.newArrayList(validTimeOfDays);
+    }
+
+    public void setValidTimeOfDays(List<TimeTracker.TimeOfDay> validTimeOfDays) {
+        this.validTimeOfDays = Lists.newArrayList(validTimeOfDays);
+    }
+
+    public boolean isDisposable() {
+        return isDisposable;
+    }
+
+    public int getMaxUses() {
+        return maxUses;
+    }
+
+    public boolean isWithPlayer() {
+        return isWithPlayer;
+    }
+
+    public void setWithPlayer(boolean isWithPlayer) {
+        if (isWithPlayer) {
+            setHasBeenWithPlayer(true);
+        }
+        this.isWithPlayer = isWithPlayer;
+    }
+
+    public int getNumberOfUses() {
+        return numberOfUses;
+    }
+
+    public void setNumberOfUses(int numberOfUses) {
+        this.numberOfUses = numberOfUses;
+    }
+
+    public String getItemId() {
+        return itemId;
+    }
+
+
+    public String getInternalItemName() {
+        return internalItemName;
+    }
+
+    public String getItemName() {
+        return itemName;
+    }
+
+    public String getItemDescription() {
+        return itemDescription;
+    }
+
+    public List<String> getItemTriggers() {
+        return itemTriggers;
+    }
+
+    public String getRestingName() {
+        return restingName;
+    }
+
+    public int getItemHalfLifeTicks() {
+        return itemHalfLifeTicks;
+    }
+
+    public Loot getLoot() {
+        return loot;
+    }
+
+    public void setEquipment(Equipment equipment) {
+        this.equipment = equipment;
+    }
+
+    public void setHasBeenWithPlayer(boolean hasBeenWithPlayer) {
+        this.hasBeenWithPlayer = hasBeenWithPlayer;
+    }
+
+    public Equipment getEquipment() {
+        return equipment;
+    }
+
+    public Rarity getRarity() {
+        return rarity;
+    }
+
+    public int getValueInGold() {
+        return valueInGold;
+    }
+
+    public void setEffects(Set<Effect> effects) {
+        this.effects = effects;
+    }
+
+    public Set<Effect> getEffects() {
+        return effects;
+    }
+
+    public void setItemName(String itemName) {
+        this.itemName = itemName;
+    }
+
+    public void setItemDescription(String itemDescription) {
+        this.itemDescription = itemDescription;
+    }
+
+    public void setInternalItemName(String internalItemName) {
+        this.internalItemName = internalItemName;
+    }
+
+    public void setItemTriggers(List<String> itemTriggers) {
+        this.itemTriggers = itemTriggers;
+    }
+
+    public void setRestingName(String restingName) {
+        this.restingName = restingName;
+    }
+
+    public void setItemId(String itemId) {
+        this.itemId = itemId;
+    }
+
+    public void setLoot(Loot loot) {
+        this.loot = loot;
+    }
+
+    public void setItemHalfLifeTicks(int itemHalfLifeTicks) {
+        this.itemHalfLifeTicks = itemHalfLifeTicks;
+    }
+
+    public void setRarity(Rarity rarity) {
+        this.rarity = rarity;
+    }
+
+    public void setValueInGold(int valueInGold) {
+        this.valueInGold = valueInGold;
+    }
+
+    public void setMaxUses(int maxUses) {
+        this.maxUses = maxUses;
+    }
+
+    public void setDisposable(boolean disposable) {
+        isDisposable = disposable;
+    }
+
+    public void setItemApplyStats(Stats itemApplyStats) {
+        this.itemApplyStats = itemApplyStats;
+    }
+
+    public boolean isHasBeenWithPlayer() {
+        return hasBeenWithPlayer;
+    }
+
+    public static Item createCorpseItem(String name, Loot loot) {
+
+        Item item = new ItemBuilder()
+                .internalItemName(Item.CORPSE_INTENAL_NAME)
+                .itemName(name + " corpse")
+                .itemDescription("a bloody corpse")
+                .itemTriggers(Lists.newArrayList("corpse", "c", name, name + " corpse"))
+                .itemId(UUID.randomUUID().toString())
+                .itemHalfLifeTicks(120)
+                .rarity(Rarity.BASIC)
+                .valueInGold(5)
+                .isDisposable(false)
+                .restingName("a corpse lies on the ground.")
+                .loot(loot)
+                .create();
+
+        return item;
+
+    }
 }
diff --git a/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java b/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java
index f7b44291ca97083e311b7b5c97f079ac4a36c911..03299fa980b3b29363be85147ff2e9f03be7953e 100644
--- a/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java
+++ b/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java
@@ -19,7 +19,6 @@ package com.syncleus.aethermud.items;
 import com.google.common.collect.Sets;
 import com.syncleus.aethermud.core.service.TimeTracker;
 import com.syncleus.aethermud.stats.Stats;
-import com.syncleus.aethermud.storage.graphdb.model.StatsData;
 
 import java.util.List;
 import java.util.Set;
@@ -191,8 +190,8 @@ public class ItemBuilder {
         return this;
     }
 
-    public ItemPojo create() {
-        return new ItemPojo(itemName, itemDescription, internalItemName, itemTriggers, restingName, itemId, numberOfUses, isWithPlayer, loot, itemHalfLifeTicks, equipment, rarity, valueInGold, effects, hasBeenWithPlayer, maxUses, isDisposable, validTimeOfDays, itemApplyStats);
+    public Item create() {
+        return new Item(itemName, itemDescription, internalItemName, itemTriggers, restingName, itemId, numberOfUses, isWithPlayer, loot, itemHalfLifeTicks, equipment, rarity, valueInGold, effects, hasBeenWithPlayer, maxUses, isDisposable, validTimeOfDays, itemApplyStats);
     }
 
 
diff --git a/src/main/java/com/syncleus/aethermud/items/ItemDecayManager.java b/src/main/java/com/syncleus/aethermud/items/ItemDecayManager.java
index afdc4468ad4129a7d0513d89f510a589727bb79c..e4a46875671e1d222fa6cf40b4f2084fdd277f6a 100644
--- a/src/main/java/com/syncleus/aethermud/items/ItemDecayManager.java
+++ b/src/main/java/com/syncleus/aethermud/items/ItemDecayManager.java
@@ -38,7 +38,7 @@ public class ItemDecayManager extends AetherMudEntity {
         this.gameManager = gameManager;
     }
 
-    public void addItem(ItemPojo item) {
+    public void addItem(Item item) {
         item.setWithPlayer(false);
         itemDecayTracker.put(item.getItemId(), new DecayProgress(item.getItemHalfLifeTicks()));
     }
@@ -58,12 +58,12 @@ public class ItemDecayManager extends AetherMudEntity {
                 ConcurrentHashMap<String, DecayProgress> itemDecayTracker1 = getItemDecayTracker();
                 for (Map.Entry<String, DecayProgress> next : itemDecayTracker1.entrySet()) {
                     DecayProgress decayProgress = next.getValue();
-                    Optional<ItemPojo> itemOptional = entityManager.getItemEntity(next.getKey());
+                    Optional<Item> itemOptional = entityManager.getItemEntity(next.getKey());
                     if (!itemOptional.isPresent()) {
                         removeItemFromDecayManager(next.getKey());
                         continue;
                     }
-                    ItemPojo item = itemOptional.get();
+                    Item item = itemOptional.get();
                     if (item.isWithPlayer()) {
                         removeItemFromDecayManager(item.getItemId());
                         continue;
diff --git a/src/main/java/com/syncleus/aethermud/items/ItemPojo.java b/src/main/java/com/syncleus/aethermud/items/ItemPojo.java
deleted file mode 100644
index 308d36b1819eadf58705776662dfacfcd2555ca0..0000000000000000000000000000000000000000
--- a/src/main/java/com/syncleus/aethermud/items/ItemPojo.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/**
- * Copyright 2017 Syncleus, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.syncleus.aethermud.items;
-
-
-import com.syncleus.aethermud.core.service.TimeTracker;
-import com.syncleus.aethermud.stats.Stats;
-import com.google.common.collect.Lists;
-
-import java.io.Serializable;
-import java.util.List;
-import java.util.Set;
-import java.util.UUID;
-
-public class ItemPojo implements Serializable, Item {
-
-    private String itemName;
-    private String itemDescription;
-    private String internalItemName;
-    private List<String> itemTriggers;
-    private String restingName;
-    private String itemId;
-    private int numberOfUses;
-    private boolean isWithPlayer;
-    private Loot loot;
-    private int itemHalfLifeTicks;
-    private Equipment equipment;
-    private Rarity rarity;
-    private int valueInGold;
-    private Set<Effect> effects;
-    private boolean hasBeenWithPlayer;
-    private int maxUses;
-    private boolean isDisposable;
-    private List<TimeTracker.TimeOfDay> validTimeOfDays;
-    private Stats itemApplyStats;
-
-    public static final String CORPSE_INTENAL_NAME = "corpse";
-
-    protected ItemPojo(String itemName, String itemDescription, String internalItemName, List<String> itemTriggers, String restingName, String itemId, int numberOfUses, boolean isWithPlayer, Loot loot, int itemHalfLifeTicks, Equipment equipment, Rarity rarity, int valueInGold, Set<Effect> effects, boolean hasBeenWithPlayer, int maxUses, boolean isDisposable, Set<TimeTracker.TimeOfDay> validTimeOfDays, Stats itemApplyStats) {
-        this.itemName = itemName;
-        this.itemDescription = itemDescription;
-        this.internalItemName = internalItemName;
-        this.itemTriggers = itemTriggers;
-        this.restingName = restingName;
-        this.itemId = itemId;
-        this.numberOfUses = numberOfUses;
-        this.isWithPlayer = isWithPlayer;
-        this.loot = loot;
-        this.itemHalfLifeTicks = itemHalfLifeTicks;
-        this.equipment = equipment;
-        this.rarity = rarity;
-        this.valueInGold = valueInGold;
-        this.effects = effects;
-        this.hasBeenWithPlayer = hasBeenWithPlayer;
-        this.maxUses = maxUses;
-        this.isDisposable = isDisposable;
-        this.validTimeOfDays = ( validTimeOfDays == null ? Lists.newArrayList() : Lists.newArrayList(validTimeOfDays));
-        this.itemApplyStats = itemApplyStats;
-    }
-
-    @Override
-    public Stats getItemApplyStats() {
-        return itemApplyStats;
-    }
-
-    @Override
-    public List<TimeTracker.TimeOfDay> getValidTimeOfDays() {
-        return validTimeOfDays;
-    }
-
-    @Override
-    public void setValidTimeOfDays(Set<TimeTracker.TimeOfDay> validTimeOfDays) {
-        this.validTimeOfDays = Lists.newArrayList(validTimeOfDays);
-    }
-
-    @Override
-    public void setValidTimeOfDays(List<TimeTracker.TimeOfDay> validTimeOfDays) {
-        this.validTimeOfDays = Lists.newArrayList(validTimeOfDays);
-    }
-
-    @Override
-    public boolean isDisposable() {
-        return isDisposable;
-    }
-
-    @Override
-    public int getMaxUses() {
-        return maxUses;
-    }
-
-    @Override
-    public boolean isWithPlayer() {
-        return isWithPlayer;
-    }
-
-    @Override
-    public void setWithPlayer(boolean isWithPlayer) {
-        if (isWithPlayer) {
-            setHasBeenWithPlayer(true);
-        }
-        this.isWithPlayer = isWithPlayer;
-    }
-
-    @Override
-    public int getNumberOfUses() {
-        return numberOfUses;
-    }
-
-    @Override
-    public void setNumberOfUses(int numberOfUses) {
-        this.numberOfUses = numberOfUses;
-    }
-
-    @Override
-    public String getItemId() {
-        return itemId;
-    }
-
-
-    @Override
-    public String getInternalItemName() {
-        return internalItemName;
-    }
-
-    @Override
-    public String getItemName() {
-        return itemName;
-    }
-
-    @Override
-    public String getItemDescription() {
-        return itemDescription;
-    }
-
-    @Override
-    public List<String> getItemTriggers() {
-        return itemTriggers;
-    }
-
-    @Override
-    public String getRestingName() {
-        return restingName;
-    }
-
-    @Override
-    public int getItemHalfLifeTicks() {
-        return itemHalfLifeTicks;
-    }
-
-    @Override
-    public Loot getLoot() {
-        return loot;
-    }
-
-    @Override
-    public void setEquipment(Equipment equipment) {
-        this.equipment = equipment;
-    }
-
-    @Override
-    public void setHasBeenWithPlayer(boolean hasBeenWithPlayer) {
-        this.hasBeenWithPlayer = hasBeenWithPlayer;
-    }
-
-    @Override
-    public Equipment getEquipment() {
-        return equipment;
-    }
-
-    @Override
-    public Rarity getRarity() {
-        return rarity;
-    }
-
-    @Override
-    public int getValueInGold() {
-        return valueInGold;
-    }
-
-    @Override
-    public void setEffects(Set<Effect> effects) {
-        this.effects = effects;
-    }
-
-    @Override
-    public Set<Effect> getEffects() {
-        return effects;
-    }
-
-    @Override
-    public void setItemName(String itemName) {
-        this.itemName = itemName;
-    }
-
-    @Override
-    public void setItemDescription(String itemDescription) {
-        this.itemDescription = itemDescription;
-    }
-
-    @Override
-    public void setInternalItemName(String internalItemName) {
-        this.internalItemName = internalItemName;
-    }
-
-    @Override
-    public void setItemTriggers(List<String> itemTriggers) {
-        this.itemTriggers = itemTriggers;
-    }
-
-    @Override
-    public void setRestingName(String restingName) {
-        this.restingName = restingName;
-    }
-
-    @Override
-    public void setItemId(String itemId) {
-        this.itemId = itemId;
-    }
-
-    @Override
-    public void setLoot(Loot loot) {
-        this.loot = loot;
-    }
-
-    @Override
-    public void setItemHalfLifeTicks(int itemHalfLifeTicks) {
-        this.itemHalfLifeTicks = itemHalfLifeTicks;
-    }
-
-    @Override
-    public void setRarity(Rarity rarity) {
-        this.rarity = rarity;
-    }
-
-    @Override
-    public void setValueInGold(int valueInGold) {
-        this.valueInGold = valueInGold;
-    }
-
-    @Override
-    public void setMaxUses(int maxUses) {
-        this.maxUses = maxUses;
-    }
-
-    @Override
-    public void setDisposable(boolean disposable) {
-        isDisposable = disposable;
-    }
-
-    @Override
-    public void setItemApplyStats(Stats itemApplyStats) {
-        this.itemApplyStats = itemApplyStats;
-    }
-
-    @Override
-    public boolean isHasBeenWithPlayer() {
-        return hasBeenWithPlayer;
-    }
-
-    public static ItemPojo createCorpseItem(String name, Loot loot) {
-
-        ItemPojo item = new ItemBuilder()
-                .internalItemName(ItemPojo.CORPSE_INTENAL_NAME)
-                .itemName(name + " corpse")
-                .itemDescription("a bloody corpse")
-                .itemTriggers(Lists.newArrayList("corpse", "c", name, name + " corpse"))
-                .itemId(UUID.randomUUID().toString())
-                .itemHalfLifeTicks(120)
-                .rarity(Rarity.BASIC)
-                .valueInGold(5)
-                .isDisposable(false)
-                .restingName("a corpse lies on the ground.")
-                .loot(loot)
-                .create();
-
-        return item;
-
-    }
-}
diff --git a/src/main/java/com/syncleus/aethermud/items/ItemUseAction.java b/src/main/java/com/syncleus/aethermud/items/ItemUseAction.java
index 0877b9d6365d1c7019b12ef2210d1db61d961c4c..ec3ebe0ed48c4542778e5ca4301cfd5c1bcb8464 100644
--- a/src/main/java/com/syncleus/aethermud/items/ItemUseAction.java
+++ b/src/main/java/com/syncleus/aethermud/items/ItemUseAction.java
@@ -24,9 +24,9 @@ import java.util.Set;
 public interface ItemUseAction {
     String getInternalItemName();
 
-    void executeAction(GameManager gameManager, Player player, ItemPojo item, UseCommand.UseItemOn useItemOn);
+    void executeAction(GameManager gameManager, Player player, Item item, UseCommand.UseItemOn useItemOn);
 
-    void postExecuteAction(GameManager gameManager, Player player, ItemPojo item);
+    void postExecuteAction(GameManager gameManager, Player player, Item item);
 
     Set<Effect> getEffects();
 
diff --git a/src/main/java/com/syncleus/aethermud/items/ItemUseHandler.java b/src/main/java/com/syncleus/aethermud/items/ItemUseHandler.java
index 73e07d73d71d23aba3eb9062a65ba5b33aad3e45..ce88b311bc0fd80453d92ddd8db6fea3c572a7b3 100644
--- a/src/main/java/com/syncleus/aethermud/items/ItemUseHandler.java
+++ b/src/main/java/com/syncleus/aethermud/items/ItemUseHandler.java
@@ -35,7 +35,7 @@ public class ItemUseHandler {
         this.gameManager = gameManager;
     }
 
-    public void handle(Player player, ItemPojo item, UseCommand.UseItemOn useItemOn) {
+    public void handle(Player player, Item item, UseCommand.UseItemOn useItemOn) {
         ItemUseAction itemUseAction = null;
         Optional<ItemMetadata> itemMetadataOptional = gameManager.getItemStorage().get(item.getInternalItemName());
         if (!itemMetadataOptional.isPresent()) {
@@ -61,7 +61,7 @@ public class ItemUseHandler {
         }
     }
 
-    public static void incrementUses(ItemPojo item) {
+    public static void incrementUses(Item item) {
         item.setNumberOfUses(item.getNumberOfUses() + 1);
     }
 }
diff --git a/src/main/java/com/syncleus/aethermud/items/LootManager.java b/src/main/java/com/syncleus/aethermud/items/LootManager.java
index d24202968c3d482b87871e49cfce5dfc004884c0..ac9705af35786cb63e0acf50209763f5a7d6cf7f 100644
--- a/src/main/java/com/syncleus/aethermud/items/LootManager.java
+++ b/src/main/java/com/syncleus/aethermud/items/LootManager.java
@@ -48,8 +48,8 @@ public class LootManager {
         return randInt(loot.getLootGoldMin(), loot.getLootGoldMax());
     }
 
-    public Set<ItemPojo> lootItemsReturn(Loot loot) {
-        Set<ItemPojo> lootItems = Sets.newHashSet();
+    public Set<Item> lootItemsReturn(Loot loot) {
+        Set<Item> lootItems = Sets.newHashSet();
         for (String internalItemName: loot.getInternalItemNames()) {
             Optional<ItemMetadata> itemMetadataOptional = gameManager.getItemStorage().get(internalItemName);
             if (!itemMetadataOptional.isPresent()) {
@@ -57,7 +57,7 @@ public class LootManager {
             }
             ItemMetadata itemMetadata = itemMetadataOptional.get();
             if (lootDropSuccess(itemMetadata.getRarity().getPercentToLoot())) {
-                ItemPojo i = new ItemBuilder().from(itemMetadata).create();
+                Item i = new ItemBuilder().from(itemMetadata).create();
                 gameManager.getEntityManager().saveItem(i);
                 lootItems.add(i);
             }
diff --git a/src/main/java/com/syncleus/aethermud/items/use/DefaultApplyEffectsStats.java b/src/main/java/com/syncleus/aethermud/items/use/DefaultApplyEffectsStats.java
index 5062ed726b6a02d33072c6ca43543bdda18779bf..8fb814775a666340e284f42f0d8e4d10e95e19a9 100644
--- a/src/main/java/com/syncleus/aethermud/items/use/DefaultApplyEffectsStats.java
+++ b/src/main/java/com/syncleus/aethermud/items/use/DefaultApplyEffectsStats.java
@@ -43,7 +43,7 @@ public class DefaultApplyEffectsStats implements ItemUseAction {
     }
 
     @Override
-    public void executeAction(GameManager gameManager, Player player, ItemPojo item, UseCommand.UseItemOn useItemOn) {
+    public void executeAction(GameManager gameManager, Player player, Item item, UseCommand.UseItemOn useItemOn) {
         String playerName = player.getPlayerName();
 
         gameManager.writeToPlayerCurrentRoom(player.getPlayerId(), playerName + " uses " + item.getItemName() + ".\r\n");
@@ -60,7 +60,7 @@ public class DefaultApplyEffectsStats implements ItemUseAction {
     }
 
     @Override
-    public void postExecuteAction(GameManager gameManager, Player player, ItemPojo item) {
+    public void postExecuteAction(GameManager gameManager, Player player, Item item) {
         ItemUseHandler.incrementUses(item);
         if (item.isDisposable()) {
             if (item.getNumberOfUses() < item.getMaxUses()) {
diff --git a/src/main/java/com/syncleus/aethermud/items/use/DirtyBombUseAction.java b/src/main/java/com/syncleus/aethermud/items/use/DirtyBombUseAction.java
index f70f2e0c506b72be221291a5ad0b3c075abc1566..9ce835a8438d1b8c6cba4db2deb82b4e9b3557fc 100644
--- a/src/main/java/com/syncleus/aethermud/items/use/DirtyBombUseAction.java
+++ b/src/main/java/com/syncleus/aethermud/items/use/DirtyBombUseAction.java
@@ -44,7 +44,7 @@ public class DirtyBombUseAction implements ItemUseAction {
     }
 
     @Override
-    public void executeAction(GameManager gameManager, Player player, ItemPojo item, UseCommand.UseItemOn useItemOn) {
+    public void executeAction(GameManager gameManager, Player player, Item item, UseCommand.UseItemOn useItemOn) {
         Room currentRoom = player.getCurrentRoom();
         if (currentRoom.getRoomId().equals(1)) {
             gameManager.writeToPlayerCurrentRoom(player.getPlayerId(), player.getPlayerName() + " tried to detonate a " + item.getItemName() + "!");
@@ -74,7 +74,7 @@ public class DirtyBombUseAction implements ItemUseAction {
     }
 
     @Override
-    public void postExecuteAction(GameManager gameManager, Player player, ItemPojo item) {
+    public void postExecuteAction(GameManager gameManager, Player player, Item item) {
         ItemUseHandler.incrementUses(item);
         if (item.isDisposable()) {
             if (item.getNumberOfUses() < item.getMaxUses()) {
diff --git a/src/main/java/com/syncleus/aethermud/items/use/LightningSpellBookUseAction.java b/src/main/java/com/syncleus/aethermud/items/use/LightningSpellBookUseAction.java
index 430a6f65ece16d60ce1abd88c17a4dc2684b18e9..614692c86502c76983364a7ef0c013f294547e6e 100644
--- a/src/main/java/com/syncleus/aethermud/items/use/LightningSpellBookUseAction.java
+++ b/src/main/java/com/syncleus/aethermud/items/use/LightningSpellBookUseAction.java
@@ -18,7 +18,7 @@ package com.syncleus.aethermud.items.use;
 import com.syncleus.aethermud.command.commands.UseCommand;
 import com.syncleus.aethermud.core.GameManager;
 import com.syncleus.aethermud.items.Effect;
-import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.items.Item;
 import com.syncleus.aethermud.items.ItemMetadata;
 import com.syncleus.aethermud.items.ItemUseAction;
 import com.syncleus.aethermud.player.Player;
@@ -42,7 +42,7 @@ public class LightningSpellBookUseAction implements ItemUseAction {
     }
 
     @Override
-    public void executeAction(GameManager gameManager, Player player, ItemPojo item, UseCommand.UseItemOn useItemOn) {
+    public void executeAction(GameManager gameManager, Player player, Item item, UseCommand.UseItemOn useItemOn) {
         if (player.getLearnedSpells().contains(LightningSpell.name)) {
             gameManager.getChannelUtils().write(player.getPlayerId(), "You already know how to use " + LightningSpell.name);
             dontDelete = true;
@@ -53,7 +53,7 @@ public class LightningSpellBookUseAction implements ItemUseAction {
     }
 
     @Override
-    public void postExecuteAction(GameManager gameManager, Player player, ItemPojo item) {
+    public void postExecuteAction(GameManager gameManager, Player player, Item item) {
         if (!dontDelete) {
             player.removeInventoryId(item.getItemId());
             gameManager.getEntityManager().removeItem(item);
diff --git a/src/main/java/com/syncleus/aethermud/items/use/ResetAllEffectsUseAction.java b/src/main/java/com/syncleus/aethermud/items/use/ResetAllEffectsUseAction.java
index 3530b2db1c3c1cf813aaf498f8f0b8d7e1e1384d..e5fe47c0a07f1e74b10cac0950172982495cdaca 100644
--- a/src/main/java/com/syncleus/aethermud/items/use/ResetAllEffectsUseAction.java
+++ b/src/main/java/com/syncleus/aethermud/items/use/ResetAllEffectsUseAction.java
@@ -36,13 +36,13 @@ public class ResetAllEffectsUseAction implements ItemUseAction {
     }
 
     @Override
-    public void executeAction(GameManager gameManager, Player player, ItemPojo item, UseCommand.UseItemOn useItemOn) {
+    public void executeAction(GameManager gameManager, Player player, Item item, UseCommand.UseItemOn useItemOn) {
         player.resetEffects();
         gameManager.getChannelUtils().write(player.getPlayerId(), "All Effects are removed." + "\r\n");
     }
 
     @Override
-    public void postExecuteAction(GameManager gameManager, Player player, ItemPojo item) {
+    public void postExecuteAction(GameManager gameManager, Player player, Item item) {
         ItemUseHandler.incrementUses(item);
         if (item.isDisposable()) {
             if (item.getNumberOfUses() < item.getMaxUses()) {
diff --git a/src/main/java/com/syncleus/aethermud/items/use/StickOfJusticeUseAction.java b/src/main/java/com/syncleus/aethermud/items/use/StickOfJusticeUseAction.java
index 45efbe1b72832c41d8cb78af9048ced3c2d4bde6..de9251abdbaa4f2852f6f2e607e867cbfa70819f 100644
--- a/src/main/java/com/syncleus/aethermud/items/use/StickOfJusticeUseAction.java
+++ b/src/main/java/com/syncleus/aethermud/items/use/StickOfJusticeUseAction.java
@@ -18,7 +18,7 @@ package com.syncleus.aethermud.items.use;
 import com.syncleus.aethermud.command.commands.UseCommand;
 import com.syncleus.aethermud.core.GameManager;
 import com.syncleus.aethermud.items.Effect;
-import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.items.Item;
 import com.syncleus.aethermud.items.ItemMetadata;
 import com.syncleus.aethermud.items.ItemUseAction;
 import com.syncleus.aethermud.player.Player;
@@ -41,7 +41,7 @@ public class StickOfJusticeUseAction implements ItemUseAction {
 
 
     @Override
-    public void executeAction(GameManager gameManager, Player player, ItemPojo item, UseCommand.UseItemOn useItemOn) {
+    public void executeAction(GameManager gameManager, Player player, Item item, UseCommand.UseItemOn useItemOn) {
 
         if (!useItemOn.getTarget().isPresent()) {
             gameManager.getChannelUtils().write(player.getPlayerId(), "You must use the Stick Of Justice on someone who deserves it.");
@@ -60,7 +60,7 @@ public class StickOfJusticeUseAction implements ItemUseAction {
     }
 
     @Override
-    public void postExecuteAction(GameManager gameManager, Player player, ItemPojo item) {
+    public void postExecuteAction(GameManager gameManager, Player player, Item item) {
     }
 
     @Override
diff --git a/src/main/java/com/syncleus/aethermud/merchant/MerchantCommandHandler.java b/src/main/java/com/syncleus/aethermud/merchant/MerchantCommandHandler.java
index 3220a074087cde073abad15a5e5e75602efaf0e0..9fb9802bafaed48287b51a126b98dcfb473a64de 100644
--- a/src/main/java/com/syncleus/aethermud/merchant/MerchantCommandHandler.java
+++ b/src/main/java/com/syncleus/aethermud/merchant/MerchantCommandHandler.java
@@ -17,7 +17,7 @@ package com.syncleus.aethermud.merchant;
 
 import com.syncleus.aethermud.command.commands.CommandAuditLog;
 import com.syncleus.aethermud.core.GameManager;
-import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.items.Item;
 import com.syncleus.aethermud.player.Player;
 import com.syncleus.aethermud.server.model.AetherMudSession;
 import com.syncleus.aethermud.server.communication.Color;
@@ -70,7 +70,7 @@ public class MerchantCommandHandler extends SimpleChannelUpstreamHandler {
                     Integer desiredItem = Integer.parseInt(split[1]);
                     if (inventoryMenu.containsKey(desiredItem)) {
                         InventoryItemForSale inventoryItemForSale = inventoryMenu.get(desiredItem);
-                        ItemPojo item = inventoryItemForSale.getItem();
+                        Item item = inventoryItemForSale.getItem();
                         playerByUsername.incrementGold(inventoryItemForSale.getCost());
                         gameManager.getChannelUtils().write(playerByUsername.getPlayerId(), "You have received: " + inventoryItemForSale.getCost() + Color.YELLOW + " gold" + Color.RESET + " for " + item.getItemName() + "\r\n");
                         playerByUsername.removeInventoryId(item.getItemId());
@@ -103,9 +103,9 @@ public class MerchantCommandHandler extends SimpleChannelUpstreamHandler {
 
     public Map<Integer, InventoryItemForSale> getInventoryMenu(Player player) {
         Map<Integer, InventoryItemForSale> inventoryItemsForSale = Maps.newHashMap();
-        List<ItemPojo> inventory = player.getInventory();
+        List<Item> inventory = player.getInventory();
         int inv = 1;
-        for (ItemPojo itemEntity : inventory) {
+        for (Item itemEntity : inventory) {
             int valueInGold = itemEntity.getValueInGold();
             if (valueInGold == 0) {
                 valueInGold = itemEntity.getValueInGold();
@@ -150,10 +150,10 @@ public class MerchantCommandHandler extends SimpleChannelUpstreamHandler {
     }
 
     class InventoryItemForSale {
-        private final ItemPojo item;
+        private final Item item;
         private final Integer cost;
 
-        public InventoryItemForSale(Integer cost, ItemPojo item) {
+        public InventoryItemForSale(Integer cost, Item item) {
             this.cost = cost;
             this.item = item;
         }
@@ -162,7 +162,7 @@ public class MerchantCommandHandler extends SimpleChannelUpstreamHandler {
             return cost;
         }
 
-        public ItemPojo getItem() {
+        public Item getItem() {
             return item;
         }
     }
diff --git a/src/main/java/com/syncleus/aethermud/merchant/MerchantManager.java b/src/main/java/com/syncleus/aethermud/merchant/MerchantManager.java
index 902dbae52c5045fb1a80416f9260c2da56b35482..18d46243e4a91503e33f7e61ffa4d32d8d1b23aa 100644
--- a/src/main/java/com/syncleus/aethermud/merchant/MerchantManager.java
+++ b/src/main/java/com/syncleus/aethermud/merchant/MerchantManager.java
@@ -19,12 +19,11 @@ package com.syncleus.aethermud.merchant;
 import com.codahale.metrics.Timer;
 import com.syncleus.aethermud.Main;
 import com.syncleus.aethermud.core.GameManager;
-import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.items.Item;
 import com.syncleus.aethermud.items.ItemBuilder;
 import com.syncleus.aethermud.items.ItemMetadata;
 import com.syncleus.aethermud.player.Player;
 import com.syncleus.aethermud.player.PlayerUtil;
-import com.syncleus.aethermud.storage.graphdb.model.PlayerData;
 
 import java.util.Optional;
 
@@ -62,7 +61,7 @@ public class MerchantManager {
                     PlayerUtil.consume(gameManager, player.getPlayerId(), playerData -> {
                         long availableGold = playerData.getGold();
                         if (availableGold >= price) {
-                            ItemPojo item = new ItemBuilder().from(itemMetadata).create();
+                            Item item = new ItemBuilder().from(itemMetadata).create();
                             gameManager.getEntityManager().saveItem(item);
                             gameManager.acquireItem(player, item.getItemId());
                             player.incrementGold(-price);
diff --git a/src/main/java/com/syncleus/aethermud/merchant/lockers/GetCommand.java b/src/main/java/com/syncleus/aethermud/merchant/lockers/GetCommand.java
index ac53808471d3b03a54155a33eccd16e2d9aec348..cfd3723e91c397c7b3bf9e26bf9f5b73f845fcab 100644
--- a/src/main/java/com/syncleus/aethermud/merchant/lockers/GetCommand.java
+++ b/src/main/java/com/syncleus/aethermud/merchant/lockers/GetCommand.java
@@ -15,7 +15,7 @@
  */
 package com.syncleus.aethermud.merchant.lockers;
 
-import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.items.Item;
 import com.syncleus.aethermud.core.GameManager;
 import com.syncleus.aethermud.storage.graphdb.GraphStorageFactory;
 import com.syncleus.aethermud.storage.graphdb.model.PlayerData;
@@ -50,11 +50,11 @@ public class GetCommand extends LockerCommand {
                 }
                 PlayerData playerData = playerMetadataOptional.get();
                 for (String entityId : playerData.getLockerInventory()) {
-                    Optional<ItemPojo> itemEntityOptional = gameManager.getEntityManager().getItemEntity(entityId);
+                    Optional<Item> itemEntityOptional = gameManager.getEntityManager().getItemEntity(entityId);
                     if (!itemEntityOptional.isPresent()) {
                         continue;
                     }
-                    ItemPojo itemEntity = itemEntityOptional.get();
+                    Item itemEntity = itemEntityOptional.get();
                     if (itemEntity.getItemTriggers().contains(desiredRetrieveOption)) {
                         player.transferItemFromLocker(entityId);
                         write(itemEntity.getItemName() + " retrieved from locker.\r\n");
diff --git a/src/main/java/com/syncleus/aethermud/merchant/lockers/PutCommand.java b/src/main/java/com/syncleus/aethermud/merchant/lockers/PutCommand.java
index 2db8730d6d21c74396f0b4b0d3ed08085a538593..fac190129f2f7e8e75b02e2c90da1c995dccbe05 100644
--- a/src/main/java/com/syncleus/aethermud/merchant/lockers/PutCommand.java
+++ b/src/main/java/com/syncleus/aethermud/merchant/lockers/PutCommand.java
@@ -15,7 +15,7 @@
  */
 package com.syncleus.aethermud.merchant.lockers;
 
-import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.items.Item;
 import com.syncleus.aethermud.core.GameManager;
 import com.google.common.base.Joiner;
 import org.jboss.netty.channel.ChannelHandlerContext;
@@ -39,7 +39,7 @@ public class PutCommand extends LockerCommand {
             configure(e);
             originalMessageParts.remove(0);
             String desiredDropOffItem = Joiner.on(" ").join(originalMessageParts);
-            for (ItemPojo item : player.getInventory()) {
+            for (Item item : player.getInventory()) {
                 if (item.getItemTriggers().contains(desiredDropOffItem)) {
                     item.setWithPlayer(false);
                     player.transferItemToLocker(item.getItemId());
diff --git a/src/main/java/com/syncleus/aethermud/npc/NpcSpawn.java b/src/main/java/com/syncleus/aethermud/npc/NpcSpawn.java
index 5a508369452eae6329011de4bb643af0d1392ddb..6bde9d2157deb99a88a5d283039cb218a9068766 100644
--- a/src/main/java/com/syncleus/aethermud/npc/NpcSpawn.java
+++ b/src/main/java/com/syncleus/aethermud/npc/NpcSpawn.java
@@ -22,7 +22,7 @@ import com.syncleus.aethermud.core.GameManager;
 import com.syncleus.aethermud.core.SentryManager;
 import com.syncleus.aethermud.entity.AetherMudEntity;
 import com.syncleus.aethermud.items.Effect;
-import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.items.Item;
 import com.syncleus.aethermud.items.Loot;
 import com.syncleus.aethermud.player.CoolDown;
 import com.syncleus.aethermud.player.CoolDownType;
@@ -278,7 +278,7 @@ public class NpcSpawn extends AetherMudEntity {
         isAlive.set(false);
         player.removeActiveAlertStatus(this);
         Map<String, Double> damagePercents;
-        ItemPojo corpse = ItemPojo.createCorpseItem(getName(), getLoot());
+        Item corpse = Item.createCorpseItem(getName(), getLoot());
         if (!player.isActive(CoolDownType.DEATH)) {
             gameManager.writeToPlayerCurrentRoom(player.getPlayerId(), getDieMessage() + "\r\n");
         }
diff --git a/src/main/java/com/syncleus/aethermud/player/Player.java b/src/main/java/com/syncleus/aethermud/player/Player.java
index 6bdbb9a57f1562d0dfba2567ad3aca6a8f1026e9..941021654578002800da9069d5455d4113c19be6 100644
--- a/src/main/java/com/syncleus/aethermud/player/Player.java
+++ b/src/main/java/com/syncleus/aethermud/player/Player.java
@@ -696,16 +696,16 @@ public class Player extends AetherMudEntity {
         }
     }
 
-    public Optional<ItemPojo> getInventoryItem(String itemKeyword) {
+    public Optional<Item> getInventoryItem(String itemKeyword) {
         synchronized (interner.intern(playerId)) {
             final List<String> inventory = new ArrayList<>();
             this.consumeRead(playerData -> inventory.addAll(playerData.getInventory()));
             for (String itemId : inventory) {
-                Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
+                Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
                 if (!itemOptional.isPresent()) {
                     continue;
                 }
-                ItemPojo itemEntity = itemOptional.get();
+                Item itemEntity = itemOptional.get();
                 if (itemEntity.getItemTriggers().contains(itemKeyword)) {
                     return Optional.of(itemEntity);
                 }
@@ -721,10 +721,10 @@ public class Player extends AetherMudEntity {
     public List<String> getRolledUpLockerInventory() {
         synchronized (interner.intern(playerId)) {
             List<String> rolledUp = Lists.newArrayList();
-            List<ItemPojo> inventory = getLockerInventory();
+            List<Item> inventory = getLockerInventory();
             Map<String, Integer> itemAndCounts = Maps.newHashMap();
             if (inventory != null) {
-                for (ItemPojo item : inventory) {
+                for (Item item : inventory) {
                     StringBuilder invItem = new StringBuilder();
                     invItem.append(item.getItemName());
                     int maxUses = item.getMaxUses();
@@ -759,14 +759,14 @@ public class Player extends AetherMudEntity {
         }
     }
 
-    public List<ItemPojo> getLockerInventory() {
+    public List<Item> getLockerInventory() {
         synchronized (interner.intern(playerId)) {
             return this.transactRead(playerData -> {
-                List<ItemPojo> inventoryItems = Lists.newArrayList();
+                List<Item> inventoryItems = Lists.newArrayList();
                 List<String> inventory = playerData.getLockerInventory();
                 if (inventory != null) {
                     for (String itemId : inventory) {
-                        Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
+                        Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
                         if (!itemOptional.isPresent()) {
                             log.info("Orphaned inventoryId:" + itemId + " player: " + getPlayerName());
                             continue;
@@ -774,7 +774,7 @@ public class Player extends AetherMudEntity {
                         inventoryItems.add(itemOptional.get());
                     }
                 }
-                inventoryItems.sort(Comparator.comparing(ItemPojo::getItemName));
+                inventoryItems.sort(Comparator.comparing(Item::getItemName));
                 return inventoryItems;
             });
         }
@@ -783,10 +783,10 @@ public class Player extends AetherMudEntity {
     public List<String> getRolledUpIntentory() {
         synchronized (interner.intern(playerId)) {
             List<String> rolledUp = Lists.newArrayList();
-            List<ItemPojo> inventory = getInventory();
+            List<Item> inventory = getInventory();
             Map<String, Integer> itemAndCounts = Maps.newHashMap();
             if (inventory != null) {
-                for (ItemPojo item : inventory) {
+                for (Item item : inventory) {
                     StringBuilder invItem = new StringBuilder();
                     invItem.append(item.getItemName());
                     int maxUses = item.getMaxUses();
@@ -821,14 +821,14 @@ public class Player extends AetherMudEntity {
         }
     }
 
-    public List<ItemPojo> getInventory() {
+    public List<Item> getInventory() {
         synchronized (interner.intern(playerId)) {
             return this.transactRead(playerData -> {
-                List<ItemPojo> inventoryItems = Lists.newArrayList();
+                List<Item> inventoryItems = Lists.newArrayList();
                 List<String> inventory = playerData.getInventory();
                 if (inventory != null) {
                     for (String itemId : inventory) {
-                        Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
+                        Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
                         if (!itemOptional.isPresent()) {
                             log.info("Orphaned inventoryId:" + itemId + " player: " + getPlayerName());
                             continue;
@@ -836,20 +836,20 @@ public class Player extends AetherMudEntity {
                         inventoryItems.add(itemOptional.get());
                     }
                 }
-                inventoryItems.sort(Comparator.comparing(ItemPojo::getItemName));
+                inventoryItems.sort(Comparator.comparing(Item::getItemName));
                 return inventoryItems;
             });
         }
     }
 
-    public Set<ItemPojo> getEquipment() {
+    public Set<Item> getEquipment() {
         synchronized (interner.intern(playerId)) {
             return this.transactRead(playerData -> {
-                Set<ItemPojo> equipmentItems = Sets.newHashSet();
+                Set<Item> equipmentItems = Sets.newHashSet();
                 List<String> equipment = playerData.getPlayerEquipment();
                 if (equipment != null) {
                     for (String itemId : equipment) {
-                        Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
+                        Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
                         if (!itemOptional.isPresent()) {
                             log.info("Orphaned equipmentId:" + itemId + " player: " + getPlayerName());
                             continue;
@@ -862,14 +862,14 @@ public class Player extends AetherMudEntity {
         }
     }
 
-    public void equip(ItemPojo item) {
+    public void equip(Item item) {
         synchronized (interner.intern(playerId)) {
             if (item.getEquipment() == null) {
                 return;
             }
             Equipment equipment = item.getEquipment();
             EquipmentSlotType equipmentSlotType = equipment.getEquipmentSlotType();
-            Optional<ItemPojo> slotItemOptional = getSlotItem(equipmentSlotType);
+            Optional<Item> slotItemOptional = getSlotItem(equipmentSlotType);
             if (slotItemOptional.isPresent()) {
                 if (!unEquip(slotItemOptional.get())) {
                     return;
@@ -881,17 +881,17 @@ public class Player extends AetherMudEntity {
         }
     }
 
-    public Optional<ItemPojo> getSlotItem(EquipmentSlotType slot) {
+    public Optional<Item> getSlotItem(EquipmentSlotType slot) {
         return this.transactRead(playerData -> {
             if (playerData.getPlayerEquipment() == null) {
                 return Optional.empty();
             }
             for (String item : playerData.getPlayerEquipment()) {
-                Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(item);
+                Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(item);
                 if (!itemOptional.isPresent()) {
                     continue;
                 }
-                ItemPojo itemEntity = itemOptional.get();
+                Item itemEntity = itemOptional.get();
                 EquipmentSlotType equipmentSlotType = itemEntity.getEquipment().getEquipmentSlotType();
                 if (equipmentSlotType.equals(slot)) {
                     return Optional.of(itemEntity);
@@ -901,7 +901,7 @@ public class Player extends AetherMudEntity {
         });
     }
 
-    public boolean unEquip(ItemPojo item) {
+    public boolean unEquip(Item item) {
         synchronized (interner.intern(playerId)) {
             gameManager.getChannelUtils().write(playerId, "Un-equipping " + item.getItemName() + "\r\n");
             if (gameManager.acquireItem(this, item.getItemId())) {
@@ -964,11 +964,11 @@ public class Player extends AetherMudEntity {
                     return playerStats;
                 }
                 for (String equipId : playerEquipment) {
-                    Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(equipId);
+                    Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(equipId);
                     if (!itemOptional.isPresent()) {
                         continue;
                     }
-                    ItemPojo itemEntity = itemOptional.get();
+                    Item itemEntity = itemOptional.get();
                     Equipment equipment = itemEntity.getEquipment();
                     Stats stats = equipment.getStats();
                     StatsHelper.combineStats(newStats, stats);
@@ -1009,7 +1009,7 @@ public class Player extends AetherMudEntity {
         List<EquipmentSlotType> all = EquipmentSlotType.getAll();
         for (EquipmentSlotType slot : all) {
             t.addCell(capitalize(slot.getName()));
-            Optional<ItemPojo> slotItemOptional = getSlotItem(slot);
+            Optional<Item> slotItemOptional = getSlotItem(slot);
             if (slotItemOptional.isPresent()) {
                 t.addCell(slotItemOptional.get().getItemName());
             } else {
diff --git a/src/main/java/com/syncleus/aethermud/player/PlayerManagement.java b/src/main/java/com/syncleus/aethermud/player/PlayerManagement.java
index f402fd13da3c0bc91f4c3e6755b9946e3654d2bb..0d58d3e323117c7ea1de4eebd4c02c03edd7cfd4 100644
--- a/src/main/java/com/syncleus/aethermud/player/PlayerManagement.java
+++ b/src/main/java/com/syncleus/aethermud/player/PlayerManagement.java
@@ -18,7 +18,7 @@ package com.syncleus.aethermud.player;
 import com.google.common.base.Function;
 import com.google.common.collect.Sets;
 import com.syncleus.aethermud.core.GameManager;
-import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.items.Item;
 import com.syncleus.aethermud.items.ItemBuilder;
 import com.syncleus.aethermud.items.ItemMetadata;
 import com.syncleus.aethermud.server.communication.Color;
@@ -175,11 +175,11 @@ public class PlayerManagement implements PlayerManagementMBean {
             Map<String, String> inventoryContents = Maps.newHashMap();
             List<String> inventory = playerData.getInventory();
             for (String itemId : inventory) {
-                Optional<ItemPojo> itemEntityOptional = gameManager.getEntityManager().getItemEntity(itemId);
+                Optional<Item> itemEntityOptional = gameManager.getEntityManager().getItemEntity(itemId);
                 if (!itemEntityOptional.isPresent()) {
                     continue;
                 }
-                ItemPojo itemEntity = itemEntityOptional.get();
+                Item itemEntity = itemEntityOptional.get();
                 String itemName = itemEntity.getItemName();
                 final String msgWithoutColorCodes =
                     itemName.replaceAll("\u001B\\[[;\\d]*m", "");
@@ -195,11 +195,11 @@ public class PlayerManagement implements PlayerManagementMBean {
             Map<String, String> inventoryContents = Maps.newHashMap();
             List<String> inventory = playerData.getLockerInventory();
             for (String itemId : inventory) {
-                Optional<ItemPojo> itemEntityOptional = gameManager.getEntityManager().getItemEntity(itemId);
+                Optional<Item> itemEntityOptional = gameManager.getEntityManager().getItemEntity(itemId);
                 if (!itemEntityOptional.isPresent()) {
                     continue;
                 }
-                ItemPojo itemEntity = itemEntityOptional.get();
+                Item itemEntity = itemEntityOptional.get();
                 String itemName = itemEntity.getItemName();
                 final String msgWithoutColorCodes =
                     itemName.replaceAll("\u001B\\[[;\\d]*m", "");
@@ -215,7 +215,7 @@ public class PlayerManagement implements PlayerManagementMBean {
         if (!itemMetadata.isPresent()) {
             return "No such item exists with internal name: " + internalItemName;
         }
-        ItemPojo item = new ItemBuilder().from(itemMetadata.get()).create();
+        Item item = new ItemBuilder().from(itemMetadata.get()).create();
         gameManager.getEntityManager().saveItem(item);
         synchronized (findInterner().intern(playerId)) {
             this.consume(playerData -> playerData.addInventoryEntityId(item.getItemId()));
diff --git a/src/main/java/com/syncleus/aethermud/spawner/ItemSpawner.java b/src/main/java/com/syncleus/aethermud/spawner/ItemSpawner.java
index 523aa6700bfd2c6f774d1e9b97c35ea10d6d6f8e..bfd8a0eab416d710a090ccc284c006a841c825a0 100644
--- a/src/main/java/com/syncleus/aethermud/spawner/ItemSpawner.java
+++ b/src/main/java/com/syncleus/aethermud/spawner/ItemSpawner.java
@@ -20,7 +20,7 @@ import com.syncleus.aethermud.Main;
 import com.syncleus.aethermud.core.GameManager;
 import com.syncleus.aethermud.core.SentryManager;
 import com.syncleus.aethermud.entity.AetherMudEntity;
-import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.items.Item;
 import com.syncleus.aethermud.items.ItemBuilder;
 import com.syncleus.aethermud.items.ItemMetadata;
 import com.syncleus.aethermud.storage.graphdb.model.ItemData;
@@ -88,7 +88,7 @@ public class ItemSpawner extends AetherMudEntity {
     private void createAndAddItem() {
         ArrayList<Room> rooms = Lists.newArrayList(Iterators.filter(gameManager.getRoomManager().getRoomsByArea(spawnArea).iterator(), getRoomsWithRoom()));
         Room room = rooms.get(random.nextInt(rooms.size()));
-        ItemPojo item = new ItemBuilder().from(itemMetadata).create();
+        Item item = new ItemBuilder().from(itemMetadata).create();
         ItemData itemData = gameManager.getEntityManager().saveItem(item);
         gameManager.placeItemInRoom(room.getRoomId(), item.getItemId());
         Main.metrics.counter(MetricRegistry.name(ItemSpawner.class, item.getItemName() + "-spawn")).inc();
@@ -100,11 +100,11 @@ public class ItemSpawner extends AetherMudEntity {
         for (Room room : roomsByArea) {
             if (room.getAreas().contains(spawnArea)) {
                 for (String i : room.getItemIds()) {
-                    Optional<ItemPojo> currentItemOptional = gameManager.getEntityManager().getItemEntity(i);
+                    Optional<Item> currentItemOptional = gameManager.getEntityManager().getItemEntity(i);
                     if (!currentItemOptional.isPresent()) {
                         continue;
                     }
-                    ItemPojo currentItem = currentItemOptional.get();
+                    Item currentItem = currentItemOptional.get();
                     if (currentItem.getInternalItemName().equals(itemMetadata.getInternalItemName())) {
                         numberCurrentlyInArea++;
                     }
@@ -121,11 +121,11 @@ public class ItemSpawner extends AetherMudEntity {
                 int count = 0;
                 Set<String> itemIds = room.getItemIds();
                 for (String itemId : itemIds) {
-                    Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
+                    Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
                     if (!itemOptional.isPresent()) {
                         continue;
                     }
-                    ItemPojo item = itemOptional.get();
+                    Item item = itemOptional.get();
                     if (item.getInternalItemName().equals(itemMetadata.getInternalItemName())) {
                         count++;
                     }
diff --git a/src/main/java/com/syncleus/aethermud/stats/DefaultStats.java b/src/main/java/com/syncleus/aethermud/stats/DefaultStats.java
index 96ef1d73b7518760d4e3232cb0258d2df6212ee2..5774a344574e603bc6fa46483fcd64e775b2a888 100644
--- a/src/main/java/com/syncleus/aethermud/stats/DefaultStats.java
+++ b/src/main/java/com/syncleus/aethermud/stats/DefaultStats.java
@@ -25,7 +25,7 @@ public class DefaultStats {
             .setAim(9)
             .setAgile(9)
             .setArmorRating(4)
-            .setMeleSkill(9)
+            .setMeleeSkill(9)
             .setCurrentHealth(100)
             .setMaxHealth(100)
             .setWeaponRatingMin(4)
diff --git a/src/main/java/com/syncleus/aethermud/stats/Stats.java b/src/main/java/com/syncleus/aethermud/stats/Stats.java
index 1761ab00dfb2ce502ac37ede8fcbfc24dd96d140..c959aadd007a294a4b8ba6b16c3f7def5109aef0 100644
--- a/src/main/java/com/syncleus/aethermud/stats/Stats.java
+++ b/src/main/java/com/syncleus/aethermud/stats/Stats.java
@@ -80,24 +80,24 @@ public class Stats {
                  Integer foraging,
                  Integer inventorySize,
                  Integer maxEffects) {
-        this.strength = strength;
-        this.intelligence = intelligence;
-        this.willpower = willpower;
-        this.aim = aim;
-        this.agile = agile;
-        this.armorRating = armorRating;
-        this.meleeSkill = meleeSkill;
-        this.currentHealth = currentHealth;
-        this.maxHealth = maxHealth;
-        this.weaponRatingMax = weaponRatingMax;
-        this.weaponRatingMin = weaponRatingMin;
-        this.numberOfWeaponRolls = numberOfWeaponRolls;
-        this.experience = experience;
-        this.currentMana = currentMana;
-        this.maxMana = maxMana;
-        this.foraging = foraging;
-        this.inventorySize = inventorySize;
-        this.maxEffects = maxEffects;
+        this.strength = (strength == null ? 0 : strength);
+        this.intelligence = (intelligence == null ? 0 : intelligence);
+        this.willpower = (willpower == null ? 0 : willpower);
+        this.aim = (aim == null ? 0 : aim);
+        this.agile = (agile == null ? 0 : agile);
+        this.armorRating = (armorRating == null ? 0 : armorRating);
+        this.meleeSkill = (meleeSkill == null ? 0 : meleeSkill);
+        this.currentHealth = (currentHealth == null ? 0 : currentHealth);
+        this.maxHealth = (maxHealth == null ? 0 : maxHealth);
+        this.weaponRatingMax = (weaponRatingMax == null ? 0 : weaponRatingMax);
+        this.weaponRatingMin = (weaponRatingMin == null ? 0 : weaponRatingMin);
+        this.numberOfWeaponRolls = (numberOfWeaponRolls == null ? 0 : numberOfWeaponRolls);
+        this.experience = (experience == null ? 0 : experience);
+        this.currentMana = (currentMana == null ? 0 : currentMana);
+        this.maxMana = (maxMana == null ? 0 : maxMana);
+        this.foraging = (foraging == null ? 0 : foraging);
+        this.inventorySize = (inventorySize == null ? 0 : inventorySize);
+        this.maxEffects = (maxEffects == null ? 0 : maxEffects);
     }
 
 
@@ -106,7 +106,7 @@ public class Stats {
     }
 
     public void setIntelligence(Integer intelligence) {
-        this.intelligence = intelligence;
+        this.intelligence = (intelligence == null ? 0 : intelligence);
     }
 
     public Integer getMaxEffects() {
@@ -114,7 +114,7 @@ public class Stats {
     }
 
     public void setMaxEffects(Integer maxEffects) {
-        this.maxEffects = maxEffects;
+        this.maxEffects = (maxEffects == null ? 0 : maxEffects);
     }
 
     public Integer getExperience() {
@@ -122,7 +122,7 @@ public class Stats {
     }
 
     public void setExperience(Integer experience) {
-        this.experience = experience;
+        this.experience = (experience == null ? 0 : experience);
     }
 
     public Integer getStrength() {
@@ -130,7 +130,7 @@ public class Stats {
     }
 
     public void setStrength(Integer strength) {
-        this.strength = strength;
+        this.strength = (strength == null ? 0 : strength);
     }
 
     public Integer getWillpower() {
@@ -138,7 +138,7 @@ public class Stats {
     }
 
     public void setWillpower(Integer willpower) {
-        this.willpower = willpower;
+        this.willpower = (willpower == null ? 0 : willpower);
     }
 
     public Integer getAim() {
@@ -146,7 +146,7 @@ public class Stats {
     }
 
     public void setAim(Integer aim) {
-        this.aim = aim;
+        this.aim = (aim == null ? 0 : aim);
     }
 
     public Integer getAgile() {
@@ -154,7 +154,7 @@ public class Stats {
     }
 
     public void setAgile(Integer agile) {
-        this.agile = agile;
+        this.agile = (agile == null ? 0 : agile);
     }
 
     public Integer getArmorRating() {
@@ -162,15 +162,15 @@ public class Stats {
     }
 
     public void setArmorRating(Integer armorRating) {
-        this.armorRating = armorRating;
+        this.armorRating = (armorRating == null ? 0 : armorRating);
     }
 
     public Integer getMeleeSkill() {
         return meleeSkill;
     }
 
-    public void setMeleeSkill(Integer meleSkill) {
-        this.meleeSkill = meleSkill;
+    public void setMeleeSkill(Integer meleeSkill) {
+        this.meleeSkill = (meleeSkill == null ? 0 : meleeSkill);
     }
 
     public Integer getCurrentHealth() {
@@ -178,7 +178,7 @@ public class Stats {
     }
 
     public void setCurrentHealth(Integer currentHealth) {
-        this.currentHealth = currentHealth;
+        this.currentHealth = (currentHealth == null ? 0 : currentHealth);
     }
 
     public Integer getMaxHealth() {
@@ -186,7 +186,7 @@ public class Stats {
     }
 
     public void setMaxHealth(Integer maxHealth) {
-        this.maxHealth = maxHealth;
+        this.maxHealth = (maxHealth == null ? 0 : maxHealth);
     }
 
     public Integer getWeaponRatingMax() {
@@ -194,7 +194,7 @@ public class Stats {
     }
 
     public void setWeaponRatingMax(Integer weaponRatingMax) {
-        this.weaponRatingMax = weaponRatingMax;
+        this.weaponRatingMax = (weaponRatingMax == null ? 0 : weaponRatingMax);
     }
 
     public Integer getWeaponRatingMin() {
@@ -202,7 +202,7 @@ public class Stats {
     }
 
     public void setWeaponRatingMin(Integer weaponRatingMin) {
-        this.weaponRatingMin = weaponRatingMin;
+        this.weaponRatingMin = (weaponRatingMin == null ? 0 : weaponRatingMin);
     }
 
     public Integer getNumberOfWeaponRolls() {
@@ -210,7 +210,7 @@ public class Stats {
     }
 
     public void setNumberOfWeaponRolls(Integer numberOfWeaponRolls) {
-        this.numberOfWeaponRolls = numberOfWeaponRolls;
+        this.numberOfWeaponRolls = (numberOfWeaponRolls == null ? 0 : numberOfWeaponRolls);
     }
 
     public Integer getCurrentMana() {
@@ -222,11 +222,11 @@ public class Stats {
     }
 
     public void setCurrentMana(Integer currentMana) {
-        this.currentMana = currentMana;
+        this.currentMana = (currentMana == null ? 0 : currentMana);
     }
 
     public void setMaxMana(Integer maxMana) {
-        this.maxMana = maxMana;
+        this.maxMana = (maxMana == null ? 0 : maxMana);
     }
 
     public Integer getForaging() {
@@ -234,7 +234,7 @@ public class Stats {
     }
 
     public void setForaging(Integer foraging) {
-        this.foraging = foraging;
+        this.foraging = (foraging == null ? 0 : foraging);
     }
 
     public Integer getInventorySize() {
@@ -242,7 +242,7 @@ public class Stats {
     }
 
     public void setInventorySize(Integer inventorySize) {
-        this.inventorySize = inventorySize;
+        this.inventorySize = (inventorySize == null ? 0 : inventorySize);
     }
 
     public Integer getLevel() {
diff --git a/src/main/java/com/syncleus/aethermud/stats/StatsBuilder.java b/src/main/java/com/syncleus/aethermud/stats/StatsBuilder.java
index 9c3818a0c78b1560df1b943fbbff9b2b8c843c46..fc459313cdbab73bcb48d11933e065841133f883 100644
--- a/src/main/java/com/syncleus/aethermud/stats/StatsBuilder.java
+++ b/src/main/java/com/syncleus/aethermud/stats/StatsBuilder.java
@@ -22,7 +22,7 @@ public class StatsBuilder {
     private int aim;
     private int agile;
     private int armorRating;
-    private int meleSkill;
+    private int meleeSkill;
     private int currentHealth;
     private int maxHealth;
     private int weaponRatingMax;
@@ -45,7 +45,7 @@ public class StatsBuilder {
         this.aim = stats.getAim();
         this.agile = stats.getAgile();
         this.armorRating = stats.getArmorRating();
-        this.meleSkill = stats.getMeleeSkill();
+        this.meleeSkill = stats.getMeleeSkill();
         this.currentHealth = stats.getCurrentHealth();
         this.maxHealth = stats.getMaxHealth();
         this.weaponRatingMax = stats.getWeaponRatingMax();
@@ -89,8 +89,8 @@ public class StatsBuilder {
         return this;
     }
 
-    public StatsBuilder setMeleSkill(int meleSkill) {
-        this.meleSkill = meleSkill;
+    public StatsBuilder setMeleeSkill(int meleeSkill) {
+        this.meleeSkill = meleeSkill;
         return this;
     }
 
@@ -150,6 +150,6 @@ public class StatsBuilder {
     }
 
     public Stats createStats() {
-        return new Stats(strength, intelligence, willpower, aim, agile, armorRating, meleSkill, currentHealth, maxHealth, weaponRatingMax, weaponRatingMin, numberOfWeaponRolls, experience, currentMana, maxMana, foraging, inventorySize, maxEffects);
+        return new Stats(strength, intelligence, willpower, aim, agile, armorRating, meleeSkill, currentHealth, maxHealth, weaponRatingMax, weaponRatingMin, numberOfWeaponRolls, experience, currentMana, maxMana, foraging, inventorySize, maxEffects);
     }
 }
diff --git a/src/main/java/com/syncleus/aethermud/stats/StatsHelper.java b/src/main/java/com/syncleus/aethermud/stats/StatsHelper.java
index 106ccbbe92e2012eb2fe496fc62c25a109bcec35..28fd55e25ea7194c58c3f3db5f50a10d5006539d 100644
--- a/src/main/java/com/syncleus/aethermud/stats/StatsHelper.java
+++ b/src/main/java/com/syncleus/aethermud/stats/StatsHelper.java
@@ -26,7 +26,7 @@ public class StatsHelper {
         statsBuilder.setCurrentHealth(modifiedStats.getCurrentHealth() - origStats.getCurrentHealth());
         statsBuilder.setMaxHealth(modifiedStats.getMaxHealth() - origStats.getMaxHealth());
         statsBuilder.setExperience(modifiedStats.getExperience() - origStats.getExperience());
-        statsBuilder.setMeleSkill(modifiedStats.getMeleeSkill() - origStats.getMeleeSkill());
+        statsBuilder.setMeleeSkill(modifiedStats.getMeleeSkill() - origStats.getMeleeSkill());
         statsBuilder.setNumberOfWeaponRolls(modifiedStats.getNumberOfWeaponRolls() - origStats.getNumberOfWeaponRolls());
         statsBuilder.setStrength(modifiedStats.getStrength() - origStats.getStrength());
         statsBuilder.setWeaponRatingMax(modifiedStats.getWeaponRatingMax() - origStats.getWeaponRatingMax());
diff --git a/src/main/java/com/syncleus/aethermud/stats/modifier/BasicPlayerLevelStatsModifier.java b/src/main/java/com/syncleus/aethermud/stats/modifier/BasicPlayerLevelStatsModifier.java
index fad669dd4dd723617d95ca7d8bbdf323c0ffba52..36100a43d72e25f5830e00d715ce7a34140018c5 100644
--- a/src/main/java/com/syncleus/aethermud/stats/modifier/BasicPlayerLevelStatsModifier.java
+++ b/src/main/java/com/syncleus/aethermud/stats/modifier/BasicPlayerLevelStatsModifier.java
@@ -107,7 +107,7 @@ public class BasicPlayerLevelStatsModifier implements StatsModifier {
         statsBuilder.setAim(newAimRating);
         statsBuilder.setWillpower(newWillpowerRating);
         statsBuilder.setAgile(newAgileRating);
-        statsBuilder.setMeleSkill(newMeleRating);
+        statsBuilder.setMeleeSkill(newMeleRating);
         statsBuilder.setCurrentHealth(baseStats.getCurrentHealth());
         statsBuilder.setCurrentMana(baseStats.getCurrentMana());
         return statsBuilder.createStats();
diff --git a/src/main/java/com/syncleus/aethermud/stats/modifier/RangerStatsModifier.java b/src/main/java/com/syncleus/aethermud/stats/modifier/RangerStatsModifier.java
index c6940897fa13c09f82b7ceb17b4d10068fe1fb4c..1309eec05ba951ab240485996a08eb5b0dadd370 100644
--- a/src/main/java/com/syncleus/aethermud/stats/modifier/RangerStatsModifier.java
+++ b/src/main/java/com/syncleus/aethermud/stats/modifier/RangerStatsModifier.java
@@ -107,7 +107,7 @@ public class RangerStatsModifier implements StatsModifier {
         statsBuilder.setAim(newAimRating);
         statsBuilder.setWillpower(newWillpowerRating);
         statsBuilder.setAgile(newAgileRating);
-        statsBuilder.setMeleSkill(newMeleRating);
+        statsBuilder.setMeleeSkill(newMeleRating);
         statsBuilder.setCurrentHealth(baseStats.getCurrentHealth());
         statsBuilder.setCurrentMana(baseStats.getCurrentMana());
         return statsBuilder.createStats();
diff --git a/src/main/java/com/syncleus/aethermud/stats/modifier/ShamanStatsModifier.java b/src/main/java/com/syncleus/aethermud/stats/modifier/ShamanStatsModifier.java
index 8b7014341a96d2a4565dd932b48f22d6d1afed39..135414aba8f995d6200793603da9f26c69958527 100644
--- a/src/main/java/com/syncleus/aethermud/stats/modifier/ShamanStatsModifier.java
+++ b/src/main/java/com/syncleus/aethermud/stats/modifier/ShamanStatsModifier.java
@@ -107,7 +107,7 @@ public class ShamanStatsModifier implements StatsModifier {
         statsBuilder.setAim(newAimRating);
         statsBuilder.setWillpower(newWillpowerRating);
         statsBuilder.setAgile(newAgileRating);
-        statsBuilder.setMeleSkill(newMeleRating);
+        statsBuilder.setMeleeSkill(newMeleRating);
         statsBuilder.setCurrentHealth(baseStats.getCurrentHealth());
         statsBuilder.setCurrentMana(baseStats.getCurrentMana());
         return statsBuilder.createStats();
diff --git a/src/main/java/com/syncleus/aethermud/stats/modifier/WarriorStatsModifier.java b/src/main/java/com/syncleus/aethermud/stats/modifier/WarriorStatsModifier.java
index f84ef7a928746fb44f704677e9e53cf65296d109..ae4fb97237ea45b9b0cf302400ee6338df25a204 100644
--- a/src/main/java/com/syncleus/aethermud/stats/modifier/WarriorStatsModifier.java
+++ b/src/main/java/com/syncleus/aethermud/stats/modifier/WarriorStatsModifier.java
@@ -107,7 +107,7 @@ public class WarriorStatsModifier implements StatsModifier {
         statsBuilder.setAim(newAimRating);
         statsBuilder.setWillpower(newWillpowerRating);
         statsBuilder.setAgile(newAgileRating);
-        statsBuilder.setMeleSkill(newMeleRating);
+        statsBuilder.setMeleeSkill(newMeleRating);
         statsBuilder.setCurrentHealth(baseStats.getCurrentHealth());
         statsBuilder.setCurrentMana(baseStats.getCurrentMana());
         return statsBuilder.createStats();
diff --git a/src/main/java/com/syncleus/aethermud/stats/modifier/WizardStatsModifier.java b/src/main/java/com/syncleus/aethermud/stats/modifier/WizardStatsModifier.java
index 038d5d66140eaca4d1ce26b786236bf044d3ebbf..2acf2eb6679777221a191309b413f9b81f1c7cb1 100644
--- a/src/main/java/com/syncleus/aethermud/stats/modifier/WizardStatsModifier.java
+++ b/src/main/java/com/syncleus/aethermud/stats/modifier/WizardStatsModifier.java
@@ -108,7 +108,7 @@ public class WizardStatsModifier implements StatsModifier {
         statsBuilder.setAim(newAimRating);
         statsBuilder.setWillpower(newWillpowerRating);
         statsBuilder.setAgile(newAgileRating);
-        statsBuilder.setMeleSkill(newMeleRating);
+        statsBuilder.setMeleeSkill(newMeleRating);
         statsBuilder.setCurrentHealth(baseStats.getCurrentHealth());
         statsBuilder.setCurrentMana(baseStats.getCurrentMana());
         return statsBuilder.createStats();
diff --git a/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java b/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java
index 6309bec259e987f945d772bcc80bc35336130c02..316d7fa0f0c90fb59abd06cfdbd39a1b46acb15c 100644
--- a/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java
+++ b/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java
@@ -16,9 +16,8 @@
 package com.syncleus.aethermud.storage;
 
 
-import com.google.common.util.concurrent.Service;
 import com.syncleus.aethermud.core.GameManager;
-import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.items.Item;
 import com.syncleus.aethermud.npc.NpcSpawn;
 import com.syncleus.aethermud.storage.graphdb.model.ItemData;
 import com.syncleus.aethermud.storage.graphdb.model.NpcData;
@@ -36,7 +35,7 @@ public interface AetherMudStorage {
 
     Map<String, PlayerData> getAllPlayerMetadata();
 
-    ItemData saveItem(ItemPojo item);
+    ItemData saveItem(Item item);
 
     Optional<ItemData> getItemEntity(String itemId);
 
diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java
index b9ff5871334b05606a79d4bbe364efd614056cdc..52a388661a62e28ccde8b52354eb8354861949f9 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java
@@ -15,9 +15,8 @@
  */
 package com.syncleus.aethermud.storage.graphdb;
 
-import com.google.common.base.Function;
 import com.syncleus.aethermud.core.GameManager;
-import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.items.Item;
 import com.syncleus.aethermud.npc.NpcBuilder;
 import com.syncleus.aethermud.npc.NpcSpawn;
 import com.syncleus.aethermud.storage.AetherMudStorage;
@@ -31,7 +30,6 @@ import org.apache.tinkerpop.gremlin.structure.Graph;
 
 import java.lang.reflect.InvocationTargetException;
 import java.util.*;
-import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
 public class GraphDbAetherMudStorage implements AetherMudStorage {
@@ -76,7 +74,7 @@ public class GraphDbAetherMudStorage implements AetherMudStorage {
     }
 
     @Override
-    public ItemData saveItem(ItemPojo item) {
+    public ItemData saveItem(Item item) {
         ItemData itemData = framedGraph.addFramedVertex(ItemData.class);
         try {
             PropertyUtils.copyProperties(itemData, item);
diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/AetherMudMessageData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/AetherMudMessageData.java
index 7dbff4fa353419583fdad102748a912b534842cc..8ba9bfaad48cab304d3408606a964abd604f1b5c 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/AetherMudMessageData.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/AetherMudMessageData.java
@@ -41,7 +41,7 @@ public abstract class AetherMudMessageData extends AbstractVertexFrame {
         try {
             PropertyUtils.copyProperties(dest, src);
         } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
-            throw new IllegalStateException("Could not copy properties");
+            throw new IllegalStateException("Could not copy properties", e);
         }
     }
 
diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EffectData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EffectData.java
index c7c281ebd88a79a5d4bc741eae62c71db028c4b4..2fc2dd555fec634df103ef392bd57b5a07be5138 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EffectData.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EffectData.java
@@ -183,7 +183,7 @@ public abstract class EffectData extends AbstractInterceptingVertexFrame {
             dest.setApplyStatsOnTick(src.getApplyStatsOnTick());
             dest.setDurationStats(src.getDurationStats());
         } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
-            throw new IllegalStateException("Could not copy properties");
+            throw new IllegalStateException("Could not copy properties", e);
         }
     }
 
@@ -198,7 +198,7 @@ public abstract class EffectData extends AbstractInterceptingVertexFrame {
             PropertyUtils.copyProperties(applyStats, src.getApplyStatsOnTick());
             retVal.setApplyStatsOnTick(applyStats);
         } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
-            throw new IllegalStateException("Could not copy properties");
+            throw new IllegalStateException("Could not copy properties", e);
         }
         return retVal;
     }
diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/ItemData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/ItemData.java
index 09f481ffe5307baf731da2e22c1b55de5e2b003f..12999379158b2f8c05a2b154a08f98888a4a125b 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/ItemData.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/ItemData.java
@@ -16,10 +16,12 @@
 package com.syncleus.aethermud.storage.graphdb.model;
 
 import com.google.common.collect.Sets;
+import com.syncleus.aethermud.common.AetherMudMessage;
 import com.syncleus.aethermud.core.service.TimeTracker;
 import com.syncleus.aethermud.items.*;
+import com.syncleus.aethermud.spawner.SpawnRule;
 import com.syncleus.aethermud.stats.Stats;
-import com.syncleus.ferma.AbstractVertexFrame;
+import com.syncleus.aethermud.storage.graphdb.DataUtils;
 import com.syncleus.ferma.annotations.Adjacency;
 import com.syncleus.ferma.annotations.GraphElement;
 import com.syncleus.ferma.annotations.Property;
@@ -31,241 +33,158 @@ import java.lang.reflect.InvocationTargetException;
 import java.util.*;
 
 @GraphElement
-public abstract class ItemData extends AbstractInterceptingVertexFrame implements Item {
-    @Override
+public abstract class ItemData extends AbstractInterceptingVertexFrame {
     @Property("ValidTimeOfDays")
     public abstract List<TimeTracker.TimeOfDay> getValidTimeOfDays();
 
-    @Override
     @Property("ValidTimeOfDays")
     public abstract void setValidTimeOfDays(List<TimeTracker.TimeOfDay> validTimeOfDays);
 
-    @Override
     @Property("ValidTimeOfDays")
     public abstract void setValidTimeOfDays(Set<TimeTracker.TimeOfDay> validTimeOfDays);
 
-    @Override
     @Property("Disposable")
     public abstract boolean isDisposable();
 
-    @Override
     @Property("MaxUses")
     public abstract int getMaxUses();
 
-    @Override
     @Property("WithPlayer")
     public abstract boolean isWithPlayer();
 
-    @Override
     @Property("WithPlayer")
     public abstract void setWithPlayer(boolean isWithPlayer);
 
-    @Override
     @Property("NumberOfUses")
     public abstract int getNumberOfUses();
 
-    @Override
     @Property("NumberOfUses")
     public abstract void setNumberOfUses(int numberOfUses);
 
-    @Override
     @Property("ItemId")
     public abstract String getItemId();
 
-    @Override
     @Property("InternalItemName")
     public abstract String getInternalItemName();
 
-    @Override
     @Property("ItemName")
     public abstract String getItemName();
 
-    @Override
     @Property("ItemDescription")
     public abstract String getItemDescription();
 
-    @Override
     @Property("ItemTriggers")
     public abstract List<String> getItemTriggers();
 
-    @Override
     @Property("ItemTriggers")
     public abstract void setItemTriggers(List<String> itemTriggers);
 
-    @Override
     @Property("RestingName")
     public abstract String getRestingName();
 
-    @Override
     @Property("ItemHalfLifeTicks")
     public abstract int getItemHalfLifeTicks();
 
-    @Override
     @Property("Loot")
     public abstract Loot getLoot();
 
-    @Override
     @Property("Loot")
     public abstract void setLoot(Loot loot);
 
-    @Override
     @Property("Equipment")
     public abstract Equipment getEquipment();
 
-    @Override
     @Property("Equipment")
     public abstract void setEquipment(Equipment equipment);
 
-    @Override
     @Property("HasBeenWithPlayer")
     public abstract void setHasBeenWithPlayer(boolean hasBeenWithPlayer);
 
-    @Override
     @Property("Rarity")
     public abstract Rarity getRarity();
 
-    @Override
+    @Property("Rarity")
+    public abstract void setRarity(Rarity rarity);
+
     @Property("ValueInGold")
     public abstract int getValueInGold();
 
-    @Override
     @Property("ItemName")
     public abstract void setItemName(String itemName);
 
-    @Override
     @Property("ItemDescription")
     public abstract void setItemDescription(String itemDescription);
 
-    @Override
     @Property("InternalItemName")
     public abstract void setInternalItemName(String internalItemName);
 
-    @Override
     @Property("RestingName")
     public abstract void setRestingName(String restingName);
 
-    @Override
     @Property("ItemId")
     public abstract void setItemId(String itemId);
 
-    @Override
     @Property("ItemHalfLifeTicks")
     public abstract void setItemHalfLifeTicks(int itemHalfLifeTicks);
 
-    @Override
-    public void setRarity(Rarity rarity) {
-        this.traverse((v) -> v.property("Rarity", rarity));
-    }
-
-    @Override
     @Property("ValueInGold")
     public abstract void setValueInGold(int valueInGold);
 
-    @Override
     @Property("MaxUses")
     public abstract void setMaxUses(int maxUses);
 
-    @Override
     @Property("Disposable")
     public abstract void setDisposable(boolean disposable);
 
-    @Override
     @Property("HasBeenWithPlayer")
     public abstract boolean isHasBeenWithPlayer();
 
     @Adjacency(label = "Effect", direction = Direction.OUT)
-    public abstract EffectData addEffect(EffectData effects);
+    public abstract EffectData addEffectData(EffectData effects);
 
     @Adjacency(label = "Effect", direction = Direction.OUT)
-    public abstract void removeEffect(EffectData stats);
+    public abstract void removeEffectData(EffectData stats);
 
     @Adjacency(label = "Effect", direction = Direction.OUT)
-    public abstract <N extends EffectData> Iterator<? extends N> getEffects(Class<? extends N> type);
-
-    @Override
-    public Set<Effect> getEffects() {
-        Set<Effect> retVal = new HashSet<>();
-        Iterator<? extends EffectData> iterator = this.getEffects(EffectData.class);
-        while(iterator.hasNext()) {
-            EffectData effectData = iterator.next();
-            retVal.add(EffectData.copyEffect(effectData));
-        }
-        return Collections.unmodifiableSet(retVal);
-    }
-
-    @Override
-    public void setEffects(Set<Effect> effects) {
-        Iterator<? extends EffectData> existingAll = this.getEffects(EffectData.class);
-        if( existingAll != null ) {
-            while( existingAll.hasNext() ) {
-                EffectData existing = existingAll.next();
-                this.removeEffect(existing);
-                existing.remove();
-            }
-
-        }
+    public abstract <N extends EffectData> Iterator<? extends N> getEffectDatasIterator(Class<? extends N> type);
 
-        if( effects == null || effects.size() == 0 ) {
-            return;
-        }
+    public Set<EffectData> getEffectDatas() {
+        return Collections.unmodifiableSet(Sets.newHashSet(this.getEffectDatasIterator(EffectData.class)));
+    }
 
-        for( Effect effect : effects ) {
-            try {
-                PropertyUtils.copyProperties(this.createEffect(), effect);
-            } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
-                throw new IllegalStateException("Could not copy properties");
-            }
-        }
+    public void setEffectDatas(Set<EffectData> effects) {
+        DataUtils.setAllElements(effects, () -> this.getEffectDatasIterator(EffectData.class), effectData -> this.addEffectData(effectData), () -> {} );
     }
 
-    public EffectData createEffect() {
+    public EffectData createEffectData() {
         final EffectData effect = this.getGraph().addFramedVertex(EffectData.class);
-        this.addEffect(effect);
+        this.addEffectData(effect);
         return effect;
     }
 
     @Adjacency(label = "ItemApplyStats", direction = Direction.OUT)
-    public abstract <N extends StatsData> Iterator<? extends N> getAllItemApplyStats(Class<? extends N> type);
+    public abstract <N extends StatsData> Iterator<? extends N> getItemApplyStatDatasIterator(Class<? extends N> type);
 
-    public Stats getItemApplyStats() {
-        Iterator<? extends StatsData> allStats = this.getAllItemApplyStats(StatsData.class);
+    public StatsData getItemApplyStatData() {
+        Iterator<? extends StatsData> allStats = this.getItemApplyStatDatasIterator(StatsData.class);
         if( allStats.hasNext() )
-            return StatsData.copyStats(allStats.next());
+            return allStats.next();
         else
             return null;
     }
 
     @Adjacency(label = "ItemApplyStats", direction = Direction.OUT)
-    public abstract StatsData addStats(StatsData stats);
+    public abstract StatsData addStatData(StatsData stats);
 
     @Adjacency(label = "ItemApplyStats", direction = Direction.OUT)
-    public abstract void removeStats(StatsData stats);
+    public abstract void removeStatData(StatsData stats);
 
-    public void setItemApplyStats(Stats stats) {
-        Iterator<? extends StatsData> existingAll = this.getAllItemApplyStats(StatsData.class);
-        if( existingAll != null ) {
-            while( existingAll.hasNext() ) {
-                StatsData existing = existingAll.next();
-                this.removeStats(existing);
-                existing.remove();
-            }
-
-        }
-
-        if( stats == null ) {
-            this.createItemApplyStats();
-            return;
-        }
-
-        try {
-            PropertyUtils.copyProperties(this.createItemApplyStats(), stats);
-        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
-            throw new IllegalStateException("Could not copy properties");
-        }
+    public void setItemApplyStatData(StatsData stats) {
+        DataUtils.setAllElements(Collections.singletonList(stats), () -> this.getItemApplyStatDatasIterator(StatsData.class), statsData -> this.addStatData(statsData), () -> createItemApplyStatData() );
     }
 
-    public StatsData createItemApplyStats() {
-        if( this.getItemApplyStats() != null )
+    public StatsData createItemApplyStatData() {
+        if( this.getItemApplyStatData() != null )
             throw new IllegalStateException("Already has stats, can't create another");
         final StatsData stats = this.getGraph().addFramedVertex(StatsData.class);
         stats.setAgile(0);
@@ -286,8 +205,37 @@ public abstract class ItemData extends AbstractInterceptingVertexFrame implement
         stats.setWeaponRatingMax(0);
         stats.setWeaponRatingMin(0);
         stats.setWillpower(0);
-        this.addStats(stats);
+        this.addStatData(stats);
         return stats;
     }
 
+    public static void copyItem(ItemData dest, Item src) {
+        try {
+            PropertyUtils.copyProperties(dest, src);
+            StatsData.copyStats(dest.createItemApplyStatData(), src.getItemApplyStats());
+            for(Effect effect : src.getEffects())
+                EffectData.copyEffect(dest.createEffectData(), effect);
+        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
+            throw new IllegalStateException("Could not copy properties", e);
+        }
+    }
+
+    public static Item copyItem(ItemData src) {
+        Item retVal = new Item();
+        try {
+            PropertyUtils.copyProperties(retVal, src);
+            StatsData applyStats = src.getItemApplyStatData();
+            if( applyStats != null )
+                retVal.setItemApplyStats(StatsData.copyStats(applyStats));
+
+            Set<Effect> effects = new HashSet<>();
+            for(EffectData effect : src.getEffectDatas())
+                effects.add(EffectData.copyEffect(effect));
+            retVal.setEffects(Collections.unmodifiableSet(effects));
+
+        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
+            throw new IllegalStateException("Could not copy properties", e);
+        }
+        return retVal;
+    }
 }
diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/LootData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/LootData.java
index ff663b5e6a95385a97d0dfb9a5b6ad4295274cfe..e9ff058c8c0be2d34a30f385b8d72109256aa7ba 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/LootData.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/LootData.java
@@ -51,7 +51,7 @@ public abstract class LootData extends AbstractInterceptingVertexFrame {
         try {
             PropertyUtils.copyProperties(dest, src);
         } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
-            throw new IllegalStateException("Could not copy properties");
+            throw new IllegalStateException("Could not copy properties", e);
         }
     }
 
@@ -60,7 +60,7 @@ public abstract class LootData extends AbstractInterceptingVertexFrame {
         try {
             PropertyUtils.copyProperties(retVal, src);;
         } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
-            throw new IllegalStateException("Could not copy properties");
+            throw new IllegalStateException("Could not copy properties", e);
         }
         return retVal;
     }
diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/NpcData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/NpcData.java
index eef310fd2d856cfe33a0f6ee8c85187855ce6232..8b41374a81c584a3814fc36f780ad5c749047564 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/NpcData.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/NpcData.java
@@ -18,11 +18,9 @@ package com.syncleus.aethermud.storage.graphdb.model;
 import com.google.common.collect.Lists;
 import com.syncleus.aethermud.common.AetherMudMessage;
 import com.syncleus.aethermud.common.ColorizedTextTemplate;
-import com.syncleus.aethermud.items.Effect;
 import com.syncleus.aethermud.npc.Npc;
 import com.syncleus.aethermud.npc.Temperament;
 import com.syncleus.aethermud.spawner.SpawnRule;
-import com.syncleus.aethermud.stats.Stats;
 import com.syncleus.aethermud.storage.graphdb.DataUtils;
 import com.syncleus.aethermud.world.model.Area;
 import com.syncleus.ferma.annotations.Adjacency;
@@ -31,7 +29,6 @@ import com.syncleus.ferma.annotations.Property;
 import com.syncleus.ferma.ext.AbstractInterceptingVertexFrame;
 import org.apache.commons.beanutils.PropertyUtils;
 import org.apache.tinkerpop.gremlin.structure.Direction;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
 
 import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
@@ -68,8 +65,8 @@ public abstract class NpcData extends AbstractInterceptingVertexFrame {
     @Adjacency(label = "spawnRule", direction = Direction.OUT)
     public abstract <N extends SpawnRuleData> Iterator<? extends N> getSpawnRulesDataIterator(Class<? extends N> type);
 
-    public List<SpawnRuleData> getSpawnRulesData() {
-        return Lists.newArrayList(this.getSpawnRulesDataIterator(SpawnRuleData.class));
+    public List<SpawnRuleData> getSpawnRuleDatas() {
+        return Collections.unmodifiableList(Lists.newArrayList(this.getSpawnRulesDataIterator(SpawnRuleData.class)));
     }
 
     @Adjacency(label = "spawnRule", direction = Direction.OUT)
@@ -79,7 +76,7 @@ public abstract class NpcData extends AbstractInterceptingVertexFrame {
     public abstract void removeSpawnRuleData(SpawnRuleData spawnRule);
 
     public void setSpawnRulesDatas(List<SpawnRuleData> spawnRules) {
-        DataUtils.setAllElements(spawnRules, () -> this.getSpawnRulesDataIterator(SpawnRuleData.class), ruleData -> this.addSpawnRuleData(ruleData), () -> this.createSpawnRuleData() );
+        DataUtils.setAllElements(spawnRules, () -> this.getSpawnRulesDataIterator(SpawnRuleData.class), ruleData -> this.addSpawnRuleData(ruleData), () -> {} );
     }
 
     public SpawnRuleData createSpawnRuleData() {
@@ -298,7 +295,7 @@ public abstract class NpcData extends AbstractInterceptingVertexFrame {
             for(AetherMudMessage message : src.getIdleMessages())
                 AetherMudMessageData.copyAetherMudMessage(dest.createIdleMessageData(), message);
         } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
-            throw new IllegalStateException("Could not copy properties");
+            throw new IllegalStateException("Could not copy properties", e);
         }
     }
 
@@ -310,7 +307,7 @@ public abstract class NpcData extends AbstractInterceptingVertexFrame {
             retVal.setStats(StatsData.copyStats(src.getStatsData()));
 
             List<SpawnRule> rules = new ArrayList<>();
-            for(SpawnRuleData spawnRuleData : src.getSpawnRulesData())
+            for(SpawnRuleData spawnRuleData : src.getSpawnRuleDatas())
                 rules.add(SpawnRuleData.copySpawnRule(spawnRuleData));
             retVal.setSpawnRules(Collections.unmodifiableList(rules));
 
@@ -334,7 +331,7 @@ public abstract class NpcData extends AbstractInterceptingVertexFrame {
                 idleMessages.add(AetherMudMessageData.copyAetherMudMessage(message));
             retVal.setIdleMessages(Collections.unmodifiableList(idleMessages));
         } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
-            throw new IllegalStateException("Could not copy properties");
+            throw new IllegalStateException("Could not copy properties", e);
         }
         return retVal;
     }
diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/SpawnRuleData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/SpawnRuleData.java
index 62dda8fa87f94b8fce757528637acf3e63d2919a..bacbebc7a1426e50501cb1b58a38aaca2d0091f4 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/SpawnRuleData.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/SpawnRuleData.java
@@ -62,7 +62,7 @@ public abstract class SpawnRuleData extends AbstractInterceptingVertexFrame {
         try {
             PropertyUtils.copyProperties(dest, src);
         } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
-            throw new IllegalStateException("Could not copy properties");
+            throw new IllegalStateException("Could not copy properties", e);
         }
     }
 
@@ -71,7 +71,7 @@ public abstract class SpawnRuleData extends AbstractInterceptingVertexFrame {
         try {
             PropertyUtils.copyProperties(retVal, src);;
         } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
-            throw new IllegalStateException("Could not copy properties");
+            throw new IllegalStateException("Could not copy properties", e);
         }
         return retVal;
     }
diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/StatsData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/StatsData.java
index 4bc3bfc14f196ec147d57019b6c74a3212469630..e1cc61ac31bbbecb91e60ceda621febbfb63a935 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/StatsData.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/StatsData.java
@@ -75,11 +75,11 @@ public abstract class StatsData extends AbstractInterceptingVertexFrame {
     @Property("armorRating")
     public abstract void setArmorRating(Integer armorRating);
 
-    @Property("meleSkill")
+    @Property("meleeSkill")
     public abstract Integer getMeleeSkill();
 
-    @Property("meleSkill")
-    public abstract void setMeleeSkill(Integer meleSkill);
+    @Property("meleeSkill")
+    public abstract void setMeleeSkill(Integer meleeSkill);
 
     @Property("currentHealth")
     public abstract Integer getCurrentHealth();
@@ -139,7 +139,7 @@ public abstract class StatsData extends AbstractInterceptingVertexFrame {
         try {
             PropertyUtils.copyProperties(dest, src);
         } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
-            throw new IllegalStateException("Could not copy properties");
+            throw new IllegalStateException("Could not copy properties", e);
         }
     }
 
@@ -148,7 +148,7 @@ public abstract class StatsData extends AbstractInterceptingVertexFrame {
         try {
             PropertyUtils.copyProperties(retVal, src);
         } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
-            throw new IllegalStateException("Could not copy properties");
+            throw new IllegalStateException("Could not copy properties", e);
         }
         return retVal;
     }
diff --git a/src/main/java/com/syncleus/aethermud/world/model/Room.java b/src/main/java/com/syncleus/aethermud/world/model/Room.java
index 9ee91047ddf7f0d166e79e2cb3a428935292760b..54e6f8c16f78dd6b6bf72bb2e369576acf22ff35 100644
--- a/src/main/java/com/syncleus/aethermud/world/model/Room.java
+++ b/src/main/java/com/syncleus/aethermud/world/model/Room.java
@@ -19,7 +19,7 @@ import com.syncleus.aethermud.core.GameManager;
 import com.syncleus.aethermud.core.service.TimeTracker;
 import com.syncleus.aethermud.entity.AetherMudEntity;
 import com.syncleus.aethermud.items.Forage;
-import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.items.Item;
 import com.syncleus.aethermud.merchant.Merchant;
 import com.syncleus.aethermud.npc.NpcSpawn;
 import com.syncleus.aethermud.player.Player;
@@ -290,12 +290,12 @@ public abstract class Room extends AetherMudEntity {
     @Override
     public void run() {
         for (String itemId : itemIds) {
-            Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
+            Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
             if (!itemOptional.isPresent()) {
                 removePresentItem(itemId);
                 continue;
             }
-            ItemPojo itemEntity = itemOptional.get();
+            Item itemEntity = itemOptional.get();
             if (itemEntity.isHasBeenWithPlayer()) {
                 continue;
             }
diff --git a/src/test/java/com/syncleus/aethermud/player/combatsimuation/CombatSimulationDetails.java b/src/test/java/com/syncleus/aethermud/player/combatsimuation/CombatSimulationDetails.java
index 07591e44de707d9378875c7ca4c906dad4df71d5..194fdeee94980bd5ee105e3e5b364f52503671a5 100644
--- a/src/test/java/com/syncleus/aethermud/player/combatsimuation/CombatSimulationDetails.java
+++ b/src/test/java/com/syncleus/aethermud/player/combatsimuation/CombatSimulationDetails.java
@@ -15,7 +15,7 @@
  */
 package com.syncleus.aethermud.player.combatsimuation;
 
-import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.items.Item;
 import com.syncleus.aethermud.npc.NpcSpawn;
 
 import java.util.Set;
@@ -24,10 +24,10 @@ public class CombatSimulationDetails {
 
     private final int level;
     private final int totalIterations;
-    private final Set<ItemPojo> equipmentSet;
+    private final Set<Item> equipmentSet;
     private final NpcSpawn npcSpawn;
 
-    public CombatSimulationDetails(int level, Set<ItemPojo> equipmentSet, NpcSpawn npcSpawn) {
+    public CombatSimulationDetails(int level, Set<Item> equipmentSet, NpcSpawn npcSpawn) {
         this.level = level;
         this.totalIterations = 1000;
         this.equipmentSet = equipmentSet;
@@ -46,7 +46,7 @@ public class CombatSimulationDetails {
         return npcSpawn;
     }
 
-    public Set<ItemPojo> getEquipmentSet() {
+    public Set<Item> getEquipmentSet() {
         return equipmentSet;
     }
 }
diff --git a/src/test/java/com/syncleus/aethermud/player/combatsimuation/NpcTestHarness.java b/src/test/java/com/syncleus/aethermud/player/combatsimuation/NpcTestHarness.java
index ec22d581407094c403528697a288c1774d930c6c..fd4c6fb5b3aaa9b719b2d3f2c662004b252c7d5a 100644
--- a/src/test/java/com/syncleus/aethermud/player/combatsimuation/NpcTestHarness.java
+++ b/src/test/java/com/syncleus/aethermud/player/combatsimuation/NpcTestHarness.java
@@ -21,7 +21,7 @@ import com.syncleus.aethermud.configuration.AetherMudConfiguration;
 import com.syncleus.aethermud.core.GameManager;
 import com.syncleus.aethermud.core.SessionManager;
 import com.syncleus.aethermud.entity.EntityManager;
-import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.items.Item;
 import com.syncleus.aethermud.npc.NpcSpawn;
 import com.syncleus.aethermud.npc.NpcBuilder;
 import com.syncleus.aethermud.player.*;
@@ -31,20 +31,15 @@ import com.syncleus.aethermud.stats.DefaultStats;
 import com.syncleus.aethermud.stats.Levels;
 import com.syncleus.aethermud.stats.experience.Experience;
 import com.syncleus.aethermud.storage.WorldStorage;
-import com.syncleus.aethermud.storage.graphdb.GraphDbAetherMudStorage;
 import com.syncleus.aethermud.storage.graphdb.GraphStorageFactory;
 import com.syncleus.aethermud.storage.graphdb.model.PlayerData;
 import com.syncleus.aethermud.world.MapsManager;
 import com.syncleus.aethermud.world.RoomManager;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
-import com.syncleus.ferma.DelegatingFramedGraph;
-import com.syncleus.ferma.WrappedFramedGraph;
 import org.apache.commons.beanutils.PropertyUtils;
 import org.apache.commons.configuration.MapConfiguration;
 import org.apache.http.impl.client.HttpClients;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
 import org.jboss.netty.channel.Channel;
 import org.junit.Assert;
 import org.junit.Before;
@@ -142,18 +137,18 @@ public class NpcTestHarness {
         }
     }
 
-    private Set<ItemPojo> getEarlyLevelArmorSet() {
+    private Set<Item> getEarlyLevelArmorSet() {
         //  return Sets.newHashSet(ItemType.BERSERKER_BATON.create(), ItemType.BERSEKER_BOOTS.create(), ItemType.BERSEKER_SHORTS.create());
         return Sets.newConcurrentHashSet();
     }
 
-    private Set<ItemPojo> getMidLevelArmorSet() {
-        Set<ItemPojo> armorSet = getEarlyLevelArmorSet();
+    private Set<Item> getMidLevelArmorSet() {
+        Set<Item> armorSet = getEarlyLevelArmorSet();
         //  armorSet.addAll(Sets.newHashSet(ItemType.BERSERKER_BRACERS.create(), ItemType.BERSERKER_CHEST.create()));
         return armorSet;
     }
 
-    private void processRunAndVerify(NpcSpawn testNpcSpawn, int desiredLevel, Set<ItemPojo> equipment, float winPctMax, float winPctMin, int maxRounds, int minRounds, int maxAvgGold, int minAvgGold) throws Exception {
+    private void processRunAndVerify(NpcSpawn testNpcSpawn, int desiredLevel, Set<Item> equipment, float winPctMax, float winPctMin, int maxRounds, int minRounds, int maxAvgGold, int minAvgGold) throws Exception {
         CombatSimulationDetails combatSimulationDetailsLevel = new CombatSimulationDetails(desiredLevel, equipment, testNpcSpawn);
         CombatSimulationResult combatSimulationResultLevel = executeCombat(combatSimulationDetailsLevel);
         printCombatResults(combatSimulationDetailsLevel, combatSimulationResultLevel);
@@ -187,7 +182,7 @@ public class NpcTestHarness {
                 playerWins++;
                 int gold = (int) gameManager.getLootManager().lootGoldAmountReturn(npcSpawn.getLoot());
                 totalGold += gold;
-                Set<ItemPojo> items = gameManager.getLootManager().lootItemsReturn(npcSpawn.getLoot());
+                Set<Item> items = gameManager.getLootManager().lootItemsReturn(npcSpawn.getLoot());
                 items.forEach(item -> {
                     if (!drops.containsKey(item.getItemName())) {
                         drops.put(item.getItemName(), new AtomicInteger(1));
@@ -259,7 +254,7 @@ public class NpcTestHarness {
         return player;
     }
 
-    private void equipArmor(Player player, Set<ItemPojo> equipment) {
+    private void equipArmor(Player player, Set<Item> equipment) {
         equipment.forEach(item -> {
             entityManager.saveItem(item);
             gameManager.acquireItem(player, item.getItemId());