diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 11754eaca8..7df3e50792 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -2376,9 +2376,19 @@ namespace OpenSim.Region.Framework.Scenes
             }
         }
 
-        public void AttachObject(IClientAPI controllingClient, uint localID, uint attachPoint, Quaternion rot, Vector3 pos, bool silent)
+        /// 
+        /// Attach an object.
+        /// 
+        /// 
+        /// 
+        /// 
+        /// 
+        /// 
+        /// 
+        /// true if the object was successfully attached, false otherwise
+        public bool AttachObject(IClientAPI controllingClient, uint localID, uint attachPoint, Quaternion rot, Vector3 pos, bool silent)
         {
-            m_sceneGraph.AttachObject(controllingClient, localID, attachPoint, rot, pos, silent);
+            return m_sceneGraph.AttachObject(controllingClient, localID, attachPoint, rot, pos, silent);
         }
 
         public void AttachObject(IClientAPI remoteClient, uint AttachmentPt, UUID itemID, SceneObjectGroup att)
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index f74fd5d93f..fc2798d7ab 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -478,46 +478,59 @@ namespace OpenSim.Region.Framework.Scenes
             if (part == null)
                 return;
 
-            if (!m_parentScene.Permissions.CanTakeObject(
-                    part.UUID, remoteClient.AgentId))
+            if (!m_parentScene.Permissions.CanTakeObject(part.UUID, remoteClient.AgentId))
                 return;
 
             // Calls attach with a Zero position
-            AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, Vector3.Zero, false);
-            m_parentScene.SendAttachEvent(objectLocalID, part.ParentGroup.GetFromItemID(), remoteClient.AgentId);
-
-            // Save avatar attachment information
-            ScenePresence presence;
-            if (m_parentScene.AvatarFactory != null && m_parentScene.TryGetAvatar(remoteClient.AgentId, out presence))
+            if (AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, Vector3.Zero, false))
             {
-                m_log.Info("[SCENE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId + ", AttachmentPoint: " + AttachmentPt);
-                m_parentScene.AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance);
+                m_parentScene.SendAttachEvent(objectLocalID, part.ParentGroup.GetFromItemID(), remoteClient.AgentId);
+    
+                // Save avatar attachment information
+                ScenePresence presence;
+                if (m_parentScene.AvatarFactory != null && m_parentScene.TryGetAvatar(remoteClient.AgentId, out presence))
+                {
+                    m_log.Info(
+                        "[SCENE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId 
+                            + ", AttachmentPoint: " + AttachmentPt);
+                    
+                    m_parentScene.AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance);
+                }
             }
         }
 
-        public SceneObjectGroup RezSingleAttachment(
-            IClientAPI remoteClient, UUID itemID, uint AttachmentPt)
+        /// 
+        /// Rez an attachment
+        /// 
+        /// 
+        /// 
+        /// 
+        /// The scene object that was attached.  Null if the scene object could not be found
+        public SceneObjectGroup RezSingleAttachment(IClientAPI remoteClient, UUID itemID, uint AttachmentPt)
         {
             SceneObjectGroup objatt = m_parentScene.RezObject(remoteClient,
                 itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true,
                 false, false, remoteClient.AgentId, true);
 
-
             if (objatt != null)
             {
                 bool tainted = false;
                 if (AttachmentPt != 0 && AttachmentPt != objatt.GetAttachmentPoint())
                     tainted = true;
 
-                AttachObject(remoteClient, objatt.LocalId, AttachmentPt, Quaternion.Identity, objatt.AbsolutePosition, false);
-                objatt.ScheduleGroupForFullUpdate();
-                if (tainted)
-                    objatt.HasGroupChanged = true;
-
-                // Fire after attach, so we don't get messy perms dialogs
-                // 3 == AttachedRez
-                objatt.CreateScriptInstances(0, true, m_parentScene.DefaultScriptEngine, 3);
+                if (AttachObject(
+                    remoteClient, objatt.LocalId, AttachmentPt, Quaternion.Identity, objatt.AbsolutePosition, false))
+                {
+                    objatt.ScheduleGroupForFullUpdate();
+                    if (tainted)
+                        objatt.HasGroupChanged = true;
+    
+                    // Fire after attach, so we don't get messy perms dialogs
+                    // 3 == AttachedRez
+                    objatt.CreateScriptInstances(0, true, m_parentScene.DefaultScriptEngine, 3);
+                }
             }
+            
             return objatt;
         }
 
@@ -554,7 +567,17 @@ namespace OpenSim.Region.Framework.Scenes
             }
         }
 
-        protected internal void AttachObject(
+        /// 
+        /// Attach a scene object to an avatar.
+        /// 
+        /// 
+        /// 
+        /// 
+        /// 
+        /// 
+        /// 
+        /// true if the attachment was successful, false otherwise
+        protected internal bool AttachObject(
             IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, Quaternion rot, Vector3 attachPos, bool silent)
         {
             SceneObjectGroup group = GetGroupByPrim(objectLocalID);
@@ -583,10 +606,8 @@ namespace OpenSim.Region.Framework.Scenes
                         // Stick it on left hand with Zero Offset from the attachment point.
                         AttachmentPt = (uint)AttachmentPoint.LeftHand;
                         attachPos = Vector3.Zero;
-
                     }
 
-
                     group.SetAttachmentPoint((byte)AttachmentPt);
                     group.AbsolutePosition = attachPos;
 
@@ -609,15 +630,21 @@ namespace OpenSim.Region.Framework.Scenes
                     // it get cleaned up
                     //
                     group.RootPart.RemFlag(PrimFlags.TemporaryOnRez);
-                    group.HasGroupChanged = false;
+                    group.HasGroupChanged = false;                   
                 }
                 else
                 {
                     remoteClient.SendAgentAlertMessage("You don't have sufficient permissions to attach this object", false);
+                    return false;
                 }
             }
             else
+            {
                 m_log.DebugFormat("[SCENE GRAPH]: AttachObject found no such scene object {0}", objectLocalID);
+                return false;
+            }
+
+            return true;
         }
 
         protected internal ScenePresence CreateAndAddChildScenePresence(IClientAPI client, AvatarAppearance appearance)