diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/.classpath b/bundles/org.eclipse.wst.jsdt.debug.core/.classpath
deleted file mode 100644
index 2fbb7a2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/.project b/bundles/org.eclipse.wst.jsdt.debug.core/.project
deleted file mode 100644
index 8dca928..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.jsdt.debug.core</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.wst.jsdt.debug.core/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index de9eac3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,90 +0,0 @@
-#Fri Apr 30 10:04:28 CDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
-org.eclipse.jdt.core.compiler.problem.deadCode=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=error
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=error
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/.settings/org.eclipse.pde.api.tools.prefs b/bundles/org.eclipse.wst.jsdt.debug.core/.settings/org.eclipse.pde.api.tools.prefs
deleted file mode 100644
index fd31153..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/.settings/org.eclipse.pde.api.tools.prefs
+++ /dev/null
@@ -1,94 +0,0 @@
-#Fri Feb 19 09:13:55 CST 2010
-ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
-ANNOTATION_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
-API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_API_TYPE=Error
-API_COMPONENT_ELEMENT_TYPE_REMOVED_REEXPORTED_TYPE=Error
-API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
-CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
-CLASS_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
-CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
-CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
-CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
-CLASS_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
-CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
-CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
-CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
-CLASS_ELEMENT_TYPE_REMOVED_SUPERCLASS=Error
-CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
-CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
-ENUM_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
-ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
-ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
-ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
-ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
-FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
-FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
-FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
-FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
-FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
-FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
-FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENT=Error
-FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
-ILLEGAL_EXTEND=Error
-ILLEGAL_IMPLEMENT=Error
-ILLEGAL_INSTANTIATE=Error
-ILLEGAL_OVERRIDE=Error
-ILLEGAL_REFERENCE=Error
-INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
-INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
-INTERFACE_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
-INTERFACE_ELEMENT_TYPE_ADDED_SUPER_INTERFACE_WITH_METHODS=Error
-INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-INTERFACE_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
-INTERFACE_ELEMENT_TYPE_CHANGED_TYPE_CONVERSION=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-INVALID_JAVADOC_TAG=Error
-INVALID_REFERENCE_IN_SYSTEM_LIBRARIES=Error
-LEAK_EXTEND=Error
-LEAK_FIELD_DECL=Error
-LEAK_IMPLEMENT=Error
-LEAK_METHOD_PARAM=Error
-LEAK_METHOD_RETURN_TYPE=Error
-METHOD_ELEMENT_TYPE_ADDED_RESTRICTIONS=Error
-METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
-METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
-METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
-METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
-METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
-METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
-METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-TYPE_PARAMETER_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
-TYPE_PARAMETER_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
-TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
-TYPE_PARAMETER_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
-TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
-TYPE_PARAMETER_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
-UNUSED_PROBLEM_FILTERS=Error
-automatically_removed_unused_problem_filters=Enabled
-eclipse.preferences.version=1
-incompatible_api_component_version=Error
-incompatible_api_component_version_include_major_without_breaking_change=Disabled
-incompatible_api_component_version_include_minor_without_api_change=Disabled
-invalid_since_tag_version=Error
-malformed_since_tag=Error
-missing_since_tag=Error
-report_api_breakage_when_major_version_incremented=Disabled
-report_resolution_errors_api_component=Error
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.jsdt.debug.core/META-INF/MANIFEST.MF
deleted file mode 100644
index 03702aa..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,22 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %bundleName.name
-Bundle-SymbolicName: org.eclipse.wst.jsdt.debug.core;singleton:=true
-Bundle-Version: 1.0.3.qualifier
-Bundle-Activator: org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin
-Bundle-Vendor: %bundleVendor.name
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.debug.core
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.wst.jsdt.debug.core.breakpoints,
- org.eclipse.wst.jsdt.debug.core.jsdi,
- org.eclipse.wst.jsdt.debug.core.jsdi.connect,
- org.eclipse.wst.jsdt.debug.core.jsdi.event,
- org.eclipse.wst.jsdt.debug.core.jsdi.request,
- org.eclipse.wst.jsdt.debug.core.model,
- org.eclipse.wst.jsdt.debug.internal.core;x-friends:="org.eclipse.wst.jsdt.debug.ui",
- org.eclipse.wst.jsdt.debug.internal.core.breakpoints;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.core.launching;x-friends:="org.eclipse.wst.jsdt.debug.ui",
- org.eclipse.wst.jsdt.debug.internal.core.model;x-friends:="org.eclipse.wst.jsdt.debug.ui"
-Import-Package: org.eclipse.wst.jsdt.core
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/OSGI-INF/l10n/bundle.properties b/bundles/org.eclipse.wst.jsdt.debug.core/OSGI-INF/l10n/bundle.properties
deleted file mode 100644
index 406f8d7..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/OSGI-INF/l10n/bundle.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 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
-###############################################################################
-launchConfigurationType.name = JavaScript
-linebreakpoint.name = JavaScript Line Breakpoint
-methodbreakpoint.name = JavaScript Function Breakpoint
-scriptloadbreakpoint.name = JavaScript Script Load Breakpoint
-exceptionbreakpoint.name = JavaScript Exception Breakpoint
-launchDelegate.name = JavaScript Launcher
-launchDelegate.description = Launches a Javascript session
-sourceLocator.name = JavaScript Source Locator
-bundleVendor.name = Eclipse Web Tools Platform
-bundleName.name = JavaScript Debug Core
-connectorsExtPoint.name = connectors
-remoteJsLaunchDelegate.name = Remote JavaScript
-breakpointParticipantsExt.name = Breakpoint Participants
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/about.html b/bundles/org.eclipse.wst.jsdt.debug.core/about.html
deleted file mode 100755
index b4a1c56..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>March 10, 2010</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/build.properties b/bundles/org.eclipse.wst.jsdt.debug.core/build.properties
deleted file mode 100644
index 38f0951..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/build.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               OSGI-INF/,\
-               OSGI-INF/l10n/,\
-               about.html,\
-               OSGI-INF/l10n/bundle.properties
-src.includes = about.html,\
-               schema/
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/plugin.xml b/bundles/org.eclipse.wst.jsdt.debug.core/plugin.xml
deleted file mode 100644
index 0fbf079..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/plugin.xml
+++ /dev/null
@@ -1,153 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?><!--
-    Copyright (c) 2010 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
- -->
-
-<plugin>
-   <extension-point id="launchingConnectors" name="%connectorsExtPoint.name" schema="schema/launchingConnectors.exsd"/>
-   <extension-point id="breakpointParticipants" name="%breakpointParticipantsExt.name" schema="schema/breakpointParticipants.exsd"/>
-   <extension
-         point="org.eclipse.debug.core.launchConfigurationTypes">
-      <launchConfigurationType
-            id="org.eclipse.wst.jsdt.debug.core.launchConfigurationType"
-            modes="run,debug"
-            name="%launchConfigurationType.name"
-            public="true">
-      </launchConfigurationType>
-   </extension>
-   <extension
-         id="org.eclipse.wst.jsdt.debug.core.line.breakpoint.marker"
-         name="%linebreakpoint.name"
-         point="org.eclipse.core.resources.markers">
-      <super
-            type="org.eclipse.debug.core.lineBreakpointMarker">
-      </super>
-      <persistent
-            value="true">
-      </persistent>
-   </extension>
-   <extension
-         id="org.eclipse.wst.jsdt.debug.core.function.breakpoint.marker"
-         name="%methodbreakpoint.name"
-         point="org.eclipse.core.resources.markers">
-      <super
-            type="org.eclipse.wst.jsdt.debug.core.breakpoint.marker">
-      </super>
-      <super
-            type="org.eclipse.jdt.debug.javaMethodBreakpointMarker">
-      </super>
-      <persistent
-            value="true">
-      </persistent>
-   </extension>
-   <extension
-         id="org.eclipse.wst.jsdt.debug.core.scriptload.breakpoint.marker"
-         name="%scriptloadbreakpoint.name"
-         point="org.eclipse.core.resources.markers">
-      <super
-            type="org.eclipse.wst.jsdt.debug.core.breakpoint.marker">
-      </super>
-      <super
-            type="org.eclipse.jdt.debug.javaClassPrepareBreakpointMarker">
-      </super>
-      <persistent
-            value="true">
-      </persistent>
-   </extension>
-   <extension
-         id="org.eclipse.wst.jsdt.debug.core.breakpoint.marker"
-         point="org.eclipse.core.resources.markers">
-      <super
-            type="org.eclipse.debug.core.breakpointMarker">
-      </super>
-   </extension>
-   <extension
-         id="org.eclipse.wst.jsdt.debug.core.exception.breakpoint.marker"
-         name="%exceptionbreakpoint.name"
-         point="org.eclipse.core.resources.markers">
-      <super
-            type="org.eclipse.wst.jsdt.debug.core.breakpoint.marker">
-      </super>
-      <super
-            type="org.eclipse.jdt.debug.javaExceptionBreakpointMarker">
-      </super>
-      <persistent
-            value="true">
-      </persistent>
-   </extension>
-   <extension
-         point="org.eclipse.debug.core.breakpoints">
-      <breakpoint
-            class="org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptLineBreakpoint"
-            id="org.eclipse.wst.jsdt.debug.core.linebreakpoint"
-            markerType="org.eclipse.wst.jsdt.debug.core.line.breakpoint.marker"
-            name="%linebreakpoint.name">
-      </breakpoint>
-      <breakpoint
-            class="org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptFunctionBreakpoint"
-            id="org.eclipse.wst.jsdt.debug.core.functionbreakpoint"
-            markerType="org.eclipse.wst.jsdt.debug.core.function.breakpoint.marker"
-            name="%methodbreakpoint.name">
-      </breakpoint>
-      <breakpoint
-            class="org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptLoadBreakpoint"
-            id="org.eclipse.wst.jsdt.debug.core.scriptloadbreakpoint"
-            markerType="org.eclipse.wst.jsdt.debug.core.scriptload.breakpoint.marker"
-            name="%scriptloadbreakpoint.name">
-      </breakpoint>
-      <breakpoint
-            class="org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptExceptionBreakpoint"
-            id="org.eclipse.wst.jsdt.debug.core.exceptionbreakpoint"
-            markerType="org.eclipse.wst.jsdt.debug.core.exception.breakpoint.marker"
-            name="%exceptionbreakpoint.name">
-      </breakpoint>
-   </extension>
-   <extension
-         point="org.eclipse.debug.core.launchDelegates">
-      <launchDelegate
-            delegate="org.eclipse.wst.jsdt.debug.internal.core.launching.RemoteJavaScriptLaunchDelegate"
-            delegateDescription="Remote JavaScript"
-            id="org.eclipse.wst.jsdt.debug.core.remoteLaunchDelegate"
-            modes="debug"
-            name="%remoteJsLaunchDelegate.name"
-            sourceLocatorId="org.eclipse.wst.jsdt.debug.core.sourceLocator"
-            type="org.eclipse.wst.jsdt.debug.core.launchConfigurationType">
-      </launchDelegate>
-   </extension>
-   <extension
-         point="org.eclipse.debug.core.sourceLocators">
-      <sourceLocator
-            class="org.eclipse.wst.jsdt.debug.internal.core.launching.JavaScriptSourceDirector"
-            id="org.eclipse.wst.jsdt.debug.core.sourceLocator"
-            name="%sourceLocator.name">
-      </sourceLocator>
-   </extension>
-   <extension
-         point="org.eclipse.debug.core.watchExpressionDelegates">
-      <watchExpressionDelegate
-            debugModel="org.eclipse.wst.jsdt.debug.model"
-            delegateClass="org.eclipse.wst.jsdt.debug.internal.core.JavaScriptWatchExpressionDelegate">
-      </watchExpressionDelegate>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.preferences">
-      <initializer
-            class="org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPreferenceInitializer">
-      </initializer>
-   </extension>
-   <extension
-         point="org.eclipse.wst.jsdt.debug.core.breakpointParticipants">
-      <participant
-            class="org.eclipse.wst.jsdt.debug.internal.core.breakpoints.DefaultJavaScriptBreakpointParticipant"
-            kind="*">
-      </participant>
-   </extension>
-
-</plugin>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/schema/breakpointParticipants.exsd b/bundles/org.eclipse.wst.jsdt.debug.core/schema/breakpointParticipants.exsd
deleted file mode 100644
index abd0bc9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/schema/breakpointParticipants.exsd
+++ /dev/null
@@ -1,146 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.jsdt.debug.core" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.wst.jsdt.debug.core" id="breakpointParticipants" name="Breakpoint Participants"/>
-      </appinfo>
-      <documentation>
-         This extension point allows consumers to provide a breakpoint participant that will be consulted during the decision to suspend the kind of breakpoint the participant applies to.
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence minOccurs="1" maxOccurs="unbounded">
-            <element ref="participant"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="participant">
-      <annotation>
-         <documentation>
-            The breakpoint participant
-         </documentation>
-      </annotation>
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The class attribute is required and must implement &lt;code&gt;org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant&lt;/code&gt;
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn=":org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="kind" use="required">
-            <annotation>
-               <documentation>
-                  This attribute specifies the kind of breakpoint this participant should apply to the value &lt;em&gt;*&lt;/em&gt; means it applies to all breakpoint kinds. The value must be one of &lt;em&gt;function&lt;/em&gt;, &lt;em&gt;line&lt;/em&gt;, &lt;em&gt;script&lt;/em&gt; or &lt;em&gt;*&lt;/em&gt;.
-               </documentation>
-            </annotation>
-            <simpleType>
-               <restriction base="string">
-                  <enumeration value="function">
-                  </enumeration>
-                  <enumeration value="line">
-                  </enumeration>
-                  <enumeration value="script">
-                  </enumeration>
-                  <enumeration value="*">
-                  </enumeration>
-               </restriction>
-            </simpleType>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         1.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following example is the real life definition of the Mozilla Rhino participant for line breakpoints.
-&lt;pre&gt;
-&lt;extension point=&quot;org.eclipse.wst.jsdt.debug.core.breakpointParticipants&quot;&gt;
-  &lt;participant
-     class=&quot;org.eclipse.wst.jsdt.debug.internal.rhino.breakpoints.RhinoBreakpointParticipant&quot;
-     kind=&quot;*&quot;&gt;
-  &lt;/participant&gt;
-&lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiinfo"/>
-      </appinfo>
-      <documentation>
-         The class attribute is required and must implement &lt;code&gt;org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant&lt;/code&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="implementation"/>
-      </appinfo>
-      <documentation>
-         [Enter information about supplied implementation of this extension point.]
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2010 IBM Corporation and others.&lt;br&gt;
-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 
-&lt;a href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/schema/launchingConnectors.exsd b/bundles/org.eclipse.wst.jsdt.debug.core/schema/launchingConnectors.exsd
deleted file mode 100644
index b7f88a2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/schema/launchingConnectors.exsd
+++ /dev/null
@@ -1,122 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.jsdt.debug.core" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appinfo>
-         <meta.schema plugin="org.eclipse.wst.jsdt.debug.core" id="launchingConnectors" name="Launching Connectors"/>
-      </appinfo>
-      <documentation>
-         This extension point allows contributors to specify their own definition of a connector
-      </documentation>
-   </annotation>
-
-   <element name="extension">
-      <annotation>
-         <appinfo>
-            <meta.element />
-         </appinfo>
-      </annotation>
-      <complexType>
-         <sequence>
-            <element ref="connector"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appinfo>
-                  <meta.attribute translatable="true"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="connector">
-      <complexType>
-         <attribute name="class" type="string" use="required">
-            <annotation>
-               <documentation>
-                  The connector class that implements org.eclipse.e4.languages.javascript.jsdi.connect.Connector
-               </documentation>
-               <appinfo>
-                  <meta.attribute kind="java" basedOn=":org.eclipse.e4.languages.javascript.jsdi.connect.Connector"/>
-               </appinfo>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string" use="required">
-            <annotation>
-               <documentation>
-                  An id unique to this connector
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="since"/>
-      </appinfo>
-      <documentation>
-         1.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="examples"/>
-      </appinfo>
-      <documentation>
-         The following example is the real life definition of the Mozilla Rhino attaching connector.
-&lt;pre&gt;
- &lt;extension
-         point=&quot;org.eclipse.wst.jsdt.debug.core.connectors&quot;&gt;
-      &lt;connector
-            class=&quot;org.eclipse.wst.jsdt.debug.rhino.connect.RhinoAttachingConnector&quot;
-            id=&quot;rhino.attaching.connector&quot;&gt;
-      &lt;/connector&gt;
-   &lt;/extension&gt;
-&lt;/pre&gt;
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appinfo>
-         <meta.section type="apiinfo"/>
-      </appinfo>
-      <documentation>
-         The class attribute is required and must implement &lt;code&gt;org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector&lt;/code&gt;
-      </documentation>
-   </annotation>
-
-
-   <annotation>
-      <appinfo>
-         <meta.section type="copyright"/>
-      </appinfo>
-      <documentation>
-         Copyright (c) 2010 IBM Corporation and others.&lt;br&gt;
-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 
-&lt;a href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptBreakpoint.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptBreakpoint.java
deleted file mode 100644
index aec3c3a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptBreakpoint.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.breakpoints;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.wst.jsdt.core.IJavaScriptElement;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-
-/**
- * General JavaScript breakpoint
- * 
- * @since 1.0
- */
-public interface IJavaScriptBreakpoint extends IBreakpoint {
-
-	/**
-	 * The suspend policy for the breakpoint
-	 */
-	public static final String SUSPEND_POLICY = JavaScriptDebugPlugin.PLUGIN_ID + ".suspend_policy"; //$NON-NLS-1$
-	/**
-	 * The type name within the script
-	 */
-	public static final String TYPE_NAME = JavaScriptDebugPlugin.PLUGIN_ID + ".type_name"; //$NON-NLS-1$
-	/**
-	 * Breakpoint attribute for the path of the script
-	 */
-	public static final String SCRIPT_PATH = JavaScriptDebugPlugin.PLUGIN_ID + ".script_path"; //$NON-NLS-1$
-	/**
-	 * The hit count set in the breakpoint
-	 */
-	public static final String HIT_COUNT = JavaScriptDebugPlugin.PLUGIN_ID + ".hit_count"; //$NON-NLS-1$
-	
-	/**
-	 * Suspend policy for suspending the current thread of execution
-	 */
-	public static final int SUSPEND_THREAD = 1;
-	/**
-	 * Suspend policy for suspending the current target
-	 */
-	public static final int SUSPEND_TARGET = 2;
-	/**
-	 * JSDT member handle
-	 */
-	public static final String ELEMENT_HANDLE = JavaScriptDebugPlugin.PLUGIN_ID + ".handle"; //$NON-NLS-1$
-	
-	/**
-	 * Returns the path of the script as it was set when the breakpoint was created.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the path of the script this breakpoint was created on never <code>null</code>
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public String getScriptPath() throws CoreException;
-	
-	/**
-	 * Returns the type name that the breakpoint is set within.<br>
-	 * <br>
-	 * This method can return <code>null</code> when the breakpoint is set
-	 * on a top-level type i.e. set on the root source
-	 * 
-	 * @return the type name or <code>null</code>
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public String getTypeName() throws CoreException;
-	
-	/**
-	 * Returns the hit count set for this breakpoint 
-	 * or -1 if no hit count has been set.
-	 * 
-	 * @return the hit count
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public int getHitCount() throws CoreException;
-	
-	/**
-	 * Sets the given hit count for the breakpoint, 
-	 * throws an {@link IllegalArgumentException} if the given count is less than 1.
-	 * 
-	 * @param count the count to set, must be &gt; 0
-	 * @throws CoreException
-	 * @throws IllegalArgumentException if count &lt; 1
-	 */
-	public void setHitCount(int count) throws CoreException, IllegalArgumentException;
-	
-	/**
-	 * Returns the suspend policy for this breakpoint, 
-	 * default suspend policy is to suspend the thread
-	 * 
-	 * @see #SUSPEND_THREAD
-	 * @see #SUSPEND_TARGET
-	 * @return the suspend policy
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public int getSuspendPolicy() throws CoreException;
-	
-	/**
-	 * Sets the suspend policy for this breakpoint. Anything 
-	 * other than {@link #SUSPEND_THREAD} or {@link #SUSPEND_TARGET}
-	 * will be ignored.
-	 * 
-	 * @see #SUSPEND_THREAD
-	 * @see #SUSPEND_TARGET
-	 * @param policy the policy to set
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public void setSuspendPolicy(int policy) throws CoreException;
-	
-	/**
-	 * Returns the {@link IJavaScriptElement} handle for the member
-	 * this breakpoint is set on.<br>
-	 * <br>
-	 * This method can return <code>null</code> if no element handle has been set
-	 * 
-	 * @return the {@link IJavaScriptElement} handle or <code>null</code>
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public String getJavaScriptElementHandle() throws CoreException;
-	
-	/**
-	 * Allows the {@link IJavaScriptElement} handle to be set for this breakpoint.
-	 * 
-	 * @param handle the new handle to set, <code>null</code> will remove any existing handle
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public void setJavaScriptElementHandle(String handle) throws CoreException;
-	
-	/**
-	 * Returns if the breakpoint is currently installed or not.
-	 * 
-	 * @return <code>true</code> if the breakpoint is installed <code>false</code> otherwise
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public boolean isInstalled() throws CoreException;
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptBreakpointParticipant.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptBreakpointParticipant.java
deleted file mode 100644
index b2c7f36..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptBreakpointParticipant.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.breakpoints;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread;
-
-/**
- * Describes a participant that will be consulted during the 
- * suspending / resuming of an {@link IJavaScriptBreakpoint}.<br>
- * <br>
- * Every participant has a distinct vote to resume or suspend a breakpoint.
- * 
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface IJavaScriptBreakpointParticipant {
-
-	/**
-	 * Return code in response to a "breakpoint hit" notification, indicating
-	 * a vote to suspend the associated thread.
-	 */
-	public static int SUSPEND = 0x0001;
-	/**
-	 * Return code in response to a "breakpoint hit" notification, indicating
-	 * a vote to not suspend (i.e. resume) the associated thread.
-	 */
-	public static int DONT_SUSPEND = 0x0002;
-	/**
-	 * Return code indicating that this listener should not be considered
-	 * in a vote to suspend a thread or install a breakpoint.
-	 */
-	public static int DONT_CARE = 0x0000;
-	
-	/**
-	 * Notification that the given breakpoint has been hit
-	 * in the specified thread. Allows this listener to
-	 * vote to determine if the given thread should be suspended in
-	 * response to the breakpoint. If at least one listener votes to
-	 * <code>SUSPEND</code>, the thread will suspend. If there
-	 * are no votes to suspend the thread, there must be at least one
-	 * <code>DONT_SUSPEND</code> vote to avoid the suspension (resume). If all
-	 * listeners vote <code>DONT_CARE</code>, the thread will suspend by default.
-	 * <p>
-	 * The thread the breakpoint has been encountered in is now suspended. Listeners
-	 * may query thread state and perform evaluations. All subsequent breakpoints
-	 * in this thread will be ignored until voting has completed.
-	 * </p>
-	 * @param thread the JavaScript thread
-	 * @param breakpoint the {@link IJavaScriptBreakpoint}
-	 * @return whether the thread should suspend or whether this
-	 *  listener doesn't care - one of <code>SUSPEND</code>, 
-	 *  <code>DONT_SUSPEND</code>, or <code>DONT_CARE</code>
-	 */
-	public int breakpointHit(IJavaScriptThread thread, IJavaScriptBreakpoint breakpoint);
-	
-	/**
-	 * Notification that the given {@link ScriptReference} has been loaded
-	 * in the specified thread. Allows this listener to
-	 * vote to determine if the given thread should be suspended in
-	 * response to the breakpoint. If at least one listener votes to
-	 * <code>SUSPEND</code>, the thread will suspend. If there
-	 * are no votes to suspend the thread, there must be at least one
-	 * <code>DONT_SUSPEND</code> vote to avoid the suspension (resume). If all
-	 * listeners vote <code>DONT_CARE</code>, the thread will suspend by default.
-	 * <p>
-	 * The thread the breakpoint has been encountered in is now suspended. Listeners
-	 * may query thread state and perform evaluations. All subsequent breakpoints
-	 * in this thread will be ignored until voting has completed.
-	 * </p>
-	 * @param thread the JavaScript thread
-	 * @param script the {@link ScriptReference} that has been loaded
-	 * @param breakpoint the {@link IJavaScriptBreakpoint}
-	 * @return whether the thread should suspend or whether this
-	 *  listener doesn't care - one of <code>SUSPEND</code>, 
-	 *  <code>DONT_SUSPEND</code>, or <code>DONT_CARE</code>
-	 */
-	public int scriptLoaded(IJavaScriptThread thread, ScriptReference script, IJavaScriptBreakpoint breakpoint);
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptFunctionBreakpoint.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptFunctionBreakpoint.java
deleted file mode 100644
index 5f005ba..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptFunctionBreakpoint.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.breakpoints;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-
-/**
- * Abstract description of a JavaScript function breakpoint
- * 
- * @since 1.0
- */
-public interface IJavaScriptFunctionBreakpoint extends IJavaScriptLineBreakpoint {
-
-	/**
-	 * The id of the attribute for a method signature
-	 */
-	public static final String FUNCTION_SIGNAURE = JavaScriptDebugPlugin.PLUGIN_ID + ".function_signature"; //$NON-NLS-1$
-	/**
-	 * The id of the attribute for the function name
-	 */
-	public static final String FUNCTION_NAME = JavaScriptDebugPlugin.PLUGIN_ID + ".function_name"; //$NON-NLS-1$
-	/**
-	 * Registered marker id for a JavaScript function breakpoint
-	 */
-	public static final String MARKER_ID = "org.eclipse.wst.jsdt.debug.core.function.breakpoint.marker"; //$NON-NLS-1$
-
-	/**
-	 * Returns if the breakpoint will suspend when the function is entered.
-	 * 
-	 * @return <code>true</code> if the breakpoint is set to suspend when entering the function <code>false</code> otherwise
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public boolean isEntry() throws CoreException;
-	
-	/**
-	 * Sets if this will be a function entry breakpoint.
-	 * 
-	 * @param isentry if the breakpoint should suspend when the function is entered
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public void setEntry(boolean isentry) throws CoreException;
-	
-	/**
-	 * Returns if the breakpoint will suspend when the function is exited.
-	 * 
-	 * @return <code>true</code> if the breakpoint is set to suspend when exiting the function <code>false</code> otherwise
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public boolean isExit() throws CoreException;
-	
-	/**
-	 * Sets if this will be a function exit breakpoint.
-	 * 
-	 * @param isexit if the breakpoint should suspend when the function is exited
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public void setExit(boolean isexit) throws CoreException;
-	
-	/**
-	 * Returns the function name set in the breakpoint.
-	 * 
-	 * @return the function name or <code>null</code> if none
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public String getFunctionName() throws CoreException;
-	
-	/**
-	 * Returns the function signature set in the breakpoint.
-	 * 
-	 * @return the function signature or <code>null</code> if none
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public String getSignature() throws CoreException;
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptLineBreakpoint.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptLineBreakpoint.java
deleted file mode 100644
index eb2e5d9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptLineBreakpoint.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.breakpoints;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.model.ILineBreakpoint;
-
-/**
- * Abstract description of a line breakpoint for JavaScript
- * 
- * @since 1.0
- */
-public interface IJavaScriptLineBreakpoint extends ILineBreakpoint, IJavaScriptBreakpoint {
-
-	/**
-	 * Registered marker id for a JavaScript line breakpoint
-	 */
-	public static final String MARKER_ID = "org.eclipse.wst.jsdt.debug.core.line.breakpoint.marker"; //$NON-NLS-1$
-	
-	/**
-	 * Returns the condition set for this breakpoint or <code>null</code>.
-	 * 
-	 * @return the condition or <code>null</code> if one has not been set
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public String getCondition() throws CoreException;
-	
-	/**
-	 * Sets the given condition for the breakpoint.
-	 * 
-	 * @param condition the new condition to set. <code>null</code> has the effect of erasing the current condition
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public void setCondition(String condition) throws CoreException;
-	
-	/**
-	 * Returns if the condition for this breakpoint is enabled or not
-	 * 
-	 * @return if the condition is enabled
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public boolean isConditionEnabled() throws CoreException;
-	
-	/**
-	 * Allows the enabled state of the condition to be set
-	 * 
-	 * @param enabled if the condition should be enabled. Disabling a condition does not remove it.
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public void setConditionEnabled(boolean enabled) throws CoreException;
-	
-	/**
-	 * Returns if the breakpoint should suspend when the assigned condition evaluates to <code>true</code>.
-	 * 
-	 * @return true if the breakpoint should suspend when the condition is true
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public boolean isConditionSuspendOnTrue() throws CoreException;
-	
-	/**
-	 * Sets if the condition for this breakpoint will suspend when it evaluates to <code>true</code>.
-	 * 
-	 * @param suspendontrue if the condition should suspend when it evaluates to <code>true</code>
-	 * @throws CoreException if the breakpoint cannot be accessed
-	 */
-	public void setConditionSuspendOnTrue(boolean suspendontrue) throws CoreException;
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptLoadBreakpoint.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptLoadBreakpoint.java
deleted file mode 100644
index 819d8db..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/breakpoints/IJavaScriptLoadBreakpoint.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.breakpoints;
-
-/**
- * Abstract description of a JavaScript script load breakpoint
- * 
- * @since 1.0
- */
-public interface IJavaScriptLoadBreakpoint extends IJavaScriptLineBreakpoint {
-
-	/**
-	 * Registered marker id for a JavaScript script load breakpoint
-	 */
-	public static final String MARKER_ID = "org.eclipse.wst.jsdt.debug.core.scriptload.breakpoint.marker"; //$NON-NLS-1$
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ArrayReference.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ArrayReference.java
deleted file mode 100644
index d97498b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ArrayReference.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi;
-
-import java.util.List;
-
-/**
- * Abstract representation of an array.
- * 
- * @see ObjectReference
- * @see Value
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ArrayReference extends ObjectReference {
-
-	/**
-	 * Returns the current number of {@link Value}s in this array.
-	 * 
-	 * @return the number of {@link Value}s in the array
-	 */
-	public int length();
-
-	/**
-	 * Returns the {@link Value} at the given index in this array. If the bounds are outside of the
-	 * array bounds an {@link ArrayIndexOutOfBoundsException} is thrown. If there is a <code>null</code> entry
-	 * in the array {@link NullValue} is returned.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @param index the index of the {@link Value} to retrieve
-	 * 
-	 * @return the {@link Value} at the given index
-	 * @throws IndexOutOfBoundsException if the index is outside the bounds of this array. 
-	 * For example if <code>index &lt; 0</code> or <code>index &gt; {@link #length()}</code>
-	 */
-	public Value getValue(int index) throws IndexOutOfBoundsException;
-
-	/**
-	 * Returns the live list of {@link Value}s in the array or an empty list.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the live list of {@link Value}s in this array or an empty list, never <code>null</code>
-	 */
-	public List/* <Value> */getValues();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/BooleanValue.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/BooleanValue.java
deleted file mode 100644
index 02e3412..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/BooleanValue.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi;
-
-/**
- * Represents a boolean value with-respect-to JavaScript debugging.
- * 
- * @see Value
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface BooleanValue extends PrimitiveValue {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/FunctionReference.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/FunctionReference.java
deleted file mode 100644
index f01816c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/FunctionReference.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi;
-
-/**
- * Abstract representation of a function object with-respect-to Javascript debugging.
- * 
- * @see ObjectReference
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface FunctionReference extends ObjectReference {
-
-	/**
-	 * Returns the name of the function as it has been defined at the creation time of this value.
-	 * 
-	 * @return the name of the function
-	 */
-	public String functionName();
-	
-	/**
-	 * Returns the source code for the body of the function.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the source code for the function body
-	 */
-	public String functionBody();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/IncompatibleThreadStateException.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/IncompatibleThreadStateException.java
deleted file mode 100644
index 6baf57f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/IncompatibleThreadStateException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi;
-
-/**
- * Exception that is thrown when a request is made to a {@link ThreadReference}
- * which is not allowed based on its current state.
- * 
- * Clients can instantiate this class.
- * 
- * @since 1.0
- */
-public final class IncompatibleThreadStateException extends Exception {
-    private static final long serialVersionUID = 1L;
-   
-	/**
-	 * Constructor
-	 * 
-	 * @param message the backing message for the exception
-	 * @param cause the cause (if any) for this exception. <code>null</code> is
-	 * accepted.
-	 */
-	public IncompatibleThreadStateException(String message, Throwable cause) {
-		super(message, cause);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/IncompatibleVmStateException.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/IncompatibleVmStateException.java
deleted file mode 100644
index 39546d2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/IncompatibleVmStateException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi;
-
-/**
- * Exception that is thrown when a request is made to a {@link VirtualMachine}
- * that is not allowed based on its current state.
- * 
- * Clients can instantiate this class.
- * 
- * @since 1.0
- */
-public final class IncompatibleVmStateException extends Exception {
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param message the backing message for the exception
-	 * @param cause the cause (if any) for this exception. <code>null</code> is
-	 * accepted.
-	 */
-	public IncompatibleVmStateException(String message, Throwable cause) {
-		super(message, cause);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Locatable.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Locatable.java
deleted file mode 100644
index 6b20329..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Locatable.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi;
-
-/**
- * Description of a JSDI element that has a location
- * 
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface Locatable {
-
-	/**
-	 * Returns the {@link Location}.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the {@link Location} or <code>null</code> if the location could not be computed
-	 */
-	public Location location();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Location.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Location.java
deleted file mode 100644
index c24a992..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Location.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi;
-
-/**
- * Abstract representation of a given location in a {@link ScriptReference}.<br>
- * <br>
- * A {@link Location} can be a line number and / or a function name.
- * 
- * @see ScriptReference
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface Location {
-
-	/**
-	 * Returns the underlying {@link ScriptReference} for this {@link Location} or <code>null</code> if there was an exception creating the location.
-	 * 
-	 * @return the underlying {@link ScriptReference} or <code>null</code>.
-	 */
-	public ScriptReference scriptReference();
-
-	/**
-	 * Returns the line number of this location within its underlying {@link ScriptReference}
-	 * 
-	 * @return the line number in the {@link ScriptReference}
-	 */
-	public int lineNumber();
-
-	/**
-	 * Returns the name of the function this location resides in, if any
-	 * 
-	 * @return the function name this location resides in or <code>null</code> if this location is not enclosed by a function
-	 */
-	public String functionName();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Mirror.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Mirror.java
deleted file mode 100644
index 8e9f684..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Mirror.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Abstract representation of an object that can be mirrored in a {@link VirtualMachine}.
- * 
- * @see Event
- * @see EventRequest
- * @see EventSet
- * @see Property
- * @see ScriptReference
- * @see StackFrame
- * @see ThreadReference
- * @see Value
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface Mirror {
-
-	/**
-	 * Returns the handle to the {@link VirtualMachine} that this mirror object was spawned from
-	 * 
-	 * @return the {@link VirtualMachine} handle that this mirror was spawned from
-	 */
-	public VirtualMachine virtualMachine();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/NullValue.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/NullValue.java
deleted file mode 100644
index fc47f8b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/NullValue.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi;
-
-/**
- * Abstract representation of the value Null (<code>null</code>).
- * 
- * @see Value
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface NullValue extends Value {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/NumberValue.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/NumberValue.java
deleted file mode 100644
index e6f9605..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/NumberValue.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi;
-
-/**
- * Abstract representation of a {@link Number} value with-respect-to JavaScript debugging.
- * 
- * @see Value
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface NumberValue extends PrimitiveValue {
-
-	/**
-	 * Represents the value for 'Not A Number'
-	 */
-	public static final String NAN = "NaN"; //$NON-NLS-1$
-	/**
-	 * Represents the value for negative infinity
-	 */
-	public static final String NEG_INFINITY = "-Infinity"; //$NON-NLS-1$
-	/**
-	 * Represents the value for positive infinity
-	 */
-	public static final String INFINITY = "Infinity"; //$NON-NLS-1$
-
-	/**
-	 * Returns the underlying {@link Number} value for this value.<br>
-	 * <br>
-	 * This method can return <code>null</code> if its value is not a number.
-	 * 
-	 * @return the underlying {@link Number} value
-	 * @see #NAN
-	 * @see #NEG_INFINITY
-	 * @see #INFINITY
-	 */
-	public Number value();
-
-	/**
-	 * Returns if the this {@link NumberValue} is a valid number or not.
-	 * 
-	 * @return true if this is a valid number false otherwise.
-	 * @see #NAN
-	 * @see #NEG_INFINITY
-	 * @see #INFINITY
-	 */
-	public boolean isNaN();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ObjectReference.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ObjectReference.java
deleted file mode 100644
index e0d7947..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ObjectReference.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi;
-
-import java.util.List;
-
-/**
- * Abstract representation of an object with-respect-to JavaScript debugging
- * 
- * @see Value
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ObjectReference extends Value {
-
-	/**
-	 * The name of the class represented by the {@link ObjectReference} or <code>null</code> if one cannot be determined.<br>
-	 * <br>
-	 * In ECMA this will typically be the same as {@link prototype().className()}.
-	 * 
-	 * @return the name of the class or <code>null</code>
-	 */
-	public String className();
-
-	/**
-	 * The {@link FunctionReference} that can be used to create a reflected instance of the underlying class for this object or {@link NullValue} if one cannot be determined.
-	 * 
-	 * @return the {@link FunctionReference} used to create a reflected instance of the underlying class or {@link NullValue}
-	 */
-	public Value constructor();
-
-	/**
-	 * The prototype object for this {@link ObjectReference} or {@link NullValue} if one cannot be determined.<br>
-	 * <br>
-	 * 
-	 * The prototype should be the smallest enclosing prototype that parents this {@link ObjectReference}. If no prototype can be determined <code>Object.prototype</code> should be returned, but {@link NullValue} is allowed.
-	 * 
-	 * @return the prototype for this {@link ObjectReference} or {@link NullValue}
-	 */
-	public Value prototype();
-
-	/**
-	 * The properties for this {@link ObjectReference} or an empty list, never <code>null</code>
-	 * 
-	 * @return the list of {@link Property} objects for this {@link ObjectReference} or an empty listing.
-	 */
-	public List/* <PropertyReference> */properties();
-
-	/**
-	 * The object reference id - this value should be unique and never <code>null</code>
-	 * 
-	 * @return the id of this {@link ObjectReference} never <code>null</code>
-	 */
-	public Number id();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/PrimitiveValue.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/PrimitiveValue.java
deleted file mode 100644
index e3f6664..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/PrimitiveValue.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi;
-
-/**
- * Abstract representation of a primitive value with-respect-to JavaScript debugging
- * 
- * @see Value
- * @see BooleanValue
- * @see NumberValue
- * @see StringValue
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface PrimitiveValue extends Value {
-
-	/**
-	 * Returns the integer for the value.
-	 * 
-	 * @return the integer value
-	 */
-	public int intValue();
-	
-	/**
-	 * Returns the double for the value.
-	 * 
-	 * @return the double value
-	 */
-	public double doubleValue();
-	
-	/**
-	 * Returns the boolean for the value.
-	 * 
-	 * @return the boolean value
-	 */
-	public boolean booleanValue();
-	
-	/**
-	 * Returns the String value for the value.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the {@link String} value
-	 */
-	public String stringValue();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Property.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Property.java
deleted file mode 100644
index a4aaf3c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Property.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi;
-
-/**
- * Abstract description of an object property.
- * 
- * @see Mirror
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface Property extends Mirror {
-
-	/**
-	 * Returns the name of this {@link Property} or <code>null</code> if one could not be determined.
-	 * 
-	 * @return the name of this {@link Property} or <code>null</code>.
-	 */
-	public String name();
-	
-	/**
-	 * Returns the value of this {@link Property}.
-	 * 
-	 * @return the value of this {@link Property}.
-	 */
-	public Value value();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ScriptReference.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ScriptReference.java
deleted file mode 100644
index 9accd8a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ScriptReference.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi;
-
-import java.net.URI;
-import java.util.List;
-
-/**
- * Describes a JavaScript script object.<br>
- * <br>
- * A script object has {@link Location} information for all of the lines and {@link FunctionReference}s contained within it.
- * 
- * @see FunctionReference
- * @see Location
- * @see Mirror
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ScriptReference extends Mirror {
-
-	/**
-	 * Returns the complete live list of line locations in this script. <br>
-	 * <br>
-	 * This method cannot return <code>null</code>.
-	 * 
-	 * @return the line locations in this script or an empty list, never <code>null</code>
-	 * @see Location
-	 * @see #lineLocation(int)
-	 */
-	public List/* <Location> */allLineLocations();
-
-	/**
-	 * Returns the {@link Location} information for the given line number in this script.<br>
-	 * <br>
-	 * This method can return <code>null</code>.
-	 * 
-	 * @param lineNumber
-	 * @return the {@link Location} information for the given line number or <code>null</code>.
-	 * @see Location
-	 * @see #allLineLocations()
-	 */
-	public Location lineLocation(int lineNumber);
-
-	/**
-	 * Returns the complete live list of function locations in this script.<br>
-	 * <br>
-	 * This method can return <code>null</code>.
-	 * 
-	 * @return the function locations in this script
-	 * @see Location
-	 * @see #functionLocation(String)
-	 */
-	public List/* <Location> */allFunctionLocations();
-
-	/**
-	 * Returns the {@link Location} information for a function with the given name in this script.<br>
-	 * <br>
-	 * This method can return <code>null</code>.
-	 * 
-	 * @param functionName
-	 * @return the {@link Location} information for a function with the given name
-	 * @see Location
-	 * @see #allFunctionLocations()
-	 */
-	public Location functionLocation(String functionName);
-
-	/**
-	 * Returns the entire known source for this script at the time this method is called.<br>
-	 * <br>
-	 * This method can return <code>null</code>.
-	 * 
-	 * @return the source for this script
-	 */
-	public String source();
-
-	/**
-	 * Returns the {@link URI} to the source of this script.<br>
-	 * <br>
-	 * This method will not return <code>null</code>.
-	 * 
-	 * @return the {@link URI} to the source of this script
-	 */
-	public URI sourceURI();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/StackFrame.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/StackFrame.java
deleted file mode 100644
index 1628482..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/StackFrame.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi;
-
-import java.util.List;
-
-/**
- * Abstract description of a stack frame
- * 
- * @see Location
- * @see Mirror
- * @see Value
- * @see Variable
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface StackFrame extends Mirror {
-
-	/**
-	 * Returns the value of <code>this</code> for the current frame.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the 'this' ObjectReference never <code>null</code>
-	 */
-	public Variable thisObject();
-
-	/**
-	 * The visible variables for this {@link StackFrame}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>.
-	 * 
-	 * @return the list of {@link Variable} objects for this {@link StackFrame} or an empty list, never <code>null</code>
-	 */
-	public List/* <Variable> */variables();
-
-	/**
-	 * The current {@link Location} associated with this {@link StackFrame}.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the {@link Location} associated with this {@link StackFrame} or <code>null</code>
-	 */
-	public Location location();
-
-	/**
-	 * Evaluates the given expression in the context of this {@link StackFrame}
-	 * and returns the resulting {@link Value}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code> but can return the {@link NullValue}
-	 * 
-	 * @return the {@link Value} result of evaluating the expression never <code>null</code>
-	 */
-	public Value evaluate(String expression);
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/StringValue.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/StringValue.java
deleted file mode 100644
index e13d168..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/StringValue.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi;
-
-/**
- * Abstract representation of a String literal with-respect-to JavaScript debugging
- * 
- * @see Value
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface StringValue extends Value {
-
-	/**
-	 * Returns the underlying value of the string.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the value of the string or <code>null</code>
-	 */
-	public String value();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ThreadReference.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ThreadReference.java
deleted file mode 100644
index 3ef8c2f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/ThreadReference.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi;
-
-import java.util.List;
-
-/**
- * Abstract description of a thread
- * 
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ThreadReference extends Mirror {
-
-	/**
-	 * Constant indicating the state of the thread is unknown<br>
-	 * <br>
-	 * Value is: <code>-1</code> 
-	 */
-	public static final int THREAD_STATUS_UNKNOWN = -1;
-	/**
-	 * Constant indicating the thread is in a zombie state<br>
-	 * <br>
-	 * Value is: <code>0</code>
-	 */
-	public static final int THREAD_STATUS_ZOMBIE = 0;
-	/**
-	 * Constant indicating the thread is in a running state<br>
-	 * <br>
-	 * Value is: <code>1</code>
-	 */
-	public static final int THREAD_STATUS_RUNNING = 1;
-	/**
-	 * Constant indicating the thread is in a sleeping state<br>
-	 * <br>
-	 * Value is: <code>2</code>
-	 */
-	public static final int THREAD_STATUS_SLEEPING = 2;
-	/**
-	 * Constant indicating the thread is holding a monitor<br>
-	 * <br>
-	 * Value is: <code>3</code>
-	 */
-	public static final int THREAD_STATUS_MONITOR = 3;
-	/**
-	 * Constant indicating the thread is waiting for a monitor<br>
-	 * <br>
-	 * Value is: <code>4</code>
-	 */
-	public static final int THREAD_STATUS_WAIT = 4;
-	/**
-	 * Constant indicating the thread has not been started<br>
-	 * <br>
-	 * Value is: <code>5</code>
-	 */
-	public static final int THREAD_STATUS_NOT_STARTED = 5;
-
-	/**
-	 * Returns the total stack frame count for this thread
-	 * 
-	 * @return the total stack frame count
-	 */
-	public int frameCount();
-
-	/**
-	 * Returns the stack frame for the given index in this thread.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the stack frame at the given index or <code>null</code>
-	 */
-	public StackFrame frame(int index);
-
-	/**
-	 * Returns the live list of stack frames for this thread.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the list of stack frames from this thread or an empty list, never <code>null</code>
-	 */
-	public List /*<StackFrame>*/ frames();
-
-	/**
-	 * Send a request to interrupt this threads' execution.
-	 */
-	public void interrupt();
-
-	/**
-	 * Sends a request to resume this thread, iff it is in the suspended state.
-	 */
-	public void resume();
-
-	/**
-	 * Sends a request to suspend this thread, iff it is not already in a suspended state.
-	 */
-	public void suspend();
-
-	/**
-	 * Returns the status of this thread.
-	 * 
-	 * @see #THREAD_STATUS_MONITOR
-	 * @see #THREAD_STATUS_NOT_STARTED
-	 * @see #THREAD_STATUS_RUNNING
-	 * @see #THREAD_STATUS_SLEEPING
-	 * @see #THREAD_STATUS_UNKNOWN
-	 * @see #THREAD_STATUS_WAIT
-	 * @see #THREAD_STATUS_ZOMBIE
-	 * 
-	 * @return the status of this thread
-	 */
-	public int status();
-
-	/**
-	 * Returns whether or not this thread is currently suspended on a breakpoint.
-	 * 
-	 * @return <code>true</code> if the thread is suspended on a breakpoint <code>false</code> otherwise
-	 */
-	public boolean isAtBreakpoint();
-
-	/**
-	 * Returns if this thread is currently in a suspended state.
-	 * 
-	 * @return <code>true</code> if the thread is suspended <code>false</code> otherwise
-	 */
-	public boolean isSuspended();
-
-	/**
-	 * Returns the simple name of this thread.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the name of the thread or <code>null</code>
-	 */
-	public String name();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/UndefinedValue.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/UndefinedValue.java
deleted file mode 100644
index 11313bf..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/UndefinedValue.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi;
-
-/**
- * Abstract representation of the JavaScript value <code>undefined</code>
- * 
- * @see StringValue
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface UndefinedValue extends Value {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Value.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Value.java
deleted file mode 100644
index 44b11ff..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Value.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi;
-
-/**
- * Abstract representation of a value.
- * 
- * @see Mirror
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface Value extends Mirror {
-	/**
-	 * Returns the string representation of the value.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the string representation of the value or <code>null</code>
-	 */
-	public String valueString();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Variable.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Variable.java
deleted file mode 100644
index d85bb5b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/Variable.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi;
-
-/**
- * Abstract description of a variable.
- * 
- * @see Property
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface Variable extends Property {
-
-	/**
-	 * Returns <code>true</code> if this variable is an argument <code>false</code> otherwise.
-	 * 
-	 * @return <code>true</code> if this variable is an argument <code>false</code> otherwise
-	 */
-	public boolean isArgument();
-
-	/**
-	 * Returns <code>true</code> if this variable is externally visible in the context of the given {@link StackFrame}.
-	 * 
-	 * @param frame the {@link StackFrame} context
-	 * @return <code>true</code> if this variable is externally visible within the given {@link StackFrame} <code>false</code> otherwise
-	 */
-	public boolean isVisible(StackFrame frame);
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/VirtualMachine.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/VirtualMachine.java
deleted file mode 100644
index 6842c3c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/VirtualMachine.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi;
-
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-
-/**
- * Abstract description of a VM. 
- * This interface is used to abstract the platform model from the underlying connection / debugger protocol.
- * 
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface VirtualMachine {
-	
-	public final int DEFAULT_TIMEOUT = 30000;
-	
-	/**
-	 * Sends a resume request to the VM
-	 */
-	public void resume();
-
-	/**
-	 * Sends a suspend request to the VM
-	 */
-	public void suspend();
-
-	/**
-	 * Terminates and disconnects the VM
-	 */
-	public void terminate();
-
-	/**
-	 * Returns the name of the {@link VirtualMachine}.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the name of the {@link VirtualMachine} or <code>null</code>
-	 */
-	public String name();
-
-	/**
-	 * Returns the description of the {@link VirtualMachine}.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the description of the {@link VirtualMachine} or <code>null</code>
-	 */
-	public String description();
-
-	/**
-	 * Returns the version string of the {@link VirtualMachine}.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the version string of the {@link VirtualMachine} or <code>null</code>
-	 */
-	public String version();
-
-	/**
-	 * Returns the live list of {@link ThreadReference}s in the {@link VirtualMachine} 
-	 * or an empty list.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the live list of {@link ThreadReference}s in the {@link VirtualMachine} 
-	 * or an empty list, never <code>null</code>
-	 */
-	public List /*<ThreadReference>*/ allThreads();
-
-	/**
-	 * Returns the live list of {@link ScriptReference}s loaded in the {@link VirtualMachine} 
-	 * or an empty list.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the live list of loaded {@link ScriptReference}s 
-	 * or an empty list, never <code>null</code>
-	 */
-	public List /*<ScriptReference>*/ allScripts();
-
-	/**
-	 * Disposes the {@link VirtualMachine} and cleans up held objects
-	 */
-	public void dispose();
-
-	/**
-	 * Returns the {@link UndefinedValue} value.
-	 * 
-	 * @return the {@link UndefinedValue} value
-	 */
-	public UndefinedValue mirrorOfUndefined();
-
-	/**
-	 * Returns the {@link NullValue} value.
-	 * 
-	 * @return the {@link NullValue} value.
-	 */
-	public NullValue mirrorOfNull();
-
-	/**
-	 * Returns a new {@link BooleanValue}.
-	 * 
-	 * @param bool the boolean primitive to mirror in the {@link VirtualMachine}
-	 * 
-	 * @return a new {@link BooleanValue}
-	 */
-	public BooleanValue mirrorOf(boolean bool);
-
-	/**
-	 * Returns a new {@link NumberValue}.
-	 * 
-	 * @param number the {@link Number} to mirror in the {@link VirtualMachine}
-	 * 
-	 * @return a new {@link NumberValue}
-	 */
-	public NumberValue mirrorOf(Number number);
-
-	/**
-	 * Returns a {@link StringValue} initialized to the given {@link String}.
-	 * 
-	 * @param string the initial value for the mirrored {@link StringValue}
-	 * 
-	 * @return a new {@link StringValue}
-	 */
-	public StringValue mirrorOf(String string);
-
-	/**
-	 * Returns the {@link EventRequestManager} associated with this {@link VirtualMachine}.<br>
-	 * <br>
-	 * This method can return <code>null</code> if the {@link VirtualMachine} has been disposed or terminated.
-	 * 
-	 * @return the {@link EventRequestManager} for this {@link VirtualMachine} or <code>null</code>
-	 */
-	public EventRequestManager eventRequestManager();
-
-	/**
-	 * Returns the {@link EventQueue} associated with this {@link VirtualMachine}.<br>
-	 * <br>
-	 * This method can return <code>null</code> if the {@link VirtualMachine} has been disposed or terminated.
-	 * 
-	 * @return the {@link EventQueue} for this {@link VirtualMachine} or <code>null</code>
-	 */
-	public EventQueue eventQueue();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/AttachingConnector.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/AttachingConnector.java
deleted file mode 100644
index a5c2289..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/AttachingConnector.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.connect;
-
-import java.io.IOException;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Description of a {@link VirtualMachine} {@link Connector} that attaches to a 
- * running {@link VirtualMachine}.
- * 
- * Clients can implement or extend this interface.
- * 
- * @see Argument
- * @see Connector
- * @see VirtualMachine
- * @since 1.0
- */
-public interface AttachingConnector extends Connector {
-	
-	/**
-	 * Attaches to a {@link VirtualMachine} described by the
-	 * given map of arguments.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>. If a connection cannot be made 
-	 * an {@link IOException} is thrown.
-	 * 
-	 * @param arguments the map of connection arguments which cannot be <code>null</code>
-	 * @see BooleanArgument
-	 * @see IntegerArgument
-	 * @see StringArgument
-	 * @see SelectedArgument
-	 * 
-	 * @return the {@link VirtualMachine} that has been connected to never <code>null</code>
-	 * @throws IOException if the {@link Connector} failed to connect
-	 */
-	public VirtualMachine attach(Map arguments) throws IOException;
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/Connector.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/Connector.java
deleted file mode 100644
index d34dff7..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/Connector.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.connect;
-
-import java.io.Serializable;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Describes an extensible connector for JSDI.
- * 
- * Clients can implement or extend this interface.
- * 
- * @since 1.0
- */
-public interface Connector {
-	
-	/**
-	 * Default description of an argument that this {@link Connector} can support
-	 */
-	public interface Argument extends Serializable {
-		/**
-		 * A human readable description of the {@link Argument}.<br>
-		 * <br>
-		 * This method can return <code>null</code>
-		 * 
-		 * @return the description of the {@link Argument} or <code>null</code>
-		 */
-		public String description();
-
-		/**
-		 * The simple label of the {@link Argument}.<br>
-		 * <br>
-		 * This method can return <code>null</code>
-		 * 
-		 * @return the label for this {@link Argument} or <code>null</code>
-		 */
-		public String label();
-
-		/**
-		 * Returns <code>true</code> if this {@link Argument} is required <code>false</code> otherwise.
-		 * 
-		 * @return <code>true</code> if this {@link Argument} is required <code>false</code> otherwise
-		 */
-		public boolean mustSpecify();
-
-		/**
-		 * The name of the {@link Argument}.<br>
-		 * <br>
-		 * This method can return <code>null</code>
-		 * 
-		 * @return the name or the {@link Argument} or <code>null</code>
-		 */
-		public String name();
-
-		/**
-		 * Returns if the given value is valid with-respect-to this {@link Argument}
-		 * 
-		 * @param value the value to test for validity, <code>null</code> is accepted
-		 * 
-		 * @return <code>true</code> if the {@link Argument} is valid <code>false</code> otherwise
-		 */
-		public boolean isValid(String value);
-
-		/**
-		 * Sets the value of the {@link Argument} to be the given value.
-		 * 
-		 * @param value the new value to set, <code>null</code> is accepted
-		 */
-		public void setValue(String value);
-
-		/**
-		 * Returns the value of the {@link Argument}.<br>
-		 * <br>
-		 * This method can return <code>null</code>
-		 * 
-		 * @return the string value of the {@link Argument} or <code>null</code>
-		 */
-		public String value();
-	}
-
-	/**
-	 * Integer specialization of an {@link Argument}
-	 * 
-	 * @see Argument
-	 */
-	public interface IntegerArgument extends Connector.Argument {
-		/**
-		 * Returns the integer value of the {@link Argument}
-		 * 
-		 * @return the integer value
-		 */
-		public int intValue();
-
-		/**
-		 * If the integer value is valid with-respect-to this argument.
-		 * 
-		 * @param intValue the value to test
-		 * @return <code>true</code> if the given value if valid <code>false</code> otherwise
-		 */
-		public boolean isValid(int intValue);
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#isValid(java.lang.String)
-		 */
-		public boolean isValid(String value);
-
-		/**
-		 * Returns the maximum value that this {@link Argument} will accept as being valid.
-		 * 
-		 * @return the maximum value for this argument
-		 */
-		public int max();
-
-		/**
-		 * Returns the minimum value that this {@link Argument} will accept as being valid.
-		 * 
-		 * @return the minimum value for this argument
-		 */
-		public int min();
-
-		/**
-		 * Sets the integer value of this {@link Argument}.
-		 * 
-		 * @param intValue the new value to set
-		 */
-		public void setValue(int intValue);
-	}
-
-	/**
-	 * Boolean specialization of an {@link Argument}
-	 * 
-	 * @see Argument
-	 */
-	public interface BooleanArgument extends Connector.Argument {
-		/**
-		 * Returns the boolean value for this {@link Argument}.
-		 * 
-		 * @return the boolean value
-		 */
-		public boolean booleanValue();
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#isValid(java.lang.String)
-		 */
-		public boolean isValid(String value);
-
-		/**
-		 * Sets the new boolean value for this {@link Argument}.
-		 * 
-		 * @param booleanValue the new value
-		 */
-		public void setValue(boolean booleanValue);
-	}
-
-	/**
-	 * String specialization of an {@link Argument}
-	 * 
-	 * @see Argument
-	 */
-	public interface StringArgument extends Connector.Argument {
-		/* (non-Javadoc)
-		 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#isValid(java.lang.String)
-		 */
-		public boolean isValid(String arg1);
-	}
-
-	/**
-	 * Specialization of {@link Argument} whose value is a String selected from a list of choices.
-	 */
-	public interface SelectedArgument extends Connector.Argument {
-		/**
-		 * The list of choices for this connector
-		 * 
-		 * @return the complete list of choices for ths connector
-		 */
-		public List choices();
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#isValid(java.lang.String)
-		 */
-		public boolean isValid(String value);
-	}
-
-	/**
-	 * Returns the {@link Map} of default {@link Argument}s for this connector or an
-	 * empty {@link Map} if no {@link Argument}s have been specified.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the {@link Map} of default {@link Argument}s or an empty {@link Map}, never <code>null</code>
-	 */
-	public Map defaultArguments();
-
-	/**
-	 * A human readable description of this {@link Connector}.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the description of this {@link Connector} or <code>null</code>
-	 */
-	public String description();
-
-	/**
-	 * The name of this {@link Connector}.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the name of the {@link Connector}
-	 */
-	public String name();
-
-	/**
-	 * The unique identifier for this {@link Connector}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the identifier of this {@link Connector} never <code>null</code>
-	 */
-	public String id();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/LaunchingConnector.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/LaunchingConnector.java
deleted file mode 100644
index 6a4fc95..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/LaunchingConnector.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.connect;
-
-import java.io.IOException;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Description of a {@link Connector} that launches a {@link VirtualMachine}.
- * 
- * Clients can implement or extend this interface.
- * 
- * @see Argument
- * @see Connector
- * @see VirtualMachine
- * @since 1.0
- */
-public interface LaunchingConnector extends Connector {
-	
-	/**
-	 * Launches a {@link VirtualMachine} with the given map of arguments.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>. If a {@link VirtualMachine} cannot
-	 * be launched an {@link IOException} is thrown.
-	 * 
-	 * @param arguments the map of connection arguments which cannot be <code>null</code>
-	 * 
-	 * @return the {@link VirtualMachine} that has been launched never <code>null</code>
-	 * @throws IOException if the {@link Connector} failed to launch
-	 */
-	public VirtualMachine launch(Map arguments) throws IOException;
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/ListeningConnector.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/ListeningConnector.java
deleted file mode 100644
index d6710be..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/ListeningConnector.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.connect;
-
-import java.io.IOException;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Description of a {@link Connector} that waits and listens for a {@link VirtualMachine}
- * to connect to it.
- * 
- * Clients can implement or extend this interface.
- * 
- * @see Argument
- * @see Connector
- * @see VirtualMachine
- * @since 1.0
- */
-public interface ListeningConnector extends Connector {
-	
-	/**
-	 * Listens for a {@link VirtualMachine} to connect to with the given map of arguments.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>. If the connector cannot accept the 
-	 * connection from the {@link VirtualMachine} an {@link IOException} is thrown.
-	 * 
-	 * @param arguments the map of connection arguments which cannot be <code>null</code>
-	 * 
-	 * @return the {@link VirtualMachine} that has been accepted never <code>null</code>
-	 * @throws IOException if the {@link Connector} failed to accept the connection
-	 */
-	public VirtualMachine accept(Map arguments) throws IOException;
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/SocketUtil.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/SocketUtil.java
deleted file mode 100755
index 270b637..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/connect/SocketUtil.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.connect;
-
-
-import java.io.IOException;
-import java.net.ServerSocket;
-
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-
-/**
- * Utility class to find a port to debug on.
- * 
- * @since 1.0
- * @noinstantiate This class is not intended to be instantiated by clients.
- */
-public final class SocketUtil {
-	
-	/**
-	 * Constructor
-	 * No instantiation
-	 */
-	private SocketUtil() {}
-	
-	/**
-	 * Returns a free port number on localhost, or -1 if unable to find a free port.
-	 * 
-	 * @return a free port number on localhost, or -1 if unable to find a free port
-	 */
-	public static int findFreePort() {
-		ServerSocket socket = null;
-		try {
-			socket = new ServerSocket(0);
-			return socket.getLocalPort();
-		} 
-		catch (IOException e) {
-			JavaScriptDebugPlugin.log(e);
-		} 
-		finally {
-			if (socket != null) {
-				try {
-					socket.close();
-				} 
-				catch (IOException e) {
-					JavaScriptDebugPlugin.log(e);
-				}
-			}
-		}
-		return -1;		
-	}
-	
-	/**
-	 * Returns a free port number encoded as a string
-	 * 
-	 * @return a free port number encoded as a string
-	 */
-	public static String findFreePortString() {
-		return Integer.toString(findFreePort());
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/BreakpointEvent.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/BreakpointEvent.java
deleted file mode 100644
index 4522420..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/BreakpointEvent.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.event;
-
-/**
- * Description of a JSDI event indicating a breakpoint has been encountered.
- * 
- * @see EventQueue
- * @see EventSet
- * @see LocatableEvent
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface BreakpointEvent extends LocatableEvent {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/DebuggerStatementEvent.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/DebuggerStatementEvent.java
deleted file mode 100644
index 90215a9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/DebuggerStatementEvent.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.event;
-
-/**
- * Description of a JSDI event indicating a <code>debugger;</code> statement
- * has been encountered.
- * 
- * @see EventQueue
- * @see EventSet
- * @see LocatableEvent
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface DebuggerStatementEvent extends LocatableEvent {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/Event.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/Event.java
deleted file mode 100644
index 97d2fbe..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/Event.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Mirror;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Abstract description of a JSDI event
- * 
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface Event extends Mirror {
-
-	/**
-	 * Returns the underlying {@link EventRequest}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the underlying {@link EventRequest} never <code>null</code>
-	 */
-	public EventRequest request();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/EventQueue.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/EventQueue.java
deleted file mode 100644
index 83b1b16..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/EventQueue.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.event;
-
-/**
- * A queue for JSDI {@link EventSet}s
- * 
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface EventQueue {
-
-	/**
-	 * Removes an {@link EventSet} from the queue waiting for a default timeout if needed.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the top {@link EventSet} on the queue or <code>null</code> if an {@link EventSet} 
-	 * is not available or there was an exception retrieving the top {@link EventSet}
-	 */
-	public EventSet remove();
-
-	/**
-	 * Removes an {@link EventSet} from the queue waiting for the specified timeout if needed.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @param timeout the amount of time (in milliseconds) to wait when trying to remove the next {@link EventSet}
-	 * @return the top {@link EventSet} on the queue or <code>null</code> if an {@link EventSet} 
-	 * is not available or there was an exception retrieving the top {@link EventSet}
-	 */
-	public EventSet remove(int timeout);
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/EventSet.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/EventSet.java
deleted file mode 100644
index 0d22d0a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/EventSet.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.event;
-
-import java.util.Set;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Mirror;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Describes a heterogeneous set of {@link Event}s.
- * 
- * @see Event
- * @see EventQueue
- * @see VirtualMachine
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface EventSet extends Set, Mirror {
-
-	/**
-	 * Returns <code>true</code> if processing of the {@link EventSet} is currently suspended.
-	 * 
-	 * @return <code>true</code> if the {@link EventSet} is suspended <code>false</code> otherwise
-	 */
-	public boolean suspended();
-
-	/**
-	 * Resumes processing of the {@link EventSet}.
-	 */
-	public void resume();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ExceptionEvent.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ExceptionEvent.java
deleted file mode 100644
index 7baf374..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ExceptionEvent.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.event;
-
-/**
- * Description of a JSDI event indicating an exception has occurred.
- * 
- * @see EventQueue
- * @see EventSet
- * @see LocatableEvent
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ExceptionEvent extends LocatableEvent {
-
-	/**
-	 * Returns the message from the exception.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the message from the exception or <code>null</code>
-	 */
-	public String message();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/LocatableEvent.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/LocatableEvent.java
deleted file mode 100644
index 4288482..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/LocatableEvent.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Locatable;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-
-/**
- * Description of a JSDI event that has a location
- * 
- * @see Event
- * @see EventQueue
- * @see EventSet
- * @see Locatable
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface LocatableEvent extends Event, Locatable {
-
-	/**
-	 * Returns the underlying {@link ThreadReference} the event originated from.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the underlying {@link ThreadReference} the event originated from, never <code>null</code>
-	 */
-	public ThreadReference thread();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ScriptLoadEvent.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ScriptLoadEvent.java
deleted file mode 100644
index 1b6b415..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ScriptLoadEvent.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-
-/**
- * Description of a JSDI event indicating a script has been loaded.
- * 
- * @see EventQueue
- * @see EventSet
- * @see LocatableEvent
- * @see ScriptReference
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ScriptLoadEvent extends LocatableEvent {
-
-	/**
-	 * Returns the {@link ScriptReference} that has been loaded.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the {@link ScriptReference} that has been loaded never <code>null</code>
-	 */
-	public ScriptReference script();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/StepEvent.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/StepEvent.java
deleted file mode 100644
index 548c333..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/StepEvent.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.event;
-
-/**
- * Description of a JSDI event indicating a stepping event occurred.
- * 
- * @see EventQueue
- * @see EventSet
- * @see LocatableEvent
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface StepEvent extends LocatableEvent {
-	
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/SuspendEvent.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/SuspendEvent.java
deleted file mode 100644
index 81ebba1..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/SuspendEvent.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.event;
-
-/**
- * Description of a JSDI event indicating a suspend event occurred.
- * 
- * @see EventQueue
- * @see EventSet
- * @see LocatableEvent
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface SuspendEvent extends LocatableEvent {
-	
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ThreadEnterEvent.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ThreadEnterEvent.java
deleted file mode 100644
index 2b9a8d7..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ThreadEnterEvent.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.event;
-
-/**
- * Description of a JSDI event indicating a thread context has been entered.
- * 
- * @see EventQueue
- * @see EventSet
- * @see LocatableEvent
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ThreadEnterEvent extends LocatableEvent {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ThreadExitEvent.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ThreadExitEvent.java
deleted file mode 100644
index b41b4b6..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/ThreadExitEvent.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.event;
-
-/**
- * Description of a JSDI event indicating a thread context has been exited.
- * 
- * @see EventQueue
- * @see EventSet
- * @see LocatableEvent
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ThreadExitEvent extends LocatableEvent {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/VMDeathEvent.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/VMDeathEvent.java
deleted file mode 100644
index a2c051a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/VMDeathEvent.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Description of a JSDI event indicating a {@link VirtualMachine} has been stopped in an unexpected way.<br><br>
- * 
- * There are no guarantees this event can be received.<br><br>
- * 
- * This event is sent in a "fire and forget" fashion, such that if the underlying communication channel
- * has not been interrupted the event can be received.
- * 
- * @see Event
- * @see EventQueue
- * @see EventSet
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface VMDeathEvent extends Event {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/VMDisconnectEvent.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/VMDisconnectEvent.java
deleted file mode 100644
index 49a9223..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/event/VMDisconnectEvent.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Description of a JSDI event indicating a {@link VirtualMachine} has been disconnected.
- * 
- * @see Event
- * @see EventQueue
- * @see EventSet
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface VMDisconnectEvent extends Event {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/BreakpointRequest.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/BreakpointRequest.java
deleted file mode 100644
index fcb5eb2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/BreakpointRequest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Locatable;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-
-/**
- * Description of a JSDI request for breakpoints.<br>
- * <br> 
- * A breakpoint request can be filtered by:
- * <ul>
- * <li>A {@link ThreadReference}</li>
- * <li>A {@link String} condition</li>
- * <li>A hit count</li>
- * </ul>
- * Or any combination of the above.
- * 
- * @see EventRequest
- * @see Locatable
- * @see ThreadReference
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface BreakpointRequest extends EventRequest, Locatable {
-
-	/**
-	 * Adds the given {@link ThreadReference} as a filter to the request.
-	 * The {@link ThreadReference} is used to prune matching locations for the request.
-	 * 
-	 * @param thread a {@link ThreadReference} to add as a filter, <code>null</code> is not accepted
-	 */
-	public void addThreadFilter(ThreadReference thread);
-
-	/**
-	 * Adds the given condition filter to the request. 
-	 * The condition is used to prune matching locations for the request.
-	 * 
-	 * @param condition the new condition to add as a filter, <code>null</code> is not accepted
-	 */
-	public void addConditionFilter(String condition);
-
-	/**
-	 * Adds the given hit count filter to the request.
-	 * 
-	 * @param hitcount the new hit count filter to set
-	 */
-	public void addHitCountFilter(int hitcount);
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/DebuggerStatementRequest.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/DebuggerStatementRequest.java
deleted file mode 100644
index 48c5b00..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/DebuggerStatementRequest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-
-/**
- * Description of a JSDI request for a <code>debugger;</code> statement.<br>
- * <br> 
- * A <code>debugger;</code> statement request can be filtered by:
- * <ul>
- * <li>A {@link ThreadReference}</li>
- * </ul>
- * 
- * @see EventRequest
- * @see ThreadReference
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface DebuggerStatementRequest extends EventRequest {
-
-	/**
-	 * Adds the given {@link ThreadReference} as a filter to the request.
-	 * The {@link ThreadReference} is used to prune matching locations for the request.
-	 * 
-	 * @param thread a {@link ThreadReference} to add as a filter, <code>null</code> is not accepted
-	 */
-	public void addThreadFilter(ThreadReference thread);
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/EventRequest.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/EventRequest.java
deleted file mode 100644
index e57316b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/EventRequest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Mirror;
-
-/**
- * Description of a JSDI request.
- * 
- * @see Mirror
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface EventRequest extends Mirror {
-
-	/**
-	 * Returns if the request is enabled
-	 * @return <code>true</code> if the request is enabled <code>false</code> otherwise
-	 */
-	public boolean isEnabled();
-
-	/**
-	 * Allows the enabled state of the request to be changed.
-	 * 
-	 * @param enabled the new enabled state of the request
-	 */
-	public void setEnabled(boolean enabled);
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/EventRequestManager.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/EventRequestManager.java
deleted file mode 100644
index 8979554..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/EventRequestManager.java
+++ /dev/null
@@ -1,228 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.request;
-
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-
-/**
- * Description of a manager for creating {@link EventRequest}s
- * 
- * @see EventRequest
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface EventRequestManager {
-
-	/**
-	 * Creates a new {@link BreakpointRequest} for the given {@link Location}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @param location the {@link Location} to create the breakpoint for, <code>null</code> is not accepted
-	 * 
-	 * @return a new {@link BreakpointRequest} for the given {@link Location}, never <code>null</code>
-	 */
-	public BreakpointRequest createBreakpointRequest(Location location);
-
-	/**
-	 * Returns the live immutable list of {@link BreakpointRequest}s currently queued in the manager.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the list of {@link BreakpointRequest}s or an empty list, never <code>null</code>
-	 */
-	public List /*<BreakpointRequest>*/ breakpointRequests();
-
-	/**
-	 * Creates a new {@link DebuggerStatementRequest}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return a new {@link DebuggerStatementRequest} never <code>null</code>
-	 */
-	public DebuggerStatementRequest createDebuggerStatementRequest();
-
-	/**
-	 * Returns the live immutable list of {@link DebuggerStatementRequest}s currently queued in the manager.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the list of {@link DebuggerStatementRequest}s or an empty list, never <code>null</code>
-	 */
-	public List /*<DebuggerStatementRequest>*/ debuggerStatementRequests();
-
-	/**
-	 * Creates a new {@link ExceptionRequest}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return a new {@link ExceptionRequest} never <code>null</code>
-	 */
-	public ExceptionRequest createExceptionRequest();
-
-	/**
-	 * Returns the live immutable list of {@link ExceptionRequest}s currently queued in the manager.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the list of {@link ExceptionRequest}s or an empty list, never <code>null</code>
-	 */
-	public List /*<ExceptionRequest>*/ exceptionRequests();
-
-	/**
-	 * Creates a new {@link ScriptLoadRequest}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return a new {@link ScriptLoadRequest} never <code>null</code>
-	 */
-	public ScriptLoadRequest createScriptLoadRequest();
-
-	/**
-	 * Returns the live immutable list of {@link ScriptLoadRequest}s currently queued in the manager.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the list of {@link ScriptLoadRequest}s or an empty list, never <code>null</code>
-	 */
-	public List /*<ScriptLoadRequest>*/ scriptLoadRequests();
-
-	/**
-	 * Creates a new {@link StepRequest} for the specified {@link ThreadReference} of the given kind.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @param thread the {@link ThreadReference} to perform the step in
-	 * @param step the kind of step
-	 * @see StepRequest for a complete listing of step kinds
-	 * 
-	 * @return a new {@link StepRequest} never <code>null</code>
-	 */
-	public StepRequest createStepRequest(ThreadReference thread, int step);
-
-	/**
-	 * Returns the live immutable list of {@link StepRequest}s currently queued in the manager.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the list of {@link StepRequest}s or an empty list, never <code>null</code>
-	 */
-	public List /*<StepRequest>*/ stepRequests();
-
-	/**
-	 * Creates a new {@link SuspendRequest} for the specified {@link ThreadReference}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @param thread the {@link ThreadReference} to perform the suspend on
-	 * 
-	 * @return a new {@link SuspendRequest} never <code>null</code>
-	 */
-	public SuspendRequest createSuspendRequest(ThreadReference thread);
-
-	/**
-	 * Returns the live immutable list of {@link SuspendRequest}s currently queued in the manager.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the list of {@link SuspendRequest}s or an empty list, never <code>null</code>
-	 */
-	public List /*<SuspendRequest>*/ suspendRequests();
-
-	/**
-	 * Creates a new {@link ThreadEnterRequest}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return a new {@link ThreadEnterRequest} never <code>null</code>
-	 */
-	public ThreadEnterRequest createThreadEnterRequest();
-
-	/**
-	 * Returns the live immutable list of {@link ThreadEnterRequest}s currently queued in the manager.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the list of {@link ThreadEnterRequest}s or an empty list, never <code>null</code>
-	 */
-	public List /*<ThreadEnterRequest>*/ threadEnterRequests();
-
-	/**
-	 * Creates a new {@link ThreadExitRequest}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return a new {@link ThreadExitRequest} never <code>null</code>
-	 */
-	public ThreadExitRequest createThreadExitRequest();
-
-	/**
-	 * Returns the live immutable list of {@link ThreadExitRequest}s currently queued in the manager.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the list of {@link ThreadExitRequest}s or an empty list, never <code>null</code>
-	 */
-	public List /*<ThreadExitRequest>*/ threadExitRequests();
-
-	/**
-	 * Deletes the given {@link EventRequest}
-	 * 
-	 * @param eventRequest the {@link EventRequest} to delete, <code>null</code> is not accepted
-	 */
-	public void deleteEventRequest(EventRequest eventRequest);
-
-	/**
-	 * Deletes the list of {@link EventRequest}s
-	 * 
-	 * @param eventRequests the {@link EventRequest}s to delete, <code>null</code> is not accepted
-	 */
-	public void deleteEventRequest(List /*<EventRequest>*/ eventRequests);
-
-	/**
-	 * Creates a new {@link VMDeathRequest}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return a new {@link VMDeathRequest} never <code>null</code>
-	 */
-	public VMDeathRequest createVMDeathRequest();
-
-	/**
-	 * Returns the live immutable list of {@link VMDeathRequest}s currently queued in the manager.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the list of {@link VMDeathRequest}s or an empty list, never <code>null</code>
-	 */
-	public List /*<VMDeathRequest>*/ vmDeathRequests();
-
-	/**
-	 * Creates a new {@link VMDisconnectRequest}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return a new {@link VMDisconnectRequest} never <code>null</code>
-	 */
-	public VMDisconnectRequest createVMDisconnectRequest();
-
-	/**
-	 * Returns the live immutable list of {@link VMDisconnectRequest}s currently queued in the manager.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the list of {@link VMDisconnectRequest}s or an empty list, never <code>null</code>
-	 */
-	public List /*<VMDisconnectRequest>*/ vmDisconnectRequests();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ExceptionRequest.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ExceptionRequest.java
deleted file mode 100644
index 51a2488..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ExceptionRequest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-
-/**
- * Description of a JSDI request for an exception.<br>
- * <br> 
- * An exception request can be filtered by:
- * <ul>
- * <li>A {@link ThreadReference}</li>
- * </ul>
- * 
- * @see EventRequest
- * @see ThreadReference
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ExceptionRequest extends EventRequest {
-	
-	/**
-	 * Adds the given {@link ThreadReference} as a filter to the request.
-	 * The {@link ThreadReference} is used to prune matching locations for the request.
-	 * 
-	 * @param thread a {@link ThreadReference} to add as a filter, <code>null</code> is not accepted
-	 */
-	public void addThreadFilter(ThreadReference thread);
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ScriptLoadRequest.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ScriptLoadRequest.java
deleted file mode 100644
index a403702..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ScriptLoadRequest.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.request;
-
-/**
- * Description of a JSDI request for a <code>debugger;</code> statement.
- * 
- * @see EventRequest
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ScriptLoadRequest extends EventRequest {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/StepRequest.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/StepRequest.java
deleted file mode 100644
index f2acc1e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/StepRequest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-
-/**
- * Description of a JSDI request for a step operation.
- * 
- * @see EventRequest
- * @see ThreadReference
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface StepRequest extends EventRequest {
-
-	/**
-	 * Kind for a step into request
-	 */
-	public static final int STEP_INTO = 1;
-	/**
-	 * Kind for a step over request
-	 */
-	public static final int STEP_OVER = 2;
-	/**
-	 * Kind for a step out request
-	 */
-	public static final int STEP_OUT = 3;
-
-	/**
-	 * Returns the kind of the {@link StepRequest}
-	 * @see #STEP_INTO
-	 * @see #STEP_OUT
-	 * @see #STEP_OVER
-	 * 
-	 * @return the kind of the {@link StepRequest}
-	 */
-	public int step();
-
-	/**
-	 * The underlying {@link ThreadReference} this {@link StepRequest} is for.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the underlying {@link ThreadReference} never <code>null</code>
-	 */
-	public ThreadReference thread();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/SuspendRequest.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/SuspendRequest.java
deleted file mode 100644
index 3fc5921..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/SuspendRequest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-
-/**
- * Description of a JSDI request for a suspend operation.
- * 
- * @see EventRequest
- * @see ThreadReference
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface SuspendRequest extends EventRequest {
-	
-	/**
-	 * The underlying {@link ThreadReference} this {@link StepRequest} is for.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the underlying {@link ThreadReference} never <code>null</code>
-	 */
-	public ThreadReference thread();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ThreadEnterRequest.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ThreadEnterRequest.java
deleted file mode 100644
index 2152276..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ThreadEnterRequest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-
-/**
- * Description of a JSDI request to enter a thread.<br>
- * <br> 
- * A thread enter request can be filtered by:
- * <ul>
- * <li>A {@link ThreadReference}</li>
- * </ul>
- * 
- * @see EventRequest
- * @see ThreadReference
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ThreadEnterRequest extends EventRequest {
-	
-	/**
-	 * Adds the given {@link ThreadReference} as a filter to the request.
-	 * The {@link ThreadReference} is used to prune matching locations for the request.
-	 * 
-	 * @param thread a {@link ThreadReference} to add as a filter, <code>null</code> is not accepted
-	 */
-	public void addThreadFilter(ThreadReference thread);
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ThreadExitRequest.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ThreadExitRequest.java
deleted file mode 100644
index b88387b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/ThreadExitRequest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-
-/**
- * Description of a JSDI request to exit a thread.<br>
- * <br> 
- * A thread exit request can be filtered by:
- * <ul>
- * <li>A {@link ThreadReference}</li>
- * </ul>
- * 
- * @see EventRequest
- * @see ThreadReference
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface ThreadExitRequest extends EventRequest {
-
-	/**
-	 * Adds the given {@link ThreadReference} as a filter to the request.
-	 * The {@link ThreadReference} is used to prune matching locations for the request.
-	 * 
-	 * @param thread a {@link ThreadReference} to add as a filter, <code>null</code> is not accepted
-	 */
-	public void addThreadFilter(ThreadReference thread);
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/VMDeathRequest.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/VMDeathRequest.java
deleted file mode 100644
index b9a5596..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/VMDeathRequest.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Description of a JSDI request to terminate a {@link VirtualMachine}.
- * 
- * @see EventRequest
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface VMDeathRequest extends EventRequest {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/VMDisconnectRequest.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/VMDisconnectRequest.java
deleted file mode 100644
index 8a16856..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/jsdi/request/VMDisconnectRequest.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Description of a JSDI request to disconnect a {@link VirtualMachine}.
- * 
- * @see EventRequest
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface VMDisconnectRequest extends EventRequest {
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptDebugTarget.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptDebugTarget.java
deleted file mode 100644
index e6a9525..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptDebugTarget.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.model;
-
-import java.util.List;
-
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Description of our debug target
- * 
- * @see ScriptReference
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- * @noimplement This interface is not intended to be implemented by clients.
- */
-public interface IJavaScriptDebugTarget extends IDebugTarget {
-
-	/**
-	 * Returns the entire collection of {@link IScript}s currently known to the {@link VirtualMachine}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the complete collection of {@link IScript}s from the {@link VirtualMachine} or an 
-	 * empty collection, never <code>null</code>
-	 */
-	public List/*<IScript>*/ allScripts();
-	
-	/**
-	 * Returns all of the {@link IScript}s currently loaded in the {@link VirtualMachine} that have the
-	 * matching name.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @param name
-	 * @return the complete list of {@link IScript}s loaded in the {@link VirtualMachine} with the given name
-	 * or an empty collection, never <code>null</code>
-	 */
-	public List/*<IScript>*/ allScriptsByName(String name);
-	
-	/**
-	 * Returns the singleton {@link IScriptGroup} for this target.<br>
-	 * <br>
-	 * This method can return <code>null</code> if the target has been disconnected or terminated
-	 * 
-	 * @return the singleton {@link IScriptGroup} for this target
-	 */
-	public IScriptGroup getScriptGroup();
-	
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptPrimitiveValue.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptPrimitiveValue.java
deleted file mode 100644
index 252f3d0..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptPrimitiveValue.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.model;
-
-
-/**
- * Describes a primitive value 
- * 
- * @since 1.0
- * @noimplement This interface is not intended to be implemented by clients.
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface IJavaScriptPrimitiveValue extends IJavaScriptValue {
-
-	/**
-	 * Returns the integer for the value.
-	 * 
-	 * @return the integer value
-	 */
-	public int intValue();
-	
-	/**
-	 * Returns the double for the value.
-	 * 
-	 * @return the double value
-	 */
-	public double doubleValue();
-	
-	/**
-	 * Returns the boolean for the value.
-	 * 
-	 * @return the boolean value
-	 */
-	public boolean booleanValue();
-	
-	/**
-	 * Returns the String value for the value.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the {@link String} value
-	 */
-	public String stringValue();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptStackFrame.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptStackFrame.java
deleted file mode 100644
index 7a0506e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptStackFrame.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.model;
-
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- * @since 1.0
- * @noimplement This interface is not intended to be implemented by clients.
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface IJavaScriptStackFrame extends IStackFrame {
-
-	/**
-	 * Allows the given expression to be evaluated and returns the {@link Value}
-	 * of the evaluation.<br>
-	 * <br>
-	 * This method cannot return <code>null</code> and will return a value with {@link NullValue} instead.
-	 * 
-	 * @param expression the expression to evaluate, <code>null</code> is accepted and will cause a value
-	 * backed by {@link NullValue} to be returned
-	 * @return the {@link IJavaScriptValue} from the evaluation never <code>null</code>
-	 */
-	public IJavaScriptValue evaluate(String expression);
-	
-	/**
-	 * Returns the name of the source backing the stack frame.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the name of the source or <code>null</code>
-	 */
-	public String getSourceName();
-	
-	/**
-	 * Returns the path to the source.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the path to the source or <code>null</code>
-	 */
-	public String getSourcePath();
-	
-	/**
-	 * Returns the underlying source for the frame.<br>
-	 * <br>
-	 * This method can return <code>null</code> if the source cannot be acquired
-	 * 
-	 * @return the underlying source or <code>null</code>
-	 */
-	public String getSource();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptThread.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptThread.java
deleted file mode 100644
index bf91ae9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptThread.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.model;
-
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- * JavaScript thread description
- * 
- * @since 1.0
- * @noimplement This interface is not intended to be implemented by clients.
- * @noextend This interface is not intended to be extended by clients.
- */
-public interface IJavaScriptThread extends IThread {
-
-	/**
-	 * Allows the given expression to be evaluated and returns the {@link Value}
-	 * of the evaluation.<br>
-	 * <br>
-	 * This method cannot return <code>null</code> and will return a value with {@link NullValue} instead.
-	 * 
-	 * @param expression the expression to evaluate, <code>null</code> is accepted and will cause a value
-	 * backed by {@link NullValue} to be returned
-	 * @return the {@link IJavaScriptValue} from the evaluation never <code>null</code>
-	 */
-	public IJavaScriptValue evaluate(String expression);
-	
-	/**
-	 * Returns the total stack frame count
-	 * 
-	 * @return the stack frame count
-	 */
-	public int getFrameCount();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptValue.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptValue.java
deleted file mode 100644
index 9e3f5ff..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IJavaScriptValue.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.model;
-
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- * Abstract definition of a {@link Value} wrt JavaScript debugging
- * 
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- * @noimplement This interface is not intended to be implemented by clients.
- */
-public interface IJavaScriptValue extends IValue {
-
-	
-	public static final String UNDEFINED = "undefined"; //$NON-NLS-1$
-	public static final String UNKNOWN = "unknown"; //$NON-NLS-1$
-	public static final String NULL = "null"; //$NON-NLS-1$
-	public static final String BOOLEAN = "boolean"; //$NON-NLS-1$
-	public static final String NUMBER = "number"; //$NON-NLS-1$
-	public static final String STRING = "string"; //$NON-NLS-1$
-	public static final String OBJECT = "object"; //$NON-NLS-1$
-	public static final String ARRAY = "array"; //$NON-NLS-1$
-	public static final String FUNCTION = "function"; //$NON-NLS-1$
-
-	/**
-	 * Returns the string to use for details display.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the string to use for details display or <code>null</code>
-	 */
-	public String getDetailString();
-	
-	/**
-	 * Returns if the value is {@link NullValue}
-	 * 
-	 * @return if the value is {@link NullValue}
-	 */
-	public boolean isNull();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IScript.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IScript.java
deleted file mode 100644
index 07ef4a0..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IScript.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.model;
-
-import java.net.URI;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugElement;
-
-/**
- * Description of a {@link JavaScriptDebugElement} for a {@link ScriptReference}
- * 
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- * @noimplement This interface is not intended to be implemented by clients.
- */
-public interface IScript {
-
-	/**
-	 * Returns the source for this script.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the source or <code>null</code>
-	 */
-	public String source();
-	
-	/**
-	 * Returns the {@link URI} for this script.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the {@link URI} for this script never <code>null</code>
-	 */
-	public URI sourceURI();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IScriptGroup.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IScriptGroup.java
deleted file mode 100644
index fcd57f1..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/IScriptGroup.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.model;
-
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-
-/**
- * Container for a grouping of {@link ScriptReference}s
- * 
- * @since 1.0
- * @noextend This interface is not intended to be extended by clients.
- * @noimplement This interface is not intended to be implemented by clients.
- */
-public interface IScriptGroup {
-
-	/**
-	 * Returns the array of all {@link ScriptReference}s from the backing {@link IJavaScriptDebugTarget}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the complete list of {@link ScriptReference}s from the backing {@link IJavaScriptDebugTarget} 
-	 * or an empty array, never <code>null</code>
-	 */
-	public List/*<IScript>*/ allScripts();
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/JavaScriptDebugModel.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/JavaScriptDebugModel.java
deleted file mode 100644
index db5d657..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/core/model/JavaScriptDebugModel.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.core.model;
-
-import java.util.Map;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLoadBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue;
-import org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptFunctionBreakpoint;
-import org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptLineBreakpoint;
-import org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptLoadBreakpoint;
-
-/**
- * The JavaScript debug model
- * 
- * @since 1.0
- */
-public class JavaScriptDebugModel {
-
-	/**
-	 * Debug model identifier.<br>
-	 * <br>
-	 * Value is: <code>org.eclipse.wst.jsdt.debug.model</code>
-	 */
-	public static final String MODEL_ID = "org.eclipse.wst.jsdt.debug.model"; //$NON-NLS-1$
-	
-	/**
-	 * Creates a new {@link IJavaScriptLineBreakpoint}
-	 * 
-	 * @param resource the resource to create the breakpoint on
-	 * @param linenumber the line number to place the breakpoint on
-	 * @param charstart the char start or -1
-	 * @param charend the char end or -1
-	 * @param attributes the optional map of attributes or <code>null</code>
-	 * @param register if the breakpoint should be immediately registered or not
-	 * 
-	 * @return a new {@link IJavaScriptLineBreakpoint}
-	 * @throws DebugException if breakpoint creation failed
-	 */
-	public static IJavaScriptLineBreakpoint createLineBreakpoint(final IResource resource, final int linenumber, final int charstart, final int charend, final Map attributes, final boolean register) throws DebugException {
-		return new JavaScriptLineBreakpoint(resource, linenumber, charstart, charend, attributes, register);
-	}
-	
-	/**
-	 * Creates a new {@link IJavaScriptLoadBreakpoint}
-	 * 
-	 * @param resource the resource to associate the breakpoint with, or <code>null</code>
-	 * @param charstart the char start or -1
-	 * @param charend the char end or -1
-	 * @param attributes the optional map of attributes or <code>null</code>
-	 * @param register if the breakpoint should be immediately registered or not
-	 * 
-	 * @return a new {@link IJavaScriptLoadBreakpoint}
-	 * @throws DebugException if breakpoint creation fails
-	 */
-	public static IJavaScriptLoadBreakpoint createScriptLoadBreakpoint(final IResource resource, final int charstart, final int charend, final Map attributes, final boolean register) throws DebugException {
-		return new JavaScriptLoadBreakpoint(resource, charstart, charend, attributes, register);
-	}
-	
-	/**
-	 * Creates a new {@link IJavaScriptFunctionBreakpoint}
-	 * 
-	 * @param resource the resource to create the breakpoint on
-	 * @param name the name of the function
-	 * @param signature the signature of the function
-	 * @param charstart the char start of the function or -1
-	 * @param charend the char end of the function or -1
-	 * @param attributes an optional mapping of attributes or <code>null</code>
-	 * @param register if the breakpoint should immediately be registered or not
-	 * 
-	 * @return a new {@link IJavaScriptFunctionBreakpoint}
-	 * @throws DebugException if breakpoint creation fails
-	 */
-	public static IJavaScriptFunctionBreakpoint createFunctionBreakpoint(final IResource resource, final String name, final String signature, final int charstart, final int charend, final Map attributes, final boolean register) throws DebugException {
-		return new JavaScriptFunctionBreakpoint(resource, name, signature, charstart, charend, attributes, register);
-	}
-
-	/**
-	 * Converts the given double value to a {@link String} removing the trailing .0 in the event the precision is 1
-	 * 
-	 * @param n the number to convert
-	 * @return the {@link String} value of the number with trailing .0 removed iff the precision is 1
-	 */
-	public static String numberToString(Number n) {
-		if(n == null) {
-			return NumberValue.NAN;
-		}
-		double d = n.doubleValue();
-		if (d != d) {
-			return NumberValue.NAN;
-		}
-		if (d == Double.POSITIVE_INFINITY) {
-			return NumberValue.INFINITY;
-		}
-		if (d == Double.NEGATIVE_INFINITY) {
-			return NumberValue.NEG_INFINITY;
-		}
-		if (d == 0.0) {
-			return "0"; //$NON-NLS-1$
-		}
-		// we only care about base 10
-		String number = Double.toString(d);
-		// we only convert for a precision equal to 1
-		if (number.endsWith(".0")) { //$NON-NLS-1$
-			number = number.substring(0, number.length() - 2);
-		}
-		return number;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/Constants.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/Constants.java
deleted file mode 100644
index 771482a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/Constants.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core;
-
-/**
- * Common constants
- * 
- * @since 1.0
- */
-public interface Constants {
-
-//#########  MISC  ############
-	/**
-	 * Constant representing a space
-	 */
-	public static final String SPACE = " "; //$NON-NLS-1$
-	/**
-	 * Constant representing a colon.<br>
-	 * <br>
-	 * Value is: <code>:</code>
-	 */
-	public static final String COLON = ":"; //$NON-NLS-1$
-	/**
-	 * Constant representing the empty string
-	 */
-	public static final String EMPTY_STRING = ""; //$NON-NLS-1$
-	/**
-	 * UTF-8 encoding constant <br>
-	 * <br>
-	 * Value is: <code>UTF-8</code>
-	 */
-	public static final String UTF_8 = "UTF-8"; //$NON-NLS-1$
-	/**
-	 * The JavaScript file extension<br>
-	 * <br>
-	 * Value is <code>js</code>
-	 * @since 1.1
-	 */
-	public static final String JS_EXTENSION = "js"; //$NON-NLS-1$
-	
-//#########  LAUNCHING  ############
-	/**
-	 * The ID of the default JavaScript launch configuration type
-	 */
-	public static final String LAUNCH_CONFIG_ID = "org.eclipse.wst.jsdt.debug.core.launchConfigurationType"; //$NON-NLS-1$
-	
-//#########  EXTENSION POINTS  ############
-	/**
-	 * the class attribute name
-	 */
-	public static final String CLASS = "class"; //$NON-NLS-1$
-	/**
-	 * the kind attribute
-	 */
-	public static final String KIND = "kind"; //$NON-NLS-1$
-	/**
-	 * The connector attribute
-	 */
-	static final String CONNECTOR = "connector"; //$NON-NLS-1$
-	/**
-	 * the name of the breakpoint participants extension point
-	 */
-	public static final String BREAKPOINT_PARTICIPANTS = "breakpointParticipants"; //$NON-NLS-1$
-	/**
-	 * The name of the launching connectors extension point
-	 */
-	static final String LAUNCHING_CONNECTORS = "launchingConnectors"; //$NON-NLS-1$
-	
-//#########  PREFERENCES  ############
-	/**
-	 * Preference to suspend execution when any script loads, i.e. for every script load event
-	 */
-	public static final String SUSPEND_ON_ALL_SCRIPT_LOADS = JavaScriptDebugPlugin.PLUGIN_ID + ".suspend_on_all_script_loads"; //$NON-NLS-1$
-	
-	/**
-	 * Preference to suspend execution when a thrown exception is encountered
-	 * @since 1.1
-	 */
-	public static final String SUSPEN_ON_THROWN_EXCEPTION = JavaScriptDebugPlugin.PLUGIN_ID + ".suspend_on_thrown_exceptions"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptDebugPlugin.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptDebugPlugin.java
deleted file mode 100644
index 9ae5c1a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptDebugPlugin.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core;
-
-import java.net.URI;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.wst.jsdt.debug.internal.core.launching.ConnectorsManager;
-import org.eclipse.wst.jsdt.debug.internal.core.model.BreakpointParticipantManager;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- * @since 1.0
- */
-public class JavaScriptDebugPlugin extends Plugin {
-
-	/**
-	 * Status code indicating an unexpected internal error.
-	 */
-	public static final int INTERNAL_ERROR = 120;
-	/**
-	 * The ID of the bundle<br>
-	 * <br>
-	 * value is: <code>org.eclipse.wst.jsdt.debug.core</code>
-	 */
-	public static final String PLUGIN_ID = "org.eclipse.wst.jsdt.debug.core"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance
-	 */
-	private static JavaScriptDebugPlugin plugin;
-
-	/**
-	 * The singleton {@link ConnectorsManager}
-	 */
-	private static ConnectorsManager connectionmanager = null;
-	/**
-	 * Singleton {@link BreakpointParticipantManager}
-	 */
-	private static BreakpointParticipantManager participantmanager = null;
-	/**
-	 * Singleton {@link JavaScriptPreferencesManager}
-	 */
-	private static JavaScriptPreferencesManager prefmanager = null;
-	/**
-	 * Handle to the 'External JavaScript Source' project
-	 */
-	private static IProject extSrcProject = null;
-	private static Map externalScriptPaths = new HashMap();
-	
-	/**
-	 * Returns the singleton {@link ConnectorsManager} instance
-	 * 
-	 * @return the {@link ConnectorsManager}
-	 */
-	public static synchronized ConnectorsManager getConnectionsManager() {
-		if (connectionmanager == null) {
-			connectionmanager = new ConnectorsManager();
-		}
-		return connectionmanager;
-	}
-	
-	/**
-	 * Returns the singleton {@link BreakpointParticipantManager}
-	 * 
-	 * @return the {@link BreakpointParticipantManager}
-	 */
-	public static synchronized BreakpointParticipantManager getParticipantManager() {
-		if(participantmanager == null) {
-			participantmanager = new BreakpointParticipantManager();
-		}
-		return participantmanager;
-	}
-	
-	/**
-	 * Returns the current handle to the 'External JavaScript Source' project or <code>null</code>. If the project
-	 * is not accessible it can be created by passing <code>true</code> in for the create parameter.
-	 * 
-	 * @param create
-	 * @return the handle to the external source project or <code>null</code>
-	 */
-	public static synchronized IProject getExternalSourceProject(boolean create) {
-		if(extSrcProject == null) {
-			try {
-				IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(Messages.external_javascript_source);
-				if(project.isAccessible()) {
-					extSrcProject = project;
-				}
-				if(project.exists()) {
-					project.open(null);
-					extSrcProject = project;
-				}
-				else if(create) {
-					project.create(null);
-					project.open(null);
-					extSrcProject = project;
-				}
-			}
-			catch(CoreException ce) {
-				log(ce);
-			}
-		}
-		return extSrcProject;
-	}
-	
-	/**
-	 * Returns if the given path is for the 'External JavaScript Source' project
-	 * @param path
-	 * @return <code>true</code> if the path is in the external source project, <code>false</code> otherwise
-	 */
-	public static boolean isExternalSource(IPath path) {
-		return path.segment(0).equals(Messages.external_javascript_source);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		plugin = this;
-		prefmanager = new JavaScriptPreferencesManager();
-		prefmanager.start();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		try {
-			plugin = null;
-			if(connectionmanager != null) {
-				connectionmanager.dispose();
-			}
-			if(participantmanager != null) {
-				participantmanager.dispose();
-			}
-			if(prefmanager != null) {
-				prefmanager.stop();
-			}
-			if(extSrcProject != null && extSrcProject.exists()) {
-				extSrcProject.delete(true, null);
-			}
-		}
-		finally {
-			super.stop(context);
-		}
-	}
-
-	/**
-	 * Returns the singleton instance
-	 *
-	 * @return the singleton instance
-	 */
-	public static JavaScriptDebugPlugin getDefault() {
-		return plugin;
-	}
-	
-	/**
-	 * Logs the specified status with this plug-in's log.
-	 * 
-	 * @param status status to log
-	 */
-	public static void log(IStatus status) {
-		if (plugin != null) {
-			plugin.getLog().log(status);
-		}
-	}
-
-	/**
-	 * Logs the specified throwable with this plug-in's log.
-	 * 
-	 * @param t throwable to log 
-	 */
-	public static void log(Throwable t) {
-		log(newErrorStatus("Error logged from JSDT Debug Core: ", t)); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Logs an internal error with the specified message.
-	 * 
-	 * @param message the error message to log
-	 */
-	public static void logErrorMessage(String message) {
-		log(newErrorStatus("Internal message logged from JavaScript Debug Core: " + message, null)); //$NON-NLS-1$	
-	}
-	
-	/**
-	 * Returns a new error status for this plug-in with the given message
-	 * @param message the message to be included in the status
-	 * @param exception the exception to be included in the status or <code>null</code> if none
-	 * @return a new error status
-	 */
-	public static IStatus newErrorStatus(String message, Throwable exception) {
-		return new Status(IStatus.ERROR, PLUGIN_ID, INTERNAL_ERROR, message, exception);
-	}
-
-	/**
-	 * Caches the original {@link URI} script path for the given external source path
-	 *  
-	 * @param path
-	 * @param scriptPath
-	 */
-	public static synchronized void addExternalScriptPath(IPath path, String scriptPath) {
-		externalScriptPaths.put(path.makeAbsolute(), scriptPath);
-	}
-	
-	/**
-	 * Fetches the original {@link URI} script path for the given external source path
-	 * 
-	 * @param path
-	 * @return
-	 */
-	public static synchronized String getExternalScriptPath(IPath path) {
-		return (String) externalScriptPaths.get(path.makeAbsolute());
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptDebugPreferenceInitializer.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptDebugPreferenceInitializer.java
deleted file mode 100644
index 2df7ee0..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptDebugPreferenceInitializer.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.core.runtime.preferences.DefaultScope;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.osgi.service.prefs.BackingStoreException;
-
-/**
- * Preference Initializer
- * 
- * @since 1.0
- */
-public class JavaScriptDebugPreferenceInitializer extends AbstractPreferenceInitializer {
-
-	/**
-	 * Constructor
-	 */
-	public JavaScriptDebugPreferenceInitializer() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
-	 */
-	public void initializeDefaultPreferences() {
-		IEclipsePreferences prefs = new DefaultScope().getNode(JavaScriptDebugPlugin.PLUGIN_ID);
-		if(prefs != null) {
-			prefs.putBoolean(Constants.SUSPEND_ON_ALL_SCRIPT_LOADS, false);
-			try {
-				prefs.flush();
-			} catch (BackingStoreException e) {
-				JavaScriptDebugPlugin.log(e);
-			}
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptPreferencesManager.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptPreferencesManager.java
deleted file mode 100644
index 5e287eb..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptPreferencesManager.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLoadBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.model.JavaScriptDebugModel;
-import org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptExceptionBreakpoint;
-import org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptLoadBreakpoint;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget;
-
-/**
- * Manager to handle various preferences.<br>
- * <br>
- * Specifically this manager handles the preferences for:
- * <ul>
- * <li>Suspend on all script loads</li>
- * </ul>
- * 
- * @since 1.0
- */
-public class JavaScriptPreferencesManager implements IPreferenceChangeListener {
-
-	/**
-	 * The invisible "suspend on all script loads" breakpoint
-	 */
-	private static IJavaScriptLoadBreakpoint allLoadsBreakpoint = null;
-	
-	/**
-	 * The invisible "suspend on exception" breakpoint
-	 * @since 1.1
-	 */
-	private static JavaScriptExceptionBreakpoint allExceptions = null;
-	
-	/**
-	 * Starts the manager
-	 */
-	public void start() {
-		IEclipsePreferences node = new InstanceScope().getNode(JavaScriptDebugPlugin.PLUGIN_ID);
-		node.addPreferenceChangeListener(this);
-		if(node.getBoolean(Constants.SUSPEND_ON_ALL_SCRIPT_LOADS, false)) {
-			allLoadsBreakpoint = createSuspendOnAllLoads();
-		}
-		if(node.getBoolean(Constants.SUSPEN_ON_THROWN_EXCEPTION, false)) {
-			allExceptions = createSuspendOnException();
-		}
-	}
-	
-	/**
-	 * Stops the manager and clean up
-	 */
-	public void stop() {
-		IEclipsePreferences node = new InstanceScope().getNode(JavaScriptDebugPlugin.PLUGIN_ID);
-		if(node != null) {
-			node.removePreferenceChangeListener(this);
-		}
-		try {
-			if(allLoadsBreakpoint != null) {
-				allLoadsBreakpoint.delete();
-			}
-			if(allExceptions != null) {
-				allExceptions.delete();
-			}
-		} catch (CoreException e) {
-			JavaScriptDebugPlugin.log(e);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener#preferenceChange(org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent)
-	 */
-	public void preferenceChange(PreferenceChangeEvent event) {
-		if(event.getKey().equals(Constants.SUSPEND_ON_ALL_SCRIPT_LOADS)) {
-			if(event.getNewValue().equals(Boolean.TRUE.toString()) && allLoadsBreakpoint == null) {
-				//create it
-				allLoadsBreakpoint = createSuspendOnAllLoads();
-			}
-			else {
-				deleteSuspendOnAllLoads();
-			}
-		}
-		if(event.getKey().equals(Constants.SUSPEN_ON_THROWN_EXCEPTION)) {
-			if(event.getNewValue().equals(Boolean.TRUE.toString())) {
-				//create it
-				allExceptions = createSuspendOnException();
-			}
-			else {
-				deleteSuspendOnException();
-			}
-		}
-	}
-	
-	/**
-	 * Creates the singleton exception breakpoint
-	 * 
-	 * @return the new {@link JavaScriptExceptionBreakpoint}
-	 * @since 1.1
-	 */
-	private JavaScriptExceptionBreakpoint createSuspendOnException() {
-		try {
-			JavaScriptExceptionBreakpoint breakpoint = new JavaScriptExceptionBreakpoint(new HashMap());
-			IDebugTarget[] targets = DebugPlugin.getDefault().getLaunchManager().getDebugTargets();
-			for (int i = 0; i < targets.length; i++) {
-				if(targets[i] instanceof JavaScriptDebugTarget) {
-					((JavaScriptDebugTarget)targets[i]).breakpointAdded(breakpoint);
-				}
-			}
-			return breakpoint;
-		}
-		catch(DebugException de) {
-			JavaScriptDebugPlugin.log(de);
-		}
-		return null;
-	}
-	
-	/**
-	 * Deletes any set exception breakpoints
-	 * 
-	 * @since 1.1
-	 */
-	private void deleteSuspendOnException() {
-		if(allExceptions != null) {
-			//notify all the targets
-			IDebugTarget[] targets = DebugPlugin.getDefault().getLaunchManager().getDebugTargets();
-			for (int i = 0; i < targets.length; i++) {
-				if(targets[i] instanceof JavaScriptDebugTarget) {
-					((JavaScriptDebugTarget)targets[i]).breakpointRemoved(allExceptions, null);
-				}
-			}
-			try {
-				allExceptions.delete();
-			} catch (CoreException e) {
-				JavaScriptDebugPlugin.log(e);
-			}
-			finally {
-				allExceptions = null;
-			}
-		}
-	}
-	
-	/**
-	 * Deletes the "suspend on all script loads" breakpoint and notifies debug targets
-	 */
-	private void deleteSuspendOnAllLoads() {
-		if(allLoadsBreakpoint != null) {
-			//notify all the targets
-			IDebugTarget[] targets = DebugPlugin.getDefault().getLaunchManager().getDebugTargets();
-			for (int i = 0; i < targets.length; i++) {
-				if(targets[i] instanceof JavaScriptDebugTarget) {
-					((JavaScriptDebugTarget)targets[i]).breakpointRemoved(allLoadsBreakpoint, null);
-				}
-			}
-			try {
-				allLoadsBreakpoint.delete();
-			} catch (CoreException e) {
-				JavaScriptDebugPlugin.log(e);
-			}
-			finally {
-				allLoadsBreakpoint = null;
-			}
-		}
-	}
-	
-	/**
-	 * Creates the "suspend on all script loads" breakpoint and notifies all active debug targets 
-	 * @return the "suspend on all script loads" breakpoint or <code>null</code>
-	 */
-	private IJavaScriptLoadBreakpoint createSuspendOnAllLoads() {
-		IJavaScriptLoadBreakpoint breakpoint = null;
-		try {
-			HashMap map = new HashMap();
-			map.put(JavaScriptLoadBreakpoint.GLOBAL_SUSPEND, Boolean.TRUE);
-			breakpoint = JavaScriptDebugModel.createScriptLoadBreakpoint(
-												ResourcesPlugin.getWorkspace().getRoot(), 
-												-1, 
-												-1, 
-												map, 
-												false);
-		} catch (DebugException e) {
-			JavaScriptDebugPlugin.log(e);
-		}
-		if(breakpoint != null) {
-			//notify all the targets
-			IDebugTarget[] targets = DebugPlugin.getDefault().getLaunchManager().getDebugTargets();
-			for (int i = 0; i < targets.length; i++) {
-				if(targets[i] instanceof JavaScriptDebugTarget) {
-					((JavaScriptDebugTarget)targets[i]).breakpointAdded(breakpoint);
-				}
-			}
-		}
-		return breakpoint;
-	}
-	
-	/**
-	 * Allows the name of the script the global load breakpoint will suspend on
-	 * 
-	 * @param scriptpath the name of the script
-	 */
-	public static void setGlobalSuspendOn(String scriptpath) {
-		if(allLoadsBreakpoint != null) {
-			try {
-				allLoadsBreakpoint.getMarker().setAttribute(IJavaScriptBreakpoint.SCRIPT_PATH, scriptpath);
-			} catch (CoreException e) {
-				JavaScriptDebugPlugin.log(e);
-			}
-		}
-	}
-	
-	/**
-	 * Returns the complete list of breakpoints that this manager
-	 * creates or an empty list, never <code>null</code>
-	 * @return the listing of managed breakpoints never <code>null</code>
-	 */
-	public static IJavaScriptBreakpoint[] getAllManagedBreakpoints() {
-		ArrayList breakpoints = new ArrayList();
-		if(allLoadsBreakpoint != null) {
-			breakpoints.add(allLoadsBreakpoint);
-		}
-		if(allExceptions != null) {
-			breakpoints.add(allExceptions);
-		}
-		return (IJavaScriptBreakpoint[]) breakpoints.toArray(new IJavaScriptBreakpoint[breakpoints.size()]);
-	}
-	
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptWatchExpressionDelegate.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptWatchExpressionDelegate.java
deleted file mode 100644
index 158aaf6..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/JavaScriptWatchExpressionDelegate.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IDebugElement;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.core.model.IWatchExpressionDelegate;
-import org.eclipse.debug.core.model.IWatchExpressionListener;
-import org.eclipse.debug.core.model.IWatchExpressionResult;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame;
-
-/**
- * Default watch expression delegate for the JavaScript debugging
- * 
- * @since 1.0
- */
-public class JavaScriptWatchExpressionDelegate implements IWatchExpressionDelegate {
-
-	/**
-	 * Default result to return from the delegate
-	 */
-	class WatchResult implements IWatchExpressionResult {
-		String expression = null;
-		IValue value = null;
-		String[] errormessages = null;
-		DebugException exception = null;
-		
-		public WatchResult(String expression) {
-			this.expression = expression;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.core.model.IWatchExpressionResult#getValue()
-		 */
-		public IValue getValue() {
-			return this.value;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.core.model.IWatchExpressionResult#hasErrors()
-		 */
-		public boolean hasErrors() {
-			return this.errormessages != null || this.exception != null;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.core.model.IWatchExpressionResult#getErrorMessages()
-		 */
-		public String[] getErrorMessages() {
-			return this.errormessages;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.core.model.IWatchExpressionResult#getExpressionText()
-		 */
-		public String getExpressionText() {
-			return this.expression;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.debug.core.model.IWatchExpressionResult#getException()
-		 */
-		public DebugException getException() {
-			return this.exception;
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IWatchExpressionDelegate#evaluateExpression(java.lang.String, org.eclipse.debug.core.model.IDebugElement, org.eclipse.debug.core.model.IWatchExpressionListener)
-	 */
-	public void evaluateExpression(String expression, IDebugElement context, IWatchExpressionListener listener) {
-		WatchResult result = new WatchResult(expression);
-		try {
-			IStackFrame fcontext  = getFrameContext(context);
-			if(fcontext instanceof IJavaScriptStackFrame) {
-				IJavaScriptStackFrame frame = (IJavaScriptStackFrame) fcontext;
-				result.value = frame.evaluate(expression);
-			}
-		}
-		catch(DebugException de) {
-			result.exception = de;
-			result.errormessages = new String[] {de.getMessage()};
-		}
-		finally {
-			listener.watchEvaluationFinished(result);
-		}
-	}
-	
-	/**
-	 * Returns the {@link IStackFrame} context to evaluate the expression with
-	 * or <code>null</code> if the element is not an {@link IStackFrame} or an {@link IThread}, or 
-	 * if the call to {@link IThread#getTopStackFrame()} fails.
-	 * 
-	 * @param element the element to get the {@link IStackFrame} context from
-	 * @return the {@link IStackFrame} context or <code>null</code>
-	 * @throws DebugException
-	 */
-	IStackFrame getFrameContext(IDebugElement element) throws DebugException {
-		if(element instanceof IStackFrame) {
-			return (IStackFrame) element;
-		}
-		if(element instanceof IThread) {
-			return ((IThread)element).getTopStackFrame();
-		}
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/Messages.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/Messages.java
deleted file mode 100644
index 349b975..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/Messages.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.core.messages"; //$NON-NLS-1$
-	public static String external_javascript_source;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/TextUtils.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/TextUtils.java
deleted file mode 100644
index eb769d8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/TextUtils.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core;
-
-/**
- * Utility class with common text handling functions in it
- * 
- * @since 1.0
- */
-public final class TextUtils {
-
-	private TextUtils() {/*no instantiation*/}
-
-	/**
-	 * Shortens the given string to be no longer than the given threshold. Any removed characters are 
-	 * replaced with <code>...</code>.<br><br>
-	 * For example: <code>shortenText("this is a string to shorten text", 8)</code> would result in the string:
-	 * <code>"thi...xt"</code>
-	 * 
-	 * @param string
-	 * @param threshold TODO
-	 * @return the given string shortened to be no longer than the given threshold
-	 */
-	public static String shortenText(String string, int threshold) {
-		int length = string.length(); 
-		if(length > threshold) {
-			int chomp = length - threshold + 3;
-			int begin = Math.round(threshold/2)-1;
-			return string.replaceAll(string.substring(begin, begin+chomp), "..."); //$NON-NLS-1$
-		}
-		return string;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/DefaultJavaScriptBreakpointParticipant.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/DefaultJavaScriptBreakpointParticipant.java
deleted file mode 100644
index b756be5..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/DefaultJavaScriptBreakpointParticipant.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.breakpoints;
-
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread;
-
-/**
- * A default breakpoint participant
- * 
- * @since 1.1
- */
-public class DefaultJavaScriptBreakpointParticipant implements IJavaScriptBreakpointParticipant {
-
-	/**
-	 * Constructor
-	 */
-	public DefaultJavaScriptBreakpointParticipant() {}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant#breakpointHit(org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread, org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint)
-	 */
-	public int breakpointHit(IJavaScriptThread thread, IJavaScriptBreakpoint breakpoint) {
-		return DONT_CARE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant#scriptLoaded(org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread, org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference, org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint)
-	 */
-	public int scriptLoaded(IJavaScriptThread thread, ScriptReference script, IJavaScriptBreakpoint breakpoint) {
-		return DONT_CARE;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptBreakpoint.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptBreakpoint.java
deleted file mode 100644
index ec003ae..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptBreakpoint.java
+++ /dev/null
@@ -1,508 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.breakpoints;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.URIUtil;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.model.Breakpoint;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.BreakpointEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.Event;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ScriptLoadEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.core.model.JavaScriptDebugModel;
-import org.eclipse.wst.jsdt.debug.internal.core.Constants;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.core.model.IJavaScriptEventListener;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptThread;
-import org.eclipse.wst.jsdt.debug.internal.core.model.Script;
-
-/**
- * Abstract representation of a JSDI breakpoint
- * 
- * @since 1.0
- */
-public abstract class JavaScriptBreakpoint extends Breakpoint implements IJavaScriptBreakpoint, IJavaScriptEventListener {
-
-	/**
-	 * The total count of all of the targets this breakpoint is installed in
-	 */
-	public static final String INSTALL_COUNT = JavaScriptDebugPlugin.PLUGIN_ID + ".install_count"; //$NON-NLS-1$
-
-	private HashSet targets = null;
-	private HashMap requestspertarget = new HashMap(4);
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.Breakpoint#setMarker(org.eclipse.core.resources.IMarker)
-	 */
-	public void setMarker(IMarker marker) throws CoreException {
-		super.setMarker(marker);
-		// reset the install count
-		setAttribute(INSTALL_COUNT, 0);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.Breakpoint#setAttribute(java.lang.String, boolean)
-	 */
-	protected void setAttribute(final String attributeName, final boolean value) throws CoreException {
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IWorkspaceRunnable runnable= new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) throws CoreException {
-				ensureMarker().setAttribute(attributeName, value);
-			}
-		};
-		workspace.run(runnable, getMarkerRule(), IWorkspace.AVOID_UPDATE, null);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.Breakpoint#setAttribute(java.lang.String, java.lang.Object)
-	 */
-	protected void setAttribute(final String attributeName, final Object value) throws CoreException {
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IWorkspaceRunnable runnable= new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) throws CoreException {
-				ensureMarker().setAttribute(attributeName, value);
-			}
-		};
-		workspace.run(runnable, getMarkerRule(), IWorkspace.AVOID_UPDATE, null);
-	}
-	
-	/**
-	 * Add this breakpoint to the breakpoint manager, or sets it as unregistered.
-	 */
-	protected void register(boolean register) throws CoreException {
-		DebugPlugin plugin = DebugPlugin.getDefault();
-		if (plugin != null && register) {
-			plugin.getBreakpointManager().addBreakpoint(this);
-		} else {
-			setRegistered(false);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IBreakpoint#getModelIdentifier()
-	 */
-	public String getModelIdentifier() {
-		return JavaScriptDebugModel.MODEL_ID;
-	}
-
-	/**
-	 * Returns whether this breakpoint should be "skipped". Breakpoints are skipped if the breakpoint manager is disabled and the breakpoint is registered with the manager
-	 * 
-	 * @return whether this breakpoint should be skipped
-	 */
-	public boolean shouldSkipBreakpoint() throws CoreException {
-		DebugPlugin plugin = DebugPlugin.getDefault();
-		return plugin != null && isRegistered() && !plugin.getBreakpointManager().isEnabled();
-	}
-
-	/**
-	 * Adds the given debug target to the listing of targets that this breakpoint cares about
-	 * 
-	 * @param target
-	 * @throws CoreException
-	 */
-	public void addToTarget(JavaScriptDebugTarget target) throws CoreException {
-		if (target.isTerminated() || shouldSkipBreakpoint()) {
-			return;
-		}
-		// Add script load handler
-		ScriptLoadRequest request = target.getEventRequestManager().createScriptLoadRequest();
-		request.setEnabled(isEnabled());
-		registerRequest(target, request);
-
-		// Add to all loaded scripts
-		String scriptPath = getScriptPath();
-		if (scriptPath == null) {
-			return;
-		}
-		
-		try {
-			List/* ScriptReference */scripts = target.underlyingScripts(Script.resolveName(URIUtil.fromString(scriptPath)));
-			boolean success = true;
-			for (Iterator iter = scripts.iterator(); iter.hasNext();) {
-				ScriptReference script = (ScriptReference) iter.next();
-				if (scriptPathMatches(script))
-					success &= createRequest(target, script);
-			}
-			if (success) {
-				if (this.targets == null) {
-					this.targets = new HashSet();
-				}
-				this.targets.add(target);
-			}
-		}
-		catch(URISyntaxException urise) {
-			JavaScriptDebugPlugin.log(urise);
-		}
-	}
-
-	/**
-	 * Creates a request for the given script in the given target
-	 * 
-	 * @param target
-	 *            the target to register with
-	 * @param script
-	 *            the script we want to set the breakpoint in
-	 * @return true if a new request was created false otherwise
-	 * @throws CoreException
-	 */
-	protected abstract boolean createRequest(JavaScriptDebugTarget target, ScriptReference script) throws CoreException;
-
-	/**
-	 * Configures the request with attributes from the breakpoint
-	 * 
-	 * @param request
-	 * @throws CoreException
-	 */
-	protected void configureRequest(BreakpointRequest request) throws CoreException {
-		request.addHitCountFilter(getHitCount());
-	}
-
-	/**
-	 * Removes the given debug target from the listing of targets this breakpoint cares about
-	 * 
-	 * @param target
-	 */
-	public void removeFromTarget(JavaScriptDebugTarget target) {
-		List requests = getRequests(target);
-		if (requests != null) {
-			for (Iterator iter = requests.iterator(); iter.hasNext();) {
-				EventRequest request = null;
-				try {
-					request = (EventRequest) iter.next();
-					if (target.isAvailable()) {
-						target.getEventRequestManager().deleteEventRequest(request);
-					}
-				} finally {
-					deregisterRequest(target, request);
-				}
-			}
-		}
-		synchronized (this.requestspertarget) {
-			this.requestspertarget.remove(target);
-		}
-		if (this.targets == null) {
-			return;
-		}
-		this.targets.remove(target);
-	}
-
-	/**
-	 * Recreate this breakpoint in all targets
-	 * 
-	 * @throws CoreException
-	 */
-	protected void recreateBreakpoint() throws CoreException {
-		DebugPlugin plugin = DebugPlugin.getDefault();
-		if (plugin != null) {
-			IDebugTarget[] targets = plugin.getLaunchManager().getDebugTargets();
-			for (int i = 0; i < targets.length; i++) {
-				if (targets[i].getModelIdentifier().equals(JavaScriptDebugModel.MODEL_ID)) {
-					recreateBreakpointFor((JavaScriptDebugTarget) targets[i]);
-				}
-			}
-		}
-	}
-
-	/**
-	 * Recreates this breakpoint in the given debug target
-	 * 
-	 * @param target
-	 * @throws CoreException
-	 */
-	void recreateBreakpointFor(JavaScriptDebugTarget target) throws CoreException {
-		if (target.isAvailable() && target.getBreakpoints().contains(this)) {
-			removeFromTarget(target);
-			addToTarget(target);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.Breakpoint#setEnabled(boolean)
-	 */
-	public void setEnabled(boolean enabled) throws CoreException {
-		if(isEnabled() != enabled) {
-			setAttribute(ENABLED, enabled);
-			recreateBreakpoint();
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint#setSuspendPolicy(int)
-	 */
-	public void setSuspendPolicy(int policy) throws CoreException {
-		if(getSuspendPolicy() != policy) {
-			setAttribute(SUSPEND_POLICY, policy);
-			recreateBreakpoint();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint#getSuspendPolicy()
-	 */
-	public int getSuspendPolicy() throws CoreException {
-		return ensureMarker().getAttribute(SUSPEND_POLICY, SUSPEND_THREAD);
-	}
-
-	/**
-	 * Returns if this breakpoint is currently installed in any targets
-	 * 
-	 * @return true if this breakpoint is installed in any targets, false otherwise
-	 * @throws CoreException
-	 */
-	public boolean isInstalled() throws CoreException {
-		return ensureMarker().getAttribute(INSTALL_COUNT, 0) > 0;
-	}
-
-	/**
-	 * Increments the install count of this breakpoint
-	 */
-	protected void incrementInstallCount() throws CoreException {
-		int count = getInstallCount();
-		ensureMarker().setAttribute(INSTALL_COUNT, count + 1);
-	}
-
-	/**
-	 * Returns the <code>INSTALL_COUNT</code> attribute of this breakpoint or 0 if the attribute is not set.
-	 */
-	public int getInstallCount() throws CoreException {
-		return ensureMarker().getAttribute(INSTALL_COUNT, 0);
-	}
-
-	/**
-	 * Decrements the install count of this breakpoint.
-	 */
-	protected void decrementInstallCount() throws CoreException {
-		int count = getInstallCount();
-		if (count > 0) {
-			ensureMarker().setAttribute(INSTALL_COUNT, count - 1);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint#setHitCount(int)
-	 */
-	public void setHitCount(int count) throws CoreException, IllegalArgumentException {
-		if (count != getHitCount()) {
-			setAttribute(HIT_COUNT, count);
-			recreateBreakpoint();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint#getHitCount()
-	 */
-	public int getHitCount() throws CoreException {
-		return ensureMarker().getAttribute(HIT_COUNT, -1);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint#getScriptPath()
-	 */
-	public String getScriptPath() throws CoreException {
-		return ensureMarker().getAttribute(SCRIPT_PATH, Constants.EMPTY_STRING);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint#getTypeName()
-	 */
-	public String getTypeName() throws CoreException {
-		return ensureMarker().getAttribute(TYPE_NAME, null);
-	}
-
-	/**
-	 * Registers the given request for this breakpoint for the given target
-	 * 
-	 * @param target
-	 * @param request
-	 */
-	protected void registerRequest(JavaScriptDebugTarget target, EventRequest request) {
-		addRequestForTarget(target, request);
-		if (!(request instanceof ScriptLoadRequest)) {
-			try {
-				incrementInstallCount();
-			} catch (CoreException ce) {
-				JavaScriptDebugPlugin.log(ce);
-			}
-		}
-	}
-
-	/**
-	 * Adds the given request to the list of requests for the given target
-	 * @param target
-	 * @param request
-	 */
-	protected synchronized void addRequestForTarget(JavaScriptDebugTarget target, EventRequest request) {
-		ArrayList requests = getRequests(target);
-		if (requests == null) {
-			synchronized (this.requestspertarget) {
-				requests = new ArrayList(2);
-				this.requestspertarget.put(target, requests);
-			}
-		}
-		requests.add(request);
-		target.addJSDIEventListener(this, request);
-	}
-
-	/**
-	 * Returns any existing requests associated with the given target
-	 * 
-	 * @param target
-	 * @return list of requests for the given target
-	 */
-	protected ArrayList getRequests(JavaScriptDebugTarget target) {
-		ArrayList list = null;
-		synchronized (this.requestspertarget) {
-			list = (ArrayList) this.requestspertarget.get(target);
-		}
-		return list;
-	}
-
-	/**
-	 * Remove this breakpoint as an event listener
-	 * 
-	 * @param target
-	 * @param request
-	 */
-	protected void deregisterRequest(JavaScriptDebugTarget target, EventRequest request) {
-		target.removeJSDIEventListener(this, request);
-		if (!(request instanceof ScriptLoadRequest)) {
-			try {
-				decrementInstallCount();
-			} catch (CoreException ce) {
-				JavaScriptDebugPlugin.log(ce);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.model.IJavaScriptEventListener#handleEvent(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event, org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-	 */
-	public boolean handleEvent(Event event, JavaScriptDebugTarget target, boolean suspendVote, EventSet eventSet) {
-		// get the thread and suspend it
-		if (event instanceof BreakpointEvent) {
-			JavaScriptThread thread = target.findThread(((BreakpointEvent) event).thread());
-			if (thread != null) {
-				return !thread.suspendForBreakpoint(this, suspendVote);
-			}
-		}
-		if (event instanceof ScriptLoadEvent) {
-			ScriptLoadEvent sevent = (ScriptLoadEvent) event;
-			ScriptReference script = sevent.script();
-			
-			try {
-				if (scriptPathMatches(script)) 
-					createRequest(target, script);
-			} catch (CoreException ce) {
-				JavaScriptDebugPlugin.log(ce);
-			}
-		}
-		return true;
-	}
-
-	protected boolean scriptPathMatches(ScriptReference script) throws CoreException {
-		URI sourceURI = script.sourceURI();
-		if ("file".equals(sourceURI.getScheme())) {//$NON-NLS-1$			
-			IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-			URI workspaceURI = workspaceRoot.getRawLocationURI();			
-			sourceURI = workspaceURI.relativize(sourceURI);
-		}
-		return getScriptPath().equals(sourceURI.toString());
-	}
-
-	/**
-	 * Returns if the type names for the breakpoint are equal or not. Two <code>null</code> type names are considered to be equal.
-	 * 
-	 * @param tname1
-	 * @param tname2
-	 * @return true if the type names are equal, false otherwise
-	 */
-	boolean typeNamesEqual(String tname1, String tname2) {
-		if (tname1 == null && tname2 == null) {
-			return true;
-		}
-		return tname1 != null && tname1.equals(tname2);
-	}
-
-	/**
-	 * Custom comparison to avoid the leading separator issue from saying the paths are not equal
-	 * 
-	 * @param p1
-	 * @param p2
-	 * @return
-	 */
-	boolean pathsEqual(IPath p1, IPath p2) {
-		if (p1.segmentCount() == p2.segmentCount()) {
-			String[] segments = p1.segments();
-			for (int i = 0; i < segments.length; i++) {
-				if (!segments[i].equals(p2.segment(i))) {
-					return false;
-				}
-			}
-		}
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.model.IJavaScriptEventListener#eventSetComplete(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event, org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-	 */
-	public void eventSetComplete(Event event, JavaScriptDebugTarget target, boolean suspend, EventSet eventSet) {
-		if (event instanceof BreakpointEvent) {
-			JavaScriptThread thread = target.findThread(((BreakpointEvent) event).thread());
-			if (thread != null) {
-				thread.suspendForBreakpointComplete(this, suspend, eventSet);
-			}
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint#setJavaScriptElementHandle(java.lang.String)
-	 */
-	public void setJavaScriptElementHandle(String handle) throws CoreException {
-		ensureMarker().setAttribute(ELEMENT_HANDLE, handle);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint#getJavaScriptElementHandle()
-	 */
-	public String getJavaScriptElementHandle() throws CoreException {
-		return ensureMarker().getAttribute(ELEMENT_HANDLE, null);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptExceptionBreakpoint.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptExceptionBreakpoint.java
deleted file mode 100644
index 385d1f8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptExceptionBreakpoint.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.breakpoints;
-
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLoadBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.Event;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ExceptionEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-import org.eclipse.wst.jsdt.debug.core.model.JavaScriptDebugModel;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptThread;
-
-
-/**
- * Implementation of an exception breakpoint
- * 
- * @since 1.0
- */
-public class JavaScriptExceptionBreakpoint extends JavaScriptBreakpoint {
-	
-	public static final String MESSAGE = JavaScriptDebugPlugin.PLUGIN_ID + ".exception_message"; //$NON-NLS-1$
-	
-	private ExceptionRequest request = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * Required for persistence / restore
-	 */
-	public JavaScriptExceptionBreakpoint() {}
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param attributes
-	 * @throws DebugException
-	 */
-	public JavaScriptExceptionBreakpoint(final Map attributes) throws DebugException {
-		IWorkspaceRunnable wr = new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) throws CoreException {
-				IMarker marker = ResourcesPlugin.getWorkspace().getRoot().createMarker(IJavaScriptLoadBreakpoint.MARKER_ID);
-				// create the marker
-				setMarker(marker);
-
-				// add attributes
-				attributes.put(IBreakpoint.ID, getModelIdentifier());
-				attributes.put(IBreakpoint.ENABLED, Boolean.valueOf(true));
-				Integer nochar = new Integer(-1);
-				attributes.put(IMarker.CHAR_START, nochar);
-				attributes.put(IMarker.CHAR_END, nochar);
-
-				ensureMarker().setAttributes(attributes);
-
-				// add to breakpoint manager if requested
-				register(false);
-			}
-		};
-		run(getMarkerRule(ResourcesPlugin.getWorkspace().getRoot()), wr);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IBreakpoint#getModelIdentifier()
-	 */
-	public String getModelIdentifier() {
-		return JavaScriptDebugModel.MODEL_ID;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint#addToTarget(org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget)
-	 */
-	public void addToTarget(JavaScriptDebugTarget target) throws CoreException {
-		if (target.isTerminated() || shouldSkipBreakpoint()) {
-			return;
-		}
-		if(request == null) {
-			request = target.getVM().eventRequestManager().createExceptionRequest();
-			request.setEnabled(true);
-			addRequestForTarget(target, request);
-		}
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint#deregisterRequest(org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest)
-	 */
-	protected void deregisterRequest(JavaScriptDebugTarget target, EventRequest request) {
-		target.removeJSDIEventListener(this, request);
-		this.request = null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint#createRequest(org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference)
-	 */
-	protected boolean createRequest(JavaScriptDebugTarget target, ScriptReference script) throws CoreException {
-		return true;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint#handleEvent(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event, org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-	 */
-	public boolean handleEvent(Event event, JavaScriptDebugTarget target, boolean suspendVote, EventSet eventSet) {
-		if(event instanceof ExceptionEvent) {
-			try {
-				ExceptionEvent eevent = (ExceptionEvent) event;
-				setAttribute(MESSAGE, eevent.message());
-				JavaScriptThread thread = target.findThread(eevent.thread());
-				if (thread != null) {
-					thread.addBreakpoint(this);
-					return false;
-				}
-			}
-			catch(CoreException ce) {
-				JavaScriptDebugPlugin.log(ce);
-			}
-		}
-		return true;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint#eventSetComplete(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event, org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-	 */
-	public void eventSetComplete(Event event, JavaScriptDebugTarget target, boolean suspend, EventSet eventSet) {
-		if(event instanceof ExceptionEvent) {
-			JavaScriptThread thread = target.findThread(((ExceptionEvent) event).thread());
-			if (thread != null) {
-				thread.suspendForException(this);
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptFunctionBreakpoint.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptFunctionBreakpoint.java
deleted file mode 100644
index 23dd164..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptFunctionBreakpoint.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.breakpoints;
-
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget;
-
-/**
- * JavaScript function breakpoint
- * 
- * @since 1.0
- */
-public class JavaScriptFunctionBreakpoint extends JavaScriptLineBreakpoint implements IJavaScriptFunctionBreakpoint {
-
-	/**
-	 * If this is a function entry breakpoint
-	 */
-	private static final String ENTRY = JavaScriptDebugPlugin.PLUGIN_ID + ".entry"; //$NON-NLS-1$
-
-	/**
-	 * if this is a function exit breakpoint
-	 */
-	private static final String EXIT = JavaScriptDebugPlugin.PLUGIN_ID + ".exit"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 */
-	public JavaScriptFunctionBreakpoint() {
-		// needed for restoring breakpoints via extension point contributions
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param resource
-	 * @param name
-	 * @param signature
-	 * @param charstart
-	 * @param charend
-	 * @param attributes
-	 * @param register
-	 * @throws DebugException
-	 */
-	public JavaScriptFunctionBreakpoint(final IResource resource, final String name, final String signature, final int charstart, final int charend, final Map attributes, final boolean register) throws DebugException {
-		IWorkspaceRunnable wr = new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) throws CoreException {
-
-				// create the marker
-				setMarker(resource.createMarker(IJavaScriptFunctionBreakpoint.MARKER_ID));
-
-				// add attributes
-				attributes.put(IBreakpoint.ID, getModelIdentifier());
-				attributes.put(IBreakpoint.ENABLED, Boolean.valueOf(true));
-				attributes.put(FUNCTION_NAME, name);
-				attributes.put(FUNCTION_SIGNAURE, signature);
-				attributes.put(IMarker.CHAR_START, new Integer(charstart));
-				attributes.put(IMarker.CHAR_END, new Integer(charend));
-				attributes.put(ENTRY, Boolean.valueOf(true));
-
-				ensureMarker().setAttributes(attributes);
-
-				// add to breakpoint manager if requested
-				register(register);
-			}
-		};
-		run(getMarkerRule(resource), wr);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint#getFunctionName()
-	 */
-	public String getFunctionName() throws CoreException {
-		return ensureMarker().getAttribute(FUNCTION_NAME, null);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint#getSignature()
-	 */
-	public String getSignature() throws CoreException {
-		return ensureMarker().getAttribute(FUNCTION_SIGNAURE, null);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptLineBreakpoint#createRequest(org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference)
-	 */
-	protected boolean createRequest(JavaScriptDebugTarget target, ScriptReference script) throws CoreException {
-		Location loc = script.functionLocation(getFunctionName());
-		if (loc == null) {
-			return false;
-		}
-		BreakpointRequest request = target.getEventRequestManager().createBreakpointRequest(loc);
-		registerRequest(target, request);
-		configureRequest(request);
-		request.setEnabled(isEnabled());
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint#isEntry()
-	 */
-	public boolean isEntry() throws CoreException {
-		return ensureMarker().getAttribute(ENTRY, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint#setEntry(boolean)
-	 */
-	public void setEntry(boolean isentry) throws CoreException {
-		if (isentry != isEntry()) {
-			if(isentry && !isEnabled()) {
-				setAttributes(
-					new String[] {ENTRY, ENABLED}, 
-					new Object[] {Boolean.valueOf(isentry), Boolean.TRUE});
-			}
-			else if(!isExit()) {
-				setAttributes(
-					new String[] {ENTRY, ENABLED}, 
-					new Object[] {Boolean.valueOf(isentry), Boolean.FALSE});
-			}
-			else {
-				setAttribute(ENTRY, isentry);
-			}	
-			recreateBreakpoint();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint#isExit()
-	 */
-	public boolean isExit() throws CoreException {
-		return ensureMarker().getAttribute(EXIT, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint#setExit(boolean)
-	 */
-	public void setExit(boolean isexit) throws CoreException {
-		if (isexit != isExit()) {
-			if(isexit && !isEnabled()) {
-				setAttributes(
-					new String[] {EXIT, ENABLED}, 
-					new Object[] {Boolean.valueOf(isexit), Boolean.TRUE});
-			}
-			else if(!isEntry()) {
-				setAttributes(
-					new String[] {EXIT, ENABLED}, 
-					new Object[] {Boolean.valueOf(isexit), Boolean.FALSE});
-			}
-			else {
-				setAttribute(EXIT, isexit);
-			}
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptLineBreakpoint.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptLineBreakpoint.java
deleted file mode 100644
index f387294..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptLineBreakpoint.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.breakpoints;
-
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget;
-
-/**
- * Default implementation of a line breakpoint
- * 
- * @since 1.0
- */
-public class JavaScriptLineBreakpoint extends JavaScriptBreakpoint implements IJavaScriptLineBreakpoint {
-
-	/**
-	 * The condition for the breakpoint
-	 */
-	public static final String CONDITION = JavaScriptDebugPlugin.PLUGIN_ID + ".condition"; //$NON-NLS-1$
-	/**
-	 * If the condition is enabled for the breakpoint or not - allows us to keep conditions even if they are not used
-	 */
-	public static final String CONDITION_ENABLED = JavaScriptDebugPlugin.PLUGIN_ID + ".condition_enabled"; //$NON-NLS-1$
-	/**
-	 * If the breakpoint should suspend when the condition evaluates to true
-	 */
-	public static final String CONDITION_SUSPEND_ON_TRUE = JavaScriptDebugPlugin.PLUGIN_ID + ".condition_suspend_on_true"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 */
-	public JavaScriptLineBreakpoint() {
-		// needed for restoring breakpoints via extension point contributions
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param resource
-	 * @param linenumber
-	 * @param charstart
-	 * @param charend
-	 * @param attributes
-	 * @param register
-	 * @throws DebugException
-	 */
-	public JavaScriptLineBreakpoint(final IResource resource, final int linenumber, final int charstart, final int charend, final Map attributes, final boolean register) throws DebugException {
-		IWorkspaceRunnable wr = new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) throws CoreException {
-
-				// create the marker
-				setMarker(resource.createMarker(IJavaScriptLineBreakpoint.MARKER_ID));
-
-				// add attributes
-				attributes.put(IBreakpoint.ID, getModelIdentifier());
-				attributes.put(IBreakpoint.ENABLED, Boolean.valueOf(true));
-				attributes.put(IMarker.LINE_NUMBER, new Integer(linenumber));
-				attributes.put(IMarker.CHAR_START, new Integer(charstart));
-				attributes.put(IMarker.CHAR_END, new Integer(charend));
-
-				ensureMarker().setAttributes(attributes);
-
-				// add to breakpoint manager if requested
-				register(register);
-			}
-		};
-		run(getMarkerRule(resource), wr);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint#createRequest(org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference)
-	 */
-	protected boolean createRequest(JavaScriptDebugTarget target, ScriptReference script) throws CoreException {
-		Location loc = script.lineLocation(getLineNumber());
-		if (loc == null) {
-			return false;
-		}
-		BreakpointRequest request = target.getEventRequestManager().createBreakpointRequest(loc);
-		registerRequest(target, request);
-		configureRequest(request);
-		request.setEnabled(isEnabled());
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint#configureRequest(org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest)
-	 */
-	protected void configureRequest(BreakpointRequest request) throws CoreException {
-		super.configureRequest(request);
-		request.addConditionFilter(getCondition());
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ILineBreakpoint#getLineNumber()
-	 */
-	public int getLineNumber() throws CoreException {
-		return ensureMarker().getAttribute(IMarker.LINE_NUMBER, -1);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ILineBreakpoint#getCharStart()
-	 */
-	public int getCharStart() throws CoreException {
-		return ensureMarker().getAttribute(IMarker.CHAR_START, -1);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ILineBreakpoint#getCharEnd()
-	 */
-	public int getCharEnd() throws CoreException {
-		return ensureMarker().getAttribute(IMarker.CHAR_END, -1);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint#isConditionEnabled()
-	 */
-	public boolean isConditionEnabled() throws CoreException {
-		return ensureMarker().getAttribute(CONDITION_ENABLED, false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint#isConditionSuspendOnTrue()
-	 */
-	public boolean isConditionSuspendOnTrue() throws CoreException {
-		return ensureMarker().getAttribute(CONDITION_SUSPEND_ON_TRUE, true);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint#setConditionSuspendOnTrue(boolean)
-	 */
-	public void setConditionSuspendOnTrue(boolean suspendontrue) throws CoreException {
-		if (suspendontrue != isConditionSuspendOnTrue()) {
-			setAttribute(CONDITION_SUSPEND_ON_TRUE, suspendontrue);
-			recreateBreakpoint();
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint#setCondition(java.lang.String)
-	 */
-	public void setCondition(String condition) throws CoreException {
-		if (condition != null && condition.length() == 0) {
-			setAttribute(CONDITION, null);
-		}
-		else {
-			setAttribute(CONDITION, condition);
-		}
-		recreateBreakpoint();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint#getCondition()
-	 */
-	public String getCondition() throws CoreException {
-		return ensureMarker().getAttribute(CONDITION, null);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint#setConditionEnabled(boolean)
-	 */
-	public void setConditionEnabled(boolean enabled) throws CoreException {
-		if(isConditionEnabled() != enabled) {
-			setAttribute(CONDITION_ENABLED, enabled);
-			recreateBreakpoint();
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptLoadBreakpoint.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptLoadBreakpoint.java
deleted file mode 100644
index eb7d647..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/JavaScriptLoadBreakpoint.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.breakpoints;
-
-import java.util.ArrayList;
-import java.util.Map;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLoadBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.Event;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ScriptLoadEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptPreferencesManager;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptThread;
-
-/**
- * Breakpoint that suspends on {@link ScriptLoadEvent}s
- * 
- * @since 1.0
- */
-public class JavaScriptLoadBreakpoint extends JavaScriptLineBreakpoint implements IJavaScriptLoadBreakpoint {
-
-	/**
-	 * Attribute flag to tag a script load breakpoint as a global suspend load breakpoint
-	 */
-	public static final String GLOBAL_SUSPEND = JavaScriptDebugPlugin.PLUGIN_ID + ".global_suspend"; //$NON-NLS-1$
-	
-	/**
-	 * Constructor
-	 */
-	public JavaScriptLoadBreakpoint() {
-		// used for persistence / restoration
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param resource
-	 * @param charstart
-	 * @param charend
-	 * @param attributes
-	 * @param register
-	 * @throws DebugException
-	 */
-	public JavaScriptLoadBreakpoint(final IResource resource, final int charstart, final int charend, final Map attributes, final boolean register) throws DebugException {
-		IWorkspaceRunnable wr = new IWorkspaceRunnable() {
-			public void run(IProgressMonitor monitor) throws CoreException {
-				IMarker marker = null;
-				if(resource == null) {
-					marker = ResourcesPlugin.getWorkspace().getRoot().createMarker(IJavaScriptLoadBreakpoint.MARKER_ID);
-				}
-				else {
-					marker = resource.createMarker(IJavaScriptLoadBreakpoint.MARKER_ID);
-				}
-				// create the marker
-				setMarker(marker);
-
-				// add attributes
-				attributes.put(IBreakpoint.ID, getModelIdentifier());
-				attributes.put(IBreakpoint.ENABLED, Boolean.valueOf(true));
-				attributes.put(IMarker.CHAR_START, new Integer(charstart));
-				attributes.put(IMarker.CHAR_END, new Integer(charend));
-
-				ensureMarker().setAttributes(attributes);
-
-				// add to breakpoint manager if requested
-				register(register);
-			}
-		};
-		run(getMarkerRule(ResourcesPlugin.getWorkspace().getRoot()), wr);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint#handleEvent(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event, org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-	 */
-	public boolean handleEvent(Event event, JavaScriptDebugTarget target, boolean suspendVote, EventSet eventSet) {
-		if (event instanceof ScriptLoadEvent) {
-			ScriptLoadEvent sevent = (ScriptLoadEvent) event;
-			ScriptReference script = sevent.script();
-			JavaScriptThread thread = target.findThread((sevent).thread());
-			if (thread != null) {
-				if(isGlobalLoadSuspend()) {
-					JavaScriptPreferencesManager.setGlobalSuspendOn(script.sourceURI().toString());
-					thread.addBreakpoint(this);
-					return false;
-				} else if(isMatchedScriptLoadSuspend(script, thread, suspendVote)){
-					thread.addBreakpoint(this);
-					return false;
-				}
-			}
-		}
-		return true;
-	}
-	
-	/**
-	 * Returns if this breakpoint matches this script and should suspend
-	 * 
-	 * @param script
-	 * @param thread
-	 * @param suspendVote
-	 * 
-	 * @return <code>true</code> if we should suspend on this script load <code>false</code> otherwise
-	 */
-	private boolean isMatchedScriptLoadSuspend(ScriptReference script, JavaScriptThread thread, boolean suspendVote) {
-		try {
-			if (scriptPathMatches(script)) {
-				int vote = thread.suspendForScriptLoad(this, script, suspendVote);
-				return (vote & IJavaScriptBreakpointParticipant.SUSPEND) > 0 || vote == IJavaScriptBreakpointParticipant.DONT_CARE;
-			}
-		}
-		catch(CoreException ce) {
-			JavaScriptDebugPlugin.log(ce);
-		}
-		return false;
-	}
-	
-	/**
-	 * Returns if this breakpoint supports global suspend
-	 * 
-	 * @return <code>true</code> if we should suspend on all script loads <code>false</code> otherwise
-	 */
-	private boolean isGlobalLoadSuspend() {
-		try {
-			return ensureMarker().getAttribute(GLOBAL_SUSPEND, false);
-		}
-		catch(CoreException ce) {
-			JavaScriptDebugPlugin.log(ce);
-		}
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint#registerRequest(org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest)
-	 */
-	protected void registerRequest(JavaScriptDebugTarget target, EventRequest request) {
-		ArrayList requests = getRequests(target);
-		if (requests == null || requests.isEmpty()) {
-			// only add it once per target
-			addRequestForTarget(target, request);
-			try {
-				if (isRegistered()) {
-					incrementInstallCount();
-				}
-			} catch (CoreException ce) {
-				JavaScriptDebugPlugin.log(ce);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint#deregisterRequest(org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest)
-	 */
-	protected void deregisterRequest(JavaScriptDebugTarget target, EventRequest request) {
-		target.removeJSDIEventListener(this, request);
-		try {
-			decrementInstallCount();
-		} catch (CoreException ce) {
-			JavaScriptDebugPlugin.log(ce);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint#eventSetComplete(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event, org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-	 */
-	public void eventSetComplete(Event event, JavaScriptDebugTarget target, boolean suspend, EventSet eventSet) {
-		if (event instanceof ScriptLoadEvent) {
-			JavaScriptThread thread = target.findThread(((ScriptLoadEvent) event).thread());
-			if (thread != null) {
-				ScriptLoadEvent sevent = (ScriptLoadEvent) event;
-				thread.suspendForScriptLoadComplete(this, sevent.script(), suspend, eventSet);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptLineBreakpoint#createRequest(org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference)
-	 */
-	protected boolean createRequest(JavaScriptDebugTarget target, ScriptReference script) throws CoreException {
-		ScriptLoadRequest request = target.getEventRequestManager().createScriptLoadRequest();
-		registerRequest(target, request);
-		request.setEnabled(isEnabled());
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/Messages.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/Messages.java
deleted file mode 100644
index 47d2c35..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/Messages.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.breakpoints;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * 
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.core.breakpoints.messages"; //$NON-NLS-1$
-	public static String hit_count_must_be_greater_than_0;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/messages.properties b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/messages.properties
deleted file mode 100644
index d175781..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/breakpoints/messages.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 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
-###############################################################################
-hit_count_must_be_greater_than_0=A breakpoint hit count must be greater than -1
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/ConnectorsManager.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/ConnectorsManager.java
deleted file mode 100644
index 3a3325a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/ConnectorsManager.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.launching;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IRegistryEventListener;
-import org.eclipse.core.runtime.InvalidRegistryObjectException;
-import org.eclipse.core.runtime.RegistryFactory;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector;
-import org.eclipse.wst.jsdt.debug.internal.core.Constants;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-
-/**
- * Manages all of the contributed {@link Connector}s for JSDI
- * 
- * @since 1.0
- */
-public class ConnectorsManager implements IRegistryEventListener {
-
-	private static final String ID = "id"; //$NON-NLS-1$
-	private HashMap connectors;
-
-	/**
-	 * Constructor
-	 */
-	public ConnectorsManager() {
-		RegistryFactory.getRegistry().addListener(this, Constants.LAUNCHING_CONNECTORS);
-	}
-
-	/**
-	 * Returns the live collection of {@link Connector}s the manager currently knows about sorted by name
-	 * 
-	 * @return the collection of {@link Connector}s in the manager
-	 */
-	public synchronized List /*<Connector>*/ getConnectors() {
-		initializeConnectors();
-		ArrayList list = new ArrayList(connectors.values());
-		Collections.sort(list, new Comparator() {
-			public int compare(Object arg0, Object arg1) {
-				if (arg0 instanceof Connector && arg1 instanceof Connector) {
-					return ((Connector) arg0).name().compareTo(((Connector) arg1).name());
-				}
-				return -1;
-			}
-		});
-		return Collections.unmodifiableList(list);
-	}
-
-	/**
-	 * Returns the {@link Connector} with the given id or <code>null</code>
-	 * 
-	 * @param connectorid
-	 * @return the connector with the given id or <code>null</code>
-	 */
-	public synchronized Connector getConnector(String connectorid) {
-		initializeConnectors();
-		return (Connector) connectors.get(connectorid);
-	}
-
-	/**
-	 * Initializes the connector collection
-	 */
-	private synchronized void initializeConnectors() {
-		if (connectors == null) {
-			connectors = new HashMap();
-			IExtensionPoint point = RegistryFactory.getRegistry().getExtensionPoint(JavaScriptDebugPlugin.PLUGIN_ID, Constants.LAUNCHING_CONNECTORS);
-			if(point != null) {
-				IExtension[] extensions = point.getExtensions();
-				for (int i = 0; i < extensions.length; i++) {
-					IExtension extension = extensions[i];
-					try {
-						IConfigurationElement[] elements = extension.getConfigurationElements();
-						for (int j = 0; j < elements.length; j++) {
-							IConfigurationElement element = elements[j];
-							if (!Constants.CONNECTOR.equalsIgnoreCase(element.getName())) {
-								// log it
-								continue;
-							}
-							connectors.put(element.getAttribute(ID), element.createExecutableExtension(Constants.CLASS));
-						}
-					} catch (InvalidRegistryObjectException e) {
-						JavaScriptDebugPlugin.log(e);
-					} catch (CoreException e) {
-						JavaScriptDebugPlugin.log(e);
-					}
-				}
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IRegistryEventListener#added(org.eclipse.core.runtime.IExtension[])
-	 */
-	public void added(IExtension[] extensions) {
-		connectors = null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IRegistryEventListener#added(org.eclipse.core.runtime.IExtensionPoint[])
-	 */
-	public void added(IExtensionPoint[] extensionPoints) {
-		connectors = null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IRegistryEventListener#removed(org.eclipse.core.runtime.IExtension[])
-	 */
-	public void removed(IExtension[] extensions) {
-		connectors = null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IRegistryEventListener#removed(org.eclipse.core.runtime.IExtensionPoint[])
-	 */
-	public void removed(IExtensionPoint[] extensionPoints) {
-		connectors = null;
-	}
-	
-	/**
-	 * Dispose the manager and cleans up resources
-	 */
-	public void dispose() {
-		if(this.connectors != null) {
-			this.connectors.clear();
-			this.connectors = null;
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/ILaunchConstants.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/ILaunchConstants.java
deleted file mode 100644
index ee19ade..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/ILaunchConstants.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.launching;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector;
-
-/**
- * Constants used for launching
- * 
- * @since 1.0
- */
-public interface ILaunchConstants {
-
-	/**
-	 * Constant for the host name attribute
-	 */
-	public static final String HOST = "host"; //$NON-NLS-1$
-
-	/**
-	 * Constant for the port attribute
-	 */
-	public static final String PORT = "port"; //$NON-NLS-1$
-
-	/**
-	 * Constant for the argument map for a connector attribute
-	 */
-	public static final String ARGUMENT_MAP = "argument_map"; //$NON-NLS-1$
-
-	/**
-	 * Constant for the id of the {@link Connector} used in a connector-based launch
-	 */
-	public static final String CONNECTOR_ID = "connector_id"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/JavaScriptSourceDirector.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/JavaScriptSourceDirector.java
deleted file mode 100644
index 73bb09b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/JavaScriptSourceDirector.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.launching;
-
-import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupDirector;
-import org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant;
-
-/**
- * Default source director for JavaScript debugging.
- * 
- * @since 1.0
- */
-public class JavaScriptSourceDirector extends AbstractSourceLookupDirector {
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupDirector#initializeParticipants()
-	 */
-	public void initializeParticipants() {
-		addParticipants(new ISourceLookupParticipant[] { new JavaScriptSourceLookupParticipant() });
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/JavaScriptSourceLookupParticipant.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/JavaScriptSourceLookupParticipant.java
deleted file mode 100644
index 5477256..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/JavaScriptSourceLookupParticipant.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.launching;
-
-import java.io.ByteArrayInputStream;
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.URIUtil;
-import org.eclipse.debug.core.sourcelookup.AbstractSourceLookupParticipant;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame;
-import org.eclipse.wst.jsdt.debug.core.model.IScript;
-import org.eclipse.wst.jsdt.debug.internal.core.Constants;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.core.model.Script;
-
-/**
- * Default source lookup participant
- * 
- * @since 1.0
- */
-public class JavaScriptSourceLookupParticipant extends AbstractSourceLookupParticipant {
-
-	static final Object[] NO_SOURCE = new Object[0];
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.sourcelookup.ISourceLookupParticipant#getSourceName(java.lang.Object)
-	 */
-	public String getSourceName(Object object) throws CoreException {
-		if (object instanceof IJavaScriptStackFrame) {
-			return ((IJavaScriptStackFrame) object).getSourceName();
-		}
-		if(object instanceof IScript) {
-			return URIUtil.lastSegment(((IScript)object).sourceURI());
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.sourcelookup.AbstractSourceLookupParticipant#findSourceElements(java.lang.Object)
-	 */
-	public Object[] findSourceElements(Object object) throws CoreException {
-		URI sourceURI = getSourceURI(object);
-		if (sourceURI != null) {
-			if (!sourceURI.isAbsolute() || "file".equals(sourceURI.getScheme())) {//$NON-NLS-1$			
-				IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
-				URI workspaceURI = workspaceRoot.getRawLocationURI();			
-				URI workspaceRelativeURI = workspaceURI.relativize(sourceURI);
-				if (! workspaceRelativeURI.isAbsolute()) {
-					IFile file = (IFile) workspaceRoot.findMember(new Path(workspaceRelativeURI.getPath()), false);
-					if (file != null) {
-						return new IFile[] { file };
-					}
-				}
-			}
-			//else show the temp source
-			return showExternalSource(getSource(object), sourceURI);
-		}
-		return NO_SOURCE;
-	}
-
-	/**
-	 * Returns the raw element source to use to display an external editor
-	 * @param object
-	 * @return the raw source or <code>null</code>
-	 */
-	private String getSource(Object object) {
-		if(object instanceof IJavaScriptStackFrame) {
-			IJavaScriptStackFrame jframe = (IJavaScriptStackFrame) object;
-			return jframe.getSource();
-		}
-		if(object instanceof IScript) {
-			IScript script = (IScript) object;
-			return script.source();
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the URI to use to look up source
-	 * @param object
-	 * @return the URI or <code>null</code>
-	 * @since 1.1
-	 */
-	private URI getSourceURI(Object object) {
-		if(object instanceof IJavaScriptStackFrame) {
-			IJavaScriptStackFrame jframe = (IJavaScriptStackFrame) object;
-			try {
-				return URIUtil.fromString(jframe.getSourcePath());
-			} catch (URISyntaxException e) {
-				JavaScriptDebugPlugin.log(e);
-			}
-		}
-		if(object instanceof IScript) {
-			IScript script = (IScript) object;
-			return script.sourceURI();
-		}
-		return null;
-	}
-	
-	/**
-	 * Shows the source in an external editor
-	 * 
-	 * @param source
-	 * @param path
-	 * @return the collection of files to show in external editors
-	 */
-	private Object[] showExternalSource(String source, URI uri) {
-		if(source == null) {
-			return NO_SOURCE;
-		}
-		try {
-			IProject project = JavaScriptDebugPlugin.getExternalSourceProject(true);
-			String filename = Script.resolveName(uri);
-			String uriHash =  Integer.toString(uri.toString().hashCode());
-			String sourceHash = Integer.toString(source.hashCode());
-			IPath path = new Path(uriHash).append(sourceHash).append(filename);
-			String ext = path.getFileExtension(); 
-			if(ext == null || !Constants.JS_EXTENSION.equals(ext)) {
-				path = path.addFileExtension(Constants.JS_EXTENSION);
-			}
-			IFile file = project.getFile(path);
-			if(!file.isAccessible()) {
-				IContainer folder = project;
-				for (int i = 0; i < path.segmentCount()-1; i++) {
-					IFolder f = folder.getFolder(new Path(path.segment(i)));
-					if(!f.exists()) {
-						f.create(true, true, null);
-					}
-					folder = f;
-				}
-				file.create(new ByteArrayInputStream(source.getBytes()), true, null);
-			}
-			
-			if (JavaScriptDebugPlugin.getExternalScriptPath(path) == null) {
-				JavaScriptDebugPlugin.addExternalScriptPath(path, uri.toString());
-			}	
-			return new Object[] {file};
-
-		} catch (CoreException ce) {
-			JavaScriptDebugPlugin.log(ce);
-			return NO_SOURCE;
-		}
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.sourcelookup.AbstractSourceLookupParticipant#isFindDuplicates()
-	 */
-	public boolean isFindDuplicates() {
-		return true;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/Messages.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/Messages.java
deleted file mode 100644
index d8a82ab..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/Messages.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.launching;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * 
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.core.launching.messages"; //$NON-NLS-1$
-	public static String argument_map_null;
-	public static String could_not_locate_connector;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/RemoteJavaScriptLaunchDelegate.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/RemoteJavaScriptLaunchDelegate.java
deleted file mode 100644
index 7cd8d1f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/RemoteJavaScriptLaunchDelegate.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.launching;
-
-import java.io.IOException;
-import java.util.Map;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.model.LaunchConfigurationDelegate;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.AttachingConnector;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.ListeningConnector;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget;
-
-/**
- * Default launch delegate for a remote debug connection
- * 
- * @since 1.0
- */
-public class RemoteJavaScriptLaunchDelegate extends LaunchConfigurationDelegate {
-
-	final static String LAUNCH_URI = "launch_uri"; //$NON-NLS-1$
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ILaunchConfigurationDelegate#launch(org. eclipse.debug.core.ILaunchConfiguration, java.lang.String, org.eclipse.debug.core.ILaunch, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void launch(ILaunchConfiguration configuration, String mode, final ILaunch launch, IProgressMonitor monitor) throws CoreException {
-		String name = configuration.getAttribute(ILaunchConstants.CONNECTOR_ID, (String) null);
-		
-		Map argmap = configuration.getAttribute(ILaunchConstants.ARGUMENT_MAP, (Map) null);
-		if (argmap == null) {
-			Status status = new Status(
-					IStatus.ERROR, 
-					JavaScriptDebugPlugin.PLUGIN_ID, 
-					Messages.argument_map_null);
-			throw new CoreException(status);
-		}
-		Connector connector = JavaScriptDebugPlugin.getConnectionsManager().getConnector(name);
-		VirtualMachine vm;
-		try {
-			if(connector instanceof AttachingConnector) {
-				vm = ((AttachingConnector)connector).attach(argmap);
-			}
-			else if(connector instanceof ListeningConnector) {
-				vm = ((ListeningConnector)connector).accept(argmap);
-			}
-			else {
-				Status status = new Status(
-						IStatus.ERROR, 
-						JavaScriptDebugPlugin.PLUGIN_ID, 
-						NLS.bind(Messages.could_not_locate_connector, new String[] {name}));
-				throw new CoreException(status);
-			}
-		} catch (IOException e) {
-			Status status = new Status(IStatus.ERROR, JavaScriptDebugPlugin.PLUGIN_ID, "Error occured while launching", e); //$NON-NLS-1$
-			throw new CoreException(status);
-		}
-		JavaScriptDebugTarget target = new JavaScriptDebugTarget(vm, null, launch, vm.name(), true, true);
-		launch.addDebugTarget(target);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/messages.properties b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/messages.properties
deleted file mode 100644
index 62da349..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/launching/messages.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-argument_map_null=Error occured while launching: connecting argument map was null
-could_not_locate_connector=Error occured while launching: could not locate connector: {0}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/messages.properties b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/messages.properties
deleted file mode 100644
index 9a7459d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/messages.properties
+++ /dev/null
@@ -1 +0,0 @@
-external_javascript_source=External JavaScript Source
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/BreakpointParticipantManager.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/BreakpointParticipantManager.java
deleted file mode 100644
index fec73ed..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/BreakpointParticipantManager.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.model;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptFunctionBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLoadBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread;
-import org.eclipse.wst.jsdt.debug.internal.core.Constants;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-
-/**
- * Manager for all {@link IJavaScriptBreakpointParticipant}s
- * 
- * @since 1.0
- */
-public class BreakpointParticipantManager {
-
-	/**
-	 * proxy to a "real" {@link IJavaScriptBreakpointParticipant} to allow lazy loading
-	 * of classes from extension points
-	 */
-	class Participant implements IJavaScriptBreakpointParticipant {
-		
-		private IConfigurationElement element = null;
-		private IJavaScriptBreakpointParticipant delegate = null;
-		
-		/**
-		 * Constructor
-		 * @param element
-		 */
-		public Participant(IConfigurationElement element) {
-			this.element = element;
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant#breakpointHit(org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread, org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint)
-		 */
-		public int breakpointHit(IJavaScriptThread thread, IJavaScriptBreakpoint breakpoint) {
-			IJavaScriptBreakpointParticipant part = getDelegate();
-			if(part != null) {
-				return part.breakpointHit(thread, breakpoint);
-			}
-			return DONT_CARE;
-		}
-		
-		/**
-		 * @return the delegate
-		 */
-		synchronized IJavaScriptBreakpointParticipant getDelegate() {
-			if(delegate == null) {
-				try {
-					delegate = (IJavaScriptBreakpointParticipant) element.createExecutableExtension(Constants.CLASS);
-				} catch (CoreException e) {
-					JavaScriptDebugPlugin.log(e);
-				}
-			}
-			return delegate;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant#scriptLoaded(org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread, org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference, org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint)
-		 */
-		public int scriptLoaded(IJavaScriptThread thread, ScriptReference script, IJavaScriptBreakpoint breakpoint) {
-			IJavaScriptBreakpointParticipant part = getDelegate();
-			if(part != null) {
-				return part.scriptLoaded(thread, script, breakpoint);
-			}
-			return DONT_CARE;
-		}
-	}
-	
-	static final IJavaScriptBreakpointParticipant[] NO_PARTICIPANTS = new IJavaScriptBreakpointParticipant[0];
-	
-	public static final String ALL = "*"; //$NON-NLS-1$
-	public static final String FUNCTION = "function"; //$NON-NLS-1$
-	public static final String LINE = "line"; //$NON-NLS-1$
-	public static final String SCRIPT = "script"; //$NON-NLS-1$
-	
-	private Map participants = null;
-	
-	
-	IJavaScriptBreakpointParticipant[] getParticipants(String kind) {
-		initialize();
-		ArrayList parts = (ArrayList) this.participants.get(kind);
-		if(parts != null){
-			return (IJavaScriptBreakpointParticipant[]) parts.toArray(new IJavaScriptBreakpointParticipant[parts.size()]);
-		}
-		return NO_PARTICIPANTS;
-	}
-	
-	/**
-	 * Returns the complete collection of {@link IJavaScriptBreakpointParticipant}s for the given
-	 * breakpoint.<br>
-	 * <br>
-	 * This method does not return <code>null</code>, an empty array is returned if no {@link IJavaScriptBreakpointParticipant}s
-	 * have been defined for the given breakpoint.
-	 * 
-	 * @param kind the kind
-	 * @return the complete list of {@link IJavaScriptBreakpointParticipant}s or an empty array, never <code>null</code>
-	 */
-	public IJavaScriptBreakpointParticipant[] getParticipants(IJavaScriptBreakpoint breakpoint) {
-		initialize();
-		ArrayList parts = new ArrayList();
-		ArrayList existing = (ArrayList)this.participants.get(ALL);
-		if(existing != null) {
-			parts.addAll(existing);
-		}
-		if(breakpoint instanceof IJavaScriptFunctionBreakpoint) {
-			existing = (ArrayList)this.participants.get(FUNCTION);
-			if(existing != null) {
-				parts.addAll(existing);
-			}
-		}
-		else if(breakpoint instanceof IJavaScriptLoadBreakpoint) {
-			existing = (ArrayList)this.participants.get(SCRIPT);
-			if(existing != null) {
-				parts.addAll(existing);
-			}
-		}
-		else if(breakpoint instanceof IJavaScriptLineBreakpoint) {
-			existing = (ArrayList)this.participants.get(LINE);
-			if(existing != null) {
-				parts.addAll(existing);
-			}
-		}
-		if(parts.size() < 1) {
-			return NO_PARTICIPANTS;
-		}
-		return (IJavaScriptBreakpointParticipant[]) parts.toArray(new IJavaScriptBreakpointParticipant[parts.size()]);
-	}
-	
-	/**
-	 * Adds the given participant to the manager.
-	 * @param kind the kind, <code>null</code> is not accepted
-	 * @param participant
-	 */
-	public void addParticipant(String kind, IJavaScriptBreakpointParticipant participant) {
-		initialize();
-		Assert.isNotNull(kind);
-		ArrayList parts = (ArrayList) this.participants.get(kind);
-		if(parts == null) {
-			parts = new ArrayList();
-			this.participants.put(kind, parts);
-		}
-		if(!parts.contains(participant)) {
-			parts.add(participant);
-		}
-	}
-	
-	/**
-	 * Load all the extensions
-	 */
-	private synchronized void initialize() {
-		if(this.participants == null) {
-			this.participants = Collections.synchronizedMap(new HashMap());
-			IExtensionPoint extensionPoint = Platform.getExtensionRegistry().getExtensionPoint(JavaScriptDebugPlugin.PLUGIN_ID, Constants.BREAKPOINT_PARTICIPANTS);
-			IConfigurationElement[] elements = extensionPoint.getConfigurationElements();
-			String kind = null;
-			ArrayList parts = null;
-			for (int i = 0; i < elements.length; i++) {
-				kind = elements[i].getAttribute(Constants.KIND);
-				parts = (ArrayList) this.participants.get(kind);
-				if(parts == null) {
-					parts = new ArrayList();
-					this.participants.put(kind, parts);
-				}
-				parts.add(new Participant(elements[i]));
-			}
-		}
-	}
-	
-	/**
-	 * Disposes and cleans up resources
-	 */
-	public void dispose() {
-		if(this.participants != null) {
-			this.participants.clear();
-			this.participants = null;
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/EventDispatcher.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/EventDispatcher.java
deleted file mode 100644
index 0dbb00d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/EventDispatcher.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.model;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.Event;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-
-/**
- * Event dispatcher that notifies registered model elements
- * 
- * @see IJavaScriptEventListener
- * @since 1.0
- */
-public final class EventDispatcher implements Runnable {
-
-	/**
-	 * Custom debug event kind for when a script is loaded
-	 */
-	public static final int EVENT_SCRIPT_LOADED = 0x0001;
-	
-	private HashMap /*<EventRequest, IJSDIEventListener>*/ listeners = null;
-	private boolean shutdown = false;
-	private JavaScriptDebugTarget target = null;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param target
-	 */
-	public EventDispatcher(JavaScriptDebugTarget target) {
-		this.target = target;
-	}
-
-	/**
-	 * Registers the given listener for the specified request.
-	 * 
-	 * @param listener
-	 * @param request
-	 */
-	public synchronized void addEventListener(IJavaScriptEventListener listener, EventRequest request) {
-		if(this.listeners == null) {
-			this.listeners = new HashMap(4);
-		}
-		this.listeners.put(request, listener);
-	}
-
-	/**
-	 * Removes the given listener for the given request and returns the status of the removal
-	 * as per the contract of {@link Collection#remove(Object)}
-	 * 
-	 * @param listener
-	 * @param request
-	 */
-	public synchronized boolean removeEventListener(IJavaScriptEventListener listener, EventRequest request) {
-		if(this.listeners != null) {
-			return this.listeners.remove(request) != null;
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Runnable#run()
-	 */
-	public void run() {
-		if (shutdown) {
-			return; // no-op
-		}
-		VirtualMachine vm = target.getVM();
-		if (vm != null) {
-			EventQueue queue = vm.eventQueue();
-			EventSet eventset = null;
-			while (!shutdown) {
-				try {
-					eventset = queue.remove();
-					if (eventset != null) {
-						dispatch(eventset);
-					}
-				}
-				catch(RuntimeException rte) {
-					try {
-						this.target.terminate();
-					} catch (DebugException e) {
-						JavaScriptDebugPlugin.log(e);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * performs the re-firing of JSDI events up to any model elements listening
-	 * 
-	 * @param eventset
-	 */
-	void dispatch(EventSet eventSet) {
-		Event event = null;
-		boolean resume = true;
-		for (Iterator iter = eventSet.iterator(); iter.hasNext();) {
-			event = (Event) iter.next();
-			if (event == null) {
-				continue;
-			}
-			IJavaScriptEventListener listener = (IJavaScriptEventListener) this.listeners.get(event.request());
-			if(listener != null) {
-				resume &= listener.handleEvent(event, target, false, eventSet);
-			}
-		}
-
-		for (Iterator iter = eventSet.iterator(); iter.hasNext();) {
-			event = (Event) iter.next();
-			if (event == null) {
-				continue;
-			}
-			IJavaScriptEventListener listener = (IJavaScriptEventListener) this.listeners.get(event.request());
-			if(listener != null) {
-				listener.eventSetComplete(event, target, !resume, eventSet);
-			}
-		}
-		if (resume) {
-			eventSet.resume();
-		}
-	}
-
-	/**
-	 * Shut down and clean up the dispatcher
-	 */
-	public void shutdown() {
-		shutdown = true;
-		listeners.clear();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/IJavaScriptEventListener.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/IJavaScriptEventListener.java
deleted file mode 100644
index f11bd57..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/IJavaScriptEventListener.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.model;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.Event;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-
-/**
- * Describes a listener that is interested in listening / responding to 
- * {@link EventSet}s from the underlying model.
- * 
- * @since 1.0
- */
-public interface IJavaScriptEventListener {
-	/**
-	 * Handles the given event that this listener has registered for and returns whether the thread in which the event occurred should be resumed. All event handlers for the events in an event set are given a chance to vote on whether the thread should be resumed. If all agree, the thread is resumed by the event dispatcher. If any event handler returns <code>false</code> the thread in which the event originated is left in a suspended state.
-	 * <p>
-	 * Event listeners are provided with the current state of the suspend vote. For example, this could allow a conditional breakpoint to not bother running its evaluation since the vote is already to suspend (if it coincides with a step end).
-	 * </p>
-	 * 
-	 * @param event
-	 *            the event to handle
-	 * @param target
-	 *            the debug target in which the event occurred
-	 * @param suspendVote
-	 *            whether the current vote among event listeners is to suspend
-	 * @param eventSet
-	 *            the event set the event is contained in
-	 * @return whether the thread in which the event occurred should be resumed
-	 */
-	public boolean handleEvent(Event event, JavaScriptDebugTarget target, boolean suspendVote, EventSet eventSet);
-
-	/**
-	 * Notification that all event handlers for an event set have handled their associated events and whether the event set will suspend.
-	 * 
-	 * @param event
-	 *            event the listener was registered for/handled
-	 * @param target
-	 *            target in which the event occurred
-	 * @param suspend
-	 *            whether the event will cause the event thread to suspend
-	 * @param eventSet
-	 *            the event set the event is contained in
-	 */
-	public void eventSetComplete(Event event, JavaScriptDebugTarget target, boolean suspend, EventSet eventSet);
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptDebugElement.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptDebugElement.java
deleted file mode 100644
index 8dd7f8d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptDebugElement.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.model;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.DebugElement;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IDisconnect;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptDebugTarget;
-import org.eclipse.wst.jsdt.debug.core.model.JavaScriptDebugModel;
-
-/**
- * Default implementation of {@link DebugElement}
- * 
- * @since 1.0
- */
-public class JavaScriptDebugElement extends DebugElement implements IDisconnect {
-
-	/**
-	 * Constructs a new element for the Rhino debug client.
-	 * 
-	 * @param target
-	 */
-	public JavaScriptDebugElement(IJavaScriptDebugTarget target) {
-		super(target);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IDebugElement#getModelIdentifier()
-	 */
-	public String getModelIdentifier() {
-		return JavaScriptDebugModel.MODEL_ID;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.DebugElement#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if(IDebugTarget.class == adapter) {
-			return getDebugTarget();
-		}
-		if(IJavaScriptDebugTarget.class == adapter) {
-			return getJavaScriptDebugTarget();
-		}
-		if(IDisconnect.class == adapter) {
-			return this;
-		}
-		return super.getAdapter(adapter);
-	}
-	
-	/**
-	 * Returns this element's target.
-	 * 
-	 * @return debug target
-	 */
-	protected JavaScriptDebugTarget getJavaScriptDebugTarget() {
-		return (JavaScriptDebugTarget) getDebugTarget();
-	}
-
-	/**
-	 * @return the {@link VirtualMachine} associated with this debug element
-	 */
-	protected VirtualMachine getVM() {
-		return getJavaScriptDebugTarget().getVM();
-	}
-
-	/**
-	 * @return the {@link EventRequestManager} associated with these model elements
-	 */
-	public EventRequestManager getEventRequestManager() {
-		return getVM().eventRequestManager();
-	}
-
-	/**
-	 * Adds the given listener to this target's event dispatcher's table of listeners for the specified event request. The listener will be notified each time the event occurs.
-	 * 
-	 * @param listener
-	 *            the listener to register
-	 * @param request
-	 *            the event request
-	 */
-	public void addJSDIEventListener(IJavaScriptEventListener listener, EventRequest request) {
-		EventDispatcher dispatcher = ((JavaScriptDebugTarget) getDebugTarget()).getEventDispatcher();
-		if (dispatcher != null) {
-			dispatcher.addEventListener(listener, request);
-		}
-	}
-
-	/**
-	 * Removes the given listener from this target's event dispatcher's table of listeners for the specified event request. The listener will no longer be notified when the event occurs. Listeners are responsible for deleting the event request if desired.
-	 * 
-	 * @param listener
-	 *            the listener to remove
-	 * @param request
-	 *            the event request
-	 */
-	public void removeJSDIEventListener(IJavaScriptEventListener listener, EventRequest request) {
-		EventDispatcher dispatcher = ((JavaScriptDebugTarget) getDebugTarget()).getEventDispatcher();
-		if (dispatcher != null) {
-			dispatcher.removeEventListener(listener, request);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IDisconnect#canDisconnect()
-	 */
-	public boolean canDisconnect() {
-		return getJavaScriptDebugTarget().canDisconnect();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IDisconnect#disconnect()
-	 */
-	public void disconnect() throws DebugException {
-		getJavaScriptDebugTarget().disconnect();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IDisconnect#isDisconnected()
-	 */
-	public boolean isDisconnected() {
-		return getJavaScriptDebugTarget().isDisconnected();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptDebugTarget.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptDebugTarget.java
deleted file mode 100644
index f1ade31..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptDebugTarget.java
+++ /dev/null
@@ -1,995 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.model;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IMarkerDelta;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.IBreakpointManager;
-import org.eclipse.debug.core.IDebugEventSetListener;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchListener;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.core.model.IDebugTarget;
-import org.eclipse.debug.core.model.IMemoryBlock;
-import org.eclipse.debug.core.model.IProcess;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.DebuggerStatementEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.Event;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ScriptLoadEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ThreadEnterEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ThreadExitEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.VMDeathEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.VMDisconnectEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptDebugTarget;
-import org.eclipse.wst.jsdt.debug.core.model.IScript;
-import org.eclipse.wst.jsdt.debug.core.model.IScriptGroup;
-import org.eclipse.wst.jsdt.debug.core.model.JavaScriptDebugModel;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptPreferencesManager;
-import org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint;
-
-/**
- * JavaScript debug target
- * 
- * @since 1.0
- */
-public class JavaScriptDebugTarget extends JavaScriptDebugElement implements IJavaScriptDebugTarget, IDebugEventSetListener, ILaunchListener, IJavaScriptEventListener {
-
-	static final String DEFAULT_NAME = ModelMessages.JSDIDebugTarget_jsdi_debug_target;
-	
-	/**
-	 * The cached collection of scripts, sorted by name
-	 */
-	private ArrayList iScriptCache = null;
-	
-	private final IProcess process;
-	private final VirtualMachine vm;
-	private final ILaunch launch;
-	private final boolean supportsTerminate;
-	private final boolean supportsDisconnect;
-	private final String name;
-	private final EventDispatcher eventDispatcher;
-
-	private ArrayList threads = new ArrayList();
-	private ArrayList breakpoints = new ArrayList();
-	
-	private IScriptGroup scriptgroup = null;
-
-	private boolean disconnected = false;
-	private boolean terminating = false;
-	private boolean terminated = false;
-	private boolean suspended = false;
-
-	private ThreadEnterRequest threadEnterRequest;
-	private ThreadExitRequest threadExitRequest;
-	private ScriptLoadRequest scriptLoadrequest;
-
-	private DebuggerStatementRequest debuggerStatementRequest;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param process
-	 * @param launch
-	 * @param name
-	 * @param supportsTerminate
-	 * @param supportsDisconnect
-	 */
-	public JavaScriptDebugTarget(VirtualMachine vm, IProcess process, ILaunch launch,
-			String name, boolean supportsTerminate, boolean supportsDisconnect) {
-		super(null);
-		this.vm = vm;
-		this.process = process;
-		this.launch = launch;
-		this.supportsTerminate = supportsTerminate;
-		this.supportsDisconnect = supportsDisconnect;
-		if (name != null) {
-			this.name = name;
-		} else if (vm.name() != null) {
-			this.name = vm.name();
-		} else {
-			this.name = DEFAULT_NAME;
-		}
-		this.eventDispatcher = new EventDispatcher(this);
-		this.scriptgroup = new ScriptGroup(this);
-		// TODO: consider calling this outside of constructor
-		initialize();
-	}
-
-	/**
-	 * Initialize any threads and breakpoints existing at the time this target
-	 * has been created
-	 */
-	public synchronized void initialize() {
-		// perform initializations
-		initializeThreads();
-		initializeBreakpoints();
-
-		//register listening for script load request
-		scriptLoadrequest = getEventRequestManager().createScriptLoadRequest();
-		scriptLoadrequest.setEnabled(true);
-		addJSDIEventListener(this, scriptLoadrequest);
-		
-		getLaunch().addDebugTarget(this);
-
-		DebugPlugin plugin = DebugPlugin.getDefault();
-		plugin.addDebugEventListener(this);
-		plugin.getLaunchManager().addLaunchListener(this);
-		fireCreationEvent();
-		// begin handling/dispatching events after the creation event is handled
-		// by all listeners
-		plugin.asyncExec(new Runnable() {
-			public void run() {
-				Thread t = new Thread(eventDispatcher, "JavaScriptDebugModel.EventDispatcher"); //$NON-NLS-1$
-				t.setDaemon(true);
-				t.start();
-			}
-		});
-	}
-
-	/**
-	 * Shuts down the target
-	 */
-	public synchronized void shutdown() {
-		try {
-			if (supportsTerminate) {
-				terminate();
-			} else if (supportsDisconnect) {
-				disconnect();
-			}
-		} catch (DebugException e) {
-			JavaScriptDebugPlugin.log(e);
-		} finally {
-			cleanup();
-			fireTerminateEvent();
-		}
-	}
-
-	/**
-	 * Cleans up the state of the target
-	 */
-	void cleanup() {
-		DebugPlugin plugin = DebugPlugin.getDefault();
-		plugin.getLaunchManager().removeLaunchListener(this);
-		plugin.removeDebugEventListener(this);
-		getEventDispatcher().shutdown();
-		removeAllThreads();
-		removeAllBreakpoints();
-		removeJSDIEventListener(this, scriptLoadrequest);
-		this.scriptgroup = null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.DebugElement#getDebugTarget()
-	 */
-	public IDebugTarget getDebugTarget() {
-		return this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.DebugElement#getLaunch()
-	 */
-	public ILaunch getLaunch() {
-		return launch;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IDebugTarget#getName()
-	 */
-	public String getName() throws DebugException {
-		return name;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IDebugTarget#getProcess()
-	 */
-	public IProcess getProcess() {
-		return process;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ITerminate#canTerminate()
-	 */
-	public boolean canTerminate() {
-		return supportsTerminate && isAvailable();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ITerminate#isTerminated()
-	 */
-	public boolean isTerminated() {
-		return terminated;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IDisconnect#canDisconnect()
-	 */
-	public boolean canDisconnect() {
-		return supportsDisconnect && isAvailable();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IDisconnect#isDisconnected()
-	 */
-	public boolean isDisconnected() {
-		return disconnected;
-	}
-
-	/**
-	 * Returns the collection of underlying {@link ScriptReference}s
-	 * whose name matches the given name
-	 * @param name
-	 * @return the complete list of {@link ScriptReference}s matching the given name
-	 * or an empty collection, never <code>null</code>
-	 */
-	public synchronized List underlyingScripts(String name) {
-		List scripts = getVM().allScripts();
-		if(!scripts.isEmpty()) {
-			List byname = new ArrayList();
-			ScriptReference script = null;
-			for (Iterator iter = scripts.iterator(); iter.hasNext();) {
-				script = (ScriptReference) iter.next();
-				if (Script.resolveName(script.sourceURI()).equals(name)) {
-					byname.add(script);
-				}
-			}
-			return byname;
-		}
-		return Collections.EMPTY_LIST;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptDebugTarget#allScriptsByName(java.lang.String)
-	 */
-	public synchronized List allScriptsByName(String name) {
-		List scripts = allScripts();
-		if(scripts.size() > 0) {
-			List byname = new ArrayList();
-			IScript script = null;
-			for (Iterator iter = scripts.iterator(); iter.hasNext();) {
-				script = (IScript) iter.next();
-				if (Script.resolveName(script.sourceURI()).equals(name)) {
-					byname.add(script);
-				}
-			}
-			return byname;
-		}
-		return Collections.EMPTY_LIST;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptDebugTarget#allScripts()
-	 */
-	public synchronized List allScripts() {
-		if(iScriptCache == null) {
-			ArrayList all = (ArrayList) getVM().allScripts();
-			if(all.size() > 0) { 
-				iScriptCache = new ArrayList(all.size());
-				for (int i = 0; i < all.size(); i++) {
-					iScriptCache.add(new Script(this, (ScriptReference) all.get(i)));
-				}
-				Collections.sort(iScriptCache);
-			}
-		}
-		if(iScriptCache == null) {
-			return Collections.EMPTY_LIST;
-		}
-		return iScriptCache;
-	}
-	
-	/**
-	 * Collects all of the current threads from the {@link VirtualMachine} and
-	 * adds them to the cached list
-	 */
-	private synchronized void initializeThreads() {
-		threadEnterRequest = vm.eventRequestManager().createThreadEnterRequest();
-		threadEnterRequest.setEnabled(true);
-		eventDispatcher.addEventListener(this, threadEnterRequest);
-
-		threadExitRequest = vm.eventRequestManager().createThreadExitRequest();
-		threadExitRequest.setEnabled(true);
-		eventDispatcher.addEventListener(this, threadExitRequest);
-
-		List allThreads = vm.allThreads();
-		ThreadReference threadReference = null;
-		for (Iterator iterator = allThreads.iterator(); iterator.hasNext();) {
-			threadReference = (ThreadReference) iterator.next();
-			createThread(threadReference, false);
-		}
-	}
-
-	/**
-	 * Removes all threads from the target
-	 */
-	private synchronized void removeAllThreads() {
-		Iterator iter = getThreadIterator();
-		while (iter.hasNext()) {
-			JavaScriptThread thread = (JavaScriptThread) iter.next();
-			thread.terminated();
-		}
-		threads.clear();
-		removeJSDIEventListener(this, threadEnterRequest);
-		removeJSDIEventListener(this, threadExitRequest);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IDebugTarget#getThreads()
-	 */
-	public synchronized IThread[] getThreads() throws DebugException {
-		return (IThread[]) threads.toArray(new IThread[this.threads.size()]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IDebugTarget#hasThreads()
-	 */
-	public synchronized boolean hasThreads() throws DebugException {
-		return !threads.isEmpty();
-	}
-
-	/**
-	 * Installs all JavaScript breakpoints that currently exist in the
-	 * breakpoint manager
-	 */
-	synchronized void initializeBreakpoints() {
-		debuggerStatementRequest = getEventRequestManager().createDebuggerStatementRequest();
-		debuggerStatementRequest.setEnabled(true);
-		addJSDIEventListener(this, debuggerStatementRequest);
-
-		IBreakpointManager manager = DebugPlugin.getDefault().getBreakpointManager();
-		manager.addBreakpointListener(this);
-		IBreakpoint[] managerBreakpoints = manager.getBreakpoints(JavaScriptDebugModel.MODEL_ID);
-		for (int i = 0; i < managerBreakpoints.length; i++) {
-			breakpointAdded(managerBreakpoints[i]);
-		}
-		//add the managed breakpoints
-		IJavaScriptBreakpoint[] breakpoints = JavaScriptPreferencesManager.getAllManagedBreakpoints();
-		for (int i = 0; i < breakpoints.length; i++) {
-			breakpointAdded(breakpoints[i]);
-		}
-	}
-
-	/**
-	 * Removes all breakpoints from this target
-	 */
-	private synchronized void removeAllBreakpoints() {
-		Iterator iter = ((ArrayList)this.breakpoints.clone()).iterator();
-		JavaScriptBreakpoint breakpoint = null;
-		while (iter.hasNext()) {
-			breakpoint = (JavaScriptBreakpoint) iter.next();
-			breakpoint.removeFromTarget(this);
-		}
-		this.breakpoints.clear();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.debug.core.model.IDebugTarget#supportsBreakpoint(org.eclipse.debug.core.model.IBreakpoint)
-	 */
-	public boolean supportsBreakpoint(IBreakpoint breakpoint) {
-		return JavaScriptDebugModel.MODEL_ID.equals(breakpoint.getModelIdentifier());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#canResume()
-	 */
-	public boolean canResume() {
-		if ((isSuspended() || canResumeThreads()) && isAvailable()) {
-			if (threads.size() == 0) {
-				return true;
-			}
-			Iterator iter = getThreadIterator();
-			while (iter.hasNext()) {
-				IThread thread = (IThread) iter.next();
-				if (thread.canResume()) {
-					// if at least 1 thread can resume the target can be resumed
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @return true if any one of the threads in the target can be resumed,
-	 *         false otherwise
-	 */
-	private boolean canResumeThreads() {
-		Iterator iter = getThreadIterator();
-		IThread thread = null;
-		while (iter.hasNext()) {
-			thread = (IThread) iter.next();
-			if (thread.canResume()) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#canSuspend()
-	 */
-	public boolean canSuspend() {
-		if (!isSuspended() && isAvailable()) {
-			Iterator iter = getThreadIterator();
-			while (iter.hasNext()) {
-				IThread thread = (IThread) iter.next();
-				if (thread.isSuspended()) {
-					// do not allow the target to suspend if there is already a
-					// suspended thread
-					return false;
-				}
-			}
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Returns an iterator over the collection of threads. The returned iterator
-	 * is made on a copy of the thread list so that it is thread safe. This
-	 * method should always be used instead of getThreadList().iterator()
-	 * 
-	 * @return an iterator over the collection of threads
-	 */
-	private Iterator getThreadIterator() {
-		List threadList;
-		synchronized (this.threads) {
-			threadList = (List) this.threads.clone();
-		}
-		return threadList.iterator();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#isSuspended()
-	 */
-	public boolean isSuspended() {
-		return this.suspended;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#resume()
-	 */
-	public void resume() throws DebugException {
-		if (!isAvailable()) {
-			// no-op if the target is not ready
-			return;
-		}
-		// if we are resuming the target resume all of the threads before
-		// resuming the target
-		// this gives the threads a chance to save state, etc before the VM is
-		// resumed
-		Iterator iter = getThreadIterator();
-		JavaScriptThread thread = null;
-		while (iter.hasNext()) {
-			thread = (JavaScriptThread) iter.next();
-			if (thread.isSuspended()) {
-				thread.targetResume();
-			}
-		}
-		this.suspended = false;
-		resumeVM(false);
-		fireResumeEvent(DebugEvent.CLIENT_REQUEST);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#suspend()
-	 */
-	public void suspend() throws DebugException {
-		if (isSuspended() || !isAvailable()) {
-			// no-op if the target is suspended or not ready
-			return;
-		}
-		try {
-			suspended = true;
-			if (this.vm != null) {
-				this.vm.suspend();
-			}
-			// set all owned, unsuspended threads as suspended if we suspend the
-			// target
-			Iterator iter = getThreadIterator();
-			while (iter.hasNext()) {
-				JavaScriptThread thread = (JavaScriptThread) iter.next();
-				if (!thread.isSuspended()) {
-					thread.markSuspended();
-				}
-			}
-		} finally {
-			fireSuspendEvent(DebugEvent.CLIENT_REQUEST);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptDebugTarget#getScriptGroup()
-	 */
-	public IScriptGroup getScriptGroup() {
-		return scriptgroup;
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IDisconnect#disconnect()
-	 */
-	public void disconnect() throws DebugException {
-		if (!isAvailable()) {
-			// already done
-			return;
-		}
-		if (!this.supportsDisconnect) {
-			notSupported(NLS.bind(
-					ModelMessages.JSDIDebugTarget_not_support_disconnect,
-					getName()), null);
-		}
-		try {
-			// first resume the VM, do not leave it in a suspended state
-			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=304574
-			resumeVM(true);
-		} 
-		catch(RuntimeException rte) {}
-		finally {
-			cleanup();
-			disposeVM(true);
-			this.disconnected = true;
-			fireTerminateEvent();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ITerminate#terminate()
-	 */
-	public void terminate() throws DebugException {
-		if (!isAvailable()) {
-			// already done
-			return;
-		}
-		if (!this.supportsTerminate) {
-			notSupported(NLS.bind(
-					ModelMessages.JSDIDebugTarget_not_support_terminate,
-					getName()), null);
-		}
-		this.terminating = true;
-		try {
-			// first resume the VM, do not leave it in a suspended state
-			// https://bugs.eclipse.org/bugs/show_bug.cgi?id=304574
-			resumeVM(true);
-			// next terminate the underlying process
-			if (this.process != null) {
-				this.process.terminate();
-			}
-			this.terminated = true;
-		} finally {
-			disposeVM(true);
-			cleanup();
-			this.terminating = false;
-			fireTerminateEvent();
-		}
-	}
-
-	/**
-	 * disposes the underlying {@link VirtualMachine}
-	 * 
-	 * @param shutdown
-	 * @throws DebugException
-	 */
-	void disposeVM(boolean shutdown) throws DebugException {
-		if(this.vm != null) {
-			try {
-				this.vm.dispose();
-			}
-			catch(RuntimeException rte) {
-				if(!shutdown) {
-					disconnect();
-				}
-			}
-		}
-	}
-	
-	/**
-	 * resumes the underlying {@link VirtualMachine}
-	 * 
-	 * @param shutdown if the method is being called during a terminating call
-	 * @throws DebugException 
-	 */
-	void resumeVM(boolean shutdown) throws DebugException {
-		if(this.vm != null) {
-			try {
-				this.vm.resume();
-			}
-			catch(RuntimeException rte) {
-				if(!shutdown) {
-					disconnect();
-				}
-			}
-		}
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.debug.core.model.IMemoryBlockRetrieval#getMemoryBlock(long,
-	 * long)
-	 */
-	public IMemoryBlock getMemoryBlock(long startAddress, long length) throws DebugException {
-		notSupported(ModelMessages.JSDIDebugTarget_unsupported_operation, null);
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.debug.core.model.IMemoryBlockRetrieval#supportsStorageRetrieval
-	 * ()
-	 */
-	public boolean supportsStorageRetrieval() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugElement#getVM()
-	 */
-	public VirtualMachine getVM() {
-		return this.vm;
-	}
-
-	/**
-	 * @return if the target is available to be disconnected or terminated
-	 */
-	public boolean isAvailable() {
-		return !(this.terminated || this.terminating || this.disconnected);
-	}
-
-	/**
-	 * @return the event dispatcher
-	 */
-	EventDispatcher getEventDispatcher() {
-		return this.eventDispatcher;
-	}
-
-	/**
-	 * Delegate method to create a new {@link JavaScriptThread} and add it to the list
-	 * of threads
-	 * 
-	 * @param thread the underlying {@link ThreadReference}
-	 * @return a new {@link JavaScriptThread}
-	 */
-	private synchronized JavaScriptThread createThread(ThreadReference thread, boolean fireEvent) {
-		if (isDisconnected()) {
-			return null;
-		}
-		JavaScriptThread jsdiThread = findThread(thread);
-		if (jsdiThread != null) {
-			return jsdiThread;
-		}
-		jsdiThread = new JavaScriptThread(this, thread);
-		this.threads.add(jsdiThread);
-		if (fireEvent) {
-			jsdiThread.fireCreationEvent();
-		}
-		return jsdiThread;
-	}
-
-	/**
-	 * Terminates the given {@link ThreadReference} if the target is not
-	 * disconnected
-	 * 
-	 * @param thread
-	 */
-	private synchronized void terminateThread(ThreadReference thread) {
-		if (isDisconnected()) {
-			return;
-		}
-		JavaScriptThread jsdiThread = findThread(thread);
-		if (jsdiThread == null) {
-			return;
-		}
-		threads.remove(jsdiThread);
-		jsdiThread.markTerminated();
-		jsdiThread.fireTerminateEvent();
-	}
-
-	/**
-	 * Finds the {@link JavaScriptThread} mapped to the given {@link ThreadReference}
-	 * 
-	 * @param thread
-	 * @return the mapped {@link JavaScriptThread} or <code>null</code>
-	 */
-	public synchronized JavaScriptThread findThread(ThreadReference thread) {
-		for (Iterator iterator = threads.iterator(); iterator.hasNext();) {
-			JavaScriptThread jsdiThread = (JavaScriptThread) iterator.next();
-			if (jsdiThread.matches(thread)) {
-				return jsdiThread;
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.debug.core.model.DebugElement#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if (adapter == JavaScriptDebugTarget.class) {
-			return this;
-		}
-		return super.getAdapter(adapter);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.debug.core.IBreakpointListener#breakpointAdded(org.eclipse.debug.core.model.IBreakpoint)
-	 */
-	public synchronized void breakpointAdded(IBreakpoint breakpoint) {
-		if (!isAvailable() || !supportsBreakpoint(breakpoint)) {
-			// no-op either not ready or we don't care about the given
-			// breakpoint
-			return;
-		}
-		try {
-			((JavaScriptBreakpoint) breakpoint).addToTarget(this);
-			synchronized (this.breakpoints) {
-				this.breakpoints.add(breakpoint);
-			}
-		} catch (CoreException ce) {
-			JavaScriptDebugPlugin.log(ce);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.debug.core.IBreakpointListener#breakpointChanged(org.eclipse.debug.core.model.IBreakpoint, org.eclipse.core.resources.IMarkerDelta)
-	 */
-	public synchronized void breakpointChanged(IBreakpoint breakpoint,IMarkerDelta delta) {
-		breakpointRemoved(breakpoint, delta);
-		breakpointAdded(breakpoint);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.debug.core.IBreakpointListener#breakpointRemoved(org.eclipse.debug.core.model.IBreakpoint, org.eclipse.core.resources.IMarkerDelta)
-	 */
-	public synchronized void breakpointRemoved(IBreakpoint breakpoint, IMarkerDelta delta) {
-		if (!isAvailable() || !supportsBreakpoint(breakpoint)) {
-			// no-op either not ready or we don't care about the breakpoint
-			return;
-		}
-		((JavaScriptBreakpoint) breakpoint).removeFromTarget(this);
-		synchronized (this.breakpoints) {
-			this.breakpoints.remove(breakpoint);
-		}
-		// remove cached breakpoints from threads
-		if (this.threads != null) {
-			for (Iterator iter = this.threads.iterator(); iter.hasNext();) {
-				((JavaScriptThread) iter.next()).removeBreakpoint((JavaScriptBreakpoint) breakpoint);
-			}
-		}
-	}
-
-	/**
-	 * Returns the live list of breakpoints currently set in this target
-	 * 
-	 * @return the live list of breakpoints
-	 */
-	public List getBreakpoints() {
-		return this.breakpoints;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.debug.core.IDebugEventSetListener#handleDebugEvents(org.eclipse
-	 * .debug.core.DebugEvent[])
-	 */
-	public void handleDebugEvents(DebugEvent[] events) {
-		if (events.length == 1) {
-			DebugEvent event = events[0];
-			switch(event.getKind()) {
-				case DebugEvent.TERMINATE: {
-					if(event.getSource().equals(getProcess())) {
-						shutdown();
-					}
-					break;
-				}
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchListener#launchRemoved(org.eclipse.debug.core.ILaunch)
-	 */
-	public void launchRemoved(ILaunch launch) {
-		if (!isAvailable()) {
-			return;
-		}
-		if (launch.equals(getLaunch())) {
-			// This target has been unregistered, but it hasn't successfully
-			// terminated.
-			// Update internal state to reflect that it is disconnected
-			disconnected();
-		}
-	}
-
-	/**
-	 * delegate to clean up if the target has been disconnected and a framework
-	 * method has been called
-	 */
-	protected void disconnected() {
-		if (!isDisconnected()) {
-			this.disconnected = true;
-			shutdown();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchListener#launchAdded(org.eclipse.debug.core.ILaunch)
-	 */
-	public void launchAdded(ILaunch launch) {
-		// ignore
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.ILaunchListener#launchChanged(org.eclipse.debug.core.ILaunch)
-	 */
-	public void launchChanged(ILaunch launch) {
-		// ignore
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJSDIEventListener#eventSetComplete(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event, org.eclipse.wst.jsdt.debug.core.model.JSDIDebugTarget, boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-	 */
-	public void eventSetComplete(Event event, JavaScriptDebugTarget target, boolean suspend, EventSet eventSet) {
-		// thread enter
-		// thread exit
-		// script?
-
-		if (event instanceof DebuggerStatementEvent) {
-			DebuggerStatementEvent debuggerStatementEvent = (DebuggerStatementEvent) event;
-			ThreadReference threadReference = debuggerStatementEvent.thread();
-			JavaScriptThread thread = findThread(threadReference);
-			thread.fireSuspendEvent(DebugEvent.BREAKPOINT);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJSDIEventListener#handleEvent(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event, org.eclipse.wst.jsdt.debug.core.model.JSDIDebugTarget, boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-	 */
-	public synchronized boolean handleEvent(Event event, JavaScriptDebugTarget target, boolean suspendVote, EventSet eventSet) {
-		if (event instanceof ThreadEnterEvent) {
-			ThreadEnterEvent threadEnterEvent = (ThreadEnterEvent) event;
-			createThread(threadEnterEvent.thread(), true);
-			return false;
-		}
-		if (event instanceof ThreadExitEvent) {
-			ThreadExitEvent threadExitEvent = (ThreadExitEvent) event;
-			terminateThread(threadExitEvent.thread());
-			return false;
-		}
-		if (event instanceof ScriptLoadEvent) {
-			if(iScriptCache != null) {
-				iScriptCache.clear();
-				iScriptCache = null;
-			}
-			fireEvent(new DebugEvent(this.scriptgroup, DebugEvent.MODEL_SPECIFIC, EventDispatcher.EVENT_SCRIPT_LOADED));
-			return true;
-		}
-
-		if (event instanceof DebuggerStatementEvent) {
-			DebuggerStatementEvent debuggerStatementEvent = (DebuggerStatementEvent) event;
-			ThreadReference threadReference = debuggerStatementEvent.thread();
-			JavaScriptThread thread = findThread(threadReference);
-			if(!thread.isSuspended()) {
-				thread.markSuspended();
-			}
-			return false;
-		}
-
-		// handle VM events i.e. death / disconnect
-		if (event instanceof VMDeathEvent) {
-			try {
-				if (!this.terminated) {
-					eventCleanup();
-				}
-			} finally {
-				shutdown();
-			}
-			return false;
-		}
-		if (event instanceof VMDisconnectEvent) {
-			try {
-				if (!this.disconnected) {
-					eventCleanup();
-				}
-			} finally {
-				shutdown();
-			}
-			return false;
-		}
-		throw new IllegalArgumentException(NLS.bind(
-				ModelMessages.JSDIDebugTarget_recieved_unknown_event, event
-						.toString()));
-	}
-
-	/**
-	 * Cleans up the target
-	 */
-	void eventCleanup() {
-		try {
-			cleanup();
-		} finally {
-			this.disconnected = true;
-			this.terminated = true;
-			fireTerminateEvent();
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptPrimitiveValue.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptPrimitiveValue.java
deleted file mode 100644
index f77e113..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptPrimitiveValue.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.model;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptPrimitiveValue;
-
-/**
- * {@link IJavaScriptPrimitiveValue} implementation
- * @since 1.0
- */
-public class JavaScriptPrimitiveValue extends JavaScriptValue implements IJavaScriptPrimitiveValue {
-
-	/**
-	 * Constructor
-	 * @param target
-	 * @param value
-	 */
-	public JavaScriptPrimitiveValue(JavaScriptDebugTarget target, Value value) {
-		super(target, value);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IValue#isAllocated()
-	 */
-	public boolean isAllocated() throws DebugException {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.IValue#getVariables()
-	 */
-	public IVariable[] getVariables() throws DebugException {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptPrimitiveValue#getNumberValue()
-	 */
-	public int intValue() {
-		Value value = getUnderlyingValue();
-		if(value instanceof PrimitiveValue) {
-			return ((PrimitiveValue)value).intValue();
-		}
-		return 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptPrimitiveValue#doubleValue()
-	 */
-	public double doubleValue() {
-		Value value = getUnderlyingValue();
-		if(value instanceof PrimitiveValue) {
-			return ((PrimitiveValue)value).doubleValue();
-		}
-		return intValue();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptPrimitiveValue#getBooleanValue()
-	 */
-	public boolean booleanValue() {
-		Value value = getUnderlyingValue();
-		if(value instanceof PrimitiveValue) {
-			return ((PrimitiveValue)value).booleanValue();
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptPrimitiveValue#getStringValue()
-	 */
-	public String stringValue() {
-		Value value = getUnderlyingValue();
-		if(value instanceof PrimitiveValue) {
-			return ((PrimitiveValue)value).valueString();
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return stringValue();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptProperty.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptProperty.java
deleted file mode 100644
index 8eb6211..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptProperty.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.model;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Property;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptValue;
-
-/**
- * Default implementation of an {@link IVariable}
- * 
- * @see JavaScriptValue
- * @see JavaScriptStackFrame
- * @since 1.0
- */
-public class JavaScriptProperty extends JavaScriptDebugElement implements IVariable {
-
-	private Property property;
-	private IJavaScriptValue value = null;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param target
-	 */
-	public JavaScriptProperty(JavaScriptValue jsdiValue, Property property) {
-		super(jsdiValue.getJavaScriptDebugTarget());
-		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 getValue().getReferenceTypeName();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IVariable#getValue()
-	 */
-	public IValue getValue() throws DebugException {
-		if (value == null) {
-			value = JavaScriptValue.createValue(getJavaScriptDebugTarget(), this.property.value());
-		}
-		return value;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IVariable#hasValueChanged()
-	 */
-	public boolean hasValueChanged() throws DebugException {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if (adapter == JavaScriptProperty.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-NLS-1$
-	}
-
-	/*
-	 * (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-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IValueModification#supportsValueModification ()
-	 */
-	public boolean supportsValueModification() {
-		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.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptStackFrame.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptStackFrame.java
deleted file mode 100644
index 2da39c8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptStackFrame.java
+++ /dev/null
@@ -1,375 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.model;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.URIUtil;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IRegisterGroup;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Variable;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptValue;
-
-/**
- * A JavaScript stack frame
- * 
- * @since 1.0
- */
-public final class JavaScriptStackFrame extends JavaScriptDebugElement implements IJavaScriptStackFrame {
-
-	/**
-	 * Owning thread.
-	 */
-	private JavaScriptThread thread;
-
-	/**
-	 * The underlying {@link StackFrameReference}
-	 */
-	private StackFrame stackFrame = null;
-
-	private String name = null;
-	private ArrayList variables;
-
-	/**
-	 * Constructs a Rhino stack frame in the given thread.
-	 * 
-	 * @param thread
-	 */
-	public JavaScriptStackFrame(JavaScriptThread thread, StackFrame stackFrame) {
-		super(thread.getJavaScriptDebugTarget());
-		this.thread = thread;
-		this.stackFrame = stackFrame;
-	}
-
-	/**
-	 * Returns the underlying JSDI {@link StackFrame}
-	 * 
-	 * @return the underlying JSDI {@link StackFrame}
-	 */
-	StackFrame getUnderlyingStackFrame() {
-		return this.stackFrame;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStackFrame#getCharEnd()
-	 */
-	public int getCharEnd() throws DebugException {
-		return -1;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStackFrame#getCharStart()
-	 */
-	public int getCharStart() throws DebugException {
-		return -1;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStackFrame#getLineNumber()
-	 */
-	public int getLineNumber() throws DebugException {
-		return (stackFrame.location() != null ? stackFrame.location().lineNumber() : -1);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStackFrame#getName()
-	 */
-	public String getName() throws DebugException {
-		if (this.name == null) {
-			this.name = NLS.bind(ModelMessages.JSDIStackFrame_stackframe_name, new String[] {
-									this.stackFrame.location().scriptReference().sourceURI().toString(), 
-									Integer.toString(stackFrame.location().lineNumber()) 
-									});
-		}
-		return this.name;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStackFrame#getRegisterGroups()
-	 */
-	public IRegisterGroup[] getRegisterGroups() throws DebugException {
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStackFrame#getThread()
-	 */
-	public IThread getThread() {
-		return this.thread;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStackFrame#getVariables()
-	 */
-	public synchronized IVariable[] getVariables() throws DebugException {
-		if (this.variables == null) {
-			List underlyingVariables = this.stackFrame.variables();
-			this.variables = new ArrayList(underlyingVariables.size() + 1);
-
-
-	
-			for (Iterator iterator = underlyingVariables.iterator(); iterator.hasNext();) {
-				Variable variable = (Variable) iterator.next();
-				JavaScriptVariable jsdiVariable = new JavaScriptVariable(this, variable);
-				this.variables.add(jsdiVariable);
-			}
-			
-			Collections.sort(variables, new Comparator() {		
-				public int compare(Object arg0, Object arg1) {
-					
-					IVariable var0 = (IVariable) arg0;
-					IVariable var1 = (IVariable) arg1;
-					try {
-						return var0.getName().compareToIgnoreCase(var1.getName());
-					} catch (DebugException e) {
-						return 0;
-					}
-				}
-			});
-			
-			// add the "this" object at the front
-			variables.add(0, new JavaScriptVariable(this, stackFrame.thisObject()));			
-		}
-		return (IVariable[]) this.variables.toArray(new IVariable[this.variables.size()]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStackFrame#hasRegisterGroups()
-	 */
-	public boolean hasRegisterGroups() throws DebugException {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStackFrame#hasVariables()
-	 */
-	public boolean hasVariables() throws DebugException {
-		return this.stackFrame.variables().size() > 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#canStepInto()
-	 */
-	public boolean canStepInto() {
-		return this.thread.canStepInto();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#canStepOver()
-	 */
-	public boolean canStepOver() {
-		return this.thread.canStepOver();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#canStepReturn()
-	 */
-	public boolean canStepReturn() {
-		return this.thread.canStepReturn();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#isStepping()
-	 */
-	public boolean isStepping() {
-		return this.thread.isStepping();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#stepInto()
-	 */
-	public void stepInto() throws DebugException {
-		this.thread.stepInto();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#stepOver()
-	 */
-	public void stepOver() throws DebugException {
-		this.thread.stepOver();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#stepReturn()
-	 */
-	public void stepReturn() throws DebugException {
-		this.thread.stepReturn();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#canResume()
-	 */
-	public boolean canResume() {
-		return this.thread.canResume();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#canSuspend()
-	 */
-	public boolean canSuspend() {
-		return this.thread.canSuspend();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#isSuspended()
-	 */
-	public boolean isSuspended() {
-		return this.thread.isSuspended();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#resume()
-	 */
-	public void resume() throws DebugException {
-		this.thread.resume();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#suspend()
-	 */
-	public void suspend() throws DebugException {
-		this.thread.suspend();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ITerminate#canTerminate()
-	 */
-	public boolean canTerminate() {
-		return this.thread.canTerminate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ITerminate#isTerminated()
-	 */
-	public boolean isTerminated() {
-		return this.thread.isTerminated();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ITerminate#terminate()
-	 */
-	public void terminate() throws DebugException {
-		if (this.thread.canTerminate()) {
-			this.thread.terminate();
-		} else {
-			getJavaScriptDebugTarget().terminate();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame#evaluate(java.lang.String)
-	 */
-	public IJavaScriptValue evaluate(String expression) {
-		return this.thread.evaluate(expression);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame#getSourceName()
-	 */
-	public String getSourceName() {
-		Location loc = getUnderlyingStackFrame().location();
-		if(loc != null) {
-			ScriptReference script = loc.scriptReference();
-			if(script != null) {
-				return URIUtil.lastSegment(script.sourceURI());
-			}
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame#getSourcePath()
-	 */
-	public String getSourcePath() {
-		Location loc = getUnderlyingStackFrame().location();
-		if(loc != null) {
-			ScriptReference script = loc.scriptReference();
-			if(script != null) {
-				return script.sourceURI().toString();
-			}
-		}
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame#getSource()
-	 */
-	public String getSource() {
-		Location loc = getUnderlyingStackFrame().location();
-		if(loc != null) {
-			ScriptReference script = loc.scriptReference();
-			if(script != null) {
-				return script.source();
-			}
-		}
-		return null;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptThread.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptThread.java
deleted file mode 100644
index 9a6de65..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptThread.java
+++ /dev/null
@@ -1,922 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.model;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.debug.core.DebugEvent;
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IBreakpoint;
-import org.eclipse.debug.core.model.IStackFrame;
-import org.eclipse.debug.core.model.IThread;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLoadBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.Event;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.StepEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.SuspendEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptStackFrame;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptValue;
-import org.eclipse.wst.jsdt.debug.internal.core.Constants;
-import org.eclipse.wst.jsdt.debug.internal.core.JavaScriptDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptExceptionBreakpoint;
-import org.eclipse.wst.jsdt.debug.internal.core.breakpoints.JavaScriptLoadBreakpoint;
-
-/**
- * A JavaScript thread.
- * 
- * JavaScript threads act as their own event listener for suspend and step
- * events and are called out to from JavaScript breakpoints to handle suspending
- * at a breakpoint.
- * 
- * @since 1.0
- */
-public class JavaScriptThread extends JavaScriptDebugElement implements IJavaScriptThread, IJavaScriptEventListener {
-
-	/**
-	 * handler for stepping
-	 */
-	class StepHandler implements IJavaScriptEventListener {
-
-		private StepRequest request = null;
-
-		/**
-		 * Sends step request
-		 */
-		public void step(int kind, int detail) {
-			pendingstep = this;
-			request = createStepRequest(this, kind);
-			resumeUnderlyingThread();
-			markResumed();
-			fireResumeEvent(detail);
-		}
-
-		/**
-		 * Creates a new step request
-		 * 
-		 * @param listener
-		 *            the element that will respond to the event
-		 * @param step
-		 *            step command to send
-		 * @return the newly created {@link StepRequest}
-		 */
-		private StepRequest createStepRequest(IJavaScriptEventListener listener, int step) {
-			EventRequestManager requestManager = getVM().eventRequestManager();
-			StepRequest stepRequest = requestManager.createStepRequest(thread, step);
-			stepRequest.setEnabled(true);
-			getJavaScriptDebugTarget().addJSDIEventListener(listener, stepRequest);
-			return stepRequest;
-		}
-
-		/**
-		 * Aborts the pending step
-		 */
-		void abort() {
-			try {
-				if (request != null) {
-					deleteRequest(this, request);
-					request = null;
-				}
-			} finally {
-				pendingstep = null;
-			}
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see
-		 * org.eclipse.wst.jsdt.debug.internal.core.model.IJavaScriptEventListener
-		 * #handleEvent(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event,
-		 * org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget,
-		 * boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-		 */
-		public boolean handleEvent(Event event, JavaScriptDebugTarget target, boolean suspendVote, EventSet eventSet) {
-			StepEvent stepEvent = (StepEvent) event;
-			return stepEvent.thread() != thread;
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see
-		 * org.eclipse.wst.jsdt.debug.internal.core.model.IJavaScriptEventListener
-		 * #eventSetComplete(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event,
-		 * org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget,
-		 * boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-		 */
-		public void eventSetComplete(Event event, JavaScriptDebugTarget target, boolean suspend, EventSet eventSet) {
-			StepEvent stepEvent = (StepEvent) event;
-			stepEnd(this, stepEvent);
-		}
-
-		/**
-		 * Handles a {@link StepEvent}
-		 * 
-		 * @param listener
-		 *            the listener to remove
-		 * @param event
-		 * @return <code>true</code> if the event was not handled (we should
-		 *         resume), <code>false</code> if the event was handled (we
-		 *         should suspend)
-		 */
-		private void stepEnd(IJavaScriptEventListener listener, StepEvent event) {
-			ThreadReference threadReference = event.thread();
-			if (threadReference == thread) {
-				synchronized (JavaScriptThread.this) {
-					pendingstep = null;
-					if (request == event.request()) {
-						deleteRequest(listener, event.request());
-						request = null;
-					}
-					markSuspended();
-					fireSuspendEvent(DebugEvent.STEP_END);
-				}
-			}
-		}
-
-		/**
-		 * Delete the given event request
-		 * 
-		 * @param listener
-		 *            the element that will be removed as a listener
-		 * @param request
-		 */
-		private void deleteRequest(IJavaScriptEventListener listener, EventRequest request) {
-			getJavaScriptDebugTarget().removeJSDIEventListener(listener, request);
-			EventRequestManager requestManager = getVM().eventRequestManager();
-			requestManager.deleteEventRequest(request);
-		}
-	}
-
-	/**
-	 * Constant for no stack frames
-	 * 
-	 * @see #getStackFrames()
-	 */
-	static final IStackFrame[] NO_STACK_FRAMES = new IStackFrame[0];
-
-	/**
-	 * Constant for no breakpoints
-	 * 
-	 * @see #getBreakpoints()
-	 */
-	static final IBreakpoint[] NO_BREAKPOINTS = new IBreakpoint[0];
-
-	// states
-	private static final int UNKNOWN = 0;
-	private static final int SUSPENDED = 1;
-	private static final int RUNNING = 2;
-	private static final int TERMINATED = 4;
-
-	private static final boolean DEBUG = false;
-
-	/**
-	 * Stack frames, or <code>null</code> if none.
-	 */
-	private List frames = null;
-
-	/**
-	 * Breakpoints or empty if none.
-	 */
-	private ArrayList breakpoints = new ArrayList(4);
-
-	/**
-	 * Current state
-	 */
-	private int state = UNKNOWN;
-
-	/**
-	 * The underlying {@link ThreadReference} for this thread
-	 */
-	private final ThreadReference thread;
-
-	/**
-	 * Flag to track if the thread is in the process of suspending
-	 */
-	private volatile boolean suspending = false;
-
-	/**
-	 * {@link StepHandler} handle to know if a step has been initiated
-	 */
-	private StepHandler pendingstep = null;
-	
-	private SuspendRequest suspendreq = null;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param target
-	 *            the target the thread belongs to
-	 * @param thread
-	 *            the underlying {@link ThreadReference}
-	 */
-	public JavaScriptThread(JavaScriptDebugTarget target, ThreadReference thread) {
-		super(target);
-		Assert.isNotNull(thread);
-		this.thread = thread;
-		this.state = thread.isSuspended() ? SUSPENDED : RUNNING;
-		suspendreq = target.getEventRequestManager().createSuspendRequest(this.thread);
-		suspendreq.setEnabled(true);
-		addJSDIEventListener(this, suspendreq);
-	}
-
-	/**
-	 * @return the status text for the thread
-	 */
-	private synchronized String statusText() {
-		switch (state) {
-			case SUSPENDED: {
-				if (this.breakpoints.size() > 0) {
-					try {
-						JavaScriptBreakpoint breakpoint = (JavaScriptBreakpoint) breakpoints.get(0);
-						if (breakpoint instanceof JavaScriptLoadBreakpoint) {
-							String name = breakpoint.getScriptPath();
-							if (Constants.EMPTY_STRING.equals(name)) {
-								name = getSourceName();
-							}
-							return NLS.bind(ModelMessages.JSDIThread_suspended_loading_script, name);
-						}
-						if(breakpoint instanceof JavaScriptExceptionBreakpoint) {
-							return NLS.bind(ModelMessages.JavaScriptThread_suspended_on_exception, breakpoint.getMarker().getAttribute(JavaScriptExceptionBreakpoint.MESSAGE));
-						}
-						// TODO support function breakpoints here
-						if (breakpoint instanceof IJavaScriptLineBreakpoint) {
-							IJavaScriptLineBreakpoint bp = (IJavaScriptLineBreakpoint) breakpoint;
-							return NLS.bind(ModelMessages.breakpoint_at_line_location, new String[] { Integer.toString(bp.getLineNumber()), getSourceName() });
-						}
-						// TODO also need to report stopped at debugger; statement
-					} catch (CoreException ce) {
-						JavaScriptDebugPlugin.log(ce);
-					}
-				}
-				return ModelMessages.thread_suspended;
-			}
-			case RUNNING: {
-				if (pendingstep != null) {
-					return ModelMessages.thread_stepping;
-				}
-				return ModelMessages.thread_running;
-			}
-			case TERMINATED: {
-				return ModelMessages.thread_terminated;
-			}
-			case ThreadReference.THREAD_STATUS_ZOMBIE: {
-				return ModelMessages.thread_zombie;
-			}
-			default: {
-				return ModelMessages.thread_state_unknown;
-			}
-		}
-	}
-
-	/**
-	 * Returns the name of the source from the top stackframe or a default name
-	 * <code>&lt;evaluated_source&gt;</code>
-	 * 
-	 * @return the name for the source
-	 * @throws DebugException
-	 */
-	String getSourceName() throws DebugException {
-		IJavaScriptStackFrame frame = (IJavaScriptStackFrame) getTopStackFrame();
-		if (frame != null) {
-			return frame.getSourceName();
-		}
-		// all else failed say "evaluated_script"
-		return ModelMessages.JavaScriptThread_evaluated_script;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IThread#getBreakpoints()
-	 */
-	public synchronized IBreakpoint[] getBreakpoints() {
-		if (this.breakpoints.isEmpty()) {
-			return NO_BREAKPOINTS;
-		}
-		return (IBreakpoint[]) this.breakpoints.toArray(new IBreakpoint[this.breakpoints.size()]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IThread#getName()
-	 */
-	public String getName() throws DebugException {
-		return NLS.bind(ModelMessages.JSDIThread_thread_title, new String[] { thread.name(), statusText() });
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IThread#getPriority()
-	 */
-	public int getPriority() throws DebugException {
-		return 0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IThread#getStackFrames()
-	 */
-	public synchronized IStackFrame[] getStackFrames() throws DebugException {
-		if (!isSuspended() || !thread.isSuspended()) {
-			return NO_STACK_FRAMES;
-		}
-		if (this.frames == null) {
-			this.frames = new ArrayList();
-			List threadFrames = this.thread.frames();
-			for (Iterator iterator = threadFrames.iterator(); iterator.hasNext();) {
-				StackFrame stackFrame = (StackFrame) iterator.next();
-				JavaScriptStackFrame jsdiStackFrame = new JavaScriptStackFrame(this, stackFrame);
-				this.frames.add(jsdiStackFrame);
-			}
-		}
-		return (IStackFrame[]) this.frames.toArray(new IStackFrame[this.frames.size()]);
-	}
-
-	/**
-	 * Clears out old stack frames after resuming.
-	 */
-	private void clearFrames() {
-		if (this.frames != null) {
-			this.frames.clear();
-			this.frames = null;
-		}
-	}
-
-	/**
-	 * Clears out the cached collection of breakpoints
-	 */
-	private void clearBreakpoints() {
-		this.breakpoints.clear();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IThread#getTopStackFrame()
-	 */
-	public IStackFrame getTopStackFrame() throws DebugException {
-		IStackFrame[] stackFrames = getStackFrames();
-		if (stackFrames != null && stackFrames.length > 0) {
-			return stackFrames[0];
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IThread#hasStackFrames()
-	 */
-	public boolean hasStackFrames() throws DebugException {
-		return isSuspended();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#canResume()
-	 */
-	public synchronized boolean canResume() {
-		return state == SUSPENDED;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#canSuspend()
-	 */
-	public synchronized boolean canSuspend() {
-		return state == RUNNING;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#isSuspended()
-	 */
-	public synchronized boolean isSuspended() {
-		return this.state == SUSPENDED;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#resume()
-	 */
-	public synchronized void resume() throws DebugException {
-		if (getDebugTarget().isSuspended()) {
-			getDebugTarget().resume();
-		} else {
-			resume(true);
-		}
-	}
-
-	/**
-	 * Call-back for the owning target to tell the thread to suspend
-	 */
-	public synchronized void targetResume() {
-		resume(false);
-	}
-
-	/**
-	 * Performs the actual resume of the thread
-	 * 
-	 * @param fireevent
-	 */
-	private void resume(boolean fireevent) {
-		if (canResume()) {
-			if (pendingstep != null) {
-				pendingstep.abort();
-			}
-			resumeUnderlyingThread();
-			markResumed();
-			if (fireevent) {
-				fireResumeEvent(DebugEvent.CLIENT_REQUEST);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ISuspendResume#suspend()
-	 */
-	public synchronized void suspend() throws DebugException {
-		if (canSuspend()) {
-			suspendUnderlyingThread();
-		}
-	}
-
-	/**
-	 * Resumes the underlying thread
-	 */
-	void resumeUnderlyingThread() {
-		try {
-			this.thread.resume();
-		} catch (Exception e) {
-			try {
-				disconnect();
-			} catch (DebugException de) {
-				/* JavaScriptDebugPlugin.log(de); */
-			}
-		}
-	}
-
-	/**
-	 * Delegate method to suspend the underlying thread
-	 */
-	void suspendUnderlyingThread() {
-		if (suspending) {
-			return;
-		}
-		if (isSuspended()) {
-			fireSuspendEvent(DebugEvent.CLIENT_REQUEST);
-			return;
-		}
-		suspending = true;
-		Thread thread = new Thread(new Runnable() {
-			public void run() {
-				try {
-					JavaScriptThread.this.thread.suspend();
-					long stop = System.currentTimeMillis() + VirtualMachine.DEFAULT_TIMEOUT;
-					boolean suspended = JavaScriptThread.this.thread.isSuspended();
-					while (System.currentTimeMillis() < stop && !suspended) {
-						try {
-							Thread.sleep(50);
-						} catch (InterruptedException e) {
-						}
-						suspended = JavaScriptThread.this.thread.isSuspended();
-						if (suspended) {
-							break;
-						}
-					}
-					if (!suspended) {
-						IStatus status = new Status(IStatus.ERROR, JavaScriptDebugPlugin.PLUGIN_ID, 100, NLS.bind(ModelMessages.thread_timed_out_trying_to_suspend, new String[] { new Integer(VirtualMachine.DEFAULT_TIMEOUT).toString() }), null);
-						JavaScriptDebugPlugin.log(status);
-					}
-					markSuspended();
-					fireSuspendEvent(DebugEvent.CLIENT_REQUEST);
-				} catch (RuntimeException exception) {
-				} finally {
-					suspending = false;
-				}
-			}
-		});
-		thread.setDaemon(true);
-		thread.start();
-	}
-
-	/**
-	 * Suspend the thread because an exception has been caught
-	 * 
-	 * @param breakpoint
-	 * @since 1.1
-	 */
-	public void suspendForException(JavaScriptExceptionBreakpoint breakpoint) {
-		addBreakpoint(breakpoint);
-		markSuspended();
-		fireSuspendEvent(DebugEvent.BREAKPOINT);
-	}
-	
-	/**
-	 * Call-back from a breakpoint that has been hit
-	 * 
-	 * @param breakpoint
-	 * @param vote
-	 * @return if the thread should stay suspended
-	 */
-	public boolean suspendForBreakpoint(IJavaScriptBreakpoint breakpoint, boolean vote) {
-		IJavaScriptBreakpointParticipant[] participants = JavaScriptDebugPlugin.getParticipantManager().getParticipants(breakpoint);
-		int suspend = 0;
-		for (int i = 0; i < participants.length; i++) {
-			suspend |= participants[i].breakpointHit(this, breakpoint);
-		}
-		if ((suspend & IJavaScriptBreakpointParticipant.SUSPEND) > 0 || suspend == IJavaScriptBreakpointParticipant.DONT_CARE) {
-			addBreakpoint(breakpoint);
-			if(pendingstep != null) {
-				pendingstep.abort();
-			}
-			return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Call-back from
-	 * {@link JavaScriptBreakpoint#eventSetComplete(Event, JavaScriptDebugTarget, boolean, EventSet)}
-	 * to handle suspending / cleanup
-	 * 
-	 * @param breakpoint
-	 * @param suspend
-	 *            if the thread should suspend
-	 * @param eventSet
-	 */
-	public void suspendForBreakpointComplete(IJavaScriptBreakpoint breakpoint, boolean suspend, EventSet eventSet) {
-		if (suspend) {
-			try {
-				if (breakpoint.getSuspendPolicy() == IJavaScriptBreakpoint.SUSPEND_THREAD) {
-					markSuspended();
-				} else {
-					getDebugTarget().suspend();
-				}
-				fireSuspendEvent(DebugEvent.BREAKPOINT);
-			} catch (CoreException ce) {
-				JavaScriptDebugPlugin.log(ce);
-			}
-		}
-	}
-
-	/**
-	 * Call-back for a script that has been loaded
-	 * 
-	 * @param breakpoint
-	 * @param script
-	 * @param vote
-	 * @return if the thread should stay suspended
-	 */
-	public int suspendForScriptLoad(IJavaScriptBreakpoint breakpoint, ScriptReference script, boolean vote) {
-		IJavaScriptBreakpointParticipant[] participants = JavaScriptDebugPlugin.getParticipantManager().getParticipants(breakpoint);
-		int suspend = 0;
-		for (int i = 0; i < participants.length; i++) {
-			suspend |= participants[i].scriptLoaded(this, script, breakpoint);
-		}
-		return suspend;
-	}
-
-	/**
-	 * Call-back from
-	 * {@link JavaScriptLoadBreakpoint#eventSetComplete(Event, JavaScriptDebugTarget, boolean, EventSet)}
-	 * to handle suspending / cleanup
-	 * 
-	 * @param breakpoint
-	 * @param script
-	 * @param suspend
-	 *            if the thread should suspend
-	 * @param eventSet
-	 */
-	public void suspendForScriptLoadComplete(IJavaScriptBreakpoint breakpoint, ScriptReference script, boolean suspend, EventSet eventSet) {
-		suspendForBreakpointComplete(breakpoint, suspend, eventSet);
-	}
-
-	/**
-	 * Adds the given breakpoint to the collection for this thread
-	 * 
-	 * @param breakpoint
-	 * @return if the breakpoint added removed an existing entry
-	 */
-	public synchronized boolean addBreakpoint(IJavaScriptBreakpoint breakpoint) {
-		return breakpoints.add(breakpoint);
-	}
-
-	/**
-	 * Removes the breakpoint from the cached collection of breakpoints
-	 * 
-	 * @param breakpoint
-	 * @return if the breakpoint was removed
-	 */
-	public synchronized boolean removeBreakpoint(IJavaScriptBreakpoint breakpoint) {
-		return breakpoints.remove(breakpoint);
-	}
-
-	/**
-	 * Sets the state of the thread to {@link #SUSPENDED}
-	 */
-	synchronized void markSuspended() {
-		if (DEBUG){
-			if (!thread.isSuspended())
-				System.err.println("Warning: model thread marked suspended when underlything thread is not suspended"); //$NON-NLS-1$
-		}
-		this.state = SUSPENDED;
-	}
-
-	/**
-	 * Sets the state of the thread to {@link #RUNNING} and clears any cached
-	 * stack frames
-	 */
-	synchronized void markResumed() {
-		if (DEBUG){
-			if (thread.isSuspended())
-				System.err.println("Warning: model thread marked resumed when underlything thread is suspended"); //$NON-NLS-1$
-		}
-		this.state = RUNNING;
-		clearFrames();
-		clearBreakpoints();
-	}
-
-	/**
-	 * Sets the state of the thread to {@link #TERMINATED}
-	 */
-	synchronized void markTerminated() {
-		this.state = TERMINATED;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#canStepInto()
-	 */
-	public synchronized boolean canStepInto() {
-		return canStep() || atScriptLoadBreakpoint();
-	}
-
-	/**
-	 * Returns if the top breakpoint the thread is suspended on is an
-	 * {@link IJavaScriptLoadBreakpoint}
-	 * 
-	 * @return <code>true</code> if the thread is suspended at a script load
-	 *         breakpoint, <code>false</code> otherwise
-	 */
-	private boolean atScriptLoadBreakpoint() {
-		if (this.breakpoints != null && this.breakpoints.size() > 0) {
-			return this.breakpoints.get(0) instanceof IJavaScriptLoadBreakpoint;
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#canStepOver()
-	 */
-	public synchronized boolean canStepOver() {
-		return canStep();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#canStepReturn()
-	 */
-	public synchronized boolean canStepReturn() {
-		return canStep();
-	}
-
-	/**
-	 * @return <code>true</code> if a step is allowed
-	 */
-	private boolean canStep() {
-		try {
-			return isSuspended() && !isStepping() && getTopStackFrame() != null;
-		} catch (DebugException de) {
-			JavaScriptDebugPlugin.log(de);
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#isStepping()
-	 */
-	public synchronized boolean isStepping() {
-		return pendingstep != null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#stepInto()
-	 */
-	public synchronized void stepInto() throws DebugException {
-		if (!canStepInto()) {
-			if (DEBUG)
-				System.err.println("Warning: StepInto called on model thread when it canStepInto is false"); //$NON-NLS-1$
-			return;
-		}
-		StepHandler handler = new StepHandler();
-		handler.step(StepRequest.STEP_INTO, DebugEvent.STEP_INTO);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#stepOver()
-	 */
-	public synchronized void stepOver() throws DebugException {
-		if (!canStepOver()) {
-			if (DEBUG)
-				System.err.println("Warning: stepOver called on model thread when it canStepOver is false"); //$NON-NLS-1$
-			return;
-		}
-		StepHandler handler = new StepHandler();
-		handler.step(StepRequest.STEP_OVER, DebugEvent.STEP_OVER);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IStep#stepReturn()
-	 */
-	public synchronized void stepReturn() throws DebugException {
-		if (!canStepReturn()) {
-			if (DEBUG)
-				System.err.println("Warning: stepReturn called on model thread when it canStepReturn is false"); //$NON-NLS-1$
-			return;
-		}
-		StepHandler handler = new StepHandler();
-		handler.step(StepRequest.STEP_OUT, DebugEvent.STEP_RETURN);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ITerminate#canTerminate()
-	 */
-	public boolean canTerminate() {
-		return getDebugTarget().canTerminate();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ITerminate#isTerminated()
-	 */
-	public synchronized boolean isTerminated() {
-		return this.state == TERMINATED;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.ITerminate#terminate()
-	 */
-	public synchronized void terminate() throws DebugException {
-		this.state = TERMINATED;
-		getJavaScriptDebugTarget().terminate();
-		getJavaScriptDebugTarget().getEventRequestManager().deleteEventRequest(suspendreq);
-		removeJSDIEventListener(this, suspendreq);
-	}
-
-	/**
-	 * Call-back from the target to terminate the thread during shutdown
-	 */
-	void terminated() {
-		markTerminated();
-		fireTerminateEvent();
-	}
-
-	/**
-	 * Returns if the underlying {@link ThreadReference} of this thread matches
-	 * the given {@link ThreadReference} using pointer equality
-	 * 
-	 * @param thread
-	 * @return true if the {@link ThreadReference}s are the same
-	 */
-	public boolean matches(ThreadReference thread) {
-		return this.thread == thread;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.debug.core.model.DebugElement#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if (IThread.class == adapter) {
-			return this;
-		}
-		if (IStackFrame.class == adapter) {
-			try {
-				return getTopStackFrame();
-			} catch (DebugException e) {
-				JavaScriptDebugPlugin.log(e);
-			}
-		}
-		if (IJavaScriptThread.class == adapter) {
-			return this;
-		}
-		if (IJavaScriptStackFrame.class == adapter) {
-			try {
-				return getTopStackFrame();
-			} catch (DebugException e) {
-				JavaScriptDebugPlugin.log(e);
-			}
-		}
-		return super.getAdapter(adapter);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread#evaluate(java
-	 * .lang.String)
-	 */
-	public IJavaScriptValue evaluate(String expression) {
-		try {
-			IStackFrame frame = getTopStackFrame();
-			if (frame instanceof JavaScriptStackFrame) {
-				return new JavaScriptValue(getJavaScriptDebugTarget(), ((JavaScriptStackFrame) frame).getUnderlyingStackFrame().evaluate(expression));
-			}
-		} catch (DebugException de) {
-			// do nothing, return
-		}
-		return new JavaScriptValue(getJavaScriptDebugTarget(), getVM().mirrorOfNull());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread#getFrameCount()
-	 */
-	public int getFrameCount() {
-		if (isSuspended()) {
-			return this.thread.frameCount();
-		}
-		return 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.model.IJavaScriptEventListener#handleEvent(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event, org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-	 */
-	public boolean handleEvent(Event event, JavaScriptDebugTarget target, boolean suspendVote, EventSet eventSet) {
-		if(event instanceof SuspendEvent) {
-			if(canSuspend()) {
-				markSuspended();
-				fireSuspendEvent(DebugEvent.SUSPEND);
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.model.IJavaScriptEventListener#eventSetComplete(org.eclipse.wst.jsdt.debug.core.jsdi.event.Event, org.eclipse.wst.jsdt.debug.internal.core.model.JavaScriptDebugTarget, boolean, org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet)
-	 */
-	public void eventSetComplete(Event event, JavaScriptDebugTarget target, boolean suspend, EventSet eventSet) {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptValue.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptValue.java
deleted file mode 100644
index cf32f38..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptValue.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.model;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-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.osgi.util.NLS;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.BooleanValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.FunctionReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Property;
-import org.eclipse.wst.jsdt.debug.core.jsdi.StringValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.UndefinedValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptValue;
-import org.eclipse.wst.jsdt.debug.core.model.JavaScriptDebugModel;
-
-/**
- * Default implementation of {@link IValue}
- * 
- * @since 1.0
- */
-public class JavaScriptValue extends JavaScriptDebugElement implements IJavaScriptValue {
-
-	/**
-	 * the '[proto]' value
-	 */
-	public static final String PROTO = "[proto]"; //$NON-NLS-1$
-	/**
-	 * The 'this' value
-	 */
-	public static final String THIS = "this"; //$NON-NLS-1$
-	
-	private Value value;
-	private List properties;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param target
-	 * @param value
-	 */
-	public JavaScriptValue(JavaScriptDebugTarget target, Value value) {
-		super(target);
-		this.value = value;
-	}
-	
-	/**
-	 * Hook to return the underlying value for this {@link JavaScriptValue}
-	 * 
-	 * @return the underlying {@link Value}
-	 */
-	protected Value getUnderlyingValue() {
-		return this.value;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptValue#getDetailString()
-	 */
-	public String getDetailString() {
-		if (this.value instanceof ArrayReference) {
-			ArrayReference array = (ArrayReference) this.value;
-			List values = array.getValues();
-			Iterator iterator = values.iterator();
-			if (! iterator.hasNext())
-			    return "[]"; //$NON-NLS-1$
-			StringBuffer buffer = new StringBuffer();
-			buffer.append('[');
-			for (;;) {
-				Value jsValue = (Value) iterator.next();
-				buffer.append(getValueString(jsValue));
-				if (! iterator.hasNext())
-					return buffer.append(']').toString();
-				buffer.append(", "); //$NON-NLS-1$				
-			}
-		}
-
-		if (this.value instanceof JavaScriptPrimitiveValue) {
-			JavaScriptPrimitiveValue nvalue = (JavaScriptPrimitiveValue)this.value;
-			return nvalue.stringValue();
-		}
-		return this.value.valueString();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IValue#getReferenceTypeName()
-	 */
-	public String getReferenceTypeName() throws DebugException {
-		if (this.value != null) {
-			if (this.value instanceof ObjectReference) {
-				if (this.value instanceof NullValue) {
-				return NULL;
-				} else if (this.value instanceof ArrayReference) {
-					return ARRAY;
-				}else if (this.value instanceof FunctionReference) {
-					return FUNCTION;
-				}
-				return OBJECT;
-			} else if (this.value instanceof BooleanValue) {
-				return BOOLEAN;
-			} else if (this.value instanceof UndefinedValue) {
-				return UNDEFINED;
-			} else if (this.value instanceof NumberValue) {
-				return NUMBER;
-			} else if (this.value instanceof StringValue) {
-				return STRING;
-			}
-		}
-		return UNKNOWN;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IValue#getValueString()
-	 */
-	public String getValueString() throws DebugException {
-		return getValueString(value);
-	}
-	
-	private static String getValueString(Value jsValue) {
-		if (jsValue instanceof ObjectReference) {
-			ObjectReference ref = (ObjectReference) jsValue;
-			StringBuffer buffer = new StringBuffer();
-			buffer.append(NLS.bind(ModelMessages.JavaScriptValue_object_value_label, new String[] {jsValue.valueString(), ref.id().toString()}));
-			return buffer.toString();
-		}
-		if (jsValue instanceof NumberValue) {
-			NumberValue nvalue = (NumberValue) jsValue;
-			if (!nvalue.isNaN()) {
-				return JavaScriptDebugModel.numberToString(nvalue.value());
-			}
-		}
-		
-		if (jsValue instanceof StringValue) {
-			StringBuffer buffer = new StringBuffer();
-			buffer.append('"');
-			buffer.append(jsValue.valueString().replaceAll("\"", "\\\\\"")); //$NON-NLS-1$//$NON-NLS-2$
-			buffer.append('"');
-			return buffer.toString();
-		}
-		
-		return jsValue.valueString();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IValue#getVariables()
-	 */
-	public synchronized IVariable[] getVariables() throws DebugException {
-		if (!hasVariables()) {
-			return null;
-		}
-		if (this.properties == null) {
-			final ObjectReference reference = (ObjectReference) this.value;
-			List underlyingProperties = reference.properties();
-			this.properties = new ArrayList(underlyingProperties.size()+1);
-			for (Iterator iterator = underlyingProperties.iterator(); iterator.hasNext();) {
-				Property property = (Property) iterator.next();
-				JavaScriptProperty jsdiProperty = new JavaScriptProperty(this, property);
-				this.properties.add(jsdiProperty);
-			}
-			
-			// sort - array values (e.g integer names) first then alphabetically
-			Collections.sort(properties, new Comparator() {		
-				public int compare(Object arg0, Object arg1) {
-					try {		
-					String name0 = ((IVariable) arg0).getName();
-					String name1 = ((IVariable) arg1).getName();
-					
-					if (Character.isDigit(name0.charAt(0))) {
-						if (Character.isDigit(name1.charAt(0))) 
-							return Integer.valueOf(name0).compareTo(Integer.valueOf(name1));
-						return -1;
-					}
-					if (Character.isDigit(name1.charAt(0)))
-						return 1;
-
-					return name0.compareToIgnoreCase(name1);
-					} catch (DebugException e) {
-						return 0;
-					}
-				}
-			});
-			
-			// add the prototype
-			Property prototype = new Property() {
-				public VirtualMachine virtualMachine() {
-					return reference.virtualMachine();
-				}
-
-				public String name() {
-					return PROTO;
-				}
-
-				public Value value() {
-					return reference.prototype();
-				}
-			};
-			properties.add(0, new JavaScriptProperty(this, prototype));			
-		}
-		return (IVariable[]) this.properties.toArray(new IVariable[this.properties.size()]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IValue#hasVariables()
-	 */
-	public boolean hasVariables() throws DebugException {
-		if (this.value instanceof ObjectReference) {
-			return !(this.value instanceof NullValue);
-		}
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IValue#isAllocated()
-	 */
-	public boolean isAllocated() throws DebugException {
-		return this.properties != null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IJavaScriptValue#isNull()
-	 */
-	public boolean isNull() {
-		return this.value instanceof NullValue;
-	}
-	
-	/**
-	 * Delegate method to create the proper kind of {@link IJavaScriptValue}
-	 * 
-	 * @param target the target to create the value for
-	 * @param value the value to wrap
-	 * @return a new {@link IJavaScriptValue}
-	 */
-	public static IJavaScriptValue createValue(JavaScriptDebugTarget target, Value value) {
-		if(value instanceof BooleanValue ||
-				value instanceof NullValue ||
-				value instanceof NumberValue) {
-			return new JavaScriptPrimitiveValue(target, value);
-		}
-		return new JavaScriptValue(target, value);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptVariable.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptVariable.java
deleted file mode 100644
index 08f19c6..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptVariable.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.model;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.IValue;
-import org.eclipse.debug.core.model.IVariable;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Variable;
-
-/**
- * Default implementation of an {@link IVariable}
- * 
- * @see JavaScriptValue
- * @see JavaScriptStackFrame
- * @see StackFrameReference
- * @see Variable
- * @since 1.0
- */
-public class JavaScriptVariable extends JavaScriptDebugElement implements IVariable {
-
-	private Variable variable;
-	private JavaScriptValue value = null;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param frame
-	 * @param variable
-	 */
-	public JavaScriptVariable(JavaScriptStackFrame frame, Variable variable) {
-		super(frame.getJavaScriptDebugTarget());
-		this.variable = variable;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IVariable#getName()
-	 */
-	public String getName() {
-		return this.variable.name();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IVariable#getReferenceTypeName()
-	 */
-	public String getReferenceTypeName() throws DebugException {
-		return getValue().getReferenceTypeName();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IVariable#getValue()
-	 */
-	public IValue getValue() throws DebugException {
-		if (this.value == null) {
-			this.value = new JavaScriptValue(getJavaScriptDebugTarget(), this.variable.value());
-		}
-		return this.value;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IVariable#hasValueChanged()
-	 */
-	public boolean hasValueChanged() throws DebugException {
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
-	 */
-	public Object getAdapter(Class adapter) {
-		if (adapter == JavaScriptVariable.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 {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IValueModification#setValue(org.eclipse.debug.core.model.IValue)
-	 */
-	public void setValue(IValue value) throws DebugException {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.debug.core.model.IValueModification#supportsValueModification()
-	 */
-	public boolean supportsValueModification() {
-		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.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/ModelMessages.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/ModelMessages.java
deleted file mode 100644
index 51a59f9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/ModelMessages.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.model;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Message declarations
- * 
- * @since 1.0
- */
-public class ModelMessages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.core.model.modelmessages"; //$NON-NLS-1$
-	public static String breakpoint_at_line_location;
-	public static String JavaScriptThread_evaluated_script;
-	public static String JavaScriptThread_suspended_on_exception;
-	public static String JavaScriptValue_object_value_label;
-	public static String JSDIDebugTarget_jsdi_debug_target;
-	public static String JSDIDebugTarget_not_support_disconnect;
-	public static String JSDIDebugTarget_not_support_terminate;
-	public static String JSDIDebugTarget_recieved_unknown_event;
-	public static String JSDIDebugTarget_unsupported_operation;
-	public static String JSDIStackFrame_stackframe_name;
-	public static String JSDIThread_thread_title;
-	public static String JSDIThread_suspended_loading_script;
-	public static String thread_running;
-	public static String thread_state_unknown;
-	public static String thread_stepping;
-	public static String thread_suspended;
-	public static String thread_terminated;
-	public static String thread_timed_out_trying_to_suspend;
-	public static String thread_zombie;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, ModelMessages.class);
-	}
-
-	private ModelMessages() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/Script.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/Script.java
deleted file mode 100644
index e325cba..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/Script.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.model;
-
-import java.net.URI;
-
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.URIUtil;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.model.IScript;
-
-/**
- * Wrapper for a {@link ScriptReference} to display it in the debug view
- * 
- * @since 1.0
- */
-public class Script extends JavaScriptDebugElement implements IScript, Comparable {
-
-	private ScriptReference script = null;
-	
-	/**
-	 * Constructor
-	 */
-	public Script(JavaScriptDebugTarget target, ScriptReference script) {
-		super(target);
-		this.script  = script;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IScript#source()
-	 */
-	public String source() {
-		return this.script.source();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IScript#sourceURI()
-	 */
-	public URI sourceURI() {
-		return this.script.sourceURI();
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Comparable#compareTo(java.lang.Object)
-	 */
-	public int compareTo(Object o) {
-		if(o instanceof Script) {
-			Script s2 = (Script) o;
-			return sourceURI().toString().compareTo(s2.sourceURI().toString());
-		}
-		return 0;
-	}
-	
-	/**
-	 * Helper method to compute a usable name in the event the source URI has a path of "/"
-	 * 
-	 * @param sourceuri
-	 * @return the name to use from the URI
-	 */
-	public static String resolveName(URI sourceuri) {
-		String name = URIUtil.lastSegment(sourceuri);
-		if(name == null) {
-			name = new Path(sourceuri.getSchemeSpecificPart()).lastSegment();
-		}
-		return name;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/ScriptGroup.java b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/ScriptGroup.java
deleted file mode 100644
index 1fc2a66..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/ScriptGroup.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.core.model;
-
-import java.util.List;
-
-import org.eclipse.debug.core.DebugException;
-import org.eclipse.debug.core.model.ITerminate;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptDebugTarget;
-import org.eclipse.wst.jsdt.debug.core.model.IScriptGroup;
-
-
-/**
- * Container for all scripts from a target
- * 
- * @since 1.0
- */
-public class ScriptGroup extends JavaScriptDebugElement implements IScriptGroup, ITerminate {
-	
-	/**
-	 * Constructor
-	 */
-	public ScriptGroup(IJavaScriptDebugTarget target) {
-		super(target);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.model.IScriptGroup#allScripts()
-	 */
-	public synchronized List allScripts() {
-		return getJavaScriptDebugTarget().allScripts();
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if(obj instanceof ScriptGroup) {
-			return ((ScriptGroup)obj).getJavaScriptDebugTarget().equals(getJavaScriptDebugTarget());
-		}
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return getJavaScriptDebugTarget().hashCode();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ITerminate#canTerminate()
-	 */
-	public boolean canTerminate() {
-		return getJavaScriptDebugTarget().canTerminate();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ITerminate#isTerminated()
-	 */
-	public boolean isTerminated() {
-		return getJavaScriptDebugTarget().isTerminated();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.debug.core.model.ITerminate#terminate()
-	 */
-	public void terminate() throws DebugException {
-		getJavaScriptDebugTarget().terminate();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/modelmessages.properties b/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/modelmessages.properties
deleted file mode 100644
index 37e9037..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/modelmessages.properties
+++ /dev/null
@@ -1,29 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 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
-###############################################################################
-breakpoint_at_line_location=suspended at breakpoint on line {0} in {1}
-JavaScriptThread_evaluated_script=<evaluated script>
-JavaScriptThread_suspended_on_exception=suspended on exception: {0}
-JavaScriptValue_object_value_label={0} (id={1})
-JSDIDebugTarget_jsdi_debug_target=JavaScript Debug Target
-JSDIDebugTarget_not_support_disconnect=JavaScript debug target {0} does not support being disconnected
-JSDIDebugTarget_not_support_terminate=JavaScript debug target {0} does not support being terminated
-JSDIDebugTarget_recieved_unknown_event=Received unknown event: {0}
-JSDIDebugTarget_unsupported_operation=Unsupported Operation
-JSDIStackFrame_stackframe_name={0} - line: {1}
-JSDIThread_thread_title=Thread [{0}] ({1})
-JSDIThread_suspended_loading_script=suspended loading script: {0}
-thread_running=running
-thread_state_unknown=<unknown state>
-thread_stepping=stepping
-thread_suspended=suspended
-thread_terminated=terminated
-thread_timed_out_trying_to_suspend=Thread timed out trying to suspend after waiting {0} ms
-thread_zombie=zombie
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/.classpath b/bundles/org.eclipse.wst.jsdt.debug.crossfire/.classpath
deleted file mode 100644
index 2fbb7a2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/.options b/bundles/org.eclipse.wst.jsdt.debug.crossfire/.options
deleted file mode 100644
index d2ba021..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/.options
+++ /dev/null
@@ -1,25 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 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
-###############################################################################
-
-#option file for tracing options for Crossfire debugger port
-org.eclipse.wst.jsdt.debug.crossfire/debug=true
-
-#option to trace packets being sent / received
-org.eclipse.wst.jsdt.debug.crossfire/packets=false
-
-#option to trace the event queue
-org.eclipse.wst.jsdt.debug.crossfire/eventqueue=false
-
-#option to trace the jsdi impl* elements
-org.eclipse.wst.jsdt.debug.crossfire/jsdi=false
-
-#option to trace the JSON parser
-org.eclipse.wst.jsdt.debug.crossfire/json=false
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/.project b/bundles/org.eclipse.wst.jsdt.debug.crossfire/.project
deleted file mode 100644
index 243de54..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.jsdt.debug.internal.crossfire</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.wst.jsdt.debug.crossfire/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index de9eac3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,90 +0,0 @@
-#Fri Apr 30 10:04:28 CDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
-org.eclipse.jdt.core.compiler.problem.deadCode=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=error
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=error
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/plugin.xml b/bundles/org.eclipse.wst.jsdt.debug.crossfire/plugin.xml
deleted file mode 100644
index e232ba6..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/plugin.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <extension
-         point="org.eclipse.wst.jsdt.debug.core.launchingConnectors">
-      <connector
-            class="org.eclipse.wst.jsdt.debug.internal.crossfire.connect.CrossfireListeningConnector"
-            id="crossfire.remote.listen.connector">
-      </connector>
-   </extension>
-   <extension
-         point="org.eclipse.wst.jsdt.debug.core.launchingConnectors">
-      <connector
-            class="org.eclipse.wst.jsdt.debug.internal.crossfire.connect.CrossfireAttachingConnector"
-            id="crossfire.remote.attach.connector">
-      </connector>
-   </extension>
-
-</plugin>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/Constants.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/Constants.java
deleted file mode 100644
index cd50734..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/Constants.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire;
-
-/**
- * Constants for the bundle
- * 
- * @since 1.0
- */
-public interface Constants {
-
-	/**
-	 * Constant representing a space
-	 */
-	public static final String SPACE = " "; //$NON-NLS-1$
-	/**
-	 * Constant representing a colon.<br>
-	 * <br>
-	 * Value is: <code>:</code>
-	 */
-	public static final String COLON = ":"; //$NON-NLS-1$
-	/**
-	 * Constant representing the empty string
-	 */
-	public static final String EMPTY_STRING = ""; //$NON-NLS-1$
-	/**
-	 * UTF-8 encoding constant <br>
-	 * <br>
-	 * Value is: <code>UTF-8</code>
-	 */
-	public static final String UTF_8 = "UTF-8"; //$NON-NLS-1$
-	public static String URI_FILE_SCHEME = "file"; //$NON-NLS-1$
-	public static final String UNKNOWN = "unknown"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/BrowserArgument.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/BrowserArgument.java
deleted file mode 100644
index 63e4915..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/BrowserArgument.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.connect;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.BooleanArgument;
-
-/**
- * Option to automatically launch the browser and connect to it
- * 
- * @since 1.0
- */
-public class BrowserArgument implements BooleanArgument {
-
-	/**
-	 * name of the argument
-	 */
-	public static final String BROWSER = "browser"; //$NON-NLS-1$
-	
-	private boolean doit = false; 
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return Messages.auto_attach_desc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return Messages.auto_attach_label;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return BROWSER;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String value) {
-		doit = Boolean.valueOf(value).booleanValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return Boolean.toString(doit);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.BooleanArgument#booleanValue()
-	 */
-	public boolean booleanValue() {
-		return doit;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.BooleanArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.BooleanArgument#setValue(boolean)
-	 */
-	public void setValue(boolean booleanValue) {
-		doit = booleanValue;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/PortArgument.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/PortArgument.java
deleted file mode 100644
index ced215f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/PortArgument.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.connect;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument;
-
-/**
- * Implementation of an {@link IntegerArgument} that describes the port to try connecting to
- * 
- * @since 1.0
- */
-public class PortArgument implements IntegerArgument {
-
-	private static final long serialVersionUID = -1954469572907116388L;
-	private int port;
-
-	/**
-	 * The port attribute name
-	 */
-	public static final String PORT = "port"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param port
-	 */
-	public PortArgument(int port) {
-		setValue(port);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#intValue()
-	 */
-	public int intValue() {
-		return port;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(int)
-	 */
-	public boolean isValid(int intValue) {
-		return intValue > 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#max()
-	 */
-	public int max() {
-		return Integer.MAX_VALUE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#min()
-	 */
-	public int min() {
-		return 1;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#setValue(int)
-	 */
-	public void setValue(int port) {
-		this.port = port;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return Messages.port_arg_desc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		try {
-			int intValue = Integer.parseInt(value);
-			return isValid(intValue);
-		} catch (NumberFormatException e) {
-			return false;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return Messages.port_arg_name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return PORT;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String value) {
-		try {
-			int intValue = Integer.parseInt(value);
-			setValue(intValue);
-		} catch (NumberFormatException nfe) {
-			// re-throw IllegalArgumentException
-			throw new IllegalArgumentException(nfe.getMessage());
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return Integer.toString(port);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/TimeoutArgument.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/TimeoutArgument.java
deleted file mode 100644
index c622e8b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/connect/TimeoutArgument.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.connect;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument;
-
-/**
- * Argument used to specify a timeout (in ms)
- * 
- * @since 1.1
- */
-public class TimeoutArgument implements IntegerArgument {
-	
-	/**
-	 * Argument to specify a timeout
-	 */
-	public static final String TIMEOUT = "timeout"; //$NON-NLS-1$
-	/**
-	 * default connecting timeout
-	 */
-	public static final Integer CONNECT_TIMEOUT = new Integer(30000);
-	
-	/**
-	 * The timeout
-	 */
-	private int timeout = 0;
-	
-	/**
-	 * Constructor
-	 */
-	public TimeoutArgument() {
-		setValue(CONNECT_TIMEOUT.intValue());
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return Messages.timeout_desc;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return Messages.timeout;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return TIMEOUT;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String value) {
-		try {
-			timeout = Integer.parseInt(value);
-		}
-		catch(NumberFormatException nfe) {
-			//do nothing the new value will not be set
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return Integer.toString(timeout);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#intValue()
-	 */
-	public int intValue() {
-		return timeout;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(int)
-	 */
-	public boolean isValid(int intValue) {
-		return intValue > 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		try {
-			return Integer.parseInt(value) > 0;
-		}
-		catch(NumberFormatException bfe) {
-			//do nothing, just not valid
-		}
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#max()
-	 */
-	public int max() {
-		return Integer.MAX_VALUE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#min()
-	 */
-	public int min() {
-		return 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#setValue(int)
-	 */
-	public void setValue(int intValue) {
-		timeout = intValue;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFBreakpointEvent.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFBreakpointEvent.java
deleted file mode 100644
index 0b6c55d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFBreakpointEvent.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.BreakpointEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Default implementation of {@link BreakpointEvent} for Crossfire
- * 
- * @since 1.0
- */
-public class CFBreakpointEvent extends CFLocatableEvent implements BreakpointEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 * @param thread
-	 * @param location
-	 */
-	public CFBreakpointEvent(VirtualMachine vm, EventRequest request, ThreadReference thread, Location location) {
-		super(vm, request, thread, location);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFDebuggerStatementEvent.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFDebuggerStatementEvent.java
deleted file mode 100644
index 463bcf9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFDebuggerStatementEvent.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.DebuggerStatementEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Default implementation of {@link DebuggerStatementEvent} for Crossfire
- * 
- * @since 1.0
- */
-public class CFDebuggerStatementEvent extends CFLocatableEvent implements DebuggerStatementEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 * @param thread
-	 * @param location
-	 */
-	public CFDebuggerStatementEvent(VirtualMachine vm, EventRequest request, ThreadReference thread, Location location) {
-		super(vm, request, thread, location);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFExceptionEvent.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFExceptionEvent.java
deleted file mode 100644
index 411eec9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFExceptionEvent.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ExceptionEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Default implementation of {@link ExceptionEvent} for Crossfire
- * 
- * @since 1.0
- */
-public class CFExceptionEvent extends CFLocatableEvent implements ExceptionEvent {
-
-	private String message = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 * @param thread
-	 * @param location
-	 * @param message
-	 */
-	public CFExceptionEvent(VirtualMachine vm, EventRequest request, ThreadReference thread, Location location, String message) {
-		super(vm, request, thread, location);
-		this.message = message;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.ExceptionEvent#message()
-	 */
-	public String message() {
-		return message;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFLocatableEvent.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFLocatableEvent.java
deleted file mode 100644
index 4299cf9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFLocatableEvent.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.LocatableEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Default implementation of {@link LocatableEvent} for Crossfire
- * 
- * @sicne 1.0
- */
-public class CFLocatableEvent extends CFEvent implements LocatableEvent {
-
-	private ThreadReference thread = null;
-	private Location location = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 */
-	public CFLocatableEvent(VirtualMachine vm, EventRequest request, ThreadReference thread, Location location) {
-		super(vm, request);
-		this.thread = thread;
-		this.location = location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Locatable#location()
-	 */
-	public Location location() {
-		return location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.LocatableEvent#thread()
-	 */
-	public ThreadReference thread() {
-		return thread;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFScriptLoadEvent.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFScriptLoadEvent.java
deleted file mode 100644
index ada21e5..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFScriptLoadEvent.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ScriptLoadEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Default implementation of {@link ScriptLoadEvent} for Crossfire
- * 
- * @since 1.0
- */
-public class CFScriptLoadEvent extends CFLocatableEvent implements ScriptLoadEvent {
-
-	private ScriptReference script = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 */
-	public CFScriptLoadEvent(VirtualMachine vm, EventRequest request, ThreadReference thread, ScriptReference script) {
-		super(vm, request, thread, null);
-		this.script = script;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.ScriptLoadEvent#script()
-	 */
-	public ScriptReference script() {
-		return script;
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFSuspendEvent.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFSuspendEvent.java
deleted file mode 100644
index 898102f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFSuspendEvent.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.SuspendEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Default implementation of {@link SuspendEvent} for Crossfire
- * 
- * @since 1.0
- */
-public class CFSuspendEvent extends CFLocatableEvent implements SuspendEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 * @param thread
-	 * @param location
-	 */
-	public CFSuspendEvent(VirtualMachine vm, EventRequest request, ThreadReference thread, Location location) {
-		super(vm, request, thread, location);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFThreadEnterEvent.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFThreadEnterEvent.java
deleted file mode 100644
index 9ba26c9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFThreadEnterEvent.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ThreadEnterEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Default implementation of {@link ThreadEnterEvent} for Crossfire
- * 
- * @since 1.0
- */
-public class CFThreadEnterEvent extends CFLocatableEvent implements ThreadEnterEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 * @param thread
-	 */
-	public CFThreadEnterEvent(VirtualMachine vm, EventRequest request, ThreadReference thread) {
-		super(vm, request, thread, null);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFThreadExitEvent.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFThreadExitEvent.java
deleted file mode 100644
index e0052fb..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFThreadExitEvent.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ThreadExitEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Default implementation of {@link ThreadExitEvent} for Crossfire
- * 
- * @since 1.0
- */
-public class CFThreadExitEvent extends CFLocatableEvent implements ThreadExitEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 * @param thread
-	 */
-	public CFThreadExitEvent(VirtualMachine vm, EventRequest request, ThreadReference thread) {
-		super(vm, request, thread, null);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFVMDeathEvent.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFVMDeathEvent.java
deleted file mode 100644
index feef5ef..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/event/CFVMDeathEvent.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.VMDeathEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-
-/**
- * Default implementation of a {@link VMDeathEvent} for Crossfire
- * 
- * @since 1.0
- */
-public class CFVMDeathEvent extends CFEvent implements VMDeathEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 */
-	public CFVMDeathEvent(VirtualMachine vm, EventRequest request) {
-		super(vm, request);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFArrayReference.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFArrayReference.java
deleted file mode 100644
index 7d67887..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFArrayReference.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- * Default implementation of {@link ArrayReference} for Crossfire
- * 
- * @since 1.0
- */
-public class CFArrayReference extends CFObjectReference implements ArrayReference {
-
-	/**
-	 * The "array" value type
-	 */
-	public static final String ARRAY = "array"; //$NON-NLS-1$
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param frame
-	 * @param body
-	 */
-	public CFArrayReference(CFVirtualMachine vm, CFStackFrame frame, Map body) {
-		super(vm, frame, body);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference#length()
-	 */
-	public int length() {
-		return 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference#getValue(int)
-	 */
-	public Value getValue(int index) throws IndexOutOfBoundsException {
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference#getValues()
-	 */
-	public List getValues() {
-		return null;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFBooleanValue.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFBooleanValue.java
deleted file mode 100644
index e27ea20..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFBooleanValue.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.BooleanValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Default implementation of a {@link BooleanValue} for Crossfire
- * 
- * @since 1.0
- */
-public class CFBooleanValue extends CFMirror implements BooleanValue {
-
-	private boolean bool = false;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param bool the underlying boolean value
-	 */
-	public CFBooleanValue(VirtualMachine vm, boolean bool) {
-		super(vm);
-		this.bool = bool;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#intValue()
-	 */
-	public int intValue() {
-		return (bool ? 1 : 0);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#doubleValue()
-	 */
-	public double doubleValue() {
-		return (bool ? 1 : 0);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#booleanValue()
-	 */
-	public boolean booleanValue() {
-		return bool;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#stringValue()
-	 */
-	public String stringValue() {
-		return Boolean.toString(bool);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return stringValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return stringValue();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFLocation.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFLocation.java
deleted file mode 100644
index e783e98..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFLocation.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Default implementation of {@link Location} for Crossfire
- * 
- * @since 1.0
- */
-public class CFLocation extends CFMirror implements Location {
-
-	private CFScriptReference script = null;
-	private String function = null;
-	private int line = -1;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param script
-	 * @param function
-	 * @param line
-	 */
-	public CFLocation(VirtualMachine vm, CFScriptReference script, String function, int line) {
-		super(vm);
-		this.script = script;
-		this.function = function;
-		this.line = line;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Location#scriptReference()
-	 */
-	public ScriptReference scriptReference() {
-		return script;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Location#lineNumber()
-	 */
-	public int lineNumber() {
-		return line;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Location#functionName()
-	 */
-	public String functionName() {
-		return function;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("LocationImpl: "); //$NON-NLS-1$
-		buffer.append("[script - ").append(script.sourceURI()).append("] "); //$NON-NLS-1$ //$NON-NLS-2$
-		buffer.append("[function - ").append(function).append("] "); //$NON-NLS-1$ //$NON-NLS-2$
-		buffer.append("[line - ").append(line).append("]"); //$NON-NLS-1$ //$NON-NLS-2$
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFMirror.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFMirror.java
deleted file mode 100644
index dc6ceb7..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFMirror.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Mirror;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Default implementation for a {@link Mirror} for Crossfire
- * 
- * @since 1.0
- */
-public class CFMirror implements Mirror {
-
-	static boolean TRACE = false;
-	
-	private VirtualMachine vm = null;
-	
-	/**
-	 * Constructor
-	 * For use by the {@link CFVirtualMachine} only
-	 * @noreference This constructor is not intended to be referenced by clients.
-	 */
-	public CFMirror() {
-		vm = (VirtualMachine) this;
-	}
-	
-	/**
-	 * Constructor
-	 */
-	public CFMirror(VirtualMachine vm) {
-		this.vm = vm;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return this.vm;
-	}
-	
-	/**
-	 * Re-throws the given exception as a {@link RuntimeException} with the given message
-	 * @param message
-	 * @param t
-	 */
-	protected void handleException(String message, Throwable t) {
-		throw new RuntimeException(message, t);
-	}
-	
-	/**
-	 * Returns the handle to the {@link CFVirtualMachine}
-	 * 
-	 * @return the {@link CFVirtualMachine} handle
-	 */
-	protected CFVirtualMachine crossfire() {
-		return (CFVirtualMachine) vm;
-	}
-	
-	/**
-	 * Enables / Disables tracing in the all of the JSDI implementations
-	 * 
-	 * @param trace
-	 */
-	public static void setTracing(boolean trace) {
-		TRACE = trace;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFNullValue.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFNullValue.java
deleted file mode 100644
index 1ffc40c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFNullValue.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Default implementation of the {@link NullValue} for Crossfire
- * 
- * @since 1.0
- */
-public class CFNullValue extends CFMirror implements NullValue {
-
-	public static final String NULL = "null"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 */
-	public CFNullValue(VirtualMachine vm) {
-		super(vm);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return CFNullValue.NULL;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return valueString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFStringValue.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFStringValue.java
deleted file mode 100644
index 5e61009..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFStringValue.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.StringValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Default implementation of {@link StringValue} for Crossfire
- * 
- * @since 1.0
- */
-public class CFStringValue extends CFMirror implements StringValue {
-
-	/**
-	 * The "type" of this value
-	 */
-	public static final String STRING = "string"; //$NON-NLS-1$
-	
-	private String string = null;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param string
-	 */
-	public CFStringValue(VirtualMachine vm, String string) {
-		super(vm);
-		this.string = string;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return string;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StringValue#value()
-	 */
-	public String value() {
-		return string;
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return string;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFUndefinedValue.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFUndefinedValue.java
deleted file mode 100644
index 945102c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/CFUndefinedValue.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.UndefinedValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Default implementation for an {@link UndefinedValue} for Crossfire
- * 
- * @since 1.0
- */
-public class CFUndefinedValue extends CFMirror implements UndefinedValue {
-
-	public static final String UNDEFINED = "undefined"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 */
-	public CFUndefinedValue(VirtualMachine vm) {
-		super(vm);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return UNDEFINED;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return valueString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/Messages.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/Messages.java
deleted file mode 100644
index de129f0..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/jsdi/Messages.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.jsdi;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.crossfire.jsdi.messages"; //$NON-NLS-1$
-	public static String crossfire_vm;
-	public static String thread_name;
-	public static String vm_name;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFDeathRequest.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFDeathRequest.java
deleted file mode 100644
index ab8bc70..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFDeathRequest.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDeathRequest;
-
-/**
- * Default implementation of {@link VMDeathRequest} for Crossfire
- * 
- * @since 1.0
- */
-public class CFDeathRequest extends CFEventRequest implements VMDeathRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public CFDeathRequest(VirtualMachine vm) {
-		super(vm);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFDebuggerRequest.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFDebuggerRequest.java
deleted file mode 100644
index 5b65094..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFDebuggerRequest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest;
-
-/**
- * Default implementation of {@link DebuggerStatementRequest} for Crossfire
- * 
- * @since 1.0
- */
-public class CFDebuggerRequest extends CFThreadEventRequest implements DebuggerStatementRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public CFDebuggerRequest(VirtualMachine vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		setThread(thread);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFDisconnectRequest.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFDisconnectRequest.java
deleted file mode 100644
index 5cf1913..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFDisconnectRequest.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDisconnectRequest;
-
-/**
- * Default implementation of {@link VMDisconnectRequest} for Crossfire
- * 
- * @since 1.0
- */
-public class CFDisconnectRequest extends CFEventRequest implements VMDisconnectRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public CFDisconnectRequest(VirtualMachine vm) {
-		super(vm);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFExceptionRequest.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFExceptionRequest.java
deleted file mode 100644
index 9633811..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFExceptionRequest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-
-/**
- * Default implementation of {@link ExceptionRequest} for Crossfire
- * 
- * @since 1.0
- */
-public class CFExceptionRequest extends CFThreadEventRequest implements ExceptionRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public CFExceptionRequest(VirtualMachine vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		setThread(thread);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFScriptLoadRequest.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFScriptLoadRequest.java
deleted file mode 100644
index 6d3bc91..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFScriptLoadRequest.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-
-/**
- * Default implementation of {@link ScriptLoadRequest} for Crossfire
- * 
- * @since 1.0
- */
-public class CFScriptLoadRequest extends CFEventRequest implements ScriptLoadRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public CFScriptLoadRequest(VirtualMachine vm) {
-		super(vm);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFSuspendRequest.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFSuspendRequest.java
deleted file mode 100644
index 62fd7f6..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFSuspendRequest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest;
-
-/**
- * Default implementation of {@link SuspendRequest} for Crossfire
- * 
- * @since 1.0
- */
-public class CFSuspendRequest extends CFThreadEventRequest implements SuspendRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public CFSuspendRequest(VirtualMachine vm, ThreadReference thread) {
-		super(vm);
-		setThread(thread);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFThreadEnterRequest.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFThreadEnterRequest.java
deleted file mode 100644
index 25b3cb5..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFThreadEnterRequest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-
-/**
- * Default implementation of {@link ThreadEnterRequest} for Crossfire
- * 
- * @since 1.0
- */
-public class CFThreadEnterRequest extends CFThreadEventRequest implements ThreadEnterRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public CFThreadEnterRequest(VirtualMachine vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		setThread(thread);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFThreadEventRequest.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFThreadEventRequest.java
deleted file mode 100644
index c44ce0b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFThreadEventRequest.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Abstract notion of an event that knows about a thread
- * 
- * @since 1.0
- */
-public class CFThreadEventRequest extends CFEventRequest {
-
-	private ThreadReference thread = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public CFThreadEventRequest(VirtualMachine vm) {
-		super(vm);
-	}
-	
-	/**
-	 * Sets the backing {@link ThreadReference} for the request
-	 * @param thread
-	 */
-	public void setThread(ThreadReference thread) {
-		this.thread = thread;
-	}
-	
-	/**
-	 * Returns the underlying {@link ThreadReference} this request is filtered to.
-	 * @return the thread filter
-	 */
-	public ThreadReference thread() {
-		return this.thread;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFThreadExitRequest.java b/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFThreadExitRequest.java
deleted file mode 100644
index a9434bf..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.crossfire/src/org/eclipse/wst/jsdt/debug/internal/crossfire/request/CFThreadExitRequest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.crossfire.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-
-/**
- * Default implementation of {@link ThreadExitRequest} for Crossfire
- * 
- * @since 1.0
- */
-public class CFThreadExitRequest extends CFThreadEventRequest implements ThreadExitRequest {
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public CFThreadExitRequest(VirtualMachine vm) {
-		super(vm);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public void addThreadFilter(ThreadReference thread) {
-		setThread(thread);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.classpath b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.classpath
deleted file mode 100644
index 2fbb7a2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.project b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.project
deleted file mode 100644
index edf6952..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.jsdt.debug.rhino.debugger</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index de9eac3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,90 +0,0 @@
-#Fri Apr 30 10:04:28 CDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
-org.eclipse.jdt.core.compiler.problem.deadCode=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=error
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=error
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.settings/org.eclipse.pde.core.prefs b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.settings/org.eclipse.pde.core.prefs
deleted file mode 100644
index b76afaa..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/.settings/org.eclipse.pde.core.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Sun Feb 28 13:50:08 EST 2010
-eclipse.preferences.version=1
-pluginProject.extensions=false
-resolve.requirebundle=false
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/META-INF/MANIFEST.MF
deleted file mode 100644
index f2db8a8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,14 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name
-Bundle-Vendor: %Bundle-Vendor
-Bundle-SymbolicName: org.eclipse.wst.jsdt.debug.rhino.debugger
-Bundle-Version: 1.0.1.qualifier
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Export-Package: org.eclipse.wst.jsdt.debug.internal.rhino.debugger;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.rhino.transport;x-friends:="org.eclipse.wst.jsdt.debug.rhino",
- org.eclipse.wst.jsdt.debug.rhino.debugger,
- org.eclipse.wst.jsdt.debug.rhino.debugger.shell
-Import-Package: org.mozilla.javascript;resolution:=optional,
- org.mozilla.javascript.debug;resolution:=optional,
- org.mozilla.javascript.tools.shell;resolution:=optional
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/OSGI-INF/l10n/bundle.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/OSGI-INF/l10n/bundle.properties
deleted file mode 100644
index b38b565..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/OSGI-INF/l10n/bundle.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 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
-###############################################################################
-Bundle-Vendor = Eclipse Web Tools Platform
-Bundle-Name = Rhino Debugger
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/about.html b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/about.html
deleted file mode 100755
index b4a1c56..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>March 10, 2010</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/build.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/build.properties
deleted file mode 100644
index 04fa2df..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/build.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               about.html,\
-               OSGI-INF/l10n/bundle.properties
-src.includes = about.html
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/Breakpoint.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/Breakpoint.java
deleted file mode 100644
index 3ebb1bb..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/Breakpoint.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.util.HashMap;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-
-/**
- * Implementation of a breakpoint wrt Rhino debugging
- * 
- * @since 1.0
- */
-public class Breakpoint {
-
-	final Long breakpointId;
-	final ScriptSource script;
-	final Integer lineNumber;
-	final Object functionName;
-	final String condition;
-	final Long threadId;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param breakpointId the id for the breakpoint
-	 * @param script the script the breakpoint applies to, <code>null</code> is not accepted
-	 * @param lineNumber the line number for the breakpoint
-	 * @param functionName the name of the function the breakpoint is set on, <code>null</code> is accepted
-	 * @param condition the condition for the breakpoint, <code>null</code> is accepted
-	 * @param threadId the id of the thread the breakpoint is for
-	 */
-	public Breakpoint(Long breakpointId, ScriptSource script, Integer lineNumber, String functionName, String condition, Long threadId) {
-		if (script == null) {
-			throw new IllegalArgumentException("The parent script cannot be null"); //$NON-NLS-1$
-		}
-		this.breakpointId = breakpointId;
-		this.script = script;
-		this.lineNumber = lineNumber;
-		this.functionName = functionName;
-		this.condition = condition;
-		this.threadId = threadId;
-	}
-
-	/**
-	 * @return the breakpoint as a JSON entry
-	 */
-	public Object toJSON() {
-		HashMap result = new HashMap();
-		result.put(JSONConstants.BREAKPOINT_ID, breakpointId);
-		result.put(JSONConstants.SCRIPT_ID, script.getId());
-		if (lineNumber != null) {
-			result.put(JSONConstants.LINE, lineNumber);
-		}
-		if (functionName != null) {
-			result.put(JSONConstants.FUNCTION, functionName);
-		}
-		if (condition != null) {
-			result.put(JSONConstants.CONDITION, condition);
-		}
-		if (threadId != null) {
-			result.put(JSONConstants.THREAD_ID, threadId);
-		}
-		return result;
-	}
-
-	/**
-	 * Deletes the breakpoint from the script it is associated with. Does
-	 * not clear any of the handle information so the deleted breakpoint can be 
-	 * returned as an event if required.
-	 */
-	public void delete() {
-		this.script.removeBreakpoint(this);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ContextData.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ContextData.java
deleted file mode 100644
index 1d609cc..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ContextData.java
+++ /dev/null
@@ -1,369 +0,0 @@
-/*******************************************************************************
- * 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.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.EventPacket;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link ContextData}
- * 
- * @since 1.0
- */
-public class ContextData {
-	private static final int CONTEXT_RUNNING = 0;
-	private static final int CONTEXT_SUSPENDED = 1;
-
-	private static final int STEP_CONTINUE = 0;
-	private static final int STEP_IN = 1;
-	private static final int STEP_NEXT = 2;
-	private static final int STEP_OUT = 4;
-
-	private final Long threadId;
-	private final Long contextId;
-	private final RhinoDebuggerImpl debugger;
-
-	private final LinkedList frames = new LinkedList();
-
-	private int contextState = CONTEXT_RUNNING;
-	private int stepState = STEP_CONTINUE;
-	private StackFrame stepFrame;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param threadId
-	 * @param contextId
-	 * @param debugger
-	 */
-	public ContextData(Long threadId, Long contextId, RhinoDebuggerImpl debugger) {
-		this.threadId = threadId;
-		this.contextId = contextId;
-		this.debugger = debugger;
-	}
-
-	/**
-	 * Returns the unique id of this context data
-	 * 
-	 * @return the unique id
-	 */
-	public Long getId() {
-		return contextId;
-	}
-
-	/**
-	 * Returns the live list of {@link DebugFrame}s from this context
-	 * 
-	 * @return the live list of {@link DebugFrame}s
-	 */
-	public synchronized List getFrameIds() {
-		List result = new ArrayList();
-		for (Iterator iterator = frames.iterator(); iterator.hasNext();) {
-			result.add(((StackFrame) iterator.next()).getId());
-		}
-		return result;
-	}
-
-	/**
-	 * Returns the {@link DebugFrame} with the given id or <code>null</code> if no such {@link DebugFrame} exists
-	 * 
-	 * @param frameId
-	 * @return the {@link DebugFrame} with the given id or <code>null</code>
-	 */
-	public synchronized StackFrame getFrame(Long frameId) {
-		StackFrame frame = null;
-		for (Iterator iterator = frames.iterator(); iterator.hasNext();) {
-			frame = (StackFrame) iterator.next();
-			if (frame.getId().equals(frameId)) {
-				return frame;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Adds the given frame to the top of the frame stack and sends out a break event as needed
-	 * 
-	 * @param frame
-	 * @param script
-	 * @param lineNumber
-	 * @param functionName
-	 */
-	public synchronized void pushFrame(StackFrame frame, ScriptSource script, Integer lineNumber, String functionName) {
-		frames.addFirst(frame);
-		Breakpoint breakpoint = script.getBreakpoint(lineNumber, functionName);
-		boolean isStepBreak = stepBreak(STEP_IN);
-		if (isStepBreak || breakpoint != null) {
-			if (sendBreakEvent(script, frame.getLineNumber(), functionName, breakpoint, isStepBreak, false)) {
-				suspendState();
-			}
-		}
-	}
-
-	/**
-	 * Returns if the step operation should cause a break
-	 * 
-	 * @param step
-	 * @return true if the operation should break false otherwise
-	 */
-	private boolean stepBreak(int step) {
-		return ((0 != (step & stepState)) && (stepFrame == null || stepFrame == frames.getFirst()));
-	}
-
-	/**
-	 * Suspends the state via {@link #wait()}
-	 */
-	private void suspendState() {
-		contextState = CONTEXT_SUSPENDED;
-		while (contextState == CONTEXT_SUSPENDED) {
-			try {
-				wait();
-			} catch (InterruptedException e) {
-				e.printStackTrace();
-			}
-		}
-	}
-
-	/**
-	 * Removes the first {@link DebugFrame} from the current stack
-	 * 
-	 * @param byThrow
-	 * @param resultOrException
-	 */
-	public synchronized void popFrame(boolean byThrow, Object resultOrException) {
-		if(!frames.isEmpty()) {
-			StackFrame frame = (StackFrame) frames.removeFirst();
-			if (stepFrame == frame) {
-				stepFrame = null;
-				stepState = STEP_OUT;
-			}
-				
-			boolean isStepBreak = stepBreak(STEP_IN | STEP_OUT);
-			if (isStepBreak) {
-				frame = getTopFrame();
-				if (frame != null && sendBreakEvent(frame.getScript(), frame.getLineNumber(), null, null, isStepBreak, false)) {
-					suspendState();
-				}
-			}
-		}
-	}
-
-	/**
-	 * Resume the state with the given step type
-	 * 
-	 * @param stepType
-	 */
-	public synchronized void resume(String stepType) {
-		try {
-			if (stepType == null) {
-				stepState = STEP_CONTINUE;
-				stepFrame = null;
-			} else if (stepType.equals(JSONConstants.STEP_IN)) {
-				stepState = STEP_IN;
-				stepFrame = null;
-			} else if (stepType.equals(JSONConstants.STEP_NEXT)) {
-				stepState = STEP_NEXT;
-				stepFrame = getTopFrame();
-			} else if (stepType.equals(JSONConstants.STEP_OUT)) {
-				if (frames.size() > 1) {
-					stepState = STEP_OUT;
-					stepFrame = (StackFrame) frames.get(1);
-				} else {
-					stepState = STEP_CONTINUE;
-					stepFrame = null;
-				}
-			} else if (stepType.equals(JSONConstants.STEP_ANY)) {
-				stepState = STEP_IN | STEP_OUT | STEP_NEXT;
-				stepFrame = null;
-			} else {
-				throw new IllegalStateException("bad stepType: " + stepType); //$NON-NLS-1$
-			}
-		}
-		finally {
-			contextState = CONTEXT_RUNNING;
-			notifyAll();
-		}
-	}
-
-	/**
-	 * Returns the top stack frame iff there are frames.
-	 * Delegate method to prevent {@link NoSuchElementException}s
-	 * 
-	 * @return the top frame or <code>null</code>
-	 */
-	private StackFrame getTopFrame() {
-		if(this.frames != null && !this.frames.isEmpty()) {
-			return (StackFrame) this.frames.getFirst();
-		}
-		return null;
-	}
-	
-	/**
-	 * Set the step state to the suspend equivalent
-	 */
-	public synchronized void suspend() {
-		stepState = STEP_IN | STEP_NEXT | STEP_OUT;
-		stepFrame = null;
-	}
-
-	/**
-	 * Handles a <code>debugger;</code> statement
-	 * 
-	 * @param script
-	 * @param lineNumber
-	 */
-	public synchronized void debuggerStatement(ScriptSource script, Integer lineNumber) {
-		Breakpoint breakpoint = script.getBreakpoint(lineNumber, null);
-		boolean isStepBreak = stepBreak(STEP_IN | STEP_NEXT);
-		if (sendBreakEvent(script, lineNumber, null, breakpoint, isStepBreak, true)) {
-			suspendState();
-		}
-	}
-
-	/**
-	 * Handles a line change
-	 * 
-	 * @param script
-	 * @param lineNumber
-	 */
-	public synchronized void lineChange(ScriptSource script, Integer lineNumber) {
-		Breakpoint breakpoint = script.getBreakpoint(lineNumber, null);
-		boolean isStepBreak = stepBreak(STEP_IN | STEP_NEXT);
-		if (isStepBreak || breakpoint != null) {
-			if (sendBreakEvent(script, lineNumber, null, breakpoint, isStepBreak, false)) {
-				suspendState();
-			}
-		}
-	}
-
-	/**
-	 * Handles forwarding an exception event
-	 * 
-	 * @param ex
-	 */
-	public synchronized void exceptionThrown(Throwable ex) {
-		StackFrame frame = getTopFrame();
-		if (sendExceptionEvent(frame.getScript(), frame.getLineNumber(), ex)) {
-			suspendState();
-		}
-	}
-
-	/**
-	 * Sends a JSON message for an exception that has occurred
-	 * 
-	 * @param script
-	 * @param lineNumber
-	 * @param ex
-	 * @return true if the message was sent successfully, false otherwise
-	 */
-	private boolean sendExceptionEvent(ScriptSource script, Integer lineNumber, Throwable ex) {
-		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());
-		return debugger.sendEvent(exceptionEvent);
-	}
-
-	/**
-	 * Sends a JSON message for a break event
-	 * 
-	 * @param script
-	 * @param lineNumber
-	 * @param functionName
-	 * @param breakpoint
-	 * @param isStepBreak
-	 * @param isDebuggerStatement
-	 * @return true if the message was sent successfully, false otherwise
-	 */
-	private boolean sendBreakEvent(ScriptSource script, Integer lineNumber, String functionName, Breakpoint breakpoint, boolean isStepBreak, boolean isDebuggerStatement) {
-		EventPacket breakEvent = new EventPacket(JSONConstants.BREAK);
-		Map body = breakEvent.getBody();
-		body.put(JSONConstants.THREAD_ID, threadId);
-		body.put(JSONConstants.CONTEXT_ID, contextId);
-		body.put(JSONConstants.SCRIPT_ID, script.getId());
-		if (functionName != null) {
-			body.put(JSONConstants.FUNCTION_NAME, functionName);
-		}
-		body.put(JSONConstants.LINE_NUMBER, lineNumber);
-		if (breakpoint != null) {
-			body.put(JSONConstants.BREAKPOINT, breakpoint.breakpointId);
-		}
-
-		if (isStepBreak) {
-			String stepType;
-			if (stepState == STEP_IN) {
-				stepType = JSONConstants.STEP_IN;
-			} else if (stepState == STEP_NEXT) {
-				stepType = JSONConstants.STEP_NEXT;
-			} else if (stepState == STEP_OUT) {
-				stepType = JSONConstants.STEP_OUT;
-			} else {
-				stepType = JSONConstants.SUSPEND;
-			}
-			body.put(JSONConstants.STEP, stepType);
-			stepState = 0;
-		}
-
-		body.put(JSONConstants.DEBUGGER_STATEMENT, Boolean.valueOf(isDebuggerStatement));
-		return debugger.sendEvent(breakEvent);
-	}
-
-	/**
-	 * Handles a script load event
-	 * 
-	 * @param script
-	 */
-	public synchronized void scriptLoaded(ScriptSource script) {
-		if (sendScriptEvent(script)) {
-			suspendState();
-		}
-	}
-
-	/**
-	 * Send a JSON message for a script event
-	 * 
-	 * @param script
-	 * @return
-	 */
-	private boolean sendScriptEvent(ScriptSource script) {
-		EventPacket scriptEvent = new EventPacket(JSONConstants.SCRIPT);
-		Map body = scriptEvent.getBody();
-		body.put(JSONConstants.THREAD_ID, threadId);
-		body.put(JSONConstants.CONTEXT_ID, contextId);
-		body.put(JSONConstants.SCRIPT_ID, script.getId());
-		return debugger.sendEvent(scriptEvent);
-	}
-
-	/**
-	 * Returns the string representation of the state
-	 * 
-	 * @return the state text
-	 */
-	public synchronized String getState() {
-		return contextState == CONTEXT_RUNNING ? JSONConstants.RUNNING : JSONConstants.SUSPENDED;
-	}
-
-	/**
-	 * Returns the underlying thread id
-	 * 
-	 * @return the underlying thread id
-	 */
-	public Long getThreadId() {
-		return threadId;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/DebugSessionManager.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/DebugSessionManager.java
deleted file mode 100644
index 2ea8891..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/DebugSessionManager.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.io.IOException;
-import java.text.DateFormat;
-import java.util.Calendar;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.Connection;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.DebugSession;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.EventPacket;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.Request;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.Response;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.SocketTransportService;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.TimeoutException;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.TransportService;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.TransportService.ListenerKey;
-
-/**
- * Delegate for {@link DebugSession} communication
- * 
- * @since 1.1
- */
-public class DebugSessionManager {
-
-	public class DebugSessionThread extends Thread {
-
-		private ListenerKey listenerKey;
-		private Connection connection;
-		private RequestHandler requestHandler;
-
-		public DebugSessionThread(String name, RhinoDebuggerImpl debugger) {
-			super(name);
-			requestHandler = new RequestHandler(debugger);
-		}
-
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see java.lang.Runnable#run()
-		 */
-		public void run() {
-			try {
-				listenerKey = transportService.startListening(address);
-				while (!shutdown) {
-					try {
-						acceptConnection(10000);
-					} catch (IOException e) {
-						if (connection == null) {
-							continue;
-						}
-					}
-					while (!shutdown && connection.isOpen()) {
-						try {
-							Request request = debugSession.receiveRequest(1000);
-							if (DEBUG)
-								System.out.println(request);
-							Response response = requestHandler.handleRequest(request);
-							if (DEBUG)
-								System.out.println(response);
-							debugSession.sendResponse(response);
-						} catch (TimeoutException e) {
-							// ignore
-						} catch (DisconnectedException e) {
-							break;
-						}
-					}
-					closeConnection();
-				}
-			} catch (IOException e) {
-				sendDeathEvent();
-				/* e.printStackTrace(); */
-			} finally {
-				try {
-					if (listenerKey != null)
-						transportService.stopListening(listenerKey);
-				} catch (IOException e) {
-					sendDeathEvent();
-					/* e.printStackTrace(); */
-				}
-			}
-		}
-
-		/**
-		 * Close the active connection
-		 * 
-		 * @throws IOException
-		 */
-		private void closeConnection() throws IOException {
-			if (connection != null) {
-				setDebugSession(null);
-				connection.close();
-				connection = null;
-			}
-		}
-
-		/**
-		 * Waits for a connection for the given timeout
-		 * 
-		 * @param timeout
-		 * @throws IOException
-		 */
-		private void acceptConnection(long timeout) throws IOException {
-			if (connection == null) {
-				connection = transportService.accept(listenerKey, timeout, timeout);
-				setDebugSession(new DebugSession(connection));
-			}
-		}
-
-	}
-
-	private static final boolean DEBUG = false;
-	
-	private static final String ADDRESS = "address"; //$NON-NLS-1$
-	private static final String SOCKET = "socket"; //$NON-NLS-1$
-	private static final String TRANSPORT = "transport"; //$NON-NLS-1$
-
-	private final TransportService transportService;
-	private final String address;
-	private final boolean startSuspended;
-
-	private DebugSession debugSession;
-	private Thread debuggerThread;
-	private volatile boolean shutdown = false;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param transportService
-	 * @param address
-	 * @param startSuspended
-	 */
-	public DebugSessionManager(TransportService transportService, String address, boolean startSuspended) {
-		this.transportService = transportService;
-		this.address = address;
-		this.startSuspended = startSuspended;
-		prettyPrintHeader();
-	}
-
-	/**
-	 * Creates a new session manager
-	 * 
-	 * @param configString
-	 * @return
-	 */
-	static DebugSessionManager create(String configString) {
-		Map config = parseConfigString(configString);
-		String transport = (String) config.get(TRANSPORT);
-		if (!SOCKET.equals(transport)) {
-			throw new IllegalArgumentException("Transport service must be 'socket': " + transport); //$NON-NLS-1$
-		}
-		TransportService parsedTransportService = new SocketTransportService();
-		String parsedAddress = (String) config.get(ADDRESS);
-		String suspend = (String) config.get(JSONConstants.SUSPEND);
-		boolean parsedStartSuspended = false;
-		if (suspend != null) {
-			parsedStartSuspended = (Boolean.valueOf(suspend).booleanValue() || suspend.trim().equalsIgnoreCase("y")); //$NON-NLS-1$
-		}
-		return new DebugSessionManager(parsedTransportService, parsedAddress, parsedStartSuspended);
-	}
-
-	/**
-	 * Parses the command line configuration string
-	 * 
-	 * @param configString
-	 * @return the map of command line arguments
-	 */
-	private static Map parseConfigString(String configString) {
-		Map config = new HashMap();
-		StringTokenizer tokenizer = new StringTokenizer(configString, ","); //$NON-NLS-1$
-		while (tokenizer.hasMoreTokens()) {
-			String token = tokenizer.nextToken();
-			int equalsIndex = token.indexOf('=');
-			if (equalsIndex == -1)
-				config.put(token, null);
-			else
-				config.put(token.substring(0, equalsIndex), token.substring(equalsIndex + 1));
-		}
-		return config;
-	}
-
-	/**
-	 * Pretty print the header for the debugger
-	 * 
-	 * @since 1.1
-	 */
-	private void prettyPrintHeader() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("Rhino attaching debugger\n"); //$NON-NLS-1$
-		buffer.append("Start at time: ").append(getStartAtDate()); //$NON-NLS-1$
-		buffer.append("\nListening to "); //$NON-NLS-1$
-		buffer.append(this.transportService instanceof SocketTransportService ? "socket on " : "transport service on "); //$NON-NLS-1$ //$NON-NLS-2$
-		buffer.append("port: ").append(this.address); //$NON-NLS-1$
-		if (startSuspended) {
-			buffer.append("\nStarted suspended - waiting for client resume..."); //$NON-NLS-1$
-		}
-		System.out.println(buffer.toString());
-	}
-
-	/**
-	 * Returns the formatted date
-	 * 
-	 * @return the formatted date
-	 * @see http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4981314
-	 * @since 1.1
-	 */
-	String getStartAtDate() {
-		try {
-			return DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG).format(Calendar.getInstance().getTime());
-		} catch (Throwable t) {
-			return "<unknown>"; //$NON-NLS-1$
-		}
-	}
-
-	/**
-	 * @return true if the <code>suspend=true</code> command line argument is
-	 *         set
-	 */
-	public boolean isStartSuspended() {
-		return startSuspended;
-	}
-
-	/**
-	 * Returns if a {@link DebugSession} has successfully connected to this
-	 * debugger.
-	 * 
-	 * @return <code>true</code> if the debugger has a connected
-	 *         {@link DebugSession} <code>false</code> otherwise
-	 */
-	public synchronized boolean isConnected() {
-		return debugSession != null;
-	}
-
-	/**
-	 * Starts the debugger
-	 */
-	public synchronized void start(RhinoDebuggerImpl debugger) {
-		debuggerThread = new DebugSessionThread("RhinoDebugger - Request Handler", debugger); //$NON-NLS-1$
-		debuggerThread.start();
-		if (startSuspended) {
-			try {
-				wait(300000);
-			} catch (InterruptedException e) {
-				/* e.printStackTrace(); */
-			}
-			// TODO: We might want to check if debugSession is null and if so
-			// call "stop" and throw an exception
-		}
-	}
-
-	/**
-	 * Stops the debugger
-	 */
-	public synchronized void stop() {
-		shutdown = true;
-		try {
-			debuggerThread.interrupt();
-			if (debuggerThread.isAlive())
-				wait();
-			debuggerThread.join();
-		} catch (InterruptedException e) {
-			/* e.printStackTrace(); */
-		}
-	}
-
-	private synchronized void setDebugSession(DebugSession session) {
-		if (debugSession != session) {
-			if (debugSession != null) {
-				debugSession.dispose();
-			}
-			debugSession = session;
-			notify();
-		}
-	}
-
-	/**
-	 * Sends the given {@link EventPacket} using the underlying
-	 * {@link DebugRuntime} and returns if it was sent successfully
-	 * 
-	 * @param event
-	 * @return true if the event was sent successfully, false otherwise
-	 */
-	public synchronized boolean sendEvent(EventPacket event) {
-		try {
-			if (debugSession != null) {
-				if (DEBUG)
-					System.out.println(event);
-				debugSession.sendEvent(event);
-				return true;
-			}
-		} catch (DisconnectedException e) {
-			e.printStackTrace();
-		}
-		return false;
-	}
-
-	/**
-	 * Sends out an event that the debugger has died in an unexpected way.
-	 * Debugger death can result from:
-	 * <ul>
-	 * <li>an {@link IOException} while the debugger is running</li>
-	 * <li>an {@link InterruptedException} processing I/O</li>
-	 * </ul>
-	 */
-	private void sendDeathEvent() {
-		EventPacket event = new EventPacket(JSONConstants.VMDEATH);
-		sendEvent(event);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/FunctionSource.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/FunctionSource.java
deleted file mode 100644
index 2f207199..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/FunctionSource.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.debugger;
-
-
-/**
- * Handle for a {@link DebuggableScript} function
- * 
- * @since 1.0
- */
-public class FunctionSource {
-	
-	final ScriptSource parent;
-	final String name;
-	String source;
-	final int linenumber;
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param script the parent - cannot be <code>null</code>
-	 * @param name the name of the function - can be <code>null</code>
-	 * @param source the underlying source for the function - can be <code>null</code>
-	 */
-	public FunctionSource(ScriptSource script, String name, String source, int linenumber) {
-		if(script == null) {
-			throw new IllegalArgumentException("The parent script cannot be null"); //$NON-NLS-1$
-		}
-		this.parent = script;
-		this.name = name;
-		this.source = source;
-		this.linenumber = linenumber;
-	}
-
-	/**
-	 * @return the parent {@link ScriptSource} this function appears in
-	 */
-	public ScriptSource parent() {
-		return this.parent;
-	}
-	
-	/**
-	 * @return the name of the function
-	 */
-	public String name() {
-		return this.name; 
-	}
-	
-	/**
-	 * @return the source for the function
-	 */
-	public String source() {
-		return this.source;
-	}
-	
-	/**
-	 * Sets the underlying source to the given string
-	 * 
-	 * @param source the new source
-	 */
-	public void setSource(String source) {
-		this.source = source;
-	}
-	
-	/**
-	 * @return the line number this function appears on
-	 */
-	public int linenumber() {
-		return this.linenumber;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("FunctionSource: [name - ").append(this.name).append("] [linenumber - ").append(linenumber).append("]\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		buffer.append("\tparent: ").append(parent.getLocation()); //$NON-NLS-1$
-		buffer.append("\tsource: ").append(this.source).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/LineData.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/LineData.java
deleted file mode 100644
index 1e81c5d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/LineData.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.debugger;
-
-/**
- * Class to hold information about a given line such as:
- * <ul>
- * <li>FunctionSource at the line</li>
- * <li>Breakpoint set on the line</li>
- * </ul>
- * @since 1.0
- */
-public class LineData {
-
-	Breakpoint breakpoint = null;
-	FunctionSource function = null;
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/RequestHandler.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/RequestHandler.java
deleted file mode 100644
index 51199e0..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/RequestHandler.java
+++ /dev/null
@@ -1,454 +0,0 @@
-/*******************************************************************************
- * 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.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.Request;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.Response;
-
-/**
- * Rhino request handler used to craft response bodies for given JSON requests
- * 
- * @since 1.0
- */
-public class RequestHandler {
-
-	public static final String VERSION_1_6 = "1.6"; //$NON-NLS-1$
-	private RhinoDebuggerImpl debugger;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param debugger
-	 */
-	public RequestHandler(RhinoDebuggerImpl debugger) {
-		this.debugger = debugger;
-	}
-
-	/**
-	 * Handles a general request - delegating to the correct command type
-	 * 
-	 * @param request
-	 * @return
-	 */
-	public Response handleRequest(Request request) {
-		String command = request.getCommand();
-		Response response = new Response(request.getSequence(), command);
-		try {
-			if (command.equals(JSONConstants.VERSION)) {
-				handleVersionRequest(request, response);
-			} else if (command.equals(JSONConstants.SUSPEND)) {
-				handleSuspendRequest(request, response);
-			} else if (command.equals(JSONConstants.CONTINUE)) {
-				handleContinueRequest(request, response);
-			} else if (command.equals(JSONConstants.DISPOSE)) {
-				handleDisposeRequest(request, response);
-			} else if (command.equals(JSONConstants.THREADS)) {
-				handleThreadsRequest(request, response);
-			} else if (command.equals(JSONConstants.THREAD)) {
-				handleThreadRequest(request, response);
-			} else if (command.equals(JSONConstants.FRAMES)) {
-				handleFramesRequest(request, response);
-			} else if (command.equals(JSONConstants.FRAME)) {
-				handleFrameRequest(request, response);
-			} else if (command.equals(JSONConstants.SCRIPTS)) {
-				handleScriptsRequest(request, response);
-			} else if (command.equals(JSONConstants.SCRIPT)) {
-				handleScriptRequest(request, response);
-			} else if (command.equals(JSONConstants.EVALUATE)) {
-				handleEvaluateRequest(request, response);
-			} else if (command.equals(JSONConstants.LOOKUP)) {
-				handleLookupRequest(request, response);
-			} else if (command.equals(JSONConstants.BREAKPOINTS)) {
-				handleBreakpointsRequest(request, response);
-			} else if (command.equals(JSONConstants.BREAKPOINT)) {
-				handleBreakpointRequest(request, response);
-			} else if (command.equals(JSONConstants.SETBREAKPOINT)) {
-				handleSetBreakpointRequest(request, response);
-			} else if (command.equals(JSONConstants.CLEARBREAKPOINT)) {
-				handleClearBreakpointRequest(request, response);
-			} else {
-				response.setSuccess(false);
-				response.setMessage("command not supported"); //$NON-NLS-1$
-			}
-		} catch (Throwable t) {
-			response.setSuccess(false);
-			response.setMessage(t.getClass().getName() + " - " + t.getMessage()); //$NON-NLS-1$
-			t.printStackTrace();
-		}
-		return response;
-	}
-
-	/**
-	 * Handles a clear breakpoint request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleClearBreakpointRequest(Request request, Response response) {
-		Map arguments = request.getArguments();
-		Long breakpointId = numberToLong((Number) arguments.get(JSONConstants.BREAKPOINT_ID));
-		if (breakpointId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.BREAKPOINT_ID));
-			return;
-		}
-		Breakpoint breakpoint = debugger.clearBreakpoint(breakpointId);
-		if (breakpoint == null) {
-			response.setSuccess(false);
-			response.setMessage(JSONConstants.NOT_FOUND);
-			return;
-		}
-		response.getBody().put(JSONConstants.BREAKPOINT, breakpoint.toJSON());
-	}
-
-	/**
-	 * Handles a set breakpoint request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleSetBreakpointRequest(Request request, Response response) {
-		Map arguments = request.getArguments();
-		Long scriptId = numberToLong((Number) arguments.get(JSONConstants.SCRIPT_ID));
-		Integer line = numberToInteger((Number) arguments.get(JSONConstants.LINE));
-		String function = (String) arguments.get(JSONConstants.FUNCTION);
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		String condition = (String) arguments.get(JSONConstants.CONDITION);
-		Breakpoint breakpoint = debugger.setBreakpoint(scriptId, line, function, condition, threadId);
-		if(breakpoint != null) {
-			response.getBody().put(JSONConstants.BREAKPOINT, breakpoint.toJSON());
-		}
-	}
-
-	/**
-	 * Handles a breakpoint request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleBreakpointRequest(Request request, Response response) {
-		Map arguments = request.getArguments();
-		Long breakpointId = numberToLong((Number) arguments.get(JSONConstants.BREAKPOINT_ID));
-		if (breakpointId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.BREAKPOINT_ID));
-			return;
-		}
-		Breakpoint breakpoint = debugger.getBreakpoint(breakpointId);
-		if (breakpoint == null) {
-			response.setSuccess(false);
-			response.setMessage(JSONConstants.NOT_FOUND);
-			return;
-		}
-		response.getBody().put(JSONConstants.BREAKPOINT, breakpoint.toJSON());
-	}
-
-	/**
-	 * Handles a breakpoints request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleBreakpointsRequest(Request request, Response response) {
-		Collection breakpoints = debugger.getBreakpoints();
-		response.getBody().put(JSONConstants.BREAKPOINTS, breakpoints);
-	}
-
-	/**
-	 * Handles an evaluate request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleEvaluateRequest(Request request, Response response) {
-		Map arguments = request.getArguments();
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		if (threadId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.THREAD_ID));
-			return;
-		}
-		Long frameId = numberToLong((Number) arguments.get(JSONConstants.FRAME_ID));
-		if (frameId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.FRAME_ID));
-			return;
-		}
-		String evaluate = (String) arguments.get(JSONConstants.EXPRESSION);
-		if (evaluate == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.EXPRESSION));
-			return;
-		}
-		StackFrame frame = debugger.getFrame(threadId, frameId);
-		if (frame == null) {
-			response.setSuccess(false);
-			response.setMessage(JSONConstants.NOT_FOUND);
-			return;
-		}
-		Object result = frame.evaluate(evaluate);
-		response.getBody().put(JSONConstants.EVALUATE, result);
-	}
-
-	/**
-	 * Handles a lookup request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleLookupRequest(Request request, Response response) {
-		Map arguments = request.getArguments();
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		if (threadId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.THREAD_ID));
-			return;
-		}
-		Long frameId = numberToLong((Number) arguments.get(JSONConstants.FRAME_ID));
-		if (frameId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.FRAME_ID));
-			return;
-		}
-		Long handle = numberToLong((Number) arguments.get(JSONConstants.HANDLE));
-		if (handle == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.HANDLE));
-			return;
-		}
-		StackFrame frame = debugger.getFrame(threadId, frameId);
-		if (frame == null) {
-			response.setSuccess(false);
-			response.setMessage(JSONConstants.NOT_FOUND);
-			return;
-		}
-		Object result = frame.lookup(handle);
-		response.getBody().put(JSONConstants.LOOKUP, result);
-	}
-
-	/**
-	 * Handles a script request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleScriptRequest(Request request, Response response) {
-		Map arguments = request.getArguments();
-		Long scriptId = numberToLong((Number) arguments.get(JSONConstants.SCRIPT_ID));
-		if (scriptId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.SCRIPT_ID));
-			return;
-		}
-		ScriptSource script = debugger.getScript(scriptId);
-		if (script == null) {
-			response.setSuccess(false);
-			response.setMessage(JSONConstants.NOT_FOUND);
-			return;
-		}
-		response.getBody().put(JSONConstants.SCRIPT, script.toJSON());
-	}
-
-	/**
-	 * Handles a scripts request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleScriptsRequest(Request request, Response response) {
-		List scriptIds = debugger.getScriptIds();
-		response.getBody().put(JSONConstants.SCRIPTS, scriptIds);
-	}
-
-	/**
-	 * Handles a frame request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleFrameRequest(Request request, Response response) {
-		Map arguments = request.getArguments();
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		if (threadId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.THREAD_ID));
-			return;
-		}
-		Long frameId = numberToLong((Number) arguments.get(JSONConstants.FRAME_ID));
-		if (frameId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.FRAME_ID));
-			return;
-		}
-		StackFrame frame = debugger.getFrame(threadId, frameId);
-		if (frame == null) {
-			response.setSuccess(false);
-			response.setMessage(JSONConstants.NOT_FOUND);
-			return;
-		}
-		response.getBody().put(JSONConstants.FRAME, frame.toJSON());
-	}
-
-	/**
-	 * Handles a frames request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleFramesRequest(Request request, Response response) {
-		Map arguments = request.getArguments();
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		if (threadId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.THREAD_ID));
-			return;
-		}
-		List frameIds = debugger.getFrameIds(threadId);
-		response.getBody().put(JSONConstants.FRAMES, frameIds);
-	}
-
-	/**
-	 * Handles a thread request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleThreadRequest(Request request, Response response) {
-		Map arguments = request.getArguments();
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		if (threadId == null) {
-			response.setSuccess(false);
-			response.setMessage(missingArgument(JSONConstants.THREAD_ID));
-			return;
-		}
-		ThreadData threadData = debugger.getThreadData(threadId);
-		if (threadData == null) {
-			response.setSuccess(false);
-			response.setMessage(JSONConstants.NOT_FOUND);
-			return;
-		}
-		response.getBody().put(JSONConstants.THREAD, threadData.toJSON());
-	}
-
-	/**
-	 * Reports a missing argument
-	 * 
-	 * @param key
-	 * @return
-	 */
-	private String missingArgument(String key) {
-		// TODO NLS this
-		return "Missing Argument: "+key; //$NON-NLS-1$
-	}
-
-	/**
-	 * Handles a threads request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleThreadsRequest(Request request, Response response) {
-		List threadIds = debugger.getThreadIds();
-		response.getBody().put(JSONConstants.THREADS, threadIds);
-	}
-
-	/**
-	 * Handles a dispose request by disconnecting the underlying {@link RhinoDebuggerImpl}
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleDisposeRequest(Request request, Response response) {
-		debugger.disconnect();
-	}
-
-	/**
-	 * Handles a continue request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleContinueRequest(Request request, Response response) {
-		Map arguments = request.getArguments();
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		if (threadId == null) {
-			debugger.resumeAll();
-			return;
-		}
-		String stepType = (String) arguments.get(JSONConstants.STEP);
-		debugger.resume(threadId, stepType);
-	}
-
-	/**
-	 * Handles a suspend request
-	 * 
-	 * @param request
-	 * @param response
-	 */
-	private void handleSuspendRequest(Request request, Response response) {
-		Map arguments = request.getArguments();
-		Long threadId = numberToLong((Number) arguments.get(JSONConstants.THREAD_ID));
-		if (threadId == null) {
-			debugger.suspendAll();
-			return;
-		}
-		debugger.suspend(threadId);
-	}
-
-	/**
-	 * Wrappers the given {@link Number} as a {@link Long}
-	 * 
-	 * @param number
-	 * @return a new {@link Long}
-	 */
-	private static Long numberToLong(Number number) {
-		if (number == null)
-			return null;
-		return new Long(number.longValue());
-	}
-
-	/**
-	 * Wrappers the given {@link Number} as an {@link Integer}
-	 * 
-	 * @param number
-	 * @return a new {@link Integer}
-	 */
-	private Integer numberToInteger(Number number) {
-		if (number == null) {
-			return null;
-		}
-		return new Integer(number.intValue());
-	}
-
-	/**
-	 * Appends version infos to the given response body
-	 * 
-	 * @param request
-	 * @param response
-	 * 
-	 * @see JSONConstants#ECMASCRIPT_VERSION
-	 * @see JSONConstants#JAVASCRIPT_VERSION
-	 * @see JSONConstants#VM_NAME
-	 * @see JSONConstants#VM_VENDOR
-	 * @see JSONConstants#VM_VERSION
-	 */
-	private void handleVersionRequest(Request request, Response response) {
-		Map body = response.getBody();
-		body.put(JSONConstants.JAVASCRIPT_VERSION, VERSION_1_6);
-		body.put(JSONConstants.ECMASCRIPT_VERSION, "3"); //$NON-NLS-1$
-		body.put(JSONConstants.VM_NAME, "Rhino"); //$NON-NLS-1$
-		body.put(JSONConstants.VM_VERSION, VERSION_1_6);
-		body.put(JSONConstants.VM_VENDOR, "Mozilla"); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/RhinoDebuggerImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/RhinoDebuggerImpl.java
deleted file mode 100644
index ea66902..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/RhinoDebuggerImpl.java
+++ /dev/null
@@ -1,532 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 2010 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.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.io.File;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.EventPacket;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONUtil;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.TransportService;
-import org.mozilla.javascript.Context;
-import org.mozilla.javascript.ContextFactory;
-import org.mozilla.javascript.debug.DebugFrame;
-import org.mozilla.javascript.debug.DebuggableScript;
-import org.mozilla.javascript.debug.Debugger;
-
-/**
- * Rhino implementation of {@link Debugger}
- * <br><br>
- * Events fired:
- * <ul>
- * <li><b>Thread enter event</b> - when a new context is created see: {@link #contextCreated(Context)}</li>
- * <li><b>Thread exit event</b> - when a context is exited see: {@link #contextReleased(Context)}</li>
- * <li><b>VM death event</b> - if the debugger dies: this event can only be received if the underlying communication channel has not been interrupted</li>
- * </ul>
- * @since 1.0
- */
-public class RhinoDebuggerImpl implements Debugger, ContextFactory.Listener {
-
-	public static final DebuggableScript[] NO_SCRIPTS = new DebuggableScript[0];
-	private static final String RHINO_SCHEME = "rhino"; //$NON-NLS-1$
-	
-	private final Map threadToThreadId = new HashMap();
-	private final Map threadIdToData = new HashMap();
-	private final Map breakpoints = new HashMap();
-
-	private long currentThreadId = 0L;
-	private long currentBreakpointId = 0L;
-	private long currentScriptId = 0L;
-	private ArrayList disabledThreads = new ArrayList();
-
-	/**
-	 * Mapping of the URI string to the {@link ScriptSource}
-	 */
-	private HashMap/*<String, ScriptSource>*/ uriToScript = new HashMap();
-	/**
-	 * Mapping of the id to the {@link ScriptSource}
-	 */
-	private HashMap/*<Long, ScriptSource>*/ idToScript = new HashMap();
-
-	private final DebugSessionManager sessionManager;
-	
-	/**
-	 * This constructor will only accept a <code>transport</code> argument
-	 * of <code>socket</code>. I.e. <code>transport=socket</code>.<br><br>
-	 * 
-	 * To use a differing {@link TransportService} pleas use the other constructor:
-	 * {@link #RhinoDebugger(TransportService, String, boolean)}
-	 * 
-	 * @param configString the configuration string, for example: <code>transport=socket,suspend=y,address=9000</code>
-	 */
-	public RhinoDebuggerImpl(String configString) {
-		sessionManager = DebugSessionManager.create(configString);
-	}
-	
-	/**
-	 * This constructor allows you to specify a custom {@link TransportService} to use other than <code>socket</code>.
-	 * 
-	 * @param transportService the {@link TransportService} to use for debugger communication
-	 * @param address the address to communicate on
-	 * @param startSuspended if the debugger should wait while accepting a connection. The wait time for stating suspended is not indefinite, 
-	 * and is equal to 300000ms.
-	 */
-	public RhinoDebuggerImpl(TransportService transportService, String address, boolean startSuspended) {
-		sessionManager = new DebugSessionManager( transportService,  address,  startSuspended);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.debug.Debugger#getFrame(org.mozilla.javascript.Context, org.mozilla.javascript.debug.DebuggableScript)
-	 */
-	public synchronized DebugFrame getFrame(Context context, DebuggableScript debuggableScript) {
-		ScriptSource script = getScript(debuggableScript);
-		if(script != null && !script.isStdIn()) {
-			ContextData contextData = (ContextData) context.getDebuggerContextData();
-			ThreadData thread = (ThreadData) threadIdToData.get(contextData.getThreadId());
-			FunctionSource function = script.getFunction(debuggableScript);
-			return thread.getFrame(context, function, script);
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the root {@link ScriptSource} context
-	 * 
-	 * @param script
-	 * @return the root {@link ScriptSource} context
-	 */
-	private ScriptSource getScript(DebuggableScript script) {
-		synchronized (uriToScript) {
-			DebuggableScript root = script;
-			while (!root.isTopLevel()) {
-				root = root.getParent();
-			}
-			URI uri = getSourceUri(root, parseSourceProperties(root.getSourceName()));
-			if(uri != null) {
-				return (ScriptSource) uriToScript.get(uri);
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.debug.Debugger#handleCompilationDone(org.mozilla.javascript.Context, org.mozilla.javascript.debug.DebuggableScript, java.lang.String)
-	 */
-	public void handleCompilationDone(Context context, DebuggableScript script, String source) {
-		if (!script.isTopLevel()) {
-			return;
-		}
-		Map properties = parseSourceProperties(script.getSourceName());
-		URI uri = getSourceUri(script, properties);
-		if(uri == null) {
-			//if the source cannot be located don't load or notify
-			return;
-		}
-		final ScriptSource newscript = new ScriptSource(script, source, uri, script.isGeneratedScript(), properties);
-		synchronized (uriToScript) {
-			ScriptSource old = (ScriptSource) uriToScript.remove(uri);
-			Long id = null;
-			if(old != null) {
-				//recycle the id for a re-loaded script
-				//https://bugs.eclipse.org/bugs/show_bug.cgi?id=306832
-				id = old.getId();
-				idToScript.remove(old.getId());
-				newscript.clone(old);
-			}
-			else {
-				//a totally new script is loaded
-				id = scriptId();
-				newscript.setId(id);
-			}
-			uriToScript.put(uri, newscript);
-			idToScript.put(id, newscript);
-		}
-		ContextData contextData = (ContextData) context.getDebuggerContextData();
-		contextData.scriptLoaded(newscript);
-	}
-
-	/**
-	 * Composes a {@link URI} representing the path to the source of the given script
-	 * 
-	 * @param script the script to create a {@link URI} for
-	 * @param properties any special properties @see {@link #parseSourceProperties(String)}
-	 * @return the {@link URI} for the source or <code>null</code>
-	 */
-	private URI getSourceUri(DebuggableScript script, Map properties) {
-			String sourceName = script.getSourceName();
-			if(properties != null) {
-				String jsonName = (String) properties.get(JSONConstants.NAME);
-				if (jsonName != null)
-					sourceName = jsonName;
-			}
-			
-			// handle null sourceName
-			if (sourceName == null)
-				return null;
-			
-			// handle input from the Rhino Shell
-			if (sourceName.equals("<stdin>")) { //$NON-NLS-1$
-				sourceName = "stdin"; //$NON-NLS-1$
-			} else {		
-				// try to parse it as a file
-				File sourceFile = new File(sourceName);
-				if (sourceFile.exists())
-					return sourceFile.toURI();
-				
-				//try to just create a URI from the name
-				try {
-					return new URI(sourceName);
-				} catch(URISyntaxException e) {
-					//do nothing and fall through
-				}
-			}
-			
-			//fall back to creating a rhino specific URI from the script source name as a path
-			try {
-				if (! (sourceName.charAt(0) == '/'))
-					sourceName = "/" + sourceName; //$NON-NLS-1$
-				return new URI(RHINO_SCHEME, null, sourceName, null);
-			} catch (URISyntaxException e) {
-				return null;
-			}
-	}
-	
-	/**
-	 * Returns any special properties specified in the source name or <code>null</code>
-	 * 
-	 * @param sourceName
-	 * @return any special properties specified in the source name or <code>null</code>
-	 */
-	Map parseSourceProperties(String sourceName) {
-		if (sourceName != null && sourceName.charAt(0) == '{') {
-			try {
-				Object json = JSONUtil.read(sourceName);
-				if (json instanceof Map) {
-					return (Map) json;
-				}
-			} catch (RuntimeException e) {
-				// ignore
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the next script id to use
-	 * 
-	 * @return the next id
-	 */
-	synchronized Long scriptId() {
-		return new Long(currentScriptId++);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.ContextFactory.Listener#contextCreated(org.mozilla.javascript.Context)
-	 */
-	public synchronized void contextCreated(Context context) {
-		Thread thread = Thread.currentThread();
-		if (disabledThreads.contains(thread)) {
-			return;
-		}
-		Long threadId = (Long) threadToThreadId.get(thread);
-		if (threadId == null) {
-			threadId = new Long(currentThreadId++);
-			threadToThreadId.put(thread, threadId);
-		}
-		ThreadData threadData = (ThreadData) threadIdToData.get(threadId);
-		if (threadData == null) {
-			threadData = new ThreadData(threadId, this);
-			threadIdToData.put(threadId, threadData);
-			sendThreadEvent(JSONConstants.ENTER, threadId);
-		}
-		threadData.contextCreated(context);
-	}
-
-	/**
-	 * Sends a thread event for the given type
-	 * 
-	 * @param type the type of event to send
-	 * @param threadId the id of the thread the even is for
-	 * 
-	 * @see JSONConstants#ENTER
-	 * @see JSONConstants#EXIT
-	 */
-	private void sendThreadEvent(String type, Long threadId) {
-		EventPacket threadEvent = new EventPacket(JSONConstants.THREAD);
-		Map body = threadEvent.getBody();
-		body.put(JSONConstants.TYPE, type);
-		body.put(JSONConstants.THREAD_ID, threadId);
-		sendEvent(threadEvent);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.ContextFactory.Listener#contextReleased(org.mozilla.javascript.Context)
-	 */
-	public synchronized void contextReleased(Context context) {
-		Thread thread = Thread.currentThread();
-		if (disabledThreads.contains(thread)) {
-			return;
-		}
-		Long threadId = (Long) threadToThreadId.get(thread);
-		if (threadId == null) {
-			return;
-		}
-		ThreadData threadData = (ThreadData) threadIdToData.get(threadId);
-		threadData.contextReleased(context);
-		if (!threadData.hasContext()) {
-			threadToThreadId.remove(thread);
-			threadIdToData.remove(threadId);
-			sendThreadEvent(JSONConstants.EXIT, threadId);
-		}
-	}
-
-	/**
-	 * Resumes a thread with the given id for the given step type. Has no effect if no such thread exists
-	 * 
-	 * @param threadId
-	 * @param stepType
-	 */
-	public synchronized void resume(Long threadId, String stepType) {
-		ThreadData threadData = (ThreadData) threadIdToData.get(threadId);
-		if (threadData != null) {
-			threadData.resume(stepType);
-		}
-	}
-
-	/**
-	 * Resumes all threads currently in the debugger
-	 */
-	public synchronized void resumeAll() {
-		for (Iterator it = threadIdToData.keySet().iterator(); it.hasNext();) {
-			Long threadId = (Long) it.next();
-			resume(threadId, null);
-		}
-	}
-
-	/**
-	 * Suspend the thread with the given id. Has no effect if no such thread exists
-	 * 
-	 * @param threadId
-	 */
-	public synchronized void suspend(Long threadId) {
-		ThreadData threadData = (ThreadData) threadIdToData.get(threadId);
-		if (threadData != null) {
-			threadData.suspend();
-		}
-	}
-
-	/**
-	 * Suspend all threads currently in the debugger
-	 */
-	public synchronized void suspendAll() {
-		for (Iterator it = threadIdToData.keySet().iterator(); it.hasNext();) {
-			Long threadId = (Long) it.next();
-			suspend(threadId);
-		}
-	}
-
-	/**
-	 * Disconnects the debugger
-	 */
-	public void disconnect() {
-	}
-
-	/**
-	 * Returns all of the stack frame ids for the thread with the given id. Returns an empty list if no such thread exists, never <code>null</code>
-	 * 
-	 * @param threadId
-	 * @return the complete list of stack frame ids from the thread with the given id
-	 */
-	public synchronized List getFrameIds(Long threadId) {
-		ThreadData threadData = (ThreadData) threadIdToData.get(threadId);
-		if (threadData == null) {
-			return Collections.EMPTY_LIST;
-		}
-		return threadData.getFrameIds();
-	}
-
-	/**
-	 * Returns a {@link DebugFrame} with the given id from the thread with the given thread id. Returns <code>null</code> if the no such thread exists with the given id and / or no such {@link DebugFrame} exists with the given id
-	 * 
-	 * @param threadId
-	 * @param frameId
-	 * @return the {@link DebugFrame} with the given id from the thread with the given id
-	 */
-	public synchronized StackFrame getFrame(Long threadId, Long frameId) {
-		ThreadData threadData = (ThreadData) threadIdToData.get(threadId);
-		if (threadData != null) {
-			return threadData.getFrame(frameId);
-		}
-		return null;
-	}
-
-	/**
-	 * @return the ids of all of the scripts currently known to the debugger
-	 */
-	public synchronized List getScriptIds() {
-		return new ArrayList(idToScript.keySet());
-	}
-
-	/**
-	 * Returns the script with the given id or <code>null</code> if no such script exists with the given id
-	 * 
-	 * @param scriptId
-	 * @return the script with the given id or <code>null</code>
-	 */
-	public synchronized ScriptSource getScript(Long scriptId) {
-		return (ScriptSource) idToScript.get(scriptId);
-	}
-
-	/**
-	 * @return the complete collection of breakpoints currently known to the debugger
-	 */
-	public synchronized Collection getBreakpoints() {
-		return breakpoints.keySet();
-	}
-
-	/**
-	 * Creates a breakpoint in the script with the given id and the given breakpoint attributes. 
-	 * Returns the new breakpoint or <code>null</code> if:
-	 * <ul>
-	 * <li>no such script exists with the given id</li>
-	 * <li>the given line number is not a valid line number</li>
-	 * </ul>
-	 * <p>
-	 * If a breakpoint already exists at the given location it is removed and the new breakpoint is set.
-	 * </p>
-	 * @param scriptId
-	 * @param lineNumber
-	 * @param functionName
-	 * @param condition
-	 * @param threadId
-	 * @return the new breakpoint or <code>null</code> if no script exists with the given id
-	 */
-	public synchronized Breakpoint setBreakpoint(Long scriptId, Integer lineNumber, String functionName, String condition, Long threadId) {
-		ScriptSource script = (ScriptSource) idToScript.get(scriptId);
-		if (script == null || !script.isValid(lineNumber, functionName)) {
-			return null;
-		}
-
-		
-		Breakpoint newbreakpoint = new Breakpoint(nextBreakpointId(), script, lineNumber, functionName, condition, threadId);
-		Breakpoint oldbp = script.getBreakpoint(lineNumber, functionName);
-		if(oldbp != null) {
-			breakpoints.remove(oldbp.breakpointId);
-		}
-		breakpoints.put(newbreakpoint.breakpointId, newbreakpoint);
-		script.addBreakpoint(newbreakpoint);
-		return newbreakpoint;
-	}
-
-	/**
-	 * @return the next unique breakpoint id to use
-	 */
-	private synchronized Long nextBreakpointId() {
-		return new Long(currentBreakpointId++);
-	}
-
-	/**
-	 * Clears the breakpoint out of the cache with the given id and returns it. Returns <code>null</code> if no breakpoint exists with the given id.
-	 * 
-	 * @param breakpointId
-	 * @return the removed breakpoint or <code>null</code>
-	 */
-	public synchronized Breakpoint clearBreakpoint(Long breakpointId) {
-		Breakpoint breakpoint = (Breakpoint) breakpoints.remove(breakpointId);
-		if (breakpoint != null) {
-			breakpoint.delete();
-		}
-		return breakpoint;
-	}
-
-	/**
-	 * Sends the given {@link EventPacket} using the underlying {@link DebugRuntime} and returns if it was sent successfully
-	 * 
-	 * @param event
-	 * @return true if the event was sent successfully, false otherwise
-	 */
-	public boolean sendEvent(EventPacket event) {
-		return sessionManager.sendEvent(event);
-	}
-
-	/**
-	 * Gets a breakpoint with the given id, returns <code>null</code> if no such breakpoint exists with the given id
-	 * 
-	 * @param breakpointId
-	 * @return the breakpoint with the given id or <code>null</code>
-	 */
-	public Breakpoint getBreakpoint(Long breakpointId) {
-		return (Breakpoint) breakpoints.get(breakpointId);
-	}
-
-	/**
-	 * Gets the thread for the thread with the given id, returns <code>null</code> if no such thread exists with the goven id
-	 * 
-	 * @param threadId
-	 * @return the thread data for the thread with the given id or <code>null</code>
-	 */
-	public synchronized ThreadData getThreadData(Long threadId) {
-		return (ThreadData) threadIdToData.get(threadId);
-	}
-
-	/**
-	 * @return the complete list of thread ids known to the debugger
-	 */
-	public synchronized List getThreadIds() {
-		return new ArrayList(threadIdToData.keySet());
-	}
-
-	/**
-	 * Caches the current thread as disabled
-	 */
-	public synchronized void disableThread() {
-		disabledThreads.add(Thread.currentThread());
-	}
-
-	/**
-	 * Removes the current thread as being disabled
-	 */
-	public synchronized void enableThread() {
-		disabledThreads.remove(Thread.currentThread());
-	}
-
-	public void start() {
-		sessionManager.start(this);
-	}
-
-	public void stop() {
-		sessionManager.stop();
-	}
-	
-	/**
-	 * Returns if a {@link DebugSession} has successfully connected to this debugger.
-	 * 
-	 * @return <code>true</code> if the debugger has a connected {@link DebugSession} <code>false</code> otherwise
-	 */
-	public boolean isConnected() {
-		return sessionManager.isConnected();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ScriptSource.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ScriptSource.java
deleted file mode 100644
index b551bc1..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ScriptSource.java
+++ /dev/null
@@ -1,471 +0,0 @@
-/*******************************************************************************
- * 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.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.Constants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.mozilla.javascript.debug.DebuggableScript;
-
-/**
- * Rhino script implementation
- * 
- * @since 1.0
- */
-public class ScriptSource {
-
-	/**
-	 * No line information
-	 */
-	static final LineData[] NO_LINES = new LineData[0];
-	
-	/**
-	 * The id of the script
-	 */
-	private Long scriptId;
-	/**
-	 * Any special source properties to consider
-	 */
-	private final Map properties;
-	/**
-	 * The backing source String that was compiled to give us this proxy
-	 */
-	private final String source;
-	/**
-	 * If this {@link ScriptSource} was generated
-	 */
-	private final boolean generated;
-	/**
-	 * The ordered list of function names
-	 */
-	private ArrayList functionNames = null;
-
-	private Integer firstLine = null;
-	
-	/**
-	 * The location of the script
-	 */
-	private URI uri = null;
-	/**
-	 * The array of cached {@link FunctionSource}s
-	 */
-	private FunctionSource[] functionSources = null;
-	/**
-	 * Sparse array of line information. This array only has entries present for 
-	 * lines that are returned 
-	 */
-	private LineData[] lines = null;
-	/**
-	 * Mapping of the {@link DebuggableScript} backing the FunctionSource to the FunctionSource handle
-	 */
-	private HashMap/*<DebuggableScript, FunctionSource>*/ scriptToFunction = new HashMap();
-	
-	/**
-	 * Constructor
-	 * 
-	 * @param scriptId
-	 * @param debuggableScript
-	 * @param source
-	 */
-	public ScriptSource(DebuggableScript script, String source, URI uri, boolean generated, Map properties) {
-		this.uri = uri;
-		this.source = source;
-		this.properties = properties;
-		this.generated = generated;
-
-		if(isStdIn()) {
-			//do not compute line data
-			return;
-		}
-		int[] rootlines = script.getLineNumbers();		
-		DebuggableScript[] functions = collectFunctions(script);
-		int flength = functions.length;
-		int max = 0;
-		int min = Integer.MAX_VALUE;
-		HashSet lineNumbers = new HashSet(flength+rootlines.length+1);
-		//dump in the line #'s from the root script
-		for (int i = 0; i < rootlines.length; i++) {
-			int line = rootlines[i];
-			if(line > max) {
-				max = line;
-			}
-			if(line < min) {
-				min = line;
-			}
-			lineNumbers.add(new Integer(line));
-		}
-		//dump in the line numbers from the expanded set of functions
-		if(flength > 0) {
-			functionSources = new FunctionSource[flength];
-			functionNames = new ArrayList(flength);
-			
-			int start = 0, end = 0;;
-			for (int i = 0; i < functions.length; i++) {
-				int[] lines = functions[i].getLineNumbers();
-				if(lines != null && lines.length > 0) {
-					start = lines[0] + 1;
-					for (int j = 0; j < lines.length; j++) {
-						int currentLine = lines[j];
-						if(currentLine > max) {
-							max = currentLine;
-						}
-						if(currentLine < min) {
-							min = currentLine;
-						}
-						if (currentLine < start) {
-							start = currentLine;
-						}
-						else if(currentLine > end) {
-							end = currentLine;
-						}
-						lineNumbers.add(new Integer(currentLine));
-					}
-				}
-				String name = functions[i].getFunctionName();
-				name = (name == null ? Constants.EMPTY_STRING : name);
-				functionSources[i] = new FunctionSource(this, name, computeFunctionSource(0, 0, source), start);
-				functionNames.add(name);
-				scriptToFunction.put(functions[i], functionSources[i]);
-				start = 0;
-			}
-		}
-		//create the sparse array and populate the valid line numbers
-		if(max == 0) {
-			this.lines = NO_LINES;
-		}
-		else {
-			this.lines = new LineData[max+1];
-			for (Iterator iter = lineNumbers.iterator(); iter.hasNext();) {
-				Integer value = (Integer) iter.next();
-				this.lines[value.intValue()] = new LineData();
-				iter.remove();
-			}
-			lineNumbers = null;
-		}
-		this.firstLine = new Integer(min);
-	}
-
-	/**
-	 * Returns the first executable line in the script
-	 * 
-	 * @return the first executable line in the script
-	 */
-	public Integer firstLine() {
-		return this.firstLine;
-	}
-	
-	/**
-	 * @return if this script represents the stdin script
-	 */
-	public boolean isStdIn() {
-		return this.uri.toString().endsWith("stdin"); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Collects all of the {@link DebuggableScript} objects for the functions
-	 * @param root the root script
-	 * @return the collected array of functions - {@link DebuggableScript} - objects or an empty array
-	 */
-	DebuggableScript[] collectFunctions(DebuggableScript root) {
-		ArrayList functions = new ArrayList();
-		collectFunctions(root, functions);
-		int size = functions.size();
-		if(size < 1) {
-			return RhinoDebuggerImpl.NO_SCRIPTS;
-		}
-		DebuggableScript[] funcs = new DebuggableScript[size];
-		functions.toArray(funcs);
-		return funcs;
-	}
-	
-	/**
-	 * Recursively collects function {@link DebuggableScript}s
-	 * 
-	 * @param root
-	 * @param collector
-	 */
-	void collectFunctions(DebuggableScript root, List collector) {
-		if(root.isFunction()) {
-			collector.add(root);
-		}
-		for (int i = 0; i < root.getFunctionCount(); i++) {
-			collectFunctions(root.getFunction(i), collector);
-		}
-	}
-	
-	/**
-	 * Computes the functions' source from the given compiled buffer
-	 * 
-	 * @param start
-	 * @param end
-	 * @param source
-	 * @return the string for the source or <code>null</code> if it could not be computed
-	 */
-	String computeFunctionSource(int start, int end, String source) {
-		if(start > -1 && end <= source.length()) {
-			return source.substring(start, end);
-		}
-		return null;
-	}
-	
-	/**
-	 * Sets the id for the script, <code>null</code> will throw and {@link IllegalArgumentException}
-	 * @param id
-	 * @throws IllegalArgumentException if <code>null</code> is specified as the new id
-	 */
-	public void setId(Long id) throws IllegalArgumentException {
-		if(id == null) {
-			throw new IllegalArgumentException();
-		}
-		this.scriptId = id;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#equals(java.lang.Object)
-	 */
-	public boolean equals(Object obj) {
-		if(obj instanceof ScriptSource) {
-			return this.uri.toString().equals(((ScriptSource)obj).uri.toString());
-		}
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#hashCode()
-	 */
-	public int hashCode() {
-		return this.uri.toString().hashCode();
-	}
-
-	/**
-	 * @return a new JSON map
-	 */
-	public Object toJSON() {
-		HashMap result = new HashMap();
-		result.put(JSONConstants.SCRIPT_ID, this.scriptId);
-		result.put(JSONConstants.LOCATION, this.uri.toString());
-		result.put(JSONConstants.PROPERTIES, properties);
-		result.put(JSONConstants.SOURCE, source);
-		result.put(JSONConstants.GENERATED, Boolean.valueOf(generated));
-		if(lines != null) {
-		HashSet lineNumbers = new HashSet();
-		for (int i = 0; i < lines.length; i++) {
-			if(lines[i] != null) {
-				lineNumbers.add(new Integer(i));
-			}
-		}
-		result.put(JSONConstants.LINES, (lineNumbers == null ? Collections.EMPTY_SET : lineNumbers));
-		}
-		else {
-			result.put(JSONConstants.LINES, Collections.EMPTY_SET);
-		}
-		result.put(JSONConstants.FUNCTIONS, (functionNames == null ? Collections.EMPTY_LIST : functionNames));
-		return result;
-	}
-
-	/**
-	 * @return the id for this script object
-	 */
-	public Long getId() {
-		return scriptId;
-	}
-	
-	/**
-	 * Returns the {@link Breakpoint} at the given line number or <code>null</code>
-	 * if there isn't one
-	 * @param lineNumber
-	 * @return
-	 */
-	public Breakpoint getBreakpoint(Integer line, String functionName) {
-		synchronized (lines) {
-			if(line != null) {
-				int value = line.intValue();
-				if (value > -1 && value < lines.length && lines[value] != null) {
-					return lines[value].breakpoint;
-				}
-			}
-			if(functionNames != null) {
-				int index = functionNames.indexOf(functionName);
-				FunctionSource func = functionAt(index);
-				if(func != null && lines[func.linenumber()] != null) {
-					return lines[func.linenumber()].breakpoint;
-				}
-			}
-			return null;
-		}
-	}
-
-	/**
-	 * Returns if the line number is valid wrt this script
-	 * 
-	 * @param lineNumber
-	 * @param functionName
-	 * @return true if the line number is valid wrt this script
-	 */
-	public boolean isValid(Integer line, String functionName) {
-		synchronized (lines) {
-			if(line != null) {
-				int value = line.intValue();
-				if (value > -1 && value < lines.length) {
-					return lines[value] != null;
-				}
-			}
-			if(functionNames != null) {
-				int index = functionNames.indexOf(functionName);
-				FunctionSource func = functionAt(index);
-				if(func != null) {
-					return lines[func.linenumber()] != null;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Copies items from the given object to this one
-	 * @param script
-	 */
-	public void clone(ScriptSource script) {
-		this.scriptId = script.scriptId;
-		this.lines = script.lines;
-	}
-	
-	/**
-	 * Adds a breakpoint to this script
-	 * 
-	 * @param breakpoint
-	 */
-	public void addBreakpoint(Breakpoint breakpoint) {
-		synchronized (lines) {
-			Integer lineNumber = breakpoint.lineNumber;
-			if(lineNumber != null) {
-				int value = lineNumber.intValue();
-				if(lines[value] != null) {
-					lines[value].breakpoint = breakpoint;
-				}
-			}
-			else if(functionNames != null) {
-				int index = functionNames.indexOf(breakpoint.functionName);
-				FunctionSource func = functionAt(index);
-				if(func != null) {
-					if(lines[func.linenumber] != null) {
-						lines[func.linenumber].breakpoint = breakpoint;
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Removes a breakpoint from this script
-	 * 
-	 * @param breakpoint
-	 */
-	public void removeBreakpoint(Breakpoint breakpoint) {
-		synchronized (lines) {
-			Integer lineNumber = breakpoint.lineNumber;
-			if(lineNumber != null) {
-				int value = lineNumber.intValue();
-				if(lines[value] != null) {
-					lines[value].breakpoint = null;
-				}
-			}
-			else if(functionNames != null) {
-				int index = functionNames.indexOf(breakpoint.functionName);
-				FunctionSource func = functionAt(index);
-				if(func != null) {
-					if(lines[func.linenumber] != null) {
-						lines[func.linenumber].breakpoint = null;
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * @return the string location of this script
-	 */
-	public String getLocation() {
-		return this.uri.toString();
-	}
-	
-	/**
-	 * Returns the {@link FunctionSource} at the given position iff the given index
-	 * is within the bounds of the sources array.
-	 * 
-	 * @param index
-	 * @return the {@link FunctionSource} at the given index or <code>null</code>
-	 */
-	public FunctionSource functionAt(int index) {
-		synchronized (functionSources) {
-			if(functionSources != null && (index < functionSources.length && index > -1)) {
-				return functionSources[index];
-			}
-		}
-		return null;
-	}
-	
-	/**
-	 * Returns the {@link FunctionSource} for the given {@link DebuggableScript}
-	 * 
-	 * @param script
-	 * @return the {@link FunctionSource} for the given {@link DebuggableScript} or <code>null</code>
-	 */
-	public FunctionSource getFunction(DebuggableScript script) {
-		synchronized (scriptToFunction) {
-			return (FunctionSource) scriptToFunction.get(script);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("ScriptSource: [id - ").append(scriptId).append("] [uri - ").append(uri.toString()).append("]"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		buffer.append("[generated - ").append(generated).append("]\n"); //$NON-NLS-1$ //$NON-NLS-2$
-		if(lines != null) {
-			buffer.append("\tline numbers: {"); //$NON-NLS-1$
-			for (int i = 0; i < lines.length; i++) {
-				if(lines[i] != null) {
-					buffer.append(i);
-					if(i < lines.length-1) {
-						buffer.append(", "); //$NON-NLS-1$
-					}
-				}
-			}
-			buffer.append("}\n"); //$NON-NLS-1$
-		}
-		if(functionNames != null) {
-			buffer.append("\tfunction names: {"); //$NON-NLS-1$
-			for (int i = 0; i < functionNames.size(); i++) {
-				buffer.append(functionNames.get(i));
-				if(i < functionNames.size()-1) {
-					buffer.append(", "); //$NON-NLS-1$
-				}
-			}
-			buffer.append("}\n"); //$NON-NLS-1$
-		}
-		if(functionSources != null) {
-			buffer.append("\tfunction sources:\n"); //$NON-NLS-1$
-			for (int i = 0; i < functionSources.length; i++) {
-				buffer.append(functionSources[i]).append("\n"); //$NON-NLS-1$
-			}
-		}
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/StackFrame.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/StackFrame.java
deleted file mode 100644
index 22c6def..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/StackFrame.java
+++ /dev/null
@@ -1,500 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.IdentityHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.mozilla.javascript.BaseFunction;
-import org.mozilla.javascript.Context;
-import org.mozilla.javascript.EcmaError;
-import org.mozilla.javascript.NativeArray;
-import org.mozilla.javascript.NativeJavaObject;
-import org.mozilla.javascript.Script;
-import org.mozilla.javascript.ScriptRuntime;
-import org.mozilla.javascript.Scriptable;
-import org.mozilla.javascript.ScriptableObject;
-import org.mozilla.javascript.Undefined;
-import org.mozilla.javascript.debug.DebugFrame;
-import org.mozilla.javascript.debug.DebuggableObject;
-import org.mozilla.javascript.debug.Debugger;
-
-/**
- * Rhino implementation of {@link DebugFrame}
- * 
- * @since 1.0
- */
-public class StackFrame implements DebugFrame {
-
-	private final Long id;
-	private final Context context;
-	private final ContextData contextData;
-	private final ScriptSource script;
-	private FunctionSource function = null;
-	private final HashMap handles = new HashMap();
-	private final IdentityHashMap handledObjects = new IdentityHashMap();
-	private Scriptable activation;
-	private Scriptable thisObj;
-	private int lineNumber;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param frameId
-	 * @param context
-	 * @param debuggableScript
-	 * @param script
-	 */
-	public StackFrame(Long frameId, Context context, FunctionSource function, ScriptSource script) {
-		this.id = frameId;
-		this.context = context;
-		this.contextData = (ContextData) context.getDebuggerContextData();
-		this.function = function;
-		this.script = script;
-		if(function != null) {
-			this.lineNumber = function.linenumber();
-		}
-		else {
-			this.lineNumber = script.firstLine().intValue();
-		}
-	}
-
-	/**
-	 * Returns the id of the frame
-	 * 
-	 * @return the frame id
-	 */
-	public Long getId() {
-		return id;
-	}
-
-	/**
-	 * Returns the underlying {@link Script}
-	 * 
-	 * @return the underlying {@link Script}
-	 */
-	public ScriptSource getScript() {
-		return script;
-	}
-
-	/**
-	 * Returns the line number for the frame
-	 * 
-	 * @return the frame line number
-	 */
-	public Integer getLineNumber() {
-		return new Integer(lineNumber);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.debug.DebugFrame#onDebuggerStatement(org.mozilla.javascript.Context)
-	 */
-	public void onDebuggerStatement(Context cx) {
-		initializeHandles();
-		this.lineNumber = 1+lineNumber;
-		contextData.debuggerStatement(script, new Integer(lineNumber));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.debug.DebugFrame#onEnter(org.mozilla.javascript.Context, org.mozilla.javascript.Scriptable, org.mozilla.javascript.Scriptable, java.lang.Object[])
-	 */
-	public void onEnter(Context cx, Scriptable activation, Scriptable thisObj, Object[] args) {
-		this.activation = activation;
-		this.thisObj = thisObj;
-		initializeHandles();
-		contextData.pushFrame(this, this.script, new Integer(lineNumber), getFunctionName());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.debug.DebugFrame#onExit(org.mozilla.javascript.Context, boolean, java.lang.Object)
-	 */
-	public void onExit(Context cx, boolean byThrow, Object resultOrException) {
-		this.activation = null;
-		this.thisObj = null;
-		clearHandles();
-		this.contextData.popFrame(byThrow, resultOrException);
-	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.debug.DebugFrame#onExceptionThrown(org.mozilla.javascript.Context, java.lang.Throwable)
-	 */
-	public void onExceptionThrown(Context cx, Throwable ex) {
-		initializeHandles();
-		this.contextData.exceptionThrown(ex);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.mozilla.javascript.debug.DebugFrame#onLineChange(org.mozilla.javascript.Context, int)
-	 */
-	public void onLineChange(Context cx, int lineNumber) {
-		if (this.lineNumber == lineNumber)
-			return;
-		initializeHandles();
-		this.lineNumber = lineNumber;
-		Integer line = new Integer(this.lineNumber);
-		if(this.script.isValid(line, getFunctionName())) {
-			this.contextData.lineChange(this.script, line);
-		}
-	}
-
-	/**
-	 * @return the name of the function backing this frame or <code>null</code> if there is no function
-	 * or it has no name.
-	 */
-	String getFunctionName() {
-		return (this.function == null ? null : this.function.name());
-	}
-	
-	/**
-	 * Evaluates the given source
-	 * 
-	 * @param source
-	 * @return
-	 */
-	public Object evaluate(String source) {
-		RhinoDebuggerImpl rhinoDebugger = (RhinoDebuggerImpl) context.getDebugger();
-		rhinoDebugger.disableThread();
-
-		Context evalContext = context.getFactory().enter();
-		Debugger debugger = evalContext.getDebugger();
-		Object debuggerContextData = evalContext.getDebuggerContextData();
-		evalContext.setDebugger(null, null);
-		try {
-			Object result = ScriptRuntime.evalSpecial(evalContext, activation, thisObj, new Object[] { source }, "eval", 0); //$NON-NLS-1$
-			Long handle = createHandle(result);
-			return serialize(handle, result);
-		}
-		catch (EcmaError ecma) {
-			return null;
-		}
-		finally {
-			evalContext.setDebugger(debugger, debuggerContextData);
-			Context.exit();
-			rhinoDebugger.enableThread();
-		}
-	}
-
-	/**
-	 * Evaluates the given condition
-	 * 
-	 * @param condition
-	 * @return the status of the condition evaluation
-	 */
-	public boolean evaluateCondition(String condition) {
-		RhinoDebuggerImpl rhinoDebugger = (RhinoDebuggerImpl) context.getDebugger();
-		rhinoDebugger.disableThread();
-
-		Context evalContext = context.getFactory().enter();
-		Debugger debugger = evalContext.getDebugger();
-		Object debuggerContextData = evalContext.getDebuggerContextData();
-		evalContext.setDebugger(null, null);
-		try {
-			Object result = ScriptRuntime.evalSpecial(evalContext, activation, thisObj, new Object[] { condition }, JSONConstants.CONDITION, 0);
-			return ScriptRuntime.toBoolean(result);
-		} finally {
-			evalContext.setDebugger(debugger, debuggerContextData);
-			Context.exit();
-			rhinoDebugger.enableThread();
-		}
-	}
-
-	/**
-	 * Look up the given handle in the known list of handles for this frame
-	 * 
-	 * @param handle
-	 * @return the serialized handle never <code>null</code>
-	 */
-	public Object lookup(Long handle) {
-
-		Object result = handles.get(handle);
-
-		RhinoDebuggerImpl rhinoDebugger = (RhinoDebuggerImpl) context.getDebugger();
-		rhinoDebugger.disableThread();
-
-		Context lookupContext = context.getFactory().enter();
-		Debugger debugger = lookupContext.getDebugger();
-		Object debuggerContextData = lookupContext.getDebuggerContextData();
-		lookupContext.setDebugger(null, null);
-		try {
-			return serialize(handle, result);
-		} finally {
-			lookupContext.setDebugger(debugger, debuggerContextData);
-			Context.exit();
-			rhinoDebugger.enableThread();
-		}
-	}
-
-	/**
-	 * Returns a JSON map
-	 * 
-	 * @return a new JSON object
-	 */
-	public Object toJSON() {
-		Map result = new HashMap();
-		result.put(JSONConstants.THREAD_ID, contextData.getThreadId());
-		result.put(JSONConstants.CONTEXT_ID, contextData.getId());
-		result.put(JSONConstants.FRAME_ID, id);
-		result.put(JSONConstants.SCRIPT_ID, script.getId());
-		result.put(JSONConstants.LINE, new Integer(lineNumber));
-		result.put(JSONConstants.REF, new Integer(0));
-		//TODO update this
-		result.put(JSONConstants.SCOPE_NAME, null);
-		return result;
-	}
-
-	/**
-	 * Serializes a handle object for this frame
-	 * 
-	 * @param handle
-	 * @param object
-	 * @return the serialized handle, never <code>null</code>
-	 */
-	public Object serialize(Long handle, Object object) {
-		Map result = new HashMap();
-		result.put(JSONConstants.HANDLE, handle);
-
-		// "undefined", "null", "boolean", "number", "string", "object", "function" or "frame"
-		if (object == Undefined.instance) {
-			serializeUndefined(result);
-		} else if (object == null) {
-			serializeNull(result);
-		} else if (object instanceof Boolean) {
-			serializeSimpleType(object, JSONConstants.BOOLEAN, result);
-		} else if (object instanceof Number) {
-			Object value = (object == ScriptRuntime.NaNobj) ? null : object;
-			serializeSimpleType(value, JSONConstants.NUMBER, result);
-		} else if (object instanceof String) {
-			serializeSimpleType(object, JSONConstants.STRING, result);
-		} else if (object instanceof Scriptable) {
-			Scriptable scriptable = (Scriptable) object;
-			serializeFunctionOrObject(scriptable, result);
-		} else if (object == this) {
-			serializeFrame(result);
-		} else {
-			serializeUndefined(result);
-		}
-		return result;
-	}
-
-	/**
-	 * Serialize the undefined value
-	 * 
-	 * @param result
-	 * @see JSONConstants#UNDEFINED
-	 */
-	private void serializeUndefined(Map result) {
-		result.put(JSONConstants.TYPE, JSONConstants.UNDEFINED);
-	}
-
-	/**
-	 * Serialize the null value
-	 * 
-	 * @param result
-	 * @see JSONConstants#NULL
-	 */
-	private void serializeNull(Map result) {
-		result.put(JSONConstants.TYPE, JSONConstants.NULL);
-	}
-
-	/**
-	 * Serialize the given simple type
-	 * 
-	 * @param object
-	 * @param type
-	 * @param result
-	 */
-	private void serializeSimpleType(Object object, String type, Map result) {
-		result.put(JSONConstants.TYPE, type);
-		result.put(JSONConstants.VALUE, object);
-	}
-
-	/**
-	 * Serialize a function or object
-	 * 
-	 * @param scriptable
-	 * @param result
-	 * @see JSONConstants#FUNCTION
-	 * @see JSONConstants#OBJECT
-	 */
-	private void serializeFunctionOrObject(Scriptable scriptable, Map result) {
-		if (scriptable instanceof BaseFunction) {
-			result.put(JSONConstants.TYPE, JSONConstants.FUNCTION);
-			result.put(JSONConstants.NAME, ((BaseFunction) scriptable).getFunctionName());
-		} else if (scriptable instanceof NativeArray) {
-			result.put(JSONConstants.TYPE, JSONConstants.ARRAY);
-		} else {
-			result.put(JSONConstants.TYPE, JSONConstants.OBJECT);
-		}
-		result.put(JSONConstants.CLASS_NAME, scriptable.getClassName());
-
-		Object constructorFunction = null;
-		if (ScriptableObject.hasProperty(scriptable, JSONConstants.CONSTRUCTOR)) {
-			constructorFunction = ScriptableObject.getProperty(scriptable, JSONConstants.CONSTRUCTOR);
-		}
-		result.put(JSONConstants.CONSTRUCTOR_FUNCTION, createRef(constructorFunction));
-		result.put(JSONConstants.PROTOTYPE_OBJECT, createRef(scriptable.getPrototype()));
-		if (scriptable instanceof NativeJavaObject)
-			result.put(JSONConstants.PROPERTIES, createJavaObjectProperties((NativeJavaObject) scriptable));
-		else
-			result.put(JSONConstants.PROPERTIES, createProperties(scriptable));
-	}
-
-	/**
-	 * @param javaObject
-	 * @return
-	 */
-	private Object createJavaObjectProperties(NativeJavaObject javaObject) {
-		ArrayList properties = new ArrayList();
-		// TODO: The problem here is Rhino treats getters and setters differently and in some cases will call these methods
-		// we need to sort out what's reasonable to display without modifying state
-		return properties;
-	}
-
-	/**
-	 * Serialize a frame
-	 * 
-	 * @param result
-	 * @see JSONConstants#FRAME
-	 * @see JSONConstants#THIS
-	 */
-	private void serializeFrame(Map result) {
-		result.put(JSONConstants.TYPE, JSONConstants.FRAME);
-		Set properties = new HashSet();
-		properties.add(createProperty(JSONConstants.THIS, thisObj));
-		properties.addAll(createProperties(activation));
-		Scriptable parent = activation.getParentScope();
-		while(parent != null) {
-			properties.addAll(createProperties(parent));
-			parent = parent.getParentScope();
-		}		
-		result.put(JSONConstants.PROPERTIES, properties);
-	}
-
-	/**
-	 * Creates the list of properties from the given {@link Scriptable}
-	 * 
-	 * @param scriptable
-	 * @return the live list of properties from the given {@link Scriptable}
-	 */
-	private List createProperties(Scriptable scriptable) {
-		ArrayList properties = new ArrayList();
-		Object[] ids = scriptable.getIds();
-		if (scriptable instanceof DebuggableObject) {
-			HashSet arrayIds = new HashSet(Arrays.asList(ids));
-			arrayIds.addAll(Arrays.asList(((DebuggableObject)scriptable).getAllIds()));
-			ids = arrayIds.toArray();
-		}
-		for (int i = 0; i < ids.length; i++) {
-			Object id = ids[i];
-			Object value = null;
-			if (id instanceof String) {
-				value = ScriptableObject.getProperty(scriptable, (String) id);
-			} else if (id instanceof Number) {
-				value = ScriptableObject.getProperty(scriptable, ((Number) id).intValue());
-			} else
-				continue;
-
-			Map property = createProperty(id, value);
-			properties.add(property);
-		}
-		return properties;
-	}
-
-	/**
-	 * Create a new property map for the given id and value
-	 * 
-	 * @param id
-	 * @param value
-	 * @return a new property map
-	 * @see JSONConstants#NAME
-	 */
-	private Map createProperty(Object id, Object value) {
-		Map property = createRef(value);
-		property.put(JSONConstants.NAME, id);
-		return property;
-	}
-
-	/**
-	 * Create a new ref map for the given object
-	 * 
-	 * @param object
-	 * @return a new ref map
-	 * @see JSONConstants#REF
-	 */
-	private Map createRef(Object object) {
-		Map map = new HashMap(2);
-		map.put(JSONConstants.REF, createHandle(object));
-		return map;
-	}
-
-	/**
-	 * Clears all cached handles from this frame
-	 */
-	private void clearHandles() {
-		handles.clear();
-		handledObjects.clear();
-	}
-
-	/**
-	 * Initializes the set of handles
-	 */
-	private void initializeHandles() {
-		if (handles.size() != 1) {
-			clearHandles();
-			createHandle(this);
-		}
-	}
-
-	/**
-	 * Creates a new handle for the given object and caches it
-	 * 
-	 * @param object
-	 * @return the id of the new handle
-	 */
-	private Long createHandle(Object object) {
-		Long handle = (Long) handledObjects.get(object);
-		if (handle == null) {
-			handle = new Long(nextHandle());
-			handles.put(handle, object);
-			handledObjects.put(object, handle);
-		}
-		return handle;
-	}
-
-	/**
-	 * @return the next handle to use when creating handles
-	 */
-	private int nextHandle() {
-		return handles.size();
-	}
-
-	/**
-	 * @return the thread id for the underlying {@link ContextData}
-	 */
-	public Object getThreadId() {
-		return contextData.getThreadId();
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ThreadData.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ThreadData.java
deleted file mode 100644
index e8d25b4..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/debugger/ThreadData.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*******************************************************************************
- * 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.wst.jsdt.debug.internal.rhino.debugger;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.mozilla.javascript.Context;
-import org.mozilla.javascript.debug.DebugFrame;
-
-/**
- * Rhino implementation of thread data
- * 
- * @since 1.0
- */
-public class ThreadData {
-
-	private final LinkedList contexts = new LinkedList();
-	private final Long threadId;
-	private final RhinoDebuggerImpl debugger;
-
-	private long currentContextId = 0L;
-	private long currentFrameId = 0L;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param threadId
-	 * @param debugger
-	 */
-	public ThreadData(Long threadId, RhinoDebuggerImpl debugger) {
-		this.threadId = threadId;
-		this.debugger = debugger;
-	}
-
-	/**
-	 * @return a JSON object for this data
-	 */
-	public synchronized Object toJSON() {
-		Map result = new HashMap();
-		result.put(JSONConstants.THREAD_ID, threadId);
-		if (contexts.isEmpty()) {
-			result.put(JSONConstants.STATE, JSONConstants.RUNNING);
-		} else {
-			Context top = (Context) contexts.getFirst();
-			result.put(JSONConstants.STATE, ((ContextData) top.getDebuggerContextData()).getState());
-		}
-		ArrayList contextIds = new ArrayList(contexts.size());
-		for (Iterator iterator = contexts.iterator(); iterator.hasNext();) {
-			Context context = (Context) iterator.next();
-			ContextData data = (ContextData) context.getDebuggerContextData();
-			contextIds.add(data.getId());
-		}
-		result.put(JSONConstants.CONTEXTS, contextIds);
-		return result;
-	}
-
-	/**
-	 * Caches that the given context has been created
-	 * 
-	 * @param context
-	 */
-	public synchronized void contextCreated(Context context) {
-		context.setGeneratingDebug(true);
-		context.setOptimizationLevel(-1);
-		ContextData contextData = new ContextData(threadId, new Long(currentContextId++), debugger);
-		context.setDebugger(debugger, contextData);
-		contexts.addFirst(context);
-	}
-
-	/**
-	 * Removes the context from the top of the stack
-	 * 
-	 * @param context
-	 */
-	public synchronized void contextReleased(Context context) {
-		if(hasContext()) {
-			contexts.removeFirst();
-		}
-	}
-
-	/**
-	 * @return true if there are any known contexts to this thread data
-	 */
-	public synchronized boolean hasContext() {
-		return !contexts.isEmpty();
-	}
-
-	/**
-	 * Returns all of the frame ids from all of the known contexts in this thread data or an empty list, never <code>null</code>
-	 * 
-	 * @return the complete list of frame ids from all known contexts
-	 */
-	public synchronized List getFrameIds() {
-		ArrayList result = new ArrayList(contexts.size());
-		for (Iterator iterator = contexts.iterator(); iterator.hasNext();) {
-			Context context = (Context) iterator.next();
-			ContextData data = (ContextData) context.getDebuggerContextData();
-			result.addAll(data.getFrameIds());
-		}
-		return result;
-	}
-
-	/**
-	 * Suspends the first context on the stack. has no effect if there are no known contexts for this thread data
-	 */
-	public synchronized void suspend() {
-		if(hasContext()) {
-			Context context = (Context) contexts.getFirst();
-			if (context == null) {
-				return;
-			}
-			ContextData data = (ContextData) context.getDebuggerContextData();
-			data.suspend();
-		}
-	}
-
-	/**
-	 * Resumes the top context for the given type. Has no effect if there are no known contexts
-	 * 
-	 * @param stepType
-	 * 
-	 * @see JSONConstants#STEP_IN
-	 * @see JSONConstants#STEP_NEXT
-	 * @see JSONConstants#STEP_OUT
-	 * @see JSONConstants#STEP_ANY
-	 */
-	public synchronized void resume(String stepType) {
-		if(hasContext()) {
-			Context context = (Context) contexts.getFirst();
-			if (context == null) {
-				return;
-			}
-			ContextData data = (ContextData) context.getDebuggerContextData();
-			data.resume(stepType);
-		}
-	}
-
-	/**
-	 * Returns the {@link DebugFrame} with the given id from the first context containing such a frame. Returns <code>null</code> if no such frame exists with the given id.
-	 * 
-	 * @param frameId
-	 * @return the {@link DebugFrame} with the given id or <code>null</code>
-	 */
-	public synchronized StackFrame getFrame(Long frameId) {
-		for (Iterator iterator = contexts.iterator(); iterator.hasNext();) {
-			Context context = (Context) iterator.next();
-			ContextData data = (ContextData) context.getDebuggerContextData();
-			StackFrame frame = data.getFrame(frameId);
-			if (frame != null)
-				return frame;
-		}
-		return null;
-	}
-
-	/**
-	 * Creates a new {@link DebugFrame} for the given attributes.
-	 * 
-	 * @param context
-	 * @param function
-	 * @param script
-	 * @return a new {@link DebugFrame}
-	 */
-	public synchronized DebugFrame getFrame(Context context, FunctionSource function, ScriptSource script) {
-		return new StackFrame(new Long(currentFrameId++), context, function, script);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/Connection.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/Connection.java
deleted file mode 100644
index 3483013..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/Connection.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.transport;
-
-import java.io.IOException;
-
-
-/**
- * Describes a socket connection to a debugger
- * 
- * @since 1.0
- */
-public interface Connection {
-
-	/**
-	 * Returns if the debug connection is open.
-	 * 
-	 * @return <code>true</code> if the connection is open <code>false</code> otherwise
-	 */
-	public abstract boolean isOpen();
-
-	/**
-	 * Closes the connection.
-	 * 
-	 * @throws IOException if the connection failed to close or is already closed
-	 */
-	public abstract void close() throws IOException;
-
-	/**
-	 * Writes the given packet to the connection
-	 * 
-	 * @param packet the packet to write, <code>null</code> is not accepted
-	 * @throws IOException if the write failed
-	 */
-	public abstract void writePacket(Packet packet) throws IOException;
-
-	/**
-	 * Reads the next packet from the connection. This is non-blocking.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the next {@link Packet} from the connection
-	 * @throws IOException if the connection is prematurely closed or the read failed
-	 */
-	public abstract Packet readPacket() throws IOException;
-
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/Constants.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/Constants.java
deleted file mode 100644
index e47bae8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/Constants.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.transport;
-
-/**
- * Common constants
- * 
- * @since 1.0
- */
-public interface Constants {
-
-	/**
-	 * Constant representing a space
-	 */
-	public static final String SPACE = " "; //$NON-NLS-1$
-	/**
-	 * Constant representing a colon.<br>
-	 * <br>
-	 * Value is: <code>:</code>
-	 */
-	public static final String COLON = ":"; //$NON-NLS-1$
-	/**
-	 * Constant representing the empty string
-	 */
-	public static final String EMPTY_STRING = ""; //$NON-NLS-1$
-	/**
-	 * UTF-8 encoding constant <br>
-	 * <br>
-	 * Value is: <code>UTF-8</code>
-	 */
-	public static final String UTF_8 = "UTF-8"; //$NON-NLS-1$
-	/**
-	 * Debug property name <br>
-	 * <br>
-	 * Value is: <code>rhino.debug</code>
-	 */
-	public static final String RHINO_DEBUG = "rhino.debug"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/DebugSession.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/DebugSession.java
deleted file mode 100644
index ee02b70..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/DebugSession.java
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.transport;
-
-
-/**
- * A {@link DebugSession} controls a {@link PacketSendManager} and {@link PacketReceiveManager}
- * that is uses to communicate to a debug target using the underlying {@link Connection}
- * 
- * @since 1.0
- */
-public class DebugSession {
-	
-	/**
-	 * The default receive manager
-	 */
-	private final PacketReceiveManager packetReceiveManager;
-	/**
-	 * The default send manager
-	 */
-	private final PacketSendManager packetSendManager;
-
-	/**
-	 * Constructor
-	 * 
-	 * Starts the send / receive managers on the given connection.
-	 * 
-	 * @param connection
-	 */
-	public DebugSession(Connection connection) {
-		packetReceiveManager = new PacketReceiveManager(connection);
-		Thread receiveThread = new Thread(packetReceiveManager, "Debug Session - Receive Manager"); //$NON-NLS-1$
-		receiveThread.setDaemon(true);
-
-		packetSendManager = new PacketSendManager(connection);
-		Thread sendThread = new Thread(packetSendManager, "Debug Session - Send Manager"); //$NON-NLS-1$
-		sendThread.setDaemon(true);
-
-		packetReceiveManager.setPartnerThread(sendThread);
-		packetSendManager.setPartnerThread(receiveThread);
-
-		receiveThread.start();
-		sendThread.start();
-	}
-
-	/**
-	 * Stops the debug sessions and disconnects the send / receive managers
-	 */
-	public void dispose() {
-		packetReceiveManager.disconnect();
-		packetSendManager.disconnect();
-	}
-
-	/**
-	 * Sends the given {@link Request} using the underlying {@link PacketSendManager}.
-	 * 
-	 * @param request the request to send, <code>null</code> is not accepted
-	 * @throws DisconnectedException if the {@link PacketSendManager} has been disconnected
-	 */
-	public void sendRequest(Request request) throws DisconnectedException {
-		if(request == null) {
-			throw new IllegalArgumentException("You cannot send a null request"); //$NON-NLS-1$
-		}
-		packetSendManager.sendPacket(request);
-	}
-
-	/**
-	 * Sends the given {@link EventPacket} using the underlying {@link PacketSendManager}.
-	 * 
-	 * @param event the event to send, <code>null</code> is not accepted
-	 * @throws DisconnectedException if the {@link PacketSendManager} has been disconnected
-	 */
-	public void sendEvent(EventPacket event) throws DisconnectedException {
-		if(event == null) {
-			throw new IllegalArgumentException("You cannot send a null event"); //$NON-NLS-1$
-		}
-		packetSendManager.sendPacket(event);
-	}
-	
-	/**
-	 * Sends the given {@link Response} using the underlying {@link PacketSendManager}.
-	 * 
-	 * @param response the response to send, <code>null</code> is not accepted
-	 * @throws DisconnectedException if the {@link PacketSendManager} has been disconnected
-	 */
-	public void sendResponse(Response response) throws DisconnectedException {
-		if(response == null) {
-			throw new IllegalArgumentException("You cannot send a null response"); //$NON-NLS-1$
-		}
-		packetSendManager.sendPacket(response);
-	}
-	
-	/**
-	 * Waits for the given timeout for a {@link Response} response in the given sequence 
-	 * from the {@link PacketReceiveManager}.<br>
-	 * <br>
-	 * This method does not return <code>null</code> - one of the listed exceptions will be thrown 
-	 * if an {@link Response} cannot be returned.
-	 * 
-	 * @param timeout the amount of time in milliseconds to wait to a {@link Response}
-	 * @return a new {@link Request} from the {@link PacketReceiveManager} never <code>null</code>
-	 * @throws TimeoutException if the timeout lapses with no {@link Response} returned
-	 * @throws DisconnectedException if the {@link PacketReceiveManager} has been disconnected
-	 */
-	public Response receiveResponse(int requestSequence, int timeout) throws TimeoutException, DisconnectedException {
-		return packetReceiveManager.getResponse(requestSequence, timeout);
-	}
-
-	/**
-	 * Waits for the given timeout for a {@link EventPacket} response from the {@link PacketReceiveManager}.<br>
-	 * <br>
-	 * This method does not return <code>null</code> - one of the listed exceptions will be thrown 
-	 * if an {@link EventPacket} cannot be returned.
-	 * 
-	 * @param timeout the amount of time in milliseconds to wait to a {@link EventPacket}
-	 * @return a new {@link Request} from the {@link PacketReceiveManager} never <code>null</code>
-	 * @throws TimeoutException if the timeout lapses with no {@link EventPacket} returned
-	 * @throws DisconnectedException if the {@link PacketReceiveManager} has been disconnected
-	 */
-	public EventPacket receiveEvent(int timeout) throws TimeoutException, DisconnectedException {
-		return (EventPacket) packetReceiveManager.getCommand(EventPacket.TYPE, timeout);
-	}
-	
-	/**
-	 * Waits for the given timeout for a request response from the {@link PacketReceiveManager}.<br>
-	 * <br>
-	 * This method does not return <code>null</code> - one of the listed exceptions will be thrown 
-	 * if a {@link Request} cannot be returned.
-	 * 
-	 * @param timeout the amount of time in milliseconds to wait to a {@link Request}
-	 * @return a new {@link Request} from the {@link PacketReceiveManager} never <code>null</code>
-	 * @throws TimeoutException if the timeout lapses with no {@link Request} returned
-	 * @throws DisconnectedException if the {@link PacketReceiveManager} has been disconnected
-	 */
-	public Request receiveRequest(int timeout) throws TimeoutException, DisconnectedException {
-		return (Request) packetReceiveManager.getCommand(JSONConstants.REQUEST, timeout);
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/DisconnectedException.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/DisconnectedException.java
deleted file mode 100644
index 049bd0a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/DisconnectedException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.transport;
-
-
-/**
- * A {@link DisconnectedException} is thrown by either of the {@link PacketSendManager}
- * or {@link PacketReceiveManager} when a request is made and they have been disconnected
- * 
- * @since 1.0
- */
-public final class DisconnectedException extends Exception {
-
-	/**
-	 * 
-	 */
-	private static final long serialVersionUID = 3233213787459625769L;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param message
-	 * @param exception
-	 */
-	public DisconnectedException(String message, Exception exception) {
-		super(message, exception);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/EventPacket.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/EventPacket.java
deleted file mode 100644
index 4da4752..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/EventPacket.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.transport;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-
-/**
- * An {@link EventPacket} is a specialized {@link Packet}
- * that only handles <code>event</code> data.
- * 
- * @since 1.0
- */
-public class EventPacket extends Packet {
-
-	public static final String TYPE = JSONConstants.EVENT;
-	private final String event;
-	private final Map body = Collections.synchronizedMap(new HashMap());
-
-	/**
-	 * Constructor
-	 * @param event
-	 */
-	public EventPacket(String event) {
-		super(TYPE);
-		this.event = event.intern();
-	}
-
-	/**
-	 * Constructor
-	 * @param json
-	 */
-	public EventPacket(Map json) {
-		super(json);
-		String packetEvent = (String) json.get(JSONConstants.EVENT);
-		event = packetEvent.intern();
-		Map packetBody = (Map) json.get(JSONConstants.BODY);
-		body.putAll(packetBody);
-	}
-
-	/**
-	 * Returns the underlying event data
-	 * @return the event data
-	 */
-	public String getEvent() {
-		return event;
-	}
-
-	/**
-	 * Returns the underlying body of the event packet
-	 * @return the body of the packet
-	 */
-	public Map getBody() {
-		return body;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.Packet#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = super.toJSON();
-		json.put(JSONConstants.EVENT, event);
-		json.put(JSONConstants.BODY, body);
-		return json;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("EventPacket: ").append(JSONUtil.write(toJSON())); //$NON-NLS-1$
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/JSONConstants.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/JSONConstants.java
deleted file mode 100644
index 668d471..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/JSONConstants.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.transport;
-
-/**
- * Collection of constants used for JSON
- * 
- * @since 1.0
- */
-public interface JSONConstants {
-
-	// request / response
-	public static final String SEQ = "seq"; //$NON-NLS-1$
-	public static final String REQUEST_SEQ = "request_seq"; //$NON-NLS-1$
-	public static final String TYPE = "type"; //$NON-NLS-1$
-	public static final String REQUEST = "request"; //$NON-NLS-1$
-	public static final String COMMAND = "command"; //$NON-NLS-1$
-	public static final String CONNECT = "connect"; //$NON-NLS-1$
-	public static final String MESSAGE = "message"; //$NON-NLS-1$
-	public static final String ARGUMENTS = "arguments"; //$NON-NLS-1$
-	public static final String BODY = "body"; //$NON-NLS-1$
-	public static final String LINE = "line"; //$NON-NLS-1$
-	public static final String LINE_NUMBER = "lineNumber"; //$NON-NLS-1$
-	public static final String SCRIPT = "script"; //$NON-NLS-1$
-	public static final String SCRIPTS = "scripts"; //$NON-NLS-1$
-	public static final String FUNCTION = "function"; //$NON-NLS-1$
-	public static final String ENTER = "enter"; //$NON-NLS-1$
-	public static final String EXIT = "exit"; //$NON-NLS-1$
-	public static final String FUNCTIONS = "functions"; //$NON-NLS-1$
-	public static final String BREAK = "break"; //$NON-NLS-1$
-	public static final String RESPONSE = "response"; //$NON-NLS-1$
-	public static final String FUNCTION_NAME = "functionName"; //$NON-NLS-1$
-	public static final String EVENT = "event"; //$NON-NLS-1$
-	public static final String NOT_FOUND = "not found"; //$NON-NLS-1$
-	/**
-	 * The type for a VMDeathEvent
-	 * 
-	 * @see EventPacket#getType()
-	 */
-	public static final String VMDEATH = "vmdeath"; //$NON-NLS-1$
-
-	// value constants
-	public static final String UNDEFINED = "undefined"; //$NON-NLS-1$
-	public static final String UNKNOWN = "unknown"; //$NON-NLS-1$
-	public static final String NULL = "null"; //$NON-NLS-1$
-	public static final String BOOLEAN = "boolean"; //$NON-NLS-1$
-	public static final String NUMBER = "number"; //$NON-NLS-1$
-	public static final String STRING = "string"; //$NON-NLS-1$
-	public static final String OBJECT = "object"; //$NON-NLS-1$
-	public static final String ARRAY = "array"; //$NON-NLS-1$
-	public static final String PROPERTY = "property"; //$NON-NLS-1$
-	public static final String VARIABLE = "variable"; //$NON-NLS-1$
-	public static final String THIS = "this"; //$NON-NLS-1$
-	public static final String PROTOTYPE_OBJECT = "prototypeObject"; //$NON-NLS-1$
-	public static final String CONSTRUCTOR_FUNCTION = "constructorFunction"; //$NON-NLS-1$
-
-	// id constants
-	public static final String THREAD_ID = "threadId"; //$NON-NLS-1$
-	public static final String FRAME_ID = "frameId"; //$NON-NLS-1$
-	public static final String BREAKPOINT_ID = "breakpointId"; //$NON-NLS-1$
-	public static final String CONTEXT_ID = "contextId"; //$NON-NLS-1$
-	public static final String SCRIPT_ID = "scriptId"; //$NON-NLS-1$
-
-	// breakpoints
-	public static final String SETBREAKPOINT = "setbreakpoint"; //$NON-NLS-1$
-	public static final String BREAKPOINT = "breakpoint"; //$NON-NLS-1$
-	public static final String BREAKPOINTS = "breakpoints"; //$NON-NLS-1$
-	public static final String CLEARBREAKPOINT = "clearbreakpoint"; //$NON-NLS-1$
-	public static final String CONDITION = "condition"; //$NON-NLS-1$
-	public static final String LINES = "lines"; //$NON-NLS-1$
-	public static final String DEBUGGER_STATEMENT = "debuggerStatement"; //$NON-NLS-1$
-
-	// threads
-	public static final String CONTINUE = "continue"; //$NON-NLS-1$
-	public static final String RUNNING = "running"; //$NON-NLS-1$
-	public static final String BACKTRACE = "backtrace"; //$NON-NLS-1$
-	public static final String SUCCESS = "success"; //$NON-NLS-1$
-	public static final String TOTAL_FRAMES = "totalframes"; //$NON-NLS-1$
-	public static final String STEP_ACTION = "stepaction"; //$NON-NLS-1$
-	public static final String STEP = "step"; //$NON-NLS-1$
-	public static final String STEP_TYPE = "stepType"; //$NON-NLS-1$
-	public static final String STEP_IN = "in"; //$NON-NLS-1$
-	public static final String STEP_NEXT = "next"; //$NON-NLS-1$
-	public static final String STEP_OUT = "out"; //$NON-NLS-1$
-	public static final String STEP_ANY = "any"; //$NON-NLS-1$
-	public static final String CONTEXTS = "contexts"; //$NON-NLS-1$
-	public static final String STATE = "state"; //$NON-NLS-1$
-	public static final String FRAMES = "frames"; //$NON-NLS-1$
-
-	// target
-	public static final String THREADS = "threads"; //$NON-NLS-1$
-	public static final String THREAD = "thread"; //$NON-NLS-1$
-	public static final String VERSION = "version"; //$NON-NLS-1$
-	public static final String DISPOSE = "dispose"; //$NON-NLS-1$
-	public static final String SUSPEND = "suspend"; //$NON-NLS-1$
-	public static final String SUSPENDED = "suspended"; //$NON-NLS-1$
-	public static final String EXCEPTION = "exception"; //$NON-NLS-1$
-	public static final String VM_VERSION = "javascript.vm.version"; //$NON-NLS-1$
-	public static final String VM_NAME = "javascript.vm.name"; //$NON-NLS-1$
-	public static final String VM_VENDOR = "javascript.vm.vendor"; //$NON-NLS-1$
-	public static final String JAVASCRIPT_VERSION = "javascript.version"; //$NON-NLS-1$
-	public static final String ECMASCRIPT_VERSION = "ecmascript.version"; //$NON-NLS-1$
-
-	// stackframe
-	public static final String EVALUATE = "evaluate"; //$NON-NLS-1$
-	public static final String EXPRESSION = "expression"; //$NON-NLS-1$
-	public static final String HANDLE = "handle"; //$NON-NLS-1$
-	public static final String PROPERTIES = "properties"; //$NON-NLS-1$
-	public static final String NAME = "name"; //$NON-NLS-1$
-	public static final String LOOKUP = "lookup"; //$NON-NLS-1$
-	public static final String REF = "ref"; //$NON-NLS-1$	
-	public static final String CONSTRUCTOR = "constructor"; //$NON-NLS-1$
-	public static final String CLASS_NAME = "className"; //$NON-NLS-1$
-	public static final String VALUE = "value"; //$NON-NLS-1$
-	public static final String SCOPE_NAME = "scopeName"; //$NON-NLS-1$
-	public static final String FRAME = "frame"; //$NON-NLS-1$
-
-	// scripts
-	public static final String GENERATED = "generated"; //$NON-NLS-1$
-	public static final String SOURCE = "source"; //$NON-NLS-1$
-	public static final String LOCATION = "location"; //$NON-NLS-1$
-	public static final String BASE = "base"; //$NON-NLS-1$	
-	public static final String PATH = "path"; //$NON-NLS-1$
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/JSONUtil.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/JSONUtil.java
deleted file mode 100644
index 7982dd2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/JSONUtil.java
+++ /dev/null
@@ -1,462 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.transport;
-
-import java.math.BigDecimal;
-import java.text.CharacterIterator;
-import java.text.StringCharacterIterator;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.mozilla.javascript.Undefined;
-
-
-/**
- * This class provides utilities for working with JSON.
- * <br><br>JSON identifiers map to Java as follows:
- * <ul>
- * <li>string	<--> 	java.lang.String</li>
- * <li>number	<--> 	java.math.Number (BigDecimal)</li>
- * <li>object	<--> 	java.util.Map (HashMap)</li>
- * <li>array	<--> 	java.util.Collection (ArrayList)</li>
- * <li>true		<--> 	java.lang.Boolean.TRUE</li>
- * <li>false	<--> 	java.lang.Boolean.FALSE</li>
- * <li>null		<--> 	null</li>
- * </ul> 
- * 
- * @see JSONConstants
- * @since 1.0
- */
-public final class JSONUtil {
-
-	/**
-	 * Constructor
-	 * no instantiation
-	 */
-	private JSONUtil() {}
-	
-	/**
-	 * Reads an object from the given JSON string.
-	 * <br><br>JSON identifiers map to Java as follows:
-	 * <ul>
-	 * <li>string	<--> 	java.lang.String</li>
-	 * <li>number	<--> 	java.math.Number (BigDecimal)</li>
-	 * <li>object	<--> 	java.util.Map (HashMap)</li>
-	 * <li>array	<--> 	java.util.Collection (ArrayList)</li>
-	 * <li>true		<--> 	java.lang.Boolean.TRUE</li>
-	 * <li>false	<--> 	java.lang.Boolean.FALSE</li>
-	 * <li>null		<--> 	null</li>
-	 * </ul> 
-	 * @param jsonString
-	 * @return the object corresponding to the JSON string or <code>null</code>
-	 */
-	public static Object read(String jsonString) {
-		return parse(new StringCharacterIterator(jsonString));
-	}
-
-	/**
-	 * Writes the given object to JSON
-	 * <br><br>JSON identifiers map to Java as follows:
-	 * <ul>
-	 * <li>string	<--> 	java.lang.String</li>
-	 * <li>number	<--> 	java.math.Number (BigDecimal)</li>
-	 * <li>object	<--> 	java.util.Map (HashMap)</li>
-	 * <li>array	<--> 	java.util.Collection (ArrayList)</li>
-	 * <li>true		<--> 	java.lang.Boolean.TRUE</li>
-	 * <li>false	<--> 	java.lang.Boolean.FALSE</li>
-	 * <li>null		<--> 	null</li>
-	 * </ul> 
-	 * @param jsonObject
-	 * @return the composed JSON string, never <code>null</code>
-	 */
-	public static String write(Object jsonObject) {
-		StringBuffer buffer = new StringBuffer();
-		writeValue(jsonObject, buffer);
-		return buffer.toString();
-	}
-
-	/**
-	 * Creates an {@link IllegalStateException} for the given message and iterator
-	 * 
-	 * @param message the message for the exception
-	 * @param it the iterator
-	 * @return a new {@link IllegalStateException} 
-	 */
-	private static RuntimeException error(String message, CharacterIterator it) {
-		return new IllegalStateException("[" + it.getIndex() + "] " + message); //$NON-NLS-1$//$NON-NLS-2$
-	}
-
-	/**
-	 * Creates an {@link IllegalStateException} for the given message
-	 * 
-	 * @param message the message for the exception
-	 * @return a new {@link IllegalStateException}
-	 */
-	private static RuntimeException error(String message) {
-		return new IllegalStateException(message);
-	}
-
-	/**
-	 * Parses the object value from the JSON string.
-	 * <br><br>JSON identifiers map to Java as follows:
-	 * <ul>
-	 * <li>string	<--> 	java.lang.String</li>
-	 * <li>number	<--> 	java.math.Number (BigDecimal)</li>
-	 * <li>object	<--> 	java.util.Map (HashMap)</li>
-	 * <li>array	<--> 	java.util.Collection (ArrayList)</li>
-	 * <li>true		<--> 	java.lang.Boolean.TRUE</li>
-	 * <li>false	<--> 	java.lang.Boolean.FALSE</li>
-	 * <li>null		<--> 	null</li>
-	 * </ul> 
-	 * @param it
-	 * @return
-	 */
-	private static Object parse(CharacterIterator it) {
-		parseWhitespace(it);
-		Object result = parseValue(it);
-		parseWhitespace(it);
-
-		if (it.current() != CharacterIterator.DONE) {
-			throw error("should be done", it); //$NON-NLS-1$
-		}
-		return result;
-	}
-
-	/**
-	 * Chews up whitespace from the iterator
-	 * 
-	 * @param it
-	 */
-	private static void parseWhitespace(CharacterIterator it) {
-		char c = it.current();
-		while (Character.isWhitespace(c)) {
-			c = it.next();
-		}
-	}
-
-	/**
-	 * Delegate method that calls the correct parse* method for object creation
-	 * <br><br>JSON identifiers map to Java as follows:
-	 * <ul>
-	 * <li>string	<--> 	java.lang.String</li>
-	 * <li>number	<--> 	java.math.Number (BigDecimal)</li>
-	 * <li>object	<--> 	java.util.Map (HashMap)</li>
-	 * <li>array	<--> 	java.util.Collection (ArrayList)</li>
-	 * <li>true		<--> 	java.lang.Boolean.TRUE</li>
-	 * <li>false	<--> 	java.lang.Boolean.FALSE</li>
-	 * <li>null		<--> 	null</li>
-	 * </ul> 
-	 * @param it
-	 * @return
-	 */
-	private static Object parseValue(CharacterIterator it) {
-		switch (it.current()) {
-			case '{' :
-				return parseObject(it);
-			case '[' :
-				return parseArray(it);
-			case '"' :
-				return parseString(it);
-			case '-' :
-			case '0' :
-			case '1' :
-			case '2' :
-			case '3' :
-			case '4' :
-			case '5' :
-			case '6' :
-			case '7' :
-			case '8' :
-			case '9' :
-				return parseNumber(it);
-			case 't' :
-				parseText(Boolean.TRUE.toString(), it);
-				return Boolean.TRUE;
-			case 'f' :
-				parseText(Boolean.FALSE.toString(), it);
-				return Boolean.FALSE;
-			case 'n' :
-				parseText(JSONConstants.NULL, it);
-				return null;
-			case 'u':
-				parseText(JSONConstants.UNDEFINED, it);
-				return null;
-		}
-		throw error("Bad JSON starting character '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$;
-	}
-
-	/**
-	 * Parses an {@link Map} object from the iterator or throws an
-	 * {@link IllegalStateException} if parsing fails.
-	 * 
-	 * @param it
-	 * @return a new {@link Map} object, never <code>null</code>
-	 */
-	private static Map parseObject(CharacterIterator it) {
-		it.next();
-		parseWhitespace(it);
-		if (it.current() == '}') {
-			it.next();
-			return Collections.EMPTY_MAP;
-		}
-
-		Map map = new HashMap();
-		while (true) {
-			if (it.current() != '"')
-				throw error("expected a string start '\"' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			String key = parseString(it);
-			if (map.containsKey(key))
-				throw error("' already defined" + "key '" + key, it); //$NON-NLS-1$ //$NON-NLS-2$
-			parseWhitespace(it);
-			if (it.current() != ':')
-				throw error("expected a pair separator ':' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			it.next();
-			parseWhitespace(it);
-			Object value = parseValue(it);
-			map.put(key, value);
-			parseWhitespace(it);
-			if (it.current() == ',') {
-				it.next();
-				parseWhitespace(it);
-				continue;
-			}
-
-			if (it.current() != '}')
-				throw error("expected an object close '}' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			break;
-		}
-		it.next();
-		return map;
-	}
-
-	/**
-	 * Parses an {@link ArrayList} from the given iterator or throws an
-	 * {@link IllegalStateException} if parsing fails
-	 * 
-	 * @param it
-	 * @return a new {@link ArrayList} object never <code>null</code>
-	 */
-	private static List parseArray(CharacterIterator it) {
-		it.next();
-		parseWhitespace(it);
-		if (it.current() == ']') {
-			it.next();
-			return Collections.EMPTY_LIST;
-		}
-
-		List list = new ArrayList();
-		while (true) {
-			Object value = parseValue(it);
-			list.add(value);
-			parseWhitespace(it);
-			if (it.current() == ',') {
-				it.next();
-				parseWhitespace(it);
-				continue;
-			}
-
-			if (it.current() != ']')
-				throw error("expected an array close ']' but was '" + it.current() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$
-			break;
-		}
-		it.next();
-		return list;
-	}
-
-	private static void parseText(String string, CharacterIterator it) {
-		int length = string.length();
-		char c = it.current();
-		for (int i = 0; i < length; i++) {
-			if (c != string.charAt(i))
-				throw error("expected to parse '" + string + "' but character " + (i + 1) + " was '" + c + "'", it); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$;
-			c = it.next();
-		}
-	}
-
-	private static Object parseNumber(CharacterIterator it) {
-		StringBuffer buffer = new StringBuffer();
-		char c = it.current();
-		while (Character.isDigit(c) || c == '-' || c == '+' || c == '.' || c == 'e' || c == 'E') {
-			buffer.append(c);
-			c = it.next();
-		}
-		try {
-			return new BigDecimal(buffer.toString());
-		} catch (NumberFormatException e) {
-			throw error("expected a number but was '" + buffer.toString() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$;
-		}
-	}
-
-	private static String parseString(CharacterIterator it) {
-		char c = it.next();
-		if (c == '"') {
-			it.next();
-			return ""; //$NON-NLS-1$
-		}
-		StringBuffer buffer = new StringBuffer();
-		while (c != '"') {
-			if (Character.isISOControl(c))
-				throw error("illegal iso control character: '" + Integer.toHexString(c) + "'", it); //$NON-NLS-1$ //$NON-NLS-2$);
-
-			if (c == '\\') {
-				c = it.next();
-				switch (c) {
-					case '"' :
-					case '\\' :
-					case '/' :
-						buffer.append(c);
-						break;
-					case 'b' :
-						buffer.append('\b');
-						break;
-					case 'f' :
-						buffer.append('\f');
-						break;
-					case 'n' :
-						buffer.append('\n');
-						break;
-					case 'r' :
-						buffer.append('\r');
-						break;
-					case 't' :
-						buffer.append('\t');
-						break;
-					case 'u' :
-						StringBuffer unicode = new StringBuffer(4);
-						for (int i = 0; i < 4; i++) {
-							unicode.append(it.next());
-						}
-						try {
-							buffer.append((char) Integer.parseInt(unicode.toString(), 16));
-						} catch (NumberFormatException e) {
-							throw error("expected a unicode hex number but was '" + unicode.toString() + "'", it); //$NON-NLS-1$ //$NON-NLS-2$););
-						}
-						break;
-					default :
-						throw error("illegal escape character '" + c + "'", it); //$NON-NLS-1$ //$NON-NLS-2$););
-				}
-			} else
-				buffer.append(c);
-
-			c = it.next();
-		}
-		c = it.next();
-		return buffer.toString();
-	}
-
-	private static void writeValue(Object value, StringBuffer buffer) {
-		if (value == null)
-			buffer.append(JSONConstants.NULL);
-		else if (value instanceof Boolean)
-			buffer.append(value.toString());
-		else if (value instanceof Number)
-			writeNumber((Number) value, buffer);
-		else if (value instanceof String)
-			writeString((String) value, buffer);
-		else if (value instanceof Collection)
-			writeArray((Collection) value, buffer);
-		else if (value instanceof Map)
-			writeObject((Map) value, buffer);
-		else  if(value instanceof Undefined) {
-			buffer.append(JSONConstants.UNDEFINED);
-		}
-		else
-			throw error("Unexpected object instance type was '" + value.getClass().getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$););
-	}
-
-	private static void writeNumber(Number value, StringBuffer buffer) {
-		if (value instanceof Double) {
-			if (((Double)value).isNaN() || ((Double)value).isInfinite()) {
-				buffer.append(JSONConstants.NULL);
-				return;
-			}
-		} else if (value instanceof Float) {
-			if (((Float)value).isNaN() || ((Float)value).isInfinite()) {
-				buffer.append(JSONConstants.NULL);
-				return;
-			}
-		}
-		buffer.append(value.toString());
-	}
-
-	private static void writeObject(Map map, StringBuffer buffer) {
-		buffer.append('{');
-		for (Iterator iterator = map.keySet().iterator(); iterator.hasNext();) {
-			Object key = iterator.next();
-			if (!(key instanceof String))
-				throw error("Map keys must be an instance of String but was '" + key.getClass().getName() + "'"); //$NON-NLS-1$ //$NON-NLS-2$););
-			writeString((String) key, buffer);
-			buffer.append(':');
-			writeValue(map.get(key), buffer);
-			buffer.append(',');
-		}
-		if (buffer.charAt(buffer.length() - 1) == ',')
-			buffer.setCharAt(buffer.length() - 1, '}');
-		else
-			buffer.append('}');
-	}
-
-	private static void writeArray(Collection collection, StringBuffer buffer) {
-		buffer.append('[');
-		for (Iterator iterator = collection.iterator(); iterator.hasNext();) {
-			writeValue(iterator.next(), buffer);
-			buffer.append(',');
-		}
-		if (buffer.charAt(buffer.length() - 1) == ',')
-			buffer.setCharAt(buffer.length() - 1, ']');
-		else
-			buffer.append(']');
-	}
-
-	private static void writeString(String string, StringBuffer buffer) {
-		buffer.append('"');
-		int length = string.length();
-		for (int i = 0; i < length; i++) {
-			char c = string.charAt(i);
-			switch (c) {
-				case '"' :
-				case '\\' :
-				case '/' :
-					buffer.append('\\');
-					buffer.append(c);
-					break;
-				case '\b' :
-					buffer.append("\\b"); //$NON-NLS-1$
-					break;
-				case '\f' :
-					buffer.append("\\f"); //$NON-NLS-1$
-					break;
-				case '\n' :
-					buffer.append("\\n"); //$NON-NLS-1$
-					break;
-				case '\r' :
-					buffer.append("\\r"); //$NON-NLS-1$
-					break;
-				case '\t' :
-					buffer.append("\\t"); //$NON-NLS-1$
-					break;
-				default :
-					if (Character.isISOControl(c)) {
-						buffer.append("\\u"); //$NON-NLS-1$
-						String hexString = Integer.toHexString(c);
-						for (int j = hexString.length(); j < 4; j++)
-							buffer.append('0');
-						buffer.append(hexString);
-					} else
-						buffer.append(c);
-			}
-		}
-		buffer.append('"');
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/Packet.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/Packet.java
deleted file mode 100644
index 3521aa0..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/Packet.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.transport;
-
-import java.util.HashMap;
-import java.util.Map;
-
-
-/**
- * Abstract description of a packet for sending / receiving information to the debug client
- * using JSON
- *  
- *  @since 1.0
- */
-abstract public class Packet {
-
-	private static int currentSequence = 0;
-	private final int sequence;
-	private final String type;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param type the type for the {@link Packet} <code>null</code> is not accepted
-	 */
-	protected Packet(String type) {
-		if(type == null) {
-			throw new IllegalArgumentException("The type for a packet cannot be null"); //$NON-NLS-1$
-		}
-		this.sequence = nextSequence();
-		this.type = type.intern();
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param json the pre-composed map of attributes for the packet, <code>null</code> is not accepted
-	 */
-	protected Packet(Map json) {
-		if(json == null) {
-			throw new IllegalArgumentException("The JSON map for a packet cannot be null"); //$NON-NLS-1$
-		}
-		Number packetSeq = (Number) json.get(JSONConstants.SEQ);
-		this.sequence = packetSeq.intValue();
-		String packetType = (String) json.get(JSONConstants.TYPE);
-		this.type = packetType.intern();
-	}
-
-	/**
-	 * @return a next value for the sequence
-	 */
-	private static synchronized int nextSequence() {
-		return ++currentSequence;
-	}
-
-	/**
-	 * @return the current sequence
-	 */
-	public int getSequence() {
-		return sequence;
-	}
-
-	/**
-	 * Returns the type of this packet.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the type, never <code>null</code>
-	 */
-	public String getType() {
-		return type;
-	}
-
-	/**
-	 * Returns the type and sequence composed in a JSON map.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * @return the composed JSON map
-	 */
-	public Map toJSON() {
-		Map json = new HashMap();
-		json.put(JSONConstants.SEQ, new Integer(sequence));
-		json.put(JSONConstants.TYPE, type);
-		return json;
-	}
-
-	/**
-	 * Returns the type from the given JSON map.<br>
-	 * <br>
-	 * This method can return <code>null</code> if the map is not correctly
-	 * formed.
-	 * 
-	 * @param json the JSON map, <code>null</code> is not accepted
-	 * @return the type from the JSON map or <code>null</code>
-	 */
-	public static String getType(Map json) {
-		if(json == null) {
-			throw new IllegalArgumentException("A null JSON map is not allowed when trying to get the packet type"); //$NON-NLS-1$
-		}
-		return (String) json.get(JSONConstants.TYPE);
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("Packet: ").append(JSONUtil.write(toJSON())); //$NON-NLS-1$
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PacketManager.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PacketManager.java
deleted file mode 100644
index e2c4e46..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PacketManager.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.transport;
-
-import java.io.IOException;
-
-/**
- * Default manager for sending / receiving packets to / from the connected {@link VirtualMachine}
- * 
- * @since 1.0
- */
-public abstract class PacketManager implements Runnable {
-
-	/**
-	 * Connector that performs IO to Virtual Machine.
-	 */
-	private final Connection connection;
-	/**
-	 * Thread that handles the communication the other way (e.g. if we are sending, the receiving thread).
-	 */
-	private volatile Thread partnerThread;
-	/**
-	 * The disconnected exception, if there is one
-	 */
-	private volatile IOException disconnectedException;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param connection the connection to communicate on, <code>null</code> is not accepted
-	 */
-	protected PacketManager(Connection connection) {
-		if(connection == null) {
-			throw new IllegalArgumentException("You cannot create a new PacketManager with a null Connection"); //$NON-NLS-1$
-		}
-		this.connection = connection;
-	}
-
-	/**
-	 * Returns the {@link Connection} this manager is communicating on.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the backing {@link Connection} to the {@link VirtualMachine}
-	 */
-	public Connection getConnection() {
-		return this.connection;
-	}
-
-	/**
-	 * Used to indicate that an IO exception occurred, closes the {@link Connection} 
-	 * to the {@link VirtualMachine}.
-	 * 
-	 * @param disconnectedException the IOException that occurred or <code>null</code>
-	 */
-	public void disconnect(IOException exception) {
-		this.disconnectedException = exception;
-		disconnect();
-	}
-
-	/**
-	 * Closes the {@link Connection} to the {@link VirtualMachine}.
-	 */
-	public void disconnect() {
-		try {
-			this.connection.close();
-		} catch (IOException e) {
-			this.disconnectedException = e;
-		}
-		if (this.partnerThread != null) {
-			this.partnerThread.interrupt();
-		}
-	}
-
-	/**
-	 * Returns if the manager is disconnected or not.
-	 * 
-	 * @return <code>true</code> if the manager is disconnected false otherwise
-	 */
-	public boolean isDisconnected() {
-		return this.connection == null || !this.connection.isOpen();
-	}
-
-	/**
-	 * Returns the underlying {@link IOException} from a disconnect.<br>
-	 * <br>
-	 * This method can return <code>null</code> if the manager has not been disconnected
-	 * 
-	 * @return the underlying {@link IOException} from a disconnect or <code>null</code> if none
-	 */
-	public IOException getDisconnectedException() {
-		return this.disconnectedException;
-	}
-
-	/**
-	 * Assigns thread of partner, to be notified if we have an {@link IOException}.
-	 * 
-	 * @param thread the new partner thread, <code>null</code> is not accepted
-	 */
-	public void setPartnerThread(Thread thread) {
-		if(thread == null) {
-			throw new IllegalArgumentException("You cannot send a null partner thread on the PacketManager"); //$NON-NLS-1$
-		}
-		this.partnerThread = thread;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PacketReceiveManager.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PacketReceiveManager.java
deleted file mode 100644
index 400c645..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PacketReceiveManager.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.transport;
-
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.ListIterator;
-
-/**
- * Default implementation of {@link PacketManager} for receiving packets from the 
- * {@link VirtualMachine}
- * 
- * @since 1.0
- */
-public class PacketReceiveManager extends PacketManager {
-
-	/**
-	 * Generic timeout value for not blocking. <br>
-	 * Value is: <code>0</code>
-	 */
-	public static final int TIMEOUT_NOT_BLOCKING = 0;
-	/**
-	 * Generic timeout value for infinite timeout. <br>
-	 * Value is: <code>-1</code>
-	 */
-	public static final int TIMEOUT_INFINITE = -1;
-	/**
-	 * List of Command packets received from Virtual Machine.
-	 */
-	private List commandPackets = new LinkedList();
-	/**
-	 * List of Reply packets received from Virtual Machine.
-	 */
-	private List responsePackets = new LinkedList();
-	/**
-	 * List of Packets that have timed out already. Maintained so that responses can be discarded if/when they are received.
-	 */
-	private List timedOutPackets = new ArrayList();
-
-	/**
-	 * Constructor
-	 * 
-	 * @param connection the underlying connection to communicate on, <code>null</code> is not accepted
-	 */
-	public PacketReceiveManager(Connection connection) {
-		super(connection);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.PacketManager#disconnect()
-	 */
-	public void disconnect() {
-		super.disconnect();
-		synchronized (this.commandPackets) {
-			this.commandPackets.notifyAll();
-		}
-		synchronized (this.responsePackets) {
-			this.responsePackets.notifyAll();
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Runnable#run()
-	 */
-	public void run() {
-		try {
-			while (!isDisconnected()) {
-				// Read a packet from the input stream.
-				readAvailablePacket();
-			}
-		}
-		// if the remote runtime is interrupted, drop the connection and clean up, don't wait for it to happen on its own
-		catch (InterruptedIOException e) {
-			disconnect(e);
-		} catch (IOException e) {
-			disconnect(e);
-		}
-	}
-
-	/**
-	 * Returns a specified command {@link Packet} from the {@link VirtualMachine}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code> an exception is thrown if the desired packet cannot
-	 * be returned.
-	 * 
-	 * @param type the type of the packet to get
-	 * @param timeToWait the amount of time to wait for the {@link Packet} to arrive
-	 * 
-	 * @return the specified command packet never <code>null</code>
-	 * @throws TimeoutException if the request times out
-	 * @throws DisconnectedException if the manager is disconnected
-	 */
-	public Packet getCommand(String type, long timeToWait) throws TimeoutException, DisconnectedException {
-		synchronized (this.commandPackets) {
-			long remainingTime = timeToWait;
-			// Wait until command is available.
-			//even if disconnected try to send the remaining events
-			while (!isDisconnected() || !this.commandPackets.isEmpty()) {
-				Packet packet = removeCommandPacket(type);
-				if (packet != null)
-					return packet;
-
-				if (remainingTime < 0 && timeToWait != TIMEOUT_INFINITE)
-					break;
-
-				long timeBeforeWait = System.currentTimeMillis();
-				try {
-					waitForPacketAvailable(remainingTime, this.commandPackets);
-				} catch (InterruptedException e) {
-					break;
-				}
-				long waitedTime = System.currentTimeMillis() - timeBeforeWait;
-				remainingTime -= waitedTime;
-			}
-		}
-		// Check for an IO Exception.
-		if (isDisconnected()) {
-			throw new DisconnectedException("Runtime disconnected", getDisconnectedException()); //$NON-NLS-1$
-		}
-		// Check for a timeout.
-		throw new TimeoutException("Timed out waiting for command packet: " + type); //$NON-NLS-1$
-	}
-
-	/**
-	 * Returns a specified response packet from the {@link VirtualMachine}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code> an exception is thrown if the desired response cannot
-	 * be returned.
-	 * 
-	 * @param requestSequence the sequence of the response to acquire
-	 * @param timeToWait the amount of time to wait for the {@link Response}
-	 * 
-	 * @return a specified response packet from the {@link VirtualMachine} never <code>null</code>
-	 * @throws TimeoutException if the request times out
-	 * @throws DisconnectedException if the manager is disconnected
-	 */
-	public Response getResponse(int requestSequence, long timeToWait) throws TimeoutException, DisconnectedException {
-		synchronized (this.responsePackets) {
-			long remainingTime = timeToWait;
-			// Wait until command is available.
-			while (!isDisconnected()) {
-				Response response = removeResponsePacket(requestSequence);
-				if (response != null)
-					return response;
-
-				if (remainingTime < 0 && timeToWait != TIMEOUT_INFINITE)
-					break;
-
-				long timeBeforeWait = System.currentTimeMillis();
-				try {
-					waitForPacketAvailable(remainingTime, this.responsePackets);
-				} catch (InterruptedException e) {
-					break;
-				}
-				long waitedTime = System.currentTimeMillis() - timeBeforeWait;
-				remainingTime -= waitedTime;
-			}
-		}
-		// Check for an IO Exception.
-		if (isDisconnected()) {
-			throw new DisconnectedException("Runtime disconnected", getDisconnectedException()); //$NON-NLS-1$
-		}
-
-		synchronized (this.responsePackets) {
-			this.timedOutPackets.add(new Integer(requestSequence));
-		}
-		throw new TimeoutException("Timed out waiting for packet: " + requestSequence); //$NON-NLS-1$
-	}
-
-	/**
-	 * Wait for an available packet from the Virtual Machine.
-	 */
-	private void waitForPacketAvailable(long timeToWait, Object lock) throws InterruptedException {
-		if (timeToWait == 0)
-			return;
-		else if (timeToWait < 0)
-			lock.wait();
-		else
-			lock.wait(timeToWait);
-	}
-
-	/**
-	 * Removes and returns the command packet for the given type or <code>null</code> if there is no command packet for the given type.
-	 * 
-	 * @param type
-	 * @return The command packet for the given type that has been removed
-	 */
-	private Packet removeCommandPacket(String type) {
-		ListIterator iter = this.commandPackets.listIterator();
-		while (iter.hasNext()) {
-			Packet packet = (Packet) iter.next();
-			if (type == null || packet.getType().equals(type)) {
-				iter.remove();
-				return packet;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Removes and returns the response packet with the given request sequence or <code>null</code> if there is no response packet with the given request sequence
-	 * 
-	 * @param requestSequence
-	 * @return the response packet with the given request sequence that has been removed
-	 */
-	private Response removeResponsePacket(int requestSequence) {
-		ListIterator iter = this.responsePackets.listIterator();
-		while (iter.hasNext()) {
-			Response response = (Response) iter.next();
-			if (requestSequence == response.getRequestSequence()) {
-				iter.remove();
-				return response;
-			}
-		}
-		return null;
-	}
-
-	/**
-	 * Adds the given command packet to the listing of command packets. This method is a no-op if the given packet is <code>null</code>
-	 * 
-	 * @param packet
-	 */
-	private void addCommandPacket(Packet packet) {
-		if (packet == null) {
-			return;
-		}
-		synchronized (this.commandPackets) {
-			this.commandPackets.add(packet);
-			this.commandPackets.notifyAll();
-		}
-	}
-
-	/**
-	 * Adds the given response packet to the listing of response packets. This method is a no-op if the given packet is <code>null</code>
-	 * 
-	 * @param response
-	 */
-	private void addResponsePacket(Response response) {
-		if (response == null) {
-			return;
-		}
-		synchronized (this.responsePackets) {
-			if (!this.timedOutPackets.isEmpty()) {
-				Integer requestSeq = new Integer(response.getRequestSequence());
-				if (this.timedOutPackets.remove(requestSeq))
-					return; // already timed out. No need to keep this one
-			}
-			this.responsePackets.add(response);
-			this.responsePackets.notifyAll();
-		}
-	}
-
-	/**
-	 * Reads the next packet from the underlying connection and adds it to the correct packet listing.
-	 * 
-	 * @throws IOException
-	 */
-	private void readAvailablePacket() throws IOException {
-		// Read a packet from the Input Stream.
-		Packet packet = getConnection().readPacket();
-		if (packet instanceof Response)
-			addResponsePacket((Response) packet);
-		else
-			addCommandPacket(packet);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PacketSendManager.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PacketSendManager.java
deleted file mode 100644
index e844281..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PacketSendManager.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.transport;
-
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.util.ArrayList;
-import java.util.List;
-
-
-/**
- * Default implementation of {@link PacketManager} for sending packets to the 
- * {@link VirtualMachine}
- * 
- * @since 1.0
- */
-public class PacketSendManager extends PacketManager {
-	
-	/** 
-	 * List of packets to be sent to Virtual Machine 
-	 */
-	private final List outgoingPackets = new ArrayList();
-
-	/**
-	 * Create a new thread that send packets to the {@link VirtualMachine}.
-	 * 
-	 * @param connection the underlying connection to communicate on, <code>null</code> is not accepted
-	 */
-	public PacketSendManager(Connection connection) {
-		super(connection);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.PacketManager#disconnect()
-	 */
-	public void disconnect() {
-		super.disconnect();
-		synchronized (outgoingPackets) {
-			outgoingPackets.notifyAll();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see java.lang.Runnable#run()
-	 */
-	public void run() {
-		while (!isDisconnected()) {
-			try {
-				sendAvailablePackets();
-			}
-			// in each case if the remote runtime fails, or has been interrupted, disconnect and force a clean up, don't wait for it to happen
-			catch (InterruptedException e) {
-				disconnect();
-			} catch (InterruptedIOException e) {
-				disconnect(e);
-			} catch (IOException e) {
-				disconnect(e);
-			}
-		}
-	}
-
-	/**
-	 * Sends the given {@link Packet}.
-	 * 
-	 * @param packet the packet to send, <code>null</code> is not accepted
-	 * 
-	 * @throws DisconnectedException
-	 */
-	public void sendPacket(Packet packet) throws DisconnectedException {
-		if(packet == null) {
-			throw new IllegalArgumentException("You cannot send a null packet"); //$NON-NLS-1$
-		}
-		if (isDisconnected()) {
-			throw new DisconnectedException("Runtime disconnected", getDisconnectedException()); //$NON-NLS-1$
-		}
-		synchronized (outgoingPackets) {
-			// Add packet to list of packets to send.
-			outgoingPackets.add(packet);
-			// Notify PacketSendThread that data is available.
-			outgoingPackets.notifyAll();
-		}
-	}
-
-	/**
-	 * Send available packets to the Virtual Machine.
-	 */
-	private void sendAvailablePackets() throws InterruptedException, IOException {
-		Object[] packetsToSend;
-		synchronized (outgoingPackets) {
-			while (outgoingPackets.size() == 0) {
-				outgoingPackets.wait();
-			}
-			packetsToSend = outgoingPackets.toArray();
-			outgoingPackets.clear();
-		}
-
-		// Put available packets on Output Stream.
-		for (int i = 0; i < packetsToSend.length; i++) {
-			getConnection().writePacket((Packet) packetsToSend[i]);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PipedConnection.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PipedConnection.java
deleted file mode 100644
index cd38971..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PipedConnection.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.transport;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.Writer;
-import java.util.Map;
-
-/**
- * A {@link Connection} implementation that uses streams for communication
- * 
- * @since 1.0
- */
-public class PipedConnection implements Connection {
-
-	private Writer writer;
-	private Reader reader;
-	private boolean open = true;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param is the {@link InputStream} to read from, <code>null</code> is not accepted
-	 * @param os the {@link OutputStream} to write to, <code>null</code> is not accepted
-	 * @throws IOException
-	 */
-	public PipedConnection(InputStream is, OutputStream os) throws IOException {
-		if(is == null) {
-			throw new IllegalArgumentException("You cannot create a new PipedConnection on a null InputStream"); //$NON-NLS-1$
-		}
-		if(os == null) {
-			throw new IllegalArgumentException("You cannot create a new PipedConnection on a null OutputStream"); //$NON-NLS-1$
-		}
-		writer = new BufferedWriter(new OutputStreamWriter(os, Constants.UTF_8));
-		reader = new BufferedReader(new InputStreamReader(is, Constants.UTF_8));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.Connection#isOpen()
-	 */
-	public synchronized boolean isOpen() {
-		return open;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.Connection#close()
-	 */
-	public synchronized void close() throws IOException {
-		open = false;
-		writer.close();
-		reader.close();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.Connection#writePacket(org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.Packet)
-	 */
-	public void writePacket(Packet packet) throws IOException {
-		String jsonString = JSONUtil.write(packet.toJSON());
-		String count = Integer.toString(jsonString.length());
-		writer.write(count);
-		writer.write('\r');
-		writer.write('\n');
-		writer.write(jsonString);
-		writer.flush();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.Connection#readPacket()
-	 */
-	public Packet readPacket() throws IOException {
-		StringBuffer buffer = new StringBuffer();
-		int c;
-		while ((c = reader.read()) != -1) {
-			if (c == '\r')
-				break;
-			buffer.append((char) c);
-			if (buffer.length() > 10) {
-				throw new IOException("Invalid content length: " + buffer.toString()); //$NON-NLS-1$
-			}
-		}
-
-		int length = 0;
-		try {
-			length = Integer.parseInt(buffer.toString());
-		} catch (NumberFormatException e) {
-			throw new IOException("Failed to parse content length: " + buffer.toString()); //$NON-NLS-1$
-		}
-
-		if ('\r' != c || '\n' != (char) reader.read())
-			throw new IOException("Missing CRLF after content length"); //$NON-NLS-1$
-
-		char[] message = new char[length];
-		int n = 0;
-		int off = 0;
-		while (n < length) {
-			int count = reader.read(message, off + n, length - n);
-			if (count < 0)
-				throw new EOFException();
-			n += count;
-		}
-
-		Map json = (Map) JSONUtil.read(new String(message));
-		String type = Packet.getType(json);
-		if (EventPacket.TYPE.equals(type))
-			return new EventPacket(json);
-		if (JSONConstants.REQUEST.equals(type))
-			return new Request(json);
-		if (JSONConstants.RESPONSE.equals(type))
-			return new Response(json);
-
-		throw new IOException("Unknown packet type: " + type); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PipedTransportService.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PipedTransportService.java
deleted file mode 100644
index 01d9049..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/PipedTransportService.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.transport;
-
-import java.io.IOException;
-import java.io.PipedInputStream;
-import java.io.PipedOutputStream;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * {@link TransportService} specialization for a {@link PipedConnection}
- * 
- * @since 1.0
- */
-public class PipedTransportService implements TransportService {
-
-	/**
-	 * Key specialized for a {@link PipedTransportService}
-	 */
-	public static class PipedListenerKey implements ListenerKey {
-
-		private String address;
-
-		public PipedListenerKey(String address) {
-			this.address = address;
-		}
-
-		public String address() {
-			return address;
-		}
-
-		public int hashCode() {
-			final int prime = 31;
-			int result = 1;
-			result = prime * result + ((address == null) ? 0 : address.hashCode());
-			return result;
-		}
-
-		public boolean equals(Object obj) {
-			if (this == obj)
-				return true;
-			if (obj == null)
-				return false;
-			if (getClass() != obj.getClass())
-				return false;
-			PipedListenerKey other = (PipedListenerKey) obj;
-			if (address == null) {
-				if (other.address != null)
-					return false;
-			} else if (!address.equals(other.address))
-				return false;
-			return true;
-		}
-	}
-
-	Map listeners = new HashMap();
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.TransportService#startListening(java.lang.String)
-	 */
-	public synchronized ListenerKey startListening(String address) throws IOException {
-		ListenerKey key = new PipedListenerKey(address == null ? Constants.EMPTY_STRING : address);
-		listeners.put(key, null);
-		return key;
-	};
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.TransportService#stopListening(org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.TransportService.ListenerKey)
-	 */
-	public void stopListening(ListenerKey key) throws IOException {
-		synchronized (key) {
-			if (listeners.containsKey(key)) {
-				key.notify();
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.TransportService#accept(org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.TransportService.ListenerKey, long, long)
-	 */
-	public Connection accept(ListenerKey key, long attachTimeout, long handshakeTimeout) throws IOException {
-		long timeout = attachTimeout;
-		if (timeout > 0) {
-			if (timeout > Integer.MAX_VALUE) {
-				timeout = Integer.MAX_VALUE; // approximately 25 days!
-			}
-		}
-
-		synchronized (listeners) {
-			if (!listeners.containsKey(key))
-				throw new IllegalStateException("not listening"); //$NON-NLS-1$
-
-			if (listeners.get(key) != null)
-				throw new IllegalStateException("PipedTransport only accepts one accept at a time"); //$NON-NLS-1$
-
-			PipedInputStream serveris = new PipedInputStream();
-			PipedOutputStream clientos = new PipedOutputStream();
-			serveris.connect(clientos);
-
-			PipedOutputStream serveros = new PipedOutputStream();
-			PipedInputStream clientis = new PipedInputStream();
-			serveros.connect(clientis);
-
-			listeners.put(key, new PipedConnection(clientis, clientos));
-			listeners.notifyAll();
-			long startTime = System.currentTimeMillis();
-			while (true) {
-				try {
-					listeners.wait(timeout);
-				} catch (InterruptedException e) {
-					throw new IOException("accept failed: interrupted"); //$NON-NLS-1$
-				}
-				if (!listeners.containsKey(key))
-					throw new IOException("accept failed: stopped listening"); //$NON-NLS-1$
-
-				if (listeners.get(key) != null) {
-					if (System.currentTimeMillis() - startTime > timeout) {
-						listeners.put(key, null);
-						throw new IOException("accept failed: timed out"); //$NON-NLS-1$
-					}
-					continue;
-				}
-				return new PipedConnection(serveris, serveros);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.TransportService#attach(java.lang.String, long, long)
-	 */
-	public Connection attach(String address, long attachTimeout, long handshakeTimeout) throws IOException {
-		ListenerKey key = new PipedListenerKey(address == null ? Constants.EMPTY_STRING : address);
-		Connection connection;
-		long startTime = System.currentTimeMillis();
-		synchronized (listeners) {
-			connection = (Connection) listeners.get(key);
-			while (connection == null) {
-				if (System.currentTimeMillis() - startTime > attachTimeout)
-					throw new IOException("attach failed: timed out"); //$NON-NLS-1$
-				try {
-					listeners.wait(attachTimeout);
-				} catch (InterruptedException e) {
-					throw new IOException("attach failed: interrupted"); //$NON-NLS-1$
-				}
-				connection = (Connection) listeners.get(key);
-			}
-			listeners.put(key, null);
-			listeners.notifyAll();
-		}
-		return connection;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/Request.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/Request.java
deleted file mode 100644
index 63dca4e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/Request.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.transport;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Default request implementation using JSON
- * 
- * @since 1.0
- */
-public class Request extends Packet {
-
-	private final String command;
-	private final Map arguments = Collections.synchronizedMap(new HashMap());
-
-	/**
-	 * Constructor
-	 * 
-	 * @param command the command, <code>null</code> is not accepted
-	 */
-	public Request(String command) {
-		super(JSONConstants.REQUEST);
-		if(command == null) {
-			throw new IllegalArgumentException("The request command kind cannot be null"); //$NON-NLS-1$
-		}
-		this.command = command.intern();
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param json map of JSON attributes, <code>null</code> is not accepted
-	 */
-	public Request(Map json) {
-		super(json);
-		if(json == null) {
-			throw new IllegalArgumentException("The JSON map for a request packet cannot be null"); //$NON-NLS-1$
-		}
-		String packetCommand = (String) json.get(JSONConstants.COMMAND);
-		this.command = packetCommand.intern();
-		Map packetArguments = (Map) json.get(JSONConstants.ARGUMENTS);
-		arguments.putAll(packetArguments);
-	}
-
-	/**
-	 * Returns the command that this {@link Request} will was created for.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the underlying command, never <code>null</code>
-	 */
-	public String getCommand() {
-		return command;
-	}
-
-	/**
-	 * Returns the complete collection of JSON arguments in the {@link Request}.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>, an empty map will be returned
-	 * if there are no properties.
-	 * 
-	 * @return the arguments or an empty map never <code>null</code>
-	 */
-	public Map getArguments() {
-		return arguments;
-	}
-
-	/**
-	 * Sets the given argument in the JSON map.
-	 * 
-	 * @param key the key for the attribute, <code>null</code> is not accepted
-	 * @param argument the value for the argument, <code>null</code> is not accepted
-	 */
-	public void setArgument(String key, Object argument) {
-		if(key == null) {
-			throw new IllegalArgumentException("The argument key cannot be null"); //$NON-NLS-1$
-		}
-		if(argument == null) {
-			throw new IllegalArgumentException("A null argument is not allowed"); //$NON-NLS-1$
-		}
-		arguments.put(key, argument);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.Packet#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = super.toJSON();
-		json.put(JSONConstants.COMMAND, command);
-		json.put(JSONConstants.ARGUMENTS, arguments);
-		return json;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("Request: ").append(JSONUtil.write(toJSON())); //$NON-NLS-1$
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/Response.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/Response.java
deleted file mode 100644
index 636e776..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/Response.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.transport;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Default {@link Response} implementation using JSON
- * 
- * @since 1.0
- */
-public class Response extends Packet {
-
-	private final String command;
-	private final int requestSequence;
-	private final Map body = Collections.synchronizedMap(new HashMap());
-	private volatile boolean success = true;
-	private volatile boolean running = true;
-	private volatile String message;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param requestSequence the sequence
-	 * @param command the command, <code>null</code> is not accepted
-	 */
-	public Response(int requestSequence, String command) {
-		super(JSONConstants.RESPONSE);
-		if(command == null) {
-			throw new IllegalArgumentException("The command string for a response packet cannot be null"); //$NON-NLS-1$
-		}
-		this.requestSequence = requestSequence;
-		this.command = command.intern();
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param json the JSON map for a response, <code>null</code> is not accepted
-	 */
-	public Response(Map json) {
-		super(json);
-		Number packetRequestSeq = (Number) json.get(JSONConstants.REQUEST_SEQ);
-		requestSequence = packetRequestSeq.intValue();
-
-		String packetCommand = (String) json.get(JSONConstants.COMMAND);
-		command = packetCommand.intern();
-
-		Map packetBody = (Map) json.get(JSONConstants.BODY);
-		body.putAll(packetBody);
-
-		Boolean packetSuccess = (Boolean) json.get(JSONConstants.SUCCESS);
-		success = packetSuccess.booleanValue();
-
-		Boolean packetRunning = (Boolean) json.get(JSONConstants.RUNNING);
-		running = packetRunning.booleanValue();
-
-		message = (String) json.get(JSONConstants.MESSAGE);
-	}
-
-	/**
-	 * Returns the request sequence
-	 * 
-	 * @return the request sequence
-	 */
-	public int getRequestSequence() {
-		return requestSequence;
-	}
-
-	/**
-	 * Returns the underlying command.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>
-	 * 
-	 * @return the underlying command, never <code>null</code>
-	 */
-	public String getCommand() {
-		return command;
-	}
-
-	/**
-	 * Returns the body of the command.<br>
-	 * <br>
-	 * This method cannot return <code>null</code>, if there is no body
-	 * an empty {@link Map} is returned.
-	 *  
-	 * @return the body of the JSON response or an empty {@link Map} never <code>null</code>
-	 */
-	public Map getBody() {
-		return body;
-	}
-
-	/**
-	 * Returns <code>true</code> if the {@link Request} was successful
-	 * 
-	 * @return <code>true</code> if the {@link Request} was successful, <code>false</code> otherwise
-	 */
-	public boolean isSuccess() {
-		return success;
-	}
-
-	/**
-	 * Set the success flag for the response
-	 * 
-	 * @param success the new success flag
-	 */
-	public void setSuccess(boolean success) {
-		this.success = success;
-	}
-
-	/**
-	 * Returns <code>true</code> if the underlying command is currently running.
-	 * 
-	 * @return <code>true</code> if the underlying command is running, <code>false</code> otherwise
-	 */
-	public boolean isRunning() {
-		return running;
-	}
-
-	/**
-	 * Sets the running state of the underlying command
-	 * 
-	 * @param running the new running state for the underlying command
-	 */
-	public void setRunning(boolean running) {
-		this.running = running;
-	}
-
-	/**
-	 * Returns the status message for this {@link Response}.<br>
-	 * <br>
-	 * This method can return <code>null</code>
-	 * 
-	 * @return the status message for this {@link Response} or <code>null</code>
-	 */
-	public String getMessage() {
-		return message;
-	}
-
-	/**
-	 * Set the status message for this {@link Response}
-	 * 
-	 * @param message the new message, <code>null</code> is accepted
-	 */
-	public void setMessage(String message) {
-		this.message = message;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.Packet#toJSON()
-	 */
-	public Map toJSON() {
-		Map json = super.toJSON();
-		json.put(JSONConstants.REQUEST_SEQ, new Integer(requestSequence));
-		json.put(JSONConstants.COMMAND, command);
-		json.put(JSONConstants.BODY, body);
-		json.put(JSONConstants.SUCCESS, new Boolean(success));
-		json.put(JSONConstants.RUNNING, new Boolean(running));
-		if (message != null) {
-			json.put(JSONConstants.MESSAGE, message);
-		}
-		return json;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("Response Packet: ").append(JSONUtil.write(toJSON())); //$NON-NLS-1$
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/SocketConnection.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/SocketConnection.java
deleted file mode 100644
index 425ce20..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/SocketConnection.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.transport;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.EOFException;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.Writer;
-import java.net.Socket;
-import java.util.Map;
-
-/**
- * A specialized {@link Connection} that communicates using {@link Socket}s
- * 
- * @since 1.0
- */
-public class SocketConnection implements Connection {
-
-	private Writer writer;
-	private Reader reader;
-	private Socket socket;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param socket the underlying {@link Socket}, <code>null</code> is not accepted
-	 * 
-	 * @throws IOException
-	 */
-	public SocketConnection(Socket socket) throws IOException {
-		if(socket == null) {
-			throw new IllegalArgumentException("You cannot create a new SocketConnection on a null Socket"); //$NON-NLS-1$
-		}
-		this.socket = socket;
-		writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), Constants.UTF_8));
-		reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), Constants.UTF_8));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.Connection#isOpen()
-	 */
-	public boolean isOpen() {
-		return !socket.isClosed();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.Connection#close()
-	 */
-	public void close() throws IOException {
-		socket.close();
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.Connection#writePacket(org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.Packet)
-	 */
-	public void writePacket(Packet packet) throws IOException {
-		String jsonString = JSONUtil.write(packet.toJSON());
-		String count = Integer.toString(jsonString.length());
-		writer.write(count);
-		writer.write('\r');
-		writer.write('\n');
-		writer.write(jsonString);
-		writer.flush();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.Connection#readPacket()
-	 */
-	public Packet readPacket() throws IOException {
-		StringBuffer buffer = new StringBuffer();
-		int c;
-		while ((c = reader.read()) != -1) {
-			if (c == '\r')
-				break;
-			buffer.append((char) c);
-			if (buffer.length() > 10) {
-				throw new IOException("Invalid content length: " + buffer.toString()); //$NON-NLS-1$
-			}
-		}
-
-		int length = 0;
-		try {
-			length = Integer.parseInt(buffer.toString());
-		} catch (NumberFormatException e) {
-			throw new IOException("Failed to parse content length: " + buffer.toString()); //$NON-NLS-1$
-		}
-
-		if ('\r' != c || '\n' != (char) reader.read())
-			throw new IOException("Missing CRLF after content length"); //$NON-NLS-1$
-
-		char[] message = new char[length];
-		int n = 0;
-		int off = 0;
-		while (n < length) {
-			int count = reader.read(message, off + n, length - n);
-			if (count < 0)
-				throw new EOFException();
-			n += count;
-		}
-
-		Map json = (Map) JSONUtil.read(new String(message));
-		String type = Packet.getType(json);
-		if (EventPacket.TYPE.equals(type))
-			return new EventPacket(json);
-		if (JSONConstants.REQUEST.equals(type))
-			return new Request(json);
-		if (JSONConstants.RESPONSE.equals(type))
-			return new Response(json);
-
-		throw new IOException("Unknown packet type: " + type); //$NON-NLS-1$
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/SocketTransportService.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/SocketTransportService.java
deleted file mode 100644
index 085b832..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/SocketTransportService.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.transport;
-
-import java.io.IOException;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.HashMap;
-import java.util.Map;
-
-
-/**
- * Implementation of a transport service that using a {@link Socket} for communication
- * 
- * @since 1.0
- */
-public class SocketTransportService implements TransportService {
-
-	static final Class serverSocketClass = ServerSocket.class; // temporary used to pre-load the ServerSocket.class
-
-	/**
-	 * Key implementation
-	 */
-	public static class SocketListenerKey implements ListenerKey {
-
-		private String address;
-
-		public SocketListenerKey(String address) {
-			this.address = address;
-		}
-
-		public String address() {
-			return address;
-		}
-	}
-
-	/**
-	 * Map of {@link ListenerKey} to {@link ServerSocket}s
-	 */
-	Map listeners = new HashMap();
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.TransportService#startListening(java.lang.String)
-	 */
-	public synchronized ListenerKey startListening(String address) throws IOException {
-		String host = null;
-		int port = 0;
-		if (address != null) {
-			String[] strings = address.split(Constants.COLON);
-			if (strings.length == 2) {
-				host = strings[0];
-				port = Integer.parseInt(strings[1]);
-			} else {
-				port = Integer.parseInt(strings[0]);
-			}
-		}
-		if (host == null) {
-			host = LOCALHOST;
-		}
-		if (!host.equals(LOCALHOST)) {
-			throw new IllegalArgumentException("Only localhost is supported."); //$NON-NLS-1$
-		}
-		ListenerKey key = new SocketListenerKey(host + Constants.COLON + port);
-		ServerSocket serverSocket = new ServerSocket(port);
-		listeners.put(key, serverSocket);
-		return key;
-
-	};
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.TransportService#stopListening(org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.TransportService.ListenerKey)
-	 */
-	public void stopListening(ListenerKey key) throws IOException {
-		ServerSocket serverSocket = (ServerSocket) listeners.remove(key);
-		if (serverSocket != null) {
-			serverSocket.close();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.TransportService#accept(org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.TransportService.ListenerKey, long, long)
-	 */
-	public Connection accept(ListenerKey key, long attachTimeout, long handshakeTimeout) throws IOException {
-		ServerSocket serverSocket = (ServerSocket) listeners.get(key);
-		if (serverSocket == null) {
-			throw new IllegalStateException("Accept failed. Not listening for address: key.address()"); //$NON-NLS-1$
-		}
-		int timeout = (int) attachTimeout;
-		if (timeout > 0) {
-			if (timeout > Integer.MAX_VALUE) {
-				timeout = Integer.MAX_VALUE; // approximately 25 days!
-			}
-			serverSocket.setSoTimeout(timeout);
-		}
-		Connection connection = new SocketConnection(serverSocket.accept());
-		Packet packet = connection.readPacket();
-		if (!(packet instanceof Request)) {
-			throw new IOException("failure establishing_connection"); //$NON-NLS-1$
-		}
-		Request request = (Request) packet;
-		if (!request.getCommand().equals(JSONConstants.CONNECT)) {
-			throw new IOException("failure establishing connection"); //$NON-NLS-1$
-		}
-		Response response = new Response(request.getSequence(), request.getCommand());
-		connection.writePacket(response);
-		return connection;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.core.jsdi.connect.TransportService#attach(java.lang.String, long, long)
-	 */
-	public Connection attach(String address, long attachTimeout, long handshakeTimeout) throws IOException {
-
-		String host = null;
-		int port = 0;
-		if (address != null) {
-			String[] strings = address.split(Constants.COLON);
-			if (strings.length == 2) {
-				host = strings[0];
-				port = Integer.parseInt(strings[1]);
-			} else {
-				port = Integer.parseInt(strings[0]);
-			}
-		}
-		if (host == null) {
-			host = LOCALHOST;
-		}
-		Connection connection = new SocketConnection(new Socket(host, port));
-		Request request = new Request(JSONConstants.CONNECT);
-		connection.writePacket(request);
-
-		Packet packet = connection.readPacket();
-		if (!(packet instanceof Response)) {
-			throw new IOException("failure establishing connection"); //$NON-NLS-1$
-		}
-
-		Response response = (Response) packet;
-		if (!response.getCommand().equals(JSONConstants.CONNECT) || response.getRequestSequence() != request.getSequence() || !response.isSuccess() || !response.isRunning()) {
-			throw new IOException("failure establishing connection"); //$NON-NLS-1$
-		}
-		return connection;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/TimeoutException.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/TimeoutException.java
deleted file mode 100644
index 2d1aa0b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/TimeoutException.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.transport;
-
-/**
- * This exception is thrown if the {@link PacketSendManager} or {@link PacketReceiveManager}
- * times out while waiting for a response
- * 
- * @since 1.0
- */
-public final class TimeoutException extends Exception {
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param message the message for the exception
-	 */
-	public TimeoutException(String message) {
-		super(message);
-	}
-
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/TransportService.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/TransportService.java
deleted file mode 100644
index 4850c4c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/TransportService.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.transport;
-
-import java.io.IOException;
-
-
-/**
- * A transport service is used to attach and / or listen to a 
- * {@link Connection} exactly how the service communicates is an implementation detail.
- * 
- * @since 1.0
- */
-public interface TransportService {
-
-	public static final String LOCALHOST = "localhost"; //$NON-NLS-1$
-	public static final String PORT = "port"; //$NON-NLS-1$
-
-	/**
-	 * Describes a unique address to listen on
-	 */
-	public interface ListenerKey {
-		public String address();
-	}
-
-	/**
-	 * Registers that this service should begin listening to the given address
-	 * 
-	 * @param address the address to listen on - e.g. localhost:12000
-	 * @return the key that uniquely identifies this service
-	 * @throws IOException
-	 */
-	public ListenerKey startListening(String address) throws IOException;
-
-	/**
-	 * Stops listening for the given key
-	 * 
-	 * @param listenerKey
-	 * @throws IOException
-	 */
-	public void stopListening(ListenerKey listenerKey) throws IOException;
-
-	/**
-	 * Listens for a connection to be made to and accepts it. The method can block until a connection is made.
-	 * 
-	 * @param listenerKey
-	 * @param attachTimeout
-	 * @param handshakeTimeout
-	 * @return the resulting {@link Connection}
-	 * @throws IOException
-	 */
-	public Connection accept(ListenerKey listenerKey, long attachTimeout, long handshakeTimeout) throws IOException;
-
-	/**
-	 * Attaches to the given address and returns the resulting connection. This method can block until a connection is made
-	 * 
-	 * @param address
-	 * @param attachTimeout
-	 * @param handshakeTimeout
-	 * @return the resulting {@link Connection}
-	 * @throws IOException
-	 */
-	public Connection attach(String address, long attachTimeout, long handshakeTimeout) throws IOException;
-
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/messages.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/messages.properties
deleted file mode 100644
index 432ac35..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/internal/rhino/transport/messages.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 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
-###############################################################################
-failure_establishing_connection=failure establishing connection
-runtime_disconnected=Runtime disconnected
-time_out_waiting_for_command_packet=Time out waiting for command packet for: {0}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/RhinoDebugger.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/RhinoDebugger.java
deleted file mode 100644
index 019e95a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/RhinoDebugger.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.rhino.debugger;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.debugger.RhinoDebuggerImpl;
-import org.mozilla.javascript.Context;
-import org.mozilla.javascript.ContextFactory;
-
-/**
- * Rhino debugger
- * 
- * @since 1.0
- */
-public final class RhinoDebugger implements ContextFactory.Listener {
-	
-	/**
-	 * Delegate debugger
-	 */
-	private RhinoDebuggerImpl impl;
-
-	/**
-	 * This constructor will only accept a <code>transport</code> argument
-	 * of <code>socket</code>. I.e. <code>transport=socket</code>.
-	 * 
-	 * @param configString the configuration string, for example: <code>transport=socket,suspend=y,address=9000</code>
-	 */
-	public RhinoDebugger(String configString) {
-		impl = new RhinoDebuggerImpl(configString);
-	}
-	
-	/**
-	 * Starts the debugger
-	 * 
-	 * @throws Exception if the debugger could not start
-	 */
-	public void start() throws Exception {
-		impl.start();
-	}
-
-	/**
-	 * Stops the debugger
-	 */
-	public void stop() throws Exception {
-		impl.stop();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.mozilla.javascript.ContextFactory.Listener#contextCreated(org.mozilla.javascript.Context)
-	 */
-	public void contextCreated(Context context) {
-		impl.contextCreated(context);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.mozilla.javascript.ContextFactory.Listener#contextReleased(org.mozilla.javascript.Context)
-	 */
-	public void contextReleased(Context context) {
-		impl.contextReleased(context);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/shell/DebugShell.java b/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/shell/DebugShell.java
deleted file mode 100644
index 485333c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino.debugger/src/org/eclipse/wst/jsdt/debug/rhino/debugger/shell/DebugShell.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.rhino.debugger.shell;
-
-import java.util.ArrayList;
-
-import org.eclipse.wst.jsdt.debug.internal.rhino.debugger.RhinoDebuggerImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.SocketTransportService;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.TransportService;
-import org.mozilla.javascript.tools.shell.Main;
-
-/**
- * Entry point for launching a Rhino debugger
- * 
- * @since 1.0
- */
-public final class DebugShell {
-	
-    public static void main(String args[]) {
-    	
-    	String port = "9888"; //$NON-NLS-1$
-    	boolean suspend = false;
-    	
-    	ArrayList argList = new ArrayList();
-    	for (int i = 0; i < args.length; i++) {
-    		String arg = args[i];
-    		if (arg.equals("-port")) { //$NON-NLS-1$
-    			port = args[++i];
-    		} else if (arg.equals("-suspend")) { //$NON-NLS-1$
-    			suspend = Boolean.valueOf(args[++i]).booleanValue();
-    		} else if (arg.equals("-debug")) { //$NON-NLS-1$
-    			// skip
-    			argList.add(args[i]);
-    			continue;
-    		} else if (arg.equals("-opt")) { //$NON-NLS-1$
-    			// skip
-    			argList.add(args[i]);
-    			i++;
-    			continue;
-    		}
-		}
-    	String[] newArgs = (String[]) argList.toArray(new String[0]); 
-    	
-		TransportService service = new SocketTransportService();
-		RhinoDebuggerImpl debugger = new RhinoDebuggerImpl(service, port, suspend);
-		try {
-			debugger.start();
-			Main.shellContextFactory.addListener(debugger);
-			Main.main(newArgs);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-    }
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/.classpath b/bundles/org.eclipse.wst.jsdt.debug.rhino/.classpath
deleted file mode 100644
index 2fbb7a2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/.project b/bundles/org.eclipse.wst.jsdt.debug.rhino/.project
deleted file mode 100644
index 742a9ed..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.wst.jsdt.debug.rhino</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.wst.jsdt.debug.rhino/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index de9eac3..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,90 +0,0 @@
-#Fri Apr 30 10:04:28 CDT 2010
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.4
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
-org.eclipse.jdt.core.compiler.problem.deadCode=error
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=error
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=error
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.3
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/META-INF/MANIFEST.MF b/bundles/org.eclipse.wst.jsdt.debug.rhino/META-INF/MANIFEST.MF
deleted file mode 100644
index d055faa..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,22 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %Bundle-Name
-Bundle-Vendor: %Bundle-Vendor
-Bundle-SymbolicName: org.eclipse.wst.jsdt.debug.rhino;singleton:=true
-Bundle-Version: 1.0.1.qualifier
-Bundle-Activator: org.eclipse.wst.jsdt.debug.internal.rhino.RhinoDebugPlugin
-Require-Bundle: org.eclipse.core.runtime;bundle-version="3.6.0"
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.wst.jsdt.debug.internal.rhino.jsdi;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.connect;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event;x-internal:=true,
- org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request;x-internal:=true
-Import-Package: org.eclipse.debug.core.model,
- org.eclipse.wst.jsdt.debug.core.breakpoints,
- org.eclipse.wst.jsdt.debug.core.jsdi,
- org.eclipse.wst.jsdt.debug.core.jsdi.connect,
- org.eclipse.wst.jsdt.debug.core.jsdi.event,
- org.eclipse.wst.jsdt.debug.core.jsdi.request,
- org.eclipse.wst.jsdt.debug.core.model,
- org.eclipse.wst.jsdt.debug.internal.rhino.transport
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/OSGI-INF/l10n/bundle.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino/OSGI-INF/l10n/bundle.properties
deleted file mode 100644
index f4cd190..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/OSGI-INF/l10n/bundle.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 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
-###############################################################################
-Bundle-Vendor = Eclipse Web Tools Platform
-Bundle-Name = Rhino JavaScript Debug
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/about.html b/bundles/org.eclipse.wst.jsdt.debug.rhino/about.html
deleted file mode 100755
index b4a1c56..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>March 10, 2010</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/build.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino/build.properties
deleted file mode 100644
index c1711a9..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/build.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               about.html,\
-               OSGI-INF/l10n/bundle.properties
-src.includes = about.html
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/plugin.xml b/bundles/org.eclipse.wst.jsdt.debug.rhino/plugin.xml
deleted file mode 100644
index 59d383e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/plugin.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?><!--
-    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
- -->
-
-<plugin>
-   <extension
-         point="org.eclipse.wst.jsdt.debug.core.launchingConnectors">
-      <connector
-            class="org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.connect.RhinoAttachingConnector"
-            id="rhino.attaching.connector">
-      </connector>
-   </extension>
-   <extension
-         point="org.eclipse.wst.jsdt.debug.core.breakpointParticipants">
-      <participant
-            class="org.eclipse.wst.jsdt.debug.internal.rhino.breakpoints.RhinoBreakpointParticipant"
-            kind="*">
-      </participant>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.preferences">
-      <initializer
-            class="org.eclipse.wst.jsdt.debug.internal.rhino.RhinoPreferenceInitializer">
-      </initializer>
-   </extension>
-
-</plugin>
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/Constants.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/Constants.java
deleted file mode 100644
index a12a140..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/Constants.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino;
-
-/**
- * Collection of constants used in Rhino
- * 
- * @since 1.0
- */
-public interface Constants {
-
-//############## GENERAL ####################
-	public static final String SPACE = " "; //$NON-NLS-1$
-	public static String URI_FILE_SCHEME = "file"; //$NON-NLS-1$
-	public static String STD_IN = "stdin"; //$NON-NLS-1$
-	public static String STD_IN_URI = "<stdin>"; //$NON-NLS-1$
-	
-//############## PREFERENCES ################
-	public static String SUSPEND_ON_STDIN_LOAD = RhinoDebugPlugin.PLUGIN_ID + ".suspend_on_stdin_load"; //$NON-NLS-1$
-	
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoDebugPlugin.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoDebugPlugin.java
deleted file mode 100644
index 64b62af..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoDebugPlugin.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.core.runtime.Status;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- * 
- * @since 1.0
- */
-public class RhinoDebugPlugin extends Plugin {
-
-	/**
-	 * Status code indicating an unexpected internal error.
-	 */
-	public static final int INTERNAL_ERROR = 120;
-	/**
-	 * The ID of the bundle<br>
-	 * <br>
-	 * value is: <code>org.eclipse.wst.jsdt.debug.core</code>
-	 */
-	public static final String PLUGIN_ID = "org.eclipse.wst.jsdt.debug.rhino"; //$NON-NLS-1$
-
-	/**
-	 * The singleton instance
-	 */
-	private static RhinoDebugPlugin plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public RhinoDebugPlugin() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static RhinoDebugPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Logs the specified status with this plug-in's log.
-	 * 
-	 * @param status status to log
-	 */
-	public static void log(IStatus status) {
-		if (plugin != null) {
-			plugin.getLog().log(status);
-		}
-	}
-
-	/**
-	 * Logs the specified throwable with this plug-in's log.
-	 * 
-	 * @param t throwable to log 
-	 */
-	public static void log(Throwable t) {
-		log(newErrorStatus("Error logged from Rhino Debug: ", t)); //$NON-NLS-1$
-	}
-	
-	/**
-	 * Logs an internal error with the specified message.
-	 * 
-	 * @param message the error message to log
-	 */
-	public static void logErrorMessage(String message) {
-		log(newErrorStatus("Internal message logged from Rhino Debug: " + message, null)); //$NON-NLS-1$	
-	}
-	
-	/**
-	 * Returns a new error status for this plug-in with the given message
-	 * @param message the message to be included in the status
-	 * @param exception the exception to be included in the status or <code>null</code> if none
-	 * @return a new error status
-	 */
-	public static IStatus newErrorStatus(String message, Throwable exception) {
-		return new Status(IStatus.ERROR, PLUGIN_ID, INTERNAL_ERROR, message, exception);
-	}
-	
-	/**
-	 * Creates a new {@link URI} with the <code>file</code> scheme
-	 * @param path
-	 * @return a new {@link URI}
-	 * @throws URISyntaxException
-	 */
-	public static URI fileURI(IPath path) throws URISyntaxException {
-		return new URI(Constants.URI_FILE_SCHEME, null, path.makeAbsolute().toString(), null);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoPreferenceInitializer.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoPreferenceInitializer.java
deleted file mode 100644
index af9a967..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoPreferenceInitializer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino;
-
-import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer;
-import org.eclipse.core.runtime.preferences.DefaultScope;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.osgi.service.prefs.BackingStoreException;
-
-/**
- * Initializes the preferences for Rhino
- * 
- * @since 1.0
- */
-public class RhinoPreferenceInitializer extends AbstractPreferenceInitializer {
-
-	/**
-	 * Constructor
-	 */
-	public RhinoPreferenceInitializer() {}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer#initializeDefaultPreferences()
-	 */
-	public void initializeDefaultPreferences() {
-		IEclipsePreferences defaultscope = new DefaultScope().getNode(RhinoDebugPlugin.PLUGIN_ID);
-		defaultscope.putBoolean(Constants.SUSPEND_ON_STDIN_LOAD, false);
-		try {
-			defaultscope.flush();
-		} catch (BackingStoreException e) {
-			RhinoDebugPlugin.log(e);
-		}
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoPreferencesManager.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoPreferencesManager.java
deleted file mode 100644
index 8589683..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/RhinoPreferencesManager.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-
-/**
- * Handles all of the core Rhino preferences - allows easy access to a variety of preferences
- * and tracks changes to those preferences.
- * 
- * @since 1.0
- */
-public class RhinoPreferencesManager implements IPreferenceChangeListener {
-
-	/**
-	 * Starts the manager
-	 */
-	public void start() {
-		IEclipsePreferences node = new InstanceScope().getNode(RhinoDebugPlugin.PLUGIN_ID);
-		if(node != null) {
-			node.addPreferenceChangeListener(this);
-		}
-		else {
-			//our preference node is bogus report the status
-			RhinoDebugPlugin.logErrorMessage("The Rhino core preference node could not loaded"); //$NON-NLS-1$
-		}
-	}
-	
-	/**
-	 * Stops the manager and frees any resources held
-	 */
-	public void stop() {
-		IEclipsePreferences node = new InstanceScope().getNode(RhinoDebugPlugin.PLUGIN_ID);
-		if(node != null) {
-			node.removePreferenceChangeListener(this);
-		}
-		else {
-			//our preference node is bogus report the status
-			RhinoDebugPlugin.logErrorMessage("The Rhino core preference node could not loaded"); //$NON-NLS-1$
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.core.runtime.preferences.IEclipsePreferences.IPreferenceChangeListener#preferenceChange(org.eclipse.core.runtime.preferences.IEclipsePreferences.PreferenceChangeEvent)
-	 */
-	public void preferenceChange(PreferenceChangeEvent event) {
-	}
-
-	/**
-	 * Returns if we should be suspending on script load events from stdin - i.e. from the Rhino console.
-	 * 
-	 * @return <code>true</code> if we should suspend on a script load for stdin, <code>false</code> otherwise
-	 */
-	public static boolean suspendOnStdinLoad() {
-		return Platform.getPreferencesService().getBoolean(RhinoDebugPlugin.PLUGIN_ID, Constants.SUSPEND_ON_STDIN_LOAD, false, null);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/breakpoints/RhinoBreakpointParticipant.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/breakpoints/RhinoBreakpointParticipant.java
deleted file mode 100644
index 5daa371..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/breakpoints/RhinoBreakpointParticipant.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.breakpoints;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.URIUtil;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant;
-import org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptLineBreakpoint;
-import org.eclipse.wst.jsdt.debug.core.jsdi.BooleanValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptPrimitiveValue;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread;
-import org.eclipse.wst.jsdt.debug.core.model.IJavaScriptValue;
-import org.eclipse.wst.jsdt.debug.internal.rhino.Constants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.RhinoPreferencesManager;
-
-/**
- * Participant for Rhino
- * 
- * @since 1.0
- */
-public class RhinoBreakpointParticipant implements IJavaScriptBreakpointParticipant {
-
-	/**
-	 * Constructor
-	 */
-	public RhinoBreakpointParticipant() {
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant#breakpointHit(org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread, org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint)
-	 */
-	public int breakpointHit(IJavaScriptThread thread, IJavaScriptBreakpoint breakpoint) {
-		try {
-			if(breakpoint instanceof IJavaScriptLineBreakpoint) {
-				IJavaScriptLineBreakpoint lbp = (IJavaScriptLineBreakpoint) breakpoint;
-				String condition = lbp.getCondition();
-				if (condition != null) {
-					// evaluate it
-					if (thread.getFrameCount() < 1) {
-						return DONT_SUSPEND;
-					}
-					IJavaScriptValue value = thread.evaluate(condition);
-					if (lbp.isConditionSuspendOnTrue()) {
-						if(suspendForValue(value)) {
-							return SUSPEND;
-						}
-					} 
-					if(!suspendForValue(value)) {
-						return SUSPEND; 
-					}
-				}
-				return SUSPEND;
-			}
-		} 
-		catch (CoreException ce) {
-			//ignore, just don't suspend
-		}
-		return DONT_SUSPEND;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpointParticipant#scriptLoaded(org.eclipse.wst.jsdt.debug.core.model.IJavaScriptThread, org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference, org.eclipse.wst.jsdt.debug.core.breakpoints.IJavaScriptBreakpoint)
-	 */
-	public int scriptLoaded(IJavaScriptThread thread, ScriptReference script, IJavaScriptBreakpoint breakpoint) {
-		if(URIUtil.lastSegment(script.sourceURI()).equals(Constants.STD_IN) &&
-				!RhinoPreferencesManager.suspendOnStdinLoad()) {
-			return DONT_SUSPEND;
-		}
-		return SUSPEND;
-	}
-	
-	/**
-	 * If the thread should suspend based on the given {@link Value}. Currently only suspend when the value is non-null and a {@link BooleanValue} that has the value <code>true</code>
-	 * 
-	 * @param value
-	 * @return if we should suspend
-	 */
-	private boolean suspendForValue(IJavaScriptValue value) {
-		if(value instanceof IJavaScriptPrimitiveValue) {
-			return ((IJavaScriptPrimitiveValue)value).booleanValue();
-		}
-		return false;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ArrayReferenceImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ArrayReferenceImpl.java
deleted file mode 100644
index 061e2fd..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ArrayReferenceImpl.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Property;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- * Rhino implementation of {@link ArrayReference}
- * 
- * @see ArrayReference
- * @see ObjectReferenceImpl
- * @since 1.0
- */
-public class ArrayReferenceImpl extends ObjectReferenceImpl implements ArrayReference {
-
-	/**
-	 * Empty array
-	 */
-	protected static final Value[] NO_VALUES = new Value[0];
-
-	/**
-	 * Raw list of {@link Value}s
-	 */
-	private ArrayList values = null;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param stackFrameImpl
-	 * @param body
-	 */
-	public ArrayReferenceImpl(VirtualMachineImpl vm, Map body, StackFrameImpl stackFrameImpl) {
-		super(vm, body, stackFrameImpl);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference#getValue(int)
-	 */
-	public Value getValue(int index) throws IndexOutOfBoundsException {
-		Value value = (Value) getValues().get(index);
-		if (value == null) {
-			return vm.mirrorOfNull();
-		}
-		return value;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference#getValues()
-	 */
-	public synchronized List getValues() {
-		if (values == null) {
-			Map members = new HashMap();
-			int length = 0;
-			for (Iterator iter = properties().iterator(); iter.hasNext();) {
-				Property property = (Property) iter.next();
-				if (Character.isDigit(property.name().charAt(0))) {
-					members.put(Integer.valueOf(property.name()), property.value());
-				} else if (property.name().equals("length")) { //$NON-NLS-1$
-					length = Integer.parseInt(property.value().valueString());
-				}
-			}
-			values = new ArrayList(length);
-			for (int i = 0; i < length; i++) {
-				Object value = members.get(new Integer(i));
-				if (value == null) {
-					value = new UndefinedValueImpl(vm);
-				}
-				values.add(value);
-			}
-		}
-		return values;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ArrayReference#length()
-	 */
-	public int length() {
-		return getValues().size();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ObjectReferenceImpl#
-	 * valueString()
-	 */
-	public String valueString() {
-		return "Array"; //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ObjectReferenceImpl#toString
-	 * ()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append(NLS.bind(Messages.ArrayReferenceImpl_array_count_, new String[] {Integer.toString(length()) }));
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/BooleanValueImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/BooleanValueImpl.java
deleted file mode 100644
index 2481c59..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/BooleanValueImpl.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.BooleanValue;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link BooleanValue}
- * 
- * @since 1.0
- */
-public class BooleanValueImpl extends MirrorImpl implements BooleanValue {
-
-	private Boolean value;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param body
-	 */
-	public BooleanValueImpl(VirtualMachineImpl vm, Map body) {
-		this(vm, (Boolean) body.get(JSONConstants.VALUE));
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param bool
-	 */
-	public BooleanValueImpl(VirtualMachineImpl vm, Boolean bool) {
-		super(vm);
-		this.value = bool;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return value.toString();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#intValue()
-	 */
-	public int intValue() {
-		return (value.booleanValue() ? 1 : 0);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#doubleValue()
-	 */
-	public double doubleValue() {
-		return intValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#booleanValue()
-	 */
-	public boolean booleanValue() {
-		return value.booleanValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#stringValue()
-	 */
-	public String stringValue() {
-		return value.toString();
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return stringValue();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/FunctionReferenceImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/FunctionReferenceImpl.java
deleted file mode 100644
index 16817ac..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/FunctionReferenceImpl.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.FunctionReference;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link FunctionReference}
- * 
- * @see FunctionReference
- * @see ObjectReferenceImpl
- * @since 1.0
- */
-public class FunctionReferenceImpl extends ObjectReferenceImpl implements FunctionReference {
-
-	private String functionName;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param body
-	 * @param stackFrameImpl
-	 */
-	public FunctionReferenceImpl(VirtualMachineImpl vm, Map body, StackFrameImpl stackFrameImpl) {
-		super(vm, body, stackFrameImpl);
-		this.functionName = (String) body.get(JSONConstants.NAME);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.FunctionReference#functionName()
-	 */
-	public String functionName() {
-		return functionName;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ObjectReferenceImpl#valueString()
-	 */
-	public String valueString() {
-		return "Function"; //$NON-NLS-1$
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.FunctionReference#functionBody()
-	 */
-	public String functionBody() {
-		return null;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ObjectReferenceImpl#toString()
-	 */
-	public String toString() {
-		return valueString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/LocationImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/LocationImpl.java
deleted file mode 100644
index 22be41c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/LocationImpl.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.Comparator;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-
-/**
- * Rhino implementation of {@link Location}
- * 
- * @since 1.0
- */
-public class LocationImpl extends MirrorImpl implements Location {
-	
-	/**
-	 * Comparator that orders {@link Location}s by line number - useful for debugging
-	 */
-	static class LocationComparator implements Comparator {
-		/* (non-Javadoc)
-		 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
-		 */
-		public int compare(Object o1, Object o2) {
-			int value = -1;
-			if(o1 instanceof Location && o2 instanceof Location) {
-				int first = ((Location)o1).lineNumber();
-				int second = ((Location)o2).lineNumber(); 
-				if(first == second) {
-					value = 0;
-				}
-				else if(first > second) {
-					value = 1;
-				}
-			}
-			return value;
-		}
-		
-	}
-	private static LocationComparator comparator = new LocationComparator();
-	private String functionName;
-	private int lineNumber;
-	private ScriptReferenceImpl scriptReference;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param functionName
-	 * @param lineNumber
-	 * @param scriptReference
-	 */
-	public LocationImpl(VirtualMachineImpl vm, String functionName, int lineNumber, ScriptReferenceImpl scriptReference) {
-		super(vm);
-		this.functionName = functionName;
-		this.lineNumber = lineNumber;
-		this.scriptReference = scriptReference;
-	}
-
-	static LocationComparator getLocationComparator() {
-		return comparator;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Location#functionName()
-	 */
-	public String functionName() {
-		return functionName;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Location#lineNumber()
-	 */
-	public int lineNumber() {
-		return lineNumber;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Location#scriptReference()
-	 */
-	public ScriptReference scriptReference() {
-		return scriptReference;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("LocationImpl: "); //$NON-NLS-1$
-		buffer.append("[script - ").append(scriptReference.sourceURI()).append("] "); //$NON-NLS-1$ //$NON-NLS-2$
-		buffer.append("[function - ").append(functionName).append("] "); //$NON-NLS-1$ //$NON-NLS-2$
-		buffer.append("[line - ").append(lineNumber).append("]"); //$NON-NLS-1$ //$NON-NLS-2$
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/Messages.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/Messages.java
deleted file mode 100644
index ff82d7c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/Messages.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- *
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.messages"; //$NON-NLS-1$
-	public static String ArrayReferenceImpl_array_count_;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/MirrorImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/MirrorImpl.java
deleted file mode 100644
index 1d15e66..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/MirrorImpl.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Mirror;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-
-/**
- * Rhino implementation of {@link Mirror}
- * 
- * @since 1.0
- */
-public class MirrorImpl implements Mirror {
-
-	protected final VirtualMachineImpl vm;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param description
-	 */
-	public MirrorImpl(VirtualMachineImpl vm) {
-		this.vm = vm;
-	}
-
-	/**
-	 * This constructor is only to be used by {@link VirtualMachineImpl}. The name 
-	 * field is not store anywhere or used in any way.
-	 * 
-	 * @param name
-	 * @noreference This constructor is not intended to be referenced by clients.
-	 */
-	public MirrorImpl(String name) {
-		vm = (VirtualMachineImpl)this;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return this.vm;
-	}
-	
-	/**
-	 * Re-throws the given exception as a {@link RuntimeException} with the given message
-	 * @param message
-	 * @param t
-	 * @since 1.1
-	 */
-	protected void handleException(String message, Throwable t) {
-		throw new RuntimeException(message, t);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/NullValueImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/NullValueImpl.java
deleted file mode 100644
index be4da9c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/NullValueImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-
-/**
- * Rhino implementation of {@link NullValue}
- * 
- * @since 1.0
- */
-public final class NullValueImpl extends MirrorImpl implements NullValue {
-
-	static final String NULL_VALUE = "Null"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param description
-	 */
-	public NullValueImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return NULL_VALUE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return valueString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/NumberValueImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/NumberValueImpl.java
deleted file mode 100644
index 6bb6842..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/NumberValueImpl.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue;
-import org.eclipse.wst.jsdt.debug.core.model.JavaScriptDebugModel;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link NumberValue}
- * 
- * @since 1.0
- */
-public class NumberValueImpl extends MirrorImpl implements NumberValue {
-
-	/**
-	 * The underlying value
-	 */
-	private Number value;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param body
-	 */
-	public NumberValueImpl(VirtualMachineImpl vm, Map body) {
-		this(vm, (Number) body.get(JSONConstants.VALUE));
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param number
-	 */
-	public NumberValueImpl(VirtualMachineImpl vm, Number number) {
-		super(vm);
-		this.value = number;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue#value()
-	 */
-	public Number value() {
-		return value;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue#isNaN()
-	 */
-	public boolean isNaN() {
-		return value == null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return JavaScriptDebugModel.numberToString(value);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#intValue()
-	 */
-	public int intValue() {
-		return value.intValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#doubleValue()
-	 */
-	public double doubleValue() {
-		return value.doubleValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#booleanValue()
-	 */
-	public boolean booleanValue() {
-		return (value.intValue() > 0 ? true : false);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.PrimitiveValue#stringValue()
-	 */
-	public String stringValue() {
-		return JavaScriptDebugModel.numberToString(value);
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return stringValue();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ObjectReferenceImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ObjectReferenceImpl.java
deleted file mode 100644
index 6deb115..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ObjectReferenceImpl.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Property;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link ObjectReference}
- * 
- * @see MirrorImpl
- * @see ObjectReference
- * @see Property
- * @since 1.0
- */
-public class ObjectReferenceImpl extends MirrorImpl implements ObjectReference {
-
-	protected static final ArrayList NO_PROPERTIES = new ArrayList(0);
-
-	/**
-	 * The name of the class backing this object
-	 */
-	private final String className;
-	/**
-	 * The reference id to the constructor for this object
-	 */
-	private final Number constructorRef;
-	/**
-	 * The reference id to the prototype for this object
-	 */
-	private final Number prototypeRef;
-	/**
-	 * The reference id for this object
-	 */
-	private final Number id;
-	/**
-	 * The stackframe context for this object
-	 */
-	protected StackFrameImpl frame;
-	/**
-	 * The JSDI handle to the constructor for this object - lazily computed in {@link #constructor()}
-	 */
-	private Value constructor = null;
-	/**
-	 * The JSDI handle to the prototype for this object - lazily computed in {@link #prototype()}
-	 */
-	private Value prototype = null;
-	/**
-	 * The backing list of {@link PropertyReference}s for this object
-	 */
-	private List properties = null;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param body
-	 * @param frame
-	 */
-	public ObjectReferenceImpl(VirtualMachineImpl vm, Map body, StackFrameImpl frame) {
-		super(vm);
-		this.frame = frame;
-		this.className = (String) body.get(JSONConstants.CLASS_NAME);
-		this.id = (Number) body.get(JSONConstants.HANDLE);
-		this.constructorRef = (Number) ((Map) body.get(JSONConstants.CONSTRUCTOR_FUNCTION)).get(JSONConstants.REF);
-		this.prototypeRef = (Number) ((Map) body.get(JSONConstants.PROTOTYPE_OBJECT)).get(JSONConstants.REF);
-		List proplist = (List) body.get(JSONConstants.PROPERTIES);
-		if (proplist != null) {
-			this.properties = new ArrayList(proplist.size());
-			Map props = null;
-			for (Iterator iter = proplist.iterator(); iter.hasNext();) {
-				props = (Map) iter.next();
-				this.properties.add(new PropertyImpl(vm, frame, props.get(JSONConstants.NAME).toString(), (Number) props.get(JSONConstants.REF)));
-			}
-		} else {
-			this.properties = NO_PROPERTIES;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#className()
-	 */
-	public String className() {
-		return this.className;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#constructor()
-	 */
-	public Value constructor() {
-		synchronized (this.frame) {
-			if (this.constructor == null) {
-				this.constructor = this.frame.lookupValue(constructorRef);
-				if (this.constructor == null) {
-					this.constructor = this.vm.mirrorOfNull();
-				}
-			}
-		}
-		return this.constructor;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#prototype()
-	 */
-	public Value prototype() {
-		synchronized (this.frame) {
-			if (this.prototype == null) {
-				this.prototype = this.frame.lookupValue(prototypeRef);
-				if (this.prototype == null) {
-					this.prototype = this.vm.mirrorOfNull();
-				}
-			}
-		}
-		return this.prototype;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#properties()
-	 */
-	public List properties() {
-		return this.properties;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("Object Reference\n"); //$NON-NLS-1$
-		return buffer.toString();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return "Object"; //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ObjectReference#id()
-	 */
-	public Number id() {
-		return this.id;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/PropertyImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/PropertyImpl.java
deleted file mode 100644
index 3b63bbc..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/PropertyImpl.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Property;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-
-/**
- * Rhino implementation of {@link Property}
- * 
- * @see MirrorImpl
- * @see Property
- * @see Value
- * @since 1.0
- */
-public class PropertyImpl extends MirrorImpl implements Property {
-
-	/**
-	 * The name of the property
-	 */
-	private String name;
-	/**
-	 * The reference used to look up the property value in the stackframe
-	 * context
-	 */
-	private Number ref;
-	private StackFrameImpl frame;
-	private Value value;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param name
-	 * @param ref
-	 */
-	public PropertyImpl(VirtualMachineImpl vm, StackFrameImpl frame,
-			String name, Number ref) {
-		super(vm);
-		this.frame = frame;
-		this.name = name;
-		this.ref = ref;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Property#name()
-	 */
-	public String name() {
-		return name;
-	}
-
-	/**
-	 * The reference id of this property
-	 * 
-	 * @return the reference id of this property
-	 */
-	public Number getRef() {
-		return ref;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StringValue#value()
-	 */
-	public Value value() {
-		synchronized (this.frame) {
-			if (this.value == null) {
-				this.value = frame.lookupValue(ref);
-			}
-		}
-		return this.value;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ScriptReferenceImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ScriptReferenceImpl.java
deleted file mode 100644
index 2318c3c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ScriptReferenceImpl.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.URIUtil;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.internal.rhino.RhinoDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.osgi.framework.Constants;
-
-/**
- * Rhino implementation of {@link ScriptReference}
- * 
- * @see MirrorImpl
- * @see ScriptReference
- * @since 1.0
- */
-public class ScriptReferenceImpl extends MirrorImpl implements ScriptReference {
-
-	/**
-	 * The id of the script - this can be used to look it up in the {@link VirtualMachineImpl}
-	 */
-	private final Long scriptId;
-	private String sourcePath = null;
-	private URI sourceuri = null;
-	private final String source;
-	private final Boolean generated;
-	private final List lineLocations = new ArrayList();
-	private final List functionLocations = new ArrayList();
-	private Map sourceProperties = null;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param jsonScript
-	 */
-	public ScriptReferenceImpl(VirtualMachineImpl vm, Map jsonScript) {
-		super(vm);
-		this.scriptId = new Long(((Number) jsonScript.get(JSONConstants.SCRIPT_ID)).longValue());
-		this.sourcePath = (String) jsonScript.get(JSONConstants.LOCATION);
-		this.sourceProperties = (Map) jsonScript.get(JSONConstants.PROPERTIES);
-		this.source = (String) jsonScript.get(JSONConstants.SOURCE);
-		this.generated = (Boolean) jsonScript.get(JSONConstants.GENERATED);
-		List lines = (List) jsonScript.get(JSONConstants.LINES);
-		for (Iterator iterator = lines.iterator(); iterator.hasNext();) {
-			Number lineNumber = (Number) iterator.next();
-			Location location = new LocationImpl(vm, null, lineNumber.intValue(), this);
-			lineLocations.add(location);
-		}
-		List functions = (List) jsonScript.get(JSONConstants.FUNCTIONS);
-		for (Iterator iterator = functions.iterator(); iterator.hasNext();) {
-			String functionName = (String) iterator.next();
-			Location location = new LocationImpl(vm, functionName, 0, this);
-			functionLocations.add(location);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#allFunctionLocations()
-	 */
-	public List allFunctionLocations() {
-		return Collections.unmodifiableList(functionLocations);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#allLineLocations()
-	 */
-	public List allLineLocations() {
-		return Collections.unmodifiableList(lineLocations);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#functionLocation(java.lang.String)
-	 */
-	public Location functionLocation(String functionName) {
-		for (Iterator iterator = functionLocations.iterator(); iterator.hasNext();) {
-			Location location = (Location) iterator.next();
-			if (location.functionName().equals(functionName))
-				return location;
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#lineLocation(int)
-	 */
-	public Location lineLocation(int lineNumber) {
-		for (Iterator iterator = lineLocations.iterator(); iterator.hasNext();) {
-			Location location = (Location) iterator.next();
-			if (location.lineNumber() == lineNumber)
-				return location;
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#source()
-	 */
-	public String source() {
-		return source;
-	}
-
-	/**
-	 * @return the id of the {@link ScriptReference}
-	 */
-	public Long getScriptId() {
-		return scriptId;
-	}
-
-	
-	/**
-	 * Return if the script is generated or not
-	 * @return <code>true</code> if the script was generated <code>false</code> otherwise
-	 */
-	public boolean isGenerated() {
-		return generated.booleanValue();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference#sourceURI()
-	 */
-	public synchronized URI sourceURI() {
-		if (this.sourceuri == null) {
-			try {
-				if (this.sourceProperties != null) {
-					IPath path = new Path((String) this.sourceProperties.get(Constants.BUNDLE_SYMBOLICNAME));
-					path = path.append((String) this.sourceProperties.get(JSONConstants.PATH));
-					path = path.append((String) this.sourceProperties.get(JSONConstants.NAME));
-					this.sourceuri = URIUtil.fromString(path.toString());
-				} else if (this.sourcePath != null) {
-					this.sourceuri = URIUtil.fromString(sourcePath);
-				} else {
-					this.sourceuri = RhinoDebugPlugin.fileURI(new Path("script")); //$NON-NLS-1$
-				}
-			} catch (URISyntaxException urise) {
-				RhinoDebugPlugin.log(urise);
-			}
-		}
-		return this.sourceuri;
-	}
-	
-	/* (non-Javadoc)
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		StringBuffer buffer = new StringBuffer();
-		buffer.append("ScriptReferenceImpl: "); //$NON-NLS-1$
-		buffer.append("[sourceuri - ").append(sourceURI()).append("]\n"); //$NON-NLS-1$ //$NON-NLS-2$
-		buffer.append("Line locations: \n"); //$NON-NLS-1$
-		List list = new ArrayList(allLineLocations());
-		Collections.sort(list, LocationImpl.getLocationComparator());
-		for (Iterator iter = list.iterator(); iter.hasNext();) {
-			Location loc = (Location) iter.next();
-			buffer.append("\t").append(loc.toString()).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		buffer.append("Function locations: \n"); //$NON-NLS-1$
-		list = new ArrayList(allFunctionLocations());
-		Collections.sort(list, LocationImpl.getLocationComparator());
-		for (Iterator iter = list.iterator(); iter.hasNext();) {
-			Location loc = (Location) iter.next();
-			buffer.append("\t").append(loc.toString()).append("\n"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		buffer.append("\n"); //$NON-NLS-1$
-		return buffer.toString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/StackFrameImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/StackFrameImpl.java
deleted file mode 100644
index 4044e8c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/StackFrameImpl.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Value;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Variable;
-import org.eclipse.wst.jsdt.debug.internal.rhino.RhinoDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.Request;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.Response;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.TimeoutException;
-
-/**
- * Rhino implementation of {@link StackFrame}
- * 
- * @see MirrorImpl
- * @see StackFrame
- * @since 1.0
- */
-public class StackFrameImpl extends MirrorImpl implements StackFrame {
-
-	private final Number frameId;
-	private final Number threadId;
-	private final Number contextId;
-	private final Number ref;
-	private final Location location;
-	private List variables;
-	private VariableImpl thisVariable;
-	private HashMap cache = new HashMap();
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param jsonFrame
-	 */
-	public StackFrameImpl(VirtualMachineImpl vm, Map jsonFrame) {
-		super(vm);
-		this.threadId = (Number) jsonFrame.get(JSONConstants.THREAD_ID);
-		this.frameId = (Number) jsonFrame.get(JSONConstants.FRAME_ID);
-		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());
-		ScriptReferenceImpl script = vm.getScript(scriptId);
-
-		String function = (String) jsonFrame.get(JSONConstants.FUNCTION);
-		if (function != null) {
-			this.location = script.functionLocation(function);
-		} 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);
-		}
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#evaluate(java.lang.String)
-	 */
-	public Value evaluate(String expression) {
-		Request request = new Request(JSONConstants.EVALUATE);
-		request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-		request.getArguments().put(JSONConstants.FRAME_ID, frameId);
-		request.getArguments().put(JSONConstants.EXPRESSION, expression);
-		try {
-			Response response = vm.sendRequest(request, 30000);
-			return createValue(response.getBody(), true);
-		} catch (DisconnectedException e) {
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-		return null;
-	}
-
-	/**
-	 * Utility method to look up the {@link Value} with the given reference id <br>
-	 * or <code>null</code> if there is no {@link Value} with the given id
-	 * 
-	 * @param ref
-	 * @return the {@link Value} or <code>null</code>
-	 */
-	public Value lookupValue(Number ref) {
-		Value value = (Value) this.cache.get(ref);
-		if (value == null) {
-			Request request = new Request(JSONConstants.LOOKUP);
-			request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-			request.getArguments().put(JSONConstants.FRAME_ID, frameId);
-			request.getArguments().put(JSONConstants.HANDLE, ref);
-			try {
-				Response response = vm.sendRequest(request, 30000);
-				value = createValue(response.getBody(), false);
-				this.cache.put(ref, value);
-				return value;
-			} catch (DisconnectedException e) {
-				handleException(e.getMessage(), e);
-			} catch (TimeoutException e) {
-				RhinoDebugPlugin.log(e);
-			}
-		}
-		return value;
-	}
-
-	/**
-	 * Creates a new type value for the given type description in the map
-	 * 
-	 * @param body
-	 * @param iseval
-	 * @return the new type
-	 * @throws IllegalStateException
-	 *             if the type description in the map is unknown
-	 */
-	private Value createValue(Map body, boolean iseval) throws IllegalStateException {
-		Map value = (Map) body.get((iseval ? JSONConstants.EVALUATE : JSONConstants.LOOKUP));
-		if(value == null) {
-			return vm.nullValue;
-		}
-		String type = (String) value.get(JSONConstants.TYPE);
-		if(type == null) {
-			return vm.nullValue;
-		}
-		// "undefined", "null", "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.BOOLEAN)) {
-			return new BooleanValueImpl(vm, value);
-		} else if (type.equals(JSONConstants.NUMBER)) {
-			return new NumberValueImpl(vm, value);
-		} else if (type.equals(JSONConstants.STRING)) {
-			return new StringValueImpl(vm, value);
-		} else if (type.equals(JSONConstants.OBJECT)) {
-			return new ObjectReferenceImpl(vm, value, this);
-		} else if (type.equals(JSONConstants.FUNCTION)) {
-			return new FunctionReferenceImpl(vm, value, this);
-		} else if (type.equals(JSONConstants.ARRAY)) {
-			return new ArrayReferenceImpl(vm, value, this);
-		}
-		throw new IllegalStateException();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#location()
-	 */
-	public Location location() {
-		return location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#thisObject()
-	 */
-	public synchronized Variable thisObject() {
-		initializeVariables();
-		return thisVariable;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame#variables()
-	 */
-	public synchronized List variables() {
-		initializeVariables();
-		return variables;
-	}
-
-	/**
-	 * Initializes and caches the live set of variables
-	 */
-	private void initializeVariables() {
-		if (variables != null) {
-			return;
-		}
-		Request request = new Request(JSONConstants.LOOKUP);
-		request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-		request.getArguments().put(JSONConstants.FRAME_ID, frameId);
-		request.getArguments().put(JSONConstants.HANDLE, ref);
-		try {
-			Response response = vm.sendRequest(request, 30000);
-			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();
-				String name = (String) property.get(JSONConstants.NAME);
-				Number ref = (Number) property.get(JSONConstants.REF);
-				VariableImpl variable = new VariableImpl(vm, this, name, ref);
-				if (name.equals(JSONConstants.THIS))
-					thisVariable = variable;
-				else
-					variables.add(variable);
-			}
-		} catch (DisconnectedException e) {
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-	}
-
-	/**
-	 * Returns if this stack frame is visible
-	 * 
-	 * @param variable
-	 * @return true if this frame is visible, false otherwise
-	 */
-	public synchronized boolean isVisible(VariableImpl variable) {
-		return variables != null && (thisVariable == variable || variables.contains(variable));
-	}
-
-	/**
-	 * @return the context id for this frame
-	 */
-	public Number getContextId() {
-		return contextId;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/StringValueImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/StringValueImpl.java
deleted file mode 100644
index 3bf19c2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/StringValueImpl.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.StringValue;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link StringValue}
- * 
- * @since 1.0
- */
-public class StringValueImpl extends MirrorImpl implements StringValue {
-
-	private String value;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param value
-	 */
-	public StringValueImpl(VirtualMachineImpl vm, String value) {
-		super(vm);
-		this.value = value;
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param body
-	 */
-	public StringValueImpl(VirtualMachineImpl vm, Map body) {
-		this(vm, (String) body.get(JSONConstants.VALUE));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StringValue#value()
-	 */
-	public String value() {
-		return value;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return value;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ThreadReferenceImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ThreadReferenceImpl.java
deleted file mode 100644
index c2d92f1..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/ThreadReferenceImpl.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.internal.rhino.RhinoDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.Request;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.Response;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.TimeoutException;
-
-/**
- * Rhino implementation of {@link ThreadReference}
- * 
- * @since 1.0
- */
-public class ThreadReferenceImpl extends MirrorImpl implements ThreadReference {
-
-	private Number threadId;
-	private List frames;
-	private int status = THREAD_STATUS_RUNNING;
-	private boolean suspended;
-	private boolean atBreakpoint = false;
-	private String name;
-	private String step;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param jsonThread
-	 */
-	public ThreadReferenceImpl(VirtualMachineImpl vm, Map jsonThread) {
-		super(vm);
-		this.threadId = (Number) jsonThread.get(JSONConstants.THREAD_ID);
-		this.name = (String) jsonThread.get(JSONConstants.NAME);
-		if (this.name == null) {
-			// TODO NLS this
-			this.name = "Rhino - " + threadId; //$NON-NLS-1$
-		}
-		this.suspended = JSONConstants.SUSPENDED.equals(jsonThread.get(JSONConstants.STATE));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#frameCount()
-	 */
-	public synchronized int frameCount() {
-		frames();
-		return (frames == null ? 0 : frames.size());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#frame(int)
-	 */
-	public synchronized StackFrame frame(int index) {
-		frames();
-		return (StackFrame) frames.get(index);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#frames()
-	 */
-	public synchronized List frames() {
-		if (!suspended || status == THREAD_STATUS_ZOMBIE) {
-			return Collections.EMPTY_LIST;
-		}
-		if (frames != null) {
-			return frames;
-		}
-		Request request = new Request(JSONConstants.FRAMES);
-		request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-		try {
-			Response response = vm.sendRequest(request, 30000);
-			List frameIds = (List) response.getBody().get(JSONConstants.FRAMES);
-			if (frameIds.isEmpty()) {
-				return Collections.EMPTY_LIST;
-			}
-			frames = new ArrayList();
-			for (Iterator iterator = frameIds.iterator(); iterator.hasNext();) {
-				Long frameId = new Long(((Number) iterator.next()).longValue());
-				StackFrameImpl frame = createStackFrame(frameId);
-				frames.add(frame);
-			}
-		} catch (DisconnectedException e) {
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-		if(frames != null) {
-			return frames;
-		}
-		return Collections.EMPTY_LIST;
-	}
-
-	/**
-	 * Sends a request to make a new {@link StackFrameReference} in the current debugger.
-	 * Returns a new {@link StackFrameReference} on success, <code>null</code> on failure
-	 * 
-	 * @param frameId
-	 * @return a new {@link StackFrameReference} or <code>null</code>
-	 */
-	private StackFrameImpl createStackFrame(Long frameId) {
-		Request request = new Request(JSONConstants.FRAME);
-		request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-		request.getArguments().put(JSONConstants.FRAME_ID, frameId);
-		try {
-			Response response = vm.sendRequest(request);
-			Map jsonFrame = (Map) response.getBody().get(JSONConstants.FRAME);
-			return new StackFrameImpl(vm, jsonFrame);
-		} catch (DisconnectedException e) {
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#isAtBreakpoint()
-	 */
-	public synchronized boolean isAtBreakpoint() {
-		return suspended && atBreakpoint;
-	}
-
-	/**
-	 * Marks the current thread reference as suspended
-	 * 
-	 * @param atBreakpoint
-	 */
-	public synchronized void markSuspended(boolean atBreakpoint) {
-		this.suspended = true;
-		this.atBreakpoint = atBreakpoint;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#isSuspended()
-	 */
-	public synchronized boolean isSuspended() {
-		return suspended;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#name()
-	 */
-	public String name() {
-		return name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#resume()
-	 */
-	public synchronized void resume() {
-		if (status == THREAD_STATUS_ZOMBIE) {
-			return;
-		}
-		Request request = new Request(JSONConstants.CONTINUE);
-		request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-		if (step != null) {
-			request.getArguments().put(JSONConstants.STEP, step);
-		}
-		try {
-			Response response = vm.sendRequest(request);
-			if (response.isSuccess()) {
-				step = null;
-				frames = null;
-				suspended = false;
-				atBreakpoint = false;
-			}
-		} catch (DisconnectedException e) {
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#suspend()
-	 */
-	public synchronized void suspend() {
-		if (status == THREAD_STATUS_ZOMBIE) {
-			return;
-		}
-		Request request = new Request(JSONConstants.SUSPEND);
-		request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-		try {
-			Response response = vm.sendRequest(request);
-			if(response.isSuccess()) {
-				markSuspended(false);
-			}
-		} catch (DisconnectedException e) {
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#interrupt()
-	 */
-	public void interrupt() {
-		throw new UnsupportedOperationException();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference#status()
-	 */
-	public synchronized int status() {
-		return status;
-	}
-
-	/**
-	 * Returns the step type
-	 * 
-	 * @return the step type
-	 * @see JSONConstants#STEP_IN
-	 * @see JSONConstants#STEP_NEXT
-	 * @see JSONConstants#STEP_OUT
-	 */
-	public synchronized String getStep() {
-		return step;
-	}
-
-	/**
-	 * Sets the current step type
-	 * 
-	 * @param step
-	 * @see JSONConstants#STEP_IN
-	 * @see JSONConstants#STEP_NEXT
-	 * @see JSONConstants#STEP_OUT
-	 */
-	public synchronized void setStep(String step) {
-		this.step = step;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/UndefinedValueImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/UndefinedValueImpl.java
deleted file mode 100644
index 191ef70..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/UndefinedValueImpl.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.UndefinedValue;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link UndefinedValue}
- * 
- * @see MirrorImpl
- * @see UndefinedValue
- * @since 1.0
- */
-public class UndefinedValueImpl extends MirrorImpl implements UndefinedValue {
-
-	static final String UNDEFINED_VALUE = "Undefined"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 */
-	public UndefinedValueImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.StringValue#value()
-	 */
-	public String value() {
-		return JSONConstants.UNDEFINED;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Value#valueString()
-	 */
-	public String valueString() {
-		return UNDEFINED_VALUE;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-		return valueString();
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/VariableImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/VariableImpl.java
deleted file mode 100644
index 08fee0f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/VariableImpl.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame;
-import org.eclipse.wst.jsdt.debug.core.jsdi.Variable;
-
-/**
- * Rhino implementation of a {@link Variable}
- * 
- * @since 1.0
- */
-public class VariableImpl extends PropertyImpl implements Variable {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param frame
-	 * @param name
-	 * @param ref
-	 */
-	public VariableImpl(VirtualMachineImpl vm, StackFrameImpl frame, String name, Number ref) {
-		super(vm, frame, name, ref);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Variable#isArgument()
-	 */
-	public boolean isArgument() {
-		return false;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Variable#isVisible(org.eclipse.wst.jsdt.debug.core.jsdi.StackFrame)
-	 */
-	public boolean isVisible(StackFrame frame) {
-		StackFrameImpl frameImpl = (StackFrameImpl) frame;
-		return frameImpl.isVisible(this);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/VirtualMachineImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/VirtualMachineImpl.java
deleted file mode 100644
index c25dfb7..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/VirtualMachineImpl.java
+++ /dev/null
@@ -1,434 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.BooleanValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NullValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.NumberValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.StringValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.UndefinedValue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-import org.eclipse.wst.jsdt.debug.internal.rhino.Constants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.RhinoDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.event.EventQueueImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.EventRequestManagerImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.DebugSession;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.EventPacket;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.Request;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.Response;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.TimeoutException;
-
-/**
- * Rhino implementation of {@link VirtualMachine}
- * 
- * @since 1.0
- */
-public class VirtualMachineImpl extends MirrorImpl implements VirtualMachine {
-
-	public final UndefinedValueImpl undefinedValue = new UndefinedValueImpl(this);
-	public final NullValueImpl nullValue = new NullValueImpl(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 Map threads = new HashMap();
-	private boolean disconnected = false;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param debugSession
-	 */
-	public VirtualMachineImpl(DebugSession debugSession) {
-		super(Constants.SPACE);
-		this.session = debugSession;
-		initalizeScripts();
-	}
-
-	/**
-	 * loads the scripts
-	 */
-	private void initalizeScripts() {
-		Request request = new Request(JSONConstants.SCRIPTS);
-		try {
-			Response response = sendRequest(request);
-			List scriptIds = (List) response.getBody().get(JSONConstants.SCRIPTS);
-			for (Iterator iterator = scriptIds.iterator(); iterator.hasNext();) {
-				Long scriptId = new Long(((Number) iterator.next()).longValue());
-				ScriptReferenceImpl script = createScriptReference(scriptId);
-				if(script != null) {
-					scripts.put(scriptId, script);
-				}
-			}
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-	}
-
-	/**
-	 * Creates a new {@link ScriptReferenceImpl} for the given ID
-	 * @param scriptId
-	 * @return the new {@link ScriptReferenceImpl} or <code>null</code>
-	 */
-	private ScriptReferenceImpl createScriptReference(Long scriptId) {
-		Request request = new Request(JSONConstants.SCRIPT);
-		request.getArguments().put(JSONConstants.SCRIPT_ID, scriptId);
-		try {
-			Response response = sendRequest(request, DEFAULT_TIMEOUT);
-			Map jsonScript = (Map) response.getBody().get(JSONConstants.SCRIPT);
-			return new ScriptReferenceImpl(this, jsonScript);
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#allScripts()
-	 */
-	public synchronized List allScripts() {
-		return new ArrayList(scripts.values());
-	}
-
-	/**
-	 * Adds a new script to the {@link VirtualMachine} with the given ID and returns
-	 * it.
-	 * @param scriptId
-	 * @param 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;
-	}
-
-	/**
-	 * Returns the {@link ScriptReferenceImpl} for the given ID or <code>null</code>
-	 * if no such {@link ScriptReferenceImpl} exists.
-	 * @param scriptId
-	 * @return the {@link ScriptReferenceImpl} for the given ID or <code>null</code>
-	 */
-	public synchronized ScriptReferenceImpl getScript(Long scriptId) {
-		return (ScriptReferenceImpl) scripts.get(scriptId);
-	}
-
-	/**
-	 * @param timeout
-	 * @return
-	 * @throws TimeoutException
-	 * @throws DisconnectedException
-	 */
-	public EventPacket receiveEvent(int timeout) throws TimeoutException, DisconnectedException {
-		return session.receiveEvent(timeout);
-	}
-
-	/**
-	 * Sends a request to the backing {@link DebugSession}
-	 * 
-	 * @param request
-	 * @param timeout
-	 * @return the {@link Response} for the request
-	 * @throws TimeoutException
-	 * @throws DisconnectedException
-	 */
-	public Response sendRequest(Request request, int timeout) throws TimeoutException, DisconnectedException {
-		session.sendRequest(request);
-		return session.receiveResponse(request.getSequence(), timeout);
-	}
-
-	/**
-	 * Sends the given {@link Request} using the default timeout
-	 * @param request
-	 * @return the {@link Response} from the request
-	 * @throws TimeoutException
-	 * @throws DisconnectedException
-	 */
-	public Response sendRequest(Request request) throws TimeoutException, DisconnectedException {
-		return sendRequest(request, DEFAULT_TIMEOUT);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#allThreads()
-	 */
-	public synchronized List allThreads() {
-		Request request = new Request(JSONConstants.THREADS);
-		try {
-			Response response = sendRequest(request);
-			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);
-				if (thread == null) {
-					thread = createThreadReference(threadId);
-				}
-				if(thread != null) {
-					allThreads.put(threadId, thread);
-				}
-			}
-			threads = allThreads;
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-		return new ArrayList(threads.values());
-	}
-
-	/**
-	 * Removes the thread with the given ID
-	 * @param threadId
-	 * @return the {@link ThreadReferenceImpl} that has been removed
-	 */
-	public synchronized ThreadReferenceImpl removeThread(Long threadId) {
-		return (ThreadReferenceImpl) threads.remove(threadId);
-	}
-
-	/**
-	 * Creates a new {@link ThreadReferenceImpl} with the given ID
-	 * @param threadId
-	 * @return the new {@link ThreadReferenceImpl} or <code>null</code>
-	 */
-	private ThreadReferenceImpl createThreadReference(Long threadId) {
-		Request request = new Request(JSONConstants.THREAD);
-		request.getArguments().put(JSONConstants.THREAD_ID, threadId);
-		try {
-			Response response = sendRequest(request, DEFAULT_TIMEOUT);
-			Map jsonThread = (Map) response.getBody().get(JSONConstants.THREAD);
-			if (jsonThread == null) {
-				return null;
-			}
-			return new ThreadReferenceImpl(this, jsonThread);
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the {@link ThreadReferenceImpl} with the given ID or 
-	 * create and return a new one if it does not exist
-	 * @param threadId
-	 * @return the {@link ThreadReferenceImpl} for the given ID or <code>null</code>
-	 * if the request to create a new one fails
-	 */
-	public synchronized ThreadReferenceImpl getThread(Long threadId) {
-		ThreadReferenceImpl thread = (ThreadReferenceImpl) threads.get(threadId);
-		if (thread == null) {
-			thread = createThreadReference(threadId);
-			if (thread != null) {
-				threads.put(threadId, thread);
-			}
-		}
-		return thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.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(Constants.SPACE);
-			buffer.append(response.getBody().get(JSONConstants.VM_NAME)).append(Constants.SPACE);
-			buffer.append(response.getBody().get(JSONConstants.VM_VERSION));
-			return buffer.toString();
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#dispose()
-	 */
-	public void dispose() {
-		Request request = new Request(JSONConstants.DISPOSE);
-		try {
-			sendRequest(request);
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		} finally {
-			disconnectVM();
-			this.eventRequestManager.createVMDeathRequest();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#name()
-	 */
-	public String name() {
-		Request request = new Request(JSONConstants.VERSION);
-		try {
-			Response response = sendRequest(request);
-			return (String) response.getBody().get(JSONConstants.VM_NAME);
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#resume()
-	 */
-	public void resume() {
-		Request request = new Request(JSONConstants.CONTINUE);
-		try {
-			sendRequest(request);
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#suspend()
-	 */
-	public void suspend() {
-		Request request = new Request(JSONConstants.SUSPEND);
-		try {
-			sendRequest(request);
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#terminate()
-	 */
-	public void terminate() {
-		dispose();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#version()
-	 */
-	public String version() {
-		Request request = new Request(JSONConstants.VERSION);
-		try {
-			Response response = sendRequest(request);
-			return (String) response.getBody().get(JSONConstants.VM_VERSION);
-		} catch (DisconnectedException e) {
-			disconnectVM();
-			handleException(e.getMessage(), e);
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		}
-		return null;
-	}
-
-	/**
-	 * disconnects the VM and creates the correct requests
-	 */
-	public void disconnectVM() {
-		if (this.disconnected) {
-			// no-op it is already disconnected
-			return;
-		}
-		try {
-			this.session.dispose();
-		} finally {
-			this.disconnected = true;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(boolean)
-	 */
-	public BooleanValue mirrorOf(boolean bool) {
-		return new BooleanValueImpl(this, Boolean.valueOf(bool));
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(java.lang.Number)
-	 */
-	public NumberValue mirrorOf(Number number) {
-		return new NumberValueImpl(this, number);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOf(java.lang.String)
-	 */
-	public StringValue mirrorOf(String string) {
-		return new StringValueImpl(this, string);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOfNull()
-	 */
-	public NullValue mirrorOfNull() {
-		return nullValue;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#mirrorOfUndefined()
-	 */
-	public UndefinedValue mirrorOfUndefined() {
-		return undefinedValue;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#eventRequestManager()
-	 */
-	public EventRequestManager eventRequestManager() {
-		return eventRequestManager;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine#eventQueue()
-	 */
-	public EventQueue eventQueue() {
-		return eventQueue;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/HostArgument.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/HostArgument.java
deleted file mode 100644
index 6d7f26a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/HostArgument.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.connect;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.StringArgument;
-
-/**
- * Implementation of a string argument that describes the host argument
- * 
- * @since 1.0
- */
-public class HostArgument implements StringArgument {
-
-	private static final long serialVersionUID = 3057403815318177030L;
-	private String host;
-
-	/**
-	 * Host attribute name
-	 */
-	public static final String HOST = "host"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param host
-	 */
-	public HostArgument(String host) {
-		setValue(host);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return Messages.HostArgument_description;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.StringArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		return value != null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return Messages.HostArgument_label;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return true;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return HOST;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String host) {
-		if (!isValid(host)) {
-			throw new IllegalArgumentException();
-		}
-		this.host = host;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return host;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/Messages.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/Messages.java
deleted file mode 100644
index 2c57f65..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/Messages.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.connect;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * Rhino messages
- * 
- * @since 1.0
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.connect.messages"; //$NON-NLS-1$
-	public static String HostArgument_description;
-	public static String HostArgument_label;
-	public static String PortArgument_description;
-	public static String PortArgument_label;
-	public static String RhinoAttachingConnector_description;
-	public static String RhinoAttachingConnector_name;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/PortArgument.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/PortArgument.java
deleted file mode 100644
index c51a547..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/PortArgument.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.connect;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument;
-
-/**
- * Implementation of an {@link IntegerArgument} that describes the port to try connecting to
- * 
- * @since 1.0
- */
-public class PortArgument implements IntegerArgument {
-
-	private static final long serialVersionUID = -1954469572907116388L;
-	private int port;
-
-	/**
-	 * The port attribute name
-	 */
-	public static final String PORT = "port"; //$NON-NLS-1$
-
-	/**
-	 * Constructor
-	 * 
-	 * @param port
-	 */
-	public PortArgument(int port) {
-		setValue(port);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#intValue()
-	 */
-	public int intValue() {
-		return port;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(int)
-	 */
-	public boolean isValid(int intValue) {
-		return intValue > 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#max()
-	 */
-	public int max() {
-		return Integer.MAX_VALUE;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#min()
-	 */
-	public int min() {
-		return 1;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#setValue(int)
-	 */
-	public void setValue(int port) {
-		this.port = port;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#description()
-	 */
-	public String description() {
-		return Messages.PortArgument_description;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.IntegerArgument#isValid(java.lang.String)
-	 */
-	public boolean isValid(String value) {
-		try {
-			int intValue = Integer.parseInt(value);
-			return isValid(intValue);
-		} catch (NumberFormatException e) {
-			return false;
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#label()
-	 */
-	public String label() {
-		return Messages.PortArgument_label;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#mustSpecify()
-	 */
-	public boolean mustSpecify() {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#name()
-	 */
-	public String name() {
-		return PORT;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#setValue(java.lang.String)
-	 */
-	public void setValue(String value) {
-		try {
-			int intValue = Integer.parseInt(value);
-			setValue(intValue);
-		} catch (NumberFormatException nfe) {
-			// re-throw IllegalArgumentException
-			throw new IllegalArgumentException(nfe.getMessage());
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector.Argument#value()
-	 */
-	public String value() {
-		return Integer.toString(port);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/RhinoAttachingConnector.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/RhinoAttachingConnector.java
deleted file mode 100644
index cda758b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/RhinoAttachingConnector.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.connect;
-
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.AttachingConnector;
-import org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.*;
-
-/**
- * Rhino {@link Connector} implementation that attaches to a running debug process
- * 
- * @since 1.0
- * @see Connector
- * @see AttachingConnector
- */
-public class RhinoAttachingConnector implements AttachingConnector {
-
-	/**
-	 * Describes the <code>localhost</code> hostname i.e. the <code>127.0.0.1</code> IP address
-	 */
-	public static final String LOCALHOST = "localhost"; //$NON-NLS-1$
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.AttachingConnector#attach(java.util.Map)
-	 */
-	public VirtualMachine attach(Map arguments) throws IOException {
-		TransportService service = new SocketTransportService();
-		String host = (String) arguments.get(HostArgument.HOST);
-		String port = (String) arguments.get(PortArgument.PORT);
-		Connection c = service.attach(host + ":" + Integer.parseInt(port), 10000, 10000); //$NON-NLS-1$
-		DebugSession session = new DebugSession(c);
-		return new VirtualMachineImpl(session);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#defaultArguments()
-	 */
-	public Map defaultArguments() {
-		Map result = new HashMap();
-		result.put(HostArgument.HOST, new HostArgument(LOCALHOST));
-		result.put(PortArgument.PORT, new PortArgument(9000));
-		return result;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#description()
-	 */
-	public String description() {
-		return Messages.RhinoAttachingConnector_description;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#name()
-	 */
-	public String name() {
-		return Messages.RhinoAttachingConnector_name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.connect.Connector#id()
-	 */
-	public String id() {
-		return "rhino.attaching.connector"; //$NON-NLS-1$
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/messages.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/messages.properties
deleted file mode 100644
index 9a85cd8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/connect/messages.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# 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
-###############################################################################
-HostArgument_description=The name of the host address to try attaching to.
-HostArgument_label=&Host:
-PortArgument_description=The port on the host machine to try attaching to.
-PortArgument_label=&Port:
-RhinoAttachingConnector_description=This connector is used to attach to a running Mozilla Rhino debug process.
-RhinoAttachingConnector_name=Mozilla Rhino - Attaching Connector
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/BreakpointEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/BreakpointEventImpl.java
deleted file mode 100644
index 2b86a87..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/BreakpointEventImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.BreakpointEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link BreakpointEvent}
- * 
- * @since 1.0
- */
-public final class BreakpointEventImpl extends LocatableEventImpl implements BreakpointEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param location
-	 * @param request
-	 */
-	public BreakpointEventImpl(VirtualMachineImpl vm, ThreadReference thread, Location location, BreakpointRequest request) {
-		super(vm, thread, location, request);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/DebuggerStatementEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/DebuggerStatementEventImpl.java
deleted file mode 100644
index 8e197c4..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/DebuggerStatementEventImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.DebuggerStatementEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link DebuggerStatementEvent}
- * 
- * @since 1.0
- */
-public final class DebuggerStatementEventImpl extends LocatableEventImpl implements DebuggerStatementEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param location
-	 * @param request
-	 */
-	public DebuggerStatementEventImpl(VirtualMachineImpl vm, ThreadReference thread, Location location, DebuggerStatementRequest request) {
-		super(vm, thread, location, request);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventImpl.java
deleted file mode 100644
index f559328..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventImpl.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.Event;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link Event}
- * 
- * @since 1.0
- */
-public class EventImpl implements Event {
-
-	private final VirtualMachineImpl vm;
-	private final EventRequest request;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 */
-	public EventImpl(VirtualMachineImpl vm, EventRequest request) {
-		this.vm = vm;
-		this.request = request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.Event#request()
-	 */
-	public EventRequest request() {
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return vm;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventQueueImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventQueueImpl.java
deleted file mode 100644
index d09acc2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventQueueImpl.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDeathRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.RhinoDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.MirrorImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ScriptReferenceImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ThreadReferenceImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.BreakpointRequestImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.DebuggerStatementRequestImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.EventRequestManagerImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.StepRequestImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.SuspendRequestImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.EventPacket;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.TimeoutException;
-
-/**
- * Default implementation of {@link EventQueue}
- * 
- * @since 1.0
- */
-public final class EventQueueImpl extends MirrorImpl implements EventQueue {
-
-	private VirtualMachineImpl vm;
-	private EventRequestManagerImpl eventRequestManager;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param eventRequestManager
-	 */
-	public EventQueueImpl(VirtualMachineImpl vm, EventRequestManagerImpl eventRequestManager) {
-		super(vm);
-		this.vm = vm;
-		this.eventRequestManager = eventRequestManager;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue#remove()
-	 */
-	public EventSet remove() {
-		return remove(-1);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventQueue#remove(int)
-	 */
-	public EventSet remove(int timeout) {
-		try {
-			while (true) {
-				EventPacket event = vm.receiveEvent(timeout);
-				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());
-					ThreadReferenceImpl thread = vm.getThread(threadId);
-					if(thread == null) {
-						continue;
-					}
-					eventSet.setThread(thread);
-					Long scriptId = new Long(((Number) event.getBody().get(JSONConstants.SCRIPT_ID)).longValue());
-					ScriptReferenceImpl script = vm.addScript(scriptId);
-					if(script != null) {
-						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));
-							}
-						}
-					}
-					if (!eventSet.isEmpty()) {
-						thread.markSuspended(false);
-					}
-				} else if (eventName.equals(JSONConstants.BREAK)) {
-					Long threadId = new Long(((Number) event.getBody().get(JSONConstants.THREAD_ID)).longValue());
-					ThreadReferenceImpl thread = vm.getThread(threadId);
-					if(thread == null) {
-						continue;
-					}
-					eventSet.setThread(thread);
-					Long scriptId = new Long(((Number) event.getBody().get(JSONConstants.SCRIPT_ID)).longValue());
-					ScriptReferenceImpl script = vm.getScript(scriptId);
-					if(script != null) {
-						int lineNumber = ((Number) event.getBody().get(JSONConstants.LINE_NUMBER)).intValue();
-						Location location = script.lineLocation(lineNumber);
-						boolean atBreakpoint = false;
-						Number breakpointId = (Number) event.getBody().get(JSONConstants.BREAKPOINT);
-						if (breakpointId != null) {
-							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) && breakpointId.longValue() == request.breakpointId().longValue()) {
-									eventSet.add(new BreakpointEventImpl(vm, thread, location, request));
-									atBreakpoint = true;
-								}
-							}
-						}
-						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();
-								ThreadReference requestThread = request.thread();
-								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();
-								ThreadReference requestThread = request.thread();
-								if (request.isEnabled() && (requestThread == null || thread == requestThread)) {
-									eventSet.add(new StepEventImpl(vm, thread, location, request));
-								}
-							}
-						}
-						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();
-								ThreadReference requestThread = request.thread();
-								if (request.isEnabled() && (requestThread == null || thread == requestThread)) {
-									eventSet.add(new DebuggerStatementEventImpl(vm, thread, location, request));
-								}
-							}
-						}
-						if (!eventSet.isEmpty()) {
-							thread.markSuspended(atBreakpoint);
-						}
-					}
-				} else if (eventName.equals(JSONConstants.EXCEPTION)) {
-					Long threadId = new Long(((Number) event.getBody().get(JSONConstants.THREAD_ID)).longValue());
-					ThreadReferenceImpl thread = vm.getThread(threadId);
-					if(thread != null) {
-						eventSet.setThread(thread);
-						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();
-						Location location = script.lineLocation(lineNumber);
-						String message = (String) event.getBody().get(JSONConstants.MESSAGE);
-						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));
-							}
-						}
-						if (!eventSet.isEmpty()) {
-							thread.markSuspended(false);
-						}
-					}
-				} else if (eventName.equals(JSONConstants.THREAD)) {
-					Long threadId = new Long(((Number) event.getBody().get(JSONConstants.THREAD_ID)).longValue());
-					String type = (String) event.getBody().get(JSONConstants.TYPE);
-					if (JSONConstants.ENTER.equals(type)) {
-						ThreadReferenceImpl thread = vm.getThread(threadId);
-						if(thread != null) {
-							eventSet.setThread(thread);
-							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));
-								}
-							}
-						}
-					} 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();
-							if (request.isEnabled()) {
-								eventSet.add(new ThreadExitEventImpl(vm, thread, request));
-							}
-						}
-					}
-					else if(JSONConstants.VMDEATH.equals(type)) {
-						List requests = eventRequestManager.vmDeathRequests();
-						for (Iterator iter = requests.iterator(); iter.hasNext();) {
-							VMDeathRequest request = (VMDeathRequest) iter.next();
-							if(request.isEnabled()) {
-								eventSet.add(new VMDeathEventImpl(vm, request));
-							}
-						}
-					}
-				}
-				if (eventSet.isEmpty()) {
-					eventSet.resume();
-					continue;
-				}
-				return eventSet;
-			}
-		} catch (TimeoutException e) {
-			RhinoDebugPlugin.log(e);
-		} catch (DisconnectedException e) {
-			vm.disconnectVM();
-			handleException(e.getMessage(), e);
-		}
-		return null;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventSetImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventSetImpl.java
deleted file mode 100644
index 5d57522..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/EventSetImpl.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import java.util.HashSet;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ThreadReferenceImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link EventSet}
- * 
- * @since 1.0
- */
-public final class EventSetImpl extends HashSet implements EventSet {
-
-	private static final long serialVersionUID = 1L;
-	private VirtualMachineImpl vm;
-	private ThreadReferenceImpl thread;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public EventSetImpl(VirtualMachineImpl vm) {
-		this.vm = vm;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet#resume()
-	 */
-	public void resume() {
-		if (thread == null) {
-			vm.resume();
-		}
-		else {
-			thread.resume();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.EventSet#suspended()
-	 */
-	public boolean suspended() {
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return this.vm;
-	}
-
-	/**
-	 * @param thread
-	 */
-	public void setThread(ThreadReferenceImpl thread) {
-		this.thread = thread;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ExceptionEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ExceptionEventImpl.java
deleted file mode 100644
index 1abd72e..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ExceptionEventImpl.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ExceptionEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ExceptionEvent}
- * 
- * @since 1.0
- */
-public final class ExceptionEventImpl extends LocatableEventImpl implements ExceptionEvent {
-
-	private final String message;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param location
-	 * @param message
-	 * @param request
-	 */
-	public ExceptionEventImpl(VirtualMachineImpl vm, ThreadReference thread, Location location, String message, ExceptionRequest request) {
-		super(vm, thread, location, request);
-		this.message = message;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.ExceptionEvent#message()
-	 */
-	public String message() {
-		return message;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/LocatableEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/LocatableEventImpl.java
deleted file mode 100644
index 7da853c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/LocatableEventImpl.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.LocatableEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link LocatableEvent}
- * 
- * @since 1.0
- */
-public class LocatableEventImpl extends EventImpl implements LocatableEvent {
-
-	protected ThreadReference thread = null;
-	protected Location location = null;
-	
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 */
-	public LocatableEventImpl(VirtualMachineImpl vm, ThreadReference thread, Location location, EventRequest request) {
-		super(vm, request);
-		this.thread = thread;
-		this.location = location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Locatable#location()
-	 */
-	public Location location() {
-		return this.location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.LocatableEvent#thread()
-	 */
-	public ThreadReference thread() {
-		return this.thread;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ScriptLoadEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ScriptLoadEventImpl.java
deleted file mode 100644
index 7c36b04..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ScriptLoadEventImpl.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ScriptReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ScriptLoadEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ScriptReferenceImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ScriptLoadEvent}
- * 
- * @since 1.0
- */
-public final class ScriptLoadEventImpl extends LocatableEventImpl implements ScriptLoadEvent {
-
-	private final ScriptReferenceImpl script;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param script
-	 * @param request
-	 */
-	public ScriptLoadEventImpl(VirtualMachineImpl vm, ThreadReference thread, ScriptReferenceImpl script, ScriptLoadRequest request) {
-		super(vm, thread, null, request);
-		this.script = script;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.event.ScriptLoadEvent#script()
-	 */
-	public ScriptReference script() {
-		return script;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/StepEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/StepEventImpl.java
deleted file mode 100644
index 7f0999c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/StepEventImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.StepEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link StepEvent}
- * 
- * @since 1.0
- */
-public final class StepEventImpl extends LocatableEventImpl implements StepEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param location
-	 * @param request
-	 */
-	public StepEventImpl(VirtualMachineImpl vm, ThreadReference thread, Location location, StepRequest request) {
-		super(vm, thread, location, request);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/SuspendEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/SuspendEventImpl.java
deleted file mode 100644
index 00c325a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/SuspendEventImpl.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.BreakpointEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.SuspendEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link BreakpointEvent}
- * 
- * @since 1.0
- */
-public final class SuspendEventImpl extends LocatableEventImpl implements SuspendEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param location
-	 * @param request
-	 */
-	public SuspendEventImpl(VirtualMachineImpl vm, ThreadReference thread, Location location, SuspendRequest request) {
-		super(vm, thread, location, request);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ThreadEnterEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ThreadEnterEventImpl.java
deleted file mode 100644
index 1f83fe2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ThreadEnterEventImpl.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ThreadEnterEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ThreadEnterEvent}
- * 
- * @since 1.0
- */
-public final class ThreadEnterEventImpl extends LocatableEventImpl implements ThreadEnterEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param request
-	 */
-	public ThreadEnterEventImpl(VirtualMachineImpl vm, ThreadReference thread, ThreadEnterRequest request) {
-		super(vm, thread, null, request);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ThreadExitEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ThreadExitEventImpl.java
deleted file mode 100644
index 4edbc4c..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/ThreadExitEventImpl.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.ThreadExitEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ThreadExitEvent}
- * 
- * @since 1.0
- */
-public final class ThreadExitEventImpl extends LocatableEventImpl implements ThreadExitEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param request
-	 */
-	public ThreadExitEventImpl(VirtualMachineImpl vm, ThreadReference thread, ThreadExitRequest request) {
-		super(vm, thread, null, request);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/VMDeathEventImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/VMDeathEventImpl.java
deleted file mode 100644
index 2363f44..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/event/VMDeathEventImpl.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.event;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.event.VMDeathEvent;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of a {@link VMDeathEvent}
- * 
- * @since 1.0
- */
-public class VMDeathEventImpl extends EventImpl implements VMDeathEvent {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param request
-	 */
-	public VMDeathEventImpl(VirtualMachineImpl vm, EventRequest request) {
-		super(vm, request);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/messages.properties b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/messages.properties
deleted file mode 100644
index ec56f59..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/messages.properties
+++ /dev/null
@@ -1 +0,0 @@
-ArrayReferenceImpl_array_count_=Array [{0}]
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/BreakpointRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/BreakpointRequestImpl.java
deleted file mode 100644
index 6704d8b..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/BreakpointRequestImpl.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.RhinoDebugPlugin;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ScriptReferenceImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.DisconnectedException;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.Request;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.Response;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.TimeoutException;
-
-/**
- * Rhino implementation of {@link BreakpointRequest}
- * 
- * @since 1.0
- */
-public class BreakpointRequestImpl extends EventRequestImpl implements BreakpointRequest {
-
-	private final Location location;
-	private ThreadReference thread;
-	private String condition;
-	private Long breakpointId;
-	private int hitcount = 0;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 * @param location
-	 */
-	public BreakpointRequestImpl(VirtualMachineImpl vm, Location location) {
-		super(vm);
-		this.location = location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public synchronized void addThreadFilter(ThreadReference thread) {
-		checkDeleted();
-		this.thread = thread;
-	}
-
-	/**
-	 * Returns the underlying {@link ThreadReference} this request applies to
-	 * 
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return this.thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addConditionFilter(java.lang.String)
-	 */
-	public synchronized void addConditionFilter(String condition) {
-		checkDeleted();
-		this.condition = condition;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest#addHitCountFilter(int)
-	 */
-	public void addHitCountFilter(int hitcount) {
-		checkDeleted();
-		this.hitcount = hitcount;
-	}
-
-	/**
-	 * Returns the condition for this breakpoint
-	 * 
-	 * @return the condition
-	 */
-	public synchronized String condition() {
-		return condition;
-	}
-
-	/**
-	 * Returns the hit count for the breakpoint
-	 * 
-	 * @return the hit count for the breakpoint
-	 */
-	public synchronized int hitcount() {
-		return this.hitcount;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Locatable#location()
-	 */
-	public Location location() {
-		return this.location;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.EventRequestImpl#setEnabled(boolean)
-	 */
-	public synchronized void setEnabled(boolean enabled) {
-		checkDeleted();
-		if (this.enabled == enabled) {
-			return;
-		}
-		if (enabled) {
-			ScriptReferenceImpl scriptReferenceImpl = (ScriptReferenceImpl) this.location.scriptReference();
-			Long scriptId = scriptReferenceImpl.getScriptId();
-			Request request = new Request(JSONConstants.SETBREAKPOINT);
-			request.getArguments().put(JSONConstants.SCRIPT_ID, scriptId);
-			request.getArguments().put(JSONConstants.CONDITION, this.condition);
-			if (this.location.functionName() != null) {
-				request.getArguments().put(JSONConstants.FUNCTION, this.location.functionName());
-			}
-			else{
-				request.getArguments().put(JSONConstants.LINE, new Integer(this.location.lineNumber()));
-			}
-			try {
-				Response response = this.vm.sendRequest(request);
-				Map body = (Map) response.getBody().get(JSONConstants.BREAKPOINT);
-				Number id = (Number) body.get(JSONConstants.BREAKPOINT_ID);
-				this.breakpointId = new Long(id.longValue());
-			} catch (TimeoutException e) {
-				RhinoDebugPlugin.log(e);
-			} catch (DisconnectedException e) {
-				handleException(e.getMessage(), e);
-			}
-		} else {
-			Request request = new Request(JSONConstants.CLEARBREAKPOINT);
-			request.getArguments().put(JSONConstants.BREAKPOINT_ID, breakpointId);
-			try {
-				vm.sendRequest(request);
-			} catch (TimeoutException e) {
-				RhinoDebugPlugin.log(e);
-			} catch (DisconnectedException e) {
-				handleException(e.getMessage(), e);
-			}
-			breakpointId = null;
-		}
-		this.enabled = enabled;
-	}
-
-	/**
-	 * Returns the id reported back from the underlying {@link VirtualMachine} for this breakpoint
-	 * 
-	 * @return the id of the breakpoint
-	 */
-	public Long breakpointId() {
-		return this.breakpointId;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/DebuggerStatementRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/DebuggerStatementRequestImpl.java
deleted file mode 100644
index 55c13ec..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/DebuggerStatementRequestImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link DebuggerStatementRequest}
- * 
- * @since 1.0
- */
-public class DebuggerStatementRequestImpl extends EventRequestImpl implements DebuggerStatementRequest {
-
-	private ThreadReference thread;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public DebuggerStatementRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public synchronized void addThreadFilter(ThreadReference thread) {
-		checkDeleted();
-		this.thread = thread;
-	}
-
-	/**
-	 * The underlying {@link ThreadReference}
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.EventRequestImpl#setEnabled(boolean)
-	 */
-	public synchronized void setEnabled(boolean enabled) {
-		checkDeleted();
-		this.enabled = enabled;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/EventRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/EventRequestImpl.java
deleted file mode 100644
index c230638..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/EventRequestImpl.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.VirtualMachine;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.MirrorImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link EventRequest}
- * 
- * @since 1.0
- */
-public class EventRequestImpl extends MirrorImpl implements EventRequest {
-
-	private boolean deleted = false;
-	protected boolean enabled = false;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public EventRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest#isEnabled()
-	 */
-	public synchronized boolean isEnabled() {
-		return enabled;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest#setEnabled(boolean)
-	 */
-	public synchronized void setEnabled(boolean enabled) {
-		checkDeleted();
-		this.enabled = enabled;
-	}
-
-	/**
-	 * If the delete flag is set throw an {@link IllegalStateException}
-	 * @throws IllegalStateException
-	 */
-	protected void checkDeleted() throws IllegalStateException {
-		if (deleted) {
-			throw new IllegalStateException("deleted"); //$NON-NLS-1$
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.Mirror#virtualMachine()
-	 */
-	public VirtualMachine virtualMachine() {
-		return vm;
-	}
-
-	/**
-	 * delete the request by setting it disabled and setting the delet flag 
-	 */
-	public synchronized void delete() {
-		setEnabled(false);
-		deleted = true;
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/EventRequestManagerImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/EventRequestManagerImpl.java
deleted file mode 100644
index 050e6b5..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/EventRequestManagerImpl.java
+++ /dev/null
@@ -1,259 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.Location;
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.BreakpointRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.DebuggerStatementRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDeathRequest;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDisconnectRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link EventRequestManager}
- * 
- * @since 1.0
- */
-public final class EventRequestManagerImpl implements EventRequestManager {
-
-	private final Map eventsMap = new HashMap();
-	private final List breakpointRequests = new ArrayList();
-	private final List exceptionRequests = new ArrayList();
-	private final List debuggerStatementRequests = new ArrayList();
-	private final List scriptLoadRequests = new ArrayList();
-	private final List stepRequests = new ArrayList();
-	private final List suspendRequests = new ArrayList();
-	private final List threadEnterRequests = new ArrayList();
-	private final List threadExitRequests = new ArrayList();
-	private final List vmDeathRequests = new ArrayList();
-	private final List vmDisconnectRequests = new ArrayList();
-	private final VirtualMachineImpl vm;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param vm
-	 */
-	public EventRequestManagerImpl(VirtualMachineImpl vm) {
-		this.vm = vm;
-		eventsMap.put(BreakpointRequestImpl.class, breakpointRequests);
-		eventsMap.put(DebuggerStatementRequestImpl.class, debuggerStatementRequests);
-		eventsMap.put(ExceptionRequestImpl.class, exceptionRequests);
-		eventsMap.put(ScriptLoadRequestImpl.class, scriptLoadRequests);
-		eventsMap.put(StepRequestImpl.class, stepRequests);
-		eventsMap.put(SuspendRequestImpl.class, suspendRequests);
-		eventsMap.put(ThreadEnterRequestImpl.class, threadEnterRequests);
-		eventsMap.put(ThreadExitRequestImpl.class, threadExitRequests);
-		eventsMap.put(VMDeathRequestImpl.class, vmDeathRequests);
-		eventsMap.put(VMDisconnectRequestImpl.class, vmDisconnectRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createBreakpointRequest(org.eclipse.wst.jsdt.debug.core.jsdi.Location)
-	 */
-	public synchronized BreakpointRequest createBreakpointRequest(Location location) {
-		BreakpointRequestImpl request = new BreakpointRequestImpl(vm, location);
-		breakpointRequests.add(request);
-		return request;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#debuggerStatementRequests()
-	 */
-	public synchronized List debuggerStatementRequests() {
-		return Collections.unmodifiableList(debuggerStatementRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createDebuggerStatementRequest()
-	 */
-	public synchronized DebuggerStatementRequest createDebuggerStatementRequest() {
-		DebuggerStatementRequestImpl request = new DebuggerStatementRequestImpl(vm);
-		debuggerStatementRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#breakpointRequests()
-	 */
-	public synchronized List breakpointRequests() {
-		return Collections.unmodifiableList(breakpointRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createExceptionRequest()
-	 */
-	public synchronized ExceptionRequest createExceptionRequest() {
-		ExceptionRequest request = new ExceptionRequestImpl(vm);
-		exceptionRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#exceptionRequests()
-	 */
-	public synchronized List exceptionRequests() {
-		return Collections.unmodifiableList(exceptionRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createScriptLoadRequest()
-	 */
-	public synchronized ScriptLoadRequest createScriptLoadRequest() {
-		ScriptLoadRequest request = new ScriptLoadRequestImpl(vm);
-		scriptLoadRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#scriptLoadRequests()
-	 */
-	public synchronized List scriptLoadRequests() {
-		return Collections.unmodifiableList(scriptLoadRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createStepRequest(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference, int)
-	 */
-	public synchronized StepRequest createStepRequest(ThreadReference thread, int step) {
-		StepRequest request = new StepRequestImpl(vm, thread, step);
-		stepRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#stepRequests()
-	 */
-	public synchronized List stepRequests() {
-		return Collections.unmodifiableList(stepRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createSuspendRequest(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public synchronized SuspendRequest createSuspendRequest(ThreadReference thread) {
-		SuspendRequest request = new SuspendRequestImpl(vm, thread);
-		suspendRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#suspendRequests()
-	 */
-	public synchronized List suspendRequests() {
-		return Collections.unmodifiableList(suspendRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createThreadEnterRequest()
-	 */
-	public synchronized ThreadEnterRequest createThreadEnterRequest() {
-		ThreadEnterRequest request = new ThreadEnterRequestImpl(vm);
-		threadEnterRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#threadEnterRequests()
-	 */
-	public List threadEnterRequests() {
-		return Collections.unmodifiableList(threadEnterRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createThreadExitRequest()
-	 */
-	public synchronized ThreadExitRequest createThreadExitRequest() {
-		ThreadExitRequest request = new ThreadExitRequestImpl(vm);
-		threadExitRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#threadExitRequests()
-	 */
-	public List threadExitRequests() {
-		return Collections.unmodifiableList(threadExitRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#deleteEventRequest(org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequest)
-	 */
-	public synchronized void deleteEventRequest(EventRequest eventRequest) {
-		Class clazz = eventRequest.getClass();
-		List eventList = (List) eventsMap.get(clazz);
-		if (eventList == null) {
-			throw new IllegalArgumentException(
-					"bad event request class - " + clazz.getName()); //$NON-NLS-1$
-		}
-		eventList.remove(eventRequest);
-		EventRequestImpl eventRequestImpl = (EventRequestImpl) eventRequest;
-		eventRequestImpl.delete();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#deleteEventRequest(java.util.List)
-	 */
-	public synchronized void deleteEventRequest(List eventRequests) {
-		for (Iterator iterator = eventRequests.iterator(); iterator.hasNext();) {
-			EventRequest eventRequest = (EventRequest) iterator.next();
-			deleteEventRequest(eventRequest);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createVMDeathRequest()
-	 */
-	public VMDeathRequest createVMDeathRequest() {
-		VMDeathRequest request = new VMDeathRequestImpl(this.vm);
-		this.vmDeathRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#vmDeathRequests()
-	 */
-	public List vmDeathRequests() {
-		return Collections.unmodifiableList(vmDeathRequests);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#createVMDisconnectRequest()
-	 */
-	public VMDisconnectRequest createVMDisconnectRequest() {
-		VMDisconnectRequest request = new VMDisconnectRequestImpl(this.vm);
-		this.vmDisconnectRequests.add(request);
-		return request;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.EventRequestManager#vmDisconnectRequests()
-	 */
-	public List vmDisconnectRequests() {
-		return Collections.unmodifiableList(vmDisconnectRequests);
-	}
-}
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ExceptionRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ExceptionRequestImpl.java
deleted file mode 100644
index 11ab789..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ExceptionRequestImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ExceptionRequest}
- * 
- * @since 1.0
- */
-public class ExceptionRequestImpl extends EventRequestImpl implements ExceptionRequest {
-
-	private ThreadReference thread;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public ExceptionRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ExceptionRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public synchronized void addThreadFilter(ThreadReference thread) {
-		checkDeleted();
-		this.thread = thread;
-	}
-
-	/**
-	 * The underlying {@link ThreadReference}
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return thread;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ScriptLoadRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ScriptLoadRequestImpl.java
deleted file mode 100644
index 3b8857d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ScriptLoadRequestImpl.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ScriptLoadRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ScriptLoadRequest}
- * 
- * @since 1.0
- */
-public class ScriptLoadRequestImpl extends EventRequestImpl implements ScriptLoadRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public ScriptLoadRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/StepRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/StepRequestImpl.java
deleted file mode 100644
index f72490a..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/StepRequestImpl.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.ThreadReferenceImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-import org.eclipse.wst.jsdt.debug.internal.rhino.transport.JSONConstants;
-
-/**
- * Rhino implementation of {@link StepRequest}
- * 
- * @since 1.0
- */
-public class StepRequestImpl extends EventRequestImpl implements StepRequest {
-
-	private final ThreadReferenceImpl thread;
-	private final int step;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 * @param step
-	 */
-	public StepRequestImpl(VirtualMachineImpl vm, ThreadReference thread, int step) {
-		super(vm);
-		this.thread = (ThreadReferenceImpl) thread;
-		this.step = step;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest#step()
-	 */
-	public int step() {
-		return step;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.StepRequest#thread()
-	 */
-	public ThreadReference thread() {
-		return thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.request.EventRequestImpl#setEnabled(boolean)
-	 */
-	public synchronized void setEnabled(boolean enabled) {
-		checkDeleted();
-		if (this.enabled == enabled) {
-			return;
-		}
-		if (enabled) {
-			String stepType = null;
-			if (step == STEP_INTO) {
-				stepType = JSONConstants.STEP_IN;
-			}
-			else if (step == STEP_OVER) {
-				stepType = JSONConstants.STEP_NEXT;
-			}
-			else if (step == STEP_OUT) {
-				stepType = JSONConstants.STEP_OUT;
-			}
-			if (thread.getStep() != null) {
-				throw new IllegalStateException("duplicate step"); //$NON-NLS-1$
-			}
-			thread.setStep(stepType);
-		} else {
-			thread.setStep(null);
-		}
-		this.enabled = enabled;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/SuspendRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/SuspendRequestImpl.java
deleted file mode 100644
index 3a499d2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/SuspendRequestImpl.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link SuspendRequest}
- * 
- * @since 1.0
- */
-public class SuspendRequestImpl extends EventRequestImpl implements SuspendRequest {
-
-	private final ThreadReference thread;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 * @param thread
-	 */
-	public SuspendRequestImpl(VirtualMachineImpl vm, ThreadReference thread) {
-		super(vm);
-		this.thread = thread;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.SuspendRequest#thread()
-	 */
-	public ThreadReference thread() {
-		return thread;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ThreadEnterRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ThreadEnterRequestImpl.java
deleted file mode 100644
index 4240d4d..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ThreadEnterRequestImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ThreadEnterRequest}
- * 
- * @since 1.0
- */
-public class ThreadEnterRequestImpl extends EventRequestImpl implements ThreadEnterRequest {
-
-	private ThreadReference thread;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public ThreadEnterRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadEnterRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public synchronized void addThreadFilter(ThreadReference thread) {
-		checkDeleted();
-		this.thread = thread;
-	}
-
-	/**
-	 * Return the underlying {@link ThreadReference}
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return thread;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ThreadExitRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ThreadExitRequestImpl.java
deleted file mode 100644
index 16f45ef..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/ThreadExitRequestImpl.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference;
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link ThreadExitRequest}
- * 
- * @since 1.0
- */
-public class ThreadExitRequestImpl extends EventRequestImpl implements ThreadExitRequest {
-
-	private ThreadReference thread;
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public ThreadExitRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.jsdt.debug.core.jsdi.request.ThreadExitRequest#addThreadFilter(org.eclipse.wst.jsdt.debug.core.jsdi.ThreadReference)
-	 */
-	public synchronized void addThreadFilter(ThreadReference thread) {
-		checkDeleted();
-		this.thread = thread;
-	}
-
-	/**
-	 * Returns the underlying {@link ThreadReference}
-	 * @return the underlying {@link ThreadReference}
-	 */
-	public synchronized ThreadReference thread() {
-		return thread;
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/VMDeathRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/VMDeathRequestImpl.java
deleted file mode 100644
index 153cde2..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/VMDeathRequestImpl.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDeathRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation for a {@link VMDeathRequest}
- * 
- * @since 1.0
- */
-public class VMDeathRequestImpl extends EventRequestImpl implements VMDeathRequest {
-
-	/**
-	 * Constructor 
-	 * @param vm
-	 */
-	public VMDeathRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/VMDisconnectRequestImpl.java b/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/VMDisconnectRequestImpl.java
deleted file mode 100644
index 7beb14f..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.rhino/src/org/eclipse/wst/jsdt/debug/internal/rhino/jsdi/request/VMDisconnectRequestImpl.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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.wst.jsdt.debug.internal.rhino.jsdi.request;
-
-import org.eclipse.wst.jsdt.debug.core.jsdi.request.VMDisconnectRequest;
-import org.eclipse.wst.jsdt.debug.internal.rhino.jsdi.VirtualMachineImpl;
-
-/**
- * Rhino implementation of {@link VMDisconnectRequest}
- * 
- * @since 1.0
- */
-public class VMDisconnectRequestImpl extends EventRequestImpl implements VMDisconnectRequest {
-
-	/**
-	 * Constructor
-	 * @param vm
-	 */
-	public VMDisconnectRequestImpl(VirtualMachineImpl vm) {
-		super(vm);
-	}
-}
\ No newline at end of file
