 		 */
 		public function removeObject(objectPath:Array):Boolean
 		{
-			if (objectPath && objectPath.length)
-			{
-				objectPath = objectPath.concat();
-				var childName:Object = objectPath.pop();
-				var parent:ILinkableObject = WeaveAPI.SessionManager.getObject(_rootObject, objectPath);
-				var hashMap:ILinkableHashMap = parent as ILinkableHashMap;
-				var dynamicObject:ILinkableDynamicObject = parent as ILinkableDynamicObject;
-				if (hashMap)
-				{
-					if (childName is Number)
-						childName = hashMap.getNames()[childName];
-					hashMap.removeObject(childName as String);
-					return true;
-				}
-				else if (dynamicObject)
-				{
-					dynamicObject.removeObject();
-					return true;
-				}
-			}
-			
-			externalWarning("No suitable parent from which to remove a child at path " + Compiler.stringify(objectPath));
+			if (!objectPath || !objectPath.length)
+			{
+				externalError("Cannot remove root object");
+				return false;
+			}
+			
+			var parentPath:Array = objectPath.concat();
+			var childName:Object = parentPath.pop();
+			var parent:ILinkableObject = WeaveAPI.SessionManager.getObject(_rootObject, parentPath);
+			
+			var hashMap:ILinkableHashMap = parent as ILinkableHashMap;
+			if (hashMap)
+			{
+				if (childName is Number)
+					childName = hashMap.getNames()[childName];
+				
+				if (hashMap.objectIsLocked(childName as String))
+				{
+					externalError("Object is locked and cannot be removed (path: {0})", Compiler.stringify(objectPath));
+					return false;
+				}
+				
+				hashMap.removeObject(childName as String);
+				return true;
+			}
+			
+			var dynamicObject:ILinkableDynamicObject = parent as ILinkableDynamicObject;
+			if (dynamicObject)
+			{
+				if (dynamicObject.locked)
+				{
+					externalError("Object is locked and cannot be removed (path: {0})", Compiler.stringify(objectPath));
+					return false;
+				}
+				
+				dynamicObject.removeObject();
+				return true;
+			}
+			
+			if (parent)
+				externalError("Parent object does not support dynamic children, so cannot remove child at path {0}", Compiler.stringify(objectPath));
+			else
+				externalError("No parent from which to remove a child at path {0}", Compiler.stringify(objectPath));
 			return false;
 		}
 		

			var classDef:Class = ClassUtils.getClassDefinition(classQName);
			if (classDef == null)
			{
				externalError("No class definition for " + Compiler.stringify(classQName));
				return false;
			}
			if (ClassUtils.isClassDeprecated(classQName))
				externalWarning(objectType + " is deprecated.");
			
			// stop if there is no path specified
			if (!objectPath || !objectPath.length)

				return true;
			}
			
			externalError("No ILinkableHashMap for which to reorder children at path {0}", Compiler.stringify(hashMapPath));
			return false;
		}
		
