Index: wp-includes/js/tinymce/plugins/wordpress/editor_plugin.dev.js
===================================================================
--- wp-includes/js/tinymce/plugins/wordpress/editor_plugin.dev.js	(revision 14185)
+++ wp-includes/js/tinymce/plugins/wordpress/editor_plugin.dev.js	(working copy)
@@ -9,7 +9,7 @@
 		mceTout : 0,
 
 		init : function(ed, url) {
-			var t = this, tbId = ed.getParam('wordpress_adv_toolbar', 'toolbar2'), last = 0, moreHTML, nextpageHTML;
+			var t = this, tbId = ed.getParam('wordpress_adv_toolbar', 'toolbar2'), moreHTML, nextpageHTML;
 			moreHTML = '<img src="' + url + '/img/trans.gif" class="mceWPmore mceItemNoResize" title="'+ed.getLang('wordpress.wp_more_alt')+'" />';
 			nextpageHTML = '<img src="' + url + '/img/trans.gif" class="mceWPnextpage mceItemNoResize" title="'+ed.getLang('wordpress.wp_page_alt')+'" />';
 
@@ -162,10 +162,11 @@
 			// Word count if script is loaded
 			if ( 'undefined' != typeof wpWordCount ) {
 				ed.onKeyUp.add(function(ed, e) {
-					if ( e.keyCode == last ) return;
-					if ( 13 == e.keyCode || 8 == last || 46 == last ) wpWordCount.wc( ed.getContent({format : 'raw'}) );
-					last = e.keyCode;
+					wpWordCount.keyup( e, function(){ return ed.getContent({format : 'raw'}); });
 				});
+				ed.onPaste.add(function(ed, e) {
+					wpWordCount.update();
+				});
 			};
 
 			ed.onSaveContent.add(function(ed, o) {
Index: wp-admin/js/word-count.dev.js
===================================================================
--- wp-admin/js/word-count.dev.js	(revision 14185)
+++ wp-admin/js/word-count.dev.js	(working copy)
@@ -3,34 +3,74 @@
 	wpWordCount = {
 
 		init : function() {
-			var t = this, last = 0, co = $('#content');
+			var t = this, co = $('#content'), fn = function() { return co.val(); };
 
 			$('#wp-word-count').html( wordCountL10n.count.replace( /%d/, '<span id="word-count">0</span>' ) );
-			t.block = 0;
-			t.wc(co.val());
+			t.block = false;
+			t.pending = false;
+			t.last = 0;
+			
+			t.wc( fn );
+			
 			co.keyup( function(e) {
-				if ( e.keyCode == last ) return true;
-				if ( 13 == e.keyCode || 8 == last || 46 == last ) t.wc(co.val());
-				last = e.keyCode;
-				return true;
+				t.keyup( e, fn );
+			}).bind('paste select', function(){
+				t.update();
 			});
 		},
+		
+		keyup : function( e, fn ) {
+			if ( ! (e instanceof $.Event) ) e = $.event.fix(e);
+			
+			var t = this, key = e.which;
+			
+			if ( key == t.last ) return;
+			
+			if ( t.block && 32 == key && 8 != t.last && 46 != t.last ) t.increment();
+			if ( 32 == key || 13 == key || 8 == t.last || 46 == t.last ) t.wc( fn );
+			
+			t.last = key;
+		},
+		
+		update : function() {
+			this.last = 8;
+		},
+		
+		increment : function() {
+			var w = $('#word-count');
+			w.html( (w.html() * 1 + 1).toString() );
+		},
+		
+		wc : function(fn) {
+			var t = this;
 
-		wc : function(tx) {
-			var t = this, w = $('#word-count'), tc = 0;
+			if ( t.block ) {
+				t.pending = fn;
+				return;
+			}
+			t.block = true;
+			t.pending = false;
+			
+			var w = $('#word-count'), tc = 0, tx = fn();
 
-			if ( t.block ) return;
-			t.block = 1;
-
 			setTimeout( function() {
+				var time = new Date().getMilliseconds();
+			
 				if ( tx ) {
+					tx = tx + " ";
 					tx = tx.replace( /<.[^<>]*?>/g, ' ' ).replace( /&nbsp;|&#160;/gi, ' ' );
 					tx = tx.replace( /[0-9.(),;:!?%#$¿'"_+=\\/-]*/g, '' );
 					tx.replace( /\S\s+/g, function(){tc++;} );
 				}
 				w.html(tc.toString());
+				
+				time = ( new Date().getMilliseconds() - time ) * 100;
+				time = ( time > 2000 ) ? time : 2000;
 
-				setTimeout( function() { t.block = 0; }, 2000 );
+				setTimeout( function() {
+					t.block = false;
+					if( t.pending ) t.wc(t.pending);
+				}, time );
 			}, 1 );
 		}
 	}
