 		public function setProperty(name : String, newValue : Object) : DataProvider
 		{
 			var oldValue 			: Object			= _nameToProperty[name];
-			var oldMonitoredValue	: IWatchable		= oldValue as IWatchable;
-			var newMonitoredValue	: IWatchable		= newValue as IWatchable;
-			var oldPropertyNames	: Vector.<String>	= _propertyToNames[oldMonitoredValue];
-			var newPropertyNames	: Vector.<String>	= _propertyToNames[newMonitoredValue];
-			
-			if (oldMonitoredValue != null)
-			{
-				if (oldPropertyNames.length == 1)
-				{
-					oldMonitoredValue.changed.remove(propertyChangedHandler);
-					delete _propertyToNames[oldMonitoredValue];
-				}
-				else
-					oldPropertyNames.splice(oldPropertyNames.indexOf(name), 1);
-			}
-			
-			if (newMonitoredValue != null)
-				watchProperty(name, newMonitoredValue);
+			var oldWatchedValue	    : IWatchable		= oldValue as IWatchable;
+			var newWatchedValue	    : IWatchable		= newValue as IWatchable;
+			var oldPropertyNames	: Vector.<String>	= _propertyToNames[oldWatchedValue];
+			var newPropertyNames	: Vector.<String>	= _propertyToNames[newWatchedValue];
+			
+            if (newWatchedValue != oldWatchedValue)
+            {
+    			if (oldWatchedValue != null)
+    			    unwatchProperty(name, oldWatchedValue);
+    			
+    			if (newWatchedValue != null)
+    				watchProperty(name, newWatchedValue);
+            }
 			
 			var propertyAdded : Boolean = !_descriptor.hasOwnProperty(name);
 			

					newPropertyNames.push(name);
			}
		}
		
		public function removeProperty(name : String) : DataProvider
		{

				delete _nameToProperty[name];
				
				if (oldMonitoredValue != null)
					unwatchProperty(name, oldMonitoredValue);
				
	//			_changed.execute(this, 'dataDescriptor');
				_propertyRemoved.execute(this, name, bindingName, oldMonitoredValue);
