                     targetID : event.target.__nodeID
                     args : ['value', event.target.value]
                 )
-                for rEvent in @_queuedKeyEvents
-                    server.processEvent(rEvent)
+                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

            keydown : (remoteEvent, clientEvent) ->
                if !@_pendingKeyup
                    @_pendingKeyup = true
                    # TODO: this needs to listen on document, not target.
                    #       this could conflict with a listener we've already
                    #       added...
                    #       that would be called first, since it was registered
                    #       first.
                    #       TODO: for now, keyup listening on server will be broken.
                    #       TODO: if the server asks for keyup event, we register the
                    #       special handler.
                    monitor.document.addEventListener('keyup', @_keyupListener.bind(this))
                @_queuedKeyEvents.push(remoteEvent)

            keypress : (remoteEvent, clientEvent) ->
                if !@_pendingKeyup
                    @_pendingKeyup = true
                    monitor.document.addEventListener('keyup', @_keyupListener.bind(this))
                @_queuedKeyEvents.push(remoteEvent)

            # Valid targets:

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