diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EffectData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EffectData.java
index e7cc275aab4f48322149e0a94cec9abc0f239f13..4638afb99ba7aeaeabd645dda2857b4ce9556470 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EffectData.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EffectData.java
@@ -96,6 +96,8 @@ public abstract class EffectData extends AbstractInterceptingVertexFrame {
     }
 
     private StatData createApplyStatOnTickData() {
+        if (this.getApplyStatOnTickData() != null)
+            throw new IllegalStateException("Already has stats, can't create another");
         StatData statData = this.createOrphanStats();
         this.addApplyStatOnTickData(statData);
         return statData;
@@ -123,14 +125,14 @@ public abstract class EffectData extends AbstractInterceptingVertexFrame {
     }
 
     private StatData createDurationStatData() {
+        if (this.getDurationStatData() != null)
+            throw new IllegalStateException("Already has stats, can't create another");
         StatData statData = this.createOrphanStats();
         this.addDurationStatData(statData);
         return statData;
     }
 
     private StatData createOrphanStats() {
-        if (this.getDurationStatData() != null)
-            throw new IllegalStateException("Already has stats, can't create another");
         final StatData stats = this.getGraph().addFramedVertex(StatData.class);
         stats.setAgile(0);
         stats.setAim(0);
@@ -156,8 +158,8 @@ public abstract class EffectData extends AbstractInterceptingVertexFrame {
     public static void copyEffect(EffectData dest, Effect src) {
         try {
             PropertyUtils.copyProperties(dest, src);
-            StatData.copyStats(dest.createApplyStatOnTickData(), src.getApplyStatsOnTick());
-            StatData.copyStats(dest.createDurationStatData(), src.getDurationStats());
+            StatData.copyStats((dest.getApplyStatOnTickData() != null ? dest.getApplyStatOnTickData() : dest.createApplyStatOnTickData()), src.getApplyStatsOnTick());
+            StatData.copyStats((dest.getDurationStatData() != null ? dest.getDurationStatData() : dest.createDurationStatData()), src.getDurationStats());
         } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
             throw new IllegalStateException("Could not copy properties", e);
         }
diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EquipmentData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EquipmentData.java
index 1bff49e216b2afa0891d21058ce5679038c8eaa6..06924124951d3ea14ae5fe6c84f3124f78152b18 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EquipmentData.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/EquipmentData.java
@@ -87,7 +87,7 @@ public abstract class EquipmentData extends AbstractVertexFrame {
     public static void copyEquipment(EquipmentData dest, Equipment src) {
         try {
             PropertyUtils.copyProperties(dest, src);
-            StatData.copyStats(dest.getStatData(), src.getStats());
+            StatData.copyStats((dest.getStatData() != null ? dest.getStatData() : dest.createStatData()), src.getStats());
         } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
             throw new IllegalStateException("Could not copy properties", e);
         }
diff --git a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/NpcData.java b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/NpcData.java
index 6750709e7320f2773764edd3fba3cddfd95733b4..278844e7bc50fdcac0346f3f6abe92b8bc421a56 100644
--- a/src/main/java/com/syncleus/aethermud/storage/graphdb/model/NpcData.java
+++ b/src/main/java/com/syncleus/aethermud/storage/graphdb/model/NpcData.java
@@ -282,16 +282,32 @@ public abstract class NpcData extends AbstractInterceptingVertexFrame {
     public static void copyNpc(NpcData dest, Npc src) {
         try {
             PropertyUtils.copyProperties(dest, src);
-            LootData.copyLoot(dest.createLootData(), src.getLoot());
-            StatData.copyStats(dest.createStatsData(), src.getStats());
+            LootData.copyLoot((dest.getLootData() != null ? dest.getLootData() : dest.createLootData()), src.getLoot());
+            StatData.copyStats((dest.getStatsData() != null ? dest.getStatsData() : dest.createStatsData()), src.getStats());
+
+            for(SpawnRuleData data : dest.getSpawnRuleDatas())
+                data.remove();
             for(SpawnRule spawnRule : src.getSpawnRules())
                 SpawnRuleData.copySpawnRule(dest.createSpawnRuleData(), spawnRule);
+
+            for(AetherMudMessageData data : dest.getAttackMessageDatas())
+                data.remove();
             for(AetherMudMessage message : src.getAttackMessages())
                 AetherMudMessageData.copyAetherMudMessage(dest.createAttackMessageData(), message);
+
+
+            for(AetherMudMessageData data : dest.getBattleMessageDatas())
+                data.remove();
             for(AetherMudMessage message : src.getBattleMessages())
                 AetherMudMessageData.copyAetherMudMessage(dest.createBattleMessageData(), message);
+
+            for(AetherMudMessageData data : dest.getCriticalAttackMessageDatas())
+                data.remove();
             for(AetherMudMessage message : src.getCriticalAttackMessages())
                 AetherMudMessageData.copyAetherMudMessage(dest.createCriticalAttackMessageData(), message);
+
+            for(AetherMudMessageData data : dest.getIdleMessageDatas())
+                data.remove();
             for(AetherMudMessage message : src.getIdleMessages())
                 AetherMudMessageData.copyAetherMudMessage(dest.createIdleMessageData(), message);
         } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {