Index: js/admin-bar.dev.js
===================================================================
--- js/admin-bar.dev.js	(revision 19592)
+++ js/admin-bar.dev.js	(working copy)
@@ -59,6 +59,13 @@
 			target.siblings('.ab-sub-wrapper').find('.ab-item').each(refresh);
 		});
 
+		$('#wpadminbar').click(function(e) {
+			if(e.target.id != "wpadminbar") return;
+			e.preventDefault();
+
+			$('html, body').animate({ scrollTop: 0 }, 'fast');
+		});
+
 	});
 } else {
 	(function(d, w) {
@@ -180,6 +187,45 @@
 			return false;
 		};
 
+		scrollToTop = function(t) {
+			if(t.id != 'wpadminbar') return;
+
+			var startY = (function() {
+					if (self.pageYOffset) return self.pageYOffset;
+
+					if (document.body.scrollTop) return document.body.scrollTop;
+
+					return 0;
+				})(),
+				stopY = 0,
+				distance = stopY > startY ? stopY - startY : startY - stopY;
+
+			if (distance < 100) {
+				scrollTo(0, stopY); return;
+			}
+
+			var speed = Math.round(distance / 100),
+				step = Math.round(distance / 25),
+				leapY = stopY > startY ? startY + step : startY - step,
+				timer = 0;
+
+			speed = (speed >= 20) ? 20 : speed;
+
+			if (stopY > startY) {
+				for ( var i=startY; i<stopY; i+=step ) {
+					setTimeout("window.scrollTo(0, "+leapY+")", timer * speed);
+					leapY += step; if (leapY > stopY) leapY = stopY; timer++;
+				}
+
+				return;
+			}
+
+			for ( var i=startY; i>stopY; i-=step ) {
+				setTimeout("window.scrollTo(0, "+leapY+")", timer * speed);
+				leapY -= step; if (leapY < stopY) leapY = stopY; timer++;
+			}
+		};
+
 		addEvent(w, 'load', function() {
 			aB = d.getElementById('wpadminbar');
 
@@ -198,6 +244,10 @@
 				});
 
 				addEvent(aB, 'click', clickShortlink );
+
+				addEvent(aB, 'click', function(e){
+					scrollToTop(e.target);
+				});
 			}
 
 			if ( w.location.hash )
