more stuff to get the debug ui to work
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug.ui/src/org/eclipse/e4/languages/internal/javascript/debug/ui/launching/JavascriptSourceLocator.java b/bundles/org.eclipse.e4.languages.javascript.debug.ui/src/org/eclipse/e4/languages/internal/javascript/debug/ui/launching/JavascriptSourceLocator.java
index d5b43d8..b636923 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug.ui/src/org/eclipse/e4/languages/internal/javascript/debug/ui/launching/JavascriptSourceLocator.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug.ui/src/org/eclipse/e4/languages/internal/javascript/debug/ui/launching/JavascriptSourceLocator.java
@@ -10,16 +10,28 @@
  *******************************************************************************/
 package org.eclipse.e4.languages.internal.javascript.debug.ui.launching;
 
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.Writer;
+import java.util.HashMap;
+import java.util.Map;
+
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.debug.core.ILaunchConfiguration;
 import org.eclipse.debug.core.model.IPersistableSourceLocator;
 import org.eclipse.debug.core.model.IStackFrame;
+import org.eclipse.e4.languages.javascript.debug.model.JSDIStackFrame;
+import org.eclipse.e4.languages.javascript.jsdi.ScriptReference;
+import org.eclipse.e4.languages.javascript.jsdi.StackFrame;
 
 /**
  * 
  */
 public class JavascriptSourceLocator implements IPersistableSourceLocator {
 
+	private Map files = new HashMap();
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.debug.core.model.IPersistableSourceLocator#getMemento()
 	 */
@@ -48,8 +60,31 @@
 	 * @see org.eclipse.debug.core.model.ISourceLocator#getSourceElement(org.eclipse.debug.core.model.IStackFrame)
 	 */
 	public Object getSourceElement(IStackFrame stackFrame) {
-		// TODO Auto-generated method stub
+		JSDIStackFrame jsdiStackFrame = (JSDIStackFrame) stackFrame;
+		StackFrame underlyingStackFrame = jsdiStackFrame.getUnderlyingStackFrame();
+		
+		ScriptReference scriptReference = underlyingStackFrame.location().scriptReference();
+		String source = scriptReference.source();
+		
+		File file = (File) files.get(scriptReference);
+		if (file != null)
+			return file;
+		try {
+			file = File.createTempFile("" + scriptReference.hashCode(), "js");
+			
+			FileWriter writer = new FileWriter(file);
+			writer.write(source);
+			writer.close();
+			files.put(scriptReference, file);
+			return file;
+			
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
 		return null;
+
 	}
 
 }
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/model/JSDIProperty.java b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/model/JSDIProperty.java
new file mode 100644
index 0000000..f79757c
--- /dev/null
+++ b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/model/JSDIProperty.java
@@ -0,0 +1,140 @@
+/*******************************************************************************
+ * 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.debug.model;
+
+import org.eclipse.debug.core.DebugException;
+import org.eclipse.debug.core.model.IValue;
+import org.eclipse.debug.core.model.IVariable;
+import org.eclipse.e4.languages.javascript.jsdi.PropertiesReference;
+import org.eclipse.e4.languages.javascript.jsdi.Property;
+import org.eclipse.e4.languages.javascript.jsdi.Value;
+
+/**
+ * Default implementation of an {@link IVariable} with-respect-to Javascript debugging
+ * 
+ * @see JSDIValue
+ * @see JSDIStackFrame
+ * @since 1.0
+ */
+public class JSDIProperty extends JSDIDebugElement implements IVariable {
+
+	private Property property;
+
+	private PropertiesReference propertiesReference;
+
+	/**
+	 * Constructor
+	 * 
+	 * @param target
+	 */
+	public JSDIProperty(JSDIValue jsdiValue, PropertiesReference propertiesReference, Property property) {
+		super(jsdiValue.getJSDITarget());
+		this.propertiesReference = propertiesReference;
+		this.property = property;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.debug.core.model.IVariable#getName()
+	 */
+	public String getName() {
+		return property.name();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.debug.core.model.IVariable#getReferenceTypeName()
+	 */
+	public String getReferenceTypeName() throws DebugException {
+		return "unknown";
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.debug.core.model.IVariable#getValue()
+	 */
+	public IValue getValue() throws DebugException {
+		Value value = propertiesReference.getValue(property);
+		return new JSDIValue(this, value);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.debug.core.model.IVariable#hasValueChanged()
+	 */
+	public boolean hasValueChanged() throws DebugException {
+		// TODO need to consider this if we want to be able to edit variables
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+	 */
+	public Object getAdapter(Class adapter) {
+		if (adapter == JSDIProperty.class) {
+			return this;
+		}
+		return super.getAdapter(adapter);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.debug.core.model.IValueModification#setValue(java.lang.String)
+	 */
+	public void setValue(String expression) throws DebugException {
+		notSupported("Javascript variables do not support being edited", null);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.debug.core.model.IValueModification#setValue(org.eclipse.debug.core.model.IValue)
+	 */
+	public void setValue(IValue value) throws DebugException {
+		notSupported("Javascript variables do not support being edited", null);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.debug.core.model.IValueModification#supportsValueModification()
+	 */
+	public boolean supportsValueModification() {
+		// TODO Do we want to support this?
+		// if so we need to impl verifyValue()*
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.debug.core.model.IValueModification#verifyValue(java.lang.String)
+	 */
+	public boolean verifyValue(String expression) throws DebugException {
+		return false;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.debug.core.model.IValueModification#verifyValue(org.eclipse.debug.core.model.IValue)
+	 */
+	public boolean verifyValue(IValue value) throws DebugException {
+		return false;
+	}
+}
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/model/JSDIStackFrame.java b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/model/JSDIStackFrame.java
index 637f831..36ecc82 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/model/JSDIStackFrame.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/model/JSDIStackFrame.java
@@ -10,12 +10,17 @@
  *******************************************************************************/
 package org.eclipse.e4.languages.javascript.debug.model;
 
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
 import org.eclipse.debug.core.DebugException;
 import org.eclipse.debug.core.model.IRegisterGroup;
 import org.eclipse.debug.core.model.IStackFrame;
 import org.eclipse.debug.core.model.IThread;
 import org.eclipse.debug.core.model.IVariable;
 import org.eclipse.e4.languages.javascript.jsdi.StackFrame;
+import org.eclipse.e4.languages.javascript.jsdi.Variable;
 import org.eclipse.osgi.util.NLS;
 
 /**
@@ -33,7 +38,7 @@
 	/**
 	 * The underlying {@link StackFrame}
 	 */
-	private StackFrame stackframe = null;
+	private StackFrame stackFrame = null;
 
 	/**
 	 * Name cache
@@ -48,7 +53,11 @@
 	public JSDIStackFrame(JSDIThread thread, StackFrame stackFrame) {
 		super(thread.getJSDITarget());
 		this.thread = thread;
-		this.stackframe = stackFrame;
+		this.stackFrame = stackFrame;
+	}
+
+	public StackFrame getUnderlyingStackFrame() {
+		return stackFrame;
 	}
 
 	/*
@@ -75,7 +84,7 @@
 	 * @see org.eclipse.debug.core.model.IStackFrame#getLineNumber()
 	 */
 	public int getLineNumber() throws DebugException {
-		return (stackframe.location() != null ? stackframe.location().lineNumber() : -1);
+		return (stackFrame.location() != null ? stackFrame.location().lineNumber() : -1);
 	}
 
 	/*
@@ -85,9 +94,9 @@
 	 */
 	public String getName() throws DebugException {
 		if (name == null) {
-			name = stackframe.location().functionName();
+			name = stackFrame.location().functionName();
 			if (name == null) {
-				NLS.bind(ModelMessages.JSDIStackFrame_stackframe_name, new String[] { stackframe.location().scriptReference().source(), Integer.toString(stackframe.location().lineNumber()) });
+				NLS.bind(ModelMessages.JSDIStackFrame_stackframe_name, new String[] { stackFrame.location().scriptReference().source(), Integer.toString(stackFrame.location().lineNumber()) });
 			}
 		}
 		return name;
@@ -117,7 +126,15 @@
 	 * @see org.eclipse.debug.core.model.IStackFrame#getVariables()
 	 */
 	public IVariable[] getVariables() throws DebugException {
-		return (IVariable[]) stackframe.variables().toArray(new IVariable[stackframe.variables().size()]);
+		List variables = stackFrame.variables();
+
+		List result = new ArrayList(variables.size());
+		for (Iterator iterator = variables.iterator(); iterator.hasNext();) {
+			Variable variable = (Variable) iterator.next();
+			JSDIVariable jsdiVariable = new JSDIVariable(this, stackFrame, variable);
+			result.add(jsdiVariable);
+		}
+		return (IVariable[]) result.toArray(new IVariable[result.size()]);
 	}
 
 	/*
@@ -135,7 +152,7 @@
 	 * @see org.eclipse.debug.core.model.IStackFrame#hasVariables()
 	 */
 	public boolean hasVariables() throws DebugException {
-		return stackframe.variables().size() > 0;
+		return stackFrame.variables().size() > 0;
 	}
 
 	/*
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/model/JSDIThread.java b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/model/JSDIThread.java
index beb2d21..27c83f2 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/model/JSDIThread.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/model/JSDIThread.java
@@ -10,6 +10,7 @@
  *******************************************************************************/
 package org.eclipse.e4.languages.javascript.debug.model;
 
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
@@ -109,6 +110,7 @@
 	 */
 	public IStackFrame[] getStackFrames() throws DebugException {
 		if (frames == null) {
+			frames = new ArrayList();
 
 			List threadFrames = thread.frames();
 			for (Iterator iterator = threadFrames.iterator(); iterator.hasNext();) {
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/model/JSDIValue.java b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/model/JSDIValue.java
index 2716df0..72cdfab 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/model/JSDIValue.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/model/JSDIValue.java
@@ -10,22 +10,35 @@
  *******************************************************************************/
 package org.eclipse.e4.languages.javascript.debug.model;
 
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
 import org.eclipse.debug.core.DebugException;
 import org.eclipse.debug.core.model.IValue;
 import org.eclipse.debug.core.model.IVariable;
+import org.eclipse.e4.languages.javascript.jsdi.PropertiesReference;
+import org.eclipse.e4.languages.javascript.jsdi.Property;
+import org.eclipse.e4.languages.javascript.jsdi.Value;
 
 /**
  * Default implementation of
  */
 public class JSDIValue extends JSDIDebugElement implements IValue {
 
-	/**
-	 * Constructor
-	 * 
-	 * @param target
-	 */
-	public JSDIValue(JSDIDebugTarget target) {
-		super(target);
+	private Value value;
+	private String name;
+
+	public JSDIValue(JSDIVariable jsdiVariable, Value value) {
+		super(jsdiVariable.getJSDITarget());
+		this.name = jsdiVariable.getName();
+		this.value = value;
+	}
+
+	public JSDIValue(JSDIProperty jsdiProperty, Value value) {
+		super(jsdiProperty.getJSDITarget());
+		this.name = jsdiProperty.getName();
+		this.value = value;
 	}
 
 	/*
@@ -34,8 +47,7 @@
 	 * @see org.eclipse.debug.core.model.IValue#getReferenceTypeName()
 	 */
 	public String getReferenceTypeName() throws DebugException {
-		// TODO Auto-generated method stub
-		return null;
+		return value.getValueTypeName();
 	}
 
 	/**
@@ -44,8 +56,7 @@
 	 * @return the variable name
 	 */
 	public String getName() {
-		// TODO show actual variable name
-		return "Var";
+		return name;
 	}
 
 	/*
@@ -54,8 +65,7 @@
 	 * @see org.eclipse.debug.core.model.IValue#getValueString()
 	 */
 	public String getValueString() throws DebugException {
-		// TODO Auto-generated method stub
-		return null;
+		return value.toString();
 	}
 
 	/*
@@ -64,8 +74,18 @@
 	 * @see org.eclipse.debug.core.model.IValue#getVariables()
 	 */
 	public IVariable[] getVariables() throws DebugException {
-		// TODO Auto-generated method stub
-		return null;
+		if (!hasVariables())
+			return null;
+		PropertiesReference reference = (PropertiesReference) value;
+
+		List properties = reference.properties();
+		List result = new ArrayList(properties.size());
+		for (Iterator iterator = properties.iterator(); iterator.hasNext();) {
+			Property property = (Property) iterator.next();
+			JSDIProperty jsdiProperty = new JSDIProperty(this, reference, property);
+			result.add(jsdiProperty);
+		}
+		return (IVariable[]) result.toArray(new IVariable[result.size()]);
 	}
 
 	/*
@@ -74,8 +94,7 @@
 	 * @see org.eclipse.debug.core.model.IValue#hasVariables()
 	 */
 	public boolean hasVariables() throws DebugException {
-		// TODO Auto-generated method stub
-		return false;
+		return (value instanceof PropertiesReference);
 	}
 
 	/*
@@ -84,7 +103,6 @@
 	 * @see org.eclipse.debug.core.model.IValue#isAllocated()
 	 */
 	public boolean isAllocated() throws DebugException {
-		// TODO Auto-generated method stub
 		return false;
 	}
 
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/model/JSDIVariable.java b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/model/JSDIVariable.java
index bd3a641..6313cd2 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/model/JSDIVariable.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/model/JSDIVariable.java
@@ -13,6 +13,9 @@
 import org.eclipse.debug.core.DebugException;
 import org.eclipse.debug.core.model.IValue;
 import org.eclipse.debug.core.model.IVariable;
+import org.eclipse.e4.languages.javascript.jsdi.StackFrame;
+import org.eclipse.e4.languages.javascript.jsdi.Value;
+import org.eclipse.e4.languages.javascript.jsdi.Variable;
 
 /**
  * Default implementation of an {@link IVariable} with-respect-to Javascript debugging
@@ -23,25 +26,19 @@
  */
 public class JSDIVariable extends JSDIDebugElement implements IVariable {
 
-	/**
-	 * The underlying stack frame
-	 */
-	private JSDIStackFrame frame = null;
+	private Variable variable;
 
-	/**
-	 * The underlying value for the variable
-	 */
-	private JSDIValue value = null;
+	private StackFrame stackFrame;
 
 	/**
 	 * Constructor
 	 * 
 	 * @param target
 	 */
-	public JSDIVariable(JSDIDebugTarget target, JSDIStackFrame frame, JSDIValue value) {
-		super(target);
-		this.frame = frame;
-		this.value = value;
+	public JSDIVariable(JSDIStackFrame frame, StackFrame stackFrame, Variable variable) {
+		super(frame.getJSDITarget());
+		this.stackFrame = stackFrame;
+		this.variable = variable;
 	}
 
 	/*
@@ -49,11 +46,8 @@
 	 * 
 	 * @see org.eclipse.debug.core.model.IVariable#getName()
 	 */
-	public String getName() throws DebugException {
-		if (this.value != null) {
-			return this.value.getName();
-		}
-		return null;
+	public String getName() {
+		return variable.name();
 	}
 
 	/*
@@ -62,10 +56,7 @@
 	 * @see org.eclipse.debug.core.model.IVariable#getReferenceTypeName()
 	 */
 	public String getReferenceTypeName() throws DebugException {
-		if (this.value != null) {
-			return this.value.getReferenceTypeName();
-		}
-		return null;
+		return "unknown";
 	}
 
 	/*
@@ -74,7 +65,8 @@
 	 * @see org.eclipse.debug.core.model.IVariable#getValue()
 	 */
 	public IValue getValue() throws DebugException {
-		return this.value;
+		Value value = stackFrame.getValue(variable);
+		return new JSDIValue(this, value);
 	}
 
 	/*
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/rhino/DebugFrameImpl.java b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/rhino/DebugFrameImpl.java
index 3a6d64d..c9da04d 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/rhino/DebugFrameImpl.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/rhino/DebugFrameImpl.java
@@ -117,8 +117,14 @@
 	}
 
 	public Object lookup(Long handle) {
+
 		Object result = handles.get(handle);
-		return serialize(handle, result);
+		context.getFactory().enter();
+		try {
+			return serialize(handle, result);
+		} finally {
+			Context.exit();
+		}
 	}
 
 	public Object toJSON() {
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/rhino/RhinoDebugger.java b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/rhino/RhinoDebugger.java
index f6033bc..87510ce 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/rhino/RhinoDebugger.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/rhino/RhinoDebugger.java
@@ -150,7 +150,8 @@
 
 	public synchronized void suspend(Long threadId) {
 		ThreadData threadData = (ThreadData) threadIdToData.get(threadId);
-		threadData.suspend();
+		if (threadData != null)
+			threadData.suspend();
 	}
 
 	public synchronized void suspendAll() {
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/rhino/ThreadData.java b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/rhino/ThreadData.java
index f6fc90e..f3bc1af 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/rhino/ThreadData.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/debug/rhino/ThreadData.java
@@ -7,6 +7,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.eclipse.e4.languages.javascript.debug.connect.EventPacket;
 import org.mozilla.javascript.Context;
 import org.mozilla.javascript.debug.DebugFrame;
 import org.mozilla.javascript.debug.DebuggableScript;
@@ -46,10 +47,22 @@
 		ContextData contextData = new ContextData(threadId, new Long(currentContextId++), debugger);
 		context.setDebugger(debugger, contextData);
 		contexts.push(context);
+		if (contexts.size() == 1)
+			sendThreadEvent("enter");
 	}
 
 	public synchronized void contextReleased(Context context) {
 		contexts.pop();
+		if (contexts.isEmpty())
+			sendThreadEvent("exit");
+	}
+
+	private void sendThreadEvent(String type) {
+		EventPacket threadEvent = new EventPacket("thread");
+		Map body = threadEvent.getBody();
+		body.put("type", type);
+		body.put("threadId", threadId);
+		debugger.sendEvent(threadEvent);
 	}
 
 	public synchronized boolean hasContext() {
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/jsdi/Value.java b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/jsdi/Value.java
index 59b492d..2475879 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/jsdi/Value.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/jsdi/Value.java
@@ -17,4 +17,6 @@
  */
 public interface Value extends Mirror {
 
+	String getValueTypeName();
+
 }
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/jsdi/Variable.java b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/jsdi/Variable.java
index c96be33..a2c23fe 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/jsdi/Variable.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/jsdi/Variable.java
@@ -15,7 +15,7 @@
  * 
  * @since 1.0
  */
-public interface Variable extends Mirror {
+public interface Variable extends Property {
 	public boolean isArgument();
 
 	/**
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/BooleanValueImpl.java b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/BooleanValueImpl.java
index cbe077f..c5eb494 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/BooleanValueImpl.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/BooleanValueImpl.java
@@ -20,4 +20,8 @@
 	public boolean value() {
 		return value.booleanValue();
 	}
+
+	public String getValueTypeName() {
+		return "boolean";
+	}
 }
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/NullValueImpl.java b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/NullValueImpl.java
index 582fc61..cdb5bed 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/NullValueImpl.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/NullValueImpl.java
@@ -32,4 +32,8 @@
 	public String toString() {
 		return "null";
 	}
+
+	public String getValueTypeName() {
+		return "null";
+	}
 }
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/NumberValueImpl.java b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/NumberValueImpl.java
index 745722a..6ecd9a2 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/NumberValueImpl.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/NumberValueImpl.java
@@ -20,4 +20,8 @@
 	public Number value() {
 		return value;
 	}
+
+	public String getValueTypeName() {
+		return "number";
+	}
 }
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/ObjectReferenceImpl.java b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/ObjectReferenceImpl.java
index b9c49de..7561f0c 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/ObjectReferenceImpl.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/ObjectReferenceImpl.java
@@ -29,8 +29,8 @@
 	public ObjectReferenceImpl(VirtualMachineImpl vm, Map body, StackFrameImpl frame) {
 		super(vm, body, frame);
 		this.className = (String) body.get("className");
-		this.constructorRef = (Number) ((Map) body.get("constructor")).get("ref");
-		this.prototypeRef = (Number) ((Map) body.get("prototype")).get("ref");
+		this.constructorRef = (Number) ((Map) body.get("constructorFunction")).get("ref");
+		this.prototypeRef = (Number) ((Map) body.get("prototypeObject")).get("ref");
 	}
 
 	public String className() {
@@ -44,4 +44,8 @@
 	public ObjectReference prototype() {
 		return (ObjectReference) frame.lookupValue(prototypeRef);
 	}
+
+	public String getValueTypeName() {
+		return "object";
+	}
 }
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/PropertiesReferenceImpl.java b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/PropertiesReferenceImpl.java
index be34e8e..9831089 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/PropertiesReferenceImpl.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/PropertiesReferenceImpl.java
@@ -24,7 +24,7 @@
  * 
  * @since 1.0
  */
-public class PropertiesReferenceImpl extends MirrorImpl implements PropertiesReference {
+abstract public class PropertiesReferenceImpl extends MirrorImpl implements PropertiesReference {
 
 	protected StackFrameImpl frame;
 	private final List properties = new ArrayList();
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/StackFrameImpl.java b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/StackFrameImpl.java
index 5fdda61..a964af6 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/StackFrameImpl.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/StackFrameImpl.java
@@ -115,7 +115,8 @@
 	 *             if the type description in the map is unknown
 	 */
 	private Value createValue(Map body) throws IllegalStateException {
-		String type = (String) body.get(JSONConstants.TYPE);
+		Map lookup = (Map) body.get(JSONConstants.LOOKUP);
+		String type = (String) lookup.get(JSONConstants.TYPE);
 		// "undefined", "null", "boolean", "number", "string", "object", "function"
 
 		if (type.equals(JSONConstants.UNDEFINED))
@@ -123,17 +124,17 @@
 		else if (type.equals(JSONConstants.NULL))
 			return vm.nullValue;
 		else if (type.equals(JSONConstants.BOOLEAN))
-			return new BooleanValueImpl(vm, body);
+			return new BooleanValueImpl(vm, lookup);
 		else if (type.equals(JSONConstants.NUMBER))
-			return new NumberValueImpl(vm, body);
+			return new NumberValueImpl(vm, lookup);
 		else if (type.equals(JSONConstants.STRING))
-			return new StringValueImpl(vm, body);
+			return new StringValueImpl(vm, lookup);
 		else if (type.equals(JSONConstants.OBJECT))
-			return new ObjectReferenceImpl(vm, body, this);
+			return new ObjectReferenceImpl(vm, lookup, this);
 		else if (type.equals(JSONConstants.FUNCTION))
-			return new FunctionReferenceImpl(vm, body, this);
+			return new FunctionReferenceImpl(vm, lookup, this);
 		else if (type.equals(JSONConstants.ARRAY))
-			return new ArrayReferenceImpl(vm, body, this);
+			return new ArrayReferenceImpl(vm, lookup, this);
 		else
 			throw new IllegalStateException();
 	}
@@ -176,11 +177,12 @@
 		}
 		Request request = new Request(JSONConstants.LOOKUP);
 		request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-		request.getArguments().put(JSONConstants.FRAME_ID, threadId);
+		request.getArguments().put(JSONConstants.FRAME_ID, frameId);
 		request.getArguments().put(JSONConstants.HANDLE, ref);
 		try {
 			Response response = vm.sendRequest(request, 30000);
-			List properties = (List) response.getBody().get(JSONConstants.PROPERTIES);
+			Map lookup = (Map) response.getBody().get(JSONConstants.LOOKUP);
+			List properties = (List) lookup.get(JSONConstants.PROPERTIES);
 			variables = new ArrayList();
 			for (Iterator iterator = properties.iterator(); iterator.hasNext();) {
 				Map property = (Map) iterator.next();
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/StringValueImpl.java b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/StringValueImpl.java
index 90f98b6..aea85c3 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/StringValueImpl.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/StringValueImpl.java
@@ -49,4 +49,8 @@
 	public String toString() {
 		return value();
 	}
+
+	public String getValueTypeName() {
+		return "string";
+	}
 }
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/ThreadReferenceImpl.java b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/ThreadReferenceImpl.java
index 1641b8c..c24975c 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/ThreadReferenceImpl.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/ThreadReferenceImpl.java
@@ -16,8 +16,6 @@
 public class ThreadReferenceImpl extends MirrorImpl implements ThreadReference {
 
 	private Number threadId;
-	private VirtualMachineImpl vm;
-
 	private List frames = new ArrayList();
 	private int status = THREAD_STATUS_RUNNING;
 	private boolean suspended;
@@ -29,9 +27,19 @@
 		super(vm);
 		this.threadId = (Number) jsonThread.get("threadId");
 		this.name = (String) jsonThread.get("name");
+		if (this.name == null)
+			this.name = "Rhino thread - " + threadId;
 		this.suspended = "suspended".equals(jsonThread.get("state"));
 	}
 
+	private ThreadReferenceImpl(VirtualMachineImpl vm, Long threadId) {
+		super(vm);
+		this.threadId = threadId;
+		this.name = "Rhino thread - " + threadId;
+		this.status = THREAD_STATUS_ZOMBIE;
+		this.frames = Collections.EMPTY_LIST;
+	}
+
 	public synchronized int frameCount() {
 		frames();
 		return frames.size();
@@ -43,6 +51,9 @@
 	}
 
 	public synchronized List frames() {
+		if (status == THREAD_STATUS_ZOMBIE)
+			return frames;
+
 		if (!suspended)
 			throw new IllegalStateException("not suspended");
 
@@ -50,6 +61,7 @@
 			return frames;
 
 		Request request = new Request("frames");
+		request.getArguments().put("threadId", threadId);
 		try {
 			Response response = vm.sendRequest(request, 30000);
 			List frameIds = (List) response.getBody().get("frames");
@@ -74,7 +86,7 @@
 	private StackFrameImpl createStackFrame(Long frameId) {
 		Request request = new Request("frame");
 		request.getArguments().put("threadId", threadId);
-		request.getArguments().put("frameId", threadId);
+		request.getArguments().put("frameId", frameId);
 		try {
 			Response response = vm.sendRequest(request, 30000);
 			Map jsonFrame = (Map) response.getBody().get("frame");
@@ -105,6 +117,9 @@
 	}
 
 	public synchronized void resume() {
+		if (status == THREAD_STATUS_ZOMBIE) {
+			return;
+		}
 		Request request = new Request("continue");
 		request.getArguments().put("threadId", threadId);
 		if (step != null) {
@@ -126,10 +141,16 @@
 	}
 
 	public void suspend() {
+		if (status == THREAD_STATUS_ZOMBIE) {
+			return;
+		}
+
 		Request request = new Request("suspend");
 		request.getArguments().put("threadId", threadId);
 		try {
 			vm.sendRequest(request, 30000);
+			// TODO: really make this work
+			suspended = true;
 		} catch (DisconnectException e) {
 			e.printStackTrace();
 		} catch (TimeoutException e) {
@@ -142,7 +163,7 @@
 	}
 
 	public synchronized int status() {
-		return this.status;
+		return status;
 	}
 
 	public synchronized String getStep() {
@@ -153,4 +174,8 @@
 		this.step = step;
 	}
 
+	public static ThreadReferenceImpl zombie(VirtualMachineImpl vm, Long threadId) {
+		return new ThreadReferenceImpl(vm, threadId);
+	}
+
 }
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/UndefinedValueImpl.java b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/UndefinedValueImpl.java
index c00a472..1eb93dc 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/UndefinedValueImpl.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/UndefinedValueImpl.java
@@ -31,4 +31,8 @@
 	public String toString() {
 		return "undefined";
 	}
+
+	public String getValueTypeName() {
+		return "undefined";
+	}
 }
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/VariableImpl.java b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/VariableImpl.java
index 15ab9e5..5780855 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/VariableImpl.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/VariableImpl.java
@@ -15,7 +15,6 @@
 	}
 
 	public boolean isArgument() {
-		// TODO Auto-generated method stub
 		return false;
 	}
 
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/VirtualMachineImpl.java b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/VirtualMachineImpl.java
index 6bf85be..8341ef6 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/VirtualMachineImpl.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/VirtualMachineImpl.java
@@ -100,8 +100,15 @@
 	 * @param scriptId
 	 * @param script
 	 */
-	public synchronized void addScript(Long scriptId, ScriptReferenceImpl script) {
-		scripts.put(scriptId, script);
+	public synchronized ScriptReferenceImpl addScript(Long scriptId) {
+		ScriptReferenceImpl script = (ScriptReferenceImpl) scripts.get(scriptId);
+		if (script != null)
+			return script;
+
+		script = createScriptReference(scriptId);
+		if (script != null)
+			scripts.put(scriptId, script);
+		return script;
 	}
 
 	/**
@@ -173,15 +180,33 @@
 		return new ArrayList(threads.values());
 	}
 
+	public synchronized ThreadReferenceImpl addThread(Long threadId) {
+		ThreadReferenceImpl thread = (ThreadReferenceImpl) threads.get(threadId);
+		if (thread != null)
+			return thread;
+
+		thread = createThreadReference(threadId);
+		if (thread != null)
+			threads.put(threadId, thread);
+		return thread;
+	}
+
+	public synchronized ThreadReferenceImpl removeThread(Long threadId) {
+		return (ThreadReferenceImpl) threads.remove(threadId);
+	}
+
 	/**
 	 * @param threadId
 	 * @return
 	 */
 	private ThreadReferenceImpl createThreadReference(Long threadId) {
 		Request request = new Request(JSONConstants.THREAD);
+		request.getArguments().put(JSONConstants.THREAD_ID, threadId);
 		try {
 			Response response = sendRequest(request, 30000);
 			Map jsonThread = (Map) response.getBody().get(JSONConstants.THREAD);
+			if (jsonThread == null)
+				return ThreadReferenceImpl.zombie(this, threadId);
 			return new ThreadReferenceImpl(this, jsonThread);
 		} catch (DisconnectException e) {
 			e.printStackTrace();
@@ -196,7 +221,13 @@
 	 * @return
 	 */
 	public synchronized ThreadReferenceImpl getThread(Long threadId) {
-		return (ThreadReferenceImpl) threads.get(threadId);
+		ThreadReferenceImpl thread = (ThreadReferenceImpl) threads.get(threadId);
+		if (thread == null) {
+			thread = createThreadReference(threadId);
+			if (thread != null)
+				threads.put(threadId, thread);
+		}
+		return thread;
 	}
 
 	/*
diff --git a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/event/EventQueueImpl.java b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/event/EventQueueImpl.java
index 52b0f94..e28d2a3 100644
--- a/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/event/EventQueueImpl.java
+++ b/bundles/org.eclipse.e4.languages.javascript.debug/src/org/eclipse/e4/languages/javascript/rhino/jsdi/event/EventQueueImpl.java
@@ -7,8 +7,6 @@
 import org.eclipse.e4.languages.javascript.debug.JSONConstants;
 import org.eclipse.e4.languages.javascript.debug.connect.DisconnectException;
 import org.eclipse.e4.languages.javascript.debug.connect.EventPacket;
-import org.eclipse.e4.languages.javascript.debug.connect.Request;
-import org.eclipse.e4.languages.javascript.debug.connect.Response;
 import org.eclipse.e4.languages.javascript.debug.connect.TimeoutException;
 import org.eclipse.e4.languages.javascript.jsdi.Location;
 import org.eclipse.e4.languages.javascript.jsdi.ThreadReference;
@@ -73,8 +71,7 @@
 					eventSet.setThread(thread);
 
 					Long scriptId = new Long(((Number) event.getBody().get(JSONConstants.SCRIPT_ID)).longValue());
-					ScriptReferenceImpl script = loadScriptReference(scriptId);
-					vm.addScript(scriptId, script);
+					ScriptReferenceImpl script = vm.addScript(scriptId);
 
 					List scriptLoadRequests = eventRequestManager.scriptLoadRequests();
 					for (Iterator iterator = scriptLoadRequests.iterator(); iterator.hasNext();) {
@@ -94,18 +91,20 @@
 					Location location = script.lineLocation(lineNumber);
 
 					List jsonBreakpoints = (List) event.getBody().get(JSONConstants.BREAKPOINTS);
-					List breakpoints = new ArrayList(jsonBreakpoints.size());
-					for (Iterator iterator = jsonBreakpoints.iterator(); iterator.hasNext();) {
-						Number breakpointId = (Number) iterator.next();
-						breakpoints.add(new Long(breakpointId.longValue()));
-					}
+					if (jsonBreakpoints != null) {
+						List breakpoints = new ArrayList(jsonBreakpoints.size());
+						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();
-						ThreadReference requestThread = request.thread();
-						if (request.isEnabled() && (requestThread == null || thread == requestThread) && breakpoints.contains(request.breakpointId()))
-							eventSet.add(new BreakpointEventImpl(vm, thread, location, request));
+						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));
+						}
 					}
 
 					String stepType = (String) event.getBody().get(JSONConstants.STEP_TYPE);
@@ -126,6 +125,11 @@
 								eventSet.add(new StepEventImpl(vm, thread, location, request));
 						}
 					}
+					if (eventSet.isEmpty()) {
+						// debugger case
+						thread.markSuspended(false);
+						continue;
+					}
 
 				} else if (eventName.equals(JSONConstants.EXCEPTION)) {
 					Long threadId = new Long(((Number) event.getBody().get(JSONConstants.THREAD_ID)).longValue());
@@ -147,18 +151,19 @@
 					}
 				} else if (eventName.equals(JSONConstants.THREAD)) {
 					Long threadId = new Long(((Number) event.getBody().get(JSONConstants.THREAD_ID)).longValue());
-					ThreadReferenceImpl thread = vm.getThread(threadId);
-					eventSet.setThread(thread);
 
 					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();
 							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();
@@ -179,24 +184,4 @@
 		}
 		return null;
 	}
-
-	/**
-	 * Creates a new {@link ScriptReferenceImpl}
-	 * 
-	 * @param scriptId
-	 * @return a new {@link ScriptReferenceImpl} or <code>null</code> if the VM has been disconnected or times out
-	 */
-	private ScriptReferenceImpl loadScriptReference(Long scriptId) {
-		Request request = new Request(JSONConstants.SCRIPT);
-		request.getArguments().put(JSONConstants.SCRIPT_ID, scriptId);
-		try {
-			Response response = vm.sendRequest(request);
-			return new ScriptReferenceImpl(vm, response.getBody());
-		} catch (TimeoutException e) {
-			e.printStackTrace();
-		} catch (DisconnectException e) {
-			e.printStackTrace();
-		}
-		return null;
-	}
 }
diff --git a/bundles/org.eclipse.e4.languages.javascript/src/org/eclipse/e4/internal/languages/javascript/Activator.java b/bundles/org.eclipse.e4.languages.javascript/src/org/eclipse/e4/internal/languages/javascript/Activator.java
index 56268f4..e2b87dc 100644
--- a/bundles/org.eclipse.e4.languages.javascript/src/org/eclipse/e4/internal/languages/javascript/Activator.java
+++ b/bundles/org.eclipse.e4.languages.javascript/src/org/eclipse/e4/internal/languages/javascript/Activator.java
@@ -131,7 +131,7 @@
 		}
 		
 		if (contextFactory != null && packageAdmin != null) {
-			framework = new JSFrameworkImpl();
+			framework = new JSFrameworkImpl(contextFactory);
 			jsBundleTracker = new JSBundleTracker(context, framework);
 			jsBundleTracker.open();
 			registration = context.registerService(JSFramework.class.getName(), framework, null);