var fn = handler;
 
                        // Create unique handler function, wrapped around original handler
-                       handler = this.proxy( fn, function() {
-                               // Pass arguments and context to original handler
-                               return fn.apply(this, arguments);
-                       });
+                       handler = this.proxy( fn );
 
                        // Store data in unique handler
                        handler.data = data;
        },
 
        proxy: function( fn, proxy ){
+               proxy = proxy || function(){ return fn.apply(this, arguments); };
                // Set the guid of unique handler to the same of original handler, so it can be removed
                proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
                // So proxy can be declared as an argument
                                                        remove++;
                                        });
                                        
-                                       if ( remove <= 1 )
+                                       if ( remove < 1 )
                                                jQuery.event.remove( this, namespaces[0], liveHandler );
                                }
                        }
        },
        
        live: function( type, fn ){
-               jQuery(document).bind( liveConvert(type, this.selector), this.selector, fn );
+               var proxy = jQuery.event.proxy( fn );
+               proxy.guid += this.selector;
+
+               jQuery(document).bind( liveConvert(type, this.selector), this.selector, proxy );
+
                return this;
        },
        
        die: function( type, fn ){
-               jQuery(document).unbind( liveConvert(type, this.selector), fn );
+               jQuery(document).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector } : null );
                return this;
        }
 });
 
 });
 
 test(".live()/.die()", function() {
-       expect(30);
+       expect(34);
 
        var submit = 0, div = 0, livea = 0, liveb = 0;
 
        jQuery("#anchor2").trigger("click");
        equals( window.location.hash, hash, "e.preventDefault() worked" );
        jQuery("#anchor2").die("click");
+
+       // Test binding the same handler to multiple points
+       var called = 0;
+       function callback(){ called++; return false; }
+
+       jQuery("#nothiddendiv").live("click", callback);
+       jQuery("#anchor2").live("click", callback);
+
+       jQuery("#nothiddendiv").trigger("click");
+       equals( called, 1, "Verify that only one click occurred." );
+
+       jQuery("#anchor2").trigger("click");
+       equals( called, 2, "Verify that only one click occurred." );
+
+       // Make sure that only one callback is removed
+       jQuery("#anchor2").die("click", callback);
+
+       jQuery("#nothiddendiv").trigger("click");
+       equals( called, 3, "Verify that only one click occurred." );
+
+       jQuery("#anchor2").trigger("click");
+       equals( called, 3, "Verify that only one click occurred." );
+
+       // Cleanup
+       jQuery("#nothiddendiv").die("click", callback);
 });
 
 /*