diff --git a/src/effects.js b/src/effects.js
index 97456cc..3a02656 100644
--- a/src/effects.js
+++ b/src/effects.js
@@ -105,8 +105,8 @@ jQuery.fn.extend({
 					.animate({opacity: to}, speed, callback);
 	},
 
-	animate: function( prop, speed, easing, callback ) {
-		var optall = jQuery.speed(speed, easing, callback);
+	animate: function( prop, speed, easing, callback, slot ) {
+		var optall = jQuery.speed(speed, easing, callback, slot);
 
 		if ( jQuery.isEmptyObject( prop ) ) {
 			return this.each( optall.complete );
@@ -177,10 +177,10 @@ jQuery.fn.extend({
 							end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
 						}
 
-						e.custom( start, end, unit );
+						e.custom( start, end, unit, optall.slot );
 
 					} else {
-						e.custom( start, val, "" );
+						e.custom( start, val, "", optall.slot );
 					}
 				}
 			});
@@ -198,16 +198,23 @@ jQuery.fn.extend({
 		}
 
 		this.each(function() {
+		
 			// go in reverse order so anything added to the queue during the loop is ignored
 			for ( var i = timers.length - 1; i >= 0; i-- ) {
-				if ( timers[i].elem === this ) {
-					if (gotoEnd) {
-						// force the next step to be the last
-						timers[i](true);
+				var slot = timers[i];
+				for ( var j = slot.childs.length - 1; j >= 0; j-- ) {
+					if ( slot.childs[j].elem === this ) {
+						if (gotoEnd) {
+							// force the next step to be the last
+							slot.childs[j](true);
+						}
+						slot.childs.splice(j, 1);
 					}
-
+				}
+				if ( !slot.childs.length  ) {
 					timers.splice(i, 1);
 				}
+
 			}
 		});
 
@@ -245,7 +252,7 @@ jQuery.each({
 });
 
 jQuery.extend({
-	speed: function( speed, easing, fn ) {
+	speed: function( speed, easing, fn, slot ) {
 		var opt = speed && typeof speed === "object" ? speed : {
 			complete: fn || !fn && easing ||
 				jQuery.isFunction( speed ) && speed,
@@ -256,6 +263,7 @@ jQuery.extend({
 		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
 			jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
 
+		opt.slot = slot || new jQuery.slot();
 		// Queueing
 		opt.old = opt.complete;
 		opt.complete = function() {
@@ -281,6 +289,12 @@ jQuery.extend({
 
 	timers: [],
 
+	slot: function(time) {
+		this.childs = [];
+		this.time = time || now();
+		this.added = false;
+	},
+
 	fx: function( elem, options, prop ) {
 		this.options = options;
 		this.elem = elem;
@@ -319,8 +333,8 @@ jQuery.fx.prototype = {
 	},
 
 	// Start an animation from one number to another
-	custom: function( from, to, unit ) {
-		this.startTime = now();
+	custom: function( from, to, unit, slot ) {
+		this.startTime = slot.time;
 		this.start = from;
 		this.end = to;
 		this.unit = unit || this.unit || "px";
@@ -329,13 +343,20 @@ jQuery.fx.prototype = {
 
 		var self = this;
 		function t( gotoEnd ) {
-			return self.step(gotoEnd);
+			return self.step(gotoEnd, slot);
 		}
 
 		t.elem = this.elem;
 
-		if ( t() && jQuery.timers.push(t) && !timerId ) {
-			timerId = setInterval(jQuery.fx.tick, 13);
+		if( t() ) {
+			slot.childs.push( t );
+			if( !slot.added ) {
+				jQuery.timers.push( slot );
+				slot.added = true;
+			}
+			if( ! timerId ) {
+				timerId = setInterval(jQuery.fx.tick, 13);
+			}
 		}
 	},
 
@@ -365,8 +386,8 @@ jQuery.fx.prototype = {
 	},
 
 	// Each step of an animation
-	step: function( gotoEnd ) {
-		var t = now(), done = true;
+	step: function( gotoEnd, slot ) {
+		var t = slot.time, done = true;
 
 		if ( gotoEnd || t >= this.options.duration + this.startTime ) {
 			this.now = this.end;
@@ -436,9 +457,17 @@ jQuery.extend( jQuery.fx, {
 		var timers = jQuery.timers;
 
 		for ( var i = 0; i < timers.length; i++ ) {
-			if ( !timers[i]() ) {
+			var slot = timers[i];
+			for ( var j = 0; j < slot.childs.length; j++ ) {
+				if ( !slot.childs[j]() ) {
+					slot.childs.splice(j--, 1);
+				}
+			}
+			slot.time = now();
+			if ( !slot.childs.length  ) {
 				timers.splice(i--, 1);
 			}
+
 		}
 
 		if ( !timers.length ) {
@@ -475,8 +504,10 @@ jQuery.extend( jQuery.fx, {
 
 if ( jQuery.expr && jQuery.expr.filters ) {
 	jQuery.expr.filters.animated = function( elem ) {
-		return jQuery.grep(jQuery.timers, function( fn ) {
-			return elem === fn.elem;
-		}).length;
+		return jQuery.grep(jQuery.timers, function( slot ) {
+				return jQuery.grep(slot.childs, function( fn ) {
+						return elem === fn.elem;
+					}).length;
+			}).length;
 	};
 }
