 
 					# add in watcher
 					watcher.nodes.push node
-					emitSignal watcher, 'onAdd', node
+					if watcher._nodesToAdd.push(node) is 1
+						watchersWithNodesToAdd.push watcher
 				else if inWatchers and inWatchers[watcherUid] and not watcher.test(node)
 					# remove from node
 					node._inWatchers[watcherUid] = false
 
 					# remove from watcher
 					utils.removeFromUnorderedArray watcher.nodes, node
-					emitSignal watcher, 'onRemove', node
+					if watcher._nodesToRemove.push(node) is 1
+						watchersWithNodesToRemove.push watcher
 
 			# check recursively
 			if update & CHECK_WATCHERS_CHILDREN and node instanceof Tag

					# remove from watcher
					nodes[i] = nodes[n-1]
					nodes.pop()
					emitSignal watcher, 'onRemove', node
					n--

			# find new nodes

			pending = false
			{watchers} = Watcher

			# update watchers
			for watcher in watchers
				if watcher.node
					updateWatcher watcher

			# clear nodes
			for watcher in watchers
				if watcher.node
					clearRec watcher.node

			# emit signals
			while watcher = watchersWithNodesToRemove.pop()
				nodesToRemove = watcher._nodesToRemove
				while node = nodesToRemove.pop()
					emitSignal watcher, 'onRemove', node
			while watcher = watchersWithNodesToAdd.pop()
				nodesToAdd = watcher._nodesToAdd
				while node = nodesToAdd.pop()
					emitSignal watcher, 'onAdd', node
			return

		(node) ->
			node._checkWatchers = CHECK_WATCHERS_THIS
			tmp = node
			while tmp
				if tmp._checkWatchers & CHECK_WATCHERS_CHILDREN
					break
				tmp._checkWatchers |= CHECK_WATCHERS_CHILDREN
				tmp = tmp._parent

			unless pending
