diff --git a/bundles/org.eclipse.e4.languages.javascript.debug.connect/src/org/eclipse/e4/languages/javascript/debug/connect/JSONConstants.java b/bundles/org.eclipse.e4.languages.javascript.debug.connect/src/org/eclipse/e4/languages/javascript/debug/connect/JSONConstants.java
index 4b7b8d7..cf324b4 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug.connect/src/org/eclipse/e4/languages/javascript/debug/connect/JSONConstants.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug.connect/src/org/eclipse/e4/languages/javascript/debug/connect/JSONConstants.java
@@ -56,6 +56,7 @@
 	public static final String PROTOTYPE_OBJECT = "prototypeObject"; //$NON-NLS-1$
 	public static final String PROTO_OBJECT = "protoObject"; //$NON-NLS-1$
 	public static final String CONSTRUCTOR_FUNCTION = "constructorFunction"; //$NON-NLS-1$
+	public static final String NAN = "NaN"; //$NON-NLS-1$
 
 	// id constants
 	public static final String THREAD_ID = "threadId"; //$NON-NLS-1$
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/src/org/eclipse/e4/languages/javascript/jsdi/rhino/NaNValueImpl.java b/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/src/org/eclipse/e4/languages/javascript/jsdi/rhino/NaNValueImpl.java
new file mode 100644
index 0000000..c16bb87
--- /dev/null
+++ b/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/src/org/eclipse/e4/languages/javascript/jsdi/rhino/NaNValueImpl.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2009 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.e4.languages.javascript.jsdi.rhino;
+
+import org.eclipse.e4.languages.javascript.debug.connect.JSONConstants;
+import org.eclipse.e4.languages.javascript.jsdi.NaNValue;
+
+/**
+ * Rhino implementation of {@link NaNValue}
+ * 
+ * @since 1.0
+ */
+public class NaNValueImpl extends MirrorImpl implements NaNValue {
+
+	/**
+	 * Constructor
+	 * 
+	 * @param vm
+	 * @param description
+	 */
+	public NaNValueImpl(VirtualMachineImpl vm) {
+		super(vm);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		return JSONConstants.NAN;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.e4.languages.javascript.jsdi.Value#getValueTypeName()
+	 */
+	public String getValueTypeName() {
+		return JSONConstants.NAN;
+	}
+}
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/src/org/eclipse/e4/languages/javascript/jsdi/rhino/StackFrameImpl.java b/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/src/org/eclipse/e4/languages/javascript/jsdi/rhino/StackFrameImpl.java
index 6d40b42..c110ad2 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/src/org/eclipse/e4/languages/javascript/jsdi/rhino/StackFrameImpl.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/src/org/eclipse/e4/languages/javascript/jsdi/rhino/StackFrameImpl.java
@@ -43,8 +43,7 @@
 		this.contextId = (Number) jsonFrame.get(JSONConstants.CONTEXT_ID);
 		this.ref = (Number) jsonFrame.get(JSONConstants.REF);
 
-		Long scriptId = new Long(((Number) jsonFrame
-				.get(JSONConstants.SCRIPT_ID)).longValue());
+		Long scriptId = new Long(((Number) jsonFrame.get(JSONConstants.SCRIPT_ID)).longValue());
 		ScriptReferenceImpl script = vm.script(scriptId);
 
 		String function = (String) jsonFrame.get(JSONConstants.FUNCTION);
@@ -53,8 +52,7 @@
 		} else {
 			Number line = (Number) jsonFrame.get(JSONConstants.LINE);
 			Location lineLocation = script.lineLocation(line.intValue());
-			this.location = lineLocation != null ? lineLocation
-					: new LocationImpl(vm, function, line.intValue(), script);
+			this.location = lineLocation != null ? lineLocation : new LocationImpl(vm, function, line.intValue(), script);
 		}
 
 	}
@@ -62,9 +60,7 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see
-	 * org.eclipse.e4.languages.javascript.jsdi.StackFrame#evaluate(java.lang
-	 * .String)
+	 * @see org.eclipse.e4.languages.javascript.jsdi.StackFrame#evaluate(java.lang .String)
 	 */
 	public Value evaluate(String expression) {
 		Request request = new Request(JSONConstants.EVALUATE);
@@ -85,9 +81,7 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see
-	 * org.eclipse.e4.languages.javascript.jsdi.StackFrame#getValue(org.eclipse
-	 * .e4.languages.javascript.jsdi.Variable)
+	 * @see org.eclipse.e4.languages.javascript.jsdi.StackFrame#getValue(org.eclipse .e4.languages.javascript.jsdi.Variable)
 	 */
 	public Value getValue(Variable variable) {
 		VariableImpl variableImpl = (VariableImpl) variable;
@@ -125,13 +119,15 @@
 	private Value createValue(Map body) throws IllegalStateException {
 		Map lookup = (Map) body.get(JSONConstants.LOOKUP);
 		String type = (String) lookup.get(JSONConstants.TYPE);
-		// "undefined", "null", "boolean", "number", "string", "object",
+		// "undefined", "null", "NaN", "boolean", "number", "string", "object",
 		// "function"
 
 		if (type.equals(JSONConstants.UNDEFINED))
 			return vm.undefinedValue;
 		else if (type.equals(JSONConstants.NULL))
 			return vm.nullValue;
+		else if (type.equals(JSONConstants.NAN))
+			return vm.nanValue;
 		else if (type.equals(JSONConstants.BOOLEAN))
 			return new BooleanValueImpl(vm, lookup);
 		else if (type.equals(JSONConstants.NUMBER))
@@ -217,8 +213,7 @@
 	 * @return true if this frame is visible, false otherwise
 	 */
 	public synchronized boolean isVisible(VariableImpl variable) {
-		return variables != null
-				&& (thisVariable == variable || variables.contains(variable));
+		return variables != null && (thisVariable == variable || variables.contains(variable));
 	}
 
 	/**
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/src/org/eclipse/e4/languages/javascript/jsdi/rhino/VirtualMachineImpl.java b/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/src/org/eclipse/e4/languages/javascript/jsdi/rhino/VirtualMachineImpl.java
index 0868bcf..b781472 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/src/org/eclipse/e4/languages/javascript/jsdi/rhino/VirtualMachineImpl.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/src/org/eclipse/e4/languages/javascript/jsdi/rhino/VirtualMachineImpl.java
@@ -28,16 +28,14 @@
  */
 public class VirtualMachineImpl implements VirtualMachine {
 
-	public final UndefinedValueImpl undefinedValue = new UndefinedValueImpl(
-			this);
+	public final UndefinedValueImpl undefinedValue = new UndefinedValueImpl(this);
 	public final NullValueImpl nullValue = new NullValueImpl(this);
+	public final NaNValueImpl nanValue = new NaNValueImpl(this);
 
 	private final Map scripts = new HashMap();
 	private final DebugSession session;
-	private EventRequestManagerImpl eventRequestManager = new EventRequestManagerImpl(
-			this);
-	private final EventQueue eventQueue = new EventQueueImpl(this,
-			eventRequestManager);
+	private EventRequestManagerImpl eventRequestManager = new EventRequestManagerImpl(this);
+	private final EventQueue eventQueue = new EventQueueImpl(this, eventRequestManager);
 	private Map threads = new HashMap();
 	private boolean disconnected = false;
 
@@ -58,8 +56,7 @@
 		Request request = new Request(JSONConstants.SCRIPTS);
 		try {
 			Response response = sendRequest(request);
-			List scriptIds = (List) response.getBody().get(
-					JSONConstants.SCRIPTS);
+			List scriptIds = (List) response.getBody().get(JSONConstants.SCRIPTS);
 
 			for (Iterator iterator = scriptIds.iterator(); iterator.hasNext();) {
 				Long scriptId = new Long(((Number) iterator.next()).longValue());
@@ -106,8 +103,7 @@
 	 * @param script
 	 */
 	public synchronized ScriptReferenceImpl addScript(Long scriptId) {
-		ScriptReferenceImpl script = (ScriptReferenceImpl) scripts
-				.get(scriptId);
+		ScriptReferenceImpl script = (ScriptReferenceImpl) scripts.get(scriptId);
 		if (script != null)
 			return script;
 
@@ -131,8 +127,7 @@
 	 * @throws TimeoutException
 	 * @throws DisconnectException
 	 */
-	public EventPacket receiveEvent(int timeout) throws TimeoutException,
-			DisconnectException {
+	public EventPacket receiveEvent(int timeout) throws TimeoutException, DisconnectException {
 		return session.receiveEvent(timeout);
 	}
 
@@ -145,8 +140,7 @@
 	 * @throws TimeoutException
 	 * @throws DisconnectException
 	 */
-	public Response sendRequest(Request request, int timeout)
-			throws TimeoutException, DisconnectException {
+	public Response sendRequest(Request request, int timeout) throws TimeoutException, DisconnectException {
 		session.sendRequest(request);
 		return session.receiveResponse(request.getSequence(), timeout);
 	}
@@ -154,12 +148,9 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see
-	 * org.eclipse.e4.languages.javascript.jsdi.VirtualMachine#sendRequest(org
-	 * .eclipse.e4.languages.javascript.debug.connect.Request)
+	 * @see org.eclipse.e4.languages.javascript.jsdi.VirtualMachine#sendRequest(org .eclipse.e4.languages.javascript.debug.connect.Request)
 	 */
-	public Response sendRequest(Request request) throws TimeoutException,
-			DisconnectException {
+	public Response sendRequest(Request request) throws TimeoutException, DisconnectException {
 		return sendRequest(request, 30000);
 	}
 
@@ -172,13 +163,11 @@
 		Request request = new Request(JSONConstants.THREADS);
 		try {
 			Response response = sendRequest(request);
-			List threadIds = (List) response.getBody().get(
-					JSONConstants.THREADS);
+			List threadIds = (List) response.getBody().get(JSONConstants.THREADS);
 			HashMap allThreads = new HashMap(threadIds.size());
 			for (Iterator iterator = threadIds.iterator(); iterator.hasNext();) {
 				Long threadId = new Long(((Number) iterator.next()).longValue());
-				ThreadReferenceImpl thread = (ThreadReferenceImpl) threads
-						.get(threadId);
+				ThreadReferenceImpl thread = (ThreadReferenceImpl) threads.get(threadId);
 				if (thread == null) {
 					thread = createThreadReference(threadId);
 				}
@@ -194,8 +183,7 @@
 	}
 
 	public synchronized ThreadReferenceImpl addThread(Long threadId) {
-		ThreadReferenceImpl thread = (ThreadReferenceImpl) threads
-				.get(threadId);
+		ThreadReferenceImpl thread = (ThreadReferenceImpl) threads.get(threadId);
 		if (thread != null)
 			return thread;
 
@@ -235,8 +223,7 @@
 	 * @return
 	 */
 	public synchronized ThreadReferenceImpl getThread(Long threadId) {
-		ThreadReferenceImpl thread = (ThreadReferenceImpl) threads
-				.get(threadId);
+		ThreadReferenceImpl thread = (ThreadReferenceImpl) threads.get(threadId);
 		if (thread == null) {
 			thread = createThreadReference(threadId);
 			if (thread != null)
@@ -248,19 +235,15 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see
-	 * org.eclipse.e4.languages.javascript.jsdi.VirtualMachine#description()
+	 * @see org.eclipse.e4.languages.javascript.jsdi.VirtualMachine#description()
 	 */
 	public String description() {
 		Request request = new Request(JSONConstants.VERSION);
 		try {
 			Response response = sendRequest(request);
 			StringBuffer buffer = new StringBuffer();
-			buffer.append(
-					(String) response.getBody().get(JSONConstants.VM_VENDOR))
-					.append(JSONConstants.SPACE);
-			buffer.append(response.getBody().get(JSONConstants.VM_NAME))
-					.append(JSONConstants.SPACE);
+			buffer.append((String) response.getBody().get(JSONConstants.VM_VENDOR)).append(JSONConstants.SPACE);
+			buffer.append(response.getBody().get(JSONConstants.VM_NAME)).append(JSONConstants.SPACE);
 			buffer.append(response.getBody().get(JSONConstants.VM_VERSION));
 			return buffer.toString();
 		} catch (DisconnectException e) {
@@ -386,8 +369,7 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see
-	 * org.eclipse.e4.languages.javascript.jsdi.VirtualMachine#mirrorOf(boolean)
+	 * @see org.eclipse.e4.languages.javascript.jsdi.VirtualMachine#mirrorOf(boolean)
 	 */
 	public Value mirrorOf(boolean bool) {
 		return new BooleanValueImpl(this, Boolean.valueOf(bool));
@@ -396,8 +378,7 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see
-	 * org.eclipse.e4.languages.javascript.jsdi.VirtualMachine#mirrorOf(int)
+	 * @see org.eclipse.e4.languages.javascript.jsdi.VirtualMachine#mirrorOf(int)
 	 */
 	public Value mirrorOf(Number number) {
 		return new NumberValueImpl(this, number);
@@ -406,9 +387,7 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see
-	 * org.eclipse.e4.languages.javascript.jsdi.VirtualMachine#mirrorOf(java
-	 * .lang.String)
+	 * @see org.eclipse.e4.languages.javascript.jsdi.VirtualMachine#mirrorOf(java .lang.String)
 	 */
 	public StringValue mirrorOf(String string) {
 		return new StringValueImpl(this, string);
@@ -417,8 +396,7 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see
-	 * org.eclipse.e4.languages.javascript.jsdi.VirtualMachine#mirrorOfNull()
+	 * @see org.eclipse.e4.languages.javascript.jsdi.VirtualMachine#mirrorOfNull()
 	 */
 	public Value mirrorOfNull() {
 		return nullValue;
@@ -427,9 +405,16 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see
-	 * org.eclipse.e4.languages.javascript.jsdi.VirtualMachine#mirrorOfUndefined
-	 * ()
+	 * @see org.eclipse.e4.languages.javascript.jsdi.VirtualMachine#mirrorOfNull()
+	 */
+	public Value mirrorOfNaN() {
+		return nanValue;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.e4.languages.javascript.jsdi.VirtualMachine#mirrorOfUndefined ()
 	 */
 	public Value mirrorOfUndefined() {
 		return undefinedValue;
@@ -438,9 +423,7 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see
-	 * org.eclipse.e4.languages.javascript.jsdi.VirtualMachine#eventRequestManager
-	 * ()
+	 * @see org.eclipse.e4.languages.javascript.jsdi.VirtualMachine#eventRequestManager ()
 	 */
 	public EventRequestManager eventRequestManager() {
 		return eventRequestManager;
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/src/org/eclipse/e4/languages/javascript/jsdi/rhino/event/EventQueueImpl.java b/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/src/org/eclipse/e4/languages/javascript/jsdi/rhino/event/EventQueueImpl.java
index 4227433..abeb71b 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/src/org/eclipse/e4/languages/javascript/jsdi/rhino/event/EventQueueImpl.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug.jsdi.rhino/src/org/eclipse/e4/languages/javascript/jsdi/rhino/event/EventQueueImpl.java
@@ -41,8 +41,7 @@
 	 * @param vm
 	 * @param eventRequestManager
 	 */
-	public EventQueueImpl(VirtualMachineImpl vm,
-			EventRequestManagerImpl eventRequestManager) {
+	public EventQueueImpl(VirtualMachineImpl vm, EventRequestManagerImpl eventRequestManager) {
 		this.vm = vm;
 		this.eventRequestManager = eventRequestManager;
 	}
@@ -59,8 +58,7 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see
-	 * org.eclipse.e4.languages.javascript.jsdi.event.EventQueue#remove(int)
+	 * @see org.eclipse.e4.languages.javascript.jsdi.event.EventQueue#remove(int)
 	 */
 	public EventSet remove(int timeout) {
 		try {
@@ -69,114 +67,80 @@
 				String eventName = event.getEvent();
 				EventSetImpl eventSet = new EventSetImpl(vm);
 				if (eventName.equals(JSONConstants.SCRIPT)) {
-					Long threadId = new Long(((Number) event.getBody().get(
-							JSONConstants.THREAD_ID)).longValue());
+					Long threadId = new Long(((Number) event.getBody().get(JSONConstants.THREAD_ID)).longValue());
 					ThreadReferenceImpl thread = vm.getThread(threadId);
 					eventSet.setThread(thread);
 
-					Long scriptId = new Long(((Number) event.getBody().get(
-							JSONConstants.SCRIPT_ID)).longValue());
+					Long scriptId = new Long(((Number) event.getBody().get(JSONConstants.SCRIPT_ID)).longValue());
 					ScriptReferenceImpl script = vm.addScript(scriptId);
 
-					List scriptLoadRequests = eventRequestManager
-							.scriptLoadRequests();
-					for (Iterator iterator = scriptLoadRequests.iterator(); iterator
-							.hasNext();) {
-						ScriptLoadRequest request = (ScriptLoadRequest) iterator
-								.next();
+					List scriptLoadRequests = eventRequestManager.scriptLoadRequests();
+					for (Iterator iterator = scriptLoadRequests.iterator(); iterator.hasNext();) {
+						ScriptLoadRequest request = (ScriptLoadRequest) iterator.next();
 						if (request.isEnabled())
-							eventSet.add(new ScriptLoadEventImpl(vm, thread,
-									script, request));
+							eventSet.add(new ScriptLoadEventImpl(vm, thread, script, request));
 					}
 				} else if (eventName.equals(JSONConstants.BREAK)) {
-					Long threadId = new Long(((Number) event.getBody().get(
-							JSONConstants.THREAD_ID)).longValue());
+					Long threadId = new Long(((Number) event.getBody().get(JSONConstants.THREAD_ID)).longValue());
 					ThreadReferenceImpl thread = vm.getThread(threadId);
 					eventSet.setThread(thread);
 
-					Long scriptId = new Long(((Number) event.getBody().get(
-							JSONConstants.SCRIPT_ID)).longValue());
+					Long scriptId = new Long(((Number) event.getBody().get(JSONConstants.SCRIPT_ID)).longValue());
 					ScriptReferenceImpl script = vm.getScript(scriptId);
 
-					int lineNumber = ((Number) event.getBody().get(
-							JSONConstants.LINE_NUMBER)).intValue();
+					int lineNumber = ((Number) event.getBody().get(JSONConstants.LINE_NUMBER)).intValue();
 					Location location = script.lineLocation(lineNumber);
 
 					boolean atBreakpoint = false;
 
-					List jsonBreakpoints = (List) event.getBody().get(
-							JSONConstants.BREAKPOINTS);
+					List jsonBreakpoints = (List) event.getBody().get(JSONConstants.BREAKPOINTS);
 					if (jsonBreakpoints != null) {
 						List breakpoints = new ArrayList(jsonBreakpoints.size());
-						for (Iterator iterator = jsonBreakpoints.iterator(); iterator
-								.hasNext();) {
+						for (Iterator iterator = jsonBreakpoints.iterator(); iterator.hasNext();) {
 							Number breakpointId = (Number) iterator.next();
 							breakpoints.add(new Long(breakpointId.longValue()));
 						}
 
-						List breakpointRequests = eventRequestManager
-								.breakpointRequests();
-						for (Iterator iterator = breakpointRequests.iterator(); iterator
-								.hasNext();) {
-							BreakpointRequestImpl request = (BreakpointRequestImpl) iterator
-									.next();
+						List breakpointRequests = eventRequestManager.breakpointRequests();
+						for (Iterator iterator = breakpointRequests.iterator(); iterator.hasNext();) {
+							BreakpointRequestImpl request = (BreakpointRequestImpl) iterator.next();
 							ThreadReference requestThread = request.thread();
-							if (request.isEnabled()
-									&& (requestThread == null || thread == requestThread)
-									&& breakpoints.contains(request
-											.breakpointId())) {
-								eventSet.add(new BreakpointEventImpl(vm,
-										thread, location, request));
+							if (request.isEnabled() && (requestThread == null || thread == requestThread) && breakpoints.contains(request.breakpointId())) {
+								eventSet.add(new BreakpointEventImpl(vm, thread, location, request));
 								atBreakpoint = true;
 							}
 						}
 					}
 
-					String stepType = (String) event.getBody().get(
-							JSONConstants.STEP);
+					String stepType = (String) event.getBody().get(JSONConstants.STEP);
 					if (JSONConstants.SUSPENDED.equals(stepType)) {
-						List suspendRequests = eventRequestManager
-								.suspendRequests();
-						for (Iterator iterator = suspendRequests.iterator(); iterator
-								.hasNext();) {
-							SuspendRequestImpl request = (SuspendRequestImpl) iterator
-									.next();
+						List suspendRequests = eventRequestManager.suspendRequests();
+						for (Iterator iterator = suspendRequests.iterator(); iterator.hasNext();) {
+							SuspendRequestImpl request = (SuspendRequestImpl) iterator.next();
 							ThreadReference requestThread = request.thread();
-							if (request.isEnabled()
-									&& (requestThread == null || thread == requestThread)) {
-								eventSet.add(new SuspendEventImpl(vm, thread,
-										location, request));
+							if (request.isEnabled() && (requestThread == null || thread == requestThread)) {
+								eventSet.add(new SuspendEventImpl(vm, thread, location, request));
 							}
 						}
 					} else if (stepType != null) {
 						List stepRequests = eventRequestManager.stepRequests();
-						for (Iterator iterator = stepRequests.iterator(); iterator
-								.hasNext();) {
-							StepRequestImpl request = (StepRequestImpl) iterator
-									.next();
+						for (Iterator iterator = stepRequests.iterator(); iterator.hasNext();) {
+							StepRequestImpl request = (StepRequestImpl) iterator.next();
 							ThreadReference requestThread = request.thread();
-							if (request.isEnabled()
-									&& (requestThread == null || thread == requestThread)) {
-								eventSet.add(new StepEventImpl(vm, thread,
-										location, request));
+							if (request.isEnabled() && (requestThread == null || thread == requestThread)) {
+								eventSet.add(new StepEventImpl(vm, thread, location, request));
 							}
 						}
 					}
 
-					Boolean debuggerStatement = (Boolean) event.getBody().get(
-							JSONConstants.DEBUGGER_STATEMENT);
+					Boolean debuggerStatement = (Boolean) event.getBody().get(JSONConstants.DEBUGGER_STATEMENT);
 					if (debuggerStatement.booleanValue()) {
-						List debuggerStatementRequests = eventRequestManager
-								.debuggerStatementRequests();
-						for (Iterator iterator = debuggerStatementRequests
-								.iterator(); iterator.hasNext();) {
-							DebuggerStatementRequestImpl request = (DebuggerStatementRequestImpl) iterator
-									.next();
+						List debuggerStatementRequests = eventRequestManager.debuggerStatementRequests();
+						for (Iterator iterator = debuggerStatementRequests.iterator(); iterator.hasNext();) {
+							DebuggerStatementRequestImpl request = (DebuggerStatementRequestImpl) iterator.next();
 							ThreadReference requestThread = request.thread();
-							if (request.isEnabled()
-									&& (requestThread == null || thread == requestThread)) {
-								eventSet.add(new DebuggerStatementEventImpl(vm,
-										thread, location, request));
+							if (request.isEnabled() && (requestThread == null || thread == requestThread)) {
+								eventSet.add(new DebuggerStatementEventImpl(vm, thread, location, request));
 							}
 						}
 					}
@@ -184,66 +148,48 @@
 					if (!eventSet.isEmpty())
 						thread.markSuspended(atBreakpoint);
 				} else if (eventName.equals(JSONConstants.EXCEPTION)) {
-					Long threadId = new Long(((Number) event.getBody().get(
-							JSONConstants.THREAD_ID)).longValue());
+					Long threadId = new Long(((Number) event.getBody().get(JSONConstants.THREAD_ID)).longValue());
 					ThreadReferenceImpl thread = vm.getThread(threadId);
 					eventSet.setThread(thread);
 
-					Long scriptId = new Long(((Number) event.getBody().get(
-							JSONConstants.SCRIPT_ID)).longValue());
+					Long scriptId = new Long(((Number) event.getBody().get(JSONConstants.SCRIPT_ID)).longValue());
 					ScriptReferenceImpl script = vm.getScript(scriptId);
 
-					int lineNumber = ((Number) event.getBody().get(
-							JSONConstants.LINE_NUMBER)).intValue();
+					int lineNumber = ((Number) event.getBody().get(JSONConstants.LINE_NUMBER)).intValue();
 					Location location = script.lineLocation(lineNumber);
 
-					String message = (String) event.getBody().get(
-							JSONConstants.MESSAGE);
+					String message = (String) event.getBody().get(JSONConstants.MESSAGE);
 
-					List exceptionRequests = eventRequestManager
-							.scriptLoadRequests();
-					for (Iterator iterator = exceptionRequests.iterator(); iterator
-							.hasNext();) {
-						ExceptionRequest request = (ExceptionRequest) iterator
-								.next();
+					List exceptionRequests = eventRequestManager.exceptionRequests();
+					for (Iterator iterator = exceptionRequests.iterator(); iterator.hasNext();) {
+						ExceptionRequest request = (ExceptionRequest) iterator.next();
 						if (request.isEnabled()) {
-							eventSet.add(new ExceptionEventImpl(vm, thread,
-									location, message, request));
+							eventSet.add(new ExceptionEventImpl(vm, thread, location, message, request));
 						}
 					}
 					if (!eventSet.isEmpty())
 						thread.markSuspended(false);
 				} else if (eventName.equals(JSONConstants.THREAD)) {
-					Long threadId = new Long(((Number) event.getBody().get(
-							JSONConstants.THREAD_ID)).longValue());
+					Long threadId = new Long(((Number) event.getBody().get(JSONConstants.THREAD_ID)).longValue());
 
-					String type = (String) event.getBody().get(
-							JSONConstants.TYPE);
+					String type = (String) event.getBody().get(JSONConstants.TYPE);
 
 					if (JSONConstants.ENTER.equals(type)) {
 						ThreadReferenceImpl thread = vm.addThread(threadId);
 						eventSet.setThread(thread);
-						List threadEnterRequests = eventRequestManager
-								.threadEnterRequests();
-						for (Iterator iterator = threadEnterRequests.iterator(); iterator
-								.hasNext();) {
-							ThreadEnterRequest request = (ThreadEnterRequest) iterator
-									.next();
+						List threadEnterRequests = eventRequestManager.threadEnterRequests();
+						for (Iterator iterator = threadEnterRequests.iterator(); iterator.hasNext();) {
+							ThreadEnterRequest request = (ThreadEnterRequest) iterator.next();
 							if (request.isEnabled())
-								eventSet.add(new ThreadEnterEventImpl(vm,
-										thread, request));
+								eventSet.add(new ThreadEnterEventImpl(vm, thread, request));
 						}
 					} else if (JSONConstants.EXIT.equals(type)) {
 						ThreadReferenceImpl thread = vm.removeThread(threadId);
-						List threadExitRequests = eventRequestManager
-								.threadExitRequests();
-						for (Iterator iterator = threadExitRequests.iterator(); iterator
-								.hasNext();) {
-							ThreadExitRequest request = (ThreadExitRequest) iterator
-									.next();
+						List threadExitRequests = eventRequestManager.threadExitRequests();
+						for (Iterator iterator = threadExitRequests.iterator(); iterator.hasNext();) {
+							ThreadExitRequest request = (ThreadExitRequest) iterator.next();
 							if (request.isEnabled())
-								eventSet.add(new ThreadExitEventImpl(vm,
-										thread, request));
+								eventSet.add(new ThreadExitEventImpl(vm, thread, request));
 						}
 					}
 				}
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug.jsdi/META-INF/MANIFEST.MF b/bundles/org.eclipse.e4.languages.javascript.debug.jsdi/META-INF/MANIFEST.MF
index 5244b5e..56e044c 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug.jsdi/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.e4.languages.javascript.debug.jsdi/META-INF/MANIFEST.MF
@@ -4,6 +4,6 @@
 Bundle-SymbolicName: org.eclipse.e4.languages.javascript.debug.jsdi
 Bundle-Version: 1.0.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
-Export-Package: org.eclipse.e4.languages.javascript.jsdi;x-friends:="org.eclipse.e4.languages.javascript.debug.test",
+Export-Package: org.eclipse.e4.languages.javascript.jsdi,
  org.eclipse.e4.languages.javascript.jsdi.event,
  org.eclipse.e4.languages.javascript.jsdi.request
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug.jsdi/src/org/eclipse/e4/languages/javascript/jsdi/NaNValue.java b/bundles/org.eclipse.e4.languages.javascript.debug.jsdi/src/org/eclipse/e4/languages/javascript/jsdi/NaNValue.java
new file mode 100644
index 0000000..6c9da93
--- /dev/null
+++ b/bundles/org.eclipse.e4.languages.javascript.debug.jsdi/src/org/eclipse/e4/languages/javascript/jsdi/NaNValue.java
@@ -0,0 +1,5 @@
+package org.eclipse.e4.languages.javascript.jsdi;
+
+public interface NaNValue extends Value {
+
+}
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug.jsdi/src/org/eclipse/e4/languages/javascript/jsdi/VirtualMachine.java b/bundles/org.eclipse.e4.languages.javascript.debug.jsdi/src/org/eclipse/e4/languages/javascript/jsdi/VirtualMachine.java
index 271e13f..49fccb2 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug.jsdi/src/org/eclipse/e4/languages/javascript/jsdi/VirtualMachine.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug.jsdi/src/org/eclipse/e4/languages/javascript/jsdi/VirtualMachine.java
@@ -91,6 +91,13 @@
 	public Value mirrorOfNull();
 
 	/**
+	 * Returns a new {@link Value} that represents <code>NaN</code>
+	 * 
+	 * @return a new <code>NaN</code> {@link Value}
+	 */
+	public Value mirrorOfNaN();
+
+	/**
 	 * Returns a new boolean {@link Value}
 	 * 
 	 * @param bool
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug.rhino/src/org/eclipse/e4/languages/javascript/debug/rhino/ContextData.java b/bundles/org.eclipse.e4.languages.javascript.debug.rhino/src/org/eclipse/e4/languages/javascript/debug/rhino/ContextData.java
index 22733d7..a1450bf 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug.rhino/src/org/eclipse/e4/languages/javascript/debug/rhino/ContextData.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug.rhino/src/org/eclipse/e4/languages/javascript/debug/rhino/ContextData.java
@@ -190,7 +190,7 @@
 			stepFrame = null;
 		} else {
 			// TODO NLS this
-			throw new IllegalStateException("bad stepType: "+ stepType); //$NON-NLS-1$
+			throw new IllegalStateException("bad stepType: " + stepType); //$NON-NLS-1$
 		}
 		contextState = CONTEXT_RUNNING;
 		notifyAll();
@@ -260,6 +260,7 @@
 		EventPacket exceptionEvent = new EventPacket(JSONConstants.EXCEPTION);
 		Map body = exceptionEvent.getBody();
 		body.put(JSONConstants.CONTEXT_ID, contextId);
+		body.put(JSONConstants.THREAD_ID, threadId);
 		body.put(JSONConstants.SCRIPT_ID, script.getId());
 		body.put(JSONConstants.LINE_NUMBER, lineNumber);
 		body.put(JSONConstants.MESSAGE, ex.getMessage());
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug.rhino/src/org/eclipse/e4/languages/javascript/debug/rhino/DebugFrameImpl.java b/bundles/org.eclipse.e4.languages.javascript.debug.rhino/src/org/eclipse/e4/languages/javascript/debug/rhino/DebugFrameImpl.java
index 25f0b04..948b6d6 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug.rhino/src/org/eclipse/e4/languages/javascript/debug/rhino/DebugFrameImpl.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug.rhino/src/org/eclipse/e4/languages/javascript/debug/rhino/DebugFrameImpl.java
@@ -256,6 +256,8 @@
 			serializeUndefined(result);
 		} else if (object == null) {
 			serializeNull(result);
+		} else if (object == ScriptRuntime.NaNobj) {
+			serializeNaN(result);
 		} else if (object instanceof Boolean) {
 			serializeSimpleType(object, JSONConstants.BOOLEAN, result);
 		} else if (object instanceof Number) {
@@ -293,6 +295,10 @@
 		result.put(JSONConstants.TYPE, JSONConstants.NULL);
 	}
 
+	private void serializeNaN(Map result) {
+		result.put(JSONConstants.TYPE, JSONConstants.NAN);
+	}
+
 	/**
 	 * Serialize the given simple type
 	 * 
diff --git a/examples/sample.js.debugdisplay/scripts/script.js b/examples/sample.js.debugdisplay/scripts/script.js
index f1fba29..c26375c 100644
--- a/examples/sample.js.debugdisplay/scripts/script.js
+++ b/examples/sample.js.debugdisplay/scripts/script.js
@@ -9,5 +9,4 @@
 var aPrintableObject = {x: 5, y: 25};
 var aMap             = {};
 var anArray          = [];
-var anArguments      = arguments;
 debugger;
