From 095f48bd1afb73f24417818516a2bc53b0721d90 Mon Sep 17 00:00:00 2001
From: Jeffrey Phillips Freeman <jeffrey.freeman@syncleus.com>
Date: Sat, 2 Sep 2017 22:08:25 -0400
Subject: [PATCH] fix: cooldowns are now being properly removed

---
 .../java/com/syncleus/aethermud/Main.java     |   9 +-
 .../command/commands/DropCommand.java         |   4 +-
 .../command/commands/EquipCommand.java        |   6 +-
 .../command/commands/InventoryCommand.java    |   4 +-
 .../command/commands/LootCommand.java         |  10 +-
 .../command/commands/PickUpCommand.java       |   4 +-
 .../command/commands/ShowCommand.java         |   4 +-
 .../command/commands/UnequipCommand.java      |   6 +-
 .../command/commands/UseCommand.java          |   4 +-
 .../syncleus/aethermud/core/GameManager.java  |  16 +-
 .../aethermud/entity/EntityManager.java       |  10 +-
 .../aethermud/items/ForageManager.java        |   3 +-
 .../com/syncleus/aethermud/items/Item.java    | 248 +++++----------
 .../syncleus/aethermud/items/ItemBuilder.java |   4 +-
 .../aethermud/items/ItemDecayManager.java     |   6 +-
 .../syncleus/aethermud/items/ItemPojo.java    | 287 ++++++++++++++++++
 .../aethermud/items/ItemUseAction.java        |   4 +-
 .../aethermud/items/ItemUseHandler.java       |   4 +-
 .../syncleus/aethermud/items/LootManager.java |   6 +-
 .../items/use/DefaultApplyEffectsStats.java   |   5 +-
 .../items/use/DirtyBombUseAction.java         |   4 +-
 .../use/LightningSpellBookUseAction.java      |   6 +-
 .../items/use/ResetAllEffectsUseAction.java   |   4 +-
 .../items/use/StickOfJusticeUseAction.java    |   6 +-
 .../merchant/MerchantCommandHandler.java      |  14 +-
 .../aethermud/merchant/MerchantManager.java   |   4 +-
 .../merchant/lockers/GetCommand.java          |   6 +-
 .../merchant/lockers/PutCommand.java          |   4 +-
 .../com/syncleus/aethermud/npc/NpcSpawn.java  |  13 +-
 .../com/syncleus/aethermud/player/Player.java |  67 ++--
 .../aethermud/player/PlayerManagement.java    |  12 +-
 .../aethermud/spawner/ItemSpawner.java        |  12 +-
 .../aethermud/storage/AetherMudStorage.java   |  13 +-
 .../aethermud/storage/ItemSerializer.java     |  12 +-
 .../graphdb/GraphDbAetherMudStorage.java      |  80 ++---
 .../aethermud/storage/graphdb/ItemData.java   | 186 ++++++++++++
 .../aethermud/storage/graphdb/PlayerData.java |   7 +-
 .../syncleus/aethermud/world/model/Room.java  |   6 +-
 .../aethermud/player/PlayerManagerTest.java   |   3 +-
 .../CombatSimulationDetails.java              |   8 +-
 .../combatsimuation/NpcTestHarness.java       |  17 +-
 41 files changed, 727 insertions(+), 401 deletions(-)
 create mode 100644 src/main/java/com/syncleus/aethermud/items/ItemPojo.java
 create mode 100644 src/main/java/com/syncleus/aethermud/storage/graphdb/ItemData.java

diff --git a/src/main/java/com/syncleus/aethermud/Main.java b/src/main/java/com/syncleus/aethermud/Main.java
index 0725957f..0cf2f7ac 100644
--- a/src/main/java/com/syncleus/aethermud/Main.java
+++ b/src/main/java/com/syncleus/aethermud/Main.java
@@ -61,7 +61,7 @@ public class Main {
 
     final public static Set<Character> vowels = new HashSet<Character>(Arrays.asList('a', 'e', 'i', 'o', 'u'));
     public static final String DEFAULT_GRAPH_DB_FILE = "aethermud-graph.json";
-    public static final Set<Class<?>> FRAMED_TYPES = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(new Class<?>[]{PlayerData.class, NpcData.class, StatsData.class})));
+    public static final Set<Class<?>> FRAMED_TYPES = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(new Class<?>[]{PlayerData.class, NpcData.class, StatsData.class, ItemData.class})));
 
     public static String getCreeperVersion() {
 
@@ -93,11 +93,6 @@ public class Main {
 
         Files.isDirectory().apply(new File("world/"));
 
-        DB db = DBMaker.fileDB(new File("world/" + aetherMudConfiguration.databaseFileName))
-                .transactionEnable()
-                .closeOnJvmShutdown()
-                .make();
-
         Graph graph = TinkerGraph.open();
         File f = new File(DEFAULT_GRAPH_DB_FILE);
         if(f.exists() && !f.isDirectory()) {
@@ -109,7 +104,7 @@ public class Main {
         }
         WrappedFramedGraph<Graph> framedGraph = new DelegatingFramedGraph(graph, FRAMED_TYPES);
 
-        GraphDbAetherMudStorage graphStorage = new GraphDbAetherMudStorage(db, framedGraph);
+        GraphDbAetherMudStorage graphStorage = new GraphDbAetherMudStorage(framedGraph);
         graphStorage.startAsync();
         graphStorage.awaitRunning();
 
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 1e382f17..0c039644 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.Item;
+import com.syncleus.aethermud.items.ItemPojo;
 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 (Item item : player.getInventory()) {
+            for (ItemPojo 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 19ed11e6..ea73fb37 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.Item;
+import com.syncleus.aethermud.items.ItemPojo;
 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<Item> inventory = player.getInventory();
+            List<ItemPojo> inventory = player.getInventory();
             if (inventory != null) {
-                for (Item item : inventory) {
+                for (ItemPojo 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 6cc9d39e..9e86eba5 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.Item;
+import com.syncleus.aethermud.items.ItemPojo;
 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<Item> inventory = player.getInventory();
+            List<ItemPojo> 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 e33e6ece..84855b3f 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.Item;
+import com.syncleus.aethermud.items.ItemPojo;
 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 (Item item : player.getInventory()) {
-                    if (item.getInternalItemName().equals(Item.CORPSE_INTENAL_NAME)) {
+                for (ItemPojo item : player.getInventory()) {
+                    if (item.getInternalItemName().equals(ItemPojo.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<Item> items = lootManager.lootItemsReturn(loot);
-                            for (Item i: items) {
+                            Set<ItemPojo> items = lootManager.lootItemsReturn(loot);
+                            for (ItemPojo 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 0475bfd8..f70bb59e 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.Item;
+import com.syncleus.aethermud.items.ItemPojo;
 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<Item> itemEntityOptional = entityManager.getItemEntity(next);
+                Optional<ItemPojo> 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 4324607d..666d746f 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.Item;
+import com.syncleus.aethermud.items.ItemPojo;
 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 (Item next : player.getInventory()) {
+            for (ItemPojo 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 56dbe5df..042bea43 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.Item;
+import com.syncleus.aethermud.items.ItemPojo;
 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<Item> equipment = player.getEquipment();
-            for (Item item : equipment) {
+            Set<ItemPojo> equipment = player.getEquipment();
+            for (ItemPojo 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 882d53d7..06361512 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.Item;
+import com.syncleus.aethermud.items.ItemPojo;
 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<Item> inventoryItemOptional = player.getInventoryItem(useItemOn.getItem());
+            Optional<ItemPojo> 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 894fcc4c..6b7188fe 100644
--- a/src/main/java/com/syncleus/aethermud/core/GameManager.java
+++ b/src/main/java/com/syncleus/aethermud/core/GameManager.java
@@ -351,12 +351,12 @@ public class GameManager {
         }
 
         for (String itemId : playerCurrentRoom.getItemIds()) {
-            Optional<Item> itemOptional = entityManager.getItemEntity(itemId);
+            Optional<ItemPojo> itemOptional = entityManager.getItemEntity(itemId);
             if (!itemOptional.isPresent()) {
                 playerCurrentRoom.removePresentItem(itemId);
                 continue;
             }
-            Item item = itemOptional.get();
+            ItemPojo item = itemOptional.get();
             sb.append("   ").append(item.getRestingName()).append("\r\n");
         }
 
@@ -473,11 +473,11 @@ public class GameManager {
     }
 
     public void placeItemInRoom(Integer roomId, String itemId) {
-        Optional<Item> itemOptional = entityManager.getItemEntity(itemId);
+        Optional<ItemPojo> itemOptional = entityManager.getItemEntity(itemId);
         if (!itemOptional.isPresent()) {
             return;
         }
-        Item item = itemOptional.get();
+        ItemPojo item = itemOptional.get();
         roomManager.getRoom(roomId).addPresentItem(item.getItemId());
     }
 
@@ -502,21 +502,21 @@ public class GameManager {
         synchronized (interner.intern(itemId)) {
             Stats playerStatsWithEquipmentAndLevel = player.getPlayerStatsWithEquipmentAndLevel();
             if (player.getInventory().size() < playerStatsWithEquipmentAndLevel.getInventorySize()) {
-                Optional<Item> itemOptional = entityManager.getItemEntity(itemId);
+                Optional<ItemPojo> itemOptional = entityManager.getItemEntity(itemId);
                 if (!itemOptional.isPresent()) {
                     return false;
                 }
-                Item itemEntity = itemOptional.get();
+                ItemPojo itemEntity = itemOptional.get();
                 itemEntity.setWithPlayer(true);
                 player.addInventoryId(itemId);
                 entityManager.saveItem(itemEntity);
                 return true;
             } else {
-                Optional<Item> itemOptional = entityManager.getItemEntity(itemId);
+                Optional<ItemPojo> itemOptional = entityManager.getItemEntity(itemId);
                 if (!itemOptional.isPresent()) {
                     return false;
                 }
-                Item itemEntity = itemOptional.get();
+                ItemPojo 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 870ad518..ce252743 100644
--- a/src/main/java/com/syncleus/aethermud/entity/EntityManager.java
+++ b/src/main/java/com/syncleus/aethermud/entity/EntityManager.java
@@ -18,11 +18,13 @@ package com.syncleus.aethermud.entity;
 import com.syncleus.aethermud.Main;
 import com.syncleus.aethermud.core.SentryManager;
 import com.syncleus.aethermud.items.Item;
+import com.syncleus.aethermud.items.ItemPojo;
 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.ItemData;
 import com.syncleus.aethermud.world.RoomManager;
 import com.syncleus.aethermud.world.model.Room;
 import org.apache.log4j.Logger;
@@ -78,11 +80,11 @@ public class EntityManager {
         }
     }
 
-    public void saveItem(Item item) {
+    public void saveItem(ItemPojo item) {
         aetherMudStorage.saveItemEntity(item);
     }
 
-    public void removeItem(Item item) {
+    public void removeItem(ItemPojo item) {
         aetherMudStorage.removeItem(item.getItemId());
     }
 
@@ -90,8 +92,8 @@ public class EntityManager {
         aetherMudStorage.removeItem(itemId);
     }
 
-    public Optional<Item> getItemEntity(String itemId) {
-        Optional<Item> item = aetherMudStorage.getItemEntity(itemId);
+    public Optional<ItemPojo> getItemEntity(String itemId) {
+        Optional<ItemData> item = aetherMudStorage.getItemEntity(itemId);
         return item.map(itemName -> new ItemBuilder().from(itemName).create());
     }
 
diff --git a/src/main/java/com/syncleus/aethermud/items/ForageManager.java b/src/main/java/com/syncleus/aethermud/items/ForageManager.java
index 1d6a30b7..74d8e74e 100644
--- a/src/main/java/com/syncleus/aethermud/items/ForageManager.java
+++ b/src/main/java/com/syncleus/aethermud/items/ForageManager.java
@@ -16,7 +16,6 @@
 package com.syncleus.aethermud.items;
 
 import com.syncleus.aethermud.core.GameManager;
-import com.syncleus.aethermud.player.CoolDownPojo;
 import com.syncleus.aethermud.player.CoolDownType;
 import com.syncleus.aethermud.player.Player;
 import com.syncleus.aethermud.server.communication.Color;
@@ -93,7 +92,7 @@ public class ForageManager {
                     totalForageXp += forage.getForageExperience();
                     for (long i = 0; i < numberToHarvest; i++) {
                         countOfForagesFound++;
-                        Item item = new ItemBuilder().from(itemMetadata).create();
+                        ItemPojo 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 bc109e20..6e3e73ea 100644
--- a/src/main/java/com/syncleus/aethermud/items/Item.java
+++ b/src/main/java/com/syncleus/aethermud/items/Item.java
@@ -15,180 +15,86 @@
  */
 package com.syncleus.aethermud.items;
 
-
 import com.syncleus.aethermud.core.service.TimeTracker;
 import com.syncleus.aethermud.stats.Stats;
-import com.syncleus.aethermud.storage.graphdb.StatsData;
-import com.google.common.collect.Lists;
 
-import java.io.Serializable;
 import java.util.List;
 import java.util.Set;
-import java.util.UUID;
-
-public class Item implements Serializable {
-
-    private final String itemName;
-    private final String itemDescription;
-    private final String internalItemName;
-    private final List<String> itemTriggers;
-    private final String restingName;
-    private final String itemId;
-    private int numberOfUses;
-    private boolean isWithPlayer;
-    private final Loot loot;
-    private final int itemHalfLifeTicks;
-    private Equipment equipment;
-    private final Rarity rarity;
-    private final int valueInGold;
-    private Set<Effect> effects;
-    private boolean hasBeenWithPlayer;
-    private final int maxUses;
-    private final boolean isDisposable;
-    private Set<TimeTracker.TimeOfDay> validTimeOfDays;
-    private final Stats itemApplyStats;
-
-    public static final String CORPSE_INTENAL_NAME = "corpse";
-
-    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;
-        this.itemApplyStats = itemApplyStats;
-    }
-
-    public Stats getItemApplyStats() {
-        return itemApplyStats;
-    }
-
-    public Set<TimeTracker.TimeOfDay> getValidTimeOfDays() {
-        return validTimeOfDays;
-    }
-
-    public boolean isDisposable() {
-        return isDisposable;
-    }
-
-    public int getMaxUses() {
-        return maxUses;
-    }
-
-    public boolean isWithPlayer() {
-        return isWithPlayer;
-    }
-
-    public void setWithPlayer(boolean isWithPlayer) {
-        if (isWithPlayer) {
-            setHasBeenWithPlayer();
-        }
-        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 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 setHasBeenWithPlayer() {
-        hasBeenWithPlayer = true;
-    }
-
-    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;
-
-    }
+
+public interface Item {
+    Stats getItemApplyStats();
+
+    Set<TimeTracker.TimeOfDay> getValidTimeOfDays();
+
+    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();
+
+    String getRestingName();
+
+    int getItemHalfLifeTicks();
+
+    Loot getLoot();
+
+    void setEquipment(Equipment equipment);
+
+    void setHasBeenWithPlayer(boolean hasBeenWithPlayer);
+
+    void setValidTimeOfDays(Set<TimeTracker.TimeOfDay> validTimeOfDays);
+
+    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 setItemTriggers(List<String> itemTriggers);
+
+    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();
 }
diff --git a/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java b/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java
index ef1e3d4b..070c943c 100644
--- a/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java
+++ b/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java
@@ -189,8 +189,8 @@ public class ItemBuilder {
         return this;
     }
 
-    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);
+    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);
     }
 
 
diff --git a/src/main/java/com/syncleus/aethermud/items/ItemDecayManager.java b/src/main/java/com/syncleus/aethermud/items/ItemDecayManager.java
index e4a46875..afdc4468 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(Item item) {
+    public void addItem(ItemPojo 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<Item> itemOptional = entityManager.getItemEntity(next.getKey());
+                    Optional<ItemPojo> itemOptional = entityManager.getItemEntity(next.getKey());
                     if (!itemOptional.isPresent()) {
                         removeItemFromDecayManager(next.getKey());
                         continue;
                     }
-                    Item item = itemOptional.get();
+                    ItemPojo 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
new file mode 100644
index 00000000..aa79826b
--- /dev/null
+++ b/src/main/java/com/syncleus/aethermud/items/ItemPojo.java
@@ -0,0 +1,287 @@
+/**
+ * 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 Set<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;
+        this.itemApplyStats = itemApplyStats;
+    }
+
+    @Override
+    public Stats getItemApplyStats() {
+        return itemApplyStats;
+    }
+
+    @Override
+    public Set<TimeTracker.TimeOfDay> getValidTimeOfDays() {
+        return 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 void setValidTimeOfDays(Set<TimeTracker.TimeOfDay> validTimeOfDays) {
+        this.validTimeOfDays = validTimeOfDays;
+    }
+
+    @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 ec3ebe0e..0877b9d6 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, Item item, UseCommand.UseItemOn useItemOn);
+    void executeAction(GameManager gameManager, Player player, ItemPojo item, UseCommand.UseItemOn useItemOn);
 
-    void postExecuteAction(GameManager gameManager, Player player, Item item);
+    void postExecuteAction(GameManager gameManager, Player player, ItemPojo 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 de09eaa8..00d95a2f 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, Item item, UseCommand.UseItemOn useItemOn) {
+    public void handle(Player player, ItemPojo 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(Item item) {
+    public static void incrementUses(ItemPojo 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 ac9705af..d2420296 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<Item> lootItemsReturn(Loot loot) {
-        Set<Item> lootItems = Sets.newHashSet();
+    public Set<ItemPojo> lootItemsReturn(Loot loot) {
+        Set<ItemPojo> 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())) {
-                Item i = new ItemBuilder().from(itemMetadata).create();
+                ItemPojo 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 b514f87c..5062ed72 100644
--- a/src/main/java/com/syncleus/aethermud/items/use/DefaultApplyEffectsStats.java
+++ b/src/main/java/com/syncleus/aethermud/items/use/DefaultApplyEffectsStats.java
@@ -20,7 +20,6 @@ import com.syncleus.aethermud.core.GameManager;
 import com.syncleus.aethermud.items.*;
 import com.syncleus.aethermud.player.Player;
 import com.syncleus.aethermud.stats.Stats;
-import com.syncleus.aethermud.storage.graphdb.StatsData;
 import org.apache.log4j.Logger;
 
 import java.util.Set;
@@ -44,7 +43,7 @@ public class DefaultApplyEffectsStats implements ItemUseAction {
     }
 
     @Override
-    public void executeAction(GameManager gameManager, Player player, Item item, UseCommand.UseItemOn useItemOn) {
+    public void executeAction(GameManager gameManager, Player player, ItemPojo item, UseCommand.UseItemOn useItemOn) {
         String playerName = player.getPlayerName();
 
         gameManager.writeToPlayerCurrentRoom(player.getPlayerId(), playerName + " uses " + item.getItemName() + ".\r\n");
@@ -61,7 +60,7 @@ public class DefaultApplyEffectsStats implements ItemUseAction {
     }
 
     @Override
-    public void postExecuteAction(GameManager gameManager, Player player, Item item) {
+    public void postExecuteAction(GameManager gameManager, Player player, ItemPojo 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 9ce835a8..f70f2e0c 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, Item item, UseCommand.UseItemOn useItemOn) {
+    public void executeAction(GameManager gameManager, Player player, ItemPojo 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, Item item) {
+    public void postExecuteAction(GameManager gameManager, Player player, ItemPojo 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 614692c8..430a6f65 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.Item;
+import com.syncleus.aethermud.items.ItemPojo;
 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, Item item, UseCommand.UseItemOn useItemOn) {
+    public void executeAction(GameManager gameManager, Player player, ItemPojo 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, Item item) {
+    public void postExecuteAction(GameManager gameManager, Player player, ItemPojo 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 e5fe47c0..3530b2db 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, Item item, UseCommand.UseItemOn useItemOn) {
+    public void executeAction(GameManager gameManager, Player player, ItemPojo 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, Item item) {
+    public void postExecuteAction(GameManager gameManager, Player player, ItemPojo 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 de9251ab..45efbe1b 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.Item;
+import com.syncleus.aethermud.items.ItemPojo;
 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, Item item, UseCommand.UseItemOn useItemOn) {
+    public void executeAction(GameManager gameManager, Player player, ItemPojo 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, Item item) {
+    public void postExecuteAction(GameManager gameManager, Player player, ItemPojo 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 f2bdf84c..47f6ae88 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.Item;
+import com.syncleus.aethermud.items.ItemPojo;
 import com.syncleus.aethermud.player.Player;
 import com.syncleus.aethermud.server.model.CreeperSession;
 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);
-                        Item item = inventoryItemForSale.getItem();
+                        ItemPojo 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<Item> inventory = player.getInventory();
+        List<ItemPojo> inventory = player.getInventory();
         int inv = 1;
-        for (Item itemEntity : inventory) {
+        for (ItemPojo 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 Item item;
+        private final ItemPojo item;
         private final Integer cost;
 
-        public InventoryItemForSale(Integer cost, Item item) {
+        public InventoryItemForSale(Integer cost, ItemPojo item) {
             this.cost = cost;
             this.item = item;
         }
@@ -162,7 +162,7 @@ public class MerchantCommandHandler extends SimpleChannelUpstreamHandler {
             return cost;
         }
 
-        public Item getItem() {
+        public ItemPojo 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 88abba2c..ffba3520 100644
--- a/src/main/java/com/syncleus/aethermud/merchant/MerchantManager.java
+++ b/src/main/java/com/syncleus/aethermud/merchant/MerchantManager.java
@@ -19,7 +19,7 @@ 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.Item;
+import com.syncleus.aethermud.items.ItemPojo;
 import com.syncleus.aethermud.items.ItemBuilder;
 import com.syncleus.aethermud.items.ItemMetadata;
 import com.syncleus.aethermud.player.Player;
@@ -65,7 +65,7 @@ public class MerchantManager {
                     PlayerData playerData = playerMetadataOptional.get();
                     long availableGold = playerData.getGold();
                     if (availableGold >= price) {
-                        Item item = new ItemBuilder().from(itemMetadata).create();
+                        ItemPojo 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 073e500c..fa034376 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.Item;
+import com.syncleus.aethermud.items.ItemPojo;
 import com.syncleus.aethermud.core.GameManager;
 import com.syncleus.aethermud.storage.graphdb.PlayerData;
 import com.google.common.base.Joiner;
@@ -48,11 +48,11 @@ public class GetCommand extends LockerCommand {
             }
             PlayerData playerData = playerMetadataOptional.get();
             for (String entityId: playerData.getLockerInventory()) {
-                Optional<Item> itemEntityOptional = gameManager.getEntityManager().getItemEntity(entityId);
+                Optional<ItemPojo> itemEntityOptional = gameManager.getEntityManager().getItemEntity(entityId);
                 if (!itemEntityOptional.isPresent()) {
                     continue;
                 }
-                Item itemEntity = itemEntityOptional.get();
+                ItemPojo 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 fac19012..2db8730d 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.Item;
+import com.syncleus.aethermud.items.ItemPojo;
 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 (Item item : player.getInventory()) {
+            for (ItemPojo 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 781e47c2..098aeb9e 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.Item;
+import com.syncleus.aethermud.items.ItemPojo;
 import com.syncleus.aethermud.items.Loot;
 import com.syncleus.aethermud.player.CoolDownPojo;
 import com.syncleus.aethermud.player.CoolDownType;
@@ -224,6 +224,7 @@ public class NpcSpawn extends AetherMudEntity {
                 }
             }
         } catch (Exception e) {
+            e.printStackTrace();
             SentryManager.logSentry(this.getClass(), e, "Problem processing NPC Stat Change!");
         }
     }
@@ -274,30 +275,22 @@ public class NpcSpawn extends AetherMudEntity {
 
 
     private void killNpc(Player player) {
-        System.out.println("killed");
         isAlive.set(false);
         player.removeActiveAlertStatus(this);
         Map<String, Double> damagePercents;
-        Item corpse = Item.createCorpseItem(getName(), getLoot());
+        ItemPojo corpse = ItemPojo.createCorpseItem(getName(), getLoot());
         if (!player.isActive(CoolDownType.DEATH)) {
             gameManager.writeToPlayerCurrentRoom(player.getPlayerId(), getDieMessage() + "\r\n");
         }
-        System.out.println("more");
         damagePercents = gameManager.processExperience(this, getCurrentRoom());
-        System.out.println("more.");
         gameManager.getEntityManager().saveItem(corpse);
-        System.out.println("more..");
         Integer roomId = gameManager.getRoomManager().getNpcCurrentRoom(this).get().getRoomId();
-        System.out.println("more...");
         Room room = gameManager.getRoomManager().getRoom(roomId);
-        System.out.println("and more....");
         room.addPresentItem(corpse.getItemId());
         gameManager.getItemDecayManager().addItem(corpse);
         getCurrentRoom().removePresentNpc(getEntityId());
         gameManager.getEntityManager().deleteNpcEntity(getEntityId());
-        System.out.println("removing active fight: " + player.getActiveFights().size());
         player.removeActiveFight(this);
-        System.out.println("removed active fight: " + player.getActiveFights().size());
         for (Map.Entry<String, Double> playerDamagePercent : damagePercents.entrySet()) {
             Player p = gameManager.getPlayerManager().getPlayer(playerDamagePercent.getKey());
             if (p == null) {
diff --git a/src/main/java/com/syncleus/aethermud/player/Player.java b/src/main/java/com/syncleus/aethermud/player/Player.java
index 0753d94f..c4589603 100644
--- a/src/main/java/com/syncleus/aethermud/player/Player.java
+++ b/src/main/java/com/syncleus/aethermud/player/Player.java
@@ -697,7 +697,6 @@ public class Player extends AetherMudEntity {
             }
             PlayerData playerData = playerMetadataOptional.get();
             Set<CoolDownData> coolDowns = playerData.getCoolDowns();
-            log.info("removing cooldowns: " + coolDowns.size());
             for(final CoolDownData coolDown : coolDowns) {
                 if (coolDown.isActive()) {
                     coolDown.decrementTick();
@@ -706,14 +705,10 @@ public class Player extends AetherMudEntity {
                         gameManager.getChannelUtils().write(playerId, "You have risen from the dead.\r\n");
                     }
 
-                    log.info("removed: " + coolDown.getName());
                     playerData.removeCoolDown(coolDown);
                 }
             }
             savePlayerMetadata();
-
-            coolDowns = playerData.getCoolDowns();
-            log.info(">removing cooldowns: " + coolDowns.size());
         }
     }
 
@@ -862,7 +857,7 @@ public class Player extends AetherMudEntity {
         }
     }
 
-    public Optional<Item> getInventoryItem(String itemKeyword) {
+    public Optional<ItemPojo> getInventoryItem(String itemKeyword) {
         synchronized (interner.intern(playerId)) {
             Optional<PlayerData> playerMetadataOptional = getPlayerMetadata();
             if (!playerMetadataOptional.isPresent()) {
@@ -870,12 +865,12 @@ public class Player extends AetherMudEntity {
             }
             PlayerData playerData = playerMetadataOptional.get();
             for (String itemId : playerData.getInventory()) {
-                Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
+                Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
                 if (!itemOptional.isPresent()) {
                     log.info("Orphaned inventoryId:" + itemId + " player: " + getPlayerName());
                     continue;
                 }
-                Item itemEntity = itemOptional.get();
+                ItemPojo itemEntity = itemOptional.get();
                 if (itemEntity.getItemTriggers().contains(itemKeyword)) {
                     return Optional.of(itemEntity);
                 }
@@ -891,10 +886,10 @@ public class Player extends AetherMudEntity {
     public List<String> getRolledUpLockerInventory() {
         synchronized (interner.intern(playerId)) {
             List<String> rolledUp = Lists.newArrayList();
-            List<Item> inventory = getLockerInventory();
+            List<ItemPojo> inventory = getLockerInventory();
             Map<String, Integer> itemAndCounts = Maps.newHashMap();
             if (inventory != null) {
-                for (Item item : inventory) {
+                for (ItemPojo item : inventory) {
                     StringBuilder invItem = new StringBuilder();
                     invItem.append(item.getItemName());
                     int maxUses = item.getMaxUses();
@@ -929,18 +924,18 @@ public class Player extends AetherMudEntity {
         }
     }
 
-    public List<Item> getLockerInventory() {
+    public List<ItemPojo> getLockerInventory() {
         synchronized (interner.intern(playerId)) {
             Optional<PlayerData> playerMetadataOptonal = getPlayerMetadata();
             if (!playerMetadataOptonal.isPresent()) {
                 return Lists.newArrayList();
             }
             PlayerData playerData = playerMetadataOptonal.get();
-            List<Item> inventoryItems = Lists.newArrayList();
+            List<ItemPojo> inventoryItems = Lists.newArrayList();
             List<String> inventory = playerData.getLockerInventory();
             if (inventory != null) {
                 for (String itemId : inventory) {
-                    Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
+                    Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
                     if (!itemOptional.isPresent()) {
                         log.info("Orphaned inventoryId:" + itemId + " player: " + getPlayerName());
                         continue;
@@ -948,7 +943,7 @@ public class Player extends AetherMudEntity {
                     inventoryItems.add(itemOptional.get());
                 }
             }
-            inventoryItems.sort(Comparator.comparing(Item::getItemName));
+            inventoryItems.sort(Comparator.comparing(ItemPojo::getItemName));
             return inventoryItems;
         }
     }
@@ -956,10 +951,10 @@ public class Player extends AetherMudEntity {
     public List<String> getRolledUpIntentory() {
         synchronized (interner.intern(playerId)) {
             List<String> rolledUp = Lists.newArrayList();
-            List<Item> inventory = getInventory();
+            List<ItemPojo> inventory = getInventory();
             Map<String, Integer> itemAndCounts = Maps.newHashMap();
             if (inventory != null) {
-                for (Item item : inventory) {
+                for (ItemPojo item : inventory) {
                     StringBuilder invItem = new StringBuilder();
                     invItem.append(item.getItemName());
                     int maxUses = item.getMaxUses();
@@ -994,18 +989,18 @@ public class Player extends AetherMudEntity {
         }
     }
 
-    public List<Item> getInventory() {
+    public List<ItemPojo> getInventory() {
         synchronized (interner.intern(playerId)) {
             Optional<PlayerData> playerMetadataOptional = getPlayerMetadata();
             if (!playerMetadataOptional.isPresent()) {
                 return Lists.newArrayList();
             }
             PlayerData playerData = playerMetadataOptional.get();
-            List<Item> inventoryItems = Lists.newArrayList();
+            List<ItemPojo> inventoryItems = Lists.newArrayList();
             List<String> inventory = playerData.getInventory();
             if (inventory != null) {
                 for (String itemId : inventory) {
-                    Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
+                    Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
                     if (!itemOptional.isPresent()) {
                         log.info("Orphaned inventoryId:" + itemId + " player: " + getPlayerName());
                         continue;
@@ -1013,23 +1008,23 @@ public class Player extends AetherMudEntity {
                     inventoryItems.add(itemOptional.get());
                 }
             }
-            inventoryItems.sort(Comparator.comparing(Item::getItemName));
+            inventoryItems.sort(Comparator.comparing(ItemPojo::getItemName));
             return inventoryItems;
         }
     }
 
-    public Set<Item> getEquipment() {
+    public Set<ItemPojo> getEquipment() {
         synchronized (interner.intern(playerId)) {
             Optional<PlayerData> playerMetadataOptional = getPlayerMetadata();
             if (!playerMetadataOptional.isPresent()) {
                 return Sets.newHashSet();
             }
             PlayerData playerData = playerMetadataOptional.get();
-            Set<Item> equipmentItems = Sets.newHashSet();
+            Set<ItemPojo> equipmentItems = Sets.newHashSet();
             List<String> equipment = playerData.getPlayerEquipment();
             if (equipment != null) {
                 for (String itemId : equipment) {
-                    Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
+                    Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
                     if (!itemOptional.isPresent()) {
                         log.info("Orphaned equipmentId:" + itemId + " player: " + getPlayerName());
                         continue;
@@ -1041,14 +1036,14 @@ public class Player extends AetherMudEntity {
         }
     }
 
-    public void equip(Item item) {
+    public void equip(ItemPojo item) {
         synchronized (interner.intern(playerId)) {
             if (item.getEquipment() == null) {
                 return;
             }
             Equipment equipment = item.getEquipment();
             EquipmentSlotType equipmentSlotType = equipment.getEquipmentSlotType();
-            Optional<Item> slotItemOptional = getSlotItem(equipmentSlotType);
+            Optional<ItemPojo> slotItemOptional = getSlotItem(equipmentSlotType);
             if (slotItemOptional.isPresent()) {
                 if (!unEquip(slotItemOptional.get())) {
                     return;
@@ -1060,7 +1055,7 @@ public class Player extends AetherMudEntity {
         }
     }
 
-    public Optional<Item> getSlotItem(EquipmentSlotType slot) {
+    public Optional<ItemPojo> getSlotItem(EquipmentSlotType slot) {
         Optional<PlayerData> playerMetadataOptional = getPlayerMetadata();
         if (!playerMetadataOptional.isPresent()) {
             return Optional.empty();
@@ -1070,11 +1065,11 @@ public class Player extends AetherMudEntity {
             return Optional.empty();
         }
         for (String item : playerData.getPlayerEquipment()) {
-            Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(item);
+            Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(item);
             if (!itemOptional.isPresent()) {
                 continue;
             }
-            Item itemEntity = itemOptional.get();
+            ItemPojo itemEntity = itemOptional.get();
             EquipmentSlotType equipmentSlotType = itemEntity.getEquipment().getEquipmentSlotType();
             if (equipmentSlotType.equals(slot)) {
                 return Optional.of(itemEntity);
@@ -1083,7 +1078,7 @@ public class Player extends AetherMudEntity {
         return Optional.empty();
     }
 
-    public boolean unEquip(Item item) {
+    public boolean unEquip(ItemPojo item) {
         synchronized (interner.intern(playerId)) {
             gameManager.getChannelUtils().write(playerId, "Un-equipping " + item.getItemName() + "\r\n");
             if (gameManager.acquireItem(this, item.getItemId())) {
@@ -1164,11 +1159,11 @@ public class Player extends AetherMudEntity {
                 return playerStats;
             }
             for (String equipId : playerEquipment) {
-                Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(equipId);
+                Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(equipId);
                 if (!itemOptional.isPresent()) {
                     continue;
                 }
-                Item itemEntity = itemOptional.get();
+                ItemPojo itemEntity = itemOptional.get();
                 Equipment equipment = itemEntity.getEquipment();
                 Stats stats = equipment.getStats();
                 StatsHelper.combineStats(newStats, stats);
@@ -1217,7 +1212,7 @@ public class Player extends AetherMudEntity {
         List<EquipmentSlotType> all = EquipmentSlotType.getAll();
         for (EquipmentSlotType slot : all) {
             t.addCell(capitalize(slot.getName()));
-            Optional<Item> slotItemOptional = getSlotItem(slot);
+            Optional<ItemPojo> slotItemOptional = getSlotItem(slot);
             if (slotItemOptional.isPresent()) {
                 t.addCell(slotItemOptional.get().getItemName());
             } else {
@@ -1321,17 +1316,11 @@ public class Player extends AetherMudEntity {
     }
 
     public void removeActiveFight(NpcSpawn npcSpawn) {
-        System.out.println("trying to remove a fight...");
         synchronized (interner.intern(playerId)) {
-            System.out.println("still trying...");
             Iterator<Map.Entry<Long, ActiveFight>> iterator = activeFights.entrySet().iterator();
             while (iterator.hasNext()) {
                 Map.Entry<Long, ActiveFight> next = iterator.next();
-                System.out.println("considering this one?");
-                if (next.getValue().getNpcId().equals(npcSpawn.getEntityId())) {
-//                    if (next.getValue().isPrimary()) {
-//                    }
-                    System.out.println("removed a fight");
+                if (next.getValue().getNpcId().orElse("").equals(npcSpawn.getEntityId())) {
                     iterator.remove();
                 }
             }
diff --git a/src/main/java/com/syncleus/aethermud/player/PlayerManagement.java b/src/main/java/com/syncleus/aethermud/player/PlayerManagement.java
index 163e0807..eedbef64 100644
--- a/src/main/java/com/syncleus/aethermud/player/PlayerManagement.java
+++ b/src/main/java/com/syncleus/aethermud/player/PlayerManagement.java
@@ -17,7 +17,7 @@ package com.syncleus.aethermud.player;
 
 import com.google.common.collect.Sets;
 import com.syncleus.aethermud.core.GameManager;
-import com.syncleus.aethermud.items.Item;
+import com.syncleus.aethermud.items.ItemPojo;
 import com.syncleus.aethermud.items.ItemBuilder;
 import com.syncleus.aethermud.items.ItemMetadata;
 import com.syncleus.aethermud.server.communication.Color;
@@ -259,11 +259,11 @@ public class PlayerManagement implements PlayerManagementMBean {
         PlayerData playerData = playerMetadataOptional.get();
         List<String> inventory = playerData.getInventory();
         for (String itemId : inventory) {
-            Optional<Item> itemEntityOptional = gameManager.getEntityManager().getItemEntity(itemId);
+            Optional<ItemPojo> itemEntityOptional = gameManager.getEntityManager().getItemEntity(itemId);
             if (!itemEntityOptional.isPresent()) {
                 continue;
             }
-            Item itemEntity = itemEntityOptional.get();
+            ItemPojo itemEntity = itemEntityOptional.get();
             String itemName = itemEntity.getItemName();
             final String msgWithoutColorCodes =
                     itemName.replaceAll("\u001B\\[[;\\d]*m", "");
@@ -282,11 +282,11 @@ public class PlayerManagement implements PlayerManagementMBean {
         PlayerData playerData = playerMetadataOptional.get();
         List<String> inventory = playerData.getLockerInventory();
         for (String itemId : inventory) {
-            Optional<Item> itemEntityOptional = gameManager.getEntityManager().getItemEntity(itemId);
+            Optional<ItemPojo> itemEntityOptional = gameManager.getEntityManager().getItemEntity(itemId);
             if (!itemEntityOptional.isPresent()) {
                 continue;
             }
-            Item itemEntity = itemEntityOptional.get();
+            ItemPojo itemEntity = itemEntityOptional.get();
             String itemName = itemEntity.getItemName();
             final String msgWithoutColorCodes =
                     itemName.replaceAll("\u001B\\[[;\\d]*m", "");
@@ -301,7 +301,7 @@ public class PlayerManagement implements PlayerManagementMBean {
         if (!itemMetadata.isPresent()) {
             return "No such item exists with internal name: " + internalItemName;
         }
-        Item item = new ItemBuilder().from(itemMetadata.get()).create();
+        ItemPojo item = new ItemBuilder().from(itemMetadata.get()).create();
         gameManager.getEntityManager().saveItem(item);
         synchronized (findInterner().intern(playerId)) {
             Optional<PlayerData> playerMetadataOptional = gameManager.getPlayerManager().getPlayerMetadata(playerId);
diff --git a/src/main/java/com/syncleus/aethermud/spawner/ItemSpawner.java b/src/main/java/com/syncleus/aethermud/spawner/ItemSpawner.java
index 2c4e50a5..a0eabf93 100644
--- a/src/main/java/com/syncleus/aethermud/spawner/ItemSpawner.java
+++ b/src/main/java/com/syncleus/aethermud/spawner/ItemSpawner.java
@@ -19,7 +19,7 @@ import com.codahale.metrics.MetricRegistry;
 import com.syncleus.aethermud.Main;
 import com.syncleus.aethermud.core.GameManager;
 import com.syncleus.aethermud.entity.AetherMudEntity;
-import com.syncleus.aethermud.items.Item;
+import com.syncleus.aethermud.items.ItemPojo;
 import com.syncleus.aethermud.items.ItemBuilder;
 import com.syncleus.aethermud.items.ItemMetadata;
 import com.syncleus.aethermud.world.model.Area;
@@ -80,7 +80,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()));
-        Item item = new ItemBuilder().from(itemMetadata).create();
+        ItemPojo item = new ItemBuilder().from(itemMetadata).create();
         gameManager.getEntityManager().saveItem(item);
         gameManager.placeItemInRoom(room.getRoomId(), item.getItemId());
         Main.metrics.counter(MetricRegistry.name(ItemSpawner.class, item.getItemName() + "-spawn")).inc();
@@ -92,11 +92,11 @@ public class ItemSpawner extends AetherMudEntity {
         for (Room room : roomsByArea) {
             if (room.getAreas().contains(spawnArea)) {
                 for (String i : room.getItemIds()) {
-                    Optional<Item> currentItemOptional = gameManager.getEntityManager().getItemEntity(i);
+                    Optional<ItemPojo> currentItemOptional = gameManager.getEntityManager().getItemEntity(i);
                     if (!currentItemOptional.isPresent()) {
                         continue;
                     }
-                    Item currentItem = currentItemOptional.get();
+                    ItemPojo currentItem = currentItemOptional.get();
                     if (currentItem.getInternalItemName().equals(itemMetadata.getInternalItemName())) {
                         numberCurrentlyInArea++;
                     }
@@ -113,11 +113,11 @@ public class ItemSpawner extends AetherMudEntity {
                 int count = 0;
                 Set<String> itemIds = room.getItemIds();
                 for (String itemId : itemIds) {
-                    Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
+                    Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
                     if (!itemOptional.isPresent()) {
                         continue;
                     }
-                    Item item = itemOptional.get();
+                    ItemPojo item = itemOptional.get();
                     if (item.getInternalItemName().equals(itemMetadata.getInternalItemName())) {
                         count++;
                     }
diff --git a/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java b/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java
index 88dd3996..c7450f34 100644
--- a/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java
+++ b/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java
@@ -17,13 +17,14 @@ package com.syncleus.aethermud.storage;
 
 
 import com.google.common.util.concurrent.Service;
-import com.syncleus.aethermud.items.Item;
+import com.syncleus.aethermud.items.ItemPojo;
+import com.syncleus.aethermud.storage.graphdb.ItemData;
 import com.syncleus.aethermud.storage.graphdb.PlayerData;
 
 import java.util.Map;
 import java.util.Optional;
 
-public interface AetherMudStorage extends Service{
+public interface AetherMudStorage extends Service {
 
     PlayerData newPlayerData();
 
@@ -31,13 +32,13 @@ public interface AetherMudStorage extends Service{
 
     Map<String, PlayerData> getAllPlayerMetadata();
 
-    void removePlayerMetadata(String playerId);
+    void saveItemEntity(ItemPojo item);
 
-    void saveItemEntity(Item item);
-
-    Optional<Item> getItemEntity(String itemId);
+    Optional<ItemData> getItemEntity(String itemId);
 
     void removeItem(String itemId);
 
+    ItemData newItem();
+
     void persist();
 }
diff --git a/src/main/java/com/syncleus/aethermud/storage/ItemSerializer.java b/src/main/java/com/syncleus/aethermud/storage/ItemSerializer.java
index 5c62765f..cf6d0eea 100644
--- a/src/main/java/com/syncleus/aethermud/storage/ItemSerializer.java
+++ b/src/main/java/com/syncleus/aethermud/storage/ItemSerializer.java
@@ -15,7 +15,7 @@
  */
 package com.syncleus.aethermud.storage;
 
-import com.syncleus.aethermud.items.Item;
+import com.syncleus.aethermud.items.ItemPojo;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import org.jetbrains.annotations.NotNull;
@@ -26,18 +26,18 @@ import org.mapdb.Serializer;
 import java.io.IOException;
 import java.io.Serializable;
 
-public class ItemSerializer implements Serializer<Item>, Serializable {
+public class ItemSerializer implements Serializer<ItemPojo>, Serializable {
 
     private final static Gson GSON = new GsonBuilder().create();
 
     @Override
-    public void serialize(@NotNull DataOutput2 out, @NotNull Item value) throws IOException {
-        out.writeUTF(GSON.toJson(value, Item.class));
+    public void serialize(@NotNull DataOutput2 out, @NotNull ItemPojo value) throws IOException {
+        out.writeUTF(GSON.toJson(value, ItemPojo.class));
     }
 
     @Override
-    public Item deserialize(@NotNull DataInput2 input, int available) throws IOException {
-        return GSON.fromJson(input.readUTF(), Item.class);
+    public ItemPojo deserialize(@NotNull DataInput2 input, int available) throws IOException {
+        return GSON.fromJson(input.readUTF(), ItemPojo.class);
     }
 
     @Override
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 dc3aed67..7f467397 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java
@@ -15,18 +15,17 @@
  */
 package com.syncleus.aethermud.storage.graphdb;
 
+import com.google.api.client.util.Sets;
 import com.google.common.util.concurrent.AbstractIdleService;
 import com.syncleus.aethermud.Main;
-import com.syncleus.aethermud.items.Effect;
-import com.syncleus.aethermud.items.Item;
+import com.syncleus.aethermud.items.ItemPojo;
 import com.syncleus.aethermud.player.PlayerRole;
 import com.syncleus.aethermud.storage.AetherMudStorage;
-import com.syncleus.aethermud.storage.EffectSerializer;
 import com.syncleus.aethermud.storage.ItemSerializer;
 import com.syncleus.aethermud.storage.MapDbAutoCommitService;
-import com.syncleus.ferma.DelegatingFramedGraph;
-import com.syncleus.ferma.FramedGraph;
 import com.syncleus.ferma.WrappedFramedGraph;
+import org.apache.commons.beanutils.BeanUtils;
+import org.apache.commons.beanutils.PropertyUtils;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.io.IoCore;
 import org.mapdb.DB;
@@ -34,36 +33,17 @@ import org.mapdb.HTreeMap;
 import org.mapdb.Serializer;
 
 import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
 import java.util.*;
+import java.util.function.Consumer;
 
 //TODO : multiple instances of this class could create conflicts in the DB
 public class GraphDbAetherMudStorage extends AbstractIdleService implements AetherMudStorage {
 
 
     private final WrappedFramedGraph<Graph> framedGraph;
-    private final DB db;
-    private final MapDbAutoCommitService mapDbAutoCommitService;
-
-    private final HTreeMap<String, Item> items;
-
-    private final static String ITEM_MAP = "itemMap";
-    private final static String EFFECTS_MAP = "effectsMap";
-    private final boolean autoPersist;
-
-    public GraphDbAetherMudStorage(DB db, WrappedFramedGraph<Graph> framedGraph){
-        this(db, framedGraph, true);
-    }
-
-    public GraphDbAetherMudStorage(DB db, WrappedFramedGraph<Graph> framedGraph, boolean autoPersist) {
-        this.db = db;
-        this.autoPersist = autoPersist;
-        this.items = db.hashMap(ITEM_MAP)
-            .keySerializer(Serializer.STRING)
-            .valueSerializer(new ItemSerializer())
-            .createOrOpen();
-
-        this.mapDbAutoCommitService = new MapDbAutoCommitService(db);
 
+    public GraphDbAetherMudStorage(WrappedFramedGraph<Graph> framedGraph) {
         this.framedGraph = framedGraph;
     }
 
@@ -84,35 +64,19 @@ public class GraphDbAetherMudStorage extends AbstractIdleService implements Aeth
         final Map<String, PlayerData> retVal = new HashMap<>(datas.size());
         for( PlayerData data : datas ) {
             retVal.put(data.getPlayerId(), data);
-            for(PlayerRole role : data.getPlayerRoleSet())
-            System.out.println("role: " + role);
         }
         return retVal;
     }
 
     @Override
-    public void removePlayerMetadata(String playerId) {
-        final PlayerData data = framedGraph.traverse((g) -> g.V().has("playerId", playerId)).next(PlayerData.class);
-        data.remove();
-
-        if (this.autoPersist) {
-            this.persist();
-        }
-    }
-
-    @Override
-    public void saveItemEntity(Item item) {
-        this.items.put(item.getItemId(), item);
-    }
-
-    @Override
-    public Optional<Item> getItemEntity(String itemId) {
-        return Optional.ofNullable(this.items.get(itemId));
+    public Optional<ItemData> getItemEntity(String itemId) {
+        return Optional.ofNullable(framedGraph.traverse((g) -> framedGraph.getTypeResolver().hasType(g.V(), ItemData.class)).nextOrDefault(ItemData.class, null));
     }
 
     @Override
     public void removeItem(String itemId) {
-        this.items.remove(itemId);
+        this.getItemEntity(itemId).ifPresent((i) -> i.remove());
+
     }
 
     public void persist() {
@@ -124,14 +88,24 @@ public class GraphDbAetherMudStorage extends AbstractIdleService implements Aeth
     }
 
     @Override
-    protected void startUp() throws Exception {
-        mapDbAutoCommitService.startAsync();
+    public ItemData newItem() {
+        return framedGraph.addFramedVertex(ItemData.class);
+    }
+
+    @Override
+    public void saveItemEntity(ItemPojo item) {
+        try {
+            BeanUtils.copyProperties(this.newItem(), item);
+        } catch (IllegalAccessException | InvocationTargetException e) {
+            throw new IllegalStateException("Could not copy bean", e);
+        }
+    }
+
+    @Override
+    protected void startUp() {
     }
 
     @Override
-    protected void shutDown() throws Exception {
-        mapDbAutoCommitService.stopAsync();
-        mapDbAutoCommitService.awaitTerminated();
-        db.commit();
+    protected void shutDown() {
     }
 }
diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/ItemData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/ItemData.java
new file mode 100644
index 00000000..61ca32f3
--- /dev/null
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/ItemData.java
@@ -0,0 +1,186 @@
+/**
+ * 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.storage.graphdb;
+
+import com.syncleus.aethermud.core.service.TimeTracker;
+import com.syncleus.aethermud.items.*;
+import com.syncleus.aethermud.stats.Stats;
+import com.syncleus.ferma.AbstractVertexFrame;
+import com.syncleus.ferma.annotations.Property;
+
+import java.util.List;
+import java.util.Set;
+
+public abstract class ItemData extends AbstractVertexFrame implements Item {
+    @Override
+    @Property("Stats")
+    public abstract Stats getItemApplyStats();
+
+    @Override
+    public void setItemApplyStats(Stats itemApplyStats) {
+        this.traverse((v) -> v.property("Stats", itemApplyStats));
+    }
+
+    @Override
+    @Property("ValidTimeOfDays")
+    public abstract Set<TimeTracker.TimeOfDay> getValidTimeOfDays();
+
+    @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("RestingName")
+    public abstract String getRestingName();
+
+    @Override
+    @Property("ItemHalfLifeTicks")
+    public abstract int getItemHalfLifeTicks();
+
+    @Override
+    @Property("Loot")
+    public abstract Loot getLoot();
+
+    @Override
+    public void setEquipment(Equipment equipment) {
+        this.traverse((v) -> v.property("Equipment", equipment));
+    }
+
+    @Override
+    @Property("HasBeenWithPlayer")
+    public abstract void setHasBeenWithPlayer(boolean hasBeenWithPlayer);
+
+    @Override
+    public void setValidTimeOfDays(Set<TimeTracker.TimeOfDay> validTimeOfDays) {
+        this.traverse((v) -> v.property("ValidTimeOfDays", validTimeOfDays));
+    }
+
+    @Override
+    @Property("Equipment")
+    public abstract Equipment getEquipment();
+
+    @Override
+    @Property("Rarity")
+    public abstract Rarity getRarity();
+
+    @Override
+    @Property("ValueInGold")
+    public abstract int getValueInGold();
+
+    @Override
+    public void setEffects(Set<Effect> effects) {
+        this.traverse((v) -> v.property("Effects", effects));
+    }
+
+    @Override
+    @Property("Effects")
+    public abstract Set<Effect> getEffects();
+
+    @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
+    public void setItemTriggers(List<String> itemTriggers) {
+        this.traverse((v) -> v.property("ItemTriggers", itemTriggers));
+    }
+
+    @Override
+    @Property("RestingName")
+    public abstract void setRestingName(String restingName);
+
+    @Override
+    @Property("ItemId")
+    public abstract void setItemId(String itemId);
+
+    @Override
+    public void setLoot(Loot loot) {
+        this.traverse((v) -> v.property("Loot", loot));
+    }
+
+    @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();
+}
diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/PlayerData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/PlayerData.java
index e557be11..165c1b83 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/PlayerData.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/PlayerData.java
@@ -148,7 +148,6 @@ public abstract class PlayerData extends AbstractVertexFrame {
     public abstract void addCoolDown(CoolDownData coolDown);
 
     public void setCoolDowns(Map<CoolDownType, CoolDownData> coolDowns) {
-        System.out.println("setting cooldowns: " + coolDowns.size());
         Iterator<? extends CoolDownData> existingCoolDowns = getCoolDowns(CoolDownData.class);
         while(existingCoolDowns.hasNext()) {
             CoolDownData existingCoolDown = existingCoolDowns.next();
@@ -165,7 +164,6 @@ public abstract class PlayerData extends AbstractVertexFrame {
     }
 
     public CoolDownData createCoolDown(CoolDownType type) {
-        System.out.println("creating cool down");
         Iterator<? extends CoolDownData> coolDowns = getCoolDowns(CoolDownData.class);
         while(coolDowns.hasNext()) {
             CoolDownData coolDown = coolDowns.next();
@@ -184,7 +182,6 @@ public abstract class PlayerData extends AbstractVertexFrame {
     }
 
     public CoolDownData createCoolDown(CoolDown coolDownSource) {
-        System.out.println("creating cool down");
         Iterator<? extends CoolDownData> coolDowns = getCoolDowns(CoolDownData.class);
         while(coolDowns.hasNext()) {
             CoolDownData coolDown = coolDowns.next();
@@ -248,8 +245,8 @@ public abstract class PlayerData extends AbstractVertexFrame {
             try {
                 PropertyUtils.copyProperties(this.createStats(), stats);
             } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
-                throw new IllegalStateException("Could not copy properties")
-                    ;            }
+                throw new IllegalStateException("Could not copy properties");
+            }
         }
     }
 
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 35f29e3a..67ef5a3d 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.Item;
+import com.syncleus.aethermud.items.ItemPojo;
 import com.syncleus.aethermud.merchant.Merchant;
 import com.syncleus.aethermud.npc.NpcSpawn;
 import com.syncleus.aethermud.player.Player;
@@ -295,12 +295,12 @@ public abstract class Room extends AetherMudEntity {
     @Override
     public void run() {
         for (String itemId : itemIds) {
-            Optional<Item> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
+            Optional<ItemPojo> itemOptional = gameManager.getEntityManager().getItemEntity(itemId);
             if (!itemOptional.isPresent()) {
                 removePresentItem(itemId);
                 continue;
             }
-            Item itemEntity = itemOptional.get();
+            ItemPojo itemEntity = itemOptional.get();
             if (itemEntity.isHasBeenWithPlayer()) {
                 continue;
             }
diff --git a/src/test/java/com/syncleus/aethermud/player/PlayerManagerTest.java b/src/test/java/com/syncleus/aethermud/player/PlayerManagerTest.java
index 53e37b09..aa8845e4 100644
--- a/src/test/java/com/syncleus/aethermud/player/PlayerManagerTest.java
+++ b/src/test/java/com/syncleus/aethermud/player/PlayerManagerTest.java
@@ -50,9 +50,8 @@ public class PlayerManagerTest {
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
-        DB db = DBMaker.memoryDB().transactionEnable().make();
         WrappedFramedGraph<Graph> framedGraph = new DelegatingFramedGraph(TinkerGraph.open(), Main.FRAMED_TYPES);
-        GraphDbAetherMudStorage graphStorage = new GraphDbAetherMudStorage(db, framedGraph, false);
+        GraphDbAetherMudStorage graphStorage = new GraphDbAetherMudStorage(framedGraph);
         playerManager = new PlayerManager(graphStorage, sessionManager);
     }
 
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 194fdeee..07591e44 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.Item;
+import com.syncleus.aethermud.items.ItemPojo;
 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<Item> equipmentSet;
+    private final Set<ItemPojo> equipmentSet;
     private final NpcSpawn npcSpawn;
 
-    public CombatSimulationDetails(int level, Set<Item> equipmentSet, NpcSpawn npcSpawn) {
+    public CombatSimulationDetails(int level, Set<ItemPojo> equipmentSet, NpcSpawn npcSpawn) {
         this.level = level;
         this.totalIterations = 1000;
         this.equipmentSet = equipmentSet;
@@ -46,7 +46,7 @@ public class CombatSimulationDetails {
         return npcSpawn;
     }
 
-    public Set<Item> getEquipmentSet() {
+    public Set<ItemPojo> 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 a22ab3e1..04adfd14 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.Item;
+import com.syncleus.aethermud.items.ItemPojo;
 import com.syncleus.aethermud.npc.NpcSpawn;
 import com.syncleus.aethermud.npc.NpcBuilder;
 import com.syncleus.aethermud.player.*;
@@ -131,18 +131,18 @@ public class NpcTestHarness {
         processRunAndVerify(npcSpawnFromFile, 10, getMidLevelArmorSet(), 100f, 0f, 10, 0, 24, 18);
     }
 
-    private Set<Item> getEarlyLevelArmorSet() {
+    private Set<ItemPojo> getEarlyLevelArmorSet() {
         //  return Sets.newHashSet(ItemType.BERSERKER_BATON.create(), ItemType.BERSEKER_BOOTS.create(), ItemType.BERSEKER_SHORTS.create());
         return Sets.newConcurrentHashSet();
     }
 
-    private Set<Item> getMidLevelArmorSet() {
-        Set<Item> armorSet = getEarlyLevelArmorSet();
+    private Set<ItemPojo> getMidLevelArmorSet() {
+        Set<ItemPojo> armorSet = getEarlyLevelArmorSet();
         //  armorSet.addAll(Sets.newHashSet(ItemType.BERSERKER_BRACERS.create(), ItemType.BERSERKER_CHEST.create()));
         return armorSet;
     }
 
-    private void processRunAndVerify(NpcSpawn testNpcSpawn, int desiredLevel, Set<Item> equipment, float winPctMax, float winPctMin, int maxRounds, int minRounds, int maxAvgGold, int minAvgGold) throws Exception {
+    private void processRunAndVerify(NpcSpawn testNpcSpawn, int desiredLevel, Set<ItemPojo> 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);
@@ -176,7 +176,7 @@ public class NpcTestHarness {
                 playerWins++;
                 int gold = (int) gameManager.getLootManager().lootGoldAmountReturn(npcSpawn.getLoot());
                 totalGold += gold;
-                Set<Item> items = gameManager.getLootManager().lootItemsReturn(npcSpawn.getLoot());
+                Set<ItemPojo> items = gameManager.getLootManager().lootItemsReturn(npcSpawn.getLoot());
                 items.forEach(item -> {
                     if (!drops.containsKey(item.getItemName())) {
                         drops.put(item.getItemName(), new AtomicInteger(1));
@@ -248,7 +248,7 @@ public class NpcTestHarness {
         return player;
     }
 
-    private void equipArmor(Player player, Set<Item> equipment) {
+    private void equipArmor(Player player, Set<ItemPojo> equipment) {
         equipment.forEach(item -> {
             entityManager.saveItem(item);
             gameManager.acquireItem(player, item.getItemId());
@@ -331,9 +331,8 @@ public class NpcTestHarness {
             }
         };
         AetherMudConfiguration aetherMudConfiguration = new AetherMudConfiguration(new MapConfiguration(Maps.newHashMap()));
-        DB db = DBMaker.memoryDB().transactionEnable().closeOnJvmShutdown().make();
         WrappedFramedGraph<Graph> framedGraph = new DelegatingFramedGraph(TinkerGraph.open(), Main.FRAMED_TYPES);
-        GraphDbAetherMudStorage graphStorage = new GraphDbAetherMudStorage(db, framedGraph);
+        GraphDbAetherMudStorage graphStorage = new GraphDbAetherMudStorage(framedGraph);
         PlayerManager playerManager = new PlayerManager(graphStorage, new SessionManager());
         RoomManager roomManager = new RoomManager(playerManager);
         MapsManager mapsManager = new MapsManager(aetherMudConfiguration, roomManager);
-- 
GitLab