Added key press support in 3D viewer

Change-Id: I97451e4cdcb87fc60cb720addd2c2c1d95392831
diff --git a/bundles/addons/org.eclipse.apogy.addons.edit/src-gen-custom/org/eclipse/apogy/addons/provider/TrajectoryPickingToolCustomItemProvider.java b/bundles/addons/org.eclipse.apogy.addons.edit/src-gen-custom/org/eclipse/apogy/addons/provider/TrajectoryPickingToolCustomItemProvider.java
index 5d3f65d..1fa63db 100644
--- a/bundles/addons/org.eclipse.apogy.addons.edit/src-gen-custom/org/eclipse/apogy/addons/provider/TrajectoryPickingToolCustomItemProvider.java
+++ b/bundles/addons/org.eclipse.apogy.addons.edit/src-gen-custom/org/eclipse/apogy/addons/provider/TrajectoryPickingToolCustomItemProvider.java
@@ -39,6 +39,15 @@
 
 		// Adds Simple3DTool Text.
 		label += " (";
+		label += getSuffix(trajectoryPickingTool);
+		label += ")";
+
+		return label;
+	}
+	
+	protected String getSuffix(TrajectoryPickingTool trajectoryPickingTool)
+	{
+		String label ="";
 		String simpleToolText = getSimple3DToolText(trajectoryPickingTool);
 		if (simpleToolText.length() > 0) {
 			label += simpleToolText + ", ";
@@ -49,17 +58,9 @@
 		if (trajectoryPickingTool.getActivePath() != null) {
 			String distanceText = this.decimalFormat.format(trajectoryPickingTool.getActivePath().getLength()) + " m";
 			label += ", Active Path Lenght : " + distanceText;
-//
-//			String pathId = trajectoryPickingTool.getActivePath().getNodeId();
-//			if(pathId != null && pathId.length() > 0)
-//			{
-//				label += ", " + pathId;
-//			}
 		}
-
-		label += ")";
-
+		
 		return label;
 	}
-
+	
 }
diff --git a/bundles/addons/org.eclipse.apogy.addons.ros.ui/src-gen/org/eclipse/apogy/addons/ros/ui/ApogyAddonsROSUIPackage.java b/bundles/addons/org.eclipse.apogy.addons.ros.ui/src-gen/org/eclipse/apogy/addons/ros/ui/ApogyAddonsROSUIPackage.java
index 3929c6d..0570b86 100644
--- a/bundles/addons/org.eclipse.apogy.addons.ros.ui/src-gen/org/eclipse/apogy/addons/ros/ui/ApogyAddonsROSUIPackage.java
+++ b/bundles/addons/org.eclipse.apogy.addons.ros.ui/src-gen/org/eclipse/apogy/addons/ros/ui/ApogyAddonsROSUIPackage.java
@@ -283,6 +283,24 @@
 	int TF_DISPLAY3_DTOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON = ApogyAddonsPackage.SIMPLE3_DTOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON;
 
 	/**
+	 * The operation id for the '<em>Key Pressed</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TF_DISPLAY3_DTOOL___KEY_PRESSED__CHAR = ApogyAddonsPackage.SIMPLE3_DTOOL___KEY_PRESSED__CHAR;
+
+	/**
+	 * The operation id for the '<em>Key Released</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TF_DISPLAY3_DTOOL___KEY_RELEASED__CHAR = ApogyAddonsPackage.SIMPLE3_DTOOL___KEY_RELEASED__CHAR;
+
+	/**
 	 * The operation id for the '<em>Ros Init</em>' operation.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
diff --git a/bundles/addons/org.eclipse.apogy.addons.sensors.fov.ui/src-gen/org/eclipse/apogy/addons/sensors/fov/ui/ApogyAddonsSensorsFOVUIPackage.java b/bundles/addons/org.eclipse.apogy.addons.sensors.fov.ui/src-gen/org/eclipse/apogy/addons/sensors/fov/ui/ApogyAddonsSensorsFOVUIPackage.java
index 826b594..c1f2381 100644
--- a/bundles/addons/org.eclipse.apogy.addons.sensors.fov.ui/src-gen/org/eclipse/apogy/addons/sensors/fov/ui/ApogyAddonsSensorsFOVUIPackage.java
+++ b/bundles/addons/org.eclipse.apogy.addons.sensors.fov.ui/src-gen/org/eclipse/apogy/addons/sensors/fov/ui/ApogyAddonsSensorsFOVUIPackage.java
@@ -1426,6 +1426,24 @@
 	int FIELD_OF_VIEW_ENTRY3_DTOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON = ApogyAddonsPackage.ABSTRACT_TWO_POINTS3_DTOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON;
 
 	/**
+	 * The operation id for the '<em>Key Pressed</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FIELD_OF_VIEW_ENTRY3_DTOOL___KEY_PRESSED__CHAR = ApogyAddonsPackage.ABSTRACT_TWO_POINTS3_DTOOL___KEY_PRESSED__CHAR;
+
+	/**
+	 * The operation id for the '<em>Key Released</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FIELD_OF_VIEW_ENTRY3_DTOOL___KEY_RELEASED__CHAR = ApogyAddonsPackage.ABSTRACT_TWO_POINTS3_DTOOL___KEY_RELEASED__CHAR;
+
+	/**
 	 * The operation id for the '<em>Points Relative Pose Changed</em>' operation.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
diff --git a/bundles/addons/org.eclipse.apogy.addons.sensors.imaging.camera.edit/src-gen-custom/org/eclipse/apogy/addons/sensors/imaging/camera/provider/LineDrawingCameraToolCustomItemProvider.java b/bundles/addons/org.eclipse.apogy.addons.sensors.imaging.camera.edit/src-gen-custom/org/eclipse/apogy/addons/sensors/imaging/camera/provider/LineDrawingCameraToolCustomItemProvider.java
index 3cd636d..4d01436 100644
--- a/bundles/addons/org.eclipse.apogy.addons.sensors.imaging.camera.edit/src-gen-custom/org/eclipse/apogy/addons/sensors/imaging/camera/provider/LineDrawingCameraToolCustomItemProvider.java
+++ b/bundles/addons/org.eclipse.apogy.addons.sensors.imaging.camera.edit/src-gen-custom/org/eclipse/apogy/addons/sensors/imaging/camera/provider/LineDrawingCameraToolCustomItemProvider.java
@@ -27,7 +27,7 @@
 		LineDrawingCameraTool tool = (LineDrawingCameraTool) object;
 	
 		String label = tool.getName();
-		if(tool.getName() == null || tool.getName().length() == 0) label = getString("_UI_LineDrawingCameraTool_type");
+		if(tool.getName() == null || tool.getName().length() == 0) label = getString("_UI_LineDrawingCameraToolMQTT_type");
 		else label = tool.getName();
 		
 		String suffix = getSuffix(tool);
diff --git a/bundles/addons/org.eclipse.apogy.addons.vehicle/src-gen/org/eclipse/apogy/addons/vehicle/ApogyAddonsVehiclePackage.java b/bundles/addons/org.eclipse.apogy.addons.vehicle/src-gen/org/eclipse/apogy/addons/vehicle/ApogyAddonsVehiclePackage.java
index 67d9555..9317b24 100644
--- a/bundles/addons/org.eclipse.apogy.addons.vehicle/src-gen/org/eclipse/apogy/addons/vehicle/ApogyAddonsVehiclePackage.java
+++ b/bundles/addons/org.eclipse.apogy.addons.vehicle/src-gen/org/eclipse/apogy/addons/vehicle/ApogyAddonsVehiclePackage.java
@@ -1680,6 +1680,24 @@
 	int PATH_PLANNER_TOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON = ApogyAddonsPackage.ABSTRACT_TWO_POINTS3_DTOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON;
 
 	/**
+	 * The operation id for the '<em>Key Pressed</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PATH_PLANNER_TOOL___KEY_PRESSED__CHAR = ApogyAddonsPackage.ABSTRACT_TWO_POINTS3_DTOOL___KEY_PRESSED__CHAR;
+
+	/**
+	 * The operation id for the '<em>Key Released</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PATH_PLANNER_TOOL___KEY_RELEASED__CHAR = ApogyAddonsPackage.ABSTRACT_TWO_POINTS3_DTOOL___KEY_RELEASED__CHAR;
+
+	/**
 	 * The operation id for the '<em>Points Relative Pose Changed</em>' operation.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -2114,6 +2132,24 @@
 	int VEHICLE_PATH_PLANNER_TOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON = PATH_PLANNER_TOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON;
 
 	/**
+	 * The operation id for the '<em>Key Pressed</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEHICLE_PATH_PLANNER_TOOL___KEY_PRESSED__CHAR = PATH_PLANNER_TOOL___KEY_PRESSED__CHAR;
+
+	/**
+	 * The operation id for the '<em>Key Released</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEHICLE_PATH_PLANNER_TOOL___KEY_RELEASED__CHAR = PATH_PLANNER_TOOL___KEY_RELEASED__CHAR;
+
+	/**
 	 * The operation id for the '<em>Points Relative Pose Changed</em>' operation.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -2340,6 +2376,24 @@
 	int VEHICLE_TRAJECTORY_PICKING_TOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON = ApogyAddonsPackage.TRAJECTORY_PICKING_TOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON;
 
 	/**
+	 * The operation id for the '<em>Key Pressed</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEHICLE_TRAJECTORY_PICKING_TOOL___KEY_PRESSED__CHAR = ApogyAddonsPackage.TRAJECTORY_PICKING_TOOL___KEY_PRESSED__CHAR;
+
+	/**
+	 * The operation id for the '<em>Key Released</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int VEHICLE_TRAJECTORY_PICKING_TOOL___KEY_RELEASED__CHAR = ApogyAddonsPackage.TRAJECTORY_PICKING_TOOL___KEY_RELEASED__CHAR;
+
+	/**
 	 * The operation id for the '<em>Clear Active Path</em>' operation.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
diff --git a/bundles/addons/org.eclipse.apogy.addons/model/apogy_addons.xcore b/bundles/addons/org.eclipse.apogy.addons/model/apogy_addons.xcore
index 4c6fde3..17cb340 100644
--- a/bundles/addons/org.eclipse.apogy.addons/model/apogy_addons.xcore
+++ b/bundles/addons/org.eclipse.apogy.addons/model/apogy_addons.xcore
@@ -161,6 +161,18 @@
 	 * @param mouseButtonClicked The mouse button that was clicked.
 	 */
 	op void mouseButtonClicked(MouseButton mouseButtonClicked)
+	
+	/**
+	 * Method called when a key is pressed while the mouse is in the 3D viewer.
+	 * @param key The key pressed.
+	 */
+	op void keyPressed(char key)
+	
+	/**
+	 * Method called when a key is released while the mouse is in the 3D viewer.
+	 * @param key The key released.
+	 */
+	op void keyReleased(char key)
 }
 
 /**
diff --git a/bundles/addons/org.eclipse.apogy.addons/src-gen-custom/org/eclipse/apogy/addons/impl/Simple3DToolCustomImpl.java b/bundles/addons/org.eclipse.apogy.addons/src-gen-custom/org/eclipse/apogy/addons/impl/Simple3DToolCustomImpl.java
index 7010b62..a92966a 100644
--- a/bundles/addons/org.eclipse.apogy.addons/src-gen-custom/org/eclipse/apogy/addons/impl/Simple3DToolCustomImpl.java
+++ b/bundles/addons/org.eclipse.apogy.addons/src-gen-custom/org/eclipse/apogy/addons/impl/Simple3DToolCustomImpl.java
@@ -40,5 +40,13 @@
 
 		super.dispose();
 	}
+	
+	@Override
+	public void keyPressed(char key) {
+	}
+	
+	@Override
+	public void keyReleased(char key) {
+	}
 
 } // Simple3DToolImpl
diff --git a/bundles/addons/org.eclipse.apogy.addons/src-gen-custom/org/eclipse/apogy/addons/impl/TrajectoryPickingToolCustomImpl.java b/bundles/addons/org.eclipse.apogy.addons/src-gen-custom/org/eclipse/apogy/addons/impl/TrajectoryPickingToolCustomImpl.java
index b71ce8f..b2e00c6 100644
--- a/bundles/addons/org.eclipse.apogy.addons/src-gen-custom/org/eclipse/apogy/addons/impl/TrajectoryPickingToolCustomImpl.java
+++ b/bundles/addons/org.eclipse.apogy.addons/src-gen-custom/org/eclipse/apogy/addons/impl/TrajectoryPickingToolCustomImpl.java
@@ -32,6 +32,8 @@
 import org.eclipse.apogy.common.topology.ui.NodeSelection;
 import org.eclipse.apogy.common.topology.ui.viewer.MouseButton;
 import org.eclipse.apogy.core.environment.surface.CartesianTriangularMeshMapLayerNode;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.Display;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -169,6 +171,20 @@
 			}
 		}
 	}
+	
+	@Override
+	public void keyPressed(char key) 
+	{
+		if(key == 'C' || key =='c')
+		{
+			boolean confirm = MessageDialog.openConfirm(Display.getDefault().getActiveShell(), "Clear active path", "Are you sure you want to clear the active path of tool <" + getName() + "> ?");
+			if(confirm) clearActivePath();
+		}
+	}
+	
+	@Override
+	public void keyReleased(char key) {
+	}
 
 	@Override
 	public void initialise() {
diff --git a/bundles/addons/org.eclipse.apogy.addons/src-gen/org/eclipse/apogy/addons/ApogyAddonsPackage.java b/bundles/addons/org.eclipse.apogy.addons/src-gen/org/eclipse/apogy/addons/ApogyAddonsPackage.java
index 556f568..7994f83 100644
--- a/bundles/addons/org.eclipse.apogy.addons/src-gen/org/eclipse/apogy/addons/ApogyAddonsPackage.java
+++ b/bundles/addons/org.eclipse.apogy.addons/src-gen/org/eclipse/apogy/addons/ApogyAddonsPackage.java
@@ -489,13 +489,31 @@
 	int SIMPLE3_DTOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON = SIMPLE_TOOL_OPERATION_COUNT + 1;
 
 	/**
+	 * The operation id for the '<em>Key Pressed</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SIMPLE3_DTOOL___KEY_PRESSED__CHAR = SIMPLE_TOOL_OPERATION_COUNT + 2;
+
+	/**
+	 * The operation id for the '<em>Key Released</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SIMPLE3_DTOOL___KEY_RELEASED__CHAR = SIMPLE_TOOL_OPERATION_COUNT + 3;
+
+	/**
 	 * The number of operations of the '<em>Simple3 DTool</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int SIMPLE3_DTOOL_OPERATION_COUNT = SIMPLE_TOOL_OPERATION_COUNT + 2;
+	int SIMPLE3_DTOOL_OPERATION_COUNT = SIMPLE_TOOL_OPERATION_COUNT + 4;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.apogy.addons.impl.AbstractTwoPoints3DToolImpl <em>Abstract Two Points3 DTool</em>}' class.
@@ -742,6 +760,24 @@
 	int ABSTRACT_TWO_POINTS3_DTOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON = SIMPLE3_DTOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON;
 
 	/**
+	 * The operation id for the '<em>Key Pressed</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ABSTRACT_TWO_POINTS3_DTOOL___KEY_PRESSED__CHAR = SIMPLE3_DTOOL___KEY_PRESSED__CHAR;
+
+	/**
+	 * The operation id for the '<em>Key Released</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ABSTRACT_TWO_POINTS3_DTOOL___KEY_RELEASED__CHAR = SIMPLE3_DTOOL___KEY_RELEASED__CHAR;
+
+	/**
 	 * The operation id for the '<em>Points Relative Pose Changed</em>' operation.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -1085,6 +1121,24 @@
 	int RULER3_DTOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON = ABSTRACT_TWO_POINTS3_DTOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON;
 
 	/**
+	 * The operation id for the '<em>Key Pressed</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RULER3_DTOOL___KEY_PRESSED__CHAR = ABSTRACT_TWO_POINTS3_DTOOL___KEY_PRESSED__CHAR;
+
+	/**
+	 * The operation id for the '<em>Key Released</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RULER3_DTOOL___KEY_RELEASED__CHAR = ABSTRACT_TWO_POINTS3_DTOOL___KEY_RELEASED__CHAR;
+
+	/**
 	 * The operation id for the '<em>Points Relative Pose Changed</em>' operation.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -1384,6 +1438,24 @@
 	int FEATURE_OF_INTEREST_PICKING_TOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON = SIMPLE3_DTOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON;
 
 	/**
+	 * The operation id for the '<em>Key Pressed</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FEATURE_OF_INTEREST_PICKING_TOOL___KEY_PRESSED__CHAR = SIMPLE3_DTOOL___KEY_PRESSED__CHAR;
+
+	/**
+	 * The operation id for the '<em>Key Released</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FEATURE_OF_INTEREST_PICKING_TOOL___KEY_RELEASED__CHAR = SIMPLE3_DTOOL___KEY_RELEASED__CHAR;
+
+	/**
 	 * The number of operations of the '<em>Feature Of Interest Picking Tool</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -1583,6 +1655,24 @@
 	int TRAJECTORY_PICKING_TOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON = SIMPLE3_DTOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON;
 
 	/**
+	 * The operation id for the '<em>Key Pressed</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRAJECTORY_PICKING_TOOL___KEY_PRESSED__CHAR = SIMPLE3_DTOOL___KEY_PRESSED__CHAR;
+
+	/**
+	 * The operation id for the '<em>Key Released</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRAJECTORY_PICKING_TOOL___KEY_RELEASED__CHAR = SIMPLE3_DTOOL___KEY_RELEASED__CHAR;
+
+	/**
 	 * The operation id for the '<em>Clear Active Path</em>' operation.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -1900,6 +1990,24 @@
 	int TRAJECTORY3_DTOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON = SIMPLE3_DTOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON;
 
 	/**
+	 * The operation id for the '<em>Key Pressed</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRAJECTORY3_DTOOL___KEY_PRESSED__CHAR = SIMPLE3_DTOOL___KEY_PRESSED__CHAR;
+
+	/**
+	 * The operation id for the '<em>Key Released</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TRAJECTORY3_DTOOL___KEY_RELEASED__CHAR = SIMPLE3_DTOOL___KEY_RELEASED__CHAR;
+
+	/**
 	 * The operation id for the '<em>Clear Last Path Segment</em>' operation.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -2217,6 +2325,24 @@
 	int ABSTRACT_PICK_LOCATION_TOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON = SIMPLE3_DTOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON;
 
 	/**
+	 * The operation id for the '<em>Key Pressed</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ABSTRACT_PICK_LOCATION_TOOL___KEY_PRESSED__CHAR = SIMPLE3_DTOOL___KEY_PRESSED__CHAR;
+
+	/**
+	 * The operation id for the '<em>Key Released</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ABSTRACT_PICK_LOCATION_TOOL___KEY_RELEASED__CHAR = SIMPLE3_DTOOL___KEY_RELEASED__CHAR;
+
+	/**
 	 * The number of operations of the '<em>Abstract Pick Location Tool</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -2534,6 +2660,24 @@
 	int GEOMETRY_PLACEMENT_AT_FEATURE_OF_INTEREST_TOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON = SIMPLE3_DTOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON;
 
 	/**
+	 * The operation id for the '<em>Key Pressed</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int GEOMETRY_PLACEMENT_AT_FEATURE_OF_INTEREST_TOOL___KEY_PRESSED__CHAR = SIMPLE3_DTOOL___KEY_PRESSED__CHAR;
+
+	/**
+	 * The operation id for the '<em>Key Released</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int GEOMETRY_PLACEMENT_AT_FEATURE_OF_INTEREST_TOOL___KEY_RELEASED__CHAR = SIMPLE3_DTOOL___KEY_RELEASED__CHAR;
+
+	/**
 	 * The operation id for the '<em>Load Geometry</em>' operation.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -2742,6 +2886,24 @@
 	int ABSTRACT_URL_NODE_GEOMETRY_PLACEMENT_AT_FEATURE_OF_INTEREST_TOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON = GEOMETRY_PLACEMENT_AT_FEATURE_OF_INTEREST_TOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON;
 
 	/**
+	 * The operation id for the '<em>Key Pressed</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ABSTRACT_URL_NODE_GEOMETRY_PLACEMENT_AT_FEATURE_OF_INTEREST_TOOL___KEY_PRESSED__CHAR = GEOMETRY_PLACEMENT_AT_FEATURE_OF_INTEREST_TOOL___KEY_PRESSED__CHAR;
+
+	/**
+	 * The operation id for the '<em>Key Released</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ABSTRACT_URL_NODE_GEOMETRY_PLACEMENT_AT_FEATURE_OF_INTEREST_TOOL___KEY_RELEASED__CHAR = GEOMETRY_PLACEMENT_AT_FEATURE_OF_INTEREST_TOOL___KEY_RELEASED__CHAR;
+
+	/**
 	 * The operation id for the '<em>Load Geometry</em>' operation.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -2986,6 +3148,24 @@
 	int URL_NODE_GEOMETRY_PLACEMENT_AT_FEATURE_OF_INTEREST_TOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON = ABSTRACT_URL_NODE_GEOMETRY_PLACEMENT_AT_FEATURE_OF_INTEREST_TOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON;
 
 	/**
+	 * The operation id for the '<em>Key Pressed</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int URL_NODE_GEOMETRY_PLACEMENT_AT_FEATURE_OF_INTEREST_TOOL___KEY_PRESSED__CHAR = ABSTRACT_URL_NODE_GEOMETRY_PLACEMENT_AT_FEATURE_OF_INTEREST_TOOL___KEY_PRESSED__CHAR;
+
+	/**
+	 * The operation id for the '<em>Key Released</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int URL_NODE_GEOMETRY_PLACEMENT_AT_FEATURE_OF_INTEREST_TOOL___KEY_RELEASED__CHAR = ABSTRACT_URL_NODE_GEOMETRY_PLACEMENT_AT_FEATURE_OF_INTEREST_TOOL___KEY_RELEASED__CHAR;
+
+	/**
 	 * The operation id for the '<em>Load Geometry</em>' operation.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -3260,6 +3440,26 @@
 	EOperation getSimple3DTool__MouseButtonClicked__MouseButton();
 
 	/**
+	 * Returns the meta object for the '{@link org.eclipse.apogy.addons.Simple3DTool#keyPressed(char) <em>Key Pressed</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Key Pressed</em>' operation.
+	 * @see org.eclipse.apogy.addons.Simple3DTool#keyPressed(char)
+	 * @generated
+	 */
+	EOperation getSimple3DTool__KeyPressed__char();
+
+	/**
+	 * Returns the meta object for the '{@link org.eclipse.apogy.addons.Simple3DTool#keyReleased(char) <em>Key Released</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the '<em>Key Released</em>' operation.
+	 * @see org.eclipse.apogy.addons.Simple3DTool#keyReleased(char)
+	 * @generated
+	 */
+	EOperation getSimple3DTool__KeyReleased__char();
+
+	/**
 	 * Returns the meta object for class '{@link org.eclipse.apogy.addons.AbstractTwoPoints3DTool <em>Abstract Two Points3 DTool</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -4266,6 +4466,22 @@
 		EOperation SIMPLE3_DTOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON = eINSTANCE.getSimple3DTool__MouseButtonClicked__MouseButton();
 
 		/**
+		 * The meta object literal for the '<em><b>Key Pressed</b></em>' operation.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EOperation SIMPLE3_DTOOL___KEY_PRESSED__CHAR = eINSTANCE.getSimple3DTool__KeyPressed__char();
+
+		/**
+		 * The meta object literal for the '<em><b>Key Released</b></em>' operation.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EOperation SIMPLE3_DTOOL___KEY_RELEASED__CHAR = eINSTANCE.getSimple3DTool__KeyReleased__char();
+
+		/**
 		 * The meta object literal for the '{@link org.eclipse.apogy.addons.impl.AbstractTwoPoints3DToolImpl <em>Abstract Two Points3 DTool</em>}' class.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
diff --git a/bundles/addons/org.eclipse.apogy.addons/src-gen/org/eclipse/apogy/addons/Simple3DTool.java b/bundles/addons/org.eclipse.apogy.addons/src-gen/org/eclipse/apogy/addons/Simple3DTool.java
index dc2b519..6064088 100644
--- a/bundles/addons/org.eclipse.apogy.addons/src-gen/org/eclipse/apogy/addons/Simple3DTool.java
+++ b/bundles/addons/org.eclipse.apogy.addons/src-gen/org/eclipse/apogy/addons/Simple3DTool.java
@@ -125,5 +125,31 @@
 	 */
 	void mouseButtonClicked(MouseButton mouseButtonClicked);
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * *
+	 * Method called when a key is pressed while the mouse is in the 3D viewer.
+	 * @param key The key pressed.
+	 * <!-- end-model-doc -->
+	 * @model keyUnique="false"
+	 * @generated
+	 */
+	void keyPressed(char key);
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * <!-- begin-model-doc -->
+	 * *
+	 * Method called when a key is released while the mouse is in the 3D viewer.
+	 * @param key The key released.
+	 * <!-- end-model-doc -->
+	 * @model keyUnique="false"
+	 * @generated
+	 */
+	void keyReleased(char key);
+
 	
 } // Simple3DTool
diff --git a/bundles/addons/org.eclipse.apogy.addons/src-gen/org/eclipse/apogy/addons/impl/ApogyAddonsPackageImpl.java b/bundles/addons/org.eclipse.apogy.addons/src-gen/org/eclipse/apogy/addons/impl/ApogyAddonsPackageImpl.java
index 80b8160..12ce3cc 100644
--- a/bundles/addons/org.eclipse.apogy.addons/src-gen/org/eclipse/apogy/addons/impl/ApogyAddonsPackageImpl.java
+++ b/bundles/addons/org.eclipse.apogy.addons/src-gen/org/eclipse/apogy/addons/impl/ApogyAddonsPackageImpl.java
@@ -519,6 +519,26 @@
 	 * @generated
 	 */
 	@Override
+	public EOperation getSimple3DTool__KeyPressed__char() {
+		return simple3DToolEClass.getEOperations().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EOperation getSimple3DTool__KeyReleased__char() {
+		return simple3DToolEClass.getEOperations().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public EClass getAbstractTwoPoints3DTool() {
 		return abstractTwoPoints3DToolEClass;
 	}
@@ -1317,6 +1337,8 @@
 		createEReference(simple3DToolEClass, SIMPLE3_DTOOL__ROOT_NODE);
 		createEOperation(simple3DToolEClass, SIMPLE3_DTOOL___SELECTION_CHANGED__NODESELECTION);
 		createEOperation(simple3DToolEClass, SIMPLE3_DTOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON);
+		createEOperation(simple3DToolEClass, SIMPLE3_DTOOL___KEY_PRESSED__CHAR);
+		createEOperation(simple3DToolEClass, SIMPLE3_DTOOL___KEY_RELEASED__CHAR);
 
 		abstractTwoPoints3DToolEClass = createEClass(ABSTRACT_TWO_POINTS3_DTOOL);
 		createEReference(abstractTwoPoints3DToolEClass, ABSTRACT_TWO_POINTS3_DTOOL__FROM_ABSOLUTE_POSITION);
@@ -1511,6 +1533,12 @@
 		op = initEOperation(getSimple3DTool__MouseButtonClicked__MouseButton(), null, "mouseButtonClicked", 0, 1, !IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
 		addEParameter(op, theApogyCommonTopologyUIViewerPackage.getMouseButton(), "mouseButtonClicked", 0, 1, !IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
 
+		op = initEOperation(getSimple3DTool__KeyPressed__char(), null, "keyPressed", 0, 1, !IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+		addEParameter(op, theEcorePackage.getEChar(), "key", 0, 1, !IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+
+		op = initEOperation(getSimple3DTool__KeyReleased__char(), null, "keyReleased", 0, 1, !IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+		addEParameter(op, theEcorePackage.getEChar(), "key", 0, 1, !IS_UNIQUE, IS_ORDERED); //$NON-NLS-1$
+
 		initEClass(abstractTwoPoints3DToolEClass, AbstractTwoPoints3DTool.class, "AbstractTwoPoints3DTool", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
 		initEReference(getAbstractTwoPoints3DTool_FromAbsolutePosition(), theApogyCommonMathPackage.getTuple3d(), null, "fromAbsolutePosition", null, 0, 1, AbstractTwoPoints3DTool.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
 		initEReference(getAbstractTwoPoints3DTool_FromRelativePosition(), theApogyCommonMathPackage.getTuple3d(), null, "fromRelativePosition", null, 0, 1, AbstractTwoPoints3DTool.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
@@ -1760,6 +1788,18 @@
 			   "documentation", "*\nMethod called upon a mouse click is detected in the 3D Viewer. Sub-classes should implement.\n@param mouseButtonClicked The mouse button that was clicked." //$NON-NLS-1$ //$NON-NLS-2$
 		   });
 		addAnnotation
+		  (getSimple3DTool__KeyPressed__char(),
+		   source,
+		   new String[] {
+			   "documentation", "*\nMethod called when a key is pressed while the mouse is in the 3D viewer.\n@param key The key pressed." //$NON-NLS-1$ //$NON-NLS-2$
+		   });
+		addAnnotation
+		  (getSimple3DTool__KeyReleased__char(),
+		   source,
+		   new String[] {
+			   "documentation", "*\nMethod called when a key is released while the mouse is in the 3D viewer.\n@param key The key released." //$NON-NLS-1$ //$NON-NLS-2$
+		   });
+		addAnnotation
 		  (getSimple3DTool_Visible(),
 		   source,
 		   new String[] {
diff --git a/bundles/addons/org.eclipse.apogy.addons/src-gen/org/eclipse/apogy/addons/impl/Simple3DToolImpl.java b/bundles/addons/org.eclipse.apogy.addons/src-gen/org/eclipse/apogy/addons/impl/Simple3DToolImpl.java
index 39265af..46cab6b 100644
--- a/bundles/addons/org.eclipse.apogy.addons/src-gen/org/eclipse/apogy/addons/impl/Simple3DToolImpl.java
+++ b/bundles/addons/org.eclipse.apogy.addons/src-gen/org/eclipse/apogy/addons/impl/Simple3DToolImpl.java
@@ -192,6 +192,30 @@
 	 * @generated
 	 */
 	@Override
+	public void keyPressed(char key) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void keyReleased(char key) {
+		// TODO: implement this method
+		// Ensure that you remove @generated or mark it @generated NOT
+		throw new UnsupportedOperationException();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
 			case ApogyAddonsPackage.SIMPLE3_DTOOL__VISIBLE:
@@ -269,6 +293,12 @@
 			case ApogyAddonsPackage.SIMPLE3_DTOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON:
 				mouseButtonClicked((MouseButton)arguments.get(0));
 				return null;
+			case ApogyAddonsPackage.SIMPLE3_DTOOL___KEY_PRESSED__CHAR:
+				keyPressed((Character)arguments.get(0));
+				return null;
+			case ApogyAddonsPackage.SIMPLE3_DTOOL___KEY_RELEASED__CHAR:
+				keyReleased((Character)arguments.get(0));
+				return null;
 		}
 		return super.eInvoke(operationID, arguments);
 	}
diff --git a/bundles/addons/org.eclipse.apogy.addons/src/org/eclipse/apogy/addons/TopologyViewerListenerManager.java b/bundles/addons/org.eclipse.apogy.addons/src/org/eclipse/apogy/addons/TopologyViewerListenerManager.java
index 7d4d352..46b719c 100644
--- a/bundles/addons/org.eclipse.apogy.addons/src/org/eclipse/apogy/addons/TopologyViewerListenerManager.java
+++ b/bundles/addons/org.eclipse.apogy.addons/src/org/eclipse/apogy/addons/TopologyViewerListenerManager.java
@@ -132,6 +132,32 @@
 		}
 	}
 
+	protected void notifynotifyAllSimple3DToolkeyPressed(char key)
+	{
+		for (Simple3DTool tool : this.simple3DTools) {
+			try {
+				if (tool.isActive()) {
+					tool.keyPressed(key);
+				}
+			} catch (Throwable t) {
+				Logger.error(t.getMessage(), t);
+			}
+		}
+	}
+	
+	protected void notifynotifyAllSimple3DToolkeyReleased(char key)
+	{
+		for (Simple3DTool tool : this.simple3DTools) {
+			try {
+				if (tool.isActive()) {
+					tool.keyReleased(key);
+				}
+			} catch (Throwable t) {
+				Logger.error(t.getMessage(), t);
+			}
+		}
+	}
+	
 	protected Adapter getTopologyViewerRegistryAdapter() {
 		if (this.topologyViewerRegistryAdapter == null) {
 			this.topologyViewerRegistryAdapter = new AdapterImpl() {
@@ -158,6 +184,14 @@
 							}
 
 							break;
+							
+						case ApogyCommonTopologyUIViewerPackage.TOPOLOGY_VIEWER_REGISTRY__LAST_KEY_PRESSED:
+							notifynotifyAllSimple3DToolkeyPressed(msg.getNewCharValue());
+							break;
+							
+						case ApogyCommonTopologyUIViewerPackage.TOPOLOGY_VIEWER_REGISTRY__LAST_KEY_RELEASED:
+							notifynotifyAllSimple3DToolkeyReleased(msg.getNewCharValue());
+							break;
 
 						default:
 							break;
diff --git a/bundles/common/org.eclipse.apogy.common.topology.ui.jme3/src/org/eclipse/apogy/common/topology/ui/jme3/JME3Application.java b/bundles/common/org.eclipse.apogy.common.topology.ui.jme3/src/org/eclipse/apogy/common/topology/ui/jme3/JME3Application.java
index c98df24..b500893 100644
--- a/bundles/common/org.eclipse.apogy.common.topology.ui.jme3/src/org/eclipse/apogy/common/topology/ui/jme3/JME3Application.java
+++ b/bundles/common/org.eclipse.apogy.common.topology.ui.jme3/src/org/eclipse/apogy/common/topology/ui/jme3/JME3Application.java
@@ -21,6 +21,7 @@
 package org.eclipse.apogy.common.topology.ui.jme3;
 
 import java.awt.Frame;
+import java.awt.event.KeyEvent;
 import java.awt.image.BufferedImage;
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -41,8 +42,11 @@
 import org.eclipse.swt.awt.SWT_AWT;
 import org.eclipse.swt.events.FocusEvent;
 import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.graphics.RGB;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -58,7 +62,6 @@
 import com.jme3.system.JmeContext;
 import com.jme3.system.lwjgl.LwjglCanvas;
 
-//FIXME Is it a test or a Apogy asset.
 public class JME3Application extends SimpleApplication {
 	private static final Logger Logger = LoggerFactory.getLogger(JME3Application.class);
 
@@ -81,7 +84,7 @@
 	private CreateSceneGraphHTMLActionListener createSceneGraphHTMLActionListener;
 	private MousePickListener mousePickListener;
 	private MouseClickListener mouseClickListener;
-
+	
 	private final DirectionalLight skyLight = new DirectionalLight();
 	private final List<Light> lights = new ArrayList<Light>();
 
@@ -129,13 +132,98 @@
 			}
 		});
 
+		
 		this.jme3awtFrame = SWT_AWT.new_Frame(this.jme3Window);
 		this.jme3awtFrame.add(canvas.getCanvas());
-
+		
+		// DEBUG
+		this.jme3awtFrame.addKeyListener(new java.awt.event.KeyListener() {
+			
+			@Override
+			public void keyTyped(KeyEvent e) {
+			}
+			
+			@Override
+			public void keyReleased(KeyEvent e) 
+			{
+				final char keyPressed = e.getKeyChar();
+				
+				Display.getDefault().asyncExec(new Runnable() {
+					
+					@Override
+					public void run() 
+					{
+						if(isMouseInside())
+						{
+							JME3Application.this.keyReleased(keyPressed);
+						}
+					}
+				});
+			}
+			
+			@Override
+			public void keyPressed(KeyEvent e) 
+			{
+				final char keyPressed = e.getKeyChar();
+				
+				Display.getDefault().asyncExec(new Runnable() {
+					
+					@Override
+					public void run() 
+					{
+						if(isMouseInside())
+						{
+							JME3Application.this.keyPressed(keyPressed);
+						}
+					}
+				});
+			}
+			
+			private boolean isMouseInside() 
+			{
+				Control focusControl = Display.getCurrent().getFocusControl();
+				
+				if(isParent(focusControl, parent))
+				{
+					Point cursorLocation = jme3Window.getShell().getDisplay().getCursorLocation();
+					Point position = Display.getCurrent().getFocusControl().toControl(cursorLocation);
+					return jme3Window.getClientArea().contains(position);
+				}
+				return false;
+			}
+			
+			private boolean isParent(Control control, Composite parent)
+			{
+				boolean result = false;
+				Control c = parent;
+				
+				while(c != null && !result)
+				{
+					result = (c == control);
+					c = c.getParent();
+				}
+				
+				return result;
+			}
+		});
+		
+		// Focusable needs to be disabled since is enabled, the 3D viewer does not relinquish focus in some cases.
 		canvas.getCanvas().setFocusable(false);
 		setShowStatisticsEnabled(false);
 	}
 
+	public void keyPressed(char key)
+	{
+		System.out.println("keyPressed " + key);
+		getJMERenderEngineDelegate() .getTopologyViewer().keyPressed(key);
+	}
+	
+	public void keyReleased(char key)
+	{
+		System.out.println("keyReleased " + key);
+		getJMERenderEngineDelegate() .getTopologyViewer().keyReleased(key);
+	}
+	
 	public void setJMERenderEngineDelegate(JME3RenderEngineDelegate jme3RenderEngineDelegate) {
 		this.jme3RenderEngineDelegate = jme3RenderEngineDelegate;
 	}
diff --git a/bundles/common/org.eclipse.apogy.common.topology.ui.jme3/src/org/eclipse/apogy/common/topology/ui/jme3/JME3RenderEngineDelegate.java b/bundles/common/org.eclipse.apogy.common.topology.ui.jme3/src/org/eclipse/apogy/common/topology/ui/jme3/JME3RenderEngineDelegate.java
index 354a1a6..aa4f829 100644
--- a/bundles/common/org.eclipse.apogy.common.topology.ui.jme3/src/org/eclipse/apogy/common/topology/ui/jme3/JME3RenderEngineDelegate.java
+++ b/bundles/common/org.eclipse.apogy.common.topology.ui.jme3/src/org/eclipse/apogy/common/topology/ui/jme3/JME3RenderEngineDelegate.java
@@ -47,6 +47,8 @@
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.FillLayout;
 import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -79,7 +81,7 @@
 
 		Composite top = new Composite(parent, SWT.NONE);
 		top.setLayout(new FillLayout());
-
+		
 		this.jme3Application = createJME3Application(top);
 
 		return top;
diff --git a/bundles/common/org.eclipse.apogy.common.topology.ui.viewer.edit/bundle.properties b/bundles/common/org.eclipse.apogy.common.topology.ui.viewer.edit/bundle.properties
index 4be68f9..1999609 100644
--- a/bundles/common/org.eclipse.apogy.common.topology.ui.viewer.edit/bundle.properties
+++ b/bundles/common/org.eclipse.apogy.common.topology.ui.viewer.edit/bundle.properties
@@ -225,3 +225,5 @@
 _UI_MouseButton_RIGHT_literal = RIGHT
 pluginName = Apogy Common Topology Viewer Edit
 pluginName = Apogy Common Topology Viewer Edit
+_UI_TopologyViewerRegistry_lastKeyPressed_feature = Last Key Pressed
+_UI_TopologyViewerRegistry_lastKeyReleased_feature = Last Key Released
diff --git a/bundles/common/org.eclipse.apogy.common.topology.ui.viewer.edit/src-gen/org/eclipse/apogy/common/topology/ui/viewer/provider/TopologyViewerRegistryItemProvider.java b/bundles/common/org.eclipse.apogy.common.topology.ui.viewer.edit/src-gen/org/eclipse/apogy/common/topology/ui/viewer/provider/TopologyViewerRegistryItemProvider.java
index c26731a..d5dcd6e 100644
--- a/bundles/common/org.eclipse.apogy.common.topology.ui.viewer.edit/src-gen/org/eclipse/apogy/common/topology/ui/viewer/provider/TopologyViewerRegistryItemProvider.java
+++ b/bundles/common/org.eclipse.apogy.common.topology.ui.viewer.edit/src-gen/org/eclipse/apogy/common/topology/ui/viewer/provider/TopologyViewerRegistryItemProvider.java
@@ -76,6 +76,8 @@
 			addITopologyViewersPropertyDescriptor(object);
 			addLatestNodeSelectionPropertyDescriptor(object);
 			addLatestMouseButtonClikedPropertyDescriptor(object);
+			addLastKeyPressedPropertyDescriptor(object);
+			addLastKeyReleasedPropertyDescriptor(object);
 		}
 		return itemPropertyDescriptors;
 	}
@@ -147,6 +149,50 @@
 	}
 
 	/**
+	 * This adds a property descriptor for the Last Key Pressed feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addLastKeyPressedPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_TopologyViewerRegistry_lastKeyPressed_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_TopologyViewerRegistry_lastKeyPressed_feature", "_UI_TopologyViewerRegistry_type"),
+				 ApogyCommonTopologyUIViewerPackage.Literals.TOPOLOGY_VIEWER_REGISTRY__LAST_KEY_PRESSED,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.TEXT_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This adds a property descriptor for the Last Key Released feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addLastKeyReleasedPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_TopologyViewerRegistry_lastKeyReleased_feature"),
+				 getString("_UI_PropertyDescriptor_description", "_UI_TopologyViewerRegistry_lastKeyReleased_feature", "_UI_TopologyViewerRegistry_type"),
+				 ApogyCommonTopologyUIViewerPackage.Literals.TOPOLOGY_VIEWER_REGISTRY__LAST_KEY_RELEASED,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.TEXT_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
 	 * This returns TopologyViewerRegistry.gif.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -187,6 +233,8 @@
 		switch (notification.getFeatureID(TopologyViewerRegistry.class)) {
 			case ApogyCommonTopologyUIViewerPackage.TOPOLOGY_VIEWER_REGISTRY__ITOPOLOGY_VIEWERS:
 			case ApogyCommonTopologyUIViewerPackage.TOPOLOGY_VIEWER_REGISTRY__LATEST_MOUSE_BUTTON_CLIKED:
+			case ApogyCommonTopologyUIViewerPackage.TOPOLOGY_VIEWER_REGISTRY__LAST_KEY_PRESSED:
+			case ApogyCommonTopologyUIViewerPackage.TOPOLOGY_VIEWER_REGISTRY__LAST_KEY_RELEASED:
 				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
 				return;
 		}
diff --git a/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/model/apogy_common_topology_ui_viewer.xcore b/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/model/apogy_common_topology_ui_viewer.xcore
index 208980e..d7ebf6e 100644
--- a/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/model/apogy_common_topology_ui_viewer.xcore
+++ b/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/model/apogy_common_topology_ui_viewer.xcore
@@ -45,6 +45,7 @@
 
 type ITopologyViewer wraps org.eclipse.apogy.common.topology.ui.viewer.ITopologyViewer
 
+
 /**
  * A register of Topology Viewer. It keeps track of Node Selection made and mouse button clicked.
  */
@@ -66,6 +67,10 @@
 	 */
 	MouseButton latestMouseButtonCliked
 
+	char lastKeyPressed
+	
+	char lastKeyReleased
+
 	/**
 	 * Adds a topology viewer to this registry.
 	 * @param iTopologyViewer The topology viewer to register.
diff --git a/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src-gen-custom/org/eclipse/apogy/common/topology/ui/viewer/impl/TopologyViewerRegistryCustomImpl.java b/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src-gen-custom/org/eclipse/apogy/common/topology/ui/viewer/impl/TopologyViewerRegistryCustomImpl.java
index bee5df2..96f7f92 100644
--- a/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src-gen-custom/org/eclipse/apogy/common/topology/ui/viewer/impl/TopologyViewerRegistryCustomImpl.java
+++ b/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src-gen-custom/org/eclipse/apogy/common/topology/ui/viewer/impl/TopologyViewerRegistryCustomImpl.java
@@ -59,15 +59,29 @@
 	}
 
 	private ITopologyViewerListener getTopologyViewerListener() {
-		if (this.topologyViewerListener == null) {
+		if (this.topologyViewerListener == null) 
+		{
 			this.topologyViewerListener = new ITopologyViewerListener() {
 
 				@Override
-				public void mouseClicked(MouseButton button) {
+				public void mouseClicked(MouseButton button) 
+				{
 					setLatestMouseButtonCliked(button);
 				}
 
 				@Override
+				public void keyPressed(char key) 
+				{
+					setLastKeyPressed(key);
+				}
+				
+				@Override
+				public void keyReleased(char key) 
+				{
+					setLastKeyReleased(key);
+				}
+				
+				@Override
 				public void busyChanged(boolean oldBusy, boolean newBusy) {
 				}
 
diff --git a/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src-gen/org/eclipse/apogy/common/topology/ui/viewer/ApogyCommonTopologyUIViewerPackage.java b/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src-gen/org/eclipse/apogy/common/topology/ui/viewer/ApogyCommonTopologyUIViewerPackage.java
index f77c7d7..3b8c38a 100644
--- a/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src-gen/org/eclipse/apogy/common/topology/ui/viewer/ApogyCommonTopologyUIViewerPackage.java
+++ b/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src-gen/org/eclipse/apogy/common/topology/ui/viewer/ApogyCommonTopologyUIViewerPackage.java
@@ -111,13 +111,31 @@
 	int TOPOLOGY_VIEWER_REGISTRY__LATEST_MOUSE_BUTTON_CLIKED = 2;
 
 	/**
+	 * The feature id for the '<em><b>Last Key Pressed</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TOPOLOGY_VIEWER_REGISTRY__LAST_KEY_PRESSED = 3;
+
+	/**
+	 * The feature id for the '<em><b>Last Key Released</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int TOPOLOGY_VIEWER_REGISTRY__LAST_KEY_RELEASED = 4;
+
+	/**
 	 * The number of structural features of the '<em>Topology Viewer Registry</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int TOPOLOGY_VIEWER_REGISTRY_FEATURE_COUNT = 3;
+	int TOPOLOGY_VIEWER_REGISTRY_FEATURE_COUNT = 5;
 
 	/**
 	 * The operation id for the '<em>Register ITopology Viewer</em>' operation.
@@ -211,6 +229,28 @@
 	EAttribute getTopologyViewerRegistry_LatestMouseButtonCliked();
 
 	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.apogy.common.topology.ui.viewer.TopologyViewerRegistry#getLastKeyPressed <em>Last Key Pressed</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Last Key Pressed</em>'.
+	 * @see org.eclipse.apogy.common.topology.ui.viewer.TopologyViewerRegistry#getLastKeyPressed()
+	 * @see #getTopologyViewerRegistry()
+	 * @generated
+	 */
+	EAttribute getTopologyViewerRegistry_LastKeyPressed();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.apogy.common.topology.ui.viewer.TopologyViewerRegistry#getLastKeyReleased <em>Last Key Released</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Last Key Released</em>'.
+	 * @see org.eclipse.apogy.common.topology.ui.viewer.TopologyViewerRegistry#getLastKeyReleased()
+	 * @see #getTopologyViewerRegistry()
+	 * @generated
+	 */
+	EAttribute getTopologyViewerRegistry_LastKeyReleased();
+
+	/**
 	 * Returns the meta object for the '{@link org.eclipse.apogy.common.topology.ui.viewer.TopologyViewerRegistry#registerITopologyViewer(org.eclipse.apogy.common.topology.ui.viewer.ITopologyViewer) <em>Register ITopology Viewer</em>}' operation.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -309,6 +349,22 @@
 		EAttribute TOPOLOGY_VIEWER_REGISTRY__LATEST_MOUSE_BUTTON_CLIKED = eINSTANCE.getTopologyViewerRegistry_LatestMouseButtonCliked();
 
 		/**
+		 * The meta object literal for the '<em><b>Last Key Pressed</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute TOPOLOGY_VIEWER_REGISTRY__LAST_KEY_PRESSED = eINSTANCE.getTopologyViewerRegistry_LastKeyPressed();
+
+		/**
+		 * The meta object literal for the '<em><b>Last Key Released</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute TOPOLOGY_VIEWER_REGISTRY__LAST_KEY_RELEASED = eINSTANCE.getTopologyViewerRegistry_LastKeyReleased();
+
+		/**
 		 * The meta object literal for the '<em><b>Register ITopology Viewer</b></em>' operation.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
diff --git a/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src-gen/org/eclipse/apogy/common/topology/ui/viewer/TopologyViewerRegistry.java b/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src-gen/org/eclipse/apogy/common/topology/ui/viewer/TopologyViewerRegistry.java
index 6038420..faaa878 100644
--- a/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src-gen/org/eclipse/apogy/common/topology/ui/viewer/TopologyViewerRegistry.java
+++ b/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src-gen/org/eclipse/apogy/common/topology/ui/viewer/TopologyViewerRegistry.java
@@ -39,6 +39,8 @@
  *   <li>{@link org.eclipse.apogy.common.topology.ui.viewer.TopologyViewerRegistry#getITopologyViewers <em>ITopology Viewers</em>}</li>
  *   <li>{@link org.eclipse.apogy.common.topology.ui.viewer.TopologyViewerRegistry#getLatestNodeSelection <em>Latest Node Selection</em>}</li>
  *   <li>{@link org.eclipse.apogy.common.topology.ui.viewer.TopologyViewerRegistry#getLatestMouseButtonCliked <em>Latest Mouse Button Cliked</em>}</li>
+ *   <li>{@link org.eclipse.apogy.common.topology.ui.viewer.TopologyViewerRegistry#getLastKeyPressed <em>Last Key Pressed</em>}</li>
+ *   <li>{@link org.eclipse.apogy.common.topology.ui.viewer.TopologyViewerRegistry#getLastKeyReleased <em>Last Key Released</em>}</li>
  * </ul>
  *
  * @see org.eclipse.apogy.common.topology.ui.viewer.ApogyCommonTopologyUIViewerPackage#getTopologyViewerRegistry()
@@ -118,6 +120,50 @@
 	void setLatestMouseButtonCliked(MouseButton value);
 
 	/**
+	 * Returns the value of the '<em><b>Last Key Pressed</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Last Key Pressed</em>' attribute.
+	 * @see #setLastKeyPressed(char)
+	 * @see org.eclipse.apogy.common.topology.ui.viewer.ApogyCommonTopologyUIViewerPackage#getTopologyViewerRegistry_LastKeyPressed()
+	 * @model unique="false"
+	 * @generated
+	 */
+	char getLastKeyPressed();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.apogy.common.topology.ui.viewer.TopologyViewerRegistry#getLastKeyPressed <em>Last Key Pressed</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Last Key Pressed</em>' attribute.
+	 * @see #getLastKeyPressed()
+	 * @generated
+	 */
+	void setLastKeyPressed(char value);
+
+	/**
+	 * Returns the value of the '<em><b>Last Key Released</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Last Key Released</em>' attribute.
+	 * @see #setLastKeyReleased(char)
+	 * @see org.eclipse.apogy.common.topology.ui.viewer.ApogyCommonTopologyUIViewerPackage#getTopologyViewerRegistry_LastKeyReleased()
+	 * @model unique="false"
+	 * @generated
+	 */
+	char getLastKeyReleased();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.apogy.common.topology.ui.viewer.TopologyViewerRegistry#getLastKeyReleased <em>Last Key Released</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Last Key Released</em>' attribute.
+	 * @see #getLastKeyReleased()
+	 * @generated
+	 */
+	void setLastKeyReleased(char value);
+
+	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * <!-- begin-model-doc -->
diff --git a/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src-gen/org/eclipse/apogy/common/topology/ui/viewer/impl/ApogyCommonTopologyUIViewerPackageImpl.java b/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src-gen/org/eclipse/apogy/common/topology/ui/viewer/impl/ApogyCommonTopologyUIViewerPackageImpl.java
index 81da02e..6b766c8 100644
--- a/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src-gen/org/eclipse/apogy/common/topology/ui/viewer/impl/ApogyCommonTopologyUIViewerPackageImpl.java
+++ b/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src-gen/org/eclipse/apogy/common/topology/ui/viewer/impl/ApogyCommonTopologyUIViewerPackageImpl.java
@@ -122,9 +122,9 @@
 
 		// Initialize simple dependencies
 		ApogyCommonTopologyUIPackage.eINSTANCE.eClass();
+		EcorePackage.eINSTANCE.eClass();
 		ApogyCommonTopologyPackage.eINSTANCE.eClass();
 		ApogyCommonEMFUIPackage.eINSTANCE.eClass();
-		EcorePackage.eINSTANCE.eClass();
 		ApogyCommonMathPackage.eINSTANCE.eClass();
 		ApogyCommonEMFPackage.eINSTANCE.eClass();
 		ApogyCommonEMFUiEMFFormsPackage.eINSTANCE.eClass();
@@ -189,6 +189,26 @@
 	 * @generated
 	 */
 	@Override
+	public EAttribute getTopologyViewerRegistry_LastKeyPressed() {
+		return (EAttribute)topologyViewerRegistryEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EAttribute getTopologyViewerRegistry_LastKeyReleased() {
+		return (EAttribute)topologyViewerRegistryEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public EOperation getTopologyViewerRegistry__RegisterITopologyViewer__ITopologyViewer() {
 		return topologyViewerRegistryEClass.getEOperations().get(0);
 	}
@@ -256,6 +276,8 @@
 		createEAttribute(topologyViewerRegistryEClass, TOPOLOGY_VIEWER_REGISTRY__ITOPOLOGY_VIEWERS);
 		createEReference(topologyViewerRegistryEClass, TOPOLOGY_VIEWER_REGISTRY__LATEST_NODE_SELECTION);
 		createEAttribute(topologyViewerRegistryEClass, TOPOLOGY_VIEWER_REGISTRY__LATEST_MOUSE_BUTTON_CLIKED);
+		createEAttribute(topologyViewerRegistryEClass, TOPOLOGY_VIEWER_REGISTRY__LAST_KEY_PRESSED);
+		createEAttribute(topologyViewerRegistryEClass, TOPOLOGY_VIEWER_REGISTRY__LAST_KEY_RELEASED);
 		createEOperation(topologyViewerRegistryEClass, TOPOLOGY_VIEWER_REGISTRY___REGISTER_ITOPOLOGY_VIEWER__ITOPOLOGYVIEWER);
 		createEOperation(topologyViewerRegistryEClass, TOPOLOGY_VIEWER_REGISTRY___UN_REGISTER_ITOPOLOGY_VIEWER__ITOPOLOGYVIEWER);
 
@@ -291,6 +313,7 @@
 
 		// Obtain other dependent packages
 		ApogyCommonTopologyUIPackage theApogyCommonTopologyUIPackage = (ApogyCommonTopologyUIPackage)EPackage.Registry.INSTANCE.getEPackage(ApogyCommonTopologyUIPackage.eNS_URI);
+		EcorePackage theEcorePackage = (EcorePackage)EPackage.Registry.INSTANCE.getEPackage(EcorePackage.eNS_URI);
 
 		// Create type parameters
 
@@ -303,6 +326,8 @@
 		initEAttribute(getTopologyViewerRegistry_ITopologyViewers(), this.getITopologyViewer(), "iTopologyViewers", null, 0, -1, TopologyViewerRegistry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getTopologyViewerRegistry_LatestNodeSelection(), theApogyCommonTopologyUIPackage.getNodeSelection(), null, "latestNodeSelection", null, 0, 1, TopologyViewerRegistry.class, IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEAttribute(getTopologyViewerRegistry_LatestMouseButtonCliked(), this.getMouseButton(), "latestMouseButtonCliked", null, 0, 1, TopologyViewerRegistry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getTopologyViewerRegistry_LastKeyPressed(), theEcorePackage.getEChar(), "lastKeyPressed", null, 0, 1, TopologyViewerRegistry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getTopologyViewerRegistry_LastKeyReleased(), theEcorePackage.getEChar(), "lastKeyReleased", null, 0, 1, TopologyViewerRegistry.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		EOperation op = initEOperation(getTopologyViewerRegistry__RegisterITopologyViewer__ITopologyViewer(), null, "registerITopologyViewer", 0, 1, !IS_UNIQUE, IS_ORDERED);
 		addEParameter(op, this.getITopologyViewer(), "iTopologyViewer", 0, 1, !IS_UNIQUE, IS_ORDERED);
diff --git a/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src-gen/org/eclipse/apogy/common/topology/ui/viewer/impl/TopologyViewerRegistryImpl.java b/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src-gen/org/eclipse/apogy/common/topology/ui/viewer/impl/TopologyViewerRegistryImpl.java
index 44453ba..9eaca6b 100644
--- a/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src-gen/org/eclipse/apogy/common/topology/ui/viewer/impl/TopologyViewerRegistryImpl.java
+++ b/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src-gen/org/eclipse/apogy/common/topology/ui/viewer/impl/TopologyViewerRegistryImpl.java
@@ -50,6 +50,8 @@
  *   <li>{@link org.eclipse.apogy.common.topology.ui.viewer.impl.TopologyViewerRegistryImpl#getITopologyViewers <em>ITopology Viewers</em>}</li>
  *   <li>{@link org.eclipse.apogy.common.topology.ui.viewer.impl.TopologyViewerRegistryImpl#getLatestNodeSelection <em>Latest Node Selection</em>}</li>
  *   <li>{@link org.eclipse.apogy.common.topology.ui.viewer.impl.TopologyViewerRegistryImpl#getLatestMouseButtonCliked <em>Latest Mouse Button Cliked</em>}</li>
+ *   <li>{@link org.eclipse.apogy.common.topology.ui.viewer.impl.TopologyViewerRegistryImpl#getLastKeyPressed <em>Last Key Pressed</em>}</li>
+ *   <li>{@link org.eclipse.apogy.common.topology.ui.viewer.impl.TopologyViewerRegistryImpl#getLastKeyReleased <em>Last Key Released</em>}</li>
  * </ul>
  *
  * @generated
@@ -96,6 +98,46 @@
 	protected MouseButton latestMouseButtonCliked = LATEST_MOUSE_BUTTON_CLIKED_EDEFAULT;
 
 	/**
+	 * The default value of the '{@link #getLastKeyPressed() <em>Last Key Pressed</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLastKeyPressed()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final char LAST_KEY_PRESSED_EDEFAULT = '\u0000';
+
+	/**
+	 * The cached value of the '{@link #getLastKeyPressed() <em>Last Key Pressed</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLastKeyPressed()
+	 * @generated
+	 * @ordered
+	 */
+	protected char lastKeyPressed = LAST_KEY_PRESSED_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getLastKeyReleased() <em>Last Key Released</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLastKeyReleased()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final char LAST_KEY_RELEASED_EDEFAULT = '\u0000';
+
+	/**
+	 * The cached value of the '{@link #getLastKeyReleased() <em>Last Key Released</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLastKeyReleased()
+	 * @generated
+	 * @ordered
+	 */
+	protected char lastKeyReleased = LAST_KEY_RELEASED_EDEFAULT;
+
+	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
@@ -196,6 +238,52 @@
 	 * @generated
 	 */
 	@Override
+	public char getLastKeyPressed() {
+		return lastKeyPressed;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setLastKeyPressed(char newLastKeyPressed) {
+		char oldLastKeyPressed = lastKeyPressed;
+		lastKeyPressed = newLastKeyPressed;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ApogyCommonTopologyUIViewerPackage.TOPOLOGY_VIEWER_REGISTRY__LAST_KEY_PRESSED, oldLastKeyPressed, lastKeyPressed));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public char getLastKeyReleased() {
+		return lastKeyReleased;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void setLastKeyReleased(char newLastKeyReleased) {
+		char oldLastKeyReleased = lastKeyReleased;
+		lastKeyReleased = newLastKeyReleased;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, ApogyCommonTopologyUIViewerPackage.TOPOLOGY_VIEWER_REGISTRY__LAST_KEY_RELEASED, oldLastKeyReleased, lastKeyReleased));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
 	public void registerITopologyViewer(ITopologyViewer iTopologyViewer) {
 		// TODO: implement this method
 		// Ensure that you remove @generated or mark it @generated NOT
@@ -229,6 +317,10 @@
 				return basicGetLatestNodeSelection();
 			case ApogyCommonTopologyUIViewerPackage.TOPOLOGY_VIEWER_REGISTRY__LATEST_MOUSE_BUTTON_CLIKED:
 				return getLatestMouseButtonCliked();
+			case ApogyCommonTopologyUIViewerPackage.TOPOLOGY_VIEWER_REGISTRY__LAST_KEY_PRESSED:
+				return getLastKeyPressed();
+			case ApogyCommonTopologyUIViewerPackage.TOPOLOGY_VIEWER_REGISTRY__LAST_KEY_RELEASED:
+				return getLastKeyReleased();
 		}
 		return super.eGet(featureID, resolve, coreType);
 	}
@@ -252,6 +344,12 @@
 			case ApogyCommonTopologyUIViewerPackage.TOPOLOGY_VIEWER_REGISTRY__LATEST_MOUSE_BUTTON_CLIKED:
 				setLatestMouseButtonCliked((MouseButton)newValue);
 				return;
+			case ApogyCommonTopologyUIViewerPackage.TOPOLOGY_VIEWER_REGISTRY__LAST_KEY_PRESSED:
+				setLastKeyPressed((Character)newValue);
+				return;
+			case ApogyCommonTopologyUIViewerPackage.TOPOLOGY_VIEWER_REGISTRY__LAST_KEY_RELEASED:
+				setLastKeyReleased((Character)newValue);
+				return;
 		}
 		super.eSet(featureID, newValue);
 	}
@@ -273,6 +371,12 @@
 			case ApogyCommonTopologyUIViewerPackage.TOPOLOGY_VIEWER_REGISTRY__LATEST_MOUSE_BUTTON_CLIKED:
 				setLatestMouseButtonCliked(LATEST_MOUSE_BUTTON_CLIKED_EDEFAULT);
 				return;
+			case ApogyCommonTopologyUIViewerPackage.TOPOLOGY_VIEWER_REGISTRY__LAST_KEY_PRESSED:
+				setLastKeyPressed(LAST_KEY_PRESSED_EDEFAULT);
+				return;
+			case ApogyCommonTopologyUIViewerPackage.TOPOLOGY_VIEWER_REGISTRY__LAST_KEY_RELEASED:
+				setLastKeyReleased(LAST_KEY_RELEASED_EDEFAULT);
+				return;
 		}
 		super.eUnset(featureID);
 	}
@@ -291,6 +395,10 @@
 				return latestNodeSelection != null;
 			case ApogyCommonTopologyUIViewerPackage.TOPOLOGY_VIEWER_REGISTRY__LATEST_MOUSE_BUTTON_CLIKED:
 				return latestMouseButtonCliked != LATEST_MOUSE_BUTTON_CLIKED_EDEFAULT;
+			case ApogyCommonTopologyUIViewerPackage.TOPOLOGY_VIEWER_REGISTRY__LAST_KEY_PRESSED:
+				return lastKeyPressed != LAST_KEY_PRESSED_EDEFAULT;
+			case ApogyCommonTopologyUIViewerPackage.TOPOLOGY_VIEWER_REGISTRY__LAST_KEY_RELEASED:
+				return lastKeyReleased != LAST_KEY_RELEASED_EDEFAULT;
 		}
 		return super.eIsSet(featureID);
 	}
@@ -327,6 +435,10 @@
 		result.append(iTopologyViewers);
 		result.append(", latestMouseButtonCliked: ");
 		result.append(latestMouseButtonCliked);
+		result.append(", lastKeyPressed: ");
+		result.append(lastKeyPressed);
+		result.append(", lastKeyReleased: ");
+		result.append(lastKeyReleased);
 		result.append(')');
 		return result.toString();
 	}
diff --git a/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src/org/eclipse/apogy/common/topology/ui/viewer/ITopologyViewer.java b/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src/org/eclipse/apogy/common/topology/ui/viewer/ITopologyViewer.java
index 741e2ad..4a19259 100644
--- a/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src/org/eclipse/apogy/common/topology/ui/viewer/ITopologyViewer.java
+++ b/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src/org/eclipse/apogy/common/topology/ui/viewer/ITopologyViewer.java
@@ -178,6 +178,11 @@
 	 */
 	public void mouseClicked(MouseButton button);
 
+	public void keyPressed(char key);
+	
+	public void keyReleased(char key);
+	
+	
 	/**
 	 * Dispose of this ITopologyViewer.
 	 */
diff --git a/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src/org/eclipse/apogy/common/topology/ui/viewer/ITopologyViewerListener.java b/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src/org/eclipse/apogy/common/topology/ui/viewer/ITopologyViewerListener.java
index 141e752..3a63bd1 100644
--- a/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src/org/eclipse/apogy/common/topology/ui/viewer/ITopologyViewerListener.java
+++ b/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src/org/eclipse/apogy/common/topology/ui/viewer/ITopologyViewerListener.java
@@ -17,6 +17,8 @@
 
 public interface ITopologyViewerListener {
 	public void mouseClicked(MouseButton button);
+	public void keyPressed(char key);
+	public void keyReleased(char key);
 	public void busyChanged(boolean oldBusy, boolean newBusy);
 	public void antiAliasingChanged(boolean oldAntiAliasing, boolean newAntiAliasing);
 }
diff --git a/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src/org/eclipse/apogy/common/topology/ui/viewer/TopologyViewer.java b/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src/org/eclipse/apogy/common/topology/ui/viewer/TopologyViewer.java
index 9762403..bf6a396 100644
--- a/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src/org/eclipse/apogy/common/topology/ui/viewer/TopologyViewer.java
+++ b/bundles/common/org.eclipse.apogy.common.topology.ui.viewer/src/org/eclipse/apogy/common/topology/ui/viewer/TopologyViewer.java
@@ -320,6 +320,18 @@
 	}
 
 	@Override
+	public void keyPressed(char key) 
+	{
+		fireKeyPressed(key);
+	}
+	
+	@Override
+	public void keyReleased(char key) 
+	{
+		fireKeyReleased(key);
+	}
+	
+	@Override
 	public void dispose() {
 		org.eclipse.apogy.common.topology.ui.viewer.Activator.getDefault().getPreferenceStore()
 				.removePropertyChangeListener(getPropertyChangeListener());
@@ -463,6 +475,33 @@
 		}
 	}
 
+	protected void fireKeyPressed(final char key) {
+		for (ITopologyViewerListener listener : this.topologyViewerListeners) {
+			final ITopologyViewerListener l = listener;
+			SafeRunnable.run(new SafeRunnable() {
+				@Override
+				public void run() {
+					if (l != null)
+						l.keyPressed(key);;
+				}
+			});
+		}
+	}
+	
+	protected void fireKeyReleased(final char key) {
+		for (ITopologyViewerListener listener : this.topologyViewerListeners) {
+			final ITopologyViewerListener l = listener;
+			SafeRunnable.run(new SafeRunnable() {
+				@Override
+				public void run() {
+					if (l != null)
+						l.keyReleased(key);
+				}
+			});
+		}
+	}
+	
+	
 	/**
 	 * Method used to signal to all ITopologyViewerListener a change in the busy
 	 * value.
diff --git a/bundles/core/org.eclipse.apogy.core.environment.earth.surface.orbit.ui/src-gen/org/eclipse/apogy/core/environment/earth/surface/orbit/ui/ApogyEarthSurfaceOrbitEnvironmentUIPackage.java b/bundles/core/org.eclipse.apogy.core.environment.earth.surface.orbit.ui/src-gen/org/eclipse/apogy/core/environment/earth/surface/orbit/ui/ApogyEarthSurfaceOrbitEnvironmentUIPackage.java
index 2c1849b..c637b8f 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.earth.surface.orbit.ui/src-gen/org/eclipse/apogy/core/environment/earth/surface/orbit/ui/ApogyEarthSurfaceOrbitEnvironmentUIPackage.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.earth.surface.orbit.ui/src-gen/org/eclipse/apogy/core/environment/earth/surface/orbit/ui/ApogyEarthSurfaceOrbitEnvironmentUIPackage.java
@@ -265,6 +265,24 @@
 	int EARTH_ORBIT_MODEL_TOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON = ApogyAddonsPackage.SIMPLE3_DTOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON;
 
 	/**
+	 * The operation id for the '<em>Key Pressed</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EARTH_ORBIT_MODEL_TOOL___KEY_PRESSED__CHAR = ApogyAddonsPackage.SIMPLE3_DTOOL___KEY_PRESSED__CHAR;
+
+	/**
+	 * The operation id for the '<em>Key Released</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EARTH_ORBIT_MODEL_TOOL___KEY_RELEASED__CHAR = ApogyAddonsPackage.SIMPLE3_DTOOL___KEY_RELEASED__CHAR;
+
+	/**
 	 * The operation id for the '<em>Get Default Auto Update Enabled</em>' operation.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -518,6 +536,24 @@
 	int EARTH_ORBITING_SPACECRAFT_LOCATION_TOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON = EARTH_ORBIT_MODEL_TOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON;
 
 	/**
+	 * The operation id for the '<em>Key Pressed</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EARTH_ORBITING_SPACECRAFT_LOCATION_TOOL___KEY_PRESSED__CHAR = EARTH_ORBIT_MODEL_TOOL___KEY_PRESSED__CHAR;
+
+	/**
+	 * The operation id for the '<em>Key Released</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EARTH_ORBITING_SPACECRAFT_LOCATION_TOOL___KEY_RELEASED__CHAR = EARTH_ORBIT_MODEL_TOOL___KEY_RELEASED__CHAR;
+
+	/**
 	 * The operation id for the '<em>Get Default Auto Update Enabled</em>' operation.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -871,6 +907,24 @@
 	int EARTH_ORBIT_MODEL_PASS_TOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON = EARTH_ORBIT_MODEL_TOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON;
 
 	/**
+	 * The operation id for the '<em>Key Pressed</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EARTH_ORBIT_MODEL_PASS_TOOL___KEY_PRESSED__CHAR = EARTH_ORBIT_MODEL_TOOL___KEY_PRESSED__CHAR;
+
+	/**
+	 * The operation id for the '<em>Key Released</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EARTH_ORBIT_MODEL_PASS_TOOL___KEY_RELEASED__CHAR = EARTH_ORBIT_MODEL_TOOL___KEY_RELEASED__CHAR;
+
+	/**
 	 * The operation id for the '<em>Get Default Auto Update Enabled</em>' operation.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
diff --git a/bundles/core/org.eclipse.apogy.core.environment.earth.surface.ui/src-gen/org/eclipse/apogy/core/environment/earth/surface/ui/ApogyCoreEnvironmentSurfaceEarthUIPackage.java b/bundles/core/org.eclipse.apogy.core.environment.earth.surface.ui/src-gen/org/eclipse/apogy/core/environment/earth/surface/ui/ApogyCoreEnvironmentSurfaceEarthUIPackage.java
index 8006148..ef5db92 100644
--- a/bundles/core/org.eclipse.apogy.core.environment.earth.surface.ui/src-gen/org/eclipse/apogy/core/environment/earth/surface/ui/ApogyCoreEnvironmentSurfaceEarthUIPackage.java
+++ b/bundles/core/org.eclipse.apogy.core.environment.earth.surface.ui/src-gen/org/eclipse/apogy/core/environment/earth/surface/ui/ApogyCoreEnvironmentSurfaceEarthUIPackage.java
@@ -1034,6 +1034,24 @@
 	int SUN_VECTOR3_DTOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON = ApogyAddonsPackage.ABSTRACT_TWO_POINTS3_DTOOL___MOUSE_BUTTON_CLICKED__MOUSEBUTTON;
 
 	/**
+	 * The operation id for the '<em>Key Pressed</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SUN_VECTOR3_DTOOL___KEY_PRESSED__CHAR = ApogyAddonsPackage.ABSTRACT_TWO_POINTS3_DTOOL___KEY_PRESSED__CHAR;
+
+	/**
+	 * The operation id for the '<em>Key Released</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int SUN_VECTOR3_DTOOL___KEY_RELEASED__CHAR = ApogyAddonsPackage.ABSTRACT_TWO_POINTS3_DTOOL___KEY_RELEASED__CHAR;
+
+	/**
 	 * The operation id for the '<em>Points Relative Pose Changed</em>' operation.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
diff --git a/bundles/core/org.eclipse.apogy.core.topology.ui/src/org/eclipse/apogy/core/topology/ui/parts/AbstractApogy3dPart.java b/bundles/core/org.eclipse.apogy.core.topology.ui/src/org/eclipse/apogy/core/topology/ui/parts/AbstractApogy3dPart.java
index 898f7ec..3768a3d 100644
--- a/bundles/core/org.eclipse.apogy.core.topology.ui/src/org/eclipse/apogy/core/topology/ui/parts/AbstractApogy3dPart.java
+++ b/bundles/core/org.eclipse.apogy.core.topology.ui/src/org/eclipse/apogy/core/topology/ui/parts/AbstractApogy3dPart.java
@@ -172,7 +172,7 @@
 				}
 			};
 		}
-	
+			
 		parent.addDisposeListener(new DisposeListener() 
 		{			
 			@Override
@@ -188,40 +188,6 @@
 			}
 		});
 	}
-	
-//	@Override
-//	protected void createContentComposite(Composite parent, int style) {
-//		if (activeAbstractApogy3dPartMPart == null) {
-//			JME3RenderEngineDelegate jme3RenderEngineDelegate = createJME3RenderEngineDelegate();
-//			this.topologyViewer = new TopologyViewer(parent, jme3RenderEngineDelegate);
-//
-//			jme3RenderEngineDelegate.setMaximumFrameRate(this.topologyViewer.getMaximumFrameRate());
-//			jme3RenderEngineDelegate.setAntiAliasing(this.topologyViewer.isAntiAliasingEnabled());
-//			jme3RenderEngineDelegate.setShowStatisticsEnabled(this.topologyViewer.isShowStatisticsEnabled());
-//
-//			// Listens for selection in the 3D viewer.
-//			org.eclipse.apogy.common.topology.ui.viewer.Activator.getTopologyViewerRegistry().eAdapters()
-//					.add(getTopologyTopologyViewerRegistryAdapter());
-//
-//			setActiveViewPoint(this.abstractViewPoint);
-//
-//			activeAbstractApogy3dPartMPart = this.mPart;
-//		} else {
-//			new NoContentComposite(parent, SWT.None) {
-//				@Override
-//				protected String getMessage() {
-//					MPerspective mPerspective = AbstractApogy3dPart.this.modelService
-//							.getPerspectiveFor(activeAbstractApogy3dPartMPart);
-//
-//					String partLabel = activeAbstractApogy3dPartMPart.getLabel();
-//					String elementId = mPerspective.getLabel();
-//
-//					return "3D Viewer is already instanciated in part <" + partLabel + "> in the perspective named <"
-//							+ elementId + "> !";
-//				}
-//			};
-//		}
-//	}
 
 	@PersistState
 	public void userPersistState(MPart mPart)