I think a lot of plugins have this problem but most people aren't creating and deleting them a lot. My splitter has this issue but I solved that problem because I was too lazy to support splitters being destroyed. See, the real problem is that you have a "destroy" option! :-)
Since $this and other vars like $cluetip are being used within several of the event handlers by closure, the jQuery (and DOM) objects they contain are kept alive. You can't delete or null them out because they're used while the cluetip is active. Those handlers would need to be rewritten to use the local "this" instead and I think the handlers need to be declared outside the .each() function scope. You'd have to do the same with all the other cached variables like $cluetip as well. In addition to destroy detaching all the event handlers, it should remove any .data() or .metadata() that was put onto the element. The jQuery UI widgets have a destroy pattern, you can see how they do it. I also see a leak like the one discussed here: http://groups.google.com/group/jquery-dev/browse_frm/thread/2b1981f7530dedde# If you use any "modifying" operation in a chain and save the later part of the chain in a variable, the older part of the chain is still referenced by jQuery's .prevObject property. I can see some of those in the cluetip plugin: $dropShadow = $([]); for (var i=0; i < dropShadowSteps; i++) { $dropShadow = $dropShadow.add($('<div></div>').css({zIndex: cluezIndex-1, opacity:.1, top: 1+i, left: 1+i})); }; The .add() method creates a new object each time through the loop but the older objects are retained as a chain of .prevObject properties leading from the jQuery object held by the final $dropShadow variable. As long as the $dropShadow variable goes out of scope when the function is done at the end of the .each() call to that function, it should be reclaimed. At the moment $dropShadow is kept alive by the cluetipshow event handler so the whole chain can't be garbage collected.