             @activeEvents[nodeID] = {}
         @activeEvents[nodeID][type] = true
         if !@registeredEvents[type]
-            @document.addEventListener(type, @_handler, true)
+            # TODO: unit test for this case
+            if type == 'keyup'
+                @document.addEventListener(type,
+                                           @specialEventHandlers._keyupListener,
+                                           true)
+            else
+                @document.addEventListener(type, @_handler, true)
             @registeredEvents[type] = true
 
     # listeners is an array of params objects for addEventListener.

            _pendingKeyup : false
            _queuedKeyEvents : []
            _keyupListener : (event) ->
                @_pendingKeyup = false
                # TODO: need batch processing method.
                #       then we can run keydown, keypress, update value, keyup

                    targetID : event.target.__nodeID
                    args : ['value', event.target.value]
                )
                rEvent = {}
                monitor.eventInitializers["#{EventTypeToGroup[event.type]}"](rEvent, event)
                @_queuedKeyEvents.push(rEvent)
                for ev in @_queuedKeyEvents
                    server.processEvent(ev)
                @_queuedKeyEvents = []

            # We defer the event until keyup has fired.  The order for
