diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
index 4dd50d683c..d893890d83 100644
--- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
+++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
@@ -215,5 +215,6 @@ namespace OpenSim.Region.Framework.Interfaces
         /// A 
         /// 
         Dictionary GetScriptStates();
+        Dictionary GetScriptStates(bool oldIDs);
     }
 }
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 84c371990c..1c6f2d183d 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -1040,6 +1040,11 @@ namespace OpenSim.Region.Framework.Scenes
         #endregion
 
         public void SaveScriptedState(XmlTextWriter writer)
+        {
+            SaveScriptedState(writer, false);
+        }
+
+        public void SaveScriptedState(XmlTextWriter writer, bool oldIDs)
         {
             XmlDocument doc = new XmlDocument();
             Dictionary states = new Dictionary();
@@ -1050,7 +1055,7 @@ namespace OpenSim.Region.Framework.Scenes
                 foreach (SceneObjectPart part in m_parts.Values)
                 {
                     
-                    Dictionary pstates = part.Inventory.GetScriptStates();
+                    Dictionary pstates = part.Inventory.GetScriptStates(oldIDs);
                     foreach (UUID itemid in pstates.Keys)
                     {
                         states.Add(itemid, pstates[itemid]);
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 04df35a0c9..f875224d6a 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -311,11 +311,12 @@ namespace OpenSim.Region.Framework.Scenes
                     if (m_part.ParentGroup.m_savedScriptState != null)
                         RestoreSavedScriptState(item.OldItemID, item.ItemID);
 
-                    lock (m_items)
-                    {
-                        m_items[item.ItemID].PermsMask = 0;
-                        m_items[item.ItemID].PermsGranter = UUID.Zero;
-                    }
+                    m_items.LockItemsForWrite(true);
+
+                    m_items[item.ItemID].PermsMask = 0;
+                    m_items[item.ItemID].PermsGranter = UUID.Zero;
+
+                    m_items.LockItemsForWrite(false);
                 
                     string script = Utils.BytesToString(asset.Data);
                     m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
@@ -713,15 +714,16 @@ namespace OpenSim.Region.Framework.Scenes
         {
             IList items = new List();
 
-            lock (m_items)
+            m_items.LockItemsForRead(true);
+
+            foreach (TaskInventoryItem item in m_items.Values)
             {
-                foreach (TaskInventoryItem item in m_items.Values)
-                {
-                    if (item.Name == name)
-                        items.Add(item);
-                }
+                if (item.Name == name)
+                    items.Add(item);
             }
 
+            m_items.LockItemsForRead(false);
+
             return items;
         }
         
@@ -1114,6 +1116,11 @@ namespace OpenSim.Region.Framework.Scenes
         }
         
         public Dictionary GetScriptStates()
+        {
+            return GetScriptStates(false);
+        }
+
+        public Dictionary GetScriptStates(bool oldIDs)
         {
             IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces();
 
@@ -1132,8 +1139,16 @@ namespace OpenSim.Region.Framework.Scenes
                             string n = e.GetXMLState(item.ItemID);
                             if (n != String.Empty)
                             {
-                                if (!ret.ContainsKey(item.ItemID))
-                                    ret[item.ItemID] = n;
+                                if (oldIDs)
+                                {
+                                    if (!ret.ContainsKey(item.OldItemID))
+                                        ret[item.OldItemID] = n;
+                                }
+                                else
+                                {
+                                    if (!ret.ContainsKey(item.ItemID))
+                                        ret[item.ItemID] = n;
+                                }
                                 break;
                             }
                         }