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 1330c22..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.1.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 018d8e8..0000000
--- a/bundles/org.eclipse.wst.jsdt.debug.core/src/org/eclipse/wst/jsdt/debug/internal/core/model/JavaScriptThread.java
+++ /dev/null
@@ -1,892 +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.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.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 {
-
-	/**
-	 * 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;
-				}
-				resumeUnderlyingThread();
-				fireResumeEvent(DebugEvent.CLIENT_REQUEST);
-			} 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;
-
-	/**
-	 * 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;
-	}
-
-	/**
-	 * @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);
-			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();
-	}
-
-	/**
-	 * 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;
-	}
-}
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
