     				var flags	: uint		= signature.getFlags(i);
     				
     				if (flags & Signature.SOURCE_MESH)
-    					meshBindings.removeCallback(key, bindingsPropertyChangedHandler);
+                    {
+                        meshBindingsUsageCount[key]--;
+                        if (meshBindingsUsageCount[key] == 0)
+                        {
+    					    meshBindings.removeCallback(key, bindingsPropertyChangedHandler);
+                            delete meshBindingsUsageCount[key];
+                        }
+                    }
     				else
-    					sceneBindings.removeCallback(key, bindingsPropertyChangedHandler);
+                    {
+                        _sceneBindingsUsageCount[key]--;
+                        if (meshBindingsUsageCount[key] == 0)
+                        {
+        					sceneBindings.removeCallback(key, bindingsPropertyChangedHandler);
+                            delete _sceneBindingsUsageCount[key];
+                        }
+                    }
     			}
     			
     			// release the shader

				
				unbind(passInstance, drawCall, meshBindings);
			}
			
			// update indexes
			delete _meshToDrawCalls[mesh];
			delete _meshBindingsToMesh[meshBindings];
			
			var meshesWithSameEffect : Vector.<Mesh> = _effectToMeshes[effect];


							  drawCall		: DrawCall,
							  meshBindings	: DataBindings) : void
		{
			var sceneBindings	        : DataBindings	= _scene.bindings;
            var meshBindingsUsageCount  : Object        = _meshBindingsUsageCount[meshBindings];
			var signature       	    : Signature		= passInstance.signature;
			var numKeys	    	    	: uint			= signature.numKeys;

            // add callbacks on binding changes
			for (var i : uint = 0; i < numKeys; ++i)
			{
				var key 	: String	= signature.getKey(i);
