 				delete _nameToProperty[name];
 				
 				if (oldMonitoredValue != null)
-				{
-					if (oldPropertyNames.length == 1)
-					{
-						oldMonitoredValue.changed.remove(propertyChangedHandler);
-						delete _propertyToNames[oldMonitoredValue];
-					}
-					else
-						oldPropertyNames.splice(oldPropertyNames.indexOf(name), 1);
-				}
+					unwatchProperty(name, oldMonitoredValue);
 				
 	//			_changed.execute(this, 'dataDescriptor');
 				_propertyRemoved.execute(this, name, bindingName, oldMonitoredValue);

		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 propertyAdded : Boolean = !_descriptor.hasOwnProperty(name);
			

					newPropertyNames.push(name);
			}
		}
        
        protected function unwatchProperty(name : String, property : IWatchable) : void
        {
            var oldPropertyNames	: Vector.<String>	= _propertyToNames[property];
            
            if (oldPropertyNames.length == 1)
            {
                property.changed.remove(propertyChangedHandler);
                delete _propertyToNames[property];
            }
            else
            {
                var numPropertyNames : uint = oldPropertyNames.length - 1;
                
                oldPropertyNames[oldPropertyNames.indexOf(name)] = oldPropertyNames[numPropertyNames];
                oldPropertyNames.length = numPropertyNames;
            }
        }
		
		public function removeProperty(name : String) : DataProvider
		{
