         _source.removeEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown);
         _source.removeEventListener(KeyboardEvent.KEY_UP, handleKeyUp);
 
+        // shut down any timers
+        for each (var val :* in _down) {
+            if (val is Array) {
+                ((val as Array)[0] as Timer).stop();
+            }
+        }
         _down = new Dictionary();
-        _keysDown = 0;
-        if (_timer != null) {
-            _timer.stop();
-        }
     }
 
     protected function handleKeyDown (event :KeyboardEvent) :void
     {
-        if (undefined === _down[event.keyCode]) {
-            _keysDown++;
-            _down[event.keyCode] = event.clone();
+        var oldVal :* = _down[event.keyCode];
+        if (oldVal === undefined) {
+            _down[event.keyCode] = (_limitRate > 0) ? getTimer() : 0;
 
-            // maybe start the timer if we need to
-            if (_timer != null && !_timer.running) {
-                _timer.reset();
-                _timer.start();
+        } else if ((oldVal is Number) && _limitRate > 0) {
+            var timeUntilRepeat :Number = _limitRate - (getTimer() - Number(oldVal));
+
+            var t :Timer = new Timer((timeUntilRepeat <= 0) ? _limitRate : timeUntilRepeat);
+            t.addEventListener(TimerEvent.TIMER, handleTimerEvent);
+            _down[event.keyCode] = [ t, event ];
+            t.start();
+            if (timeUntilRepeat > 0) {
+                // don't dispatch this event, wait for our first repeat time
+                return;
             }
 
-            // only dispatch if we're not limiting this key
-            dispatchEvent(event);
+        } else {
+            // eat the event
+            return;
         }
+
+        // otherwise, dispatch the event
+        dispatchEvent(event);
     }
 
     protected function handleKeyUp (event :KeyboardEvent) :void
     {
-        if (undefined !== _down[event.keyCode]) {
+        var oldVal :* = _down[event.keyCode];
+        if (oldVal !== undefined) {
+            if (oldVal is Array) {
+                ((oldVal as Array)[0] as Timer).stop();
+            }
             delete _down[event.keyCode];
-            _keysDown--;
-
-            if (_timer != null && _keysDown == 0) {
-                _timer.stop();
-            }
         }
 
         // always dispatch an up

    public function KeyRepeatLimiter (source :IEventDispatcher, limitRate :int = 0)
    {
        _source = source;

        _source.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown);
        _source.addEventListener(KeyboardEvent.KEY_UP, handleKeyUp);

        if (limitRate > 0) {
            _timer = new Timer(limitRate);
            _timer.addEventListener(TimerEvent.TIMER, handleTimerEvent);
        }
    }

    /**

import flash.utils.Dictionary;
import flash.utils.Timer;

import flash.utils.getTimer;

/**
 * A very simple class that adapts the KeyboardEvents generated by some source and altering
 * (or blocking) the key repeat rate.
