Index: /trunk/autoquest-misc/src/main/java/de/ugoe/cs/autoquest/keyboardmaps/VirtualKey.java
===================================================================
--- /trunk/autoquest-misc/src/main/java/de/ugoe/cs/autoquest/keyboardmaps/VirtualKey.java	(revision 1700)
+++ /trunk/autoquest-misc/src/main/java/de/ugoe/cs/autoquest/keyboardmaps/VirtualKey.java	(revision 1701)
@@ -289,4 +289,15 @@
     /**
      * <p>
+     * Returns the keyCode of the virtual key.
+     * </p>
+     * 
+     * @return the keyCode.
+     */
+    public int getVirtualKeyCode() {
+        return virtualKeyCode;
+    }
+
+    /**
+     * <p>
      * Returns whether the key is a combination key (e.g., shift, alt) or not.
      * </p>
Index: /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/autoquest/plugin/jfc/commands/CMDgenerateJacaretoReplay.java
===================================================================
--- /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/autoquest/plugin/jfc/commands/CMDgenerateJacaretoReplay.java	(revision 1700)
+++ /trunk/autoquest-plugin-jfc/src/main/java/de/ugoe/cs/autoquest/plugin/jfc/commands/CMDgenerateJacaretoReplay.java	(revision 1701)
@@ -91,4 +91,6 @@
     private JFCGUIElement currentFocus;
     private StructureNode structure;
+    private StructureNode lastKeySequenceEvent;
+    private StructureNode lastKeyTypedEvent;
     private StructureNode lastMouseClickEvent;
     private StructureNode lastFocusChangeEvent;
@@ -180,11 +182,17 @@
 
                 if (event.getType() instanceof MouseButtonDown) {
+                    lastKeySequenceEvent = null;
+
                     lastMouseClickEvent = new StructureNode("MouseClick");
                     writeMouseClickEvent(writer, event, 501);
                 }
                 else if (event.getType() instanceof MouseButtonUp) {
+                    lastKeySequenceEvent = null;
+
                     writeMouseClickEvent(writer, event, 502);
                 }
                 else if (event.getType() instanceof MouseClick) {
+                    lastKeySequenceEvent = null;
+
                     writeMouseClickEvent(writer, event, 500);
                     // FIXME: don't always write an item action
@@ -207,11 +215,17 @@
                 }
                 else if (event.getType() instanceof KeyboardFocusChange) {
+                    lastKeySequenceEvent = null;
+
                     writeFocusChangeEvent(writer, event);
                 }
                 else if (event.getType() instanceof KeyPressed) {
-                    // writeKeyEvent(writer, event, 401);
+                    if (lastKeySequenceEvent == null) {
+                        lastKeySequenceEvent = structure.add("KeySequence");
+                    }
+                    lastKeyTypedEvent = lastKeySequenceEvent.add("KeyTyped");
+                    writeKeyEvent(writer, event, 401);
                 }
                 else if (event.getType() instanceof KeyReleased) {
-                    // writeKeyEvent(writer, event, 402);
+                    writeKeyEvent(writer, event, 402);
                 }
             }
@@ -445,6 +459,6 @@
         writeLine(writer,
             "<KeyInfo "
-            + "keyCode=\"" + getKeyCode(info.getKey()) + "\" "
-            + "keyChar=\"" + getKeyChar(info.getKey()) + "\" "
+            + "keyCode=\"" + info.getKey().getVirtualKeyCode() + "\" "
+            + "keyChar=\"" + getKeyChar(info.getKey().getVirtualKeyCode()) + "\" "
             + "modifiers=\"0\" />"
         );
@@ -452,15 +466,14 @@
         writeLine(writer, "</KeyEvent>");
         
-        // TODO: keyevent structure part
+        lastKeyTypedEvent.addRecordable();
     }
     
-    private String getKeyChar (VirtualKey key) {
-        // TODO
-        return "";
-    }
-    
-    private int getKeyCode (VirtualKey key) {
-        // TODO
-        return -1;
+    private String getKeyChar (int keyCode) {
+        if (keyCode >= 32 && keyCode < 127) {
+            return String.valueOf((char)keyCode);
+        }
+        else {
+            return "_NO_LEGAL_XML_CHAR";
+        }
     }
 }
