diff --git a/pom.xml b/pom.xml
index 1fe00e093652f5fd5aaf2a7726dadd270b4b88ea..32f785faa3efc5ac0ff1b6aeae699a9db6c9a934 100644
--- a/pom.xml
+++ b/pom.xml
@@ -187,7 +187,7 @@
         <dependency>
             <groupId>com.syncleus.ferma</groupId>
             <artifactId>ferma</artifactId>
-            <version>3.0.3</version>
+            <version>3.0.4-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.apache.tinkerpop</groupId>
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 f70bb59e7112f3b15c50fa7139e8878b39f9a3d0..136efc4780556b009b9e506c2f9e64872c6ff736 100644
--- a/src/main/java/com/syncleus/aethermud/command/commands/PickUpCommand.java
+++ b/src/main/java/com/syncleus/aethermud/command/commands/PickUpCommand.java
@@ -47,6 +47,8 @@ public class PickUpCommand extends Command {
                 if (!itemEntityOptional.isPresent()) {
                     continue;
                 }
+                if( itemEntityOptional.get().getItemTriggers() == null )
+                    throw new IllegalStateException("Item triggers cant be null");
                 if (itemEntityOptional.get().getItemTriggers().contains(desiredPickUpItem)) {
                     if (gameManager.acquireItemFromRoom(player, next)) {
                         String playerName = player.getPlayerName();
diff --git a/src/main/java/com/syncleus/aethermud/core/GameManager.java b/src/main/java/com/syncleus/aethermud/core/GameManager.java
index 6b7188fee9d655cfe1c0baf062de57fdaadb459e..143f136300450fc8fae1f38e0b978ff039e6c22f 100644
--- a/src/main/java/com/syncleus/aethermud/core/GameManager.java
+++ b/src/main/java/com/syncleus/aethermud/core/GameManager.java
@@ -475,7 +475,7 @@ public class GameManager {
     public void placeItemInRoom(Integer roomId, String itemId) {
         Optional<ItemPojo> itemOptional = entityManager.getItemEntity(itemId);
         if (!itemOptional.isPresent()) {
-            return;
+            throw new IllegalArgumentException("itemId not valid.");
         }
         ItemPojo item = itemOptional.get();
         roomManager.getRoom(roomId).addPresentItem(item.getItemId());
diff --git a/src/main/java/com/syncleus/aethermud/entity/EntityManager.java b/src/main/java/com/syncleus/aethermud/entity/EntityManager.java
index ce2527432b24ec455a5b987392feb3c92da386e8..fbe4d987bd3374cc5a4f3d7af0c231f6ea050e5d 100644
--- a/src/main/java/com/syncleus/aethermud/entity/EntityManager.java
+++ b/src/main/java/com/syncleus/aethermud/entity/EntityManager.java
@@ -17,7 +17,6 @@ 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;
@@ -42,7 +41,6 @@ public class EntityManager {
 
     private static final Logger log = Logger.getLogger(EntityManager.class);
 
-
     private final AetherMudStorage aetherMudStorage;
     private final RoomManager roomManager;
     private final PlayerManager playerManager;
@@ -80,8 +78,8 @@ public class EntityManager {
         }
     }
 
-    public void saveItem(ItemPojo item) {
-        aetherMudStorage.saveItemEntity(item);
+    public ItemData saveItem(ItemPojo item) {
+        return aetherMudStorage.saveItem(item);
     }
 
     public void removeItem(ItemPojo item) {
diff --git a/src/main/java/com/syncleus/aethermud/items/Item.java b/src/main/java/com/syncleus/aethermud/items/Item.java
index 6e3e73ea5fc62e6503947fb422ebaf0152ffbe44..c32ecfeca07b65e044c1c1582589f8a0657366c2 100644
--- a/src/main/java/com/syncleus/aethermud/items/Item.java
+++ b/src/main/java/com/syncleus/aethermud/items/Item.java
@@ -48,6 +48,8 @@ public interface Item {
 
     List<String> getItemTriggers();
 
+    void setItemTriggers(List<String> itemTriggers);
+
     String getRestingName();
 
     int getItemHalfLifeTicks();
@@ -76,8 +78,6 @@ public interface Item {
 
     void setInternalItemName(String internalItemName);
 
-    void setItemTriggers(List<String> itemTriggers);
-
     void setRestingName(String restingName);
 
     void setItemId(String itemId);
diff --git a/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java b/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java
index 070c943cf67455a6fef9956a13fa1d5c66b8db41..960d1cf400e7bba2f2b74c72c58e4aeb091f939e 100644
--- a/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java
+++ b/src/main/java/com/syncleus/aethermud/items/ItemBuilder.java
@@ -190,7 +190,7 @@ public class ItemBuilder {
     }
 
     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);
+        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/spawner/ItemSpawner.java b/src/main/java/com/syncleus/aethermud/spawner/ItemSpawner.java
index a0eabf93c5bccf4c8f20d2d3e245e833b07eea84..85ab9971a5eb6ec509436565db7850f68470f292 100644
--- a/src/main/java/com/syncleus/aethermud/spawner/ItemSpawner.java
+++ b/src/main/java/com/syncleus/aethermud/spawner/ItemSpawner.java
@@ -18,15 +18,19 @@ package com.syncleus.aethermud.spawner;
 import com.codahale.metrics.MetricRegistry;
 import com.syncleus.aethermud.Main;
 import com.syncleus.aethermud.core.GameManager;
+import com.syncleus.aethermud.core.SentryManager;
 import com.syncleus.aethermud.entity.AetherMudEntity;
+import com.syncleus.aethermud.entity.EntityManager;
 import com.syncleus.aethermud.items.ItemPojo;
 import com.syncleus.aethermud.items.ItemBuilder;
 import com.syncleus.aethermud.items.ItemMetadata;
+import com.syncleus.aethermud.storage.graphdb.ItemData;
 import com.syncleus.aethermud.world.model.Area;
 import com.syncleus.aethermud.world.model.Room;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Lists;
+import org.apache.log4j.Logger;
 
 import java.util.ArrayList;
 import java.util.Optional;
@@ -34,7 +38,7 @@ import java.util.Random;
 import java.util.Set;
 
 public class ItemSpawner extends AetherMudEntity {
-
+    private static final Logger LOGGER = Logger.getLogger(ItemSpawner.class);
     private final ItemMetadata itemMetadata;
     private final SpawnRule spawnRule;
     private final GameManager gameManager;
@@ -58,22 +62,27 @@ public class ItemSpawner extends AetherMudEntity {
 
     @Override
     public void run() {
-        incTicks();
-        if (noTicks >= spawnRule.getSpawnIntervalTicks()) {
-            int randomPercentage = spawnRule.getRandomChance();
-            int numberOfAttempts = spawnRule.getMaxInstances() - counterNumberInArea();
-            for (int i = 0; i < numberOfAttempts; i++) {
-                if (random.nextInt(100) < randomPercentage || randomPercentage == 100) {
-                    if (itemMetadata.getValidTimeOfDays() != null && itemMetadata.getValidTimeOfDays().size() > 0) {
-                        if (itemMetadata.getValidTimeOfDays().contains(gameManager.getTimeTracker().getTimeOfDay())) {
+        try {
+            incTicks();
+            if (noTicks >= spawnRule.getSpawnIntervalTicks()) {
+                int randomPercentage = spawnRule.getRandomChance();
+                int numberOfAttempts = spawnRule.getMaxInstances() - counterNumberInArea();
+                for (int i = 0; i < numberOfAttempts; i++) {
+                    if (random.nextInt(100) < randomPercentage || randomPercentage == 100) {
+                        if (itemMetadata.getValidTimeOfDays() != null && itemMetadata.getValidTimeOfDays().size() > 0) {
+                            if (itemMetadata.getValidTimeOfDays().contains(gameManager.getTimeTracker().getTimeOfDay())) {
+                                createAndAddItem();
+                            }
+                        } else {
                             createAndAddItem();
                         }
-                    } else {
-                        createAndAddItem();
                     }
+                    noTicks = 0;
                 }
-                noTicks = 0;
             }
+        } catch (Exception e) {
+            LOGGER.error("Problem with item spawner ticker!", e);
+            SentryManager.logSentry(this.getClass(), e, "Problem with item spawner!");
         }
     }
 
@@ -81,7 +90,7 @@ public class ItemSpawner extends AetherMudEntity {
         ArrayList<Room> rooms = Lists.newArrayList(Iterators.filter(gameManager.getRoomManager().getRoomsByArea(spawnArea).iterator(), getRoomsWithRoom()));
         Room room = rooms.get(random.nextInt(rooms.size()));
         ItemPojo item = new ItemBuilder().from(itemMetadata).create();
-        gameManager.getEntityManager().saveItem(item);
+        ItemData itemData = gameManager.getEntityManager().saveItem(item);
         gameManager.placeItemInRoom(room.getRoomId(), item.getItemId());
         Main.metrics.counter(MetricRegistry.name(ItemSpawner.class, item.getItemName() + "-spawn")).inc();
     }
diff --git a/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java b/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java
index c7450f3460de514d30cf93e5154fd3938113146b..7f28864912688f3c172e0e407273ed2b73d9ff19 100644
--- a/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java
+++ b/src/main/java/com/syncleus/aethermud/storage/AetherMudStorage.java
@@ -32,13 +32,11 @@ public interface AetherMudStorage extends Service {
 
     Map<String, PlayerData> getAllPlayerMetadata();
 
-    void saveItemEntity(ItemPojo item);
+    ItemData saveItem(ItemPojo item);
 
     Optional<ItemData> getItemEntity(String itemId);
 
     void removeItem(String itemId);
 
-    ItemData newItem();
-
     void persist();
 }
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 848205f9f785b7a4206ef87ae3fb27f47b90022f..4d05d318c37164f22e0d717861fb1330e430d367 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/GraphDbAetherMudStorage.java
@@ -21,6 +21,7 @@ import com.syncleus.aethermud.items.ItemPojo;
 import com.syncleus.aethermud.storage.AetherMudStorage;
 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;
 
@@ -61,7 +62,7 @@ public class GraphDbAetherMudStorage extends AbstractIdleService implements Aeth
 
     @Override
     public Optional<ItemData> getItemEntity(String itemId) {
-        return Optional.ofNullable(framedGraph.traverse((g) -> framedGraph.getTypeResolver().hasType(g.V(), ItemData.class)).nextOrDefault(ItemData.class, null));
+        return Optional.ofNullable(framedGraph.traverse((g) -> framedGraph.getTypeResolver().hasType(g.V(), ItemData.class).has("ItemId", itemId)).nextOrDefault(ItemData.class, null));
     }
 
     @Override
@@ -79,17 +80,15 @@ public class GraphDbAetherMudStorage extends AbstractIdleService implements Aeth
     }
 
     @Override
-    public ItemData newItem() {
-        return framedGraph.addFramedVertex(ItemData.class);
-    }
-
-    @Override
-    public void saveItemEntity(ItemPojo item) {
+    public ItemData saveItem(ItemPojo item) {
+        ItemData itemData = framedGraph.addFramedVertex(ItemData.class);
         try {
-            BeanUtils.copyProperties(this.newItem(), item);
-        } catch (IllegalAccessException | InvocationTargetException e) {
-            throw new IllegalStateException("Could not copy bean", e);
+            PropertyUtils.copyProperties(itemData, item);
+        } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
+            throw new IllegalStateException("Could not copy beans", e);
         }
+        itemData.setItemTriggers(item.getItemTriggers());
+        return itemData;
     }
 
     @Override
diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/ItemData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/ItemData.java
index 61ca32f39190c5e51c1c1cf07a6cdc56c2e920fb..51ae99860d7e508884fff437f28fbc46ac4f4ff1 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/ItemData.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/ItemData.java
@@ -38,6 +38,10 @@ public abstract class ItemData extends AbstractVertexFrame implements Item {
     @Property("ValidTimeOfDays")
     public abstract Set<TimeTracker.TimeOfDay> getValidTimeOfDays();
 
+    @Override
+    @Property("ValidTimeOfDays")
+    public abstract void setValidTimeOfDays(Set<TimeTracker.TimeOfDay> validTimeOfDays);
+
     @Override
     @Property("Disposable")
     public abstract boolean isDisposable();
@@ -82,6 +86,10 @@ public abstract class ItemData extends AbstractVertexFrame implements Item {
     @Property("ItemTriggers")
     public abstract List<String> getItemTriggers();
 
+    @Override
+    @Property("ItemTriggers")
+    public abstract void setItemTriggers(List<String> itemTriggers);
+
     @Override
     @Property("RestingName")
     public abstract String getRestingName();
@@ -95,22 +103,20 @@ public abstract class ItemData extends AbstractVertexFrame implements Item {
     public abstract Loot getLoot();
 
     @Override
-    public void setEquipment(Equipment equipment) {
-        this.traverse((v) -> v.property("Equipment", equipment));
-    }
+    @Property("Loot")
+    public abstract void setLoot(Loot loot);
 
     @Override
-    @Property("HasBeenWithPlayer")
-    public abstract void setHasBeenWithPlayer(boolean hasBeenWithPlayer);
+    @Property("Equipment")
+    public abstract Equipment getEquipment();
 
     @Override
-    public void setValidTimeOfDays(Set<TimeTracker.TimeOfDay> validTimeOfDays) {
-        this.traverse((v) -> v.property("ValidTimeOfDays", validTimeOfDays));
-    }
+    @Property("Equipment")
+    public abstract void setEquipment(Equipment equipment);
 
     @Override
-    @Property("Equipment")
-    public abstract Equipment getEquipment();
+    @Property("HasBeenWithPlayer")
+    public abstract void setHasBeenWithPlayer(boolean hasBeenWithPlayer);
 
     @Override
     @Property("Rarity")
@@ -121,9 +127,8 @@ public abstract class ItemData extends AbstractVertexFrame implements Item {
     public abstract int getValueInGold();
 
     @Override
-    public void setEffects(Set<Effect> effects) {
-        this.traverse((v) -> v.property("Effects", effects));
-    }
+    @Property("Effects")
+    public abstract void setEffects(Set<Effect> effects);
 
     @Override
     @Property("Effects")
@@ -141,11 +146,6 @@ public abstract class ItemData extends AbstractVertexFrame implements Item {
     @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);
@@ -154,11 +154,6 @@ public abstract class ItemData extends AbstractVertexFrame implements Item {
     @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);