diff --git a/apps/openmw/mwgui/inventorywindow.cpp b/apps/openmw/mwgui/inventorywindow.cpp
index ffd81e98b..c14971f6e 100644
--- a/apps/openmw/mwgui/inventorywindow.cpp
+++ b/apps/openmw/mwgui/inventorywindow.cpp
@@ -163,6 +163,14 @@ namespace MWGui
         MWWorld::Ptr object = item.mBase;
         int count = item.mCount;
 
+        // Bound items may not be moved
+        if (item.mBase.getCellRef().mRefID.size() > 6
+                && item.mBase.getCellRef().mRefID.substr(0,6) == "bound_")
+        {
+            MWBase::Environment::get().getWindowManager()->messageBox("#{sBarterDialog12}");
+            return;
+        }
+
         if (item.mType == ItemStack::Type_Equipped)
         {
             MWWorld::InventoryStore& invStore = MWWorld::Class::get(mPtr).getInventoryStore(mPtr);
diff --git a/apps/openmw/mwgui/pickpocketitemmodel.cpp b/apps/openmw/mwgui/pickpocketitemmodel.cpp
index 16be5f6cc..13ee4396d 100644
--- a/apps/openmw/mwgui/pickpocketitemmodel.cpp
+++ b/apps/openmw/mwgui/pickpocketitemmodel.cpp
@@ -40,6 +40,14 @@ namespace MWGui
         for (size_t i = 0; i<mSourceModel->getItemCount(); ++i)
         {
             const ItemStack& item = mSourceModel->getItem(i);
+
+            // Bound items may not be stolen
+            if (item.mBase.getCellRef().mRefID.size() > 6
+                    && item.mBase.getCellRef().mRefID.substr(0,6) == "bound_")
+            {
+                continue;
+            }
+
             if (std::find(mHiddenItems.begin(), mHiddenItems.end(), item) == mHiddenItems.end()
                     && item.mType != ItemStack::Type_Equipped)
                 mItems.push_back(item);
diff --git a/apps/openmw/mwgui/tradeitemmodel.cpp b/apps/openmw/mwgui/tradeitemmodel.cpp
index e836355d3..5c12843da 100644
--- a/apps/openmw/mwgui/tradeitemmodel.cpp
+++ b/apps/openmw/mwgui/tradeitemmodel.cpp
@@ -154,6 +154,13 @@ namespace MWGui
                 if(!MWWorld::Class::get(base).canSell(base, services))
                     continue;
 
+                // Bound items may not be bought
+                if (item.mBase.getCellRef().mRefID.size() > 6
+                        && item.mBase.getCellRef().mRefID.substr(0,6) == "bound_")
+                {
+                    continue;
+                }
+
                 // don't show equipped items
                 if(mMerchant.getTypeName() == typeid(ESM::NPC).name())
                 {
diff --git a/apps/openmw/mwmechanics/actors.cpp b/apps/openmw/mwmechanics/actors.cpp
index 13b5da11a..840167e3a 100644
--- a/apps/openmw/mwmechanics/actors.cpp
+++ b/apps/openmw/mwmechanics/actors.cpp
@@ -695,6 +695,11 @@ namespace MWMechanics
 
                 iter->second->kill();
 
+                // Reset magic effects and recalculate derived effects
+                // One case where we need this is to make sure bound items are removed upon death
+                stats.setMagicEffects(MWMechanics::MagicEffects());
+                calculateCreatureStatModifiers(iter->first, 0);
+
                 ++mDeathCount[cls.getId(iter->first)];
 
                 if(cls.isEssential(iter->first))
diff --git a/components/esm/cellref.hpp b/components/esm/cellref.hpp
index 47cb0b99e..5f1066cf8 100644
--- a/components/esm/cellref.hpp
+++ b/components/esm/cellref.hpp
@@ -20,7 +20,7 @@ namespace ESM
         public:
 
             int mRefnum;           // Reference number
-            std::string mRefID;    // ID of object being referenced
+            std::string mRefID;    // ID of object being referenced (must be lowercase)
 
             float mScale;          // Scale applied to mesh
 
@@ -89,4 +89,4 @@ namespace ESM
     };
 }
 
-#endif
\ No newline at end of file
+#endif