Snap for 5348557 from e5c6f9d3821110df3781a8e9efbdada1305ab6b7 to qt-release

Change-Id: I5e9aa6dff3dd96582cd8bcffb7cec5b9004068d0
diff --git a/Android.bp b/Android.bp
index 28e8223..56fb729 100644
--- a/Android.bp
+++ b/Android.bp
@@ -124,3 +124,47 @@
     required: ["libnpt"],
     defaults: ["upstream-jdwp-defaults"],
 }
+
+genrule {
+    name: "jdwp_generated_java",
+    tools: ["jdwpgen"],
+    cmd: "$(location jdwpgen) $(in) -jdi $(out)",
+    srcs: ["make/data/jdwp/jdwp.spec"],
+    out: ["JDWP.java"],
+}
+
+python_binary_host {
+  name: "jdi_prop_gen",
+  srcs: ["etc/jdigen.py"],
+  main: "etc/jdigen.py",
+}
+
+genrule {
+  name: "jdi_generated_properties",
+  tools: ["jdi_prop_gen"],
+  cmd: "$(location jdi_prop_gen) $(in) $(out)",
+  out: ["jdi.java"],
+  srcs: ["src/share/classes/com/sun/tools/jdi/resources/jdi.properties"],
+}
+
+// The classes needed to support JDI and debug remote processes.
+java_library_host {
+  name: "jdi-support",
+  srcs: [
+    // The JDI interface definition.
+    "src/share/classes/com/sun/jdi/**/*.java",
+    // The JDI interface implementation
+    "src/share/classes/com/sun/tools/jdi/**/*.java",
+    // The JDWP.java file that contains all the constants.
+    ":jdwp_generated_java",
+    // The properties class which holds information about the various connectors.
+    ":jdi_generated_properties",
+  ],
+  exclude_srcs: [
+    // We don't support process attachment and lack some of the classes to even compile this file.
+    "src/share/classes/com/sun/tools/jdi/ProcessAttachingConnector.java",
+  ],
+  services: ["etc/com.sun.jdi.connect.Connector"],
+  javacflags: ["-g"],
+  notice: "LICENSE",
+}
\ No newline at end of file
diff --git a/etc/com.sun.jdi.connect.Connector b/etc/com.sun.jdi.connect.Connector
new file mode 100644
index 0000000..01de058
--- /dev/null
+++ b/etc/com.sun.jdi.connect.Connector
@@ -0,0 +1,2 @@
+com.sun.tools.jdi.SocketAttachingConnector
+com.sun.tools.jdi.SocketListeningConnector
\ No newline at end of file
diff --git a/etc/jdigen.py b/etc/jdigen.py
new file mode 100644
index 0000000..a5ba1a5
--- /dev/null
+++ b/etc/jdigen.py
@@ -0,0 +1,60 @@
+# Copyright (C) 2019 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+from __future__ import print_function
+import sys
+
+args = sys.argv
+
+if len(args) != 3:
+  print("Usage: jdigen <input> <output>")
+  sys.exit(1)
+
+TEMPLATE = """
+// Copyright (C) 2019 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.sun.tools.jdi.resources;
+import java.util.ListResourceBundle;
+public final class jdi extends ListResourceBundle {{
+  protected final Object[][] getContents() {{
+    return new Object[][] {{
+      {values}
+    }};
+  }}
+}}
+"""
+
+INSTANCE_FORMAT = '{{ "{key}", "{value}" }},\n'
+
+VALUES = ""
+with open(args[1], 'r+') as inp:
+  for l in inp.readlines():
+    key, value = l.split('=')
+    VALUES += INSTANCE_FORMAT.format(key = key.strip(), value = value.strip())
+
+with open(args[2], 'w') as out:
+  out.write(TEMPLATE.format(values = VALUES))
diff --git a/src/share/back/debugInit.c b/src/share/back/debugInit.c
index 66d5282..2a1bd21 100644
--- a/src/share/back/debugInit.c
+++ b/src/share/back/debugInit.c
@@ -259,7 +259,6 @@
     jint              jvmtiCompileTimeMajorVersion;
     jint              jvmtiCompileTimeMinorVersion;
     jint              jvmtiCompileTimeMicroVersion;
-    char              *boot_path = NULL;
     char              npt_lib[MAXPATHLEN];
 
     /* See if it's already loaded */
@@ -337,15 +336,10 @@
         forceExit(1); /* Kill entire process, no core dump wanted */
     }
 
-    // ANDROID-CHANGED: Android uses java.library.path to store all library path information.
-    JVMTI_FUNC_PTR(gdata->jvmti, GetSystemProperty)
-        (gdata->jvmti, (const char *)"java.library.path",
-         &boot_path);
-
-    dbgsysBuildLibName(npt_lib, sizeof(npt_lib), boot_path, NPT_LIBNAME);
+    // ANDROID-CHANGED: Load libnpt.so with no path to use the system linker config to find it.
+    dbgsysBuildLibName(npt_lib, sizeof(npt_lib), "", NPT_LIBNAME);
     /* Npt and Utf function init */
     NPT_INITIALIZE(npt_lib, &(gdata->npt), NPT_VERSION, NULL);
-    jvmtiDeallocate(boot_path);
     if (gdata->npt == NULL) {
         ERROR_MESSAGE(("JDWP: unable to initialize NPT library"));
         return JNI_ERR;
diff --git a/src/share/classes/com/sun/jdi/AbsentInformationException.java b/src/share/classes/com/sun/jdi/AbsentInformationException.java
new file mode 100644
index 0000000..36ac31e
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/AbsentInformationException.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Thrown to indicate line number or variable information is not available.
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+public class AbsentInformationException extends Exception
+{
+    private static final long serialVersionUID = 4988939309582416373L;
+    public AbsentInformationException()
+    {
+        super();
+    }
+
+    public AbsentInformationException(String s)
+    {
+        super(s);
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/Accessible.java b/src/share/classes/com/sun/jdi/Accessible.java
new file mode 100644
index 0000000..a1886b7
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/Accessible.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Provides information on the accessibility of a type or type component.
+ * Mirrors for program elements which allow an
+ * an access specifier (private, protected, public) provide information
+ * on that part of the declaration through this interface.
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface Accessible {
+
+    /**
+     * Returns the Java<sup><font size=-2>TM</font></sup>
+     * programming language modifiers, encoded in an integer.
+     * <p>
+     * The modifier encodings are defined in
+     * <cite>The Java&trade; Virtual Machine Specification</cite>
+     * in the <code>access_flag</code> tables for classes(section 4.1), fields(section 4.5), and methods(section 4.6).
+     */
+    public int modifiers();
+
+    /**
+     * Determines if this object mirrors a private item.
+     * For {@link ArrayType}, the return value depends on the
+     * array component type. For primitive arrays the return value
+     * is always false. For object arrays, the return value is the
+     * same as would be returned for the component type.
+     * For primitive classes, such as {@link java.lang.Integer#TYPE},
+     * the return value is always false.
+     *
+     * @return <code>true</code> for items with private access;
+     * <code>false</code> otherwise.
+     */
+    boolean isPrivate();
+
+    /**
+     * Determines if this object mirrors a package private item.
+     * A package private item is declared with no access specifier.
+     * For {@link ArrayType}, the return value depends on the
+     * array component type. For primitive arrays the return value
+     * is always false. For object arrays, the return value is the
+     * same as would be returned for the component type.
+     * For primitive classes, such as {@link java.lang.Integer#TYPE},
+     * the return value is always false.
+     *
+     * @return <code>true</code> for items with package private access;
+     * <code>false</code> otherwise.
+     */
+    boolean isPackagePrivate();
+
+    /**
+     * Determines if this object mirrors a protected item.
+     * For {@link ArrayType}, the return value depends on the
+     * array component type. For primitive arrays the return value
+     * is always false. For object arrays, the return value is the
+     * same as would be returned for the component type.
+     * For primitive classes, such as {@link java.lang.Integer#TYPE},
+     * the return value is always false.
+     *
+     * @return <code>true</code> for items with private access;
+     * <code>false</code> otherwise.
+     */
+    boolean isProtected();
+
+    /**
+     * Determines if this object mirrors a public item.
+     * For {@link ArrayType}, the return value depends on the
+     * array component type. For primitive arrays the return value
+     * is always true. For object arrays, the return value is the
+     * same as would be returned for the component type.
+     * For primitive classes, such as {@link java.lang.Integer#TYPE},
+     * the return value is always true.
+     *
+     * @return <code>true</code> for items with public access;
+     * <code>false</code> otherwise.
+     */
+    boolean isPublic();
+}
diff --git a/src/share/classes/com/sun/jdi/ArrayReference.java b/src/share/classes/com/sun/jdi/ArrayReference.java
new file mode 100644
index 0000000..d4cf64b
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/ArrayReference.java
@@ -0,0 +1,210 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+import java.util.List;
+
+/**
+ * Provides access to an array object and its components in the target VM.
+ * Each array component is mirrored by a {@link Value} object.
+ * The array components, in aggregate, are placed in {@link java.util.List}
+ * objects instead of arrays for consistency with the rest of the API and
+ * for interoperability with other APIs.
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ArrayReference extends ObjectReference {
+
+    /**
+     * Returns the number of components in this array.
+     *
+     * @return the integer count of components in this array.
+     */
+    int length();
+
+    /**
+     * Returns an array component value.
+     *
+     * @param index the index of the component to retrieve
+     * @return the {@link Value} at the given index.
+     * @throws java.lang.IndexOutOfBoundsException if
+     * <CODE><I>index</I></CODE> is outside the range of this array,
+     * that is, if either of the following are true:
+     * <PRE>
+     *    <I>index</I> &lt; 0
+     *    <I>index</I> &gt;= {@link #length() length()} </PRE>
+     */
+    Value getValue(int index);
+
+    /**
+     * Returns all of the components in this array.
+     *
+     * @return a list of {@link Value} objects, one for each array
+     * component ordered by array index.  For zero length arrays,
+     * an empty list is returned.
+     */
+    List<Value> getValues();
+
+    /**
+     * Returns a range of array components.
+     *
+     * @param index the index of the first component to retrieve
+     * @param length the number of components to retrieve, or -1 to
+     * retrieve all components to the end of this array.
+     * @return a list of {@link Value} objects, one for each requested
+     * array component ordered by array index.  When there are
+     * no elements in the specified range (e.g.
+     * <CODE><I>length</I></CODE> is zero) an empty list is returned
+     *
+     * @throws java.lang.IndexOutOfBoundsException if the range
+     * specified with <CODE><I>index</I></CODE> and
+     * <CODE><I>length</I></CODE> is not within the range of the array,
+     * that is, if either of the following are true:
+     * <PRE>
+     *    <I>index</I> &lt; 0
+     *    <I>index</I> &gt; {@link #length() length()} </PRE>
+     * or if <CODE><I>length</I> != -1</CODE> and
+     * either of the following are true:
+     * <PRE>
+     *    <I>length</I> &lt; 0
+     *    <I>index</I> + <I>length</I> &gt;  {@link #length() length()}</PRE>
+     */
+    List<Value> getValues(int index, int length);
+
+    /**
+     * Replaces an array component with another value.
+     * <p>
+     * Object values must be assignment compatible with the component type
+     * (This implies that the component type must be loaded through the
+     * declaring class's class loader). Primitive values must be
+     * either assignment compatible with the component type or must be
+     * convertible to the component type without loss of information.
+     * See JLS section 5.2 for more information on assignment
+     * compatibility.
+     *
+     * @param value the new value
+     * @param index the index of the component to set
+     * @throws java.lang.IndexOutOfBoundsException if
+     * <CODE><I>index</I></CODE> is outside the range of this array,
+     * that is, if either of the following are true:
+     * <PRE>
+     *    <I>index</I> &lt; 0
+     *    <I>index</I> &gt;= {@link #length() length()} </PRE>
+     * @throws InvalidTypeException if the type of <CODE><I>value</I></CODE>
+     * is not compatible with the declared type of array components.
+     * @throws ClassNotLoadedException if the array component type
+     * has not yet been loaded
+     * through the appropriate class loader.
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     *
+     * @see ArrayType#componentType()
+     */
+    void setValue(int index, Value value)
+            throws InvalidTypeException,
+                   ClassNotLoadedException;
+
+    /**
+     * Replaces all array components with other values. If the given
+     * list is larger in size than the array, the values at the
+     * end of the list are ignored.
+     * <p>
+     * Object values must be assignment compatible with the element type
+     * (This implies that the component type must be loaded through the
+     * enclosing class's class loader). Primitive values must be
+     * either assignment compatible with the component type or must be
+     * convertible to the component type without loss of information.
+     * See JLS section 5.2 for more information on assignment
+     * compatibility.
+     *
+     * @param values a list of {@link Value} objects to be placed
+     * in this array.  If <CODE><I>values</I>.size()</CODE> is
+     * less that the length of the array, the first
+     * <CODE><I>values</I>.size()</CODE> elements are set.
+     * @throws InvalidTypeException if any of the
+     * new <CODE><I>values</I></CODE>
+     * is not compatible with the declared type of array components.
+     * @throws ClassNotLoadedException if the array component
+     * type has not yet been loaded
+     * through the appropriate class loader.
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     *
+     * @see ArrayType#componentType()
+     */
+    void setValues(List<? extends Value> values)
+            throws InvalidTypeException,
+                   ClassNotLoadedException;
+
+    /**
+     * Replaces a range of array components with other values.
+     * <p>
+     * Object values must be assignment compatible with the component type
+     * (This implies that the component type must be loaded through the
+     * enclosing class's class loader). Primitive values must be
+     * either assignment compatible with the component type or must be
+     * convertible to the component type without loss of information.
+     * See JLS section 5.2 for more information on assignment
+     * compatibility.
+     *
+     * @param index the index of the first component to set.
+     * @param values a list of {@link Value} objects to be placed
+     * in this array.
+     * @param srcIndex the index of the first source value to use.
+     * @param length the number of components to set, or -1 to set
+     * all components to the end of this array or the end of
+     * <CODE><I>values</I></CODE> (whichever comes first).
+     * @throws InvalidTypeException if any element of
+     * <CODE><I>values</I></CODE>
+     * is not compatible with the declared type of array components.
+     * @throws java.lang.IndexOutOfBoundsException if the
+     * array range specified with
+     * <CODE><I>index</I></CODE> and  <CODE><I>length</I></CODE>
+     * is not within the range of the array,
+     * or if the source range specified with
+     * <CODE><I>srcIndex</I></CODE> and <CODE><I>length</I></CODE>
+     * is not within <CODE><I>values</I></CODE>,
+     * that is, if any of the following are true:
+     * <PRE>
+     *    <I>index</I> &lt; 0
+     *    <I>index</I> &gt; {@link #length() length()}
+     *    <I>srcIndex</I> &lt; 0
+     *    <I>srcIndex</I> &gt; <I>values</I>.size() </PRE>
+     * or if <CODE><I>length</I> != -1</CODE> and any of the
+     * following are true:
+     * <PRE>
+     *    <I>length</I> &lt; 0
+     *    <I>index</I> + <I>length</I> &gt; {@link #length() length()}
+     *    <I>srcIndex</I> + <I>length</I> &gt; <I>values</I>.size() </PRE>
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     * @see ArrayType#componentType()
+     */
+    void setValues(int index, List<? extends Value> values, int srcIndex, int length)
+            throws InvalidTypeException,
+                   ClassNotLoadedException;
+}
diff --git a/src/share/classes/com/sun/jdi/ArrayType.java b/src/share/classes/com/sun/jdi/ArrayType.java
new file mode 100644
index 0000000..45c4f4d
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/ArrayType.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+import java.util.List;
+
+/**
+ * Provides access to the class of an array and the type of
+ * its components in the target VM.
+ *
+ * @see ArrayReference
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ArrayType extends ReferenceType {
+
+    /**
+     * Creates a new instance of this array class in the target VM.
+     * The array is created with the given length and each component
+     * is initialized to is standard default value.
+     *
+     * @param length the number of components in the new array
+     * @return the newly created {@link ArrayReference} mirroring
+     * the new object in the target VM.
+     *
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     */
+    ArrayReference newInstance(int length);
+
+    /**
+     * Gets the JNI signature of the components of this
+     * array class. The signature
+     * describes the declared type of the components. If the components
+     * are objects, their actual type in a particular run-time context
+     * may be a subclass of the declared class.
+     *
+     * @return a string containing the JNI signature of array components.
+     */
+    String componentSignature();
+
+    /**
+     * Returns a text representation of the component
+     * type of this array.
+     *
+     * @return a text representation of the component type.
+     */
+    String componentTypeName();
+
+    /**
+     * Returns the component type of this array,
+     * as specified in the array declaration.
+     * <P>
+     * Note: The component type of a array will always be
+     * created or loaded before the array - see
+     * <cite>The Java&trade; Virtual Machine Specification</cite>,
+     * section 5.3.3 - Creating Array Classes.
+     * However, although the component type will be loaded it may
+     * not yet be prepared, in which case the type will be returned
+     * but attempts to perform some operations on the returned type
+     * (e.g. {@link ReferenceType#fields() fields()}) will throw
+     * a {@link ClassNotPreparedException}.
+     * Use {@link ReferenceType#isPrepared()} to determine if
+     * a reference type is prepared.
+     *
+     * @see Type
+     * @see Field#type() Field.type() - for usage examples
+     * @return the {@link Type} of this array's components.
+     */
+    Type componentType() throws ClassNotLoadedException;
+}
diff --git a/src/share/classes/com/sun/jdi/BooleanType.java b/src/share/classes/com/sun/jdi/BooleanType.java
new file mode 100644
index 0000000..7bf98c8
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/BooleanType.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * The type of all primitive <code>boolean</code> values
+ * accessed in the target VM. Calls to {@link Value#type} will return an
+ * implementor of this interface.
+ *
+ * @see BooleanValue
+ *
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface BooleanType extends PrimitiveType {
+}
diff --git a/src/share/classes/com/sun/jdi/BooleanValue.java b/src/share/classes/com/sun/jdi/BooleanValue.java
new file mode 100644
index 0000000..73297fa
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/BooleanValue.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Provides access to a primitive <code>boolean</code> value in
+ * the target VM.
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface BooleanValue extends PrimitiveValue {
+
+    /**
+     * Returns this BooleanValue as a boolean.
+     *
+     * @return the <code>boolean</code> mirrored by this object.
+     */
+    boolean value();
+
+    /**
+     * Compares the specified Object with this BooleanValue for equality.
+     *
+     * @return true if the Object is a BooleanValue and if applying "=="
+     * to the two mirrored primitives would evaluate to true; false
+     * otherwise.
+     */
+    boolean equals(Object obj);
+
+    /**
+     * Returns the hash code value for this BooleanValue.
+     *
+     * @return the integer hash code
+     */
+    int hashCode();
+}
diff --git a/src/share/classes/com/sun/jdi/Bootstrap.java b/src/share/classes/com/sun/jdi/Bootstrap.java
new file mode 100644
index 0000000..8ab0954
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/Bootstrap.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Initial class that provides access to the default implementation
+ * of JDI interfaces. A debugger application uses this class to access the
+ * single instance of the {@link VirtualMachineManager} interface.
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+
+@jdk.Exported
+public class Bootstrap extends Object {
+
+    /**
+     * Returns the virtual machine manager.
+     *
+     * <p> May throw an unspecified error if initialization of the
+     * {@link com.sun.jdi.VirtualMachineManager} fails or if
+     * the virtual machine manager is unable to locate or create
+     * any {@link com.sun.jdi.connect.Connector Connectors}. </p>
+     * <p>
+     * @throws java.lang.SecurityException if a security manager has been
+     * installed and it denies {@link JDIPermission}
+     * <tt>("virtualMachineManager")</tt> or other unspecified
+     * permissions required by the implementation.
+     * </p>
+     */
+    static public synchronized VirtualMachineManager virtualMachineManager() {
+        return com.sun.tools.jdi.VirtualMachineManagerImpl.virtualMachineManager();
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/ByteType.java b/src/share/classes/com/sun/jdi/ByteType.java
new file mode 100644
index 0000000..dc83cc3
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/ByteType.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * The type of all primitive byte values accessed in
+ * the target VM. Calls to {@link Value#type} will return an
+ * implementor of this interface.
+ *
+ * @see ByteValue
+ *
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ByteType extends PrimitiveType {
+}
diff --git a/src/share/classes/com/sun/jdi/ByteValue.java b/src/share/classes/com/sun/jdi/ByteValue.java
new file mode 100644
index 0000000..a16ecd0
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/ByteValue.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Provides access to a primitive <code>byte</code> value in the target VM.
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ByteValue extends PrimitiveValue, Comparable<ByteValue> {
+
+    /**
+     * Returns this ByteValue as a <code>byte</code>.
+     *
+     * @return the <code>byte</code> mirrored by this object.
+     */
+    byte value();
+
+    /**
+     * Compares the specified Object with this ByteValue for equality.
+     *
+     * @return true if the Object is a ByteValue and if applying "=="
+     * to the two mirrored primitives would evaluate to true; false
+     * otherwise.
+     */
+    boolean equals(Object obj);
+
+    /**
+     * Returns the hash code value for this BooleanValue.
+     *
+     * @return the integer hash code
+     */
+    int hashCode();
+}
diff --git a/src/share/classes/com/sun/jdi/CharType.java b/src/share/classes/com/sun/jdi/CharType.java
new file mode 100644
index 0000000..fab5a16
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/CharType.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * The type of all primitive char values accessed in
+ * the target VM. Calls to {@link Value#type} will return an
+ * implementor of this interface.
+ *
+ * @see CharValue
+ *
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface CharType extends PrimitiveType {
+}
diff --git a/src/share/classes/com/sun/jdi/CharValue.java b/src/share/classes/com/sun/jdi/CharValue.java
new file mode 100644
index 0000000..2f9d630
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/CharValue.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Provides access to a primitive <code>char</code> value in
+ * the target VM.
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface CharValue extends PrimitiveValue, Comparable<CharValue> {
+
+    /**
+     * Returns this CharValue as a <code>char</code>.
+     *
+     * @return the <code>char</code> mirrored by this object.
+     */
+    char value();
+
+    /**
+     * Compares the specified Object with this CharValue for equality.
+     *
+     * @return true if the Object is a CharValue and if applying "=="
+     * to the two mirrored primitives would evaluate to true; false
+     * otherwise.
+     */
+    boolean equals(Object obj);
+
+    /**
+     * Returns the hash code value for this CharValue.
+     *
+     * @return the integer hash code
+     */
+    int hashCode();
+}
diff --git a/src/share/classes/com/sun/jdi/ClassLoaderReference.java b/src/share/classes/com/sun/jdi/ClassLoaderReference.java
new file mode 100644
index 0000000..b8363ae
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/ClassLoaderReference.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+import java.util.List;
+
+/**
+ * A class loader object from the target VM.
+ * A ClassLoaderReference is an {@link ObjectReference} with additional
+ * access to classloader-specific information from the target VM. Instances
+ * ClassLoaderReference are obtained through calls to
+ * {@link ReferenceType#classLoader}
+ *
+ * @see ObjectReference
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ClassLoaderReference extends ObjectReference {
+
+    /**
+     * Returns a list of all loaded classes that were defined by this
+     * class loader. No ordering of this list guaranteed.
+     * <P>
+     * The returned list will include reference types
+     * loaded at least to the point of preparation and
+     * types (like array) for which preparation is
+     * not defined.
+     *
+     * @return a List of {@link ReferenceType} objects mirroring types
+     * loaded by this class loader. The list has length 0 if no types
+     * have been defined by this classloader.
+     */
+    List<ReferenceType> definedClasses();
+
+    /**
+     * Returns a list of all classes for which this class loader has
+     * been recorded as the initiating loader in the target VM.
+     * The list contains ReferenceTypes defined directly by this loader
+     * (as returned by {@link #definedClasses}) and any types for which
+     * loading was delegated by this class loader to another class loader.
+     * <p>
+     * The visible class list has useful properties with respect to
+     * the type namespace. A particular type name will occur at most
+     * once in the list. Each field or variable declared with that
+     * type name in a class defined by
+     * this class loader must be resolved to that single type.
+     * <p>
+     * No ordering of the returned list is guaranteed.
+     * <p>
+     * See
+     * <cite>The Java&trade; Virtual Machine Specification</cite>,
+     * section 5.3 - Creation and Loading
+     * for more information on the initiating classloader.
+     * <p>
+     * Note that unlike {@link #definedClasses()}
+     * and {@link VirtualMachine#allClasses()},
+     * some of the returned reference types may not be prepared.
+     * Attempts to perform some operations on unprepared reference types
+     * (e.g. {@link ReferenceType#fields() fields()}) will throw
+     * a {@link ClassNotPreparedException}.
+     * Use {@link ReferenceType#isPrepared()} to determine if
+     * a reference type is prepared.
+     *
+     * @return a List of {@link ReferenceType} objects mirroring classes
+     * initiated by this class loader. The list has length 0 if no classes
+     * are visible to this classloader.
+     */
+    List<ReferenceType> visibleClasses();
+}
diff --git a/src/share/classes/com/sun/jdi/ClassNotLoadedException.java b/src/share/classes/com/sun/jdi/ClassNotLoadedException.java
new file mode 100644
index 0000000..3493185
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/ClassNotLoadedException.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Thrown to indicate that the requested class has
+ * not yet been loaded through the appropriate class loader.
+ * <p>
+ * Due to the lazy class linking performed by many VMs, it is
+ * possible for a field or variable to be visible in a program
+ * before the associated class is loaded. Until the class is loaded
+ * all that is available is a signature string. If an attempt is made to
+ * set the value of such a field or variable from JDI, the appropriate
+ * type checking cannot be done because the destination class has not been
+ * loaded. The same is true for the element class of array elements.
+ * <p>
+ * It is not advisable to solve this problem by attempting a class load on
+ * the fly in this case. There are two problems in having the debugger load
+ * a class instead of waiting for it to load over the normal course
+ * of events.
+ * <ul>
+ * <li>There can be no guarantee that running the appropriate class
+ * loader won't cause a deadlock in loading the
+ * class. Class loaders can consist of arbitrary
+ * Java<sup><font size=-2>TM</font></sup> programming language code and the
+ * class loading methods are usually synchronized. Most of the work
+ * done by a debugger happens when threads are suspended. If another
+ * application thread is suspended within the same class loader,
+ *  a deadlock is very possible.
+ * <li>Changing the order in which classes are normally loaded may either mask
+ * or reveal bugs in the application. An unintrusive debugger should strive
+ * to leave unchanged the behavior of the application being debugged.
+ * </ul>
+ * To avoid these potential problems, this exception is thrown.
+ * <p>
+ * Note that this exception will be thrown until the class in question
+ * is visible to the class loader of enclosing class. (That is, the
+ * class loader of the enclosing class must be an <i>initiating</i> class
+ * loader for the class in question.)
+ * See
+ * <cite>The Java&trade; Virtual Machine Specification</cite>
+ * for more details.
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+public class ClassNotLoadedException extends Exception
+{
+    private static final long serialVersionUID = -6242978768444298722L;
+    private String className;
+
+    public ClassNotLoadedException(String className) {
+        super();
+        this.className = className;
+    }
+
+    public ClassNotLoadedException(String className, String message) {
+        super(message);
+        this.className = className;
+    }
+
+    public String className() {
+        return className;
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/ClassNotPreparedException.java b/src/share/classes/com/sun/jdi/ClassNotPreparedException.java
new file mode 100644
index 0000000..528b36e
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/ClassNotPreparedException.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Thrown to indicate that the requested operation cannot be
+ * completed because the specified class has not yet been prepared.
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+public class ClassNotPreparedException extends RuntimeException {
+    private static final long serialVersionUID = -6120698967144079642L;
+    public ClassNotPreparedException()
+    {
+        super();
+    }
+
+    public ClassNotPreparedException(String s)
+    {
+        super(s);
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/ClassObjectReference.java b/src/share/classes/com/sun/jdi/ClassObjectReference.java
new file mode 100644
index 0000000..79a306a
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/ClassObjectReference.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * An instance of java.lang.Class from the target VM.
+ * Use this interface to access type information
+ * for the class, array, or interface that this object reflects.
+ *
+ * @see ReferenceType
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ClassObjectReference extends ObjectReference {
+
+    /**
+     * Returns the {@link ReferenceType} corresponding to this
+     * class object. The returned type can be used to obtain
+     * detailed information about the class.
+     *
+     * @return the {@link ReferenceType} reflected by this class object.
+     */
+    ReferenceType reflectedType();
+}
diff --git a/src/share/classes/com/sun/jdi/ClassType.java b/src/share/classes/com/sun/jdi/ClassType.java
new file mode 100644
index 0000000..296f2e7
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/ClassType.java
@@ -0,0 +1,373 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+import java.util.List;
+
+/**
+ * A mirror of a class in the target VM. A ClassType is a refinement
+ * of {@link ReferenceType} that applies to true classes in the JLS
+ * sense of the definition (not an interface, not an array type). Any
+ * {@link ObjectReference} that mirrors an instance of such a class
+ * will have a ClassType as its type.
+ *
+ * @see ObjectReference
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ClassType extends ReferenceType {
+    /**
+     * Gets the superclass of this class.
+     *
+     * @return a {@link ClassType} that mirrors the superclass
+     * of this class in the target VM. If no such class exists,
+     * returns null
+     */
+    ClassType superclass();
+
+    /**
+     * Gets the interfaces directly implemented by this class.
+     * Only the interfaces that are declared with the "implements"
+     * keyword in this class are included.
+     *
+     * @return a List of {@link InterfaceType} objects each mirroring
+     * a direct interface this ClassType in the target VM.
+     * If none exist, returns a zero length List.
+     * @throws ClassNotPreparedException if this class not yet been
+     * prepared.
+     */
+    List<InterfaceType> interfaces();
+
+    /**
+     * Gets the interfaces directly and indirectly implemented
+     * by this class. Interfaces returned by {@link ClassType#interfaces}
+     * are returned as well all superinterfaces.
+     *
+     * @return a List of {@link InterfaceType} objects each mirroring
+     * an interface of this ClassType in the target VM.
+     * If none exist, returns a zero length List.
+     * @throws ClassNotPreparedException if this class not yet been
+     * prepared.
+     */
+    List<InterfaceType> allInterfaces();
+
+    /**
+     * Gets the currently loaded, direct subclasses of this class.
+     * No ordering of this list is guaranteed.
+     *
+     * @return a List of {@link ClassType} objects each mirroring a loaded
+     * subclass of this class in the target VM. If no such classes
+     * exist, this method returns a zero-length list.
+     */
+    List<ClassType> subclasses();
+
+    /**
+     * Determine if this class was declared as an enum.
+     * @return <code>true</code> if this class was declared as an enum; false
+     * otherwise.
+     */
+    boolean isEnum();
+
+    /**
+     * Assigns a value to a static field.
+     * The {@link Field} must be valid for this ClassType; that is,
+     * it must be from the mirrored object's class or a superclass of that class.
+     * The field must not be final.
+     * <p>
+     * Object values must be assignment compatible with the field type
+     * (This implies that the field type must be loaded through the
+     * enclosing class' class loader). Primitive values must be
+     * either assignment compatible with the field type or must be
+     * convertible to the field type without loss of information.
+     * See JLS section 5.2 for more information on assignment
+     * compatibility.
+     *
+     * @param field the field to set.
+     * @param value the value to be assigned.
+     * @throws java.lang.IllegalArgumentException if the field is
+     * not static, the field is final, or the field does not exist
+     * in this class.
+     * @throws ClassNotLoadedException if the field type has not yet been loaded
+     * through the appropriate class loader.
+     * @throws InvalidTypeException if the value's type does not match
+     * the field's declared type.
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     */
+    void setValue(Field field, Value value)
+        throws InvalidTypeException, ClassNotLoadedException;
+
+    /** Perform method invocation with only the invoking thread resumed */
+    static final int INVOKE_SINGLE_THREADED = 0x1;
+
+    /**
+     * Invokes the specified static {@link Method} in the
+     * target VM. The
+     * specified method can be defined in this class,
+     * or in a superclass.
+     * The method must be a static method
+     * but not a static initializer.
+     * Use {@link ClassType#newInstance} to create a new object and
+     * run its constructor.
+     * <p>
+     * The method invocation will occur in the specified thread.
+     * Method invocation can occur only if the specified thread
+     * has been suspended by an event which occurred in that thread.
+     * Method invocation is not supported
+     * when the target VM has been suspended through
+     * {@link VirtualMachine#suspend} or when the specified thread
+     * is suspended through {@link ThreadReference#suspend}.
+     * <p>
+     * The specified method is invoked with the arguments in the specified
+     * argument list.  The method invocation is synchronous; this method
+     * does not return until the invoked method returns in the target VM.
+     * If the invoked method throws an exception, this method will throw
+     * an {@link InvocationException} which contains a mirror to the exception
+     * object thrown.
+     * <p>
+     * Object arguments must be assignment compatible with the argument type
+     * (This implies that the argument type must be loaded through the
+     * enclosing class' class loader). Primitive arguments must be
+     * either assignment compatible with the argument type or must be
+     * convertible to the argument type without loss of information.
+     * If the method being called accepts a variable number of arguments,
+     * then the last argument type is an array of some component type.
+     * The argument in the matching position can be omitted, or can be null,
+     * an array of the same component type, or an argument of the
+     * component type followed by any number of other arguments of the same
+     * type. If the argument is omitted, then a 0 length array of the
+     * component type is passed.  The component type can be a primitive type.
+     * Autoboxing is not supported.
+     *
+     * See Section 5.2 of
+     * <cite>The Java&trade; Language Specification</cite>
+     * for more information on assignment compatibility.
+     * <p>
+     * By default, all threads in the target VM are resumed while
+     * the method is being invoked if they were previously
+     * suspended by an event or by {@link VirtualMachine#suspend} or
+     * {@link ThreadReference#suspend}. This is done to prevent the deadlocks
+     * that will occur if any of the threads own monitors
+     * that will be needed by the invoked method.
+     * Note, however, that this implicit resume acts exactly like
+     * {@link ThreadReference#resume}, so if the thread's suspend
+     * count is greater than 1, it will remain in a suspended state
+     * during the invocation and thus a deadlock could still occur.
+     * By default, when the invocation completes,
+     * all threads in the target VM are suspended, regardless their state
+     * before the invocation.
+     * It is possible that
+     * breakpoints or other events might occur during the invocation.
+     * This can cause deadlocks as described above. It can also cause a deadlock
+     * if invokeMethod is called from the client's event handler thread.  In this
+     * case, this thread will be waiting for the invokeMethod to complete and
+     * won't read the EventSet that comes in for the new event.  If this
+     * new EventSet is SUSPEND_ALL, then a deadlock will occur because no
+     * one will resume the EventSet.  To avoid this, all EventRequests should
+     * be disabled before doing the invokeMethod, or the invokeMethod should
+     * not be done from the client's event handler thread.
+     * <p>
+     * The resumption of other threads during the invocation can be prevented
+     * by specifying the {@link #INVOKE_SINGLE_THREADED}
+     * bit flag in the <code>options</code> argument; however,
+     * there is no protection against or recovery from the deadlocks
+     * described above, so this option should be used with great caution.
+     * Only the specified thread will be resumed (as described for all
+     * threads above). Upon completion of a single threaded invoke, the invoking thread
+     * will be suspended once again. Note that any threads started during
+     * the single threaded invocation will not be suspended when the
+     * invocation completes.
+     * <p>
+     * If the target VM is disconnected during the invoke (for example, through
+     * {@link VirtualMachine#dispose}) the method invocation continues.
+     *
+     * @param thread the thread in which to invoke.
+     * @param method the {@link Method} to invoke.
+     * @param arguments the list of {@link Value} arguments bound to the
+     * invoked method. Values from the list are assigned to arguments
+     * in the order they appear in the method signature.
+     * @param options the integer bit flag options.
+     * @return a {@link Value} mirror of the invoked method's return value.
+     * @throws java.lang.IllegalArgumentException if the method is not
+     * a member of this class or a superclass, if the size of the argument list
+     * does not match the number of declared arguments for the method, or
+     * if the method is an initializer, constructor or static intializer.
+     * @throws {@link InvalidTypeException} if any argument in the
+     * argument list is not assignable to the corresponding method argument
+     * type.
+     * @throws ClassNotLoadedException if any argument type has not yet been loaded
+     * through the appropriate class loader.
+     * @throws IncompatibleThreadStateException if the specified thread has not
+     * been suspended by an event.
+     * @throws InvocationException if the method invocation resulted in
+     * an exception in the target VM.
+     * @throws InvalidTypeException If the arguments do not meet this requirement --
+     *         Object arguments must be assignment compatible with the argument
+     *         type.  This implies that the argument type must be
+     *         loaded through the enclosing class' class loader.
+     *         Primitive arguments must be either assignment compatible with the
+     *         argument type or must be convertible to the argument type without loss
+     *         of information. See JLS section 5.2 for more information on assignment
+     *         compatibility.
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     */
+    Value invokeMethod(ThreadReference thread, Method method,
+                       List<? extends Value> arguments, int options)
+                                   throws InvalidTypeException,
+                                          ClassNotLoadedException,
+                                          IncompatibleThreadStateException,
+                                          InvocationException;
+
+    /**
+     * Constructs a new instance of this type, using
+     * the given constructor {@link Method} in the
+     * target VM. The
+     * specified constructor must be defined in this class.
+     * <p>
+     * Instance creation will occur in the specified thread.
+     * Instance creation can occur only if the specified thread
+     * has been suspended by an event which occurred in that thread.
+     * Instance creation is not supported
+     * when the target VM has been suspended through
+     * {@link VirtualMachine#suspend} or when the specified thread
+     * is suspended through {@link ThreadReference#suspend}.
+     * <p>
+     * The specified constructor is invoked with the arguments in the specified
+     * argument list.  The invocation is synchronous; this method
+     * does not return until the constructor returns in the target VM.
+     * If the invoked method throws an
+     * exception, this method will throw an {@link InvocationException}
+     * which contains a mirror to the exception object thrown.
+     * <p>
+     * Object arguments must be assignment compatible with the argument type
+     * (This implies that the argument type must be loaded through the
+     * enclosing class' class loader). Primitive arguments must be
+     * either assignment compatible with the argument type or must be
+     * convertible to the argument type without loss of information.
+     * If the method being called accepts a variable number of arguments,
+     * then the last argument type is an array of some component type.
+     * The argument in the matching position can be omitted, or can be null,
+     * an array of the same component type, or an argument of the
+     * component type, followed by any number of other arguments of the same
+     * type. If the argument is omitted, then a 0 length array of the
+     * component type is passed.  The component type can be a primitive type.
+     * Autoboxing is not supported.
+     *
+     * See section 5.2 of
+     * <cite>The Java&trade; Language Specification</cite>
+     * for more information on assignment compatibility.
+     * <p>
+     * By default, all threads in the target VM are resumed while
+     * the method is being invoked if they were previously
+     * suspended by an event or by {@link VirtualMachine#suspend} or
+     * {@link ThreadReference#suspend}. This is done to prevent the deadlocks
+     * that will occur if any of the threads own monitors
+     * that will be needed by the invoked method. It is possible that
+     * breakpoints or other events might occur during the invocation.
+     * Note, however, that this implicit resume acts exactly like
+     * {@link ThreadReference#resume}, so if the thread's suspend
+     * count is greater than 1, it will remain in a suspended state
+     * during the invocation. By default, when the invocation completes,
+     * all threads in the target VM are suspended, regardless their state
+     * before the invocation.
+     * <p>
+     * The resumption of other threads during the invocation can be prevented
+     * by specifying the {@link #INVOKE_SINGLE_THREADED}
+     * bit flag in the <code>options</code> argument; however,
+     * there is no protection against or recovery from the deadlocks
+     * described above, so this option should be used with great caution.
+     * Only the specified thread will be resumed (as described for all
+     * threads above). Upon completion of a single threaded invoke, the invoking thread
+     * will be suspended once again. Note that any threads started during
+     * the single threaded invocation will not be suspended when the
+     * invocation completes.
+     * <p>
+     * If the target VM is disconnected during the invoke (for example, through
+     * {@link VirtualMachine#dispose}) the method invocation continues.
+     *
+     * @param thread the thread in which to invoke.
+     * @param method the constructor {@link Method} to invoke.
+     * @param arguments the list of {@link Value} arguments bound to the
+     * invoked constructor. Values from the list are assigned to arguments
+     * in the order they appear in the constructor signature.
+     * @param options the integer bit flag options.
+     * @return an {@link ObjectReference} mirror of the newly created
+     * object.
+     * @throws java.lang.IllegalArgumentException if the method is not
+     * a member of this class, if the size of the argument list
+     * does not match the number of declared arguments for the constructor,
+     * or if the method is not a constructor.
+     * @throws {@link InvalidTypeException} if any argument in the
+     * argument list is not assignable to the corresponding method argument
+     * type.
+     * @throws ClassNotLoadedException if any argument type has not yet been loaded
+     * through the appropriate class loader.
+     * @throws IncompatibleThreadStateException if the specified thread has not
+     * been suspended by an event.
+     * @throws InvocationException if the method invocation resulted in
+     * an exception in the target VM.
+     * @throws InvalidTypeException If the arguments do not meet this requirement --
+     *         Object arguments must be assignment compatible with the argument
+     *         type.  This implies that the argument type must be
+     *         loaded through the enclosing class' class loader.
+     *         Primitive arguments must be either assignment compatible with the
+     *         argument type or must be convertible to the argument type without loss
+     *         of information. See JLS section 5.2 for more information on assignment
+     *         compatibility.
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only
+     * - see {@link VirtualMachine#canBeModified()}.
+     */
+    ObjectReference newInstance(ThreadReference thread, Method method,
+                                List<? extends Value> arguments, int options)
+                                   throws InvalidTypeException,
+                                          ClassNotLoadedException,
+                                          IncompatibleThreadStateException,
+                                          InvocationException;
+
+    /**
+     * Returns a the single non-abstract {@link Method} visible from
+     * this class that has the given name and signature.
+     * See {@link ReferenceType#methodsByName(java.lang.String, java.lang.String)}
+     * for information on signature format.
+     * <p>
+     * The returned method (if non-null) is a component of
+     * {@link ClassType}.
+     *
+     * @see ReferenceType#visibleMethods
+     * @see ReferenceType#methodsByName(java.lang.String name)
+     * @see ReferenceType#methodsByName(java.lang.String name, java.lang.String signature)
+     * @param name the name of the method to find.
+     * @param signature the signature of the method to find
+     * @return the {@link Method} that matches the given
+     * name and signature or <code>null</code> if there is no match.
+     * @throws ClassNotPreparedException if methods are not yet available
+     * because the class has not yet been prepared.
+     */
+    Method concreteMethodByName(String name, String signature);
+}
diff --git a/src/share/classes/com/sun/jdi/DoubleType.java b/src/share/classes/com/sun/jdi/DoubleType.java
new file mode 100644
index 0000000..d40da78
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/DoubleType.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * The type of all primitive double values accessed in
+ * the target VM. Calls to {@link Value#type} will return an
+ * implementor of this interface.
+ *
+ * @see DoubleValue
+ *
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface DoubleType extends PrimitiveType {
+}
diff --git a/src/share/classes/com/sun/jdi/DoubleValue.java b/src/share/classes/com/sun/jdi/DoubleValue.java
new file mode 100644
index 0000000..e2f9cc2
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/DoubleValue.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Provides access to a primitive <code>double</code> value in
+ * the target VM.
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface DoubleValue extends PrimitiveValue, Comparable<DoubleValue> {
+
+    /**
+     * Returns this DoubleValue as a <code>double</code>.
+     *
+     * @return the <code>double</code> mirrored by this object.
+     */
+    double value();
+
+    /**
+     * Compares the specified Object with this DoubleValue for equality.
+     *
+     * @return true if the Object is a DoubleValue and if applying "=="
+     * to the two mirrored primitives would evaluate to true; false
+     * otherwise.
+     */
+    boolean equals(Object obj);
+
+    /**
+     * Returns the hash code value for this DoubleValue.
+     *
+     * @return the integer hash code
+     */
+    int hashCode();
+}
diff --git a/src/share/classes/com/sun/jdi/Field.java b/src/share/classes/com/sun/jdi/Field.java
new file mode 100644
index 0000000..00e2b75
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/Field.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * A class or instance variable in the target VM.
+ * See {@link TypeComponent}
+ * for general information about Field and Method mirrors.
+ *
+ * @see ObjectReference
+ * @see ReferenceType
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface Field extends TypeComponent, Comparable<Field> {
+
+    /**
+     * Returns a text representation of the type
+     * of this field.
+     * Where the type is the type specified in the declaration
+     * of this field.
+     * <P>
+     * This type name is always available even if
+     * the type has not yet been created or loaded.
+     *
+     * @return a String representing the
+     * type of this field.
+     */
+    String typeName();
+
+    /**
+     * Returns the type of this field.
+     * Where the type is the type specified in the declaration
+     * of this field.
+     * <P>
+     * For example, if a target class defines:
+     * <PRE>
+     *    short s;
+     *    Date d;
+     *    byte[] ba;</PRE>
+     * And the JDI client defines these <CODE>Field</CODE> objects:
+     * <PRE>
+     *    Field sField = targetClass.fieldByName("s");
+     *    Field dField = targetClass.fieldByName("d");
+     *    Field baField = targetClass.fieldByName("ba");</PRE>
+     * to mirror the corresponding fields, then <CODE>sField.type()</CODE>
+     * is a {@link ShortType}, <CODE>dField.type()</CODE> is the
+     * {@link ReferenceType} for <CODE>java.util.Date</CODE> and
+     * <CODE>((ArrayType)(baField.type())).componentType()</CODE> is a
+     * {@link ByteType}.
+     * <P>
+     * Note: if the type of this field is a reference type (class,
+     * interface, or array) and it has not been created or loaded
+     * by the declaring type's class loader - that is,
+     * {@link TypeComponent#declaringType <CODE>declaringType()</CODE>}
+     * <CODE>.classLoader()</CODE>,
+     * then ClassNotLoadedException will be thrown.
+     * Also, a reference type may have been loaded but not yet prepared,
+     * in which case the type will be returned
+     * but attempts to perform some operations on the returned type
+     * (e.g. {@link ReferenceType#fields() fields()}) will throw
+     * a {@link ClassNotPreparedException}.
+     * Use {@link ReferenceType#isPrepared()} to determine if
+     * a reference type is prepared.
+     *
+     * @see Type
+     * @return the {@link Type} of this field.
+     * @throws ClassNotLoadedException if the type has not yet been loaded
+     * or created through the appropriate class loader.
+     */
+    Type type() throws ClassNotLoadedException;
+
+    /**
+     * Determine if this is a transient field.
+     *
+     * @return <code>true</code> if this field is transient; false otherwise.
+     */
+    boolean isTransient();
+
+    /**
+     * Determine if this is a volatile field.
+     *
+     * @return <code>true</code> if this field is volatile; false otherwise.
+     */
+    boolean isVolatile();
+
+    /**
+     * Determine if this is a field that represents an enum constant.
+     * @return <code>true</code> if this field represents an enum constant;
+     * false otherwise.
+     */
+    boolean isEnumConstant();
+
+    /**
+     * Compares the specified Object with this field for equality.
+     *
+     * @return true if the Object is a Field and if both
+     * mirror the same field (declared in the same class or interface, in
+     * the same VM).
+     */
+    boolean equals(Object obj);
+
+    /**
+     * Returns the hash code value for this Field.
+     *
+     * @return the integer hash code
+     */
+    int hashCode();
+}
diff --git a/src/share/classes/com/sun/jdi/FloatType.java b/src/share/classes/com/sun/jdi/FloatType.java
new file mode 100644
index 0000000..29cb99a
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/FloatType.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * The type of all primitive float values accessed in
+ * the target VM. Calls to {@link Value#type} will return an
+ * implementor of this interface.
+ *
+ * @see FloatValue
+ *
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface FloatType extends PrimitiveType {
+}
diff --git a/src/share/classes/com/sun/jdi/FloatValue.java b/src/share/classes/com/sun/jdi/FloatValue.java
new file mode 100644
index 0000000..aa3be62
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/FloatValue.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Provides access to a primitive <code>float</code> value in
+ * the target VM.
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface FloatValue extends PrimitiveValue, Comparable<FloatValue> {
+
+    /**
+     * Returns this FloatValue as a float.
+     *
+     * @return the <code>float</code> mirrored by this object.
+     */
+    float value();
+
+    /**
+     * Compares the specified Object with this FloatValue for equality.
+     *
+     * @return true if the Object is a FloatValue and if applying "=="
+     * to the two mirrored primitives would evaluate to true; false
+     * otherwise.
+     */
+    boolean equals(Object obj);
+
+    /**
+     * Returns the hash code value for this FloatValue.
+     *
+     * @return the integer hash code
+     */
+    int hashCode();
+}
diff --git a/src/share/classes/com/sun/jdi/IncompatibleThreadStateException.java b/src/share/classes/com/sun/jdi/IncompatibleThreadStateException.java
new file mode 100644
index 0000000..11e110f
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/IncompatibleThreadStateException.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Thrown to indicate that the requested operation cannot be
+ * completed while the specified thread is in its current state.
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+public class IncompatibleThreadStateException extends Exception {
+    private static final long serialVersionUID = 6199174323414551389L;
+
+    public IncompatibleThreadStateException() {
+        super();
+    }
+
+    public IncompatibleThreadStateException(String s) {
+        super(s);
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/InconsistentDebugInfoException.java b/src/share/classes/com/sun/jdi/InconsistentDebugInfoException.java
new file mode 100644
index 0000000..8fe3ae9
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/InconsistentDebugInfoException.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Thrown to indicate that there is an inconistency in the debug
+ * information provided by the target VM. For example, this exception
+ * is thrown if there is a type mismatch between a retrieved value's
+ * runtime type and its declared type as reported by the target VM.
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+public class InconsistentDebugInfoException extends RuntimeException {
+    private static final long serialVersionUID = 7964236415376861808L;
+    public InconsistentDebugInfoException() {
+        super();
+    }
+
+    public InconsistentDebugInfoException(String s) {
+        super(s);
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/IntegerType.java b/src/share/classes/com/sun/jdi/IntegerType.java
new file mode 100644
index 0000000..f19b6de
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/IntegerType.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * The type of all primitive <code>int</code> values
+ * accessed in the target VM. Calls to {@link Value#type} will return an
+ * implementor of this interface.
+ *
+ * @see IntegerValue
+ *
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface IntegerType extends PrimitiveType {
+}
diff --git a/src/share/classes/com/sun/jdi/IntegerValue.java b/src/share/classes/com/sun/jdi/IntegerValue.java
new file mode 100644
index 0000000..b8a10a8
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/IntegerValue.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Provides access to a primitive <code>int</code> value in
+ * the target VM.
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface IntegerValue extends PrimitiveValue, Comparable<IntegerValue> {
+
+    /**
+     * Returns this IntegerValue as an int.
+     *
+     * @return the <code>int</code> mirrored by this object.
+     */
+    int value();
+
+    /**
+     * Compares the specified Object with this IntegerValue for equality.
+     *
+     * @return true if the Object is an IntegerValue and if applying "=="
+     * to the two mirrored primitives would evaluate to true; false
+     * otherwise.
+     */
+    boolean equals(Object obj);
+
+    /**
+     * Returns the hash code value for this IntegerValue.
+     *
+     * @return the integer hash code
+     */
+    int hashCode();
+}
diff --git a/src/share/classes/com/sun/jdi/InterfaceType.java b/src/share/classes/com/sun/jdi/InterfaceType.java
new file mode 100644
index 0000000..9436e48
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/InterfaceType.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+import java.util.List;
+
+/**
+ * A mirror of an interface in the target VM. An InterfaceType is
+ * a refinement of {@link ReferenceType} that applies to true interfaces
+ * in the JLS  sense of the definition (not a class, not an array type).
+ * An interface type will never be returned by
+ * {@link ObjectReference#referenceType}, but it may be in the list
+ * of implemented interfaces for a {@link ClassType} that is returned
+ * by that method.
+ *
+ * @see ObjectReference
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface InterfaceType extends ReferenceType {
+    /**
+     * Gets the interfaces directly extended by this interface.
+     * The returned list contains only those interfaces this
+     * interface has declared to be extended.
+     *
+     * @return a List of {@link InterfaceType} objects each mirroring
+     * an interface extended by this interface.
+     * If none exist, returns a zero length List.
+     * @throws ClassNotPreparedException if this class not yet been
+     * prepared.
+     */
+    List<InterfaceType> superinterfaces();
+
+    /**
+     * Gets the currently prepared interfaces which directly extend this
+     * interface. The returned list contains only those interfaces that
+     * declared this interface in their "extends" clause.
+     *
+     * @return a List of {@link InterfaceType} objects each mirroring
+     * an interface extending this interface.
+     * If none exist, returns a zero length List.
+     */
+    List<InterfaceType> subinterfaces();
+
+    /**
+     * Gets the currently prepared classes which directly implement this
+     * interface. The returned list contains only those classes that
+     * declared this interface in their "implements" clause.
+     *
+     * @return a List of {@link ClassType} objects each mirroring
+     * a class implementing this interface.
+     * If none exist, returns a zero length List.
+     */
+    List<ClassType> implementors();
+
+    /**
+     * Invokes the specified static {@link Method} in the
+     * target VM. The
+     * specified method must be defined in this interface.
+     * The method must be a static method
+     * but not a static initializer.
+     * <p>
+     * The method invocation will occur in the specified thread.
+     * Method invocation can occur only if the specified thread
+     * has been suspended by an event which occurred in that thread.
+     * Method invocation is not supported
+     * when the target VM has been suspended through
+     * {@link VirtualMachine#suspend} or when the specified thread
+     * is suspended through {@link ThreadReference#suspend}.
+     * <p>
+     * The specified method is invoked with the arguments in the specified
+     * argument list.  The method invocation is synchronous; this method
+     * does not return until the invoked method returns in the target VM.
+     * If the invoked method throws an exception, this method will throw
+     * an {@link InvocationException} which contains a mirror to the exception
+     * object thrown.
+     * <p>
+     * Object arguments must be assignment compatible with the argument type
+     * (This implies that the argument type must be loaded through the
+     * enclosing class' class loader). Primitive arguments must be
+     * either assignment compatible with the argument type or must be
+     * convertible to the argument type without loss of information.
+     * If the method being called accepts a variable number of arguments,
+     * then the last argument type is an array of some component type.
+     * The argument in the matching position can be omitted, or can be null,
+     * an array of the same component type, or an argument of the
+     * component type followed by any number of other arguments of the same
+     * type. If the argument is omitted, then a 0 length array of the
+     * component type is passed.  The component type can be a primitive type.
+     * Autoboxing is not supported.
+     *
+     * See Section 5.2 of
+     * <cite>The Java&trade; Language Specification</cite>
+     * for more information on assignment compatibility.
+     * <p>
+     * By default, all threads in the target VM are resumed while
+     * the method is being invoked if they were previously
+     * suspended by an event or by {@link VirtualMachine#suspend} or
+     * {@link ThreadReference#suspend}. This is done to prevent the deadlocks
+     * that will occur if any of the threads own monitors
+     * that will be needed by the invoked method.
+     * Note, however, that this implicit resume acts exactly like
+     * {@link ThreadReference#resume}, so if the thread's suspend
+     * count is greater than 1, it will remain in a suspended state
+     * during the invocation and thus a deadlock could still occur.
+     * By default, when the invocation completes,
+     * all threads in the target VM are suspended, regardless their state
+     * before the invocation.
+     * It is possible that
+     * breakpoints or other events might occur during the invocation.
+     * This can cause deadlocks as described above. It can also cause a deadlock
+     * if invokeMethod is called from the client's event handler thread.  In this
+     * case, this thread will be waiting for the invokeMethod to complete and
+     * won't read the EventSet that comes in for the new event.  If this
+     * new EventSet is SUSPEND_ALL, then a deadlock will occur because no
+     * one will resume the EventSet.  To avoid this, all EventRequests should
+     * be disabled before doing the invokeMethod, or the invokeMethod should
+     * not be done from the client's event handler thread.
+     * <p>
+     * The resumption of other threads during the invocation can be prevented
+     * by specifying the {@link #INVOKE_SINGLE_THREADED}
+     * bit flag in the <code>options</code> argument; however,
+     * there is no protection against or recovery from the deadlocks
+     * described above, so this option should be used with great caution.
+     * Only the specified thread will be resumed (as described for all
+     * threads above). Upon completion of a single threaded invoke, the invoking thread
+     * will be suspended once again. Note that any threads started during
+     * the single threaded invocation will not be suspended when the
+     * invocation completes.
+     * <p>
+     * If the target VM is disconnected during the invoke (for example, through
+     * {@link VirtualMachine#dispose}) the method invocation continues.
+     *
+     * @param thread the thread in which to invoke.
+     * @param method the {@link Method} to invoke.
+     * @param arguments the list of {@link Value} arguments bound to the
+     * invoked method. Values from the list are assigned to arguments
+     * in the order they appear in the method signature.
+     * @param options the integer bit flag options.
+     * @return a {@link Value} mirror of the invoked method's return value.
+     * @throws java.lang.IllegalArgumentException if the method is not
+     * a member of this interface, if the size of the argument list
+     * does not match the number of declared arguments for the method, or
+     * if the method is not static or is a static initializer.
+     * @throws {@link InvalidTypeException} if any argument in the
+     * argument list is not assignable to the corresponding method argument
+     * type.
+     * @throws ClassNotLoadedException if any argument type has not yet been loaded
+     * through the appropriate class loader.
+     * @throws IncompatibleThreadStateException if the specified thread has not
+     * been suspended by an event.
+     * @throws InvocationException if the method invocation resulted in
+     * an exception in the target VM.
+     * @throws InvalidTypeException If the arguments do not meet this requirement --
+     *         Object arguments must be assignment compatible with the argument
+     *         type.  This implies that the argument type must be
+     *         loaded through the enclosing class' class loader.
+     *         Primitive arguments must be either assignment compatible with the
+     *         argument type or must be convertible to the argument type without loss
+     *         of information. See JLS section 5.2 for more information on assignment
+     *         compatibility.
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     *
+     * @since 1.8
+     */
+    default Value invokeMethod(ThreadReference thread, Method method,
+                       List<? extends Value> arguments, int options)
+            throws InvalidTypeException,
+            ClassNotLoadedException,
+            IncompatibleThreadStateException,
+            InvocationException {
+        throw new UnsupportedOperationException();
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/InternalException.java b/src/share/classes/com/sun/jdi/InternalException.java
new file mode 100644
index 0000000..b688ca5
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/InternalException.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Thrown to indicate that an unexpected internal error has
+ * occurred.
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+public class InternalException extends RuntimeException {
+     private static final long serialVersionUID = -9171606393104480607L;
+     private int errorCode;
+
+     public InternalException() {
+         super();
+         this.errorCode = 0;
+     }
+
+     public InternalException(String s) {
+         super(s);
+         this.errorCode = 0;
+     }
+
+    public InternalException(int errorCode) {
+        super();
+        this.errorCode = errorCode;
+    }
+
+    public InternalException(String s, int errorCode) {
+        super(s);
+        this.errorCode = errorCode;
+    }
+
+    public int errorCode() {
+        return errorCode;
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/InvalidCodeIndexException.java b/src/share/classes/com/sun/jdi/InvalidCodeIndexException.java
new file mode 100644
index 0000000..928f741
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/InvalidCodeIndexException.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Thrown to indicate that the requested operation cannot be
+ * completed because the specified code index is not valid.
+ *
+ * @deprecated This exception is no longer thrown
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+@Deprecated
+public class InvalidCodeIndexException extends RuntimeException {
+    private static final long serialVersionUID = 7416010225133747805L;
+    public InvalidCodeIndexException() {
+        super();
+    }
+
+    public InvalidCodeIndexException(String s) {
+        super(s);
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/InvalidLineNumberException.java b/src/share/classes/com/sun/jdi/InvalidLineNumberException.java
new file mode 100644
index 0000000..0786d52
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/InvalidLineNumberException.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Thrown to indicate that the requested operation cannot be
+ * completed because the specified line number is not valid.
+ *
+ * @deprecated This exception is no longer thrown
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+@Deprecated
+public class InvalidLineNumberException extends RuntimeException {
+    private static final long serialVersionUID = 4048709912372692875L;
+    public InvalidLineNumberException() {
+        super();
+    }
+
+    public InvalidLineNumberException(String s) {
+        super(s);
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/InvalidStackFrameException.java b/src/share/classes/com/sun/jdi/InvalidStackFrameException.java
new file mode 100644
index 0000000..2f28d07
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/InvalidStackFrameException.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Thrown to indicate that the requested operation cannot be
+ * completed because the specified stack frame is no longer valid.
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+public class InvalidStackFrameException extends RuntimeException {
+    private static final long serialVersionUID = -1919378296505827922L;
+    public InvalidStackFrameException() {
+        super();
+    }
+
+    public InvalidStackFrameException(String s) {
+        super(s);
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/InvalidTypeException.java b/src/share/classes/com/sun/jdi/InvalidTypeException.java
new file mode 100644
index 0000000..299c447
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/InvalidTypeException.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Thrown to indicate a type mismatch in setting the value of a field
+ * or variable, or in specifying the return value of a method.
+ *
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public class InvalidTypeException extends Exception {
+    private static final long serialVersionUID = 2256667231949650806L;
+
+    public InvalidTypeException() {
+        super();
+    }
+
+    public InvalidTypeException(String s) {
+        super(s);
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/InvocationException.java b/src/share/classes/com/sun/jdi/InvocationException.java
new file mode 100644
index 0000000..1f8179e
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/InvocationException.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Thrown to indicate an exception occurred in an invoked method within
+ * the target VM.
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+public class InvocationException extends Exception {
+    private static final long serialVersionUID = 6066780907971918568L;
+    ObjectReference exception;
+
+    public InvocationException(ObjectReference exception) {
+        super("Exception occurred in target VM");
+        this.exception = exception;
+    }
+
+    public ObjectReference exception() {
+        return exception;
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/JDIPermission.java b/src/share/classes/com/sun/jdi/JDIPermission.java
new file mode 100644
index 0000000..7c3fad7
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/JDIPermission.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * The <code>JDIPermission</code> class represents access rights to
+ * the <code>VirtualMachineManager</code>.  This is the permission
+ * which the SecurityManager will check when code that is running with
+ * a SecurityManager requests access to the VirtualMachineManager, as
+ * defined in the Java Debug Interface (JDI) for the Java platform.
+ * <P>
+ * A <code>JDIPermission</code> object contains a name (also referred
+ * to as a "target name") but no actions list; you either have the
+ * named permission or you don't.
+ * <P>
+ * The following table provides a summary description of what the
+ * permission allows, and discusses the risks of granting code the
+ * permission.
+ * <P>
+ * <table border=1 cellpadding=5 summary="Table shows permission
+ * target name, what the permission allows, and associated risks">
+ * <tr>
+ * <th>Permission Target Name</th>
+ * <th>What the Permission Allows</th>
+ * <th>Risks of Allowing this Permission</th>
+ * </tr>
+ *
+ * <tr>
+ *   <td>virtualMachineManager</td>
+ *   <td>Ability to inspect and modify the JDI objects in the
+ *   <code>VirtualMachineManager</code>
+ *   </td>
+ *   <td>This allows an attacker to control the
+ *   <code>VirtualMachineManager</code> and cause the system to
+ *   misbehave.
+ *   </td>
+ * </tr>
+ *
+ * </table>
+ *
+ * <p>
+ * Programmers do not normally create JDIPermission objects directly.
+ * Instead they are created by the security policy code based on reading
+ * the security policy file.
+ *
+ * @author  Tim Bell
+ * @since   1.5
+ *
+ * @see com.sun.jdi.Bootstrap
+ * @see java.security.BasicPermission
+ * @see java.security.Permission
+ * @see java.security.Permissions
+ * @see java.security.PermissionCollection
+ * @see java.lang.SecurityManager
+ *
+ */
+
+@jdk.Exported
+public final class JDIPermission extends java.security.BasicPermission {
+    private static final long serialVersionUID = -6988461416938786271L;
+    /**
+     * The <code>JDIPermission</code> class represents access rights to the
+     * <code>VirtualMachineManager</code>
+     * @param name Permission name. Must be "virtualMachineManager".
+     * @throws IllegalArgumentException if the name argument is invalid.
+     */
+    public JDIPermission(String name) {
+        super(name);
+        if (!name.equals("virtualMachineManager")) {
+            throw new IllegalArgumentException("name: " + name);
+        }
+    }
+
+    /**
+     * Constructs a new JDIPermission object.
+     *
+     * @param name Permission name. Must be "virtualMachineManager".
+     * @param actions Must be either null or the empty string.
+     * @throws IllegalArgumentException if arguments are invalid.
+     */
+    public JDIPermission(String name, String actions)
+        throws IllegalArgumentException {
+        super(name);
+        if (!name.equals("virtualMachineManager")) {
+            throw new IllegalArgumentException("name: " + name);
+        }
+        if (actions != null && actions.length() > 0) {
+            throw new IllegalArgumentException("actions: " + actions);
+        }
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/LocalVariable.java b/src/share/classes/com/sun/jdi/LocalVariable.java
new file mode 100644
index 0000000..4b15d91
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/LocalVariable.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * A local variable in the target VM. Each variable declared within a
+ * {@link Method} has its own LocalVariable object. Variables of the same
+ * name declared in different scopes have different LocalVariable objects.
+ * LocalVariables can be used alone to retrieve static information
+ * about their declaration, or can be used in conjunction with a
+ * {@link StackFrame} to set and get values.
+ *
+ * @see StackFrame
+ * @see Method
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+
+@jdk.Exported
+public interface LocalVariable extends Mirror, Comparable<LocalVariable> {
+
+    /**
+     * Gets the name of the local variable.
+     *
+     * @return a string containing the name.
+     */
+    String name();
+
+    /**
+     * Returns a text representation of the type
+     * of this variable.
+     * Where the type is the type specified in the declaration
+     * of this local variable.
+     * <P>
+     * This type name is always available even if
+     * the type has not yet been created or loaded.
+     *
+     * @return a String representing the
+     * type of this local variable.
+
+     */
+    String typeName();
+
+    /**
+     * Returns the type of this variable.
+     * Where the type is the type specified in the declaration
+     * of this local variable.
+     * <P>
+     * Note: if the type of this variable is a reference type (class,
+     * interface, or array) and it has not been created or loaded
+     * by the class loader of the enclosing class,
+     * then ClassNotLoadedException will be thrown.
+     * Also, a reference type may have been loaded but not yet prepared,
+     * in which case the type will be returned
+     * but attempts to perform some operations on the returned type
+     * (e.g. {@link ReferenceType#fields() fields()}) will throw
+     * a {@link ClassNotPreparedException}.
+     * Use {@link ReferenceType#isPrepared()} to determine if
+     * a reference type is prepared.
+     *
+     * @see Type
+     * @see Field#type() Field.type() - for usage examples
+     * @return the {@link Type} of this local variable.
+     * @throws ClassNotLoadedException if the type has not yet been loaded
+     * through the appropriate class loader.
+     */
+    Type type() throws ClassNotLoadedException;
+
+    /**
+     * Gets the JNI signature of the local variable.
+     *
+     * @see <a href="doc-files/signature.html">Type Signatures</a>
+     * @return a string containing the signature.
+     */
+    String signature();
+
+    /**
+     * Gets the generic signature for this variable if there is one.
+     * Generic signatures are described in the
+     * <cite>The Java&trade; Virtual Machine Specification</cite>.
+     *
+     * @return a string containing the generic signature, or <code>null</code>
+     * if there is no generic signature.
+     *
+     * @since 1.5
+     */
+    String genericSignature();
+
+    /**
+     * Determines whether this variable can be accessed from the given
+     * {@link StackFrame}.
+     *
+     * See {@link StackFrame#visibleVariables} for a complete description
+     * variable visibility in this interface.
+     *
+     * @param frame the StackFrame querying visibility
+     * @return <code>true</code> if this variable is visible;
+     * <code>false</code> otherwise.
+     * @throws IllegalArgumentException if the stack frame's method
+     * does not match this variable's method.
+     */
+    boolean isVisible(StackFrame frame);
+
+    /**
+     * Determines if this variable is an argument to its method.
+     *
+     * @return <code>true</code> if this variable is an argument;
+     * <code>false</code> otherwise.
+     */
+    boolean isArgument();
+
+    /**
+     * Compares the specified Object with this LocalVariable for equality.
+     *
+     * @return  true if the Object is a LocalVariable, if both LocalVariables
+     * are contained in the same method (as determined by
+     * {@link Method#equals}), and if both LocalVariables mirror
+     * the same declaration within that method
+     */
+    boolean equals(Object obj);
+
+    /**
+     * Returns the hash code value for this LocalVariable.
+     *
+     * @return the integer hash code
+     */
+    int hashCode();
+}
diff --git a/src/share/classes/com/sun/jdi/Locatable.java b/src/share/classes/com/sun/jdi/Locatable.java
new file mode 100644
index 0000000..4dae014
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/Locatable.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * A mirror that has a {@link Location}.
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface Locatable {
+    /**
+     * Returns the {@link Location} of this mirror, if there
+     * is executable code associated with it. Note that both
+     * Java<SUP><FONT SIZE="-2">TM</FONT></SUP> programming
+     * language methods and native methods have executable code.
+     * Returns null for abstract methods, since abstract methods
+     * have no executable code.
+     *
+     * @return the {@link Location} of this mirror, or null if
+     * there is no executable code associated with it.
+     */
+    Location location();
+}
diff --git a/src/share/classes/com/sun/jdi/Location.java b/src/share/classes/com/sun/jdi/Location.java
new file mode 100644
index 0000000..e508781
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/Location.java
@@ -0,0 +1,262 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+import java.util.List;
+
+/**
+ * A point within the executing code of the target VM.
+ * Locations are used to identify the current position of
+ * a suspended thread (analogous to an instruction pointer or
+ * program counter register in native programs). They are also used
+ * to identify the position at which to set a breakpoint.
+ * <p>
+ * The availability of a line number for a location will
+ * depend on the level of debugging information available from the
+ * target VM.
+ * <p>
+ * Several mirror interfaces have locations. Each such mirror
+ * extends a {@link Locatable} interface.
+ * <p>
+ * <a name="strata"><b>Strata</b></a>
+ * <p>
+ * The source information for a Location is dependent on the
+ * <i>stratum</i> which is used. A stratum is a source code
+ * level within a sequence of translations.  For example,
+ * say the baz program is written in the programming language
+ * "Foo" then translated to the language "Bar" and finally
+ * translated into the Java programming language.  The
+ * Java programming language stratum is named
+ * <code>"Java"</code>, let's say the other strata are named
+ * "Foo" and "Bar".  A given location (as viewed by the
+ * {@link #sourceName()} and {@link #lineNumber()} methods)
+ * might be at line 14 of "baz.foo" in the <code>"Foo"</code>
+ * stratum, line 23 of "baz.bar" in the <code>"Bar"</code>
+ * stratum and line 71 of the <code>"Java"</code> stratum.
+ * Note that while the Java programming language may have
+ * only one source file for a reference type, this restriction
+ * does not apply to other strata - thus each Location should
+ * be consulted to determine its source path.
+ * Queries which do not specify a stratum
+ * ({@link #sourceName()}, {@link #sourcePath()} and
+ * {@link #lineNumber()}) use the VM's default stratum
+ * ({@link VirtualMachine#getDefaultStratum()}).
+ * If the specified stratum (whether explicitly specified
+ * by a method parameter or implicitly as the VM's default)
+ * is <code>null</code> or is not available in the declaring
+ * type, the declaring type's default stratum is used
+ * ({@link #declaringType()}.{@link ReferenceType#defaultStratum()
+ * defaultStratum()}).  Note that in the normal case, of code
+ * that originates as Java programming language source, there
+ * will be only one stratum (<code>"Java"</code>) and it will be
+ * returned as the default.  To determine the available strata
+ * use {@link ReferenceType#availableStrata()}.
+ *
+ * @see com.sun.jdi.request.EventRequestManager
+ * @see StackFrame
+ * @see com.sun.jdi.event.BreakpointEvent
+ * @see com.sun.jdi.event.ExceptionEvent
+ * @see Locatable
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since 1.3
+ */
+@jdk.Exported
+public interface Location extends Mirror, Comparable<Location> {
+
+    /**
+     * Gets the type to which this Location belongs. Normally
+     * the declaring type is a {@link ClassType}, but executable
+     * locations also may exist within the static initializer of an
+     * {@link InterfaceType}.
+     *
+     * @return the {@link ReferenceType} containing this Location.
+     */
+    ReferenceType declaringType();
+
+    /**
+     * Gets the method containing this Location.
+     *
+     * @return the location's {@link Method}.
+     */
+    Method method();
+
+    /**
+     * Gets the code position within this location's method.
+     *
+     * @return the long representing the position within the method
+     * or -1 if location is within a native method.
+     */
+    long codeIndex();
+
+    /**
+     * Gets an identifing name for the source corresponding to
+     * this location.
+     * <P>
+     * This method is equivalent to
+     * <code>sourceName(vm.getDefaultStratum())</code> -
+     * see {@link #sourceName(String)}
+     * for more information.
+     *
+     * @return a string specifying the source
+     * @throws AbsentInformationException if the source name is not
+     * known
+     */
+    String sourceName() throws AbsentInformationException;
+
+
+    /**
+     * Gets an identifing name for the source corresponding to
+     * this location. Interpretation of this string is the
+     * responsibility of the source repository mechanism.
+     * <P>
+     * Returned name is for the specified <i>stratum</i>
+     * (see the {@link Location class comment} for a
+     * description of strata).
+     * <P>
+     * The returned string is the unqualified name of the source
+     * file for this Location.  For example,
+     * <CODE>java.lang.Thread</CODE> would return
+     * <CODE>"Thread.java"</CODE>.
+     *
+     * @param stratum The stratum to retrieve information from
+     * or <code>null</code> for the declaring type's
+     * default stratum.
+     *
+     * @return a string specifying the source
+     *
+     * @throws AbsentInformationException if the source name is not
+     * known
+     *
+     * @since 1.4
+     */
+    String sourceName(String stratum)
+                        throws AbsentInformationException;
+
+    /**
+     * Gets the path to the source corresponding to this
+     * location.
+     * <P>
+     * This method is equivalent to
+     * <code>sourcePath(vm.getDefaultStratum())</code> -
+     * see {@link #sourcePath(String)}
+     * for more information.
+     *
+     * @return a string specifying the source
+     *
+     * @throws AbsentInformationException if the source name is not
+     * known
+     */
+    String sourcePath() throws AbsentInformationException;
+
+
+    /**
+     * Gets the path to the source corresponding to this
+     * location. Interpretation of this string is the
+     * responsibility of the source repository mechanism.
+     * <P>
+     * Returned path is for the specified <i>stratum</i>
+     * (see the {@link Location class comment} for a
+     * description of strata).
+     * <P>
+     * In the reference implementation, for strata which
+     * do not explicitly specify source path (the Java
+     * programming language stratum never does), the returned
+     * string is the package name of {@link #declaringType()}
+     * converted to a platform dependent path followed by the
+     * unqualified name of the source file for this Location
+     * ({@link #sourceName sourceName(stratum)}).
+     * For example, on a
+     * Windows platform, <CODE>java.lang.Thread</CODE>
+     * would return
+     * <CODE>"java\lang\Thread.java"</CODE>.
+     *
+     * @param stratum The stratum to retrieve information from
+     * or <code>null</code> for the declaring type's
+     * default stratum.
+     *
+     * @return a string specifying the source
+     *
+     * @throws AbsentInformationException if the source name is not
+     * known
+     *
+     * @since 1.4
+     */
+    String sourcePath(String stratum)
+                         throws AbsentInformationException;
+
+    /**
+     * Gets the line number of this Location.
+     * <P>
+     * This method is equivalent to
+     * <code>lineNumber(vm.getDefaultStratum())</code> -
+     * see {@link #lineNumber(String)}
+     * for more information.
+     *
+     * @return an int specifying the line in the source, returns
+     * -1 if the information is not available; specifically, always
+     * returns -1 for native methods.
+     */
+    int lineNumber();
+
+    /**
+     * The line number of this Location.  The line number is
+     * relative to the source specified by
+     * {@link #sourceName(String) sourceName(stratum)}.
+     * <P>
+     * Returned line number is for the specified <i>stratum</i>
+     * (see the {@link Location class comment} for a
+     * description of strata).
+     *
+     * @param stratum The stratum to retrieve information from
+     * or <code>null</code> for the declaring type's
+     * default stratum.
+     *
+     * @return an int specifying the line in the source, returns
+     * -1 if the information is not available; specifically, always
+     * returns -1 for native methods.
+     *
+     * @since 1.4
+     */
+    int lineNumber(String stratum);
+
+    /**
+     * Compares the specified Object with this Location for equality.
+     *
+     * @return true if the Object is a Location and if it refers to
+     * the same point in the same VM as this Location.
+     */
+    boolean equals(Object obj);
+
+    /**
+     * Returns the hash code value for this Location.
+     *
+     * @return the integer hash code
+     */
+    int hashCode();
+}
diff --git a/src/share/classes/com/sun/jdi/LongType.java b/src/share/classes/com/sun/jdi/LongType.java
new file mode 100644
index 0000000..f3cc736
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/LongType.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * The type of all primitive <code>long</code> values
+ * accessed in the target VM. Calls to {@link Value#type} will return an
+ * implementor of this interface.
+ *
+ * @see LongValue
+ *
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface LongType extends PrimitiveType {
+}
diff --git a/src/share/classes/com/sun/jdi/LongValue.java b/src/share/classes/com/sun/jdi/LongValue.java
new file mode 100644
index 0000000..98e25c2
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/LongValue.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Provides access to a primitive <code>long</code> value in
+ * the target VM.
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface LongValue extends PrimitiveValue, Comparable<LongValue> {
+
+    /**
+     * Returns this LongValue as a long.
+     *
+     * @return the <code>long</code> mirrored by this object.
+     */
+    long value();
+
+    /**
+     * Compares the specified Object with this LongValue for equality.
+     *
+     * @return true if the Object is a LongValue and if applying "=="
+     * to the two mirrored primitives would evaluate to true; false
+     * otherwise.
+     */
+    boolean equals(Object obj);
+
+    /**
+     * Returns the hash code value for this LongValue.
+     *
+     * @return the integer hash code
+     */
+    int hashCode();
+}
diff --git a/src/share/classes/com/sun/jdi/Method.java b/src/share/classes/com/sun/jdi/Method.java
new file mode 100644
index 0000000..eb81b05
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/Method.java
@@ -0,0 +1,442 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+import java.util.List;
+
+/**
+ * A static or instance method in the target VM. See {@link TypeComponent}
+ * for general information about Field and Method mirrors.
+ *
+ * @see ObjectReference
+ * @see ReferenceType
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface Method extends TypeComponent, Locatable, Comparable<Method> {
+
+    /**
+     * Returns a text representation of the return type,
+     * as specified in the declaration of this method.
+     * <P>
+     * This type name is always available even if
+     * the type has not yet been created or loaded.
+     *
+     * @return a String containing the return type name.
+     */
+    String returnTypeName();
+
+    /**
+     * Returns the return type,
+     * as specified in the declaration of this method.
+     * <P>
+     * Note: if the return type of this method is a reference type (class,
+     * interface, or array) and it has not been created or loaded
+     * by the declaring type's class loader - that is,
+     * {@link TypeComponent#declaringType <CODE>declaringType()</CODE>}
+     * <CODE>.classLoader()</CODE>,
+     * then ClassNotLoadedException will be thrown.
+     * Also, a reference type may have been loaded but not yet prepared,
+     * in which case the type will be returned
+     * but attempts to perform some operations on the returned type
+     * (e.g. {@link ReferenceType#fields() fields()}) will throw
+     * a {@link ClassNotPreparedException}.
+     * Use {@link ReferenceType#isPrepared()} to determine if
+     * a reference type is prepared.
+     *
+     * @see Type
+     * @see Field#type() Field.type() - for usage examples
+     * @return the return {@link Type} of this method.
+     * @throws ClassNotLoadedException if the type has not yet been
+     * created or loaded
+     * through the appropriate class loader.
+     */
+    Type returnType() throws ClassNotLoadedException;
+
+    /**
+     * Returns a list containing a text representation of the type
+     * of each formal parameter of this method.
+     * <P>
+     * This list is always available even if
+     * the types have not yet been created or loaded.
+     *
+     * @return a {@link java.util.List List} of {@link String},
+     * one List element for each parameter of this method.
+     * Each element represents the type of a formal parameter
+     * as specified at compile-time.
+     * If the formal parameter was declared with an ellipsis, then
+     * it is represented as an array of the type before the ellipsis.
+     *
+     */
+    List<String> argumentTypeNames();
+
+    /**
+     * Returns a list containing the type
+     * of each formal parameter of this method.
+     * <P>
+     * Note: if there is any parameter whose type
+     * is a reference type (class, interface, or array)
+     * and it has not been created or loaded
+     * by the declaring type's class loader - that is,
+     * {@link TypeComponent#declaringType <CODE>declaringType()</CODE>}
+     * <CODE>.classLoader()</CODE>,
+     * then ClassNotLoadedException will be thrown.
+     * Also, a reference type may have been loaded but not yet prepared,
+     * in which case the list will be returned
+     * but attempts to perform some operations on the type
+     * (e.g. {@link ReferenceType#fields() fields()}) will throw
+     * a {@link ClassNotPreparedException}.
+     * Use {@link ReferenceType#isPrepared()} to determine if
+     * a reference type is prepared.
+     *
+     * @see Type
+     * @return return a {@link java.util.List List} of {@link Type},
+     * one List element for each parameter of this method.
+     * Each element represents the type of a formal parameter
+     * as specified at compile-time.
+     * If the formal parameter was declared with an ellipsis, then
+     * it is represented as an array of the type before the ellipsis.
+     *
+     * @throws ClassNotLoadedException if the type has not yet been loaded
+     * through the appropriate class loader.
+     */
+    List<Type> argumentTypes() throws ClassNotLoadedException;
+
+    /**
+     * Determine if this method is abstract.
+     *
+     * @return <code>true</code> if the method is declared abstract;
+     * false otherwise.
+     */
+    boolean isAbstract();
+
+    /**
+     * Determine if this method is a default method
+     *
+     * @return <code>true</code> if the method is declared default;
+     * false otherwise
+     *
+     * @since 1.8
+     */
+    default boolean isDefault() {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * Determine if this method is synchronized.
+     *
+     * @return <code>true</code> if the method is declared synchronized;
+     * false otherwise.
+     */
+    boolean isSynchronized();
+
+    /**
+     * Determine if this method is native.
+     *
+     * @return <code>true</code> if the method is declared native;
+     * false otherwise.
+     */
+    boolean isNative();
+
+    /**
+     * Determine if this method accepts a variable number of arguments.
+     *
+     * @return <code>true</code> if the method accepts a variable number
+     * of arguments, false otherwise.
+     *
+     * @since 1.5
+     */
+    boolean isVarArgs();
+
+    /**
+     * Determine if this method is a bridge method. Bridge
+     * methods are defined in
+     * <cite>The Java&trade; Language Specification</cite>.
+     *
+     * @return <code>true</code> if the method is a bridge method,
+     * false otherwise.
+     *
+     * @since 1.5
+     */
+    boolean isBridge();
+
+    /**
+     * Determine if this method is a constructor.
+     *
+     * @return <code>true</code> if the method is a constructor;
+     * false otherwise.
+     */
+    boolean isConstructor();
+
+    /**
+     * Determine if this method is a static initializer.
+     *
+     * @return <code>true</code> if the method is a static initializer;
+     * false otherwise.
+     */
+    boolean isStaticInitializer();
+
+    /**
+     * Determine if this method is obsolete.
+     *
+     * @return <code>true</code> if this method has been made obsolete by a
+     * {@link VirtualMachine#redefineClasses} operation.
+     *
+     * @since 1.4
+     */
+    boolean isObsolete();
+
+    /**
+     * Returns a list containing a {@link Location} object for
+     * each executable source line in this method.
+     * <P>
+     * This method is equivalent to
+     * <code>allLineLocations(vm.getDefaultStratum(),null)</code> -
+     * see {@link #allLineLocations(String,String)}
+     * for more information.
+     *
+     * @return a List of all source line {@link Location} objects.
+     *
+     * @throws AbsentInformationException if there is no line
+     * number information for this (non-native, non-abstract)
+     * method.
+     */
+    List<Location> allLineLocations() throws AbsentInformationException;
+
+    /**
+     * Returns a list containing a {@link Location} object for
+     * each executable source line in this method.
+     * <P>
+     * Each location maps a source line to a range of code
+     * indices.
+     * The beginning of the range can be determined through
+     * {@link Location#codeIndex}.
+     * The returned list is ordered by code index
+     * (from low to high).
+     * <P>
+     * The returned list may contain multiple locations for a
+     * particular line number, if the compiler and/or VM has
+     * mapped that line to two or more disjoint code index ranges.
+     * <P>
+     * If the method is native or abstract, an empty list is
+     * returned.
+     * <P>
+     * Returned list is for the specified <i>stratum</i>
+     * (see {@link Location} for a description of strata).
+     *
+     * @param stratum The stratum to retrieve information from
+     * or <code>null</code> for the {@link ReferenceType#defaultStratum()}
+     *
+     * @param sourceName Return locations only within this
+     * source file or <code>null</code> to return locations.
+     *
+     * @return a List of all source line {@link Location} objects.
+     *
+     * @throws AbsentInformationException if there is no line
+     * number information for this (non-native, non-abstract)
+     * method.  Or if <i>sourceName</i> is non-<code>null</code>
+     * and source name information is not present.
+     *
+     * @since 1.4
+     */
+    List<Location> allLineLocations(String stratum, String sourceName)
+        throws AbsentInformationException;
+
+    /**
+     * Returns a List containing all {@link Location} objects
+     * that map to the given line number.
+     * <P>
+     * This method is equivalent to
+     * <code>locationsOfLine(vm.getDefaultStratum(), null,
+     * lineNumber)</code> -
+     * see {@link
+     * #locationsOfLine(java.lang.String,java.lang.String,int)}
+     * for more information.
+     *
+     * @param lineNumber the line number
+     *
+     * @return a List of {@link Location} objects that map to
+     * the given line number.
+     *
+     * @throws AbsentInformationException if there is no line
+     * number information for this method.
+     */
+    List<Location> locationsOfLine(int lineNumber) throws AbsentInformationException;
+
+    /**
+     * Returns a List containing all {@link Location} objects
+     * that map to the given line number and source name.
+     * <P>
+     * Returns a list containing each {@link Location} that maps
+     * to the given line. The returned list will contain a
+     * location for each disjoint range of code indices that have
+     * been assigned to the given line by the compiler and/or
+     * VM. Each returned location corresponds to the beginning of
+     * this range.  An empty list will be returned if there is no
+     * executable code at the specified line number; specifically,
+     * native and abstract methods will always return an empty
+     * list.
+     * <p>
+     * Returned list is for the specified <i>stratum</i>
+     * (see {@link Location} for a description of strata).
+     *
+     * @param stratum the stratum to use for comparing line number
+     *                and source name, or null to use the default
+     *                stratum
+     * @param sourceName the source name containing the
+     *                   line number, or null to match all
+     *                   source names
+     * @param lineNumber the line number
+     *
+     * @return a List of {@link Location} objects that map to
+     * the given line number.
+     *
+     * @throws AbsentInformationException if there is no line
+     * number information for this method.
+     * Or if <i>sourceName</i> is non-<code>null</code>
+     * and source name information is not present.
+     *
+     * @since 1.4
+     */
+    List<Location> locationsOfLine(String stratum, String sourceName,
+                                   int lineNumber)
+        throws AbsentInformationException;
+
+    /**
+     * Returns a {@link Location} for the given code index.
+     *
+     * @return the {@link Location} corresponding to the
+     * given code index or null if the specified code index is not a
+     * valid code index for this method (native and abstract methods
+     * will always return null).
+     */
+    Location locationOfCodeIndex(long codeIndex);
+
+    /**
+     * Returns a list containing each {@link LocalVariable} declared
+     * in this method. The list includes any variable declared in any
+     * scope within the method. It may contain multiple variables of the
+     * same name declared within disjoint scopes. Arguments are considered
+     * local variables and will be present in the returned list.
+     *
+     * If local variable information is not available, values of
+     * actual arguments to method invocations can be obtained
+     * by using the method {@link StackFrame#getArgumentValues()}
+     *
+     * @return the list of {@link LocalVariable} objects which mirror
+     * local variables declared in this method in the target VM.
+     * If there are no local variables, a zero-length list is returned.
+     * @throws AbsentInformationException if there is no variable
+     * information for this method.
+     * Generally, local variable information is not available for
+     * native or abstract methods (that is, their argument name
+     * information is not available), thus they will throw this exception.
+     */
+    List<LocalVariable> variables() throws AbsentInformationException;
+
+    /**
+     * Returns a list containing each {@link LocalVariable} of a
+     * given name in this method.
+     * Multiple variables can be returned
+     * if the same variable name is used in disjoint
+     * scopes within the method.
+     *
+     * @return the list of {@link LocalVariable} objects of the given
+     * name.
+     * If there are no matching local variables, a zero-length list
+     * is returned.
+     * @throws AbsentInformationException if there is no variable
+     * information for this method.
+     * Generally, local variable information is not available for
+     * native or abstract methods (that is, their argument name
+     * information is not available), thus they will throw this exception.
+     */
+    List<LocalVariable> variablesByName(String name)
+        throws AbsentInformationException;
+
+    /**
+     * Returns a list containing each {@link LocalVariable} that is
+     * declared as an argument of this method.
+     *
+     * If local variable information is not available, values of
+     * actual arguments to method invocations can be obtained
+     * by using the method {@link StackFrame#getArgumentValues()}
+     *
+     * @return the list of {@link LocalVariable} arguments.
+     * If there are no arguments, a zero-length list is returned.
+     * @throws AbsentInformationException if there is no variable
+     * information for this method.
+     * Generally, local variable information is not available for
+     * native or abstract methods (that is, their argument name
+     * information is not available), thus they will throw this exception.
+     */
+    List<LocalVariable> arguments() throws AbsentInformationException;
+
+    /**
+     * Returns an array containing the bytecodes for this method.
+     * <P>
+     * Not all target virtual machines support this operation.
+     * Use {@link VirtualMachine#canGetBytecodes()}
+     * to determine if the operation is supported.
+     *
+     * @return the array of bytecodes; abstract and native methods
+     * will return a zero-length array.
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support
+     * the retrieval of bytecodes.
+     */
+    byte[] bytecodes();
+
+    /**
+     * Returns the {@link Location} of this method, if there
+     * is executable code associated with it.
+     *
+     * @return the {@link Location} of this mirror, or null if
+     * this is an abstract method; native methods will return a
+     * Location object whose codeIndex is -1.
+     */
+    Location location();
+
+    /**
+     * Compares the specified Object with this method for equality.
+     *
+     * @return true if the Object is a method and if both
+     * mirror the same method (declared in the same class or interface, in
+     * the same VM).
+     */
+    boolean equals(Object obj);
+
+    /**
+     * Returns the hash code value for this Method.
+     *
+     * @return the integer hash code
+     */
+    int hashCode();
+}
diff --git a/src/share/classes/com/sun/jdi/Mirror.java b/src/share/classes/com/sun/jdi/Mirror.java
new file mode 100644
index 0000000..eb01abf
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/Mirror.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * A proxy used by a debugger to examine or manipulate some entity
+ * in another virtual machine. Mirror is the root of the
+ * interface hierarchy for this package. Mirrors can be proxies for objects
+ * in the target VM ({@link ObjectReference}), primitive values
+ * (for example, {@link IntegerValue}), types (for example,
+ * {@link ReferenceType}), dynamic application state (for example,
+ * {@link StackFrame}), and even debugger-specific constructs (for example,
+ * {@link com.sun.jdi.request.BreakpointRequest}).
+ * The {@link VirtualMachine} itself is also
+ * considered a mirror, representing the composite state of the
+ * target VM.
+ * <P>
+ * There is no guarantee that a particular entity in the target VM will map
+ * to a single instance of Mirror. Implementors are free to decide
+ * whether a single mirror will be used for some or all mirrors. Clients
+ * of this interface should always use <code>equals</code> to compare
+ * two mirrors for equality.
+ * <p>
+ * Any method on a {@link com.sun.jdi.Mirror} that takes a <code>Mirror</code> as an
+ * parameter directly or indirectly (e.g., as a element in a <code>List</code>) will
+ * throw {@link com.sun.jdi.VMMismatchException} if the mirrors are from different
+ * virtual machines.
+ *
+ * @see VirtualMachine
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface Mirror {
+
+    /**
+     * Gets the VirtualMachine to which this
+     * Mirror belongs. A Mirror must be associated
+     * with a VirtualMachine to have any meaning.
+     *
+     * @return the {@link VirtualMachine} for which this mirror is a proxy.
+     */
+    VirtualMachine virtualMachine();
+
+    /**
+     * Returns a String describing this mirror
+     *
+     * @return a string describing this mirror.
+     */
+    String toString();
+}
diff --git a/src/share/classes/com/sun/jdi/MonitorInfo.java b/src/share/classes/com/sun/jdi/MonitorInfo.java
new file mode 100644
index 0000000..ef72517
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/MonitorInfo.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Information about a monitor owned by a thread.
+ *
+ * @author Swamy Venkataramanappa
+ * @since  1.6
+ */
+
+@jdk.Exported
+public interface MonitorInfo extends Mirror {
+
+    /**
+     * Returns the {@link ObjectReference} object for the monitor.
+     * @return the {@link ObjectReference} object for the monitor.
+     * @throws InvalidStackFrameException if the associated stack
+     * frame has become invalid. Once the frame's thread is resumed,
+     * the stack frame is no longer valid.
+     * @see ThreadReference#ownedMonitorsAndFrames
+     * @since 1.6
+     */
+    public ObjectReference monitor();
+
+    /**
+     * Returns the stack depth at which this monitor was
+     * acquired by the owning thread. Returns -1 if the
+     * implementation cannot determine the stack depth
+     * (e.g., for monitors acquired by JNI MonitorEnter).
+     * @return the stack depth at which this monitor was
+     * acquired by the owning thread.
+     * @throws InvalidStackFrameException if the associated stack
+     * frame has become invalid. Once the frame's thread is resumed,
+     * the stack frame is no longer valid.
+     * @see ThreadReference#ownedMonitorsAndFrames
+     */
+    public int stackDepth();
+
+    /**
+     * Returns a {@link ThreadReference} object for the thread that
+     * owns the monitor.
+     * @return a {@link ThreadReference} object for the thread that
+     * owns the monitor.
+     * @throws InvalidStackFrameException if the associated stack
+     * frame has become invalid. Once the frame's thread is resumed,
+     * the stack frame is no longer valid.
+     * @see ThreadReference#frame
+     */
+    ThreadReference thread();
+}
diff --git a/src/share/classes/com/sun/jdi/NativeMethodException.java b/src/share/classes/com/sun/jdi/NativeMethodException.java
new file mode 100644
index 0000000..6379701
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/NativeMethodException.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Thrown to indicate an operation cannot be completed because
+ * it is not valid for a native method.
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+public class NativeMethodException extends RuntimeException {
+
+    private static final long serialVersionUID = 3924951669039469992L;
+    public NativeMethodException() {
+        super();
+    }
+
+    public NativeMethodException(String message) {
+        super(message);
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/ObjectCollectedException.java b/src/share/classes/com/sun/jdi/ObjectCollectedException.java
new file mode 100644
index 0000000..b88395e
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/ObjectCollectedException.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Thrown to indicate that the requested operation cannot be
+ * completed because the specified object has been garbage collected.
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+public class ObjectCollectedException extends RuntimeException {
+    private static final long serialVersionUID = -1928428056197269588L;
+    public ObjectCollectedException() {
+        super();
+    }
+
+    public ObjectCollectedException(String s) {
+        super(s);
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/ObjectReference.java b/src/share/classes/com/sun/jdi/ObjectReference.java
new file mode 100644
index 0000000..b6bf5a3
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/ObjectReference.java
@@ -0,0 +1,445 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * An object that currently exists in the target VM. An ObjectReference
+ * mirrors only the object itself and is not specific to any
+ * {@link Field} or {@link LocalVariable} to which it is currently
+ * assigned. An ObjectReference can
+ * have 0 or more references from field(s) and/or variable(s).
+ * <p>
+ * Any method on <code>ObjectReference</code> which directly or
+ * indirectly takes <code>ObjectReference</code> as an parameter may throw
+ * {@link com.sun.jdi.VMDisconnectedException} if the target VM is
+ * disconnected and the {@link com.sun.jdi.event.VMDisconnectEvent} has been or is
+ * available to be read from the {@link com.sun.jdi.event.EventQueue}.
+ * <p>
+ * Any method on <code>ObjectReference</code> which directly or
+ * indirectly takes <code>ObjectReference</code> as an parameter may throw
+ * {@link com.sun.jdi.VMOutOfMemoryException} if the target VM has run out of memory.
+ * <p>
+ * Any method on <code>ObjectReference</code> or which directly or indirectly takes
+ * <code>ObjectReference</code> as parameter may throw
+ * {@link com.sun.jdi.ObjectCollectedException} if the mirrored object has been
+ * garbage collected.
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ObjectReference extends Value {
+
+    /**
+     * Gets the {@link ReferenceType} that mirrors the type
+     * of this object. The type may be a subclass or implementor of the
+     * declared type of any field or variable which currently holds it.
+     * For example, right after the following statement.
+     * <p>
+     * <code>Object obj = new String("Hello, world!");</code>
+     * <p>
+     * The ReferenceType of obj will mirror java.lang.String and not
+     * java.lang.Object.
+     * <p>
+     * The type of an object never changes, so this method will
+     * always return the same ReferenceType over the lifetime of the
+     * mirrored object.
+     * <p>
+     * The returned ReferenceType will be a {@link ClassType} or
+     * {@link ArrayType} and never an {@link InterfaceType}.
+     *
+     * @return the {@link ReferenceType} for this object.
+     */
+    ReferenceType referenceType();
+
+    /**
+     * Gets the value of a given instance or static field in this object.
+     * The Field must be valid for this ObjectReference;
+     * that is, it must be from
+     * the mirrored object's class or a superclass of that class.
+     *
+     * @param sig the field containing the requested value
+     * @return the {@link Value} of the instance field.
+     * @throws java.lang.IllegalArgumentException if the field is not valid for
+     * this object's class.
+     */
+    Value getValue(Field sig);
+
+    /**
+     * Gets the value of multiple instance and/or static fields in this object.
+     * The Fields must be valid for this ObjectReference;
+     * that is, they must be from
+     * the mirrored object's class or a superclass of that class.
+     *
+     * @param fields a list of {@link Field} objects containing the
+     * requested values.
+     * @return a Map of the requested {@link Field} objects with
+     * their {@link Value}.
+     * @throws java.lang.IllegalArgumentException if any field is not valid for
+     * this object's class.
+     */
+    Map<Field,Value> getValues(List<? extends Field> fields);
+
+    /**
+     * Sets the value of a given instance or static field in this object.
+     * The {@link Field} must be valid for this ObjectReference; that is,
+     * it must be from the mirrored object's class or a superclass of that class.
+     * If static, the field must not be final.
+     * <p>
+     * Object values must be assignment compatible with the field type
+     * (This implies that the field type must be loaded through the
+     * enclosing class's class loader). Primitive values must be
+     * either assignment compatible with the field type or must be
+     * convertible to the field type without loss of information.
+     * See section 5.2 of
+     * <cite>The Java&trade; Language Specification</cite>
+     * for more information on assignment
+     * compatibility.
+     *
+     * @param field the field containing the requested value
+     * @param value the new value to assign
+     * @throws java.lang.IllegalArgumentException if the field is not valid for
+     * this object's class.
+     * @throws InvalidTypeException if the value's type does not match
+     * the field's type.
+     * @throws ClassNotLoadedException if 'value' is not null, and the field
+     * type has not yet been loaded through the appropriate class loader.
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     */
+    void setValue(Field field, Value value)
+        throws InvalidTypeException, ClassNotLoadedException;
+
+    /** Perform method invocation with only the invoking thread resumed */
+    static final int INVOKE_SINGLE_THREADED = 0x1;
+    /** Perform non-virtual method invocation */
+    static final int INVOKE_NONVIRTUAL      = 0x2;
+
+    /**
+     * Invokes the specified {@link Method} on this object in the
+     * target VM. The
+     * specified method can be defined in this object's class,
+     * in a superclass of this object's class, or in an interface
+     * implemented by this object. The method may be a static method
+     * or an instance method, but not a static initializer or constructor.
+     * Use {@link ClassType#newInstance} to create a new object and
+     * run its constructor.
+     * <p>
+     * The method invocation will occur in the specified thread.
+     * Method invocation can occur only if the specified thread
+     * has been suspended by an event which occurred in that thread.
+     * Method invocation is not supported
+     * when the target VM has been suspended through
+     * {@link VirtualMachine#suspend} or when the specified thread
+     * is suspended through {@link ThreadReference#suspend}.
+     * <p>
+     * The specified method is invoked with the arguments in the specified
+     * argument list.  The method invocation is synchronous; this method
+     * does not return until the invoked method returns in the target VM.
+     * If the invoked method throws an exception, this method
+     * will throw an {@link InvocationException} which contains
+     * a mirror to the exception object thrown.
+     * <p>
+     * Object arguments must be assignment compatible with the argument type
+     * (This implies that the argument type must be loaded through the
+     * enclosing class's class loader). Primitive arguments must be
+     * either assignment compatible with the argument type or must be
+     * convertible to the argument type without loss of information.
+     * If the method being called accepts a variable number of arguments,
+     * then the last argument type is an array of some component type.
+     * The argument in the matching position can be omitted, or can be null,
+     * an array of the same component type, or an argument of the
+     * component type followed by any number of other arguments of the same
+     * type. If the argument is omitted, then a 0 length array of the
+     * component type is passed.  The component type can be a primitive type.
+     * Autoboxing is not supported.
+     *
+     * See section 5.2 of
+     * <cite>The Java&trade; Language Specification</cite>
+     * for more information on assignment compatibility.
+     * <p>
+     * By default, the method is invoked using dynamic lookup as
+     * documented in section 15.12.4.4 of
+     * <cite>The Java&trade; Language Specification</cite>
+     * in particular, overriding based on the runtime type of the object
+     * mirrored by this {@link ObjectReference} will occur. This
+     * behavior can be changed by specifying the
+     * {@link #INVOKE_NONVIRTUAL} bit flag in the <code>options</code>
+     * argument. If this flag is set, the specified method is invoked
+     * whether or not it is overridden for this object's runtime type.
+     * The method, in this case, must have an implementation, either in a class
+     * or an interface. This option is useful for performing method invocations
+     * like those done with the <code>super</code> keyword in the Java programming
+     * language.
+     * <p>
+     * By default, all threads in the target VM are resumed while
+     * the method is being invoked if they were previously
+     * suspended by an event or by {@link VirtualMachine#suspend} or
+     * {@link ThreadReference#suspend}. This is done to prevent the deadlocks
+     * that will occur if any of the threads own monitors
+     * that will be needed by the invoked method.
+     * Note, however, that this implicit resume acts exactly like
+     * {@link ThreadReference#resume}, so if the thread's suspend
+     * count is greater than 1, it will remain in a suspended state
+     * during the invocation and thus a deadlock could still occur.
+     * By default, when the invocation completes,
+     * all threads in the target VM are suspended, regardless their state
+     * before the invocation.
+     * It is possible that
+     * breakpoints or other events might occur during the invocation.
+     * This can cause deadlocks as described above. It can also cause a deadlock
+     * if invokeMethod is called from the client's event handler thread.  In this
+     * case, this thread will be waiting for the invokeMethod to complete and
+     * won't read the EventSet that comes in for the new event.  If this
+     * new EventSet is SUSPEND_ALL, then a deadlock will occur because no
+     * one will resume the EventSet.  To avoid this, all EventRequests should
+     * be disabled before doing the invokeMethod, or the invokeMethod should
+     * not be done from the client's event handler thread.
+     * <p>
+     * The resumption of other threads during the invocation can be prevented
+     * by specifying the {@link #INVOKE_SINGLE_THREADED}
+     * bit flag in the <code>options</code> argument; however,
+     * there is no protection against or recovery from the deadlocks
+     * described above, so this option should be used with great caution.
+     * Only the specified thread will be resumed (as described for all
+     * threads above). Upon completion of a single threaded invoke, the invoking thread
+     * will be suspended once again. Note that any threads started during
+     * the single threaded invocation will not be suspended when the
+     * invocation completes.
+     * <p>
+     * If the target VM is disconnected during the invoke (for example, through
+     * {@link VirtualMachine#dispose}) the method invocation continues.
+     *
+     * @param thread the thread in which to invoke.
+     * @param method the {@link Method} to invoke.
+     * @param arguments the list of {@link Value} arguments bound to the
+     * invoked method. Values from the list are assigned to arguments
+     * in the order they appear in the method signature.
+     * @param options the integer bit flag options.
+     * @return a {@link Value} mirror of the invoked method's return value.
+     * @throws java.lang.IllegalArgumentException if the method is not
+     * a member of this object's class, if the size of the argument list
+     * does not match the number of declared arguments for the method,
+     * if the method is a constructor or static intializer, or
+     * if {@link #INVOKE_NONVIRTUAL} is specified and the method is
+     * either abstract or a non-default interface member.
+     * @throws {@link InvalidTypeException} if any argument in the
+     * argument list is not assignable to the corresponding method argument
+     * type.
+     * @throws ClassNotLoadedException if any argument type has not yet been loaded
+     * through the appropriate class loader.
+     * @throws IncompatibleThreadStateException if the specified thread has not
+     * been suspended by an event.
+     * @throws InvocationException if the method invocation resulted in
+     * an exception in the target VM.
+     * @throws InvalidTypeException If the arguments do not meet this requirement --
+     *         Object arguments must be assignment compatible with the argument
+     *         type.  This implies that the argument type must be
+     *         loaded through the enclosing class's class loader.
+     *         Primitive arguments must be either assignment compatible with the
+     *         argument type or must be convertible to the argument type without loss
+     *         of information. See JLS section 5.2 for more information on assignment
+     *         compatibility.
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     */
+    Value invokeMethod(ThreadReference thread, Method method,
+                       List<? extends Value> arguments, int options)
+                                   throws InvalidTypeException,
+                                          ClassNotLoadedException,
+                                          IncompatibleThreadStateException,
+                                          InvocationException;
+
+    /**
+     * Prevents garbage collection for this object. By default all
+     * {@link ObjectReference} values returned by JDI may be collected
+     * at any time the target VM is running. A call to this method
+     * guarantees that the object will not be collected.
+     * {@link #enableCollection} can be used to allow collection once
+     * again.
+     * <p>
+     * Calls to this method are counted. Every call to this method
+     * requires a corresponding call to {@link #enableCollection} before
+     * garbage collection is re-enabled.
+     * <p>
+     * Note that while the target VM is suspended, no garbage collection
+     * will occur because all threads are suspended. The typical
+     * examination of variables, fields, and arrays during the suspension
+     * is safe without explicitly disabling garbage collection.
+     * <p>
+     * This method should be used sparingly, as it alters the
+     * pattern of garbage collection in the target VM and,
+     * consequently, may result in application behavior under the
+     * debugger that differs from its non-debugged behavior.
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only
+     * -see {@link VirtualMachine#canBeModified()}.
+     */
+    void disableCollection();
+
+    /**
+     * Permits garbage collection for this object. By default all
+     * {@link ObjectReference} values returned by JDI may be collected
+     * at any time the target VM is running. A call to this method
+     * is necessary only if garbage collection was previously disabled
+     * with {@link #disableCollection}.
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only
+     * -see {@link VirtualMachine#canBeModified()}.
+     */
+    void enableCollection();
+
+    /**
+     * Determines if this object has been garbage collected in the target
+     * VM.
+     *
+     * @return <code>true</code> if this {@link ObjectReference} has been collected;
+     * <code>false</code> otherwise.
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only
+     * -see {@link VirtualMachine#canBeModified()}.
+     */
+    boolean isCollected();
+
+    /**
+     * Returns a unique identifier for this ObjectReference.
+     * It is guaranteed to be unique among all
+     * ObjectReferences from the same VM that have not yet been disposed.
+     * The guarantee applies as long
+     * as this ObjectReference has not yet been disposed.
+     *
+     * @return a long unique ID
+     */
+    long uniqueID();
+
+    /**
+     * Returns a List containing a {@link ThreadReference} for
+     * each thread currently waiting for this object's monitor.
+     * See {@link ThreadReference#currentContendedMonitor} for
+     * information about when a thread is considered to be waiting
+     * for a monitor.
+     * <p>
+     * Not all target VMs support this operation. See
+     * VirtualMachine#canGetMonitorInfo to determine if the
+     * operation is supported.
+     *
+     * @return a List of {@link ThreadReference} objects. The list
+     * has zero length if no threads are waiting for the monitor.
+     * @throws java.lang.UnsupportedOperationException if the
+     * target VM does not support this operation.
+     * @throws IncompatibleThreadStateException if any
+     * waiting thread is not suspended
+     * in the target VM
+     */
+    List<ThreadReference> waitingThreads()
+        throws IncompatibleThreadStateException;
+
+    /**
+     * Returns an {@link ThreadReference} for the thread, if any,
+     * which currently owns this object's monitor.
+     * See {@link ThreadReference#ownedMonitors} for a definition
+     * of ownership.
+     * <p>
+     * Not all target VMs support this operation. See
+     * VirtualMachine#canGetMonitorInfo to determine if the
+     * operation is supported.
+     *
+     * @return the {@link ThreadReference} which currently owns the
+     * monitor, or null if it is unowned.
+     *
+     * @throws java.lang.UnsupportedOperationException if the
+     * target VM does not support this operation.
+     * @throws IncompatibleThreadStateException if the owning thread is
+     * not suspended in the target VM
+     */
+    ThreadReference owningThread() throws IncompatibleThreadStateException;
+
+    /**
+     * Returns the number times this object's monitor has been
+     * entered by the current owning thread.
+     * See {@link ThreadReference#ownedMonitors} for a definition
+     * of ownership.
+     * <p>
+     * Not all target VMs support this operation. See
+     * VirtualMachine#canGetMonitorInfo to determine if the
+     * operation is supported.
+     *
+     * @see #owningThread
+     * @return the integer count of the number of entries.
+     *
+     * @throws java.lang.UnsupportedOperationException if the
+     * target VM does not support this operation.
+     * @throws IncompatibleThreadStateException if the owning thread is
+     * not suspended in the target VM
+     */
+    int entryCount() throws IncompatibleThreadStateException;
+
+    /**
+     * Returns objects that directly reference this object.
+     * Only objects that are reachable for the purposes of garbage collection
+     * are returned.  Note that an object can also be referenced in other ways,
+     * such as from a local variable in a stack frame, or from a JNI global
+     * reference.  Such non-object referrers are not returned by this method.
+     * <p>
+     * Not all target virtual machines support this operation.
+     * Use {@link VirtualMachine#canGetInstanceInfo()}
+     * to determine if the operation is supported.
+     *
+     * @see VirtualMachine#instanceCounts(List)
+     * @see ReferenceType#instances(long)
+
+     * @param maxReferrers  The maximum number of referring objects to return.
+     *                      Must be non-negative.  If zero, all referring
+     *                      objects are returned.
+     * @return a of List of {@link ObjectReference} objects. If there are
+     *  no objects that reference this object, a zero-length list is returned..
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation - see
+     * {@link VirtualMachine#canGetInstanceInfo() canGetInstanceInfo()}
+     * @throws java.lang.IllegalArgumentException if maxReferrers is less
+     *         than zero.
+     * @since 1.6
+     */
+    List<ObjectReference> referringObjects(long maxReferrers);
+
+
+    /**
+     * Compares the specified Object with this ObjectReference for equality.
+     *
+     * @return  true if the Object is an ObjectReference, if the
+     * ObjectReferences belong to the same VM, and if applying the
+     * "==" operator on the mirrored objects in that VM evaluates to true.
+     */
+    boolean equals(Object obj);
+
+    /**
+     * Returns the hash code value for this ObjectReference.
+     *
+     * @return the integer hash code
+     */
+    int hashCode();
+}
diff --git a/src/share/classes/com/sun/jdi/PathSearchingVirtualMachine.java b/src/share/classes/com/sun/jdi/PathSearchingVirtualMachine.java
new file mode 100644
index 0000000..7a75fd6
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/PathSearchingVirtualMachine.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+import java.util.List;
+
+/**
+ * A virtual machine which searches for classes through paths
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+public interface PathSearchingVirtualMachine extends VirtualMachine {
+    /**
+     * Get the class path for this virtual machine.
+     *
+     * @return {@link List} of components of the classpath,
+     * each represented by a {@link String}.
+     */
+    List<String> classPath();
+
+    /**
+     * Get the boot class path for this virtual machine.
+     *
+     * @return {@link List} of components of the boot class path,
+     * each represented by a {@link String}.
+     */
+    List<String> bootClassPath();
+
+    /**
+     * Get the base directory used for path searching. Relative directories
+     * in the class path and boot class path can be resolved through
+     * this directory name.
+     *
+     * @return the base directory.
+     */
+    String baseDirectory();
+}
diff --git a/src/share/classes/com/sun/jdi/PrimitiveType.java b/src/share/classes/com/sun/jdi/PrimitiveType.java
new file mode 100644
index 0000000..9cc721f
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/PrimitiveType.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * The type associated with non-object values in a target VM.
+ * Instances of one of the sub-interfaces of this interface will be
+ * returned from {@link Value#type} for all {@link PrimitiveValue} objects.
+ *
+ * @see PrimitiveValue
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface PrimitiveType extends Type {
+}
diff --git a/src/share/classes/com/sun/jdi/PrimitiveValue.java b/src/share/classes/com/sun/jdi/PrimitiveValue.java
new file mode 100644
index 0000000..9601488
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/PrimitiveValue.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * The value assigned to a field or variable of primitive type in a
+ * target VM. Each primitive values is accessed through a subinterface
+ * of this interface.
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface PrimitiveValue extends Value {
+
+    /**
+     * Converts this value to a BooleanValue and returns the result
+     * as a boolean.
+     *
+     * @return <code>true</code> if this value is non-zero (or
+     * <code>true</code> if already a BooleanValue); false otherwise.
+     */
+    boolean booleanValue();
+
+    /**
+     * Converts this value to a ByteValue and returns the result
+     * as a byte. The value will be narrowed as
+     * necessary, and magnitude or precision information
+     * may be lost (as if the primitive had been cast to a byte).
+     *
+     * @return the value, converted to byte
+     */
+    byte byteValue();
+
+    /**
+     * Converts this value to a CharValue and returns the result
+     * as a char. The value will be narrowed or widened as
+     * necessary, and magnitude or precision information
+     * may be lost (as if the primitive had been cast to a char,
+     * in the narrowing case).
+     *
+     * @return the value, converted to char
+     */
+    char charValue();
+
+    /**
+     * Converts this value to a ShortValue and returns the result
+     * as a short. The value will be narrowed or widened as
+     * necessary, and magnitude or precision information
+     * may be lost (as if the primitive had been cast to a short,
+     * in the narrowing case).
+     *
+     * @return the value, converted to short
+     */
+    short shortValue();
+
+    /**
+     * Converts this value to an IntegerValue and returns the result
+     * as an int. The value will be narrowed or widened as
+     * necessary, and magnitude or precision information
+     * may be lost (as if the primitive had been cast to an int,
+     * in the narrowing case).
+     *
+     * @return the value, converted to int
+     */
+    int intValue();
+
+    /**
+     * Converts this value to a LongValue and returns the result
+     * as a long. The value will be narrowed or widened as
+     * necessary, and magnitude or precision information
+     * may be lost (as if the primitive had been cast to a long,
+     * in the narrowing case).
+     *
+     * @return the value, converted to long
+     */
+    long longValue();
+
+    /**
+     * Converts this value to a FloatValue and returns the result
+     * as a float. The value will be narrowed or widened as
+     * necessary, and magnitude or precision information
+     * may be lost (as if the primitive had been cast to a float,
+     * in the narrowing case).
+     *
+     * @return the value, converted to float
+     */
+    float floatValue();
+
+    /**
+     * Converts this value to a DoubleValue and returns the result
+     * as a double. The value will be widened as
+     * necessary, and precision information
+     * may be lost.
+     *
+     * @return the value, converted to double
+     */
+    double doubleValue();
+}
diff --git a/src/share/classes/com/sun/jdi/ReferenceType.java b/src/share/classes/com/sun/jdi/ReferenceType.java
new file mode 100644
index 0000000..43d1c02
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/ReferenceType.java
@@ -0,0 +1,831 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * The type of an object in a target VM. ReferenceType encompasses
+ * classes, interfaces, and array types as defined in
+ * <cite>The Java&trade; Language Specification</cite>.
+ * All ReferenceType objects belong to one of the following
+ * subinterfaces:
+ * {@link ClassType} for classes,
+ * {@link InterfaceType} for interfaces, and
+ * {@link ArrayType} for arrays.
+ * Note that primitive classes (for example, the
+ * {@link ClassObjectReference#reflectedType() reflected type} of
+ * {@link java.lang.Integer#TYPE Integer.TYPE})
+ * are represented as ClassType.
+ * The VM creates Class objects for all three, so from the VM perspective,
+ * each ReferenceType maps to a distinct Class object.
+ * <p>
+ * ReferenceTypes can
+ * be obtained by querying a particular {@link ObjectReference} for its
+ * type or by getting a list of all reference types from the
+ * {@link VirtualMachine}.
+ * <p>
+ * ReferenceType provides access to static type information such as
+ * methods and fields and provides access to dynamic type
+ * information such as the corresponding Class object and the classloader.
+ * <p>
+ * Any method on <code>ReferenceType</code> which directly or
+ * indirectly takes <code>ReferenceType</code> as an parameter may throw
+ * {@link com.sun.jdi.VMDisconnectedException} if the target VM is
+ * disconnected and the {@link com.sun.jdi.event.VMDisconnectEvent} has been or is
+ * available to be read from the {@link com.sun.jdi.event.EventQueue}.
+ * <p>
+ * Any method on <code>ReferenceType</code> which directly or
+ * indirectly takes <code>ReferenceType</code> as an parameter may throw
+ * {@link com.sun.jdi.VMOutOfMemoryException} if the target VM has run out of memory.
+ * <p>
+ * Any method on <code>ReferenceType</code> or which directly or indirectly takes
+ * <code>ReferenceType</code> as parameter may throw
+ * {@link com.sun.jdi.ObjectCollectedException} if the mirrored type has been unloaded.
+ *
+ * @see ObjectReference
+ * @see ObjectReference#referenceType
+ * @see VirtualMachine
+ * @see VirtualMachine#allClasses
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ReferenceType
+    extends Type, Comparable<ReferenceType>, Accessible
+{
+
+    /**
+     * Gets the fully qualified name of this type. The returned name
+     * is formatted as it might appear in a Java programming langauge
+     * declaration for objects of this type.
+     * <p>
+     * For primitive classes
+     * the returned name is the name of the corresponding primitive
+     * type; for example, "int" is returned as the name of the class
+     * represented by {@link java.lang.Integer#TYPE Integer.TYPE}.
+     * @return a string containing the type name.
+     */
+    String name();
+
+    /**
+     * Gets the generic signature for this type if there is one.
+     * Generic signatures are described in the
+     * <cite>The Java&trade; Virtual Machine Specification</cite>.
+     *
+     * @return a string containing the generic signature, or <code>null</code>
+     * if there is no generic signature.
+     *
+     * @since 1.5
+     */
+    String genericSignature();
+
+    /**
+     * Gets the classloader object which loaded the class corresponding
+     * to this type.
+     *
+     * @return a {@link ClassLoaderReference} which mirrors the classloader,
+     * or <code>null</code> if the class was loaded through the bootstrap class
+     * loader.
+     */
+    ClassLoaderReference classLoader();
+
+    /**
+     * Gets an identifying name for the source corresponding to the
+     * declaration of this type. Interpretation of this string is
+     * the responsibility of the source repository mechanism.
+     * <P>
+     * The returned name is dependent on VM's default stratum
+     * ({@link VirtualMachine#getDefaultStratum()}).
+     * In the reference implementation, when using the base stratum,
+     * the returned string is the
+     * unqualified name of the source file containing the declaration
+     * of this type.  In other strata the returned source name is
+     * the first source name for that stratum.  Since other languages
+     * may have more than one source name for a reference type,
+     * the use of {@link Location#sourceName()} or
+     * {@link #sourceNames(String)} is preferred.
+     * <p>
+     * For arrays ({@link ArrayType}) and primitive classes,
+     * AbsentInformationException is always thrown.
+     *
+     * @return the string source file name
+     * @throws AbsentInformationException if the source name is not
+     * known
+     */
+    String sourceName() throws AbsentInformationException;
+
+    /**
+     * Gets the identifying names for all the source corresponding to the
+     * declaration of this type. Interpretation of these names is
+     * the responsibility of the source repository mechanism.
+     * <P>
+     * The returned names are for the specified stratum
+     * (see {@link Location} for a description of strata).
+     * In the reference implementation, when using the Java
+     * programming language stratum,
+     * the returned List contains one element: a String which is the
+     * unqualified name of the source file containing the declaration
+     * of this type.  In other strata the returned source names are
+     * all the source names defined for that stratum.
+     *
+     * @param stratum The stratum to retrieve information from
+     * or <code>null</code> for the declaring type's
+     * default stratum.
+     *
+     * @return a List of String objects each representing a source name
+     *
+     * @throws AbsentInformationException if the source names are not
+     * known.
+     * <p>
+     * For arrays ({@link ArrayType}) and primitive classes,
+     * AbsentInformationException is always thrown.
+     *
+     * @since 1.4
+     */
+    List<String> sourceNames(String stratum) throws AbsentInformationException;
+
+    /**
+     * Gets the paths to the source corresponding to the
+     * declaration of this type. Interpretation of these paths is
+     * the responsibility of the source repository mechanism.
+     * <P>
+     * The returned paths are for the specified stratum
+     * (see {@link Location} for a description of strata).
+     * In the reference implementation, for strata which
+     * do not explicitly specify source path (the Java
+     * programming language stratum never does), the returned
+     * strings are the {@link #sourceNames(String)} prefixed by
+     * the package name of this ReferenceType
+     * converted to a platform dependent path.
+     * For example, on a Windows platform,
+     * <CODE>java.lang.Thread</CODE>
+     * would return a List containing one element:
+     * <CODE>"java\lang\Thread.java"</CODE>.
+     *
+     * @param stratum The stratum to retrieve information from
+     * or <code>null</code> for the declaring type's
+     * default stratum.
+     *
+     * @return a List of String objects each representing a source path
+     *
+     * @throws AbsentInformationException if the source names are not
+     * known.
+     * <p>
+     * For arrays ({@link ArrayType}) and primitive classes,
+     * AbsentInformationException is always thrown.
+     *
+     * @since 1.4
+     */
+    List<String> sourcePaths(String stratum) throws AbsentInformationException;
+
+    /**
+     * Get the source debug extension of this type.
+     * <p>
+     * Not all target virtual machines support this operation.
+     * Use
+     * {@link VirtualMachine#canGetSourceDebugExtension() canGetSourceDebugExtension()}
+     * to determine if the operation is supported.
+     * @return as a string the source debug extension attribute
+     * @throws AbsentInformationException if the extension is not
+     * specified
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation - see
+     * {@link VirtualMachine#canGetSourceDebugExtension() canGetSourceDebugExtension()},
+     */
+    String sourceDebugExtension() throws AbsentInformationException;
+
+    /**
+     * Determines if this type was declared static. Only nested types,
+     * can be declared static, so <code>false</code> is returned
+     * for any package-level type, array type, or primitive class.
+     *
+     * @return <code>true</code> if this type is static; false otherwise.
+     */
+    boolean isStatic();
+
+    /**
+     * Determines if this type was declared abstract.
+     * <p>
+     * For arrays ({@link ArrayType}) and primitive classes,
+     * the return value is undefined.
+     *
+     * @return <code>true</code> if this type is abstract; false otherwise.
+     */
+    boolean isAbstract();
+
+    /**
+     * Determines if this type was declared final.
+     * <p>
+     * For arrays ({@link ArrayType}) and primitive classes,
+     * the return value is always true.
+     *
+     * @return <code>true</code> if this type is final; false otherwise.
+     */
+    boolean isFinal();
+
+    /**
+     * Determines if this type has been prepared. See the JVM
+     * specification for a definition of class preparation.
+     * <p>
+     * For arrays ({@link ArrayType}) and primitive classes,
+     * the return value is undefined.
+     *
+     * @return <code>true</code> if this type is prepared; false otherwise.
+     */
+    boolean isPrepared();
+
+    /**
+     * Determines if this type has been verified. See the JVM
+     * specification for a definition of class verification.
+     * <p>
+     * For arrays ({@link ArrayType}) and primitive classes,
+     * the return value is undefined.
+     *
+     * @return <code>true</code> if this type is verified; false otherwise.
+     */
+    boolean isVerified();
+
+    /**
+     * Determines if this type has been initialized. See the JVM
+     * specification for a definition of class verification.
+     * For {@link InterfaceType}, this method always returns the
+     * same value as {@link #isPrepared()}.
+     * <p>
+     * For arrays ({@link ArrayType}) and primitive classes,
+     * the return value is undefined.
+     *
+     * @return <code>true</code> if this type is initialized; false otherwise.
+     */
+    boolean isInitialized();
+
+    /**
+     * Determines if initialization failed for this class. See the JVM
+     * specification for details on class initialization.
+     * <p>
+     * For arrays ({@link ArrayType}) and primitive classes,
+     * the return value is undefined.
+     *
+     * @return <code>true</code> if initialization was attempted and
+     * failed; false otherwise.
+     */
+    boolean failedToInitialize();
+
+    /**
+     * Returns a list containing each {@link Field} declared in this type.
+     * Inherited fields are not included. Any synthetic fields created
+     * by the compiler are included in the list.
+     * <p>
+     * For arrays ({@link ArrayType}) and primitive classes, the returned
+     * list is always empty.
+     *
+     * @return a list {@link Field} objects; the list has length 0
+     * if no fields exist.
+     * @throws ClassNotPreparedException if this class not yet been
+     * prepared.
+     */
+    List<Field> fields();
+
+    /**
+     * Returns a list containing each unhidden and unambiguous {@link Field}
+     * in this type.
+     * Each field that can be accessed from the class
+     * or its instances with its simple name is included. Fields that
+     * are ambiguously multiply inherited or fields that are hidden by
+     * fields with the same name in a more recently inherited class
+     * cannot be accessed
+     * by their simple names and are not included in the returned
+     * list. All other inherited fields are included.
+     * See JLS section 8.3 for details.
+     * <p>
+     * For arrays ({@link ArrayType}) and primitive classes, the returned
+     * list is always empty.
+     *
+     * @return a List of {@link Field} objects; the list has length
+     * 0 if no visible fields exist.
+     * @throws ClassNotPreparedException if this class not yet been
+     * prepared.
+     */
+    List<Field> visibleFields();
+
+    /**
+     * Returns a list containing each {@link Field} declared in this type,
+     * and its superclasses, implemented interfaces, and/or superinterfaces.
+     * All declared and inherited
+     * fields are included, regardless of whether they are hidden or
+     * multiply inherited.
+     * <p>
+     * For arrays ({@link ArrayType}) and primitive classes, the returned
+     * list is always empty.
+     *
+     * @return a List of {@link Field} objects; the list has length
+     * 0 if no fields exist.
+     * @throws ClassNotPreparedException if this class not yet been
+     * prepared.
+     */
+    List<Field> allFields();
+
+    /**
+     * Finds the visible {@link Field} with the given
+     * non-ambiguous name. This method follows the
+     * inheritance rules specified in the JLS (8.3.3) to determine
+     * visibility.
+     * <p>
+     * For arrays ({@link ArrayType}) and primitive classes, the returned
+     * value is always null.
+     *
+     * @param fieldName a String containing the name of desired field.
+     * @return a {@link Field} object which mirrors the found field, or
+     * null if there is no field with the given name or if the given
+     * name is ambiguous.
+     * @throws ClassNotPreparedException if this class not yet been
+     * prepared.
+     */
+    Field fieldByName(String fieldName);
+
+    /**
+     * Returns a list containing each {@link Method} declared
+     * directly in this type.
+     * Inherited methods are not included. Constructors,
+     * the initialization method if any, and any synthetic methods created
+     * by the compiler are included in the list.
+     * <p>
+     * For arrays ({@link ArrayType}) and primitive classes, the returned
+     * list is always empty.
+     *
+     * @return a list {@link Method} objects; the list has length 0
+     * if no methods exist.
+     * @throws ClassNotPreparedException if this class not yet been
+     * prepared.
+     */
+    List<Method> methods();
+
+    /**
+     * Returns a list containing each {@link Method}
+     * declared or inherited by this type. Methods from superclasses
+     * or superinterfaces that that have been hidden or overridden
+     * are not included.
+     * <p>
+     * Note that despite this exclusion, multiple inherited methods
+     * with the same signature can be present in the returned list, but
+     * at most one can be a member of a {@link ClassType}.
+     * See JLS section 8.4.6 for details.
+     * <p>
+     * For arrays ({@link ArrayType}) and primitive classes, the returned
+     * list is always empty.
+     *
+     * @return a List of {@link Method} objects; the list has length
+     * 0 if no visible methods exist.
+     * @throws ClassNotPreparedException if this class not yet been
+     * prepared.
+     */
+    List<Method> visibleMethods();
+
+    /**
+     * Returns a list containing each {@link Method} declared in this type,
+     * and its superclasses, implemented interfaces, and/or superinterfaces.
+     * All declared and inherited
+     * methods are included, regardless of whether they are hidden or
+     * overridden.
+     * <p>
+     * For arrays ({@link ArrayType}) and primitive classes, the returned
+     * list is always empty.
+     *
+     * @return a List of {@link Method} objects; the list has length
+     * 0 if no methods exist.
+     * @throws ClassNotPreparedException if this class not yet been
+     * prepared.
+     */
+    List<Method> allMethods();
+
+    /**
+     * Returns a List containing each visible {@link Method} that
+     * has the given name.  This is most commonly used to
+     * find overloaded methods.
+     * <p>
+     * Overridden and hidden methods are not included.
+     * See JLS (8.4.6) for details.
+     * <p>
+     * For arrays ({@link ArrayType}) and primitive classes, the returned
+     * list is always empty.
+     *
+     * @param name the name of the method to find.
+     * @return a List of {@link Method} objects that match the given
+     * name; the list has length 0 if no matching methods are found.
+     * @throws ClassNotPreparedException if this class not yet been
+     * prepared.
+     */
+    List<Method> methodsByName(String name);
+
+    /**
+     * Returns a List containing each visible {@link Method} that
+     * has the given name and signature.
+     * The signature string is the
+     * JNI signature for the target method:
+     * <ul>
+     * <li><code>()V</code>
+     * <li><code>([Ljava/lang/String;)V</code>
+     * <li><code>(IIII)Z</code>
+     * </ul>
+     * This method follows the inheritance rules specified
+     * in the JLS (8.4.6) to determine visibility.
+     * <p>
+     * At most one method in the list is a concrete method and a
+     * component of {@link ClassType}; any other methods in the list
+     * are abstract. Use {@link ClassType#concreteMethodByName} to
+     * retrieve only the matching concrete method.
+     * <p>
+     * For arrays ({@link ArrayType}) and primitive classes, the returned
+     * list is always empty.
+     *
+     * @param name the name of the method to find.
+     * @param signature the signature of the method to find
+     * @return a List of {@link Method} objects that match the given
+     * name and signature; the list has length 0 if no matching methods
+     * are found.
+     * @throws ClassNotPreparedException if this class not yet been
+     * prepared.
+     */
+    List<Method> methodsByName(String name, String signature);
+
+    /**
+     * Returns a List containing {@link ReferenceType} objects that are
+     * declared within this type and are currently loaded into the Virtual
+     * Machine.  Both static nested types and non-static nested
+     * types (that is, inner types) are included. Local inner types
+     * (declared within a code block somewhere in this reference type) are
+     * also included in the returned list.
+     * <p>
+     * For arrays ({@link ArrayType}) and primitive classes, the returned
+     * list is always empty.
+     *
+     * @return a List of nested {@link ReferenceType} objects; the list
+     * has 0 length if there are no nested types.
+     */
+    List<ReferenceType> nestedTypes();
+
+    /**
+     * Gets the {@link Value} of a given static {@link Field} in this type.
+     * The Field must be valid for this type;
+     * that is, it must be declared in this type, a superclass, a
+     * superinterface, or an implemented interface.
+     *
+     * @param field the field containing the requested value
+     * @return the {@link Value} of the instance field.
+     * @throws java.lang.IllegalArgumentException if the field is not valid for
+     * this object's class.
+     */
+    Value getValue(Field field);
+
+    /**
+     * Returns a map containing the {@link Value} of each
+     * static {@link Field} in the given list.
+     * The Fields must be valid for this type;
+     * that is, they must be declared in this type, a superclass, a
+     * superinterface, or an implemented interface.
+     *
+     * @param fields a list of {@link Field} objects containing the
+     * requested values.
+     * @return a Map of the requested {@link Field} objects with
+     * their {@link Value}.
+     * @throws java.lang.IllegalArgumentException if any field is not valid for
+     * this object's class.
+     * @throws VMMismatchException if a {@link Mirror} argument and this mirror
+     * do not belong to the same {@link VirtualMachine}.
+     */
+    Map<Field,Value> getValues(List<? extends Field> fields);
+
+    /**
+     * Returns the class object that corresponds to this type in the
+     * target VM. The VM creates class objects for every kind of
+     * ReferenceType: classes, interfaces, and array types.
+     * @return the {@link ClassObjectReference} for this reference type
+     * in the target VM.
+     */
+    ClassObjectReference classObject();
+
+    /**
+     * Returns a list containing a {@link Location} object
+     * for each executable source line in this reference type.
+     * <P>
+     * This method is equivalent to
+     * <code>allLineLocations(vm.getDefaultStratum(),null)</code> -
+     * see {@link #allLineLocations(String,String)}
+     * for more information.
+     *
+     * @throws AbsentInformationException if there is no line
+     * number information for this class and there are non-native,
+     * non-abstract executable members of this class.
+     *
+     * @throws ClassNotPreparedException if this class not yet
+     * been prepared.
+     */
+    List<Location> allLineLocations() throws AbsentInformationException;
+
+    /**
+     * Returns a list containing a {@link Location} object
+     * for each executable source line in this reference type.
+     * Each location maps a source line to a range of code
+     * indices.
+     * The beginning of the range can be determined through
+     * {@link Location#codeIndex}.  The returned list may contain
+     * multiple locations for a particular line number, if the
+     * compiler and/or VM has mapped that line to two or more
+     * disjoint code index ranges.  Note that it is possible for
+     * the same source line to represent different code index
+     * ranges in <i>different</i> methods.
+     * <P>
+     * For arrays ({@link ArrayType}) and primitive classes, the
+     * returned list is always empty.  For interfaces ({@link
+     * InterfaceType}), the returned list will be non-empty only
+     * if the interface has executable code in its class
+     * initialization.
+     * <P>
+     * Returned list is for the specified <i>stratum</i>
+     * (see {@link Location} for a description of strata).
+     *
+     * @param stratum The stratum to retrieve information from
+     * or <code>null</code> for the {@link #defaultStratum()}.
+     *
+     * @param sourceName Return locations only within this
+     * source file or <code>null</code> to return locations.
+     *
+     * @return a List of all source line {@link Location} objects.
+     *
+     * @throws AbsentInformationException if there is no line
+     * number information for this class and there are non-native,
+     * non-abstract executable members of this class.
+     * Or if <i>sourceName</i> is non-<code>null</code>
+     * and source name information is not present.
+     *
+     * @throws ClassNotPreparedException if this class not yet
+     * been prepared.
+     *
+     * @since 1.4
+     */
+    List<Location> allLineLocations(String stratum, String sourceName)
+                             throws AbsentInformationException;
+
+    /**
+     * Returns a List containing all {@link Location} objects
+     * that map to the given line number.
+     * <P>
+     * This method is equivalent to
+     * <code>locationsOfLine(vm.getDefaultStratum(), null,
+     * lineNumber)</code> -
+     * see {@link
+     * #locationsOfLine(java.lang.String,java.lang.String,int)}
+     * for more information.
+     *
+     * @param lineNumber the line number
+     *
+     * @return a List of all {@link Location} objects that map to
+     * the given line.
+     *
+     * @throws AbsentInformationException if there is no line
+     * number information for this class.
+     *
+     * @throws ClassNotPreparedException if this class not yet
+     * been prepared.
+     *
+     * @see VirtualMachine#getDefaultStratum()
+     */
+    List<Location> locationsOfLine(int lineNumber)
+        throws AbsentInformationException;
+
+    /**
+     * Returns a List containing all {@link Location} objects
+     * that map to the given line number.
+     * <P>
+     * For arrays ({@link ArrayType}) and primitive classes, the
+     * returned list is always empty.
+     * For interfaces ({@link InterfaceType}), the returned list
+     * will be non-empty only if the interface has executable code
+     * in its class initialization at the specified line number.
+     * An empty list will be returned if there is no executable
+     * code at the specified line number.
+     * <p>
+     * Returned list is for the specified <i>stratum</i>
+     * (see {@link Location} for a description of strata).
+     *
+     * @param stratum the stratum to use for comparing line number
+     *                and source name, or <code>null</code> to
+     *                use the {@link #defaultStratum()}.
+     *
+     * @param sourceName the source name containing the line
+     *                   number, or <code>null</code> to match
+     *                   all source names
+     *
+     * @param lineNumber the line number
+     *
+     * @return a List of all {@link Location} objects that map
+     *         to the given line.
+     *
+     * @throws AbsentInformationException if there is no line
+     *         number information for this class.
+     *         Or if <i>sourceName</i> is non-<code>null</code>
+     *         and source name information is not present.
+     *
+     * @throws ClassNotPreparedException if this class not yet
+     *         been prepared.
+     *
+     * @since 1.4
+     */
+    List<Location> locationsOfLine(String stratum,
+                                   String sourceName,
+                                   int lineNumber)
+                     throws AbsentInformationException;
+
+    /**
+     * Return the available strata for this reference type.
+     * <P>
+     * See the {@link Location} for a description of strata.
+     *
+     * @return List of <CODE>java.lang.String</CODE>, each
+     * representing a stratum
+     *
+     * @since 1.4
+     */
+    List<String> availableStrata();
+
+    /**
+     * Returns the default stratum for this reference type.
+     * This value is specified in the class file and cannot
+     * be set by the user.  If the class file does not
+     * specify a default stratum the base stratum
+     * (<code>"Java"</code>) will be returned.
+     * <P>
+     * See the {@link Location} for a description of strata.
+     *
+     * @since 1.4
+     */
+    String defaultStratum();
+
+    /**
+     * Returns instances of this ReferenceType.
+     * Only instances that are reachable for the purposes of garbage collection
+     * are returned.
+     * <p>
+     * Not all target virtual machines support this operation.
+     * Use {@link VirtualMachine#canGetInstanceInfo()}
+     * to determine if the operation is supported.
+     *
+     * @see VirtualMachine#instanceCounts(List)
+     * @see ObjectReference#referringObjects(long)
+     *
+     * @param maxInstances the maximum number of instances to return.
+     *        Must be non-negative.  If zero, all instances are returned.
+     * @return a List of {@link ObjectReference} objects.  If there are
+     * no instances of this ReferenceType, a zero-length list is returned.
+     *
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation - see
+     * {@link VirtualMachine#canGetInstanceInfo() canGetInstanceInfo()}
+     * @throws java.lang.IllegalArgumentException if maxInstances is less
+     *         than zero.
+     * @since 1.6
+     */
+    List<ObjectReference> instances(long maxInstances);
+
+    /**
+     * Compares the specified Object with this ReferenceType for equality.
+     *
+     * @return  true if the Object is a {@link ReferenceType}, if the
+     * ReferenceTypes belong to the same VM, and if they mirror classes
+     * which correspond to the same instance of java.lang.Class in that VM.
+     */
+    boolean equals(Object obj);
+
+    /**
+     * Returns the hash code value for this ObjectReference.
+     *
+     * @return the integer hash code
+     */
+    int hashCode();
+
+    /**
+     * Returns the class major version number, as defined in the class file format
+     * of the Java Virtual Machine Specification.
+     *
+     * For arrays ({@link ArrayType}) and primitive classes,
+     * the returned major version number value is zero.
+     *
+     * Not all target virtual machines support this operation.
+     * Use {@link VirtualMachine#canGetClassFileVersion()}
+     * to determine if the operation is supported.
+     *
+     * @return the major version number of the class.
+     *
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation - see
+     * {@link VirtualMachine#canGetClassFileVersion() canGetClassFileVersion()}
+     *
+     * @since 1.6
+     */
+    int majorVersion();
+
+
+    /**
+     * Returns the class minor version number, as defined in the class file format
+     * of the Java Virtual Machine Specification.
+     *
+     * For arrays ({@link ArrayType}) and primitive classes,
+     * the returned minor version number value is zero.
+     *
+     * Not all target virtual machines support this operation.
+     * Use {@link VirtualMachine#canGetClassFileVersion()}
+     * to determine if the operation is supported.
+     *
+     * @return the minor version number of the class.
+     *
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation - see
+     * {@link VirtualMachine#canGetClassFileVersion() canGetClassFileVersion()}
+     *
+     * @since 1.6
+     */
+    int minorVersion();
+
+    /**
+     * Returns the number of entries in the constant pool plus one.
+     * This corresponds to the constant_pool_count item of the Class File Format
+     * in the Java Virtual Machine Specification.
+     *
+     * For arrays ({@link ArrayType}) and primitive classes,
+     * the returned constant pool count value is zero.
+     *
+     * Not all target virtual machines support this operation.
+     * Use {@link VirtualMachine#canGetConstantPool()}
+     * to determine if the operation is supported.
+     *
+     * @return total number of constant pool entries for a class plus one.
+     *
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation - see
+     * {@link VirtualMachine#canGetConstantPool() canGetConstantPool()}
+     *
+     * @see #constantPool()
+     * @since 1.6
+     */
+    int constantPoolCount();
+
+    /**
+     * Returns the raw bytes of the constant pool in the format of the
+     * constant_pool item of the Class File Format in the Java Virtual
+     * Machine Specification. The format of the constant pool may
+     * differ between versions of the Class File Format, so, the
+     * minor and major class version numbers should be checked for
+     * compatibility.
+     *
+     * For arrays ({@link ArrayType}) and primitive classes,
+     * a zero length byte array is returned.
+     *
+     * Not all target virtual machines support this operation.
+     * Use {@link VirtualMachine#canGetConstantPool()}
+     * to determine if the operation is supported.
+     *
+     * @return the raw bytes of constant pool.
+     *
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation - see
+     * {@link VirtualMachine#canGetConstantPool() canGetConstantPool()}
+     *
+     * @see #constantPoolCount()
+     * @since 1.6
+     */
+     byte[] constantPool();
+
+}
diff --git a/src/share/classes/com/sun/jdi/ShortType.java b/src/share/classes/com/sun/jdi/ShortType.java
new file mode 100644
index 0000000..9e0a2a9
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/ShortType.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * The type of all primitive <code>short</code> values
+ * accessed in the target VM. Calls to {@link Value#type} will return an
+ * implementor of this interface.
+ *
+ * @see LongValue
+ *
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ShortType extends PrimitiveType {
+}
diff --git a/src/share/classes/com/sun/jdi/ShortValue.java b/src/share/classes/com/sun/jdi/ShortValue.java
new file mode 100644
index 0000000..61e54ec
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/ShortValue.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Provides access to a primitive <code>short</code> value in
+ * the target VM.
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ShortValue extends PrimitiveValue, Comparable<ShortValue> {
+
+    /**
+     * Returns this ShortValue as a short.
+     *
+     * @return the <code>short</code> mirrored by this object.
+     */
+    short value();
+
+    /**
+     * Compares the specified Object with this ShortValue for equality.
+     *
+     * @return true if the Object is a ShortValue and if applying "=="
+     * to the two mirrored primitives would evaluate to true; false
+     * otherwise.
+     */
+    boolean equals(Object obj);
+
+    /**
+     * Returns the hash code value for this ShortValue.
+     *
+     * @return the integer hash code
+     */
+    int hashCode();
+}
diff --git a/src/share/classes/com/sun/jdi/StackFrame.java b/src/share/classes/com/sun/jdi/StackFrame.java
new file mode 100644
index 0000000..9d51d8a
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/StackFrame.java
@@ -0,0 +1,240 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * The state of one method invocation on a thread's call stack.
+ * As a thread executes, stack frames are pushed and popped from
+ * its call stack as methods are invoked and then return. A StackFrame
+ * mirrors one such frame from a target VM at some point in its
+ * thread's execution. The call stack is, then, simply a List of
+ * StackFrame objects. The call stack can be obtained any time a thread
+ * is suspended through a call to {@link ThreadReference#frames}
+ * <p>
+ * StackFrames provide access to a method's local variables and their
+ * current values.
+ * <p>
+ * The lifetime of a StackFrame is very limited. It is available only
+ * for suspended threads and becomes invalid once its thread is resumed.
+ * <p>
+ * Any method on <code>StackFrame</code> which
+ * takes <code>StackFrame</code> as an parameter may throw
+ * {@link com.sun.jdi.VMDisconnectedException} if the target VM is
+ * disconnected and the {@link com.sun.jdi.event.VMDisconnectEvent} has been or is
+ * available to be read from the {@link com.sun.jdi.event.EventQueue}.
+ * <p>
+ * Any method on <code>StackFrame</code> which
+ * takes <code>StackFrame</code> as an parameter may throw
+ * {@link com.sun.jdi.VMOutOfMemoryException} if the target VM has run out of memory.
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface StackFrame extends Mirror, Locatable {
+
+    /**
+     * Returns the {@link Location} of the current instruction in the frame.
+     * The method for which this frame was created can also be accessed
+     * through the returned location.
+     * For the top frame in the stack, this location identifies the
+     * next instruction to be executed. For all other frames, this
+     * location identifies the instruction that caused the next frame's
+     * method to be invoked.
+     * If the frame represents a native method invocation, the returned
+     * location indicates the class and method, but the code index will
+     * not be valid (-1).
+     *
+     * @return the {@link Location} of the current instruction.
+     * @throws InvalidStackFrameException if this stack frame has become
+     * invalid. Once the frame's thread is resumed, the stack frame is
+     * no longer valid.
+     */
+    Location location();
+
+    /**
+     * Returns the thread under which this frame's method is running.
+     *
+     * @return a {@link ThreadReference} which mirrors the frame's thread.
+     * @throws InvalidStackFrameException if this stack frame has become
+     * invalid. Once the frame's thread is resumed, the stack frame is
+     * no longer valid.
+     */
+    ThreadReference thread();
+
+    /**
+     * Returns the value of 'this' for the current frame.
+     * The {@link ObjectReference} for 'this' is only available for
+     * non-native instance methods.
+     *
+     * @return an {@link ObjectReference}, or null if the frame represents
+     * a native or static method.
+     * @throws InvalidStackFrameException if this stack frame has become
+     * invalid. Once the frame's thread is resumed, the stack frame is
+     * no longer valid.
+     */
+    ObjectReference thisObject();
+
+    /**
+     * Returns a list containing each {@link LocalVariable}
+     * that can be accessed from this frame's location.
+     * <p>
+     * Visibility is based on the code index of the current instruction of
+     * this StackFrame. Each variable has a range of byte code indices in which
+     * it is accessible.
+     * If this stack frame's method
+     * matches this variable's method and if the code index of this
+     * StackFrame is within the variable's byte code range, the variable is
+     * visible.
+     * <p>
+     * A variable's byte code range is at least as large as the scope of
+     * that variable, but can continue beyond the end of the scope under
+     * certain circumstances:
+     * <ul>
+     * <li>the compiler/VM does not immediately reuse the variable's slot.
+     * <li>the compiler/VM is implemented to report the extended range that
+     * would result from the item above.
+     * </ul>
+     * The advantage of an extended range is that variables from recently
+     * exited scopes may remain available for examination (this is especially
+     * useful for loop indices). If, as a result of the extensions above,
+     * the current frame location is contained within the range
+     * of multiple local variables of the same name, the variable with the
+     * highest-starting range is chosen for the returned list.
+     *
+     * @return the list of {@link LocalVariable} objects currently visible;
+     * the list will be empty if there are no visible variables;
+     * specifically, frames in native methods will always return a
+     * zero-length list.
+     * @throws AbsentInformationException if there is no local variable
+     * information for this method.
+     * @throws InvalidStackFrameException if this stack frame has become
+     * invalid. Once the frame's thread is resumed, the stack frame is
+     * no longer valid.
+     * @throws NativeMethodException if the current method is native.
+     */
+    List<LocalVariable> visibleVariables() throws AbsentInformationException;
+
+    /**
+     * Finds a {@link LocalVariable} that matches the given name and is
+     * visible at the current frame location.
+     * See {@link #visibleVariables} for more information on visibility.
+     *
+     * @param name the variable name to find
+     * @return the matching {@link LocalVariable}, or null if there is no
+     * visible variable with the given name; frames in native methods
+     * will always return null.
+     * @throws AbsentInformationException if there is no local variable
+     * information for this method.
+     * @throws InvalidStackFrameException if this stack frame has become
+     * invalid. Once the frame's thread is resumed, the stack frame is
+     * no longer valid.
+     * @throws NativeMethodException if the current method is native.
+     */
+    LocalVariable visibleVariableByName(String name) throws AbsentInformationException;
+
+    /**
+     * Gets the {@link Value} of a {@link LocalVariable} in this frame.
+     * The variable must be valid for this frame's method and visible
+     * according to the rules described in {@link #visibleVariables}.
+     *
+     * @param variable the {@link LocalVariable} to be accessed
+     * @return the {@link Value} of the instance field.
+     * @throws java.lang.IllegalArgumentException if the variable is
+     * either invalid for this frame's method or not visible.
+     * @throws InvalidStackFrameException if this stack frame has become
+     * invalid. Once the frame's thread is resumed, the stack frame is
+     * no longer valid.
+     */
+    Value getValue(LocalVariable variable);
+
+    /**
+     * Returns the values of multiple local variables in this frame.
+     * Each variable must be valid for this frame's method and visible
+     * according to the rules described in {@link #visibleVariables}.
+     *
+     * @param variables a list of {@link LocalVariable} objects to be accessed
+     * @return a map associating each {@link LocalVariable} with
+     * its {@link Value}
+     * @throws java.lang.IllegalArgumentException if any variable is
+     * either invalid for this frame's method or not visible.
+     * @throws InvalidStackFrameException if this stack frame has become
+     * invalid. Once the frame's thread is resumed, the stack frame is
+     * no longer valid.
+     */
+    Map<LocalVariable,Value> getValues(List<? extends LocalVariable> variables);
+
+    /**
+     * Sets the {@link Value} of a {@link LocalVariable} in this frame.
+     * The variable must be valid for this frame's method and visible
+     * according to the rules described in {@link #visibleVariables}.
+     * <p>
+     * Object values must be assignment compatible with the variable type
+     * (This implies that the variable type must be loaded through the
+     * enclosing class's class loader). Primitive values must be
+     * either assignment compatible with the variable type or must be
+     * convertible to the variable type without loss of information.
+     * See JLS section 5.2 for more information on assignment
+     * compatibility.
+     *
+     * @param variable the field containing the requested value
+     * @param value the new value to assign
+     * @throws java.lang.IllegalArgumentException if the field is not valid for
+     * this object's class.
+     * @throws InvalidTypeException if the value's type does not match
+     * the variable's type.
+     * @throws ClassNotLoadedException if the variable type has not yet been loaded
+     * through the appropriate class loader.
+     * @throws InvalidStackFrameException if this stack frame has become
+     * invalid. Once the frame's thread is resumed, the stack frame is
+     * no longer valid.
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     */
+    void setValue(LocalVariable variable, Value value)
+        throws InvalidTypeException, ClassNotLoadedException;
+
+    /**
+     * Returns the values of all arguments in this frame.  Values are
+     * returned even if no local variable information is present.
+     *
+     * @return a list containing a {@link Value} object for each argument
+     * to this frame, in the order in which the arguments were
+     * declared.  If the method corresponding to this frame has
+     * no arguments, an empty list is returned.
+     *
+     * @throws InvalidStackFrameException if this stack frame has become
+     * invalid. Once the frame's thread is resumed, the stack frame is
+     * no longer valid.
+     * @since 1.6
+     */
+    List<Value> getArgumentValues();
+
+}
diff --git a/src/share/classes/com/sun/jdi/StringReference.java b/src/share/classes/com/sun/jdi/StringReference.java
new file mode 100644
index 0000000..92e7167
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/StringReference.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * A string object from the target VM.
+ * A StringReference is an {@link ObjectReference} with additional
+ * access to string-specific information from the target VM.
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface StringReference extends ObjectReference {
+    /**
+     * Returns the StringReference as a String. The returned string
+     * is the equivalent of the mirrored string, but is an entity in the
+     * client VM and can be manipulated like any other string.
+     *
+     * @return the string value.
+     */
+    String value();
+}
diff --git a/src/share/classes/com/sun/jdi/ThreadGroupReference.java b/src/share/classes/com/sun/jdi/ThreadGroupReference.java
new file mode 100644
index 0000000..110504f
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/ThreadGroupReference.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+import java.util.List;
+
+/**
+ * A thread group object from the target VM.
+ * A ThreadGroupReference is an {@link ObjectReference} with additional
+ * access to threadgroup-specific information from the target VM.
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ThreadGroupReference extends ObjectReference {
+
+    /**
+     * Returns the name of this thread group.
+     *
+     * @return the string containing the thread group name.
+     */
+    String name();
+
+    /**
+     * Returns the parent of this thread group.
+     *
+     * @return a {@link ThreadGroupReference} mirroring the parent of this
+     * thread group in the target VM, or null if this is a top-level
+     * thread group.
+     */
+    ThreadGroupReference parent();
+
+    /**
+     * Suspends all threads in this thread group. Each thread
+     * in this group and in all of its subgroups will be
+     * suspended as described in {@link ThreadReference#suspend}.
+     * This is not guaranteed to be an atomic
+     * operation; if the target VM is not interrupted at the time
+     * this method is
+     * called, it is possible that new threads will be created
+     * between the time that threads are enumerated and all of them
+     * have been suspended.
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     */
+    void suspend();
+
+    /**
+     * Resumes all threads in this thread group. Each thread
+     * in this group and in all of its subgroups will be
+     * resumed as described in {@link ThreadReference#resume}.
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     */
+    void resume();
+
+    /**
+     * Returns a List containing a {@link ThreadReference} for each live thread
+     * in this thread group. Only the live threads in this immediate thread group
+     * (and not its subgroups) are returned.  A thread is alive if it
+     * has been started and has not yet been stopped.
+     *
+     * @return a List of {@link ThreadReference} objects mirroring the
+     * live threads from this thread group in the target VM.
+     */
+    List<ThreadReference> threads();
+
+    /**
+     * Returns a List containing each active {@link ThreadGroupReference} in this
+     * thread group. Only the active thread groups in this immediate thread group
+     * (and not its subgroups) are returned.
+     * See <a href="{@docRoot}/../../../../api/java/lang/ThreadGroup.html">java.lang.ThreadGroup</a>
+     * for information about 'active' ThreadGroups.
+     * @return a List of {@link ThreadGroupReference} objects mirroring the
+     * active thread groups from this thread group in the target VM.
+     */
+    List<ThreadGroupReference> threadGroups();
+}
diff --git a/src/share/classes/com/sun/jdi/ThreadReference.java b/src/share/classes/com/sun/jdi/ThreadReference.java
new file mode 100644
index 0000000..2e09ec8
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/ThreadReference.java
@@ -0,0 +1,473 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+import java.util.List;
+
+/**
+ * A thread object from the target VM.
+ * A ThreadReference is an {@link ObjectReference} with additional
+ * access to thread-specific information from the target VM.
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ThreadReference extends ObjectReference {
+    /** Thread status is unknown */
+    public final int THREAD_STATUS_UNKNOWN  =-1;
+    /** Thread has completed execution */
+    public final int THREAD_STATUS_ZOMBIE = 0;
+    /** Thread is runnable */
+    public final int THREAD_STATUS_RUNNING = 1;
+    /** Thread is sleeping - Thread.sleep() or JVM_Sleep() was called */
+    public final int THREAD_STATUS_SLEEPING = 2;
+    /** Thread is waiting on a java monitor */
+    public final int THREAD_STATUS_MONITOR = 3;
+    /** Thread is waiting - Object.wait() or JVM_MonitorWait() was called */
+    public final int THREAD_STATUS_WAIT = 4;
+    /** Thread has not yet been started */
+    public final int THREAD_STATUS_NOT_STARTED = 5;
+
+    /**
+     * Returns the name of this thread.
+     *
+     * @return the string containing the thread name.
+     */
+    String name();
+
+    /**
+     * Suspends this thread. The thread can be resumed through
+     * {@link #resume} or resumed with other threads through
+     * {@link VirtualMachine#resume}.
+     * <p>
+     * Unlike {@link java.lang.Thread#suspend},
+     * suspends of both the virtual machine and individual threads are
+     * counted. Before a thread will run again, it must be resumed
+     * (through {@link #resume} or {@link ThreadReference#resume})
+     * the same number of times it has been suspended.
+     * <p>
+     * Suspending single threads with this method has the same dangers
+     * as {@link java.lang.Thread#suspend()}. If the suspended thread
+     * holds a monitor needed by another running thread, deadlock is
+     * possible in the target VM (at least until the suspended thread
+     * is resumed again).
+     * <p>
+     * The suspended thread is guaranteed to remain suspended until
+     * resumed through one of the JDI resume methods mentioned above;
+     * the application in the target VM cannot resume the suspended thread
+     * through {@link java.lang.Thread#resume}.
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     */
+    void suspend();
+
+    /**
+     * Resumes this thread. If this thread was not previously suspended
+     * through {@link #suspend} or through {@link VirtualMachine#suspend},
+     * or because of a SUSPEND_ALL or SUSPEND_EVENT_THREAD event, then
+     * invoking this method has no effect. Otherwise, the count of pending
+     * suspends on this thread is decremented. If it is decremented to 0,
+     * the thread will continue to execute.
+     * Note: the normal way to resume from an event related suspension is
+     * via {@link com.sun.jdi.event.EventSet#resume}.
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     */
+    void resume();
+
+    /**
+     * Returns the number of pending suspends for this thread. See
+     * {@link #suspend} for an explanation of counted suspends.
+     * @return pending suspend count as an integer
+     */
+    int suspendCount();
+
+    /**
+     * Stops this thread with an asynchronous exception.
+     * A debugger thread in the target VM will stop this thread
+     * with the given {@link java.lang.Throwable} object.
+     *
+     * @param throwable the asynchronous exception to throw.
+     * @throws InvalidTypeException if <code>throwable</code> is not
+     * an instance of java.lang.Throwable in the target VM.
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     * @see java.lang.Thread#stop(Throwable)
+     */
+    void stop(ObjectReference throwable) throws InvalidTypeException;
+
+    /**
+     * Interrupts this thread unless the thread has been suspended by the
+     * debugger.
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     *
+     * @see java.lang.Thread#interrupt()
+     */
+    void interrupt();
+
+    /**
+     * Returns the thread's status. If the thread is not suspended the
+     * thread's current status is returned. If the thread is suspended, the
+     * thread's status before the suspension is returned (or
+     * {@link #THREAD_STATUS_UNKNOWN} if this information is not available.
+     * {@link #isSuspended} can be used to determine if the thread has been
+     * suspended.
+     *
+     * @return one of
+     * {@link #THREAD_STATUS_UNKNOWN},
+     * {@link #THREAD_STATUS_ZOMBIE},
+     * {@link #THREAD_STATUS_RUNNING},
+     * {@link #THREAD_STATUS_SLEEPING},
+     * {@link #THREAD_STATUS_MONITOR},
+     * {@link #THREAD_STATUS_WAIT},
+     * {@link #THREAD_STATUS_NOT_STARTED},
+     */
+    int status();
+
+    /**
+     * Determines whether the thread has been suspended by the
+     * the debugger.
+     *
+     * @return <code>true</code> if the thread is currently suspended;
+     * <code>false</code> otherwise.
+     */
+    boolean isSuspended();
+
+    /**
+     * Determines whether the thread is suspended at a breakpoint.
+     *
+     * @return <code>true</code> if the thread is currently stopped at
+     * a breakpoint; <code>false</code> otherwise.
+     */
+    boolean isAtBreakpoint();
+
+    /**
+     * Returns this thread's thread group.
+     * @return a {@link ThreadGroupReference} that mirrors this thread's
+     * thread group in the target VM.
+     */
+    ThreadGroupReference threadGroup();
+
+    /**
+     * Returns the number of stack frames in the thread's current
+     * call stack.
+     * The thread must be suspended (normally through an interruption
+     * to the VM) to get this information, and
+     * it is only valid until the thread is resumed again.
+     *
+     * @return an integer frame count
+     * @throws IncompatibleThreadStateException if the thread is
+     * not suspended in the target VM
+     */
+    int frameCount() throws IncompatibleThreadStateException;
+
+    /**
+     * Returns a List containing each {@link StackFrame} in the
+     * thread's current call stack.
+     * The thread must be suspended (normally through an interruption
+     * to the VM) to get this information, and
+     * it is only valid until the thread is resumed again.
+     *
+     * @return a List of {@link StackFrame} with the current frame first
+     * followed by each caller's frame.
+     * @throws IncompatibleThreadStateException if the thread is
+     * not suspended in the target VM
+     */
+    List<StackFrame> frames() throws IncompatibleThreadStateException;
+
+    /**
+     * Returns the {@link StackFrame} at the given index in the
+     * thread's current call stack. Index 0 retrieves the current
+     * frame; higher indices retrieve caller frames.
+     * The thread must be suspended (normally through an interruption
+     * to the VM) to get this information, and
+     * it is only valid until the thread is resumed again.
+     *
+     * @param index the desired frame
+     * @return the requested {@link StackFrame}
+     * @throws IncompatibleThreadStateException if the thread is
+     * not suspended in the target VM
+     * @throws java.lang.IndexOutOfBoundsException if the index is greater than
+     * or equal to {@link #frameCount} or is negative.
+     */
+    StackFrame frame(int index) throws IncompatibleThreadStateException;
+
+    /**
+     * Returns a List containing a range of {@link StackFrame} mirrors
+     * from the thread's current call stack.
+     * The thread must be suspended (normally through an interruption
+     * to the VM) to get this information, and
+     * it is only valid until the thread is resumed again.
+     *
+     * @param start the index of the first frame to retrieve.
+     *       Index 0 represents the current frame.
+     * @param length the number of frames to retrieve
+     * @return a List of {@link StackFrame} with the current frame first
+     * followed by each caller's frame.
+     * @throws IncompatibleThreadStateException if the thread is
+     * not suspended in the target VM
+     * @throws IndexOutOfBoundsException if the specified range is not
+     * within the range of stack frame indicies.
+     * That is, the exception is thrown if any of the following are true:
+     * <pre>    start &lt; 0
+     *    start &gt;= {@link #frameCount}
+     *    length &lt; 0
+     *    (start+length) &gt; {@link #frameCount}</pre>
+     */
+    List<StackFrame> frames(int start, int length)
+        throws IncompatibleThreadStateException;
+
+    /**
+     * Returns a List containing an {@link ObjectReference} for
+     * each monitor owned by the thread.
+     * A monitor is owned by a thread if it has been entered
+     * (via the synchronized statement or entry into a synchronized
+     * method) and has not been relinquished through {@link Object#wait}.
+     * <p>
+     * Not all target virtual machines support this operation.
+     * Use {@link VirtualMachine#canGetOwnedMonitorInfo()}
+     * to determine if the operation is supported.
+     *
+     * @return a List of {@link ObjectReference} objects. The list
+     * has zero length if no monitors are owned by this thread.
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation.
+     * @throws IncompatibleThreadStateException if the thread is
+     * not suspended in the target VM
+     */
+    List<ObjectReference> ownedMonitors()
+        throws IncompatibleThreadStateException;
+
+    /**
+     * Returns a List containing a {@link MonitorInfo} object for
+     * each monitor owned by the thread.
+     * A monitor is owned by a thread if it has been entered
+     * (via the synchronized statement or entry into a synchronized
+     * method) and has not been relinquished through {@link Object#wait}.
+     * <p>
+     * Not all target virtual machines support this operation.
+     * Use {@link VirtualMachine#canGetMonitorFrameInfo()}
+     * to determine if the operation is supported.
+     *
+     * @return a List of {@link MonitorInfo} objects. The list
+     * has zero length if no monitors are owned by this thread.
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation.
+     * @throws IncompatibleThreadStateException if the thread is
+     * not suspended in the target VM
+     *
+     * @since 1.6
+     */
+    List<MonitorInfo> ownedMonitorsAndFrames()
+        throws IncompatibleThreadStateException;
+
+    /**
+     * Returns an {@link ObjectReference} for the monitor, if any,
+     * for which this thread is currently waiting.
+     * The thread can be waiting for a monitor through entry into a
+     * synchronized method, the synchronized statement, or
+     * {@link Object#wait}.  The {@link #status} method can be used
+     * to differentiate between the first two cases and the third.
+     * <p>
+     * Not all target virtual machines support this operation.
+     * Use {@link VirtualMachine#canGetCurrentContendedMonitor()}
+     * to determine if the operation is supported.
+     *
+     * @return the {@link ObjectReference} corresponding to the
+     * contended monitor, or null if it is not waiting for a monitor.
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation.
+     * @throws IncompatibleThreadStateException if the thread is
+     * not suspended in the target VM
+     */
+    ObjectReference currentContendedMonitor() throws IncompatibleThreadStateException;
+
+    /**
+     * Pop stack frames.
+     * <P>
+     * All frames up to and including the <CODE>frame</CODE> are
+     * popped off the stack.
+     * The frame previous to the parameter <CODE>frame</CODE>
+     * will become the current frame.
+     * <P>
+     * After this operation, this thread will be
+     * suspended at the invoke instruction of the target method
+     * that created <CODE>frame</CODE>.
+     * The <CODE>frame</CODE>'s method can be reentered with a step into
+     * the instruction.
+     * <P>
+     * The operand stack is restored, however, any changes
+     * to the arguments that occurred in the called method, remain.
+     * For example, if the method <CODE>foo</CODE>:
+     * <PRE>
+     *    void foo(int x) {
+     *        System.out.println("Foo: " + x);
+     *        x = 4;
+     *        System.out.println("pop here");
+     *    }
+     * </PRE>
+     * was called with <CODE>foo(7)</CODE> and <CODE>foo</CODE>
+     * is popped at the second <CODE>println</CODE> and resumed,
+     * it will print: <CODE>Foo: 4</CODE>.
+     * <P>
+     * Locks acquired by a popped frame are released when it
+     * is popped. This applies to synchronized methods that
+     * are popped, and to any synchronized blocks within them.
+     * <P>
+     * Finally blocks are not executed.
+     * <P>
+     * No aspect of state, other than this thread's execution point and
+     * locks, is affected by this call.  Specifically, the values of
+     * fields are unchanged, as are external resources such as
+     * I/O streams.  Additionally, the target program might be
+     * placed in a state that is impossible with normal program flow;
+     * for example, order of lock acquisition might be perturbed.
+     * Thus the target program may
+     * proceed differently than the user would expect.
+     * <P>
+     * The specified thread must be suspended.
+     * <P>
+     * All <code>StackFrame</code> objects for this thread are
+     * invalidated.
+     * <P>
+     * No events are generated by this method.
+     * <P>
+     * None of the frames through and including the frame for the caller
+     * of <i>frame</i> may be native.
+     * <P>
+     * Not all target virtual machines support this operation.
+     * Use {@link VirtualMachine#canPopFrames() VirtualMachine.canPopFrames()}
+     * to determine if the operation is supported.
+     *
+     * @param frame Stack frame to pop.  <CODE>frame</CODE> is on this
+     * thread's call stack.
+     *
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation - see
+     * {@link VirtualMachine#canPopFrames() VirtualMachine.canPopFrames()}.
+     *
+     * @throws IncompatibleThreadStateException if this
+     * thread is not suspended.
+     *
+     * @throws java.lang.IllegalArgumentException if <CODE>frame</CODE>
+     * is not on this thread's call stack.
+     *
+     * @throws NativeMethodException if one of the frames that would be
+     * popped is that of a native method or if the frame previous to
+     * <i>frame</i> is native.
+     *
+     * @throws InvalidStackFrameException if <CODE>frame</CODE> has become
+     * invalid. Once this thread is resumed, the stack frame is
+     * no longer valid.  This exception is also thrown if there are no
+     * more frames.
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     *
+     * @since 1.4 */
+    void popFrames(StackFrame frame) throws IncompatibleThreadStateException;
+
+
+    /**
+     * Force a method to return before it reaches a return
+     * statement.
+     * <p>
+     * The method which will return early is referred to as the
+     * called method. The called method is the current method (as
+     * defined by the Frames section in the Java Virtual Machine
+     * Specification) for the specified thread at the time this
+     * method is called.
+     * <p>
+     * The thread must be suspended.
+     * The return occurs when execution of Java programming
+     * language code is resumed on this thread. Between the call to
+     * this method and resumption of thread execution, the
+     * state of the stack is undefined.
+     * <p>
+     * No further instructions are executed in the called
+     * method. Specifically, finally blocks are not executed. Note:
+     * this can cause inconsistent states in the application.
+     * <p>
+     * A lock acquired by calling the called method (if it is a
+     * synchronized method) and locks acquired by entering
+     * synchronized blocks within the called method are
+     * released. Note: this does not apply to native locks or
+     * java.util.concurrent.locks locks.
+     * <p>
+     * Events, such as MethodExit, are generated as they would be in
+     * a normal return.
+     * <p>
+     * The called method must be a non-native Java programming
+     * language method. Forcing return on a thread with only one
+     * frame on the stack causes the thread to exit when resumed.
+     * <p>
+     * The <code>value</code> argument is the value that the
+     * method is to return.
+     * If the return type of the method is void, then value must
+     * be a  {@link VoidValue VoidValue}.
+     * Object values must be assignment compatible with the method return type
+     * (This implies that the method return type must be loaded through the
+     * enclosing class's class loader). Primitive values must be
+     * either assignment compatible with the method return type or must be
+     * convertible to the variable type without loss of information.
+     * See JLS section 5.2 for more information on assignment
+     * compatibility.
+     * <p>
+     * Not all target virtual machines support this operation.
+     * Use {@link VirtualMachine#canForceEarlyReturn()}
+     * to determine if the operation is supported.
+     *
+     * @param value the value the method is to return.
+     *
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation - see
+     * {@link VirtualMachine#canGetInstanceInfo() canForceEarlyReturn()}
+     *
+     * @throws IncompatibleThreadStateException if this
+     * thread is not suspended.
+     *
+     * @throws NativeMethodException if the frame to be returned from
+     * is that of a native method.
+     *
+     * @throws InvalidStackFrameException if there are no frames.
+     *
+     * @throws InvalidTypeException if the value's type does not match
+     * the method's return type.
+     *
+     * @throws ClassNotLoadedException if the method's return type has not yet
+     * been loaded through the appropriate class loader.
+     *
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     *
+     * @since 1.6
+     */
+    void forceEarlyReturn(Value value) throws InvalidTypeException,
+                                              ClassNotLoadedException,
+                                              IncompatibleThreadStateException;
+
+}
diff --git a/src/share/classes/com/sun/jdi/Type.java b/src/share/classes/com/sun/jdi/Type.java
new file mode 100644
index 0000000..852d714
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/Type.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * The mirror for a type in the target VM.
+ * This interface is the root of a type hierarchy encompassing primitive
+ * types and reference types.
+ * <P>
+ * A Type may be used to represent a run-time type:
+ * <BLOCKQUOTE>
+ *   {@link Value}.type()
+ * </BLOCKQUOTE>
+ * or a compile-time type:
+ * <BLOCKQUOTE>
+ *  {@link Field#type()} <BR>
+ *  {@link Method#returnType()} <BR>
+ *  {@link Method#argumentTypes()} <BR>
+ *  {@link LocalVariable#type()} <BR>
+ *  {@link ArrayType#componentType()}
+ * </BLOCKQUOTE>
+ * <P>
+ * The following table illustrates which subinterfaces of Type
+ * are used to mirror types in the target VM --
+ * <TABLE BORDER=1 SUMMARY="Maps each type declared in target to a mirrored
+ *  instance of a subinterface of PrimitiveType or ReferenceType">
+ * <TR BGCOLOR="#EEEEFF">
+ *   <TH id="primtype" colspan=3>Subinterfaces of {@link PrimitiveType}</TH>
+ * <TR BGCOLOR="#EEEEFF">
+ *   <TH id="declared" align="left" colspan=2>Type declared in target as</TH>
+ *   <TH id="mirrored" align="left">Is mirrored as an instance of</TH>
+ * <TR>
+ *   <TD headers="primtype declared" colspan=2><CODE>boolean</CODE></TD>
+ *   <TD headers="primtype mirrored"> {@link BooleanType}</TD>
+ * <TR>
+ *   <TD headers="primtype declared" colspan=2><CODE>byte</CODE></TD>
+ *   <TD headers="primtype mirrored">{@link ByteType}</TD>
+ * <TR>
+ *   <TD headers="primtype declared" colspan=2><CODE>char</CODE></TD>
+ *   <TD headers="primtype mirrored">{@link CharType}</TD>
+ * <TR>
+ *   <TD headers="primtype declared" colspan=2><CODE>double</CODE></TD>
+ *   <TD headers="primtype mirrored">{@link DoubleType}</TD>
+ * <TR>
+ *   <TD headers="primtype declared" colspan=2><CODE>float</CODE></TD>
+ *   <TD headers="primtype mirrored">{@link FloatType}</TD>
+ * <TR>
+ *   <TD headers="primtype declared" colspan=2><CODE>int</CODE></TD>
+ *   <TD headers="primtype mirrored">{@link IntegerType}</TD>
+ * <TR>
+ *   <TD headers="primtype declared" colspan=2><CODE>long</CODE></TD>
+ *   <TD headers="primtype mirrored">{@link LongType}</TD>
+ * <TR>
+ *   <TD headers="primtype declared" colspan=2><CODE>short</CODE></TD>
+ *   <TD headers="primtype mirrored">{@link ShortType}</TD>
+ * <TR>
+ *   <TD headers="primtype declared" colspan=2><CODE>void</CODE></TD>
+ *   <TD headers="primtype mirrored">{@link VoidType}</TD>
+ * <TR BGCOLOR="#EEEEFF">
+ *   <TH id="reftype"  colspan=3>Subinterfaces of {@link ReferenceType}</TH>
+ * <TR BGCOLOR="#EEEEFF">
+ *   <TH id="declared2" align="left">Type declared in target as</TH>
+ *   <TH id="example2"  align="left">For example</TH>
+ *   <TH id="mirrored2" align="left">Is mirrored as an instance of</TH>
+ * <TR>
+ *   <TD headers="reftype declared2"><I>a class</I></TD>
+ *   <TD headers="reftype example2"><CODE>Date</CODE></TD>
+ *   <TD headers="reftype mirrored2">{@link ClassType}</TD>
+ * <TR>
+ *   <TD headers="reftype declared2"><I>an interface</I></TD>
+ *   <TD headers="reftype example2"><CODE>Runnable</CODE></TD>
+ *   <TD headers="reftype mirrored2">{@link InterfaceType}</TD>
+ * <TR>
+ *   <TD headers="reftype declared2"><I>an array</I></TD>
+ *   <TD headers="reftype example2">&nbsp;</TD>
+ *   <TD headers="reftype mirrored2">{@link ArrayType}</TD>
+ * <TR>
+ *   <TD headers="reftype declared2"><I>an array</I></TD>
+ *   <TD headers="reftype example2"><CODE>int[]</CODE></TD>
+ *   <TD headers="reftype mirrored2">{@link ArrayType} whose
+ *         {@link ArrayType#componentType() componentType()} is
+ *         {@link IntegerType}</TD>
+ * <TR>
+ *   <TD headers="reftype declared2"><I>an array</I></TD>
+ *   <TD headers="reftype example2"><CODE>Date[]</CODE></TD>
+ *   <TD headers="reftype mirrored2">{@link ArrayType} whose
+ *         {@link ArrayType#componentType() componentType()} is
+ *         {@link ClassType}</TD>
+ * <TR>
+ *   <TD headers="reftype declared2"><I>an array</I></TD>
+ *   <TD headers="reftype example2"><CODE>Runnable[]</CODE></TD>
+ *   <TD headers="reftype mirrored2">{@link ArrayType} whose
+ *         {@link ArrayType#componentType() componentType()} is
+ *         {@link InterfaceType}</TD>
+ * </TABLE>
+ *
+ * @see PrimitiveType Subinterface PrimitiveType
+ * @see ReferenceType Subinterface ReferenceType
+ * @see Value Value - for relationship between Type and Value
+ * @see Field#type() Field.type() - for usage examples
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface Type extends Mirror {
+
+    /**
+     * Returns the JNI-style signature for this type.
+     * <p>
+     * For primitive classes
+     * the returned signature is the signature of the corresponding primitive
+     * type; for example, "I" is returned as the signature of the class
+     * represented by {@link java.lang.Integer#TYPE}.
+     *
+     * @see <a href="doc-files/signature.html">Type Signatures</a>
+     * @return the string containing the type signature.
+     */
+    String signature();
+
+    /**
+     * @return a text representation of this type.
+     */
+    String name();
+}
diff --git a/src/share/classes/com/sun/jdi/TypeComponent.java b/src/share/classes/com/sun/jdi/TypeComponent.java
new file mode 100644
index 0000000..fa36d7b
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/TypeComponent.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * An entity declared within a user defined
+ * type (class or interface).
+ * This interface is the root of the type
+ * component hierarchy which
+ * includes {@link Field} and {@link Method}.
+ * Type components of the same name declared in different classes
+ * (including those related by inheritance) have different
+ * TypeComponent objects.
+ * TypeComponents can be used alone to retrieve static information
+ * about their declaration, or can be used in conjunction with a
+ * {@link ReferenceType} or {@link ObjectReference} to access values
+ * or invoke, as applicable.
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface TypeComponent extends Mirror, Accessible {
+
+    /**
+     * Gets the name of this type component.
+     * <P>
+     * Note: for fields, this is the field name; for methods,
+     * this is the method name; for constructors, this is &lt;init&gt;;
+     * for static initializers, this is &lt;clinit&gt;.
+     *
+     * @return a string containing the name.
+     */
+    String name();
+
+    /**
+     * Gets the JNI-style signature for this type component. The
+     * signature is encoded type information as defined
+     * in the JNI documentation. It is a convenient, compact format for
+     * for manipulating type information internally, not necessarily
+     * for display to an end user. See {@link Field#typeName} and
+     * {@link Method#returnTypeName} for ways to help get a more readable
+     * representation of the type.
+     *
+     * @see <a href="doc-files/signature.html">Type Signatures</a>
+     * @return a string containing the signature
+     */
+    String signature();
+
+    /**
+     * Gets the generic signature for this TypeComponent if there is one.
+     * Generic signatures are described in the
+     * <cite>The Java&trade; Virtual Machine Specification</cite>.
+     *
+     * @return a string containing the generic signature, or <code>null</code>
+     * if there is no generic signature.
+     *
+     * @since 1.5
+     */
+    String genericSignature();
+
+    /**
+     * Returns the type in which this component was declared. The
+     * returned {@link ReferenceType} mirrors either a class or an
+     * interface in the target VM.
+     *
+     * @return a {@link ReferenceType} for the type that declared
+     * this type component.
+     */
+    ReferenceType declaringType();
+
+    /**
+     * Determines if this TypeComponent is static.
+     * Return value is undefined for constructors and static initializers.
+     *
+     * @return <code>true</code> if this type component was declared
+     * static; false otherwise.
+     */
+    boolean isStatic();
+
+    /**
+     * Determines if this TypeComponent is final.
+     * Return value is undefined for constructors and static initializers.
+     *
+     * @return <code>true</code> if this type component was declared
+     * final; false otherwise.
+     */
+    boolean isFinal();
+
+    /**
+     * Determines if this TypeComponent is synthetic. Synthetic members
+     * are generated by the compiler and are not present in the source
+     * code for the containing class.
+     * <p>
+     * Not all target VMs support this query. See
+     * {@link VirtualMachine#canGetSyntheticAttribute} to determine if the
+     * operation is supported.
+     *
+     * @return <code>true</code> if this type component is synthetic;
+     * <code>false</code> otherwise.
+     * @throws java.lang.UnsupportedOperationException if the target
+     * VM cannot provide information on synthetic attributes.
+     */
+    boolean isSynthetic();
+}
diff --git a/src/share/classes/com/sun/jdi/VMCannotBeModifiedException.java b/src/share/classes/com/sun/jdi/VMCannotBeModifiedException.java
new file mode 100644
index 0000000..49f1c88
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/VMCannotBeModifiedException.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Thrown to indicate that the operation is invalid because it would
+ * modify the VM and the VM is read-only.  See {@link VirtualMachine#canBeModified()}.
+ *
+ * @author Jim Holmlund
+ * @since  1.5
+ */
+@jdk.Exported
+public class VMCannotBeModifiedException extends UnsupportedOperationException {
+    private static final long serialVersionUID = -4063879815130164009L;
+    public VMCannotBeModifiedException() {
+        super();
+    }
+
+    public VMCannotBeModifiedException(String s) {
+        super(s);
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/VMDisconnectedException.java b/src/share/classes/com/sun/jdi/VMDisconnectedException.java
new file mode 100644
index 0000000..faeab60
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/VMDisconnectedException.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Unchecked exception thrown to indicate that the
+ * requested operation cannot be
+ * completed because there is no longer a connection to the target VM.
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public class VMDisconnectedException extends RuntimeException {
+
+    private static final long serialVersionUID = 2892975269768351637L;
+    public VMDisconnectedException() {
+        super();
+    }
+    public VMDisconnectedException(String message) {
+        super(message);
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/VMMismatchException.java b/src/share/classes/com/sun/jdi/VMMismatchException.java
new file mode 100644
index 0000000..b05a9aa
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/VMMismatchException.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Thrown to indicate that the requested operation cannot be
+ * completed because the a mirror from one target VM is being
+ * combined with a mirror from another target VM.
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+public class VMMismatchException extends RuntimeException {
+    private static final long serialVersionUID = 289169358790459564L;
+    public VMMismatchException() {
+        super();
+    }
+
+    public VMMismatchException(String s) {
+        super(s);
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/VMOutOfMemoryException.java b/src/share/classes/com/sun/jdi/VMOutOfMemoryException.java
new file mode 100644
index 0000000..cc64d92
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/VMOutOfMemoryException.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Thrown to indicate that the requested operation cannot be
+ * completed because the target VM has run out of memory.
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+public class VMOutOfMemoryException extends RuntimeException {
+    private static final long serialVersionUID = 71504228548910686L;
+    public VMOutOfMemoryException() {
+        super();
+    }
+
+    public VMOutOfMemoryException(String s) {
+        super(s);
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/Value.java b/src/share/classes/com/sun/jdi/Value.java
new file mode 100644
index 0000000..4957b02
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/Value.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * The mirror for a value in the target VM.
+ * This interface is the root of a
+ * value hierarchy encompassing primitive values and object values.
+ * <P>
+ * Some examples of where values may be accessed:
+ * <BLOCKQUOTE><TABLE SUMMARY="layout">
+ * <TR>
+ *   <TD>{@link ObjectReference#getValue(com.sun.jdi.Field)
+ *                 ObjectReference.getValue(Field)}
+ *   <TD>- value of a field
+ * <TR>
+ *   <TD>{@link StackFrame#getValue(com.sun.jdi.LocalVariable)
+ *                 StackFrame.getValue(LocalVariable)}
+ *   <TD>- value of a variable
+ * <TR>
+ *   <TD>{@link VirtualMachine#mirrorOf(double)
+ *                 VirtualMachine.mirrorOf(double)}
+ *   <TD>- created in the target VM by the JDI client
+ * <TR>
+ *   <TD>{@link com.sun.jdi.event.ModificationWatchpointEvent#valueToBe()
+ *                 ModificationWatchpointEvent.valueToBe()}
+ *   <TD>- returned with an event
+ * </TABLE></BLOCKQUOTE>
+ * <P>
+ * The following table illustrates which subinterfaces of Value
+ * are used to mirror values in the target VM --
+ * <TABLE BORDER=1 SUMMARY="Maps each kind of value to a mirrored
+ *  instance of a subinterface of Value">
+ * <TR BGCOLOR="#EEEEFF">
+ *   <TH id="primval" colspan=4>Subinterfaces of {@link PrimitiveValue}</TH>
+ * <TR BGCOLOR="#EEEEFF">
+ *   <TH id="kind"     align="left">Kind of value</TH>
+ *   <TH id="example"  align="left">For example -<br>expression in target</TH>
+ *   <TH id="mirrored" align="left">Is mirrored as an<br>instance of</TH>
+ *   <TH id="type"     align="left">{@link Type} of value<br>{@link #type() Value.type()}</TH>
+ * <TR>
+ *   <TD headers="primval kind">     a boolean</TD>
+ *   <TD headers="primval example">  <CODE>true</CODE></TD>
+ *   <TD headers="primval mirrored"> {@link BooleanValue}</TD>
+ *   <TD headers="primval type">     {@link BooleanType}</TD>
+ * <TR>
+ *   <TD headers="primval kind">     a byte</TD>
+ *   <TD headers="primval example">  <CODE>(byte)4</CODE></TD>
+ *   <TD headers="primval mirrored"> {@link ByteValue}</TD>
+ *   <TD headers="primval type">     {@link ByteType}</TD>
+ * <TR>
+ *   <TD headers="primval kind">     a char</TD>
+ *   <TD headers="primval example">  <CODE>'a'</CODE></TD>
+ *   <TD headers="primval mirrored"> {@link CharValue}</TD>
+ *   <TD headers="primval type">     {@link CharType}</TD>
+ * <TR>
+ *   <TD headers="primval kind">     a double</TD>
+ *   <TD headers="primval example">  <CODE>3.1415926</CODE></TD>
+ *   <TD headers="primval mirrored"> {@link DoubleValue}</TD>
+ *   <TD headers="primval type">     {@link DoubleType}</TD>
+ * <TR>
+ *   <TD headers="primval kind">     a float</TD>
+ *   <TD headers="primval example">  <CODE>2.5f</CODE></TD>
+ *   <TD headers="primval mirrored"> {@link FloatValue}</TD>
+ *   <TD headers="primval type">     {@link FloatType}</TD>
+ * <TR>
+ *   <TD headers="primval kind">     an int</TD>
+ *   <TD headers="primval example">  <CODE>22</CODE></TD>
+ *   <TD headers="primval mirrored"> {@link IntegerValue}</TD>
+ *   <TD headers="primval type">     {@link IntegerType}</TD>
+ * <TR>
+ *   <TD headers="primval kind">     a long</TD>
+ *   <TD headers="primval example">  <CODE>1024L</CODE></TD>
+ *   <TD headers="primval mirrored"> {@link LongValue}</TD>
+ *   <TD headers="primval type">     {@link LongType}</TD>
+ * <TR>
+ *   <TD headers="primval kind">     a short</TD>
+ *   <TD headers="primval example">  <CODE>(short)12</CODE></TD>
+ *   <TD headers="primval mirrored"> {@link ShortValue}</TD>
+ *   <TD headers="primval type">     {@link ShortType}</TD>
+ * <TR>
+ *   <TD headers="primval kind">     a void</TD>
+ *   <TD headers="primval example">  <CODE>&nbsp;</CODE></TD>
+ *   <TD headers="primval mirrored"> {@link VoidValue}</TD>
+ *   <TD headers="primval type">     {@link VoidType}</TD>
+ * <TR BGCOLOR="#EEEEFF">
+ *   <TH id="objref" colspan=4>Subinterfaces of {@link ObjectReference}</TH>
+ * <TR BGCOLOR="#EEEEFF">
+ *   <TH id="kind2"     align="left">Kind of value</TH>
+ *   <TH id="example2"  align="left">For example -<br>expression in target</TH>
+ *   <TH id="mirrored2" align="left">Is mirrored as an<br>instance of</TH>
+ *   <TH id="type2"     align="left">{@link Type} of value<br>{@link #type() Value.type()}</TH>
+ * <TR>
+ *   <TD headers="objref kind2">     a class instance</TD>
+ *   <TD headers="objref example2">  <CODE>this</CODE></TD>
+ *   <TD headers="objref mirrored2"> {@link ObjectReference}</TD>
+ *   <TD headers="objref type2">     {@link ClassType}</TD>
+ * <TR>
+ *   <TD headers="objref kind2">     an array</TD>
+ *   <TD headers="objref example2">  <CODE>new int[5]</CODE></TD>
+ *   <TD headers="objref mirrored2"> {@link ArrayReference}</TD>
+ *   <TD headers="objref type2">     {@link ArrayType}</TD>
+ * <TR>
+ *   <TD headers="objref kind2">     a string</TD>
+ *   <TD headers="objref example2">  <CODE>"hello"</CODE></TD>
+ *   <TD headers="objref mirrored2"> {@link StringReference}</TD>
+ *   <TD headers="objref type2">     {@link ClassType}</TD>
+ * <TR>
+ *   <TD headers="objref kind2">     a thread</TD>
+ *   <TD headers="objref example2">  <CODE>Thread.currentThread()</CODE></TD>
+ *   <TD headers="objref mirrored2"> {@link ThreadReference}</TD>
+ *   <TD headers="objref type2">     {@link ClassType}</TD>
+ * <TR>
+ *   <TD headers="objref kind2">     a thread group</TD>
+ *   <TD headers="objref example2">  <CODE>Thread.currentThread()<br>&nbsp;&nbsp;.getThreadGroup()</CODE></TD>
+ *   <TD headers="objref mirrored2"> {@link ThreadGroupReference}</TD>
+ *   <TD headers="objref type2">     {@link ClassType}</TD>
+ * <TR>
+ *   <TD headers="objref kind2">     a <CODE>java.lang.Class</CODE><br>instance</TD>
+ *   <TD headers="objref example2">  <CODE>this.getClass()</CODE></TD>
+ *   <TD headers="objref mirrored2"> {@link ClassObjectReference}</TD>
+ *   <TD headers="objref type2">     {@link ClassType}</TD>
+ * <TR>
+ *   <TD headers="objref kind2">     a class loader</TD>
+ *   <TD headers="objref example2">  <CODE>this.getClass()<br>&nbsp;&nbsp;.getClassLoader() </CODE></TD>
+ *   <TD headers="objref mirrored2"> {@link ClassLoaderReference}</TD>
+ *   <TD headers="objref type2">     {@link ClassType}</TD>
+ * <TR BGCOLOR="#EEEEFF">
+ *   <TH id="other" colspan=4>Other</TH>
+ * <TR BGCOLOR="#EEEEFF">
+ *   <TH id="kind3"     align="left">Kind of value</TD>
+ *   <TH id="example3"  align="left">For example -<br>expression in target</TD>
+ *   <TH id="mirrored3" align="left">Is mirrored as</TD>
+ *   <TH id="type3"     align="left">{@link Type} of value</TD>
+ * <TR>
+ *   <TD headers="other kind3">     null</TD>
+ *   <TD headers="other example3">  <CODE>null</CODE></TD>
+ *   <TD headers="other mirrored3"> <CODE>null</CODE></TD>
+ *   <TD headers="other type3">     n/a</TD>
+ * </TABLE>
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+
+@jdk.Exported
+public interface Value extends Mirror {
+    /**
+     * Returns the run-time type of this value.
+     *
+     * @see Type
+     * @return a {@link Type} which mirrors the value's type in the
+     * target VM.
+     */
+    Type type();
+}
diff --git a/src/share/classes/com/sun/jdi/VirtualMachine.java b/src/share/classes/com/sun/jdi/VirtualMachine.java
new file mode 100644
index 0000000..0571a27
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/VirtualMachine.java
@@ -0,0 +1,864 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+import com.sun.jdi.event.EventQueue;
+import com.sun.jdi.request.EventRequestManager;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A virtual machine targeted for debugging.
+ * More precisely, a {@link Mirror mirror} representing the
+ * composite state of the target VM.
+ * All other mirrors are associated with an instance of this
+ * interface.  Access to all other mirrors is achieved
+ * directly or indirectly through an instance of this
+ * interface.
+ * Access to global VM properties and control of VM execution
+ * are supported directly by this interface.
+ * <P>
+ * Instances of this interface are created by instances of
+ * {@link com.sun.jdi.connect.Connector}. For example,
+ * an {@link com.sun.jdi.connect.AttachingConnector AttachingConnector}
+ * attaches to a target VM and returns its virtual machine mirror.
+ * A Connector will typically create a VirtualMachine by invoking
+ * the VirtualMachineManager's {@link
+ * com.sun.jdi.VirtualMachineManager#createVirtualMachine(Connection)}
+ * createVirtualMachine(Connection) method.
+ * <p>
+ * Note that a target VM launched by a launching connector is not
+ * guaranteed to be stable until after the {@link com.sun.jdi.event.VMStartEvent} has been
+ * received.
+ * <p>
+ * Any method on <code>VirtualMachine</code> which
+ * takes <code>VirtualMachine</code> as an parameter may throw
+ * {@link com.sun.jdi.VMDisconnectedException} if the target VM is
+ * disconnected and the {@link com.sun.jdi.event.VMDisconnectEvent} has been or is
+ * available to be read from the {@link com.sun.jdi.event.EventQueue}.
+ * <p>
+ * Any method on <code>VirtualMachine</code> which
+ * takes <code>VirtualMachine</code> as an parameter may throw
+ * {@link com.sun.jdi.VMOutOfMemoryException} if the target VM has run out of memory.
+ *
+ * @author Robert Field
+ * @author Gordon Hirsch
+ * @author James McIlree
+ * @since  1.3
+ */
+@jdk.Exported
+public interface VirtualMachine extends Mirror {
+
+    /**
+     * Returns the loaded reference types that
+     * match a given name. The name must be fully qualified
+     * (for example, java.lang.String). The returned list
+     * will contain a {@link ReferenceType} for each class
+     * or interface found with the given name. The search
+     * is confined to loaded classes only; no attempt is made
+     * to load a class of the given name.
+     * <P>
+     * The returned list will include reference types
+     * loaded at least to the point of preparation and
+     * types (like array) for which preparation is
+     * not defined.
+     *
+     * @param className the class/interface name to search for
+     * @return a list of {@link ReferenceType} objects, each
+     * mirroring a type in the target VM with the given name.
+     */
+    List<ReferenceType> classesByName(String className);
+
+    /**
+     * Returns all loaded types. For each loaded type in the target
+     * VM a {@link ReferenceType} will be placed in the returned list.
+     * The list will include ReferenceTypes which mirror classes,
+     * interfaces, and array types.
+     * <P>
+     * The returned list will include reference types
+     * loaded at least to the point of preparation and
+     * types (like array) for which preparation is
+     * not defined.
+     *
+     * @return a list of {@link ReferenceType} objects, each mirroring
+     * a loaded type in the target VM.
+     */
+    List<ReferenceType> allClasses();
+
+    /**
+     * All classes given are redefined according to the
+     * definitions supplied.  A method in a redefined class
+     * is called 'equivalent' (to the old version of the
+     * method) if
+     * <UL>
+     * <LI>their bytecodes are the same except for indicies into
+     *   the constant pool, and
+     * <LI>the referenced constants are equal.
+     * </UL>
+     * Otherwise, the new method is called 'non-equivalent'.
+     * If a redefined method has active stack frames, those active
+     * frames continue to run the bytecodes of the previous version of the
+     * method.  If the new version of such a method is non-equivalent,
+     * then a method from one of these active frames is called 'obsolete' and
+     * {@link Method#isObsolete Method.isObsolete()}
+     * will return true when called on one of these methods.
+     * If resetting such a frame is desired, use
+     * {@link ThreadReference#popFrames ThreadReference.popFrames(StackFrame)}
+     * to pop the old obsolete method execution from the stack.
+     * New invocations of redefined methods will always invoke the new versions.
+     * <p>
+     * This function does not cause any initialization except
+     * that which would occur under the customary JVM semantics.
+     * In other words, redefining a class does not cause
+     * its initializers to be run. The values of preexisting
+     * static variables will remain as they were prior to the
+     * call. However, completely uninitialized (new) static
+     * variables will be assigned their default value.
+     * <p>
+     * If a redefined class has instances then all those
+     * instances will have the fields defined by the redefined
+     * class at the completion of the call. Preexisting fields
+     * will retain their previous values. Any new fields will
+     * have their default values; no instance initializers or
+     * constructors are run.
+     * <p>
+     * Threads need not be suspended.
+     * <p>
+     * No events are generated by this function.
+     * <p>
+     * All breakpoints in the redefined classes are deleted.
+     * <p>
+     * Not all target virtual machines support this operation.
+     * Use {@link #canRedefineClasses() canRedefineClasses()}
+     * to determine if the operation is supported.
+     * Use {@link #canAddMethod() canAddMethod()}
+     * to determine if the redefinition can add methods.
+     * Use {@link #canUnrestrictedlyRedefineClasses() canUnrestrictedlyRedefineClasses()}
+     * to determine if the redefinition can change the schema,
+     * delete methods, change the class hierarchy, etc.
+     *
+     * @param classToBytes A map from {@link ReferenceType}
+     * to array of byte.
+     * The bytes represent the new class definition and
+     * are in Java Virtual Machine class file format.
+     *
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation.
+     * <UL>
+     * <LI>If {@link #canRedefineClasses() canRedefineClasses()}
+     * is false any call of this method will throw this exception.
+     * <LI>If {@link #canAddMethod() canAddMethod()} is false
+     * attempting to add a method will throw this exception.
+     * <LI>If {@link #canUnrestrictedlyRedefineClasses()
+     *            canUnrestrictedlyRedefineClasses()}
+     * is false, attempting any of the following will throw
+     * this exception
+     *   <UL>
+     *   <LI>changing the schema (the fields)
+     *   <LI>changing the hierarchy (subclasses, interfaces)
+     *   <LI>deleting a method
+     *   <LI>changing class modifiers
+     *   <LI>changing method modifiers
+     *   </UL>
+     * </UL>
+     *
+     * @throws java.lang.NoClassDefFoundError if the bytes
+     * don't correspond to the reference type (the names
+     * don't match).
+     *
+     * @throws java.lang.VerifyError if a "verifier" detects
+     * that a class, though well formed, contains an internal
+     * inconsistency or security problem.
+     *
+     * @throws java.lang.ClassFormatError if the bytes
+     * do not represent a valid class.
+     *
+     * @throws java.lang.ClassCircularityError if a
+     * circularity has been detected while initializing a class.
+     *
+     * @throws java.lang.UnsupportedClassVersionError if the
+     * major and minor version numbers in bytes
+     * are not supported by the VM.
+     *
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     *
+     * @see Method#isObsolete
+     * @see ThreadReference#popFrames
+     * @see #canRedefineClasses
+     * @see #canAddMethod
+     * @see #canUnrestrictedlyRedefineClasses
+     *
+     * @since 1.4
+     */
+    void redefineClasses(Map<? extends ReferenceType,byte[]> classToBytes);
+
+    /**
+     * Returns a list of the currently running threads. For each
+     * running thread in the target VM, a {@link ThreadReference}
+     * that mirrors it is placed in the list.
+     * The returned list contains threads created through
+     * java.lang.Thread, all native threads attached to
+     * the target VM through JNI, and system threads created
+     * by the target VM. Thread objects that have
+     * not yet been started
+     * (see {@link java.lang.Thread#start Thread.start()})
+     * and thread objects that have
+     * completed their execution are not included in the returned list.
+     *
+     * @return a list of {@link ThreadReference} objects, one for each
+     * running thread in the mirrored VM.
+     */
+    List<ThreadReference> allThreads();
+
+    /**
+     * Suspends the execution of the application running in this
+     * virtual machine. All threads currently running will be suspended.
+     * <p>
+     * Unlike {@link java.lang.Thread#suspend Thread.suspend()},
+     * suspends of both the virtual machine and individual threads are
+     * counted. Before a thread will run again, it must be resumed
+     * (through {@link #resume} or {@link ThreadReference#resume})
+     * the same number of times it has been suspended.
+     *
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     */
+    void suspend();
+
+    /**
+     * Continues the execution of the application running in this
+     * virtual machine. All threads are resumed as documented in
+     * {@link ThreadReference#resume}.
+     *
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     *
+     * @see #suspend
+     */
+    void resume();
+
+    /**
+     * Returns each thread group which does not have a parent. For each
+     * top level thread group a {@link ThreadGroupReference} is placed in the
+     * returned list.
+     * <p>
+     * This command may be used as the first step in building a tree
+     * (or trees) of the existing thread groups.
+     *
+     * @return a list of {@link ThreadGroupReference} objects, one for each
+     * top level thread group.
+     */
+    List<ThreadGroupReference> topLevelThreadGroups();
+
+    /**
+     * Returns the event queue for this virtual machine.
+     * A virtual machine has only one {@link EventQueue} object, this
+     * method will return the same instance each time it
+     * is invoked.
+     *
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     *
+     * @return the {@link EventQueue} for this virtual machine.
+     */
+    EventQueue eventQueue();
+
+    /**
+     * Returns the event request manager for this virtual machine.
+     * The {@link EventRequestManager} controls user settable events
+     * such as breakpoints.
+     * A virtual machine has only one {@link EventRequestManager} object,
+     * this method will return the same instance each time it
+     * is invoked.
+     *
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     *
+     * @return the {@link EventRequestManager} for this virtual machine.
+     */
+    EventRequestManager eventRequestManager();
+
+    /**
+     * Creates a {@link BooleanValue} for the given value. This value
+     * can be used for setting and comparing against a value retrieved
+     * from a variable or field in this virtual machine.
+     *
+     * @param value a boolean for which to create the value
+     * @return the {@link BooleanValue} for the given boolean.
+     */
+    BooleanValue mirrorOf(boolean value);
+
+    /**
+     * Creates a {@link ByteValue} for the given value. This value
+     * can be used for setting and comparing against a value retrieved
+     * from a variable or field in this virtual machine.
+     *
+     * @param value a byte for which to create the value
+     * @return the {@link ByteValue} for the given byte.
+     */
+    ByteValue mirrorOf(byte value);
+
+    /**
+     * Creates a {@link CharValue} for the given value. This value
+     * can be used for setting and comparing against a value retrieved
+     * from a variable or field in this virtual machine.
+     *
+     * @param value a char for which to create the value
+     * @return the {@link CharValue} for the given char.
+     */
+    CharValue mirrorOf(char value);
+
+    /**
+     * Creates a {@link ShortValue} for the given value. This value
+     * can be used for setting and comparing against a value retrieved
+     * from a variable or field in this virtual machine.
+     *
+     * @param value a short for which to create the value
+     * @return the {@link ShortValue} for the given short.
+     */
+    ShortValue mirrorOf(short value);
+
+    /**
+     * Creates an {@link IntegerValue} for the given value. This value
+     * can be used for setting and comparing against a value retrieved
+     * from a variable or field in this virtual machine.
+     *
+     * @param value an int for which to create the value
+     * @return the {@link IntegerValue} for the given int.
+     */
+    IntegerValue mirrorOf(int value);
+
+    /**
+     * Creates a {@link LongValue} for the given value. This value
+     * can be used for setting and comparing against a value retrieved
+     * from a variable or field in this virtual machine.
+     *
+     * @param value a long for which to create the value
+     * @return the {@link LongValue} for the given long.
+     */
+    LongValue mirrorOf(long value);
+
+    /**
+     * Creates a {@link FloatValue} for the given value. This value
+     * can be used for setting and comparing against a value retrieved
+     * from a variable or field in this virtual machine.
+     *
+     * @param value a float for which to create the value
+     * @return the {@link FloatValue} for the given float.
+     */
+    FloatValue mirrorOf(float value);
+
+    /**
+     * Creates a {@link DoubleValue} for the given value. This value
+     * can be used for setting and comparing against a value retrieved
+     * from a variable or field in this virtual machine.
+     *
+     * @param value a double for which to create the value
+     * @return the {@link DoubleValue} for the given double.
+     */
+    DoubleValue mirrorOf(double value);
+
+    /**
+     * Creates a string in this virtual machine.
+     * The created string can be used for setting and comparing against
+     * a string value retrieved from a variable or field in this
+     * virtual machine.
+     *
+     * @param value the string to be created
+     * @return a {@link StringReference} that mirrors the newly created
+     * string in the target VM.
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only
+     * -see {@link VirtualMachine#canBeModified()}.
+     */
+    StringReference mirrorOf(String value);
+
+
+    /**
+     * Creates a {@link VoidValue}.  This value
+     * can be passed to {@link ThreadReference#forceEarlyReturn}
+     * when a void method is to be exited.
+     *
+     * @return the {@link VoidValue}.
+     */
+    VoidValue mirrorOfVoid();
+
+    /**
+     * Returns the {@link java.lang.Process} object for this
+     * virtual machine if launched
+     * by a {@link com.sun.jdi.connect.LaunchingConnector}
+     *
+     * @return the {@link java.lang.Process} object for this virtual
+     * machine, or null if it was not launched by a
+     * {@link com.sun.jdi.connect.LaunchingConnector}.
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only
+     * -see {@link VirtualMachine#canBeModified()}.
+     */
+    Process process();
+
+    /**
+     * Invalidates this virtual machine mirror.
+     * The communication channel to the target VM is closed, and
+     * the target VM prepares to accept another subsequent connection
+     * from this debugger or another debugger, including the
+     * following tasks:
+     * <ul>
+     * <li>All event requests are cancelled.
+     * <li>All threads suspended by {@link #suspend} or by
+     * {@link ThreadReference#suspend} are resumed as many
+     * times as necessary for them to run.
+     * <li>Garbage collection is re-enabled in all cases where it was
+     * disabled through {@link ObjectReference#disableCollection}.
+     * </ul>
+     * Any current method invocations executing in the target VM
+     * are continued after the disconnection. Upon completion of any such
+     * method invocation, the invoking thread continues from the
+     * location where it was originally stopped.
+     * <p>
+     * Resources originating in
+     * this VirtualMachine (ObjectReferences, ReferenceTypes, etc.)
+     * will become invalid.
+     */
+    void dispose();
+
+    /**
+     * Causes the mirrored VM to terminate with the given error code.
+     * All resources associated with this VirtualMachine are freed.
+     * If the mirrored VM is remote, the communication channel
+     * to it will be closed. Resources originating in
+     * this VirtualMachine (ObjectReferences, ReferenceTypes, etc.)
+     * will become invalid.
+     * <p>
+     * Threads running in the mirrored VM are abruptly terminated.
+     * A thread death exception is not thrown and
+     * finally blocks are not run.
+     *
+     * @param exitCode the exit code for the target VM.  On some platforms,
+     * the exit code might be truncated, for example, to the lower order 8 bits.
+     *
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     */
+    void exit(int exitCode);
+
+    /**
+     * Determines if the target VM supports watchpoints
+     * for field modification.
+     *
+     * @return <code>true</code> if the feature is supported,
+     * <code>false</code> otherwise.
+     */
+    boolean canWatchFieldModification();
+
+    /**
+     * Determines if the target VM supports watchpoints
+     * for field access.
+     *
+     * @return <code>true</code> if the feature is supported,
+     * <code>false</code> otherwise.
+     */
+    boolean canWatchFieldAccess();
+
+    /**
+     * Determines if the target VM supports the retrieval
+     * of a method's bytecodes.
+     *
+     * @return <code>true</code> if the feature is supported,
+     * <code>false</code> otherwise.
+     */
+    boolean canGetBytecodes();
+
+    /**
+     * Determines if the target VM supports the query
+     * of the synthetic attribute of a method or field.
+     *
+     * @return <code>true</code> if the feature is supported,
+     * <code>false</code> otherwise.
+     */
+    boolean canGetSyntheticAttribute();
+
+    /**
+     * Determines if the target VM supports the retrieval
+     * of the monitors owned by a thread.
+     *
+     * @return <code>true</code> if the feature is supported,
+     * <code>false</code> otherwise.
+     */
+    boolean canGetOwnedMonitorInfo();
+
+    /**
+     * Determines if the target VM supports the retrieval
+     * of the monitor for which a thread is currently waiting.
+     *
+     * @return <code>true</code> if the feature is supported,
+     * <code>false</code> otherwise.
+     */
+    boolean canGetCurrentContendedMonitor();
+
+    /**
+     * Determines if the target VM supports the retrieval
+     * of the monitor information for an object.
+     *
+     * @return <code>true</code> if the feature is supported,
+     * <code>false</code> otherwise.
+     */
+    boolean canGetMonitorInfo();
+
+    /**
+     * Determines if the target VM supports filtering
+     * events by specific instance object.  For example,
+     * see {@link com.sun.jdi.request.BreakpointRequest#addInstanceFilter}.
+     *
+     * @return <code>true</code> if the feature is supported,
+     * <code>false</code> otherwise.
+     */
+    boolean canUseInstanceFilters();
+
+    /**
+     * Determines if the target VM supports any level
+     * of class redefinition.
+     * @see #redefineClasses
+     *
+     * @return <code>true</code> if the feature is supported,
+     * <code>false</code> otherwise.
+     *
+     * @since 1.4
+     */
+    boolean canRedefineClasses();
+
+    /**
+     * Determines if the target VM supports the addition
+     * of methods when performing class redefinition.
+     * @see #redefineClasses
+     *
+     * @return <code>true</code> if the feature is supported,
+     * <code>false</code> otherwise.
+     *
+     * @since 1.4
+     */
+    boolean canAddMethod();
+
+    /**
+     * Determines if the target VM supports unrestricted
+     * changes when performing class redefinition.
+     * @see #redefineClasses
+     *
+     * @return <code>true</code> if the feature is supported,
+     * <code>false</code> otherwise.
+     *
+     * @since 1.4
+     */
+    boolean canUnrestrictedlyRedefineClasses();
+
+    /**
+     * Determines if the target VM supports popping
+     * frames of a threads stack.
+     * @see ThreadReference#popFrames
+     *
+     * @return <code>true</code> if the feature is supported,
+     * <code>false</code> otherwise.
+     *
+     * @since 1.4
+     */
+    boolean canPopFrames();
+
+    /**
+     * Determines if the target VM supports getting
+     * the source debug extension.
+     * @see ReferenceType#sourceDebugExtension
+     *
+     * @return <code>true</code> if the feature is supported,
+     * <code>false</code> otherwise.
+     *
+     * @since 1.4
+     */
+    boolean canGetSourceDebugExtension();
+
+    /**
+     * Determines if the target VM supports the creation of
+     * {@link com.sun.jdi.request.VMDeathRequest}s.
+     * @see com.sun.jdi.request.EventRequestManager#createVMDeathRequest
+     *
+     * @return <code>true</code> if the feature is supported,
+     * <code>false</code> otherwise.
+     *
+     * @since 1.4
+     */
+    boolean canRequestVMDeathEvent();
+
+    /**
+     * Determines if the target VM supports the inclusion of return values
+     * in
+     * {@link com.sun.jdi.event.MethodExitEvent}s.
+     * @see com.sun.jdi.request.EventRequestManager#createMethodExitRequest
+     *
+     * @return <code>true</code> if the feature is supported,
+     * <code>false</code> otherwise.
+     *
+     * @since 1.6
+     */
+    boolean canGetMethodReturnValues();
+
+    /**
+     * Determines if the target VM supports the accessing of class instances,
+     * instance counts, and referring objects.
+     *
+     * @see #instanceCounts
+     * @see ReferenceType#instances(long)
+     * @see ObjectReference#referringObjects(long)
+     *
+     * @return <code>true</code> if the feature is supported,
+     * <code>false</code> otherwise.
+     *
+     * @since 1.6
+     */
+    boolean canGetInstanceInfo();
+
+
+    /**
+     * Determines if the target VM supports the filtering of
+     * class prepare events by source name.
+     *
+     * see {@link com.sun.jdi.request.ClassPrepareRequest#addSourceNameFilter}.
+     * @return <code>true</code> if the feature is supported,
+     * <code>false</code> otherwise.
+     *
+     * @since 1.6
+     */
+    boolean canUseSourceNameFilters();
+
+    /**
+     * Determines if the target VM supports the forcing of a method to
+     * return early.
+     *
+     * @see ThreadReference#forceEarlyReturn(Value)
+     *
+     * @return <code>true</code> if the feature is supported,
+     * <code>false</code> otherwise.
+     *
+     * @since 1.6
+     */
+    boolean canForceEarlyReturn();
+
+    /**
+     * Determines if the target VM is a read-only VM.  If a method which
+     * would modify the state of the VM is called on a read-only VM,
+     * then {@link VMCannotBeModifiedException} is thrown.
+     *
+     * @return <code>true</code> if the feature is supported,
+     * <code>false</code> otherwise.
+     *
+     * @since 1.5
+     */
+
+    boolean canBeModified();
+
+    /**
+     * Determines if the target VM supports the creation of
+     * {@link com.sun.jdi.request.MonitorContendedEnterRequest}s.
+     * {@link com.sun.jdi.request.MonitorContendedEnteredRequest}s.
+     * {@link com.sun.jdi.request.MonitorWaitRequest}s.
+     * {@link com.sun.jdi.request.MonitorWaitedRequest}s.
+     * @see com.sun.jdi.request.EventRequestManager#createMonitorContendedEnterRequest
+     * @see com.sun.jdi.request.EventRequestManager#createMonitorContendedEnteredRequest
+     * @see com.sun.jdi.request.EventRequestManager#createMonitorWaitRequest
+     * @see com.sun.jdi.request.EventRequestManager#createMonitorWaitedRequest
+     *
+     * @return <code>true</code> if the feature is supported,
+     * <code>false</code> otherwise.
+     *
+     * @since 1.6
+     */
+
+    boolean canRequestMonitorEvents();
+
+    /**
+     * Determines if the target VM supports getting which
+     * frame has acquired a monitor.
+     * @see com.sun.jdi.ThreadReference#ownedMonitorsAndFrames
+     *
+     * @return <code>true</code> if the feature is supported,
+     * <code>false</code> otherwise.
+     *
+     * @since 1.6
+     */
+
+     boolean canGetMonitorFrameInfo();
+
+
+    /**
+     * Determines if the target VM supports reading class file
+     * major and minor versions.
+     *
+     * @see ReferenceType#majorVersion()
+     * @see ReferenceType#minorVersion()
+     *
+     * @return <code>true</code> if the feature is supported,
+     * <code>false</code> otherwise.
+     *
+     * @since 1.6
+     */
+    boolean canGetClassFileVersion();
+
+    /**
+     * Determines if the target VM supports getting constant pool
+     * information of a class.
+     *
+     * @see ReferenceType#constantPoolCount()
+     * @see ReferenceType#constantPool()
+     *
+     * @return <code>true</code> if the feature is supported,
+     * <code>false</code> otherwise.
+     *
+     * @since 1.6
+     */
+    boolean canGetConstantPool();
+
+    /**
+     * Set this VM's default stratum (see {@link Location} for a
+     * discussion of strata).  Overrides the per-class default set
+     * in the class file.
+     * <P>
+     * Affects location queries (such as,
+     * {@link Location#sourceName()})
+     * and the line boundaries used in
+     * single stepping.
+     *
+     * @param stratum the stratum to set as VM default,
+     * or null to use per-class defaults.
+     *
+     * @throws java.lang.UnsupportedOperationException if the
+     * target virtual machine does not support this operation.
+     *
+     * @since 1.4
+     */
+    void setDefaultStratum(String stratum);
+
+    /**
+     * Return this VM's default stratum.
+     *
+     * @see #setDefaultStratum(String)
+     * @see ReferenceType#defaultStratum()
+     * @return <code>null</code> (meaning that the per-class
+     * default - {@link ReferenceType#defaultStratum()} -
+     * should be used) unless the default stratum has been
+     * set with
+     * {@link #setDefaultStratum(String)}.
+     *
+     * @since 1.4
+     */
+    String getDefaultStratum();
+
+    /**
+     * Returns the number of instances of each ReferenceType in the 'refTypes'
+     * list.
+     * Only instances that are reachable for the purposes of garbage collection
+     * are counted.
+     * <p>
+     * Not all target virtual machines support this operation.
+     * Use {@link VirtualMachine#canGetInstanceInfo()}
+     * to determine if the operation is supported.
+     *
+     * @see ReferenceType#instances(long)
+     * @see ObjectReference#referringObjects(long)
+     * @param refTypes the list of {@link ReferenceType} objects for which counts
+     *        are to be obtained.
+     *
+     * @return an array of <code>long</code> containing one element for each
+     *         element in the 'refTypes' list.  Element i of the array contains
+     *         the number of instances in the target VM of the ReferenceType at
+     *         position i in the 'refTypes' list.
+     *         If the 'refTypes' list is empty, a zero-length array is returned.
+     *         If a ReferenceType in refTypes has been garbage collected, zero
+     *         is returned for its instance count.
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation - see
+     * {@link VirtualMachine#canGetInstanceInfo() canGetInstanceInfo()}
+     * @throws NullPointerException if the 'refTypes' list is null.
+     * @since 1.6
+     */
+    long[] instanceCounts(List<? extends ReferenceType> refTypes);
+
+    /**
+     * Returns text information on the target VM and the
+     * debugger support that mirrors it. No specific format
+     * for this information is guaranteed.
+     * Typically, this string contains version information for the
+     * target VM and debugger interfaces.
+     * More precise information
+     * on VM and JDI versions is available through
+     * {@link #version}, {@link VirtualMachineManager#majorInterfaceVersion},
+     * and {@link VirtualMachineManager#minorInterfaceVersion}
+     *
+     * @return the description.
+     */
+    String description();
+
+    /**
+     * Returns the version of the Java Runtime Environment in the target
+     * VM as reported by the property <code>java.version</code>.
+     * For obtaining the JDI interface version, use
+     * {@link VirtualMachineManager#majorInterfaceVersion}
+     * and {@link VirtualMachineManager#minorInterfaceVersion}
+     *
+     * @return the target VM version.
+     */
+    String version();
+
+    /**
+     * Returns the name of the target VM as reported by the
+     * property <code>java.vm.name</code>.
+     *
+     * @return the target VM name.
+     */
+    String name();
+
+    /** All tracing is disabled. */
+    int TRACE_NONE        = 0x00000000;
+    /** Tracing enabled for JDWP packets sent to target VM. */
+    int TRACE_SENDS       = 0x00000001;
+    /** Tracing enabled for JDWP packets received from target VM. */
+    int TRACE_RECEIVES    = 0x00000002;
+    /** Tracing enabled for internal event handling. */
+    int TRACE_EVENTS      = 0x00000004;
+    /** Tracing enabled for internal managment of reference types. */
+    int TRACE_REFTYPES    = 0x00000008;
+    /** Tracing enabled for internal management of object references. */
+    int TRACE_OBJREFS      = 0x00000010;
+    /** All tracing is enabled. */
+    int TRACE_ALL         = 0x00ffffff;
+
+    /**
+     * Traces the activities performed by the com.sun.jdi implementation.
+     * All trace information is output to System.err. The given trace
+     * flags are used to limit the output to only the information
+     * desired. The given flags are in effect and the corresponding
+     * trace will continue until the next call to
+     * this method.
+     * <p>
+     * Output is implementation dependent and trace mode may be ignored.
+     *
+     * @param traceFlags identifies which kinds of tracing to enable.
+     */
+    void setDebugTraceMode(int traceFlags);
+}
diff --git a/src/share/classes/com/sun/jdi/VirtualMachineManager.java b/src/share/classes/com/sun/jdi/VirtualMachineManager.java
new file mode 100644
index 0000000..5b59db5
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/VirtualMachineManager.java
@@ -0,0 +1,431 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+import com.sun.jdi.connect.*;
+import com.sun.jdi.connect.spi.Connection;
+import java.util.List;
+import java.io.IOException;
+
+/**
+ * A manager of connections to target virtual machines. The
+ * VirtualMachineManager allows one application to debug
+ * multiple target VMs. (Note that the converse is not
+ * supported; a target VM can be debugged by only one
+ * debugger application.) This interface
+ * contains methods to manage connections
+ * to remote target VMs and to obtain the {@link VirtualMachine}
+ * mirror for available target VMs.
+ * <p>
+ * Connections can be made using one of several different
+ * {@link com.sun.jdi.connect.Connector} objects. Each connector encapsulates
+ * a different way of connecting the debugger with a target VM.
+ * <p>
+ * The VirtualMachineManager supports many different scenarios for
+ * connecting a debugger to a virtual machine. Four examples
+ * are presented in the table below. The
+ * examples use the command line syntax in Sun's implementation.
+ * Some {@link com.sun.jdi.connect.Connector} implementations may require slightly
+ * different handling than presented below.
+ * <p>
+ * <TABLE BORDER WIDTH="75%" SUMMARY="Four scenarios for connecting a debugger
+ *  to a virtual machine">
+ * <TR>
+ * <TH scope=col>Scenario</TH>
+ * <TH scope=col>Description</TH>
+ * <TR>
+ * <TD>Debugger launches target VM (simplest, most-common scenario)</TD>
+ *
+ * <TD>Debugger calls the
+ * {@link com.sun.jdi.connect.LaunchingConnector#launch(java.util.Map)}
+ * method of the default connector, obtained with {@link #defaultConnector}. The
+ * target VM is launched, and a connection between that VM and the
+ * debugger is established. A {@link VirtualMachine} mirror is returned.
+ * <P>Or, for more control
+ * <UL>
+ * <LI>
+ * Debugger selects a connector from the list returned by
+ * {@link #launchingConnectors} with desired characteristics
+ * (for example, transport type, etc.).
+ * <LI>
+ * Debugger calls the
+ * {@link com.sun.jdi.connect.LaunchingConnector#launch(java.util.Map)}
+ * method of the selected connector. The
+ * target VM is launched, and a connection between that VM and the
+ * debugger is established. A {@link VirtualMachine} mirror is returned.
+ * </UL>
+ * </TD>
+ * </TR>
+ * <TR>
+ * <TD>Debugger attaches to previously-running VM</TD>
+ * <TD>
+ * <UL>
+ * <LI>
+ * Target VM is launched using the options
+ * <code>-agentlib:jdwp=transport=xxx,server=y</code>
+ * </LI>
+ * <LI>
+ * Target VM generates and outputs the tranport-specific address at which it will
+ * listen for a connection.</LI>
+ * <LI>
+ * Debugger is launched. Debugger selects a connector in the list
+ * returned by {@link #attachingConnectors} matching the transport with
+ * the name "xxx".
+ * <LI>
+ * Debugger presents the default connector parameters (obtained through
+ * {@link com.sun.jdi.connect.Connector#defaultArguments()}) to the end user,
+ * allowing the user to
+ * fill in the transport-specific address generated by the target VM.
+ * <LI>
+ * Debugger calls the {@link com.sun.jdi.connect.AttachingConnector#attach(java.util.Map)} method
+ * of the selected to attach to the target VM. A {@link VirtualMachine}
+ * mirror is returned.
+ * </UL>
+ * </TD>
+ * </TR>
+ *
+ * <TR>
+ * <TD>Target VM attaches to previously-running debugger</TD>
+ * <TD>
+ * <LI>
+ * At startup, debugger selects one or more connectors from
+ * the list returned by {@link #listeningConnectors} for one or more
+ * transports.</LI>
+ * <LI>
+ * Debugger calls the {@link com.sun.jdi.connect.ListeningConnector#startListening(java.util.Map)} method for each selected
+ * connector. For each call, a transport-specific address string is
+ * generated and returned. The debugger makes the transport names and
+ * corresponding address strings available to the end user.
+ * <LI>
+ * Debugger calls
+ * {@link com.sun.jdi.connect.ListeningConnector#accept(java.util.Map)}
+ * for each selected connector to wait for
+ * a target VM to connect.</LI>
+ * <LI>
+ * Later, target VM is launched by end user with the options
+ * <code>-agentlib:jdwp=transport=xxx,address=yyy</code>
+ * where "xxx" the transport for one of the connectors selected by the
+ * the debugger and "yyy"
+ * is the address generated by
+ * {@link com.sun.jdi.connect.ListeningConnector#accept(java.util.Map)} for that
+ * transport.</LI>
+ * <LI>
+ * Debugger's call to {@link com.sun.jdi.connect.ListeningConnector#accept(java.util.Map)} returns
+ * a {@link VirtualMachine} mirror.</LI>
+ * </TD>
+ * </TR>
+ *
+ * <TR>
+ * <TD>Target VM launches debugger (sometimes called "Just-In-Time" debugging)</TD>
+ * <TD>
+ * <LI>
+ * Target VM is launched with the options
+ * <code>-agentlib:jdwp=launch=cmdline,onuncaught=y,transport=xxx,server=y</code>
+ * </LI>
+ * <LI>
+ * Later, an uncaught exception is thrown in the target VM. The target
+ * VM generates the tranport-specific address at which it will
+ * listen for a connection.
+ * <LI>Target VM launches the debugger with the following items concatenated
+ * together (separated by spaces) to form the command line:
+ * <UL>
+ * <LI> The launch= value
+ * <LI> The transport= value
+ * <LI> The generated transport-specific address at which VM is listening for
+ * debugger connection.
+ * </UL>
+ * <LI>
+ * Upon launch, debugger selects a connector in the list
+ * returned by {@link #attachingConnectors} matching the transport with
+ * the name "xxx".
+ * <LI>
+ * Debugger changes the default connector parameters (obtained through
+ * {@link com.sun.jdi.connect.Connector#defaultArguments()}) to specify
+ * the transport specific address at which the VM is listenig. Optionally,
+ * other connector arguments can be presented to the user.
+ * <LI>
+ * Debugger calls the
+ * {@link com.sun.jdi.connect.AttachingConnector#attach(java.util.Map)} method
+ * of the selected to attach to the target VM. A {@link VirtualMachine}
+ * mirror is returned.
+ * </TD>
+ * </TR>
+ * </TABLE>
+ *
+ * <p> Connectors are created at start-up time. That is, they
+ * are created the first time that {@link
+ * com.sun.jdi.Bootstrap#virtualMachineManager()} is invoked.
+ * The list of all Connectors created at start-up time can be
+ * obtained from the VirtualMachineManager by invoking the
+ * {@link #allConnectors allConnectors} method.
+ *
+ * <p> Connectors are created at start-up time if they are
+ * installed on the platform. In addition, Connectors are created
+ * automatically by the VirtualMachineManager to encapsulate any
+ * {@link com.sun.jdi.connect.spi.TransportService} implementations
+ * that are installed on the platform. These two mechanisms for
+ * creating Connectors are described here.
+ *
+ * <p> A Connector is installed on the platform if it is installed
+ * in a jar file that is visible to the defining class loader of
+ * the {@link com.sun.jdi.connect.Connector} type,
+ * and that jar file contains a provider configuration file named
+ * <tt>com.sun.jdi.connect.Connector</tt> in the resource directory
+ * <tt>META-INF/services</tt>, and the provider configuration file
+ * lists the full-qualified class name of the Connector
+ * implementation. A Connector is a class that implements the
+ * {@link com.sun.jdi.connect.Connector Connector} interface. More
+ * appropriately the class implements one of the specific Connector
+ * types, namely {@link com.sun.jdi.connect.AttachingConnector
+ * AttachingConnector}, {@link com.sun.jdi.connect.ListeningConnector
+ * ListeningConnector}, or {@link com.sun.jdi.connect.LaunchingConnector
+ * LaunchingConnector}. The format of the provider configuration file
+ * is one fully-qualified class name per line. Space and tab characters
+ * surrounding each class, as well as blank lines are ignored. The
+ * comment character is <tt>'#'</tt> (<tt>0x23</tt>), and on each
+ * line all characters following the first comment character are
+ * ignored. The file must be encoded in UTF-8.
+ *
+ * <p> At start-up time the VirtualMachineManager attempts to load
+ * and instantiate (using the no-arg constructor) each class listed
+ * in the provider configuration file. Exceptions thrown when loading
+ * or creating the Connector are caught and ignored. In other words,
+ * the start-up process continues despite of errors.
+ *
+ * <p> In addition to Connectors installed on the platform the
+ * VirtualMachineManager will also create Connectors to encapsulate
+ * any {@link com.sun.jdi.connect.spi.TransportService} implementations
+ * that are installed on the platform. A TransportService is
+ * installed on the platform if it installed in a jar file that is
+ * visible to the defining class loader for the
+ * {@link com.sun.jdi.connect.spi.TransportService} type, and that jar
+ * file contains a provider configuration file named
+ * <tt>com.sun.jdi.connect.spi.TransportService</tt> in the resource
+ * directory <tt>META-INF/services</tt>, and the provider
+ * configuration file lists the the full-qualified class name of the
+ * TransportService implementation. A TransportService is a concrete
+ * sub-class of {@link com.sun.jdi.connect.spi.TransportService
+ * TransportService}. The format of the provider configuration file
+ * is the same as the provider configuration file for Connectors
+ * except that each class listed must be the fully-qualified class
+ * name of a class that implements the TransportService interface.
+ *
+ * <p> For each TransportService installed on the platform, the
+ * VirtualMachineManager creates a corresponding
+ * {@link com.sun.jdi.connect.AttachingConnector} and
+ * {@link com.sun.jdi.connect.ListeningConnector}. These
+ * Connectors are created to encapsulate a {@link
+ * com.sun.jdi.connect.Transport Transport} that in turn
+ * encapsulates the TransportService.
+ * The AttachingConnector will be named based on the name of the
+ * transport service concatenated with the string <tt>Attach</tt>.
+ * For example, if the transport service {@link
+ * com.sun.jdi.connect.spi.TransportService#name() name()} method
+ * returns <tt>telepathic</tt> then the AttachingConnector will
+ * be named <tt>telepathicAttach</tt>. Similiarly the ListeningConnector
+ * will be named with the string <tt>Listen</tt> tagged onto the
+ * name of the transport service. The {@link
+ * com.sun.jdi.connect.Connector#description() description()} method
+ * of both the AttachingConnector, and the ListeningConnector, will
+ * delegate to the {@link com.sun.jdi.connect.spi.TransportService#description()
+ * description()} method of the underlying transport service. Both
+ * the AttachingConnector and the ListeningConnector will have two
+ * Connector {@link com.sun.jdi.connect.Connector$Argument Arguments}.
+ * A {@link com.sun.jdi.connect.Connector$StringArgument StringArgument}
+ * named <tt>address</tt> is the connector argument to specify the
+ * address to attach too, or to listen on. A
+ * {@link com.sun.jdi.connect.Connector$IntegerArgument IntegerArgument}
+ * named <tt>timeout</tt> is the connector argument to specify the
+ * timeout when attaching, or accepting. The timeout connector may be
+ * ignored depending on if the transport service supports an attach
+ * timeout or accept timeout.
+ *
+ * <p> Initialization of the virtual machine manager will fail, that is
+ * {@link com.sun.jdi.Bootstrap#virtualMachineManager()} will throw an
+ * error if the virtual machine manager is unable to create any
+ * connectors.
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+public interface VirtualMachineManager {
+
+    /**
+     * Identifies the default connector. This connector should
+     * be used as the launching connector when selection of a
+     * connector with specific characteristics is unnecessary.
+     *
+     * @return the default {@link com.sun.jdi.connect.LaunchingConnector}
+     */
+    LaunchingConnector defaultConnector();
+
+    /**
+     * Returns the list of known {@link com.sun.jdi.connect.LaunchingConnector} objects.
+     * Any of the returned objects can be used to launch a new target
+     * VM and immediately create a {@link VirtualMachine} mirror for it.
+     *
+     * Note that a target VM launched by a launching connector is not
+     * guaranteed to be stable until after the {@link com.sun.jdi.event.VMStartEvent} has been
+     * received.
+     * @return a list of {@link com.sun.jdi.connect.LaunchingConnector} objects.
+     */
+    List<LaunchingConnector> launchingConnectors();
+
+    /**
+     * Returns the list of known {@link com.sun.jdi.connect.AttachingConnector} objects.
+     * Any of the returned objects can be used to attach to an existing target
+     * VM and create a {@link VirtualMachine} mirror for it.
+     *
+     * @return a list of {@link com.sun.jdi.connect.AttachingConnector} objects.
+     */
+    List<AttachingConnector> attachingConnectors();
+
+    /**
+     * Returns the list of known {@link com.sun.jdi.connect.ListeningConnector} objects.
+     * Any of the returned objects can be used to listen for a
+     * connection initiated by a target VM
+     * and create a {@link VirtualMachine} mirror for it.
+     *
+     * @return a list of {@link com.sun.jdi.connect.ListeningConnector} objects.
+     */
+    List<ListeningConnector> listeningConnectors();
+
+    /**
+     * Returns the list of all known {@link com.sun.jdi.connect.Connector} objects.
+     *
+     * @return a list of {@link com.sun.jdi.connect.Connector} objects.
+     */
+     List<Connector> allConnectors();
+
+    /**
+     * Lists all target VMs which are connected to the debugger.
+     * The list includes {@link VirtualMachine} instances for
+     * any target VMs which initiated a connection
+     * and any
+     * target VMs to which this manager has initiated a connection.
+     * A target VM will remain in this list
+     * until the VM is disconnected.
+     * {@link com.sun.jdi.event.VMDisconnectEvent} is placed in the event queue
+     * after the VM is removed from the list.
+     *
+     * @return a list of {@link VirtualMachine} objects, each mirroring
+     * a target VM.
+     */
+     List<VirtualMachine> connectedVirtualMachines();
+
+     /**
+      * Returns the major version number of the JDI interface.
+      * See {@link VirtualMachine#version} target VM version and
+      * information and
+      * {@link VirtualMachine#description} more version information.
+      *
+      * @return the integer major version number.
+      */
+     int majorInterfaceVersion();
+
+     /**
+      * Returns the minor version number of the JDI interface.
+      * See {@link VirtualMachine#version} target VM version and
+      * information and
+      * {@link VirtualMachine#description} more version information.
+      *
+      * @return the integer minor version number
+      */
+     int minorInterfaceVersion();
+
+     /**
+      * Create a virtual machine mirror for a target VM.
+      *
+      * <p> Creates a virtual machine mirror for a target VM
+      * for which a {@link com.sun.jdi.connect.spi.Connection Connection}
+      * already exists. A Connection is created when a {@link
+      * com.sun.jdi.connect.Connector Connector} establishes
+      * a connection and successfully handshakes with a target VM.
+      * A Connector can then use this method to create a virtual machine
+      * mirror to represent the composite state of the target VM.
+      *
+      * <p> The <tt>process</tt> argument specifies the
+      * {@link java.lang.Process} object for the taget VM. It may be
+      * specified as <tt>null</tt>. If the target VM is launched
+      * by a {@link com.sun.jdi.connect.LaunchingConnector
+      * LaunchingConnector} the <tt>process</tt> argument should be
+      * specified, otherwise calling {@link com.sun.jdi.VirtualMachine#process()}
+      * on the created virtual machine will return <tt>null</tt>.
+      *
+      * <p> This method exists so that Connectors may create
+      * a virtual machine mirror when a connection is established
+      * to a target VM. Only developers creating new Connector
+      * implementations should need to make direct use of this
+      * method. </p>
+      *
+      * @param  connection
+      *         The open connection to the target VM.
+      *
+      * @param  process
+      *         If launched, the {@link java.lang.Process} object for
+      *         the target VM. <tt>null</tt> if not launched.
+      *
+      * @return new virtual machine representing the target VM.
+      *
+      * @throws IOException
+      *         if an I/O error occurs
+      *
+      * @throws IllegalStateException
+      *         if the connection is not open
+      *
+      * @see com.sun.jdi.connect.spi.Connection#isOpen()
+      * @see com.sun.jdi.VirtualMachine#process()
+      *
+      * @since 1.5
+      */
+     VirtualMachine createVirtualMachine(Connection connection, Process process) throws IOException;
+
+     /**
+      * Creates a new virtual machine.
+      *
+      * <p> This convenience method works as if by invoking {@link
+      * #createVirtualMachine(Connection, Process)} method and
+      * specifying <tt>null</tt> as the <tt>process</tt> argument.
+      *
+      * <p> This method exists so that Connectors may create
+      * a virtual machine mirror when a connection is established
+      * to a target VM. Only developers creating new Connector
+      * implementations should need to make direct use of this
+      * method. </p>
+      *
+      * @return the new virtual machine
+      *
+      * @throws IOException
+      *         if an I/O error occurs
+      *
+      * @throws IllegalStateException
+      *         if the connection is not open
+      *
+      * @since 1.5
+      */
+     VirtualMachine createVirtualMachine(Connection connection) throws IOException;
+}
diff --git a/src/share/classes/com/sun/jdi/VoidType.java b/src/share/classes/com/sun/jdi/VoidType.java
new file mode 100644
index 0000000..9a9ee46
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/VoidType.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * The type of all primitive <code>void</code> values
+ * accessed in the target VM. Calls to {@link Value#type} will return an
+ * implementor of this interface.
+ *
+ * @see VoidValue
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface VoidType extends Type {
+}
diff --git a/src/share/classes/com/sun/jdi/VoidValue.java b/src/share/classes/com/sun/jdi/VoidValue.java
new file mode 100644
index 0000000..f3fb87e
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/VoidValue.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi;
+
+/**
+ * Provides access to a primitive <code>void</code> value in
+ * the target VM.
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface VoidValue extends Value {
+
+    /**
+     * Compares the specified Object with this VoidValue for equality.
+     *
+     * @return true if the Object is a VoidValue; false
+     * otherwise.
+     */
+    boolean equals(Object obj);
+
+    /**
+     * Returns the hash code value for this VoidValue.
+     *
+     * @return the hash code
+     */
+    int hashCode();
+}
diff --git a/src/share/classes/com/sun/jdi/connect/AttachingConnector.java b/src/share/classes/com/sun/jdi/connect/AttachingConnector.java
new file mode 100644
index 0000000..80bf5a0
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/connect/AttachingConnector.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.connect;
+
+import com.sun.jdi.VirtualMachine;
+import java.util.Map;
+import java.io.IOException;
+
+/**
+ * A connector which attaches to a previously running target VM.
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+public interface AttachingConnector extends Connector {
+    /**
+     * Attaches to a running application and and returns a
+     * mirror of its VM.
+     * <p>
+     * The connector uses the given argument map in
+     * attaching the application. These arguments will include addressing
+     * information that identifies the VM.
+     * The argument map associates argument name strings to instances
+     * of {@link Connector.Argument}. The default argument map for a
+     * connector can be obtained through {@link Connector#defaultArguments}.
+     * Argument map values can be changed, but map entries should not be
+     * added or deleted.
+     *
+     * @param arguments the argument map to be used in launching the VM.
+     * @return the {@link VirtualMachine} mirror of the target VM.
+     *
+     * @throws TransportTimeoutException when the Connector encapsulates
+     * a transport that supports a timeout when attaching, a
+     * {@link Connector.Argument} representing a timeout has been set
+     * in the argument map, and a timeout occurs when trying to attach
+     * to the target VM.
+     *
+     * @throws java.io.IOException when unable to attach.
+     * Specific exceptions are dependent on the Connector implementation
+     * in use.
+     * @throws IllegalConnectorArgumentsException when one of the
+     * connector arguments is invalid.
+     */
+    VirtualMachine attach(Map<String,? extends Connector.Argument> arguments)
+        throws IOException, IllegalConnectorArgumentsException;
+}
diff --git a/src/share/classes/com/sun/jdi/connect/Connector.java b/src/share/classes/com/sun/jdi/connect/Connector.java
new file mode 100644
index 0000000..52aebbf
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/connect/Connector.java
@@ -0,0 +1,291 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.connect;
+
+import java.util.Map;
+import java.util.List;
+import java.io.Serializable;
+
+/**
+ * A method of connection between a debugger and a target VM.
+ * A connector encapsulates exactly one {@link Transport}. used
+ * to establish the connection. Each connector has a set of arguments
+ * which controls its operation. The arguments are stored as a
+ * map, keyed by a string. Each implementation defines the string
+ * argument keys it accepts.
+ *
+ * @see LaunchingConnector
+ * @see AttachingConnector
+ * @see ListeningConnector
+ * @see Connector.Argument
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+public interface Connector {
+    /**
+     * Returns a short identifier for the connector. Connector implementors
+     * should follow similar naming conventions as are used with packages
+     * to avoid name collisions. For example, the Sun connector
+     * implementations have names prefixed with "com.sun.jdi.".
+     * Not intended for exposure to end-user.
+     *
+     * @return the name of this connector.
+     */
+    String name();
+
+    /**
+     * Returns a human-readable description of this connector
+     * and its purpose.
+     *
+     * @return the description of this connector
+     */
+    String description();
+
+    /**
+     * Returns the transport mechanism used by this connector to establish
+     * connections with a target VM.
+     *
+     * @return the {@link Transport} used by this connector.
+     */
+    Transport transport();
+
+    /**
+     * Returns the arguments accepted by this Connector and their
+     * default values. The keys of the returned map are string argument
+     * names. The values are {@link Connector.Argument} containing
+     * information about the argument and its default value.
+     *
+     * @return the map associating argument names with argument
+     * information and default value.
+     */
+    Map<String,Connector.Argument> defaultArguments();
+
+    /**
+     * Specification for and value of a Connector argument.
+     * Will always implement a subinterface of Argument:
+     * {@link Connector.StringArgument}, {@link Connector.BooleanArgument},
+     * {@link Connector.IntegerArgument},
+     * or {@link Connector.SelectedArgument}.
+     */
+    @jdk.Exported
+    public interface Argument extends Serializable {
+        /**
+         * Returns a short, unique identifier for the argument.
+         * Not intended for exposure to end-user.
+         *
+         * @return the name of this argument.
+         */
+        String name();
+
+        /**
+         * Returns a short human-readable label for this argument.
+         *
+         * @return a label for this argument
+         */
+        String label();
+
+        /**
+         * Returns a human-readable description of this argument
+         * and its purpose.
+         *
+         * @return the description of this argument
+         */
+        String description();
+
+        /**
+         * Returns the current value of the argument. Initially, the
+         * default value is returned. If the value is currently unspecified,
+         * null is returned.
+         *
+         * @return the current value of the argument.
+         */
+        String value();
+
+        /**
+         * Sets the value of the argument.
+         * The value should be checked with {@link #isValid(String)}
+         * before setting it; invalid values will throw an exception
+         * when the connection is established - for example,
+         * on {@link LaunchingConnector#launch}
+         */
+        void setValue(String value);
+
+        /**
+         * Performs basic sanity check of argument.
+         * @return <code>true</code> if the value is valid to be
+         * used in {@link #setValue(String)}
+         */
+        boolean isValid(String value);
+
+        /**
+         * Indicates whether the argument must be specified. If true,
+         * {@link #setValue} must be used to set a non-null value before
+         * using this argument in establishing a connection.
+         *
+         * @return <code>true</code> if the argument must be specified;
+         * <code>false</code> otherwise.
+         */
+        boolean mustSpecify();
+    }
+
+    /**
+     * Specification for and value of a Connector argument,
+     * whose value is Boolean.  Boolean values are represented
+     * by the localized versions of the strings "true" and "false".
+     */
+    @jdk.Exported
+    public interface BooleanArgument extends Argument {
+        /**
+         * Sets the value of the argument.
+         */
+        void setValue(boolean value);
+
+        /**
+         * Performs basic sanity check of argument.
+         * @return <code>true</code> if value is a string
+         * representation of a boolean value.
+         * @see #stringValueOf(boolean)
+         */
+        boolean isValid(String value);
+
+        /**
+         * Return the string representation of the <code>value</code>
+         * parameter.
+         * Does not set or examine the current value of <code>this</code>
+         * instance.
+         * @return the localized String representation of the
+         * boolean value.
+         */
+        String stringValueOf(boolean value);
+
+        /**
+         * Return the value of the argument as a boolean.  Since
+         * the argument may not have been set or may have an invalid
+         * value {@link #isValid(String)} should be called on
+         * {@link #value()} to check its validity.  If it is invalid
+         * the boolean returned by this method is undefined.
+         * @return the value of the argument as a boolean.
+         */
+        boolean booleanValue();
+    }
+
+    /**
+     * Specification for and value of a Connector argument,
+     * whose value is an integer.  Integer values are represented
+     * by their corresponding strings.
+     */
+    @jdk.Exported
+    public interface IntegerArgument extends Argument {
+        /**
+         * Sets the value of the argument.
+         * The value should be checked with {@link #isValid(int)}
+         * before setting it; invalid values will throw an exception
+         * when the connection is established - for example,
+         * on {@link LaunchingConnector#launch}
+         */
+        void setValue(int value);
+
+        /**
+         * Performs basic sanity check of argument.
+         * @return <code>true</code> if value represents an int that is
+         * <code>{@link #min()} &lt;= value &lt;= {@link #max()}</code>
+         */
+        boolean isValid(String value);
+
+        /**
+         * Performs basic sanity check of argument.
+         * @return <code>true</code> if
+         * <code>{@link #min()} &lt;= value  &lt;= {@link #max()}</code>
+         */
+        boolean isValid(int value);
+
+        /**
+         * Return the string representation of the <code>value</code>
+         * parameter.
+         * Does not set or examine the current value of <code>this</code>
+         * instance.
+         * @return the String representation of the
+         * int value.
+         */
+        String stringValueOf(int value);
+
+        /**
+         * Return the value of the argument as a int.  Since
+         * the argument may not have been set or may have an invalid
+         * value {@link #isValid(String)} should be called on
+         * {@link #value()} to check its validity.  If it is invalid
+         * the int returned by this method is undefined.
+         * @return the value of the argument as a int.
+         */
+        int intValue();
+
+        /**
+         * The upper bound for the value.
+         * @return the maximum allowed value for this argument.
+         */
+        int max();
+
+        /**
+         * The lower bound for the value.
+         * @return the minimum allowed value for this argument.
+         */
+        int min();
+    }
+
+    /**
+     * Specification for and value of a Connector argument,
+     * whose value is a String.
+     */
+    @jdk.Exported
+    public interface StringArgument extends Argument {
+        /**
+         * Performs basic sanity check of argument.
+         * @return <code>true</code> always
+         */
+        boolean isValid(String value);
+    }
+
+    /**
+     * Specification for and value of a Connector argument,
+     * whose value is a String selected from a list of choices.
+     */
+    @jdk.Exported
+    public interface SelectedArgument extends Argument {
+        /**
+         * Return the possible values for the argument
+         * @return {@link List} of {@link String}
+         */
+        List<String> choices();
+
+        /**
+         * Performs basic sanity check of argument.
+         * @return <code>true</code> if value is one of {@link #choices()}.
+         */
+        boolean isValid(String value);
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/connect/IllegalConnectorArgumentsException.java b/src/share/classes/com/sun/jdi/connect/IllegalConnectorArgumentsException.java
new file mode 100644
index 0000000..b7f57c0
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/connect/IllegalConnectorArgumentsException.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.connect;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Collections;
+
+/**
+ * Thrown to indicate an invalid argument or
+ * inconsistent passed to a {@link Connector}.
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+public class IllegalConnectorArgumentsException extends Exception {
+
+    private static final long serialVersionUID = -3042212603611350941L;
+    List<String> names;
+
+    /**
+     * Construct an <code>IllegalConnectorArgumentsException</code>
+     * with the specified detail message and the name of the argument
+     * which is invalid or inconsistent.
+     * @param s the detailed message.
+     * @param name the name of the invalid or inconsistent argument.
+     */
+    public IllegalConnectorArgumentsException(String s,
+                                              String name) {
+        super(s);
+        names = new ArrayList<String>(1);
+        names.add(name);
+    }
+
+    /**
+     * Construct an <code>IllegalConnectorArgumentsException</code>
+     * with the specified detail message and a <code>List</code> of
+     * names of arguments which are invalid or inconsistent.
+     * @param s the detailed message.
+     * @param names a <code>List</code> containing the names of the
+     * invalid or inconsistent argument.
+     */
+    public IllegalConnectorArgumentsException(String s, List<String> names) {
+        super(s);
+
+        this.names = new ArrayList<String>(names);
+    }
+
+    /**
+     * Return a <code>List</code> containing the names of the
+     * invalid or inconsistent arguments.
+     * @return a <code>List</code> of argument names.
+     */
+    public List<String> argumentNames() {
+        return Collections.unmodifiableList(names);
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/connect/LaunchingConnector.java b/src/share/classes/com/sun/jdi/connect/LaunchingConnector.java
new file mode 100644
index 0000000..af801e9
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/connect/LaunchingConnector.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.connect;
+
+import com.sun.jdi.VirtualMachine;
+import java.util.Map;
+import java.io.IOException;
+
+/**
+ * A connector which can launch a target VM before connecting to it.
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+public interface LaunchingConnector extends Connector {
+    /**
+     * Launches an application and connects to its VM. Properties
+     * of the launch (possibly including options,
+     * main class, and arguments) are specified in
+     * <code>arguments</code>.
+     * The argument map associates argument name strings to instances
+     * of {@link Connector.Argument}. The default argument map for a
+     * connector can be obtained through {@link Connector#defaultArguments}.
+     * Argument map values can be changed, but map entries should not be
+     * added or deleted.
+     * <p>A target VM launched by a launching connector is not
+     * guaranteed to be stable until after the {@link com.sun.jdi.event.VMStartEvent} has been
+     * received.
+     * <p>
+     * <b>Important note:</b> If a target VM is launched through this
+     * funcctions, its output and error streams must be read as it
+     * executes. These streams are available through the
+     * {@link java.lang.Process Process} object returned by
+     * {@link com.sun.jdi.VirtualMachine#process}. If the streams are not periodically
+     * read, the target VM will stop executing when the buffers for these
+     * streams are filled.
+     *
+     * @param arguments the argument map to be used in launching the VM.
+     * @return the {@link VirtualMachine} mirror of the target VM.
+     * @throws java.io.IOException when unable to launch.
+     * Specific exceptions are dependent on the Connector implementation
+     * in use.
+     * @throws IllegalConnectorArgumentsException when one of the
+     * connector arguments is invalid.
+     * @throws VMStartException when the VM was successfully launched, but
+     * terminated with an error before a connection could be established.
+     */
+    VirtualMachine launch(Map<String,? extends Connector.Argument> arguments)
+        throws IOException, IllegalConnectorArgumentsException,
+               VMStartException;
+}
diff --git a/src/share/classes/com/sun/jdi/connect/ListeningConnector.java b/src/share/classes/com/sun/jdi/connect/ListeningConnector.java
new file mode 100644
index 0000000..1048201
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/connect/ListeningConnector.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.connect;
+
+import java.util.Map;
+import java.io.IOException;
+import com.sun.jdi.VirtualMachine;
+
+/**
+ * A connector which listens for a connection initiated by a target VM.
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ListeningConnector extends Connector {
+    /**
+     * Indicates whether this listening connector supports multiple
+     * connections for a single argument map. If so, a call to
+     * {@link #startListening} may allow
+     * multiple target VM to become connected.
+     *
+     * @return <code>true</code> if multiple connections are supported;
+     * <code>false</code> otherwise.
+     */
+    boolean supportsMultipleConnections();
+
+    /**
+     * Listens for one or more connections initiated by target VMs.
+     * The connector uses the given argument map
+     * in determining the address at which to listen or else it generates
+     * an appropriate listen address. In either case, an address string
+     * is returned from this method which can be used in starting target VMs
+     * to identify this connector. The format of the address string
+     * is connector, transport, and, possibly, platform dependent.
+     * <p>
+     * The argument map associates argument name strings to instances
+     * of {@link Connector.Argument}. The default argument map for a
+     * connector can be obtained through {@link Connector#defaultArguments}.
+     * Argument map values can be changed, but map entries should not be
+     * added or deleted.
+     * <p>
+     * This method does not return a {@link VirtualMachine}, and, normally,
+     * returns before any target VM initiates
+     * a connection. The connected target is obtained through
+     * {@link #accept} (using the same argument map as is passed to this
+     * method).
+     * <p>
+     * If <code>arguments</code> contains addressing information. and
+     * only one connection will be accepted, the {@link #accept accept} method
+     * can be called immediately without calling this method.
+     *
+     * @return the address at which the connector is listening
+     * for a connection.
+     * @throws java.io.IOException when unable to start listening.
+     * Specific exceptions are dependent on the Connector implementation
+     * in use.
+     * @throws IllegalConnectorArgumentsException when one of the
+     * connector arguments is invalid.
+     */
+    String startListening(Map<String,? extends Connector.Argument> arguments)
+        throws IOException, IllegalConnectorArgumentsException;
+
+    /**
+     * Cancels listening for connections. The given argument map should match
+     * the argument map given for a previous {@link #startListening} invocation.
+     *
+     * @throws java.io.IOException when unable to stop listening.
+     * Specific exceptions are dependent on the Connector implementation
+     * in use.
+     * @throws IllegalConnectorArgumentsException when one of the
+     * connector arguments is invalid.
+     */
+    void stopListening(Map<String,? extends Connector.Argument> arguments)
+        throws IOException, IllegalConnectorArgumentsException;
+
+
+    /**
+     * Waits for a target VM to attach to this connector.
+     *
+     * @throws TransportTimeoutException when the Connector encapsulates
+     * a transport that supports a timeout when accepting, a
+     * {@link Connector.Argument} representing a timeout has been set
+     * in the argument map, and a timeout occurs whilst waiting for
+     * the target VM to connect.
+     * @throws java.io.IOException when unable to accept.
+     * Specific exceptions are dependent on the Connector implementation
+     * in use.
+     * @throws IllegalConnectorArgumentsException when one of the
+     * connector arguments is invalid.
+     */
+    VirtualMachine accept(Map<String,? extends Connector.Argument> arguments)
+        throws IOException, IllegalConnectorArgumentsException;
+
+}
diff --git a/src/share/classes/com/sun/jdi/connect/Transport.java b/src/share/classes/com/sun/jdi/connect/Transport.java
new file mode 100644
index 0000000..102d64c
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/connect/Transport.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.connect;
+
+import com.sun.jdi.connect.spi.TransportService;        // for javadoc
+
+/**
+ * A method of communication between a debugger and a target VM.
+ *
+ * <p> A Transport represents the transport mechanism used by a
+ * {@link com.sun.jdi.connect.Connector Connector} to establish a
+ * connection with a target VM. It consists of a name which is obtained
+ * by invoking the {@link #name} method. Furthermore, a Transport
+ * encapsulates a {@link com.sun.jdi.connect.spi.TransportService
+ * TransportService} which is the underlying service used
+ * to establish connections and exchange Java Debug Wire Protocol
+ * (JDWP) packets with a target VM.
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+public interface Transport {
+    /**
+     * Returns a short identifier for the transport.
+     *
+     * @return the name of this transport.
+     */
+    String name();
+}
diff --git a/src/share/classes/com/sun/jdi/connect/TransportTimeoutException.java b/src/share/classes/com/sun/jdi/connect/TransportTimeoutException.java
new file mode 100644
index 0000000..1ede92b
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/connect/TransportTimeoutException.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.connect;
+
+/**
+ * This exception may be thrown as a result of a timeout
+ * when attaching to a target VM, or waiting to accept a
+ * connection from a target VM.
+ *
+ * <p> When attaching to a target VM, using {@link
+ * AttachingConnector#attach attach} this
+ * exception may be thrown if the connector supports a timeout
+ * {@link Connector.Argument connector argument}. Similiarly,
+ * when waiting to accept a connection from a target VM,
+ * using {@link ListeningConnector#accept accept} this
+ * exception may be thrown if the connector supports a
+ * timeout connector argument when accepting.
+ *
+ * <p> In addition, for developers creating {@link
+ * com.sun.jdi.connect.spi.TransportService TransportService}
+ * implementations this exception is thrown when
+ * {@link com.sun.jdi.connect.spi.TransportService#attach attach}
+ * times out when establishing a connection to a target VM,
+ * or {@link com.sun.jdi.connect.spi.TransportService#accept
+ * accept} times out while waiting for a target VM to connect. </p>
+ *
+ * @see AttachingConnector#attach
+ * @see ListeningConnector#accept
+ * @see com.sun.jdi.connect.spi.TransportService#attach
+ * @see com.sun.jdi.connect.spi.TransportService#accept
+ *
+ * @since 1.5
+ */
+@jdk.Exported
+public class TransportTimeoutException extends java.io.IOException {
+    private static final long serialVersionUID = 4107035242623365074L;
+    /**
+     * Constructs a <tt>TransportTimeoutException</tt> with no detail
+     * message.
+     */
+    public TransportTimeoutException() {
+    }
+
+
+    /**
+     * Constructs a <tt>TransportTimeoutException</tt> with the
+     * specified detail message.
+     *
+     * @param message the detail message pertaining to this exception.
+     */
+    public TransportTimeoutException(String message) {
+        super(message);
+    }
+
+}
diff --git a/src/share/classes/com/sun/jdi/connect/VMStartException.java b/src/share/classes/com/sun/jdi/connect/VMStartException.java
new file mode 100644
index 0000000..04c0629
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/connect/VMStartException.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.connect;
+
+/**
+ * A target VM was successfully launched, but terminated with an
+ * error before a connection could be established. This exception
+ * provides the {@link java.lang.Process} object for the launched
+ * target to help in diagnosing the problem.
+ *
+ * @author Gordon Hirsch
+ * @since  1.3
+ */
+@jdk.Exported
+public class VMStartException extends Exception {
+
+    private static final long serialVersionUID = 6408644824640801020L;
+    Process process;
+
+    public VMStartException(Process process) {
+        super();
+        this.process = process;
+    }
+
+    public VMStartException(String message,
+                            Process process) {
+        super(message);
+        this.process = process;
+    }
+
+    public Process process() {
+        return process;
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/connect/package-info.java b/src/share/classes/com/sun/jdi/connect/package-info.java
new file mode 100644
index 0000000..c444b75
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/connect/package-info.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * This package defines connections between the virtual machine
+ * using the JDI and the target virtual machine.
+ * In concert with {@link com.sun.jdi.VirtualMachineManager}
+ * it is the mechanism for launching, attaching, etc to
+ * target virtual machines.
+ * <p>
+ * Methods may be added to the interfaces in the JDI packages in future
+ * releases. Existing packages may be renamed if the JDI becomes a standard
+ * extension.
+ */
+
+@jdk.Exported
+package com.sun.jdi.connect;
diff --git a/src/share/classes/com/sun/jdi/connect/spi/ClosedConnectionException.java b/src/share/classes/com/sun/jdi/connect/spi/ClosedConnectionException.java
new file mode 100644
index 0000000..a324bc3
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/connect/spi/ClosedConnectionException.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.connect.spi;
+
+/**
+ * This exception may be thrown as a result of an asynchronous
+ * close of a {@link Connection} while an I/O operation is
+ * in progress.
+ *
+ * <p> When a thread is blocked in {@link Connection#readPacket
+ * readPacket} waiting for packet from a target VM the
+ * {@link Connection} may be closed asynchronous by another
+ * thread invokving the {@link Connection#close close} method.
+ * When this arises the thread in readPacket will throw this
+ * exception. Similiarly when a thread is blocked in
+ * {@link Connection#writePacket} the Connection may be closed.
+ * When this occurs the thread in writePacket will throw
+ * this exception.
+ *
+ * @see Connection#readPacket
+ * @see Connection#writePacket
+ *
+ * @since 1.5
+ */
+@jdk.Exported
+public class ClosedConnectionException extends java.io.IOException {
+    private static final long serialVersionUID = 3877032124297204774L;
+    /**
+     * Constructs a <tt>ClosedConnectionException</tt> with no detail
+     * message.
+     */
+    public ClosedConnectionException() {
+    }
+
+    /**
+     * Constructs a <tt>ClosedConnectionException</tt> with the
+     * specified detail message.
+     *
+     * @param message the detail message pertaining to this exception.
+     */
+    public ClosedConnectionException(String message) {
+        super(message);
+    }
+
+}
diff --git a/src/share/classes/com/sun/jdi/connect/spi/Connection.java b/src/share/classes/com/sun/jdi/connect/spi/Connection.java
new file mode 100644
index 0000000..36df964
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/connect/spi/Connection.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.connect.spi;
+
+import java.io.IOException;
+
+/**
+ * A connection between a debugger and a target VM which it debugs.
+ *
+ * <p> A Connection represents a bi-directional communication channel
+ * between a debugger and a target VM. A Connection is created when
+ * {@link com.sun.jdi.connect.spi.TransportService TransportService}
+ * establishes a connection and successfully handshakes with a target
+ * VM. A TransportService implementation provides a reliable
+ * JDWP packet transportation service and consequently a Connection
+ * provides a reliable flow of JDWP packets between the debugger
+ * and the target VM. A Connection is stream oriented, that is, the
+ * JDWP packets written to a connection are read by the target VM
+ * in the order in which they were written. Similiarly packets written
+ * to a Connection by the target VM are read by the debugger in the
+ * order in which they were written.
+ *
+ * <p> A connection is either open or closed. It is open upon creation,
+ * and remains open until it is closed. Once closed, it remains closed,
+ * and any attempt to invoke an I/O operation upon it will cause a
+ * {@link ClosedConnectionException} to be thrown. A connection can
+ * be tested by invoking the {@link #isOpen isOpen} method.
+ *
+ * <p> A Connection is safe for access by multiple concurrent threads,
+ * although at most one thread may be reading and at most one thread may
+ * be writing at any given time. </p>
+ *
+ * @since 1.5
+ */
+
+@jdk.Exported
+public abstract class Connection {
+
+    /**
+     * Reads a packet from the target VM.
+     *
+     * <p> Attempts to read a JDWP packet from the target VM.
+     * A read operation may block indefinitely and only returns
+     * when it reads all bytes of a packet, or in the case of a
+     * transport service that is based on a stream-oriented
+     * communication protocol, the end of stream is encountered.
+     *
+     * <p> Reading a packet does not do any integrity checking on
+     * the packet aside from a check that the length of the packet
+     * (as indicated by the value of the <tt>length</tt> field, the
+     * first four bytes of the packet) is 11 or more bytes.
+     * If the value of the <tt>length</tt> value is less then 11
+     * then an <tt>IOException</tt> is thrown.
+     *
+     * <p> Returns a byte array of a length equal to the length
+     * of the received packet, or a byte array of length 0 when an
+     * end of stream is encountered. If end of stream is encountered
+     * after some, but not all bytes of a packet, are read then it
+     * is considered an I/O error and an <tt>IOException</tt> is
+     * thrown. The first byte of the packet is stored in element
+     * <tt>0</tt> of the byte array, the second in element <tt>1</tt>,
+     * and so on. The bytes in the byte array are laid out as per the
+     * <a href="../../../../../../../../../technotes/guides/jpda/jdwp-spec.html">
+     * JDWP specification</a>. That is, all fields in the packet
+     * are in big endian order as per the JDWP specification.
+     *
+     * <p> This method may be invoked at any time.  If another thread has
+     * already initiated a {@link #readPacket readPacket} on this
+     * connection then the invocation of this method will block until the
+     * first operation is complete. </p>
+     *
+     * @return  the packet read from the target VM
+     *
+     * @throws  ClosedConnectionException
+     *          If the connection is closed, or another thread closes
+     *          the connection while the readPacket is in progress.
+     *
+     * @throws  java.io.IOException
+     *          If the length of the packet (as indictaed by the first
+     *          4 bytes) is less than 11 bytes, or an I/O error occurs.
+     *
+     *
+     */
+    public abstract byte[] readPacket() throws IOException;
+
+    /**
+     * Writes a packet to the target VM.
+     *
+     * <p> Attempts to write, or send, a JDWP packet to the target VM.
+     * A write operation only returns after writing the entire packet
+     * to the target VM. Writing the entire packet does not mean
+     * the entire packet has been transmitted to the target VM
+     * but rather that all bytes have been written to the
+     * transport service. A transport service based on a TCP/IP connection
+     * may, for example, buffer some or all of the packet before
+     * transmission on the network.
+     *
+     * <p> The byte array provided to this method should be laid out
+     * as per the <a
+     * href="../../../../../../../../../technotes/guides/jpda/jdwp-spec.html">
+     * JDWP specification</a>. That is, all fields in the packet
+     * are in big endian order. The first byte, that is element
+     * <tt>pkt[0]</tt>, is the first byte of the <tt>length</tt> field.
+     * <tt>pkt[1]</tt> is the second byte of the <tt>length</tt> field,
+     * and so on.
+     *
+     * <p> Writing a packet does not do any integrity checking on
+     * the packet aside from checking the packet length. Checking
+     * the packet length requires checking that the value of the
+     * <tt>length</tt> field (as indicated by the first four bytes
+     * of the packet) is 11 or greater. Consequently the length of
+     * the byte array provided to this method, that is
+     * <tt>pkt.length</tt>, must be 11 or more, and must be equal
+     * or greater than the value of the <tt>length</tt> field. If the
+     * length of the byte array is greater than the value of
+     * the <tt>length</tt> field then all bytes from element
+     * <tt>pkt[length]</tt> onwards are ignored. In other words,
+     * any additional bytes that follow the packet in the byte
+     * array are ignored and will not be transmitted to the target
+     * VM.
+     *
+     * <p> A write operation may block or may complete immediately.
+     * The exact circumstances when an operation blocks depends on
+     * the transport service. In the case of a TCP/IP connection to
+     * the target VM, the writePacket method may block if there is
+     * network congestion or there is insufficient space to buffer
+     * the packet in the underlying network system.
+     *
+     * <p> This method may be invoked at any time.  If another thread has
+     * already initiated a write operation upon this Connection then
+     * a subsequent invocation of this method will block until the first
+     * operation is complete. </p>
+     *
+     * @param   pkt
+     *          The packet to write to the target VM.
+     *
+     * @throws  ClosedConnectionException
+     *          If the connection is closed, or another thread closes
+     *          the connection while the write operation is in progress.
+     *
+     * @throws  java.io.IOException
+     *          If an I/O error occurs.
+     *
+     * @throws  IllegalArgumentException
+     *          If the value of the <tt>length</tt> field is invalid,
+     *          or the byte array is of insufficient length.
+     */
+    public abstract void writePacket(byte pkt[]) throws IOException;
+
+    /**
+     * Closes this connection.
+     *
+     * <p> If the connection is already closed then invoking this method
+     * has no effect. After a connection is closed, any further attempt
+     * calls to {@link #readPacket readPacket} or {@link #writePacket
+     * writePacket} will throw a {@link ClosedConnectionException}.
+     *
+     * <p> Any thread currently blocked in an I/O operation ({@link
+     * #readPacket readPacket} or {@link #writePacket writePacket})
+     * will throw a {@link ClosedConnectionException}).
+     *
+     * <p> This method may be invoked at any time.  If some other thread has
+     * already invoked it, however, then another invocation will block until
+     * the first invocation is complete, after which it will return without
+     * effect. </p>
+     *
+     * @throws  java.io.IOException
+     *          If an I/O error occurs
+     */
+    public abstract void close() throws IOException;
+
+    /**
+     * Tells whether or not this connection is open.  </p>
+     *
+     * @return <tt>true</tt> if, and only if, this connection is open
+     */
+    public abstract boolean isOpen();
+}
diff --git a/src/share/classes/com/sun/jdi/connect/spi/TransportService.java b/src/share/classes/com/sun/jdi/connect/spi/TransportService.java
new file mode 100644
index 0000000..f589424
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/connect/spi/TransportService.java
@@ -0,0 +1,380 @@
+/*
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.connect.spi;
+
+import java.io.IOException;
+import com.sun.jdi.connect.TransportTimeoutException;
+
+/**
+ * A transport service for connections between a debugger and
+ * a target VM.
+ *
+ * <p> A transport service is a concrete subclass of this class
+ * that has a zero-argument constructor and implements the abstract
+ * methods specified below. It is the underlying service
+ * used by a {@link com.sun.jdi.connect.Transport} for
+ * connections between a debugger and a target VM.
+ *
+ * <p> A transport service is used to establish a connection
+ * between a debugger and a target VM, and to transport Java
+ * Debug Wire Protocol (JDWP) packets over an underlying
+ * communication protocol. In essence a transport service
+ * implementation binds JDWP (as specified in the
+ * <a href="../../../../../../../../../technotes/guides/jpda/jdwp-spec.html">
+ * JDWP specification</a>) to an underlying communication
+ * protocol. A transport service implementation provides
+ * a reliable JDWP packet transportation service. JDWP
+ * packets are sent to and from the target VM without duplication
+ * or data loss. A transport service implementation may be
+ * based on an underlying communication protocol that is
+ * reliable or unreliable. If the underlying communication
+ * protocol is reliable then the transport service implementation
+ * may be relatively simple and may only need to transport JDWP
+ * packets as payloads of the underlying communication
+ * protocol. In the case of an unreliable communication
+ * protocol the transport service implementation may include
+ * additional protocol support in order to ensure that packets
+ * are not duplicated and that there is no data loss. The
+ * details of such protocols are specific to the implementation
+ * but may involve techniques such as the <i>positive
+ * acknowledgment with retransmission</i> technique used in
+ * protocols such as the Transmission Control Protocol (TCP)
+ * (see <a href="http://www.ietf.org/rfc/rfc0793.txt"> RFC 793
+ * </a>).
+ *
+ * <p> A transport service can be used to initiate a connection
+ * to a target VM. This is done by invoking the {@link #attach}
+ * method. Alternatively, a transport service can listen and
+ * accept connections initiated by a target VM. This is done
+ * by invoking the {@link #startListening(String)} method to
+ * put the transport into listen mode. Then the {@link #accept}
+ * method is used to accept a connection initiated by a
+ * target VM.
+ *
+ * @since 1.5
+ */
+
+@jdk.Exported
+public abstract class TransportService {
+
+    /**
+     * Returns a name to identify the transport service.
+     *
+     * @return  The name of the transport service
+     */
+    public abstract String name();
+
+    /**
+     * Returns a description of the transport service.
+     *
+     * @return  The description of the transport service
+     */
+    public abstract String description();
+
+    /**
+     * The transport service capabilities.
+     */
+    @jdk.Exported
+    public static abstract class Capabilities {
+
+        /**
+         * Tells whether or not this transport service can support
+         * multiple concurrent connections to a single address that
+         * it is listening on.
+         *
+         * @return  <tt>true</tt> if, and only if, this transport
+         *          service supports multiple connections.
+         */
+        public abstract boolean supportsMultipleConnections();
+
+
+        /**
+         * Tell whether or not this transport service supports a timeout
+         * when attaching to a target VM.
+         *
+         * @return      <tt>true</tt> if, and only if, this transport
+         *              service supports attaching with a timeout.
+         *
+         * @see #attach(String,long,long)
+         */
+        public abstract boolean supportsAttachTimeout();
+
+        /**
+         * Tell whether or not this transport service supports a
+         * timeout while waiting for a target VM to connect.
+         *
+         * @return  <tt>true</tt> if, and only if, this transport
+         *          service supports timeout while waiting for
+         *          a target VM to connect.
+         *
+         * @see #accept(TransportService.ListenKey,long,long)
+         */
+        public abstract boolean supportsAcceptTimeout();
+
+        /**
+         * Tells whether or not this transport service supports a
+         * timeout when handshaking with the target VM.
+         *
+         * @return  <tt>true</tt> if, and only if, this transport
+         *          service supports a timeout while handshaking
+         *          with the target VM.
+         *
+         * @see #attach(String,long,long)
+         * @see #accept(TransportService.ListenKey,long,long)
+         */
+        public abstract boolean supportsHandshakeTimeout();
+
+    }
+
+    /**
+     * Returns the capabilities of the transport service.
+     *
+     * @return  the transport service capabilities
+     */
+    public abstract Capabilities capabilities();
+
+    /**
+     * Attaches to the specified address.
+     *
+     * <p> Attaches to the specified address and returns a connection
+     * representing the bi-directional communication channel to the
+     * target VM.
+     *
+     * <p> Attaching to the target VM involves two steps:
+     * First, a connection is established to specified address. This
+     * is followed by a handshake to ensure that the connection is
+     * to a target VM. The handshake involves the exchange
+     * of a string <i>JDWP-Handshake</i> as specified in the <a
+     * href="../../../../../../../../../technotes/guides/jpda/jdwp-spec.html">
+     * Java Debug Wire Protocol</a> specification.
+     *
+     * @param   address
+     *          The address of the target VM.
+     *
+     * @param   attachTimeout
+     *          If this transport service supports an attach timeout,
+     *          and if <tt>attachTimeout</tt> is positive, then it specifies
+     *          the timeout, in milliseconds (more or less), to use
+     *          when attaching to the target VM.  If the transport service
+     *          does not support an attach timeout, or if <tt>attachTimeout</tt>
+     *          is specified as zero then attach without any timeout.
+     *
+     * @param   handshakeTimeout
+     *          If this transport service supports a handshake timeout,
+     *          and if <tt>handshakeTimeout</tt> is positive, then it
+     *          specifies the timeout, in milliseconds (more or less), to
+     *          use when handshaking with the target VM. The exact
+     *          usage of the timeout are specific to the transport service.
+     *          A transport service may, for example, use the handshake
+     *          timeout as the inter-character timeout while waiting for
+     *          the <i>JDWP-Handshake</i> message from the target VM.
+     *          Alternatively, a transport service may, for example,
+     *          use the handshakeTimeout as a timeout for the duration of the
+     *          handshake exchange.
+     *          If the transport service does not support a handshake
+     *          timeout, or if <tt>handshakeTimeout</tt> is specified
+     *          as zero then the handshake does not timeout if there
+     *          isn't a response from the target VM.
+     *
+     * @return  The Connection representing the bi-directional
+     *          communication channel to the target VM.
+     *
+     * @throws  TransportTimeoutException
+     *          If a timeout occurs while establishing the connection.
+     *
+     * @throws  IOException
+     *          If an I/O error occurs (including a timeout when
+     *          handshaking).
+     *
+     * @throws  IllegalArgumentException
+     *          If the address is invalid or the value of the
+     *          attach timeout or handshake timeout is negative.
+     *
+     * @see TransportService.Capabilities#supportsAttachTimeout()
+     */
+    public abstract Connection attach(String address, long attachTimeout,
+        long handshakeTimeout) throws IOException;
+
+    /**
+     * A <i>listen key</i>.
+     *
+     * <p> A <tt>TransportService</tt> may listen on multiple, yet
+     * different, addresses at the same time. To uniquely identify
+     * each <tt>listener</tt> a listen key is created each time that
+     * {@link #startListening startListening} is called. The listen
+     * key is used in calls to the {@link #accept accept} method
+     * to accept inbound connections to that listener. A listen
+     * key is valid until it is used as an argument to {@link
+     * #stopListening stopListening} to stop the transport
+     * service from listening on an address.
+     */
+    @jdk.Exported
+    public static abstract class ListenKey {
+
+        /**
+         * Returns a string representation of the listen key.
+         */
+        public abstract String address();
+    }
+
+    /**
+     * Listens on the specified address for inbound connections.
+     *
+     * <p> This method starts the transport service listening on
+     * the specified address so that it can subsequently accept
+     * an inbound connection. It does not wait until an inbound
+     * connection is established.
+     *
+     * @param   address
+     *          The address to start listening for connections,
+     *          or <tt>null</tt> to listen on an address chosen
+     *          by the transport service.
+     *
+     * @return  a listen key to be used in subsequent calls to be
+     *          {@link #accept accept} or {@link #stopListening
+     *          stopListening} methods.
+     *
+     * @throws  IOException
+     *          If an I/O error occurs.
+     *
+     * @throws  IllegalArgumentException
+     *          If the specific address is invalid
+     */
+    public abstract ListenKey startListening(String address) throws IOException;
+
+    /**
+     * Listens on an address chosen by the transport service.
+     *
+     * <p> This convenience method works as if by invoking {@link
+     * #startListening(String) startListening(<tt>null</tt>)}. </p>
+     *
+     * @return  a listen key to be used in subsequent calls to be
+     *          {@link #accept accept} or {@link #stopListening
+     *          stopListening} methods.
+     *
+     * @throws  IOException
+     *          If an I/O error occurs.
+     */
+    public abstract ListenKey startListening() throws IOException;
+
+    /**
+     * Stop listening for inbound connections.
+     *
+     * <p> Invoking this method while another thread is blocked
+     * in {@link #accept accept}, with the same listen key,
+     * waiting to accept a connection will cause that thread to
+     * throw an IOException. If the thread blocked in accept
+     * has already accepted a connection from a target VM and
+     * is in the process of handshaking with the target VM then
+     * invoking this method will not cause the thread to throw
+     * an exception.
+     *
+     * @param   listenKey
+     *          The listen key obtained from a previous call to {@link
+     *          #startListening(String)} or {@link #startListening()}.
+     *
+     * @throws  IllegalArgumentException
+     *          If the listen key is invalid
+     *
+     * @throws  IOException
+     *          If an I/O error occurs.
+     */
+    public abstract void stopListening(ListenKey listenKey) throws IOException;
+
+    /**
+     * Accept a connection from a target VM.
+     *
+     * <p> Waits (indefinitely or with timeout) to accept a connection
+     * from a target VM. Returns a connection representing the
+     * bi-directional communication channel to the target VM.
+     *
+     * <p> Accepting a connection from a target VM involves two
+     * steps. First, the transport service waits to accept
+     * the connection from the target VM. Once the connection is
+     * established a handshake is performed to ensure that the
+     * connection is indeed to a target VM. The handshake involves
+     * the exchange of a string <i>JDWP-Handshake</i> as specified
+     * in the <a
+     * href="../../../../../../../../../technotes/guides/jpda/jdwp-spec.html">
+     * Java Debug Wire Protocol</a> specification.
+     *
+     * @param   listenKey
+     *          A listen key obtained from a previous call to {@link
+     *          #startListening(String)} or {@link #startListening()}.
+     *
+     * @param   acceptTimeout
+     *          if this transport service supports an accept timeout, and
+     *          if <tt>acceptTimeout</tt> is positive then block for up to
+     *          <tt>acceptTimeout</tt> milliseconds, more or less, while waiting
+     *          for the target VM to connect.
+     *          If the transport service does not support an accept timeout
+     *          or if <tt>acceptTimeout</tt> is zero then block indefinitely
+     *          for a target VM to connect.
+     *
+     * @param   handshakeTimeout
+     *          If this transport service supports a handshake timeout,
+     *          and if <tt>handshakeTimeout</tt> is positive, then it
+     *          specifies the timeout, in milliseconds (more or less), to
+     *          use when handshaking with the target VM. The exact
+     *          usage of the timeout is specific to the transport service.
+     *          A transport service may, for example, use the handshake
+     *          timeout as the inter-character timeout while waiting for
+     *          the <i>JDWP-Handshake</i> message from the target VM.
+     *          Alternatively, a transport service may, for example,
+     *          use the timeout as a timeout for the duration of the
+     *          handshake exchange.
+     *          If the transport service does not support a handshake
+     *          timeout, of if <tt>handshakeTimeout</tt> is specified
+     *          as zero then the handshake does not timeout if there
+     *          isn't a response from the target VM.
+     *
+     * @return  The Connection representing the bi-directional
+     *          communication channel to the target VM.
+     *
+     * @throws  TransportTimeoutException
+     *          If a timeout occurs while waiting for a target VM
+     *          to connect.
+     *
+     * @throws  IOException
+     *          If an I/O error occurs (including a timeout when
+     *          handshaking).
+     *
+     * @throws  IllegalArgumentException
+     *          If the value of the acceptTimeout argument, or
+     *          handshakeTimeout is negative, or an invalid listen key
+     *          is provided.
+     *
+     * @throws  IllegalStateException
+     *          If {@link #stopListening stopListening} has already been
+     *          called with this listen key and the transport service
+     *          is no longer listening for inbound connections.
+     *
+     * @see TransportService.Capabilities#supportsAcceptTimeout()
+     */
+    public abstract Connection accept(ListenKey listenKey, long acceptTimeout,
+        long handshakeTimeout) throws IOException;
+
+}
diff --git a/src/share/classes/com/sun/jdi/connect/spi/package-info.java b/src/share/classes/com/sun/jdi/connect/spi/package-info.java
new file mode 100644
index 0000000..956e28d
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/connect/spi/package-info.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * This package comprises the interfaces and classes used to
+ * develop new {@link com.sun.jdi.connect.spi.TransportService}
+ * implementations.
+ */
+
+@jdk.Exported
+package com.sun.jdi.connect.spi;
diff --git a/src/share/classes/com/sun/jdi/doc-files/signature.html b/src/share/classes/com/sun/jdi/doc-files/signature.html
new file mode 100644
index 0000000..f7bdd8d
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/doc-files/signature.html
@@ -0,0 +1,39 @@
+<HTML>
+<HEAD>
+<TITLE>
+JDI Type Signatures
+</TITLE>
+</HEAD>
+<BODY BGCOLOR="white">
+<dl><dd>
+<Table Border="0">
+<caption><h2>JDI Type Signatures</h2></caption>
+<tr><th>Type Signature
+<th>Java Type
+<tr><td>Z<td>boolean
+<tr><td>B<td>byte
+<tr><td>C<td>char
+<tr><td>S<td>short
+<tr><td>I<td>int
+<tr><td>J<td>long
+<tr><td>F<td>float
+<tr><td>D<td>double
+<tr><td><strong>L</strong> <em>fully-qualified-class</em> 
+<strong>;</strong>
+<td>fully-qualified-class
+<tr><td><strong>[</strong> <em>type
+</em>
+<td><em>type</em>[]
+<tr><td>
+<strong>(</strong> <em>arg-types </em><strong>)</strong> <em>ret-type
+</em>
+<td>method type (including constructors)
+</Table>
+</dd></dl>
+<p>For example, the Java method:
+<p><pre>    long f (int n, String s, int[] arr);
+</pre>has the following type signature:
+<p><pre>    (ILjava/lang/String;[I)J
+</pre>
+</BODY>
+</HTML>
diff --git a/src/share/classes/com/sun/jdi/event/AccessWatchpointEvent.java b/src/share/classes/com/sun/jdi/event/AccessWatchpointEvent.java
new file mode 100644
index 0000000..b04d4f7
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/AccessWatchpointEvent.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+
+/**
+ * Notification of a field access in the target VM. Field modifications
+ * are not considered field accesses.
+ *
+ * @see EventQueue
+ * @see VirtualMachine
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface AccessWatchpointEvent extends WatchpointEvent {
+}
diff --git a/src/share/classes/com/sun/jdi/event/BreakpointEvent.java b/src/share/classes/com/sun/jdi/event/BreakpointEvent.java
new file mode 100644
index 0000000..565f4f0
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/BreakpointEvent.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+
+import java.util.List;
+
+/**
+ * Notification of a breakpoint in the target VM.
+ * The breakpoint event
+ * is generated before the code at its location is executed.
+ * When a location
+ * is reached which satisfies a currently enabled
+ * {@link com.sun.jdi.request.BreakpointRequest breakpoint request},
+ * an {@link EventSet event set}
+ * containing an instance of this class will be added
+ * to the VM's event queue.
+ *
+ * @see EventQueue
+ * @see VirtualMachine
+ * @see com.sun.jdi.request.BreakpointRequest
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface BreakpointEvent extends LocatableEvent {
+}
diff --git a/src/share/classes/com/sun/jdi/event/ClassPrepareEvent.java b/src/share/classes/com/sun/jdi/event/ClassPrepareEvent.java
new file mode 100644
index 0000000..2f0bf5a
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/ClassPrepareEvent.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+
+/**
+ * Notification of a class prepare in the target VM. See the JVM
+ * specification for a definition of class preparation. Class prepare
+ * events are not generated for primtiive classes (for example,
+ * java.lang.Integer.TYPE).
+ *
+ * @see EventQueue
+ * @see VirtualMachine
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ClassPrepareEvent extends Event {
+    /**
+     * Returns the thread in which this event has occurred.
+     * <p>
+     * In rare cases, this event may occur in a debugger system
+     * thread within the target VM. Debugger threads take precautions
+     * to prevent these events, but they cannot be avoided under some
+     * conditions, especially for some subclasses of
+     * {@link java.lang.Error}.
+     * If the event was generated by a debugger system thread, the
+     * value returned by this method is null, and if the requested
+     * suspend policy for the event was
+     * {@link com.sun.jdi.request.EventRequest#SUSPEND_EVENT_THREAD},
+     * all threads will be suspended instead, and the
+     * {@link EventSet#suspendPolicy} will reflect this change.
+     * <p>
+     * Note that the discussion above does not apply to system threads
+     * created by the target VM during its normal (non-debug) operation.
+     *
+     * @return a {@link ThreadReference} which mirrors the event's thread in
+     * the target VM, or null in the rare cases described above.
+     */
+    public ThreadReference thread();
+
+    /**
+     * Returns the reference type for which this event was generated.
+     *
+     * @return a {@link ReferenceType} which mirrors the class, interface, or
+     * array which has been linked.
+     */
+    public ReferenceType referenceType();
+}
diff --git a/src/share/classes/com/sun/jdi/event/ClassUnloadEvent.java b/src/share/classes/com/sun/jdi/event/ClassUnloadEvent.java
new file mode 100644
index 0000000..b900e6a
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/ClassUnloadEvent.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+
+/**
+ * Notification of a class unload in the target VM.
+ * <p>
+ * There are severe constraints on the debugger back-end during
+ * garbage collection, so unload information is greatly limited.
+ *
+ * @see EventQueue
+ * @see VirtualMachine
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ClassUnloadEvent extends Event {
+    /**
+     * Returns the name of the class that has been unloaded.
+     */
+    public String className();
+
+    /**
+     * Returns the JNI-style signature of the class that has been unloaded.
+     */
+    public String classSignature();
+}
diff --git a/src/share/classes/com/sun/jdi/event/Event.java b/src/share/classes/com/sun/jdi/event/Event.java
new file mode 100644
index 0000000..8e8185c
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/Event.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+import com.sun.jdi.request.EventRequest;
+
+/**
+ * An occurrence in a target VM that is of interest to a debugger. Event is
+ * the common superinterface for all events (examples include
+ * {@link BreakpointEvent}, {@link ExceptionEvent},
+ * {@link ClassPrepareEvent}).
+ * When an event occurs, an instance of Event as a component of
+ * an {@link EventSet} is enqueued in the
+ * {@link VirtualMachine}'s {@link EventQueue}.
+ *
+ * @see EventSet
+ * @see EventQueue
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface Event extends Mirror {
+
+    /**
+     * @return The {@link EventRequest} that requested this event.
+     * Some events (eg. {@link VMDeathEvent}) may not have
+     * a cooresponding request and thus will return null.
+     */
+    EventRequest request();
+}
diff --git a/src/share/classes/com/sun/jdi/event/EventIterator.java b/src/share/classes/com/sun/jdi/event/EventIterator.java
new file mode 100644
index 0000000..e16ccc5
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/EventIterator.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+
+import java.util.Iterator;
+
+/**
+ * EventIterators are unmodifiable.
+ *
+ * @see Event
+ * @see EventSet
+ * @see EventSet#iterator
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+
+@jdk.Exported
+public interface EventIterator extends Iterator<Event> {
+
+    /**
+     * @return The next {@link Event} in an {@link EventSet}.
+     */
+    Event nextEvent();
+}
diff --git a/src/share/classes/com/sun/jdi/event/EventQueue.java b/src/share/classes/com/sun/jdi/event/EventQueue.java
new file mode 100644
index 0000000..e7912ba
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/EventQueue.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+
+/**
+ * Manager of incoming debugger events for a target VM.
+ * Events are always grouped in {@link EventSet}s.
+ * EventSets generated by the debugger back end can be read
+ * here. There is one instance of EventQueue assigned to a particular
+ * {@link com.sun.jdi.VirtualMachine VirtualMachine}.
+ * <P>
+ * Some events cause the suspension of the target VM - event requests
+ * ({@link com.sun.jdi.request}) with a
+ * {@link com.sun.jdi.request.EventRequest#suspendPolicy() suspend policy}
+ * of {@link com.sun.jdi.request.EventRequest#SUSPEND_ALL SUSPEND_ALL}
+ * or {@link com.sun.jdi.request.EventRequest#SUSPEND_EVENT_THREAD
+ * SUSPEND_EVENT_THREAD} and sometimes
+ * {@link VMStartEvent}.
+ * If these suspensions are not resumed the target VM will hang.
+ * Thus, it is always good policy to
+ * {@link #remove() remove()} every EventSet from the
+ * event queue until an EventSet containing a
+ * {@link VMDisconnectEvent} is read.
+ * Unless {@link com.sun.jdi.VirtualMachine#resume() resume} is
+ * being handled in another way, each EventSet should invoke
+ * {@link EventSet#resume()}.
+ *
+ * @see EventSet
+ * @see VirtualMachine
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+
+@jdk.Exported
+public interface EventQueue extends Mirror {
+
+    /**
+     * Waits forever for the next available event.
+     *
+     * @return the next {@link EventSet}.
+     * @throws InterruptedException if any thread has interrupted
+     * this thread.
+     * @throws com.sun.jdi.VMDisconnectedException if the connection
+     * to the target VM is no longer available.  Note this will always
+     * be preceded by a {@link com.sun.jdi.event.VMDisconnectEvent}.
+     */
+    EventSet remove() throws InterruptedException;
+
+    /**
+     * Waits a specified time for the next available event.
+     *
+     * @param timeout Time in milliseconds to wait for the next event
+     * @return the next {@link EventSet}, or null if there is a timeout.
+     * @throws InterruptedException if any thread has interrupted
+     * this thread.
+     * @throws com.sun.jdi.VMDisconnectedException if the connection
+     * to the target VM is no longer available.  Note this will always
+     * be preceded by a {@link com.sun.jdi.event.VMDisconnectEvent}.
+     * @throws IllegalArgumentException if the timeout argument
+     * contains an illegal value.
+     */
+    EventSet remove(long timeout) throws InterruptedException;
+}
diff --git a/src/share/classes/com/sun/jdi/event/EventSet.java b/src/share/classes/com/sun/jdi/event/EventSet.java
new file mode 100644
index 0000000..bba0573
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/EventSet.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+
+import java.util.Set;
+
+/**
+ * Several {@link Event} objects may be created at a given time by
+ * the target {@link VirtualMachine}. For example, there may be
+ * more than one {@link com.sun.jdi.request.BreakpointRequest}
+ * for a given {@link Location}
+ * or you might single step to the same location as a
+ * BreakpointRequest.  These {@link Event} objects are delivered
+ * together as an EventSet.  For uniformity, an EventSet is always used
+ * to deliver {@link Event} objects.  EventSets are delivered by
+ * the {@link EventQueue}.
+ * EventSets are unmodifiable.
+ * <P>
+ * Associated with the issuance of an event set, suspensions may
+ * have occurred in the target VM.  These suspensions correspond
+ * with the {@link #suspendPolicy() suspend policy}.
+ * To assure matching resumes occur, it is recommended,
+ * where possible,
+ * to complete the processing of an event set with
+ * {@link #resume() EventSet.resume()}.
+ * <P>
+ * The events that are grouped in an EventSet are restricted in the
+ * following ways:
+ * <P>
+ * <UL>
+ * <LI>Always singleton sets:
+ *     <UL>
+ *     <LI>{@link VMStartEvent}
+ *     <LI>{@link VMDisconnectEvent}
+ *     </UL>
+ * <LI>Only with other VMDeathEvents:
+ *     <UL>
+ *     <LI>{@link VMDeathEvent}
+ *     </UL>
+ * <LI>Only with other ThreadStartEvents for the same thread:
+ *     <UL>
+ *     <LI>{@link ThreadStartEvent}
+ *     </UL>
+ * <LI>Only with other ThreadDeathEvents for the same thread:
+ *     <UL>
+ *     <LI>{@link ThreadDeathEvent}
+ *     </UL>
+ * <LI>Only with other ClassPrepareEvents for the same class:
+ *     <UL>
+ *     <LI>{@link ClassPrepareEvent}
+ *     </UL>
+ * <LI>Only with other ClassUnloadEvents for the same class:
+ *     <UL>
+ *     <LI>{@link ClassUnloadEvent}
+ *     </UL>
+ * <LI>Only with other AccessWatchpointEvents for the same field access:
+ *     <UL>
+ *     <LI>{@link AccessWatchpointEvent}
+ *     </UL>
+ * <LI>Only with other ModificationWatchpointEvents for the same field
+ * modification:
+ *     <UL>
+ *     <LI>{@link ModificationWatchpointEvent}
+ *     </UL>
+ * <LI>Only with other ExceptionEvents for the same exception occurrance:
+ *     <UL>
+ *     <LI>{@link ExceptionEvent}
+ *     </UL>
+ * <LI>Only with other MethodExitEvents for the same method exit:
+ *     <UL>
+ *     <LI>{@link MethodExitEvent}
+ *     </UL>
+ * <LI>Only with other Monitor contended enter events for the same monitor object:
+ *     <UL>
+ *     <LI>Monitor Contended Enter Event
+ *     </UL>
+ * <LI>Only with other Monitor contended entered events for the same monitor object:
+ *     <UL>
+ *     <LI>Monitor Contended Entered Event
+ *    </UL>
+ * <LI>Only with other Monitor wait events for the same monitor object:
+ *     <UL>
+ *     <LI>Monitor Wait Event
+ *     </UL>
+ * <LI>Only with other Monitor waited events for the same monitor object:
+ *     <UL>
+ *     <LI>Monitor Waited Event
+ *     </UL>
+ * <LI>Only with other members of this group, at the same location
+ * and in the same thread:
+ *     <UL>
+ *     <LI>{@link BreakpointEvent}
+ *     <LI>{@link StepEvent}
+ *     <LI>{@link MethodEntryEvent}
+ *     </UL>
+ * </UL>
+ *
+ * @see Event
+ * @see EventQueue
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+
+@jdk.Exported
+public interface EventSet extends Mirror, Set<Event> {
+
+    /**
+     * Returns the policy used to suspend threads in the target VM
+     * for this event set. This policy is selected from the suspend
+     * policies for each event's request; the target VM chooses the
+     * policy which suspends the most threads.  The target VM
+     * suspends threads according to that policy
+     * and that policy is returned here. See
+     * {@link com.sun.jdi.request.EventRequest} for the possible
+     * policy values.
+     * <p>
+     * In rare cases, the suspend policy may differ from the requested
+     * value if a {@link ClassPrepareEvent} has occurred in a
+     * debugger system thread. See {@link ClassPrepareEvent#thread}
+     * for details.
+     *
+     * @return the suspendPolicy which is either
+     * {@link com.sun.jdi.request.EventRequest#SUSPEND_ALL SUSPEND_ALL},
+     * {@link com.sun.jdi.request.EventRequest#SUSPEND_EVENT_THREAD SUSPEND_EVENT_THREAD} or
+     * {@link com.sun.jdi.request.EventRequest#SUSPEND_NONE SUSPEND_NONE}.
+     */
+    int suspendPolicy();
+
+    /**
+     * Return an iterator specific to {@link Event} objects.
+     */
+    EventIterator eventIterator();
+
+    /**
+     * Resumes threads suspended by this event set. If the {@link #suspendPolicy}
+     * is {@link com.sun.jdi.request.EventRequest#SUSPEND_ALL}, a call
+     * to this method is equivalent to
+     * {@link com.sun.jdi.VirtualMachine#resume}. If the
+     * suspend policy is
+     * {@link com.sun.jdi.request.EventRequest#SUSPEND_EVENT_THREAD},
+     * a call to this method is equivalent to
+     * {@link com.sun.jdi.ThreadReference#resume} for the event thread.
+     * Otherwise, a call to this method is a no-op.
+     */
+    void resume();
+}
diff --git a/src/share/classes/com/sun/jdi/event/ExceptionEvent.java b/src/share/classes/com/sun/jdi/event/ExceptionEvent.java
new file mode 100644
index 0000000..91ed8e4
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/ExceptionEvent.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+
+/**
+ * Notification of an exception in the target VM. When an exception
+ * is thrown which satisfies a currently enabled
+ * {@link com.sun.jdi.request.ExceptionRequest exception request},
+ * an {@link EventSet event set}
+ * containing an instance of this class will be added
+ * to the VM's event queue.
+ * If the exception is thrown from a non-native method,
+ * the exception event is generated at the location where the
+ * exception is thrown.
+ * If the exception is thrown from a native method, the exception event
+ * is generated at the first non-native location reached after the exception
+ * is thrown.
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ExceptionEvent extends LocatableEvent {
+
+    /**
+     * Gets the thrown exception object. The exception object is
+     * an instance of {@link java.lang.Throwable} or a subclass in the
+     * target VM.
+     *
+     * @return an {@link ObjectReference} which mirrors the thrown object in
+     * the target VM.
+     */
+    public ObjectReference exception();
+
+    /**
+     * Gets the location where the exception will be caught. An exception
+     * is considered to be caught if, at the point of the throw, the
+     * current location is dynamically enclosed in a try statement that
+     * handles the exception. (See the JVM specification for details).
+     * If there is such a try statement, the catch location is the
+     * first code index of the appropriate catch clause.
+     * <p>
+     * If there are native methods in the call stack at the time of the
+     * exception, there are important restrictions to note about the
+     * returned catch location. In such cases,
+     * it is not possible to predict whether an exception will be handled
+     * by some native method on the call stack.
+     * Thus, it is possible that exceptions considered uncaught
+     * here will, in fact, be handled by a native method and not cause
+     * termination of the target VM. Furthermore, it cannot be assumed that the
+     * catch location returned here will ever be reached by the throwing
+     * thread. If there is
+     * a native frame between the current location and the catch location,
+     * the exception might be handled and cleared in that native method
+     * instead.
+     * <p>
+     * Note that the compiler can generate try-catch blocks in some cases
+     * where they are not explicit in the source code; for example,
+     * the code generated for <code>synchronized</code> and
+     * <code>finally</code> blocks can contain implicit try-catch blocks.
+     * If such an implicitly generated try-catch is
+     * present on the call stack at the time of the throw, the exception
+     * will be considered caught even though it appears to be uncaught from
+     * examination of the source code.
+     *
+     * @return the {@link Location} where the exception will be caught or null if
+     * the exception is uncaught.
+     */
+    public Location catchLocation();
+}
diff --git a/src/share/classes/com/sun/jdi/event/LocatableEvent.java b/src/share/classes/com/sun/jdi/event/LocatableEvent.java
new file mode 100644
index 0000000..ab4d7f5
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/LocatableEvent.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+
+import java.util.List;
+
+/**
+ * Abstract superinterface of events which have both location
+ * and thread.
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface LocatableEvent extends Event, Locatable {
+
+    /**
+     * Returns the thread in which this event has occurred.
+     *
+     * @return a {@link ThreadReference} which mirrors the event's thread in
+     * the target VM.
+     */
+    public ThreadReference thread();
+}
diff --git a/src/share/classes/com/sun/jdi/event/MethodEntryEvent.java b/src/share/classes/com/sun/jdi/event/MethodEntryEvent.java
new file mode 100644
index 0000000..29e4df6
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/MethodEntryEvent.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+
+/**
+ * Notification of a method invocation in the target VM. This event
+ * occurs after entry into the invoked method and before any
+ * code has executed.
+ * Method entry events are generated for both native and non-native
+ * methods.
+ * <P>
+ * In some VMs method entry events can occur for a particular thread
+ * before its {@link ThreadStartEvent} occurs if methods are called
+ * as part of the thread's initialization.
+ *
+ * @see EventQueue
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface MethodEntryEvent extends LocatableEvent {
+
+    /**
+     * Returns the method that was entered.
+     *
+     * @return a {@link Method} which mirrors the method that was entered.
+     */
+    public Method method();
+}
diff --git a/src/share/classes/com/sun/jdi/event/MethodExitEvent.java b/src/share/classes/com/sun/jdi/event/MethodExitEvent.java
new file mode 100644
index 0000000..6c7ad30
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/MethodExitEvent.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+
+/**
+ * Notification of a method return in the target VM. This event
+ * is generated after all code in the method has executed, but the
+ * location of this event is the last executed location in the method.
+ * Method exit events are generated for both native and non-native
+ * methods. Method exit events are not generated if the method terminates
+ * with a thrown exception.
+ *
+ * @see EventQueue
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface MethodExitEvent extends LocatableEvent {
+
+    /**
+     * Returns the method that was exited.
+     *
+     * @return a {@link Method} which mirrors the method that was exited.
+     * @throws ObjectCollectedException may be thrown if class
+     * has been garbage collected.
+     */
+    public Method method();
+
+    /**
+     * Returns the value that the method will return.
+     *
+     * Not all target virtual machines support this operation.
+     * Use
+     * {@link VirtualMachine#canGetMethodReturnValues() canGetMethodReturnValues()}
+     * to determine if this operation is supported.
+     *
+     * @return a {@link Value} which mirrors the value to be returned.
+     *
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation - see
+     * {@link VirtualMachine#canGetMethodReturnValues() canGetMethodReturnValues()}
+     *
+     * @since 1.6
+     */
+
+    public Value returnValue();
+}
diff --git a/src/share/classes/com/sun/jdi/event/ModificationWatchpointEvent.java b/src/share/classes/com/sun/jdi/event/ModificationWatchpointEvent.java
new file mode 100644
index 0000000..965a6cd
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/ModificationWatchpointEvent.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+
+/**
+ * Notification of a field modification in the
+ * target VM.
+ *
+ * @see EventQueue
+ * @see VirtualMachine
+ * @see com.sun.jdi.request.ModificationWatchpointRequest
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ModificationWatchpointEvent extends WatchpointEvent {
+
+    /**
+     * Value that will be assigned to the field when the instruction
+     * completes.
+     */
+    Value valueToBe();
+}
diff --git a/src/share/classes/com/sun/jdi/event/MonitorContendedEnterEvent.java b/src/share/classes/com/sun/jdi/event/MonitorContendedEnterEvent.java
new file mode 100644
index 0000000..0890d12
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/MonitorContendedEnterEvent.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+
+/**
+ *
+ *  Notification that a thread in the target VM is attempting
+ *  to enter a monitor that is already acquired by another thread.
+ * <P>
+ *
+ * @see EventQueue
+ * @see MonitorContendedEnteredEvent
+ *
+ *
+ * @author Swamy Venkataramanappa
+ * @since  1.6
+ */
+@jdk.Exported
+public interface MonitorContendedEnterEvent extends LocatableEvent {
+
+    /**
+     * Returns the thread in which this event has occurred.
+     * <p>
+     *
+     * @return a {@link ThreadReference} which mirrors the event's thread in
+     * the target VM.
+     */
+    public ThreadReference thread();
+
+    /**
+     * Returns the method that was entered.
+     *
+     * @return an {@link ObjectReference} for the monitor.
+     */
+    public ObjectReference  monitor();
+}
diff --git a/src/share/classes/com/sun/jdi/event/MonitorContendedEnteredEvent.java b/src/share/classes/com/sun/jdi/event/MonitorContendedEnteredEvent.java
new file mode 100644
index 0000000..f249c18
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/MonitorContendedEnteredEvent.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+
+/**
+ *
+ *  Notification that a thread in the target VM is entering a monitor
+ *  after waiting for it to be released by another thread.
+ * <P>
+ *
+ * @see EventQueue
+ * @see MonitorContendedEnterEvent
+ *
+ * @author Swamy Venkataramanappa
+ * @since  1.6
+ */
+@jdk.Exported
+public interface MonitorContendedEnteredEvent extends LocatableEvent {
+
+    /**
+     * Returns the thread in which this event has occurred.
+     * <p>
+     *
+     * @return a {@link ThreadReference} which mirrors the event's thread in
+     * the target VM.
+     */
+    public ThreadReference thread();
+
+    /**
+     * Returns the monitor that was entered.
+     *
+     * @return an {@link ObjectReference} for the monitor.
+     */
+    public ObjectReference  monitor();
+
+}
diff --git a/src/share/classes/com/sun/jdi/event/MonitorWaitEvent.java b/src/share/classes/com/sun/jdi/event/MonitorWaitEvent.java
new file mode 100644
index 0000000..6cd32a6
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/MonitorWaitEvent.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+
+/**
+ * Notification that a thread in the target VM is about to
+ * wait on a monitor object.
+ * <P>
+ *
+ * @see EventQueue
+ * @see MonitorWaitedEvent
+ *
+ * @author Swamy Venkataramanappa
+ * @since  1.6
+ */
+@jdk.Exported
+public interface MonitorWaitEvent extends LocatableEvent {
+
+    /**
+     * Returns the thread in which monitor wait event has occurred.
+     * <p>
+     *
+     * @return a {@link ThreadReference} which mirrors the event's thread in
+     * the target VM.
+     */
+    public ThreadReference thread();
+
+    /**
+     * Returns the monitor object that the thread about to wait.
+     *
+     * @return an {@link ObjectReference} for the monitor.
+     */
+    public ObjectReference  monitor();
+
+    /**
+     * Returns the number of millisecond the thread will wait.
+     *
+     * @return a <code>jlong</code> containing monitor wait time in milliseconds.
+     */
+    public long  timeout();
+}
diff --git a/src/share/classes/com/sun/jdi/event/MonitorWaitedEvent.java b/src/share/classes/com/sun/jdi/event/MonitorWaitedEvent.java
new file mode 100644
index 0000000..f79cf03
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/MonitorWaitedEvent.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+
+/**
+ * Notification that a thread in the target VM has finished
+ * waiting on an monitor object.
+ * <P>
+ *
+ * @see EventQueue
+ * @see MonitorWaitEvent
+ *
+ * @author Swamy Venkataramanappa
+ * @since  1.6
+ */
+@jdk.Exported
+public interface MonitorWaitedEvent extends LocatableEvent {
+
+    /**
+     * Returns the thread in which this event has occurred.
+     * <p>
+     *
+     * @return a {@link ThreadReference} which mirrors the event's thread in
+     * the target VM.
+     */
+    public ThreadReference thread();
+
+    /**
+     * Returns the monitor object this thread waited on.
+     *
+     * @return an {@link ObjectReference} for the monitor.
+     */
+    public ObjectReference  monitor();
+
+    /**
+     * Returns whether the wait has timed out or been interrupted.
+     *
+     * @return <code>true</code> if the wait is timed out.
+     */
+    public boolean  timedout();
+
+
+}
diff --git a/src/share/classes/com/sun/jdi/event/StepEvent.java b/src/share/classes/com/sun/jdi/event/StepEvent.java
new file mode 100644
index 0000000..2790787
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/StepEvent.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+
+/**
+ * Notification of step completion in the target VM.
+ * The step event
+ * is generated immediately before the code at its location is executed;
+ * thus, if the step is entering a new method (as might occur with
+ * {@link com.sun.jdi.request.StepRequest#STEP_INTO StepRequest.STEP_INTO})
+ * the location of the event is the first instruction of the method.
+ * When a step leaves a method, the location of the event will be the
+ * first instruction after the call in the calling method; note that
+ * this location may not be at a line boundary, even if
+ * {@link com.sun.jdi.request.StepRequest#STEP_LINE StepRequest.STEP_LINE}
+ * was used.
+ *
+ * @see com.sun.jdi.request.StepRequest
+ * @see EventQueue
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface StepEvent extends LocatableEvent {
+}
diff --git a/src/share/classes/com/sun/jdi/event/ThreadDeathEvent.java b/src/share/classes/com/sun/jdi/event/ThreadDeathEvent.java
new file mode 100644
index 0000000..cd23380
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/ThreadDeathEvent.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+
+/**
+ * Notification of a completed thread in the target VM. The
+ * notification is generated by the dying thread before it terminates.
+ * Because of this timing, it is possible
+ * for {@link VirtualMachine#allThreads} to return this thread
+ * after this event is received.
+ * <p>
+ * Note that this event gives no information
+ * about the lifetime of the thread object. It may or may not be collected
+ * soon depending on what references exist in the target VM.
+ *
+ * @see EventQueue
+ * @see VirtualMachine
+ * @see ThreadReference
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ThreadDeathEvent extends Event {
+    /**
+     * Returns the thread which is terminating.
+     *
+     * @return a {@link ThreadReference} which mirrors the event's thread in
+     * the target VM.
+     */
+    public ThreadReference thread();
+}
diff --git a/src/share/classes/com/sun/jdi/event/ThreadStartEvent.java b/src/share/classes/com/sun/jdi/event/ThreadStartEvent.java
new file mode 100644
index 0000000..01e9e63
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/ThreadStartEvent.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+
+/**
+ * Notification of a new running thread in the target VM.
+ * The new thread can be the result of a call to
+ * <code>{@link java.lang.Thread#start}</code> or the result of
+ * attaching a new thread to the VM though JNI. The
+ * notification is generated by the new thread some time before
+ * its execution starts.
+ * Because of this timing, it is possible to receive other events
+ * for the thread before this event is received. (Notably,
+ * {@link MethodEntryEvent}s and {@link MethodExitEvent}s might occur
+ * during thread initialization.)
+ * It is also possible for {@link VirtualMachine#allThreads} to return
+ * a new started thread before this event is received.
+ * <p>
+ * Note that this event gives no information
+ * about the creation of the thread object which may have happened
+ * much earlier, depending on the VM being debugged.
+ *
+ * @see EventQueue
+ * @see VirtualMachine
+ * @see ThreadReference
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ThreadStartEvent extends Event {
+    /**
+     * Returns the thread which has started.
+     *
+     * @return a {@link ThreadReference} which mirrors the event's thread in
+     * the target VM.
+     */
+    public ThreadReference thread();
+}
diff --git a/src/share/classes/com/sun/jdi/event/VMDeathEvent.java b/src/share/classes/com/sun/jdi/event/VMDeathEvent.java
new file mode 100644
index 0000000..c96aa12
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/VMDeathEvent.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+
+/**
+ * Notification of target VM termination.
+ * This event occurs if the target VM terminates before the
+ * VM disconnects ({@link VMDisconnectEvent}).
+ * Thus, this event will NOT occur if
+ * external forces terminate the connection (e.g. a crash)
+ * or if the connection is intentionally terminated with
+ * {@link com.sun.jdi.VirtualMachine#dispose()
+ *      VirtualMachine.dispose()}
+ * <P>
+ * On VM termination, a single unsolicited VMDeathEvent
+ * will always be sent with a
+ * {@link com.sun.jdi.request.EventRequest#suspendPolicy() suspend policy}
+ * of {@link com.sun.jdi.request.EventRequest#SUSPEND_NONE SUSPEND_NONE}.
+ * Additional VMDeathEvents will be sent in the same event set if they are
+ * requested with a
+ * {@link com.sun.jdi.request.VMDeathRequest VMDeathRequest}.
+ * <P>
+ * The VM is still intact and can be queried at the point this
+ * event was initiated but immediately thereafter it is not
+ * considered intact and cannot be queried.
+ * Note: If the enclosing {@link EventSet} has a
+ * {@link com.sun.jdi.request.EventRequest#suspendPolicy() suspend policy}
+ * other than
+ * {@link com.sun.jdi.request.EventRequest#SUSPEND_ALL SUSPEND_ALL}
+ * the initiating point may be long past.
+ * <P>
+ * All VMDeathEvents will be in a single {@link EventSet},
+ * no other events will be in the event set.  A resume
+ * must occur to continue execution after any event set which
+ * performs suspensions - in this case to allow proper shutdown.
+ *
+ * @see VMDisconnectEvent
+ * @see com.sun.jdi.request.EventRequestManager#createVMDeathRequest
+ * @see com.sun.jdi.request.VMDeathRequest
+ * @see EventQueue
+ * @see VirtualMachine
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface VMDeathEvent extends Event {
+}
diff --git a/src/share/classes/com/sun/jdi/event/VMDisconnectEvent.java b/src/share/classes/com/sun/jdi/event/VMDisconnectEvent.java
new file mode 100644
index 0000000..82c49e2
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/VMDisconnectEvent.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+
+/**
+ * Notification of disconnection from target VM.
+ * May be caused by normal termination of a VM,
+ * VM termination by uncaught exception or other error,
+ * debugger action (
+ * {@link VirtualMachine#dispose} or
+ * {@link VirtualMachine#exit}) or by external events
+ * (for example, target process termination by the
+ * operating system, transport termination, etc).
+ * <p>
+ * If the target VM terminates before the disconnection, this event
+ * will be preceded by a {@link VMDeathEvent}.
+ * <p>
+ * This event is always sent.
+ * There is no corresponding {@link com.sun.jdi.request.EventRequest}.
+ * The enclosing singleton {@link EventSet} always has a
+ * suspend policy of {@link com.sun.jdi.request.EventRequest#SUSPEND_NONE}.
+ *
+ * @see VMDeathEvent
+ * @see EventQueue
+ * @see VirtualMachine
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface VMDisconnectEvent extends Event {
+}
diff --git a/src/share/classes/com/sun/jdi/event/VMStartEvent.java b/src/share/classes/com/sun/jdi/event/VMStartEvent.java
new file mode 100644
index 0000000..586526a
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/VMStartEvent.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+
+/**
+ * Notification of initialization of a target VM.  This event is
+ * received before the main thread is started and before any
+ * application code has been executed. Before this event occurs
+ * a significant amount of system code has executed and a number
+ * of system classes have been loaded.
+ * This event is always generated by the target VM, even
+ * if not explicitly requested.
+ *
+ * @see VMDeathEvent
+ * @see EventQueue
+ * @see VirtualMachine
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface VMStartEvent extends Event {
+    /**
+     * Returns the initial thread of the VM which has started.
+     *
+     * @return a {@link ThreadReference} which mirrors the event's thread in
+     * the target VM.
+     */
+    public ThreadReference thread();
+}
diff --git a/src/share/classes/com/sun/jdi/event/WatchpointEvent.java b/src/share/classes/com/sun/jdi/event/WatchpointEvent.java
new file mode 100644
index 0000000..0246bff
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/WatchpointEvent.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.event;
+
+import com.sun.jdi.*;
+
+/**
+ * Notification of a field triggered event encountered by a thread in the
+ * target VM.
+ *
+ * @see EventQueue
+ * @see VirtualMachine
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface WatchpointEvent extends LocatableEvent {
+
+    /**
+     * Returns the field that is about to be accessed/modified.
+     *
+     * @return a {@link Field} which mirrors the field
+     * in the target VM.
+     * @throws ObjectCollectedException may be thrown if class
+     * has been garbage collected.
+     */
+    Field field();
+
+    /**
+     * Returns the object whose field is about to be accessed/modified.
+     * Return null is the access is to a static field.
+     *
+     * @return a {@link ObjectReference} which mirrors the event's
+     * object in the target VM.
+     */
+    ObjectReference object();
+
+    /**
+     * Current value of the field.
+     * @throws ObjectCollectedException if object or class have been
+     * garbage collected.
+     */
+    Value valueCurrent();
+}
diff --git a/src/share/classes/com/sun/jdi/event/package-info.java b/src/share/classes/com/sun/jdi/event/package-info.java
new file mode 100644
index 0000000..fa9afe3
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/event/package-info.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * This package defines JDI events and event processing.
+ * An {@link com.sun.jdi.event.Event} is always a member of an
+ * {@link com.sun.jdi.event.EventSet}, which
+ * is retrieved from the {@link com.sun.jdi.event.EventQueue}.
+ * Examples of Events include
+ * {@link com.sun.jdi.event.BreakpointEvent "breakpoints events"},
+ * {@link com.sun.jdi.event.ThreadStartEvent "thread creation events"} and
+ * {@link com.sun.jdi.event.VMDeathEvent "virtual machine death event"}.
+ *  With the exception
+ * of termination events, all events received must be requested with an
+ * {@link com.sun.jdi.request.EventRequest "EventRequest"}.  The
+ * {@link com.sun.jdi.request} package defines event requests and event
+ * request management.
+ * <p>
+ * Methods may be added to the interfaces in the JDI packages in future
+ * releases. Existing packages may be renamed if the JDI becomes a standard
+ * extension.
+ */
+
+@jdk.Exported
+package com.sun.jdi.event;
diff --git a/src/share/classes/com/sun/jdi/package-info.java b/src/share/classes/com/sun/jdi/package-info.java
new file mode 100644
index 0000000..00f422f
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/package-info.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * This is the core package of the Java Debug
+ * Interface (JDI), it defines mirrors for values, types, and the target
+ * VirtualMachine itself - as well bootstrapping facilities.
+ * {@link com.sun.jdi.VirtualMachine} mirrors the target virtual machine and
+ * is the origin of all information provided by the JDI.  A VirtualMachine
+ * is typically created by using the
+ * {@link com.sun.jdi.VirtualMachineManager} to create
+ * a connection to the target virtual machine (see the
+ * {@link com.sun.jdi.connect} package).  In turn the
+ * {@link com.sun.jdi.VirtualMachineManager} is typically created by calling
+ * {@link com.sun.jdi.Bootstrap#virtualMachineManager()}.
+ * <p>
+ * Most of the methods within this package can throw the unchecked exception
+ * {@link com.sun.jdi.VMDisconnectedException}.
+ * <p>
+ * Methods may be added to the interfaces in the JDI packages in future
+ * releases. Existing packages may be renamed if the JDI becomes a standard
+ * extension.
+ */
+
+@jdk.Exported
+package com.sun.jdi;
diff --git a/src/share/classes/com/sun/jdi/request/AccessWatchpointRequest.java b/src/share/classes/com/sun/jdi/request/AccessWatchpointRequest.java
new file mode 100644
index 0000000..03d64f9
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/request/AccessWatchpointRequest.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.request;
+
+import com.sun.jdi.*;
+
+/**
+ * Request for notification when the contents of a field are accessed
+ * in the target VM.
+ * This event will be triggered when the specified field is accessed
+ * by Java<SUP><FONT SIZE="-2">TM</FONT></SUP> programming
+ * language code or by a
+ * Java Native Interface (JNI) get function (<code>Get&lt;Type&gt;Field,
+ * GetStatic&lt;Type&gt;Field</code>).
+ * Access by JDI does not trigger this event.
+ * When an enabled AccessWatchpointRequest is satisfied, an
+ * {@link com.sun.jdi.event.EventSet event set} containing an
+ * {@link com.sun.jdi.event.AccessWatchpointEvent AccessWatchpointEvent} will be placed
+ * on the {@link com.sun.jdi.event.EventQueue EventQueue}.
+ * The collection of existing ExceptionRequests is
+ * managed by the {@link EventRequestManager}
+ * The collection of existing
+ * watchpoints is
+ * managed by the {@link EventRequestManager}.
+ * <p>
+ * Note that the modification
+ * of a Field is not considered an access.
+ *
+ * @see ModificationWatchpointRequest
+ * @see com.sun.jdi.event.EventQueue
+ * @see EventRequestManager
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface AccessWatchpointRequest extends WatchpointRequest {
+}
diff --git a/src/share/classes/com/sun/jdi/request/BreakpointRequest.java b/src/share/classes/com/sun/jdi/request/BreakpointRequest.java
new file mode 100644
index 0000000..c6d937e
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/request/BreakpointRequest.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.request;
+
+import com.sun.jdi.*;
+
+/**
+ * Identifies a {@link Location} in the target VM at which
+ * execution should be stopped. When an enabled BreakpointRequest is
+ * satisfied, an
+ * {@link com.sun.jdi.event.EventSet event set} containing an
+ * {@link com.sun.jdi.event.BreakpointEvent BreakpointEvent}
+ * will be placed on the
+ * {@link com.sun.jdi.event.EventQueue EventQueue} and
+ * the application is interrupted. The collection of existing breakpoints is
+ * managed by the {@link EventRequestManager}
+ *
+ * @see Location
+ * @see com.sun.jdi.event.BreakpointEvent
+ * @see com.sun.jdi.event.EventQueue
+ * @see EventRequestManager
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface BreakpointRequest extends EventRequest, Locatable {
+
+    /**
+     * Returns the location of the requested breakpoint.
+     *
+     * @return the {@link Location} where this breakpoint has been set.
+     */
+    Location location();
+
+    /**
+     * Restricts the events generated by this request to those in
+     * the given thread.
+     * @param thread the thread to filter on.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addThreadFilter(ThreadReference thread);
+
+    /**
+     * Restricts the events generated by this request to those in
+     * which the currently executing instance is the object
+     * specified.
+     * <P>
+     * Not all targets support this operation.
+     * Use {@link VirtualMachine#canUseInstanceFilters()}
+     * to determine if the operation is supported.
+     * @since 1.4
+     * @param instance the object which must be the current instance
+     * in order to pass this filter.
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addInstanceFilter(ObjectReference instance);
+}
diff --git a/src/share/classes/com/sun/jdi/request/ClassPrepareRequest.java b/src/share/classes/com/sun/jdi/request/ClassPrepareRequest.java
new file mode 100644
index 0000000..4bd1b78
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/request/ClassPrepareRequest.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.request;
+
+import com.sun.jdi.*;
+
+/**
+ * Request for notification when a class is prepared in the target VM.
+ * When an enabled ClassPrepareRequest is satisfied, an
+ * {@link com.sun.jdi.event.EventSet event set} containing a
+ * {@link com.sun.jdi.event.ClassPrepareEvent ClassPrepareEvent}
+ * will be placed on the
+ * {@link com.sun.jdi.event.EventQueue EventQueue}.
+ * The collection of existing ClassPrepareRequests is
+ * managed by the {@link EventRequestManager}
+ * <p>
+ * Class preparation is defined in the Java Virtual Machine
+ * Specification.
+ *
+ * @see com.sun.jdi.event.ClassPrepareEvent
+ * @see com.sun.jdi.event.EventQueue
+ * @see EventRequestManager
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ClassPrepareRequest extends EventRequest {
+
+    /**
+     * Restricts the events generated by this request to be the
+     * preparation of the given reference type and any subtypes.
+     * An event will be generated for any prepared reference type that can
+     * be safely cast to the given reference type.
+     *
+     * @param refType the reference type to filter on.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassFilter(ReferenceType refType);
+
+    /**
+     * Restricts the events generated by this request to the
+     * preparation of reference types whose name matches this restricted
+     * regular expression. Regular expressions are limited
+     * to exact matches and patterns that begin with '*' or end with '*';
+     * for example, "*.Foo" or "java.*".
+     *
+     * @param classPattern the pattern String to filter for.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassFilter(String classPattern);
+
+    /**
+     * Restricts the events generated by this request to the
+     * preparation of reference types whose name does <b>not</b> match
+     * this restricted regular expression. Regular expressions are limited
+     * to exact matches and patterns that begin with '*' or end with '*';
+     * for example, "*.Foo" or "java.*".
+     *
+     * @param classPattern the pattern String to filter against.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassExclusionFilter(String classPattern);
+
+    /**
+     * Restricts the events generated by this request to the
+     * preparation of reference types for which the restricted regular
+     * expression 'sourceNamePattern' matches one of the 'sourceNames' for
+     * the reference type being prepared.
+     * That is, if refType is the ReferenceType being prepared,
+     * then there exists at least one stratum, call it 'someStratum'
+     * on the list returned by
+     *     refType.availableStrata();
+     *
+     * such that a name on the list returned by
+     *     refType.sourceNames(someStratam)
+     *
+     * matches 'sourceNamePattern'.
+     * Regular expressions are limited
+     * to exact matches and patterns that begin with '*' or end with '*';
+     * for example, "*.Foo" or "java.*".
+     * <P>
+     * Not all targets support this operation.
+     * Use {@link VirtualMachine#canUseSourceNameFilters()}
+     * to determine if the operation is supported.
+     * @since 1.6
+     * @param sourceNamePattern the pattern string to filter for.
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addSourceNameFilter(String sourceNamePattern);
+}
diff --git a/src/share/classes/com/sun/jdi/request/ClassUnloadRequest.java b/src/share/classes/com/sun/jdi/request/ClassUnloadRequest.java
new file mode 100644
index 0000000..4335c03
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/request/ClassUnloadRequest.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.request;
+
+import com.sun.jdi.*;
+
+/**
+ * Request for notification when a class is unloaded in the target VM.
+ * When an enabled ClassUnloadRequest is satisfied, a
+ * {@link com.sun.jdi.event.EventSet event set} containing an
+ * {@link com.sun.jdi.event.ClassUnloadEvent ClassUnloadEvent} will
+ * be placed on the {@link com.sun.jdi.event.EventQueue EventQueue}.
+ * The collection of existing ClassUnloadRequests is
+ * managed by the {@link EventRequestManager}
+ * <p>
+ * Refer to the Java Virtual Machine Specification for more information
+ * on class unloading.
+ *
+ * @see com.sun.jdi.event.ClassUnloadEvent
+ * @see com.sun.jdi.event.EventQueue
+ * @see EventRequestManager
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ClassUnloadRequest extends EventRequest {
+
+    /**
+     * Restricts the events generated by this request to the
+     * unloading of reference types whose name matches a restricted
+     * regular expression. Regular expressions are limited to exact
+     * matches and patterns that begin with '*' or end with '*'; for
+     * example, "*.Foo" or "java.*".
+     * @param classPattern the pattern String to filter for.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassFilter(String classPattern);
+
+    /**
+     * Restricts the events generated by this request to the
+     * unloading of reference types whose name does <b>not</b> match
+     * a restricted regular expression. Regular expressions are limited
+     * to exact matches and patterns that begin with '*' or end with '*';
+     * for example, "*.Foo" or "java.*".
+     * @param classPattern the pattern String to filter against.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassExclusionFilter(String classPattern);
+}
diff --git a/src/share/classes/com/sun/jdi/request/DuplicateRequestException.java b/src/share/classes/com/sun/jdi/request/DuplicateRequestException.java
new file mode 100644
index 0000000..3412f23
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/request/DuplicateRequestException.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.request;
+
+/**
+ * Thrown to indicate a duplicate event request.
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public class DuplicateRequestException extends RuntimeException {
+    private static final long serialVersionUID = -3719784920313411060L;
+
+    public DuplicateRequestException() {
+        super();
+    }
+
+    public DuplicateRequestException(String s) {
+        super(s);
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/request/EventRequest.java b/src/share/classes/com/sun/jdi/request/EventRequest.java
new file mode 100644
index 0000000..b1e59e7
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/request/EventRequest.java
@@ -0,0 +1,211 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.request;
+
+import com.sun.jdi.*;
+
+/**
+ * Represents a request for notification of an event.  Examples include
+ * {@link BreakpointRequest} and {@link ExceptionRequest}.
+ * When an event occurs for which an enabled request is present,
+ * an  {@link com.sun.jdi.event.EventSet EventSet} will
+ * be placed on the {@link com.sun.jdi.event.EventQueue EventQueue}.
+ * The collection of existing event requests is
+ * managed by the {@link EventRequestManager}.
+ * <p>
+ * The number of events generated for an event request can be controlled
+ * through filters. Filters provide additional constraints that an event
+ * must satisfy before it is placed on the event queue. Multiple filters can
+ * be used by making multiple calls to filter addition methods such as
+ * {@link ExceptionRequest#addClassFilter(java.lang.String classPattern)}.
+ * Filters are added to an event one at a time only while the event is
+ * disabled. Multiple filters are applied with CUT-OFF AND, in the order
+ * it was added to the request. Only events that satisfy all filters are
+ * placed in the event queue.
+ * <p>
+ * The set of available filters is dependent on the event request,
+ * some examples of filters are:
+ * <ul>
+ * <li>Thread filters allow control over the thread for which events are
+ * generated.
+ * <li>Class filters allow control over the class in which the event
+ * occurs.
+ * <li>Instance filters allow control over the instance in which
+ * the event occurs.
+ * <li>Count filters allow control over the number of times an event
+ * is reported.
+ * </ul>
+ * Filters can dramatically improve debugger performance by reducing the
+ * amount of event traffic sent from the target VM to the debugger VM.
+ * <p>
+ * Any method on <code>EventRequest</code> which
+ * takes <code>EventRequest</code> as an parameter may throw
+ * {@link com.sun.jdi.VMDisconnectedException} if the target VM is
+ * disconnected and the {@link com.sun.jdi.event.VMDisconnectEvent} has been or is
+ * available to be read from the {@link com.sun.jdi.event.EventQueue}.
+ * <p>
+ * Any method on <code>EventRequest</code> which
+ * takes <code>EventRequest</code> as an parameter may throw
+ * {@link com.sun.jdi.VMOutOfMemoryException} if the target VM has run out of memory.
+ *
+ * @see com.sun.jdi.event.BreakpointEvent
+ * @see com.sun.jdi.event.EventQueue
+ * @see EventRequestManager
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface EventRequest extends Mirror {
+
+    /**
+     * Determines if this event request is currently enabled.
+     *
+     * @return <code>true</code> if enabled;
+     * <code>false</code> otherwise.
+     */
+    boolean isEnabled();
+
+    /**
+     * Enables or disables this event request. While this event request is
+     * disabled, the event request will be ignored and the target VM
+     * will not be stopped if any of its threads reaches the
+     * event request.  Disabled event requests still exist,
+     * and are included in event request lists such as
+     * {@link EventRequestManager#breakpointRequests()}.
+     *
+     * @param val <code>true</code> if the event request is to be enabled;
+     * <code>false</code> otherwise.
+     * @throws InvalidRequestStateException if this request
+     * has been deleted.
+     * @throws IllegalThreadStateException if this is a StepRequest,
+     * <code>val</code> is <code>true</code>, and the
+     * thread named in the request has died.
+     */
+    void setEnabled(boolean val);
+
+    /**
+     * Same as {@link #setEnabled <CODE>setEnabled(true)</CODE>}.
+     * @throws InvalidRequestStateException if this request
+     * has been deleted.
+     * @throws IllegalThreadStateException if this is a StepRequest
+     * and the thread named in the request has died.
+     */
+    void enable();
+
+    /**
+     * Same as {@link #setEnabled <CODE>setEnabled(false)</CODE>}.
+     * @throws InvalidRequestStateException if this request
+     * has been deleted.
+     */
+    void disable();
+
+    /**
+     * Limit the requested event to be reported at most once after a
+     * given number of occurrences.  The event is not reported
+     * the first <code>count - 1</code> times this filter is reached.
+     * To request a one-off event, call this method with a count of 1.
+     * <p>
+     * Once the count reaches 0, any subsequent filters in this request
+     * are applied. If none of those filters cause the event to be
+     * suppressed, the event is reported. Otherwise, the event is not
+     * reported. In either case subsequent events are never reported for
+     * this request.
+     *
+     * @param count the number of ocurrences before generating an event.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     * @throws IllegalArgumentException if <CODE>count</CODE>
+     * is less than one.
+     */
+    void addCountFilter(int count);
+
+    /** Suspend no threads when the event occurs */
+    int SUSPEND_NONE = 0;
+    /** Suspend only the thread which generated the event when the event occurs */
+    int SUSPEND_EVENT_THREAD = 1;
+    /** Suspend all threads when the event occurs */
+    int SUSPEND_ALL = 2;
+
+    /**
+     * Determines the threads to suspend when the requested event occurs
+     * in the target VM. Use {@link #SUSPEND_ALL} to suspend all
+     * threads in the target VM (the default). Use {@link #SUSPEND_EVENT_THREAD}
+     * to suspend only the thread which generated the event. Use
+     * {@link #SUSPEND_NONE} to suspend no threads.
+     * <p>
+     * Thread suspensions through events have the same functionality
+     * as explicitly requested suspensions. See
+     * {@link com.sun.jdi.ThreadReference#suspend} and
+     * {@link com.sun.jdi.VirtualMachine#suspend} for details.
+     *
+     * @param policy the selected suspend policy.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Suspend policy may only be set in disabled requests.
+     * @throws IllegalArgumentException if the policy argument
+     * contains an illegal value.
+     */
+    void setSuspendPolicy(int policy);
+
+    /**
+     * Returns a value which describes the threads to suspend when the
+     * requested event occurs in the target VM.
+     * The returned value is  {@link #SUSPEND_ALL},
+     * {@link #SUSPEND_EVENT_THREAD}, or {@link #SUSPEND_NONE}.
+     *
+     * @return the current suspend mode for this request
+     */
+    int suspendPolicy();
+
+    /**
+     * Add an arbitrary key/value "property" to this request.
+     * The property can be used by a client of the JDI to
+     * associate application information with the request;
+     * These client-set properties are not used internally
+     * by the JDI.
+     * <p>
+     * The <code>get/putProperty</code> methods provide access to
+     * a small per-instance map. This is <b>not</b> to be confused
+     * with {@link java.util.Properties}.
+     * <p>
+     * If value is null this method will remove the property.
+     *
+     * @see #getProperty
+     */
+    void putProperty(Object key, Object value);
+
+    /**
+     * Returns the value of the property with the specified key.  Only
+     * properties added with {@link #putProperty} will return
+     * a non-null value.
+     *
+     * @return the value of this property or null
+     * @see #putProperty
+     */
+    Object getProperty(Object key);
+}
diff --git a/src/share/classes/com/sun/jdi/request/EventRequestManager.java b/src/share/classes/com/sun/jdi/request/EventRequestManager.java
new file mode 100644
index 0000000..3664c84
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/request/EventRequestManager.java
@@ -0,0 +1,545 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.request;
+
+import com.sun.jdi.*;
+
+import java.util.List;
+
+/**
+ * Manages the creation and deletion of {@link EventRequest}s. A single
+ * implementor of this interface exists in a particuar VM and
+ * is accessed through {@link VirtualMachine#eventRequestManager()}
+ *
+ * @see EventRequest
+ * @see com.sun.jdi.event.Event
+ * @see BreakpointRequest
+ * @see com.sun.jdi.event.BreakpointEvent
+ * @see VirtualMachine
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+
+@jdk.Exported
+public interface EventRequestManager extends Mirror {
+
+    /**
+     * Creates a new disabled {@link ClassPrepareRequest}.
+     * The new event request is added to the list managed by this
+     * EventRequestManager. Use {@link EventRequest#enable()} to
+     * activate this event request.
+     *
+     * @return the created {@link ClassPrepareRequest}
+     */
+    ClassPrepareRequest createClassPrepareRequest();
+
+    /**
+     * Creates a new disabled {@link ClassUnloadRequest}.
+     * The new event request is added to the list managed by this
+     * EventRequestManager. Use {@link EventRequest#enable()} to
+     * activate this event request.
+     *
+     * @return the created {@link ClassUnloadRequest}
+     */
+    ClassUnloadRequest createClassUnloadRequest();
+
+    /**
+     * Creates a new disabled {@link ThreadStartRequest}.
+     * The new event request is added to the list managed by this
+     * EventRequestManager. Use {@link EventRequest#enable()} to
+     * activate this event request.
+     *
+     * @return the created {@link ThreadStartRequest}
+     */
+    ThreadStartRequest createThreadStartRequest();
+
+    /**
+     * Creates a new disabled {@link ThreadDeathRequest}.
+     * The new event request is added to the list managed by this
+     * EventRequestManager. Use {@link EventRequest#enable()} to
+     * activate this event request.
+     *
+     * @return the created {@link ThreadDeathRequest}
+     */
+    ThreadDeathRequest createThreadDeathRequest();
+
+    /**
+     * Creates a new disabled {@link ExceptionRequest}.
+     * The new event request is added to the list managed by this
+     * EventRequestManager. Use {@link EventRequest#enable()} to
+     * activate this event request.
+     * <P>
+     * A specific exception type and its subclasses can be selected
+     * for exception events. Caught exceptions,  uncaught exceptions,
+     * or both can be selected. Note, however, that
+     * at the time an exception is thrown, it is not always
+     * possible to determine whether it is truly caught. See
+     * {@link com.sun.jdi.event.ExceptionEvent#catchLocation} for
+     * details.
+     * @param refType If non-null, specifies that exceptions which are
+     *                instances of refType will be reported. Note: this
+     *                will include instances of sub-types.  If null,
+     *                all instances will be reported
+     * @param notifyCaught If true, caught exceptions will be reported.
+     * @param notifyUncaught If true, uncaught exceptions will be reported.
+     *
+     * @return the created {@link ExceptionRequest}
+     */
+    ExceptionRequest createExceptionRequest(ReferenceType refType,
+                                            boolean notifyCaught,
+                                            boolean notifyUncaught);
+
+    /**
+     * Creates a new disabled {@link MethodEntryRequest}.
+     * The new event request is added to the list managed by this
+     * EventRequestManager. Use {@link EventRequest#enable()} to
+     * activate this event request.
+     *
+     * @return the created {@link MethodEntryRequest}
+     */
+    MethodEntryRequest createMethodEntryRequest();
+
+    /**
+     * Creates a new disabled {@link MethodExitRequest}.
+     * The new event request is added to the list managed by this
+     * EventRequestManager. Use {@link EventRequest#enable()} to
+     * activate this event request.
+     *
+     * @return the created {@link MethodExitRequest}
+     */
+    MethodExitRequest createMethodExitRequest();
+
+     /**
+     * Creates a new disabled {@link MonitorContendedEnterRequest}.
+     * The new event request is added to the list managed by this
+     * EventRequestManager. Use {@link EventRequest#enable()} to
+     * activate this event request.
+     *
+     * Not all target virtual machines support this operation.
+     * Use {@link VirtualMachine#canRequestMonitorEvents()}
+     * to determine if the operation is supported.
+     *
+     * @return the created {@link MonitorContendedEnterRequest}
+     * @throws java.lang.UnsupportedOperationException if
+     * the target VM does not support this
+     * operation.
+     *
+     * @since 1.6
+     */
+    MonitorContendedEnterRequest createMonitorContendedEnterRequest();
+
+    /**
+     * Creates a new disabled {@link MonitorContendedEnteredRequest}.
+     * The new event request is added to the list managed by this
+     * EventRequestManager. Use {@link EventRequest#enable()} to
+     * activate this event request.
+     *
+     * Not all target virtual machines support this operation.
+     * Use {@link VirtualMachine#canRequestMonitorEvents()}
+     * to determine if the operation is supported.
+     *
+     * @return the created {@link MonitorContendedEnteredRequest}
+     * @throws java.lang.UnsupportedOperationException if
+     * the target VM does not support this
+     * operation.
+     *
+     * @since 1.6
+     */
+
+    MonitorContendedEnteredRequest createMonitorContendedEnteredRequest();
+
+    /**
+     * Creates a new disabled {@link MonitorWaitRequest}.
+     * The new event request is added to the list managed by this
+     * EventRequestManager. Use {@link EventRequest#enable()} to
+     * activate this event request.
+     *
+     * Not all target virtual machines support this operation.
+     * Use {@link VirtualMachine#canRequestMonitorEvents()}
+     * to determine if the operation is supported.
+     *
+     * @return the created {@link MonitorWaitRequest}
+     * @throws java.lang.UnsupportedOperationException if
+     * the target VM does not support this
+     * operation.
+     *
+     * @since 1.6
+     */
+    MonitorWaitRequest createMonitorWaitRequest();
+
+    /**
+     * Creates a new disabled {@link MonitorWaitedRequest}.
+     * The new event request is added to the list managed by this
+     * EventRequestManager. Use {@link EventRequest#enable()} to
+     * activate this event request.
+     *
+     * Not all target virtual machines support this operation.
+     * Use {@link VirtualMachine#canRequestMonitorEvents()}
+     * to determine if the operation is supported.
+     *
+     * @return the created {@link MonitorWaitedRequest}
+     * @throws java.lang.UnsupportedOperationException if
+     * the target VM does not support this
+     * operation.
+     *
+     * @since 1.6
+     */
+    MonitorWaitedRequest createMonitorWaitedRequest();
+
+    /**
+     * Creates a new disabled {@link StepRequest}.
+     * The new event request is added to the list managed by this
+     * EventRequestManager. Use {@link EventRequest#enable()} to
+     * activate this event request.
+     * <p>
+     * The returned request will control stepping only in the specified
+     * <code>thread</code>; all other threads will be unaffected.
+     * A <code>size</code>value of {@link com.sun.jdi.request.StepRequest#STEP_MIN} will generate a
+     * step event each time the code index changes. It represents the
+     * smallest step size available and often maps to the instruction
+     * level.
+     * A <code>size</code> value of {@link com.sun.jdi.request.StepRequest#STEP_LINE} will generate a
+     * step event each time the source line changes unless line number information is not available,
+     * in which case a STEP_MIN will be done instead.  For example, no line number information is
+     * available during the execution of a method that has been rendered obsolete by
+     * by a {@link com.sun.jdi.VirtualMachine#redefineClasses} operation.
+     * A <code>depth</code> value of {@link com.sun.jdi.request.StepRequest#STEP_INTO} will generate
+     * step events in any called methods.  A <code>depth</code> value
+     * of {@link com.sun.jdi.request.StepRequest#STEP_OVER} restricts step events to the current frame
+     * or caller frames. A <code>depth</code> value of {@link com.sun.jdi.request.StepRequest#STEP_OUT}
+     * restricts step events to caller frames only. All depth
+     * restrictions are relative to the call stack immediately before the
+     * step takes place.
+     * <p>
+     * Only one pending step request is allowed per thread.
+     * <p>
+     * Note that a typical debugger will want to cancel stepping
+     * after the first step is detected.  Thus a next line method
+     * would do the following:
+     * <code>
+     * <pre>
+     *     EventRequestManager mgr = myVM.{@link VirtualMachine#eventRequestManager eventRequestManager}();
+     *     StepRequest request = mgr.createStepRequest(myThread,
+     *                                                 StepRequest.{@link StepRequest#STEP_LINE STEP_LINE},
+     *                                                 StepRequest.{@link StepRequest#STEP_OVER STEP_OVER});
+     *     request.{@link EventRequest#addCountFilter addCountFilter}(1);  // next step only
+     *     request.enable();
+     *     myVM.{@link VirtualMachine#resume resume}();
+     * </pre>
+     * </code>
+     *
+     * @param thread the thread in which to step
+     * @param depth the step depth
+     * @param size the step size
+     * @return the created {@link StepRequest}
+     * @throws DuplicateRequestException if there is already a pending
+     * step request for the specified thread.
+     * @throws IllegalArgumentException if the size or depth arguments
+     * contain illegal values.
+     */
+    StepRequest createStepRequest(ThreadReference thread,
+                                  int size,
+                                  int depth);
+
+    /**
+     * Creates a new disabled {@link BreakpointRequest}.
+     * The given {@link Location} must have a valid
+     * (that is, non-negative) code index. The new
+     * breakpoint is added to the list managed by this
+     * EventRequestManager. Multiple breakpoints at the
+     * same location are permitted. Use {@link EventRequest#enable()} to
+     * activate this event request.
+     *
+     * @param location the location of the new breakpoint.
+     * @return the created {@link BreakpointRequest}
+     * @throws NativeMethodException if location is within a native method.
+     */
+    BreakpointRequest createBreakpointRequest(Location location);
+
+    /**
+     * Creates a new disabled watchpoint which watches accesses to the
+     * specified field. The new
+     * watchpoint is added to the list managed by this
+     * EventRequestManager. Multiple watchpoints on the
+     * same field are permitted.
+     * Use {@link EventRequest#enable()} to
+     * activate this event request.
+     * <P>
+     * Not all target virtual machines support this operation.
+     * Use {@link VirtualMachine#canWatchFieldAccess()}
+     * to determine if the operation is supported.
+     *
+     * @param field the field to watch
+     * @return the created watchpoint
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation.
+     */
+    AccessWatchpointRequest createAccessWatchpointRequest(Field field);
+
+    /**
+     * Creates a new disabled watchpoint which watches accesses to the
+     * specified field. The new
+     * watchpoint is added to the list managed by this
+     * EventRequestManager. Multiple watchpoints on the
+     * same field are permitted.
+     * Use {@link EventRequest#enable()} to
+     * activate this event request.
+     * <P>
+     * Not all target virtual machines support this operation.
+     * Use {@link VirtualMachine#canWatchFieldModification()}
+     * to determine if the operation is supported.
+     *
+     * @param field the field to watch
+     * @return the created watchpoint
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation.
+     */
+    ModificationWatchpointRequest createModificationWatchpointRequest(Field field);
+
+    /**
+     * Creates a new disabled {@link VMDeathRequest}.
+     * The new request is added to the list managed by this
+     * EventRequestManager.
+     * Use {@link EventRequest#enable()} to
+     * activate this event request.
+     * <P>
+     * This request (if enabled) will cause a
+     * {@link com.sun.jdi.event.VMDeathEvent}
+     * to be sent on termination of the target VM.
+     * <P>
+     * A VMDeathRequest with a suspend policy of
+     * {@link EventRequest#SUSPEND_ALL SUSPEND_ALL}
+     * can be used to assure processing of incoming
+     * {@link EventRequest#SUSPEND_NONE SUSPEND_NONE} or
+     * {@link EventRequest#SUSPEND_EVENT_THREAD SUSPEND_EVENT_THREAD}
+     * events before VM death.  If all event processing is being
+     * done in the same thread as event sets are being read,
+     * enabling the request is all that is needed since the VM
+     * will be suspended until the {@link com.sun.jdi.event.EventSet}
+     * containing the {@link com.sun.jdi.event.VMDeathEvent}
+     * is resumed.
+     * <P>
+     * Not all target virtual machines support this operation.
+     * Use {@link VirtualMachine#canRequestVMDeathEvent()}
+     * to determine if the operation is supported.
+     *
+     * @return the created request
+     * @throws java.lang.UnsupportedOperationException if
+     * the target VM does not support this
+     * operation.
+     *
+     * @since 1.4
+     */
+    VMDeathRequest createVMDeathRequest();
+
+    /**
+     * Removes an eventRequest. The eventRequest is disabled and
+     * the removed from the requests managed by this
+     * EventRequestManager. Once the eventRequest is deleted, no
+     * operations (for example, {@link EventRequest#setEnabled})
+     * are permitted - attempts to do so will generally cause an
+     * {@link InvalidRequestStateException}.
+     * No other eventRequests are effected.
+     * <P>
+     * Because this method changes the underlying lists of event
+     * requests, attempting to directly delete from a list returned
+     * by a request accessor (e.g. below):
+     * <PRE>
+     *   Iterator iter = requestManager.stepRequests().iterator();
+     *   while (iter.hasNext()) {
+     *      requestManager.deleteEventRequest(iter.next());
+     *  }
+     * </PRE>
+     * may cause a {@link java.util.ConcurrentModificationException}.
+     * Instead use
+     * {@link #deleteEventRequests(List) deleteEventRequests(List)}
+     * or copy the list before iterating.
+     *
+     * @param eventRequest the eventRequest to remove
+     */
+    void deleteEventRequest(EventRequest eventRequest);
+
+    /**
+     * Removes a list of {@link EventRequest}s.
+     *
+     * @see #deleteEventRequest(EventRequest)
+     *
+     * @param eventRequests the list of eventRequests to remove
+     */
+    void deleteEventRequests(List<? extends EventRequest> eventRequests);
+
+    /**
+     * Remove all breakpoints managed by this EventRequestManager.
+     *
+     * @see #deleteEventRequest(EventRequest)
+     */
+    void deleteAllBreakpoints();
+
+    /**
+     * Return an unmodifiable list of the enabled and disabled step requests.
+     * This list is a live view of these requests and thus changes as requests
+     * are added and deleted.
+     * @return the all {@link StepRequest} objects.
+     */
+    List<StepRequest> stepRequests();
+
+    /**
+     * Return an unmodifiable list of the enabled and disabled class prepare requests.
+     * This list is a live view of these requests and thus changes as requests
+     * are added and deleted.
+     * @return the all {@link ClassPrepareRequest} objects.
+     */
+    List<ClassPrepareRequest> classPrepareRequests();
+
+    /**
+     * Return an unmodifiable list of the enabled and disabled class unload requests.
+     * This list is a live view of these requests and thus changes as requests
+     * are added and deleted.
+     * @return the all {@link ClassUnloadRequest} objects.
+     */
+    List<ClassUnloadRequest> classUnloadRequests();
+
+    /**
+     * Return an unmodifiable list of the enabled and disabled thread start requests.
+     * This list is a live view of these requests and thus changes as requests
+     * are added and deleted.
+     * @return the all {@link ThreadStartRequest} objects.
+     */
+    List<ThreadStartRequest> threadStartRequests();
+
+    /**
+     * Return an unmodifiable list of the enabled and disabled thread death requests.
+     * This list is a live view of these requests and thus changes as requests
+     * are added and deleted.
+     * @return the all {@link ThreadDeathRequest} objects.
+     */
+    List<ThreadDeathRequest> threadDeathRequests();
+
+    /**
+     * Return an unmodifiable list of the enabled and disabled exception requests.
+     * This list is a live view of these requests and thus changes as requests
+     * are added and deleted.
+     * @return the all {@link ExceptionRequest} objects.
+     */
+    List<ExceptionRequest> exceptionRequests();
+
+    /**
+     * Return an unmodifiable list of the enabled and disabled breakpoint requests.
+     * This list is a live view of these requests and thus changes as requests
+     * are added and deleted.
+     * @return the list of all {@link BreakpointRequest} objects.
+     */
+    List<BreakpointRequest> breakpointRequests();
+
+    /**
+     * Return an unmodifiable list of the enabled and disabled access
+     * watchpoint requests.
+     * This list is a live view of these requests and thus changes as requests
+     * are added and deleted.
+     * @return the all {@link AccessWatchpointRequest} objects.
+     */
+    List<AccessWatchpointRequest> accessWatchpointRequests();
+
+    /**
+     * Return an unmodifiable list of the enabled and disabled modification
+     * watchpoint requests.
+     * This list is a live view of these requests and thus changes as requests
+     * are added and deleted.
+     * @return the all {@link ModificationWatchpointRequest} objects.
+     */
+    List<ModificationWatchpointRequest> modificationWatchpointRequests();
+
+    /**
+     * Return an unmodifiable list of the enabled and disabled method entry requests.
+     * This list is a live view of these requests and thus changes as requests
+     * are added and deleted.
+     * @return the list of all {@link MethodEntryRequest} objects.
+     */
+    List<MethodEntryRequest> methodEntryRequests();
+
+    /**
+     * Return an unmodifiable list of the enabled and disabled method exit requests.
+     * This list is a live view of these requests and thus changes as requests
+     * are added and deleted.
+     * @return the list of all {@link MethodExitRequest} objects.
+     */
+    List<MethodExitRequest> methodExitRequests();
+
+    /**
+     * Return an unmodifiable list of the enabled and disabled monitor contended enter requests.
+     * This list is a live view of these requests and thus changes as requests
+     * are added and deleted.
+     * @return the list of all {@link MonitorContendedEnterRequest} objects.
+     *
+     * @since 1.6
+     */
+    List<MonitorContendedEnterRequest> monitorContendedEnterRequests();
+
+    /**
+     * Return an unmodifiable list of the enabled and disabled monitor contended entered requests.
+     * This list is a live view of these requests and thus changes as requests
+     * are added and deleted.
+     * @return the list of all {@link MonitorContendedEnteredRequest} objects.
+     *
+     * @since 1.6
+     */
+    List<MonitorContendedEnteredRequest> monitorContendedEnteredRequests();
+
+    /**
+     * Return an unmodifiable list of the enabled and disabled monitor wait requests.
+     * This list is a live view of these requests and thus changes as requests
+     * are added and deleted.
+     * @return the list of all {@link MonitorWaitRequest} objects.
+     *
+     * @since 1.6
+     */
+    List<MonitorWaitRequest> monitorWaitRequests();
+
+    /**
+     * Return an unmodifiable list of the enabled and disabled monitor waited requests.
+     * This list is a live view of these requests and thus changes as requests
+     * are added and deleted.
+     * @return the list of all {@link MonitorWaitedRequest} objects.
+     *
+     * @since 1.6
+     */
+    List<MonitorWaitedRequest> monitorWaitedRequests();
+
+    /**
+     * Return an unmodifiable list of the enabled and disabled VM death requests.
+     * This list is a live view of these requests and thus changes as requests
+     * are added and deleted.
+     * Note: the unsolicited VMDeathEvent does not have a
+     * corresponding request.
+     * @return the list of all {@link VMDeathRequest} objects.
+     *
+     * @since 1.4
+     */
+    List<VMDeathRequest> vmDeathRequests();
+}
diff --git a/src/share/classes/com/sun/jdi/request/ExceptionRequest.java b/src/share/classes/com/sun/jdi/request/ExceptionRequest.java
new file mode 100644
index 0000000..8de652f
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/request/ExceptionRequest.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.request;
+
+import com.sun.jdi.*;
+
+/**
+ * Request for notification when an exception occurs in the target VM.
+ * When an enabled ExceptionRequest is satisfied, an
+ * {@link com.sun.jdi.event.EventSet event set} containing an
+ * {@link com.sun.jdi.event.ExceptionEvent ExceptionEvent} will be placed
+ * on the {@link com.sun.jdi.event.EventQueue EventQueue}.
+ * The collection of existing ExceptionRequests is
+ * managed by the {@link EventRequestManager}
+ *
+ * @see com.sun.jdi.event.ExceptionEvent
+ * @see com.sun.jdi.event.EventQueue
+ * @see EventRequestManager
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ExceptionRequest extends EventRequest {
+
+    /**
+     * Returns exception type for which exception events are requested.
+     * @return
+     * The exception (and its subclasses) requested
+     * with {@link EventRequestManager#createExceptionRequest}, or
+     * null if, as by default, all exceptions are requested.
+     */
+    ReferenceType exception();
+
+    /**
+     * Returns whether caught exceptions of the requested type
+     * will generate events when they are thrown.
+     * <p>
+     * Note that at the time an exception is thrown, it is not always
+     * possible to determine whether it is truly caught. See
+     * {@link com.sun.jdi.event.ExceptionEvent#catchLocation} for
+     * details.
+     * @return
+     * boolean true if caught exceptions will be reported, false
+     * otherwise.
+     */
+    boolean notifyCaught();
+
+    /**
+     * Returns whether uncaught exceptions of the requested type
+     * will generate events when they are thrown.
+     * <p>
+     * Note that at the time an exception is thrown, it is not always
+     * possible to determine whether it is truly uncaught. See
+     * {@link com.sun.jdi.event.ExceptionEvent#catchLocation} for
+     * details.
+     * @return
+     * boolean true if caught exceptions will be reported, false
+     * otherwise.
+     */
+    boolean notifyUncaught();
+
+    /**
+     * Restricts the events generated by this request to those in
+     * the given thread.
+     * @param thread the thread to filter on.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addThreadFilter(ThreadReference thread);
+
+    /**
+     * Restricts the events generated by this request to those whose
+     * location is in the given reference type or any of its subtypes.
+     * An event will be generated for any location in a reference type
+     * that can be safely cast to the given reference type.
+     *
+     * @param refType the reference type to filter on.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassFilter(ReferenceType refType);
+
+    /**
+     * Restricts the events generated by this request to those
+     * whose location is in a class whose name matches a restricted
+     * regular expression. Regular expressions are limited
+     * to exact matches and patterns that begin with '*' or end with '*';
+     * for example, "*.Foo" or "java.*".
+     *
+     * @param classPattern the pattern String to filter for.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassFilter(String classPattern);
+
+    /**
+     * Restricts the events generated by this request to those
+     * whose location is in a class whose name does <b>not</b> match a
+     * restricted regular expression. Regular expressions are limited
+     * to exact matches and patterns that begin with '*' or end with '*';
+     * for example, "*.Foo" or "java.*".
+     *
+     * @param classPattern the pattern String to filter against.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassExclusionFilter(String classPattern);
+
+    /**
+     * Restricts the events generated by this request to those in
+     * which the currently executing instance ("this") is the object
+     * specified.
+     * <P>
+     * Not all targets support this operation.
+     * Use {@link VirtualMachine#canUseInstanceFilters()}
+     * to determine if the operation is supported.
+     * @since 1.4
+     * @param instance the object which must be the current instance
+     * in order to pass this filter.
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addInstanceFilter(ObjectReference instance);
+}
diff --git a/src/share/classes/com/sun/jdi/request/InvalidRequestStateException.java b/src/share/classes/com/sun/jdi/request/InvalidRequestStateException.java
new file mode 100644
index 0000000..6faab81
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/request/InvalidRequestStateException.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.request;
+
+/**
+ * Thrown to indicate that the requested event cannot be modified
+ * because it is enabled. Filters can be added only to disabled
+ * event requests.
+ * Also thrown if an operation is attempted on a deleted request.
+ * See {@link EventRequestManager#deleteEventRequest(EventRequest)}
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public class InvalidRequestStateException extends RuntimeException {
+    private static final long serialVersionUID = -3774632428543322148L;
+    public InvalidRequestStateException()
+    {
+        super();
+    }
+
+    public InvalidRequestStateException(String s)
+    {
+        super(s);
+    }
+}
diff --git a/src/share/classes/com/sun/jdi/request/MethodEntryRequest.java b/src/share/classes/com/sun/jdi/request/MethodEntryRequest.java
new file mode 100644
index 0000000..c31a1e7
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/request/MethodEntryRequest.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.request;
+
+import com.sun.jdi.*;
+
+/**
+ * Request for notification when a method is invoked in the target VM.
+ * When an enabled MethodEntryRequest is satisfied, an
+ * {@link com.sun.jdi.event.EventSet event set} containing a
+ * {@link com.sun.jdi.event.MethodEntryEvent MethodEntryEvent}
+ * will be placed on the
+ * {@link com.sun.jdi.event.EventQueue EventQueue}.
+ * The collection of existing MethodEntryRequests is
+ * managed by the {@link EventRequestManager}
+ *
+ * @see com.sun.jdi.event.MethodEntryEvent
+ * @see com.sun.jdi.event.EventQueue
+ * @see EventRequestManager
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface MethodEntryRequest extends EventRequest {
+
+    /**
+     * Restricts the events generated by this request to those in
+     * the given thread.
+     * @param thread the thread to filter on.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addThreadFilter(ThreadReference thread);
+
+    /**
+     * Restricts the events generated by this request to those whose
+     * method is in the given reference type or any of its subtypes.
+     * An event will be generated for any location in a reference type
+     * that can be safely cast to the given reference type.
+     *
+     * @param refType the reference type to filter on.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassFilter(ReferenceType refType);
+
+    /**
+     * Restricts the events generated by this request to those
+     * whose method is in a class whose name matches this restricted
+     * regular expression. Regular expressions are limited
+     * to exact matches and patterns that begin with '*' or end with '*';
+     * for example, "*.Foo" or "java.*".
+     *
+     * @param classPattern the pattern String to filter for.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassFilter(String classPattern);
+
+    /**
+     * Restricts the events generated by this request to those
+     * whose method is in a class whose name does <b>not</b> match this restricted
+     * regular expression, e.g. "java.*" or "*.Foo".
+     * @param classPattern the pattern String to filter against.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassExclusionFilter(String classPattern);
+
+    /**
+     * Restricts the events generated by this request to those in
+     * which the currently executing instance ("this") is the object
+     * specified.
+     * <P>
+     * Not all targets support this operation.
+     * Use {@link VirtualMachine#canUseInstanceFilters()}
+     * to determine if the operation is supported.
+     * @since 1.4
+     * @param instance the object which must be the current instance
+     * in order to pass this filter.
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addInstanceFilter(ObjectReference instance);
+}
diff --git a/src/share/classes/com/sun/jdi/request/MethodExitRequest.java b/src/share/classes/com/sun/jdi/request/MethodExitRequest.java
new file mode 100644
index 0000000..8c64b9f
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/request/MethodExitRequest.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.request;
+
+import com.sun.jdi.*;
+
+/**
+ * Request for notification when a method returns in the target VM.
+ * When an enabled MethodExitRequest is hit, an
+ * {@link com.sun.jdi.event.EventSet event set} containing a
+ * {@link com.sun.jdi.event.MethodExitEvent MethodExitEvent}
+ * will be placed on the
+ * {@link com.sun.jdi.event.EventQueue EventQueue}.
+ * The collection of existing MethodExitRequests is
+ * managed by the {@link EventRequestManager}
+ *
+ * @see com.sun.jdi.event.MethodExitEvent
+ * @see com.sun.jdi.event.EventQueue
+ * @see EventRequestManager
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface MethodExitRequest extends EventRequest {
+
+    /**
+     * Restricts the events generated by this request to those in
+     * the given thread.
+     * @param thread the thread to filter on.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addThreadFilter(ThreadReference thread);
+
+    /**
+     * Restricts the events generated by this request to those whose
+     * method is in the given reference type or any of its subtypes.
+     * An event will be generated for any location in a reference type
+     * that can be safely cast to the given reference type.
+     *
+     * @param refType the reference type to filter on.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassFilter(ReferenceType refType);
+
+    /**
+     * Restricts the events generated by this request to those
+     * whose method is in a class whose name matches a restricted
+     * regular expression. Regular expressions are limited
+     * to exact matches and patterns that begin with '*' or end with '*';
+     * for example, "*.Foo" or "java.*".
+     *
+     * @param classPattern the pattern String to filter for.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassFilter(String classPattern);
+
+    /**
+     * Restricts the events generated by this request to those
+     * whose method is in a class whose name does <b>not</b> match this
+     * restricted regular expression. Regular expressions are limited
+     * to exact matches and patterns that begin with '*' or end with '*';
+     * for example, "*.Foo" or "java.*".
+     *
+     * @param classPattern the pattern String to filter against.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassExclusionFilter(String classPattern);
+
+    /**
+     * Restricts the events generated by this request to those in
+     * which the currently executing instance ("this") is the object
+     * specified.
+     * <P>
+     * Not all targets support this operation.
+     * Use {@link VirtualMachine#canUseInstanceFilters()}
+     * to determine if the operation is supported.
+     * @since 1.4
+     * @param instance the object which must be the current instance
+     * in order to pass this filter.
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addInstanceFilter(ObjectReference instance);
+}
diff --git a/src/share/classes/com/sun/jdi/request/ModificationWatchpointRequest.java b/src/share/classes/com/sun/jdi/request/ModificationWatchpointRequest.java
new file mode 100644
index 0000000..d28ae73
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/request/ModificationWatchpointRequest.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.request;
+
+import com.sun.jdi.*;
+
+/**
+ * Request for notification when a field is set.
+ * This event will be triggered when a value is assigned to the specified
+ * field with a Java<SUP><FONT SIZE="-2">TM</FONT></SUP> programming
+ * language statement (assignment, increment, etc) or by a
+ * Java Native Interface (JNI) set function (<code>Set&lt;Type&gt;Field,
+ * SetStatic&lt;Type&gt;Field</code>).
+ * Setting a field to a value which is the same as the previous value
+ * still triggers this event.
+ * Modification by JDI does not trigger this event.
+ * When an enabled
+ * ModificationWatchpointRequest is satisfied, an
+ * {@link com.sun.jdi.event.EventSet event set} containing a
+ * {@link com.sun.jdi.event.ModificationWatchpointEvent ModificationWatchpointEvent}
+ * will be placed on
+ * the {@link com.sun.jdi.event.EventQueue EventQueue}.
+ * The collection of existing
+ * watchpoints is
+ * managed by the {@link EventRequestManager}.
+ *
+ * @see com.sun.jdi.event.ModificationWatchpointEvent
+ * @see AccessWatchpointRequest
+ * @see com.sun.jdi.event.EventQueue
+ * @see EventRequestManager
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ModificationWatchpointRequest extends WatchpointRequest {
+}
diff --git a/src/share/classes/com/sun/jdi/request/MonitorContendedEnterRequest.java b/src/share/classes/com/sun/jdi/request/MonitorContendedEnterRequest.java
new file mode 100644
index 0000000..56c4625
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/request/MonitorContendedEnterRequest.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.request;
+
+import com.sun.jdi.*;
+
+/**
+ * Request for notification of a thread in the target VM
+ * attempting to enter a monitor already acquired by another thread.
+ * When an enabled MonitorContededEnterRequest is satisfied, an
+ * {@link com.sun.jdi.event.EventSet event set} containing a
+ * {@link com.sun.jdi.event.MonitorContendedEnterEvent MonitorContendedEnterEvent}
+ * will be placed on the
+ * {@link com.sun.jdi.event.EventQueue EventQueue}.
+ * The collection of existing MonitorContendedEnterEvents is
+ * managed by the {@link EventRequestManager}
+ *
+ * @see com.sun.jdi.event.MonitorContendedEnterEvent
+ * @see com.sun.jdi.event.EventQueue
+ * @see EventRequestManager
+ *
+ * @author Swamy Venkataramanappa
+ * @since  1.6
+ */
+@jdk.Exported
+public interface MonitorContendedEnterRequest extends EventRequest {
+
+    /**
+     * Restricts the events generated by this request to those in
+     * the given thread.
+     * @param thread the thread to filter on.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addThreadFilter(ThreadReference thread);
+
+    /**
+     * Restricts the events generated by this request to those whose
+     * method is in the given reference type or any of its subtypes.
+     * An event will be generated for any location in a reference type
+     * that can be safely cast to the given reference type.
+     *
+     * @param refType the reference type to filter on.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassFilter(ReferenceType refType);
+
+    /**
+     * Restricts the events generated by this request to those
+     * whose method is in a class whose name matches this restricted
+     * regular expression. Regular expressions are limited
+     * to exact matches and patterns that begin with '*' or end with '*';
+     * for example, "*.Foo" or "java.*".
+     *
+     * @param classPattern the pattern String to filter for.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassFilter(String classPattern);
+
+    /**
+     * Restricts the events generated by this request to those
+     * whose method is in a class whose name does <b>not</b> match this restricted
+     * regular expression, e.g. "java.*" or "*.Foo".
+     * @param classPattern the pattern String to filter against.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassExclusionFilter(String classPattern);
+
+    /**
+     * Restricts the events generated by this request to those in
+     * which the currently executing instance ("this") is the object
+     * specified.
+     * <P>
+     * Not all targets support this operation.
+     * Use {@link VirtualMachine#canUseInstanceFilters()}
+     * to determine if the operation is supported.
+     * @param instance the object which must be the current instance
+     * in order to pass this filter.
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addInstanceFilter(ObjectReference instance);
+}
diff --git a/src/share/classes/com/sun/jdi/request/MonitorContendedEnteredRequest.java b/src/share/classes/com/sun/jdi/request/MonitorContendedEnteredRequest.java
new file mode 100644
index 0000000..cc36ea2
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/request/MonitorContendedEnteredRequest.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.request;
+
+import com.sun.jdi.*;
+
+/**
+ * Request for notification of a thread in the target VM entering a monitor
+ * after waiting for it to be released by another thread.
+ * When an enabled MonitorContededEnteredRequest is satisfied, an
+ * {@link com.sun.jdi.event.EventSet event set} containing a
+ * {@link com.sun.jdi.event.MonitorContendedEnteredEvent MonitorContendedEnteredEvent}
+ * will be placed on the
+ * {@link com.sun.jdi.event.EventQueue EventQueue}.
+ * The collection of existing MonitorContendedEnteredEvents is
+ * managed by the {@link EventRequestManager}
+ *
+ * @see com.sun.jdi.event.MonitorContendedEnteredEvent
+ * @see com.sun.jdi.event.EventQueue
+ * @see EventRequestManager
+ *
+ * @author Swamy Venkataramanappa
+ * @since  1.6
+ */
+@jdk.Exported
+public interface MonitorContendedEnteredRequest extends EventRequest {
+
+    /**
+     * Restricts the events generated by this request to those in
+     * the given thread.
+     * @param thread the thread to filter on.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addThreadFilter(ThreadReference thread);
+
+    /**
+     * Restricts the events generated by this request to those whose
+     * method is in the given reference type or any of its subtypes.
+     * An event will be generated for any location in a reference type
+     * that can be safely cast to the given reference type.
+     *
+     * @param refType the reference type to filter on.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassFilter(ReferenceType refType);
+
+    /**
+     * Restricts the events generated by this request to those
+     * whose method is in a class whose name matches this restricted
+     * regular expression. Regular expressions are limited
+     * to exact matches and patterns that begin with '*' or end with '*';
+     * for example, "*.Foo" or "java.*".
+     *
+     * @param classPattern the pattern String to filter for.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassFilter(String classPattern);
+
+    /**
+     * Restricts the events generated by this request to those
+     * whose method is in a class whose name does <b>not</b> match this restricted
+     * regular expression, e.g. "java.*" or "*.Foo".
+     * @param classPattern the pattern String to filter against.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassExclusionFilter(String classPattern);
+
+    /**
+     * Restricts the events generated by this request to those in
+     * which the currently executing instance ("this") is the object
+     * specified.
+     * <P>
+     * Not all targets support this operation.
+     * Use {@link VirtualMachine#canUseInstanceFilters()}
+     * to determine if the operation is supported.
+     * @param instance the object which must be the current instance
+     * in order to pass this filter.
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addInstanceFilter(ObjectReference instance);
+}
diff --git a/src/share/classes/com/sun/jdi/request/MonitorWaitRequest.java b/src/share/classes/com/sun/jdi/request/MonitorWaitRequest.java
new file mode 100644
index 0000000..9cb162b
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/request/MonitorWaitRequest.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.request;
+
+import com.sun.jdi.*;
+
+/**
+ * Request for notification when a thread in the target VM is about to
+ * wait on a monitor object. That is, a thread is entering Object.wait().
+ * When an enabled MonitorWaitRequest is satisfied, an
+ * {@link com.sun.jdi.event.EventSet event set} containing a
+ * {@link com.sun.jdi.event.MonitorWaitEvent MonitorWaitEvent}
+ * will be placed on the
+ * {@link com.sun.jdi.event.EventQueue EventQueue}.
+ * The collection of existing MonitorWaitEvents is
+ * managed by the {@link EventRequestManager}
+ *
+ * @see com.sun.jdi.event.MonitorWaitEvent
+ * @see com.sun.jdi.event.EventQueue
+ * @see EventRequestManager
+ *
+ * @author Swamy Venkataramanappa
+ * @since  1.6
+ */
+@jdk.Exported
+public interface MonitorWaitRequest extends EventRequest {
+
+    /**
+     * Restricts the events generated by this request to those in
+     * the given thread.
+     * @param thread the thread to filter on.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addThreadFilter(ThreadReference thread);
+
+    /**
+     * Restricts the events generated by this request to those whose
+     * monitor object is of the given reference type or any of
+     * its subtypes.
+     *
+     * @param refType the reference type to filter on.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassFilter(ReferenceType refType);
+
+    /**
+     * Restricts the events generated by this request to those
+     * in which the name of the class of the monitor object matches this restricted
+     * regular expression. Regular expressions are limited
+     * to exact matches and patterns that begin with '*' or end with '*';
+     * for example, "*.Foo" or "java.*".
+     *
+     * @param classPattern the pattern String to filter for.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassFilter(String classPattern);
+
+    /**
+     * Restricts the events generated by this request to those
+     * in which the name of the class of the monitor object does <b>not</b>match this restricted
+     * regular expression, e.g.  "java.*" or "*.Foo".
+     * @param classPattern the pattern String to filter against.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassExclusionFilter(String classPattern);
+
+    /**
+     * Restricts the events generated by this request to those in
+     * which the currently executing instance ("this") is the object
+     * specified.
+     * <P>
+     * Not all targets support this operation.
+     * Use {@link VirtualMachine#canUseInstanceFilters()}
+     * to determine if the operation is supported.
+     * @param instance the object which must be the current instance
+     * in order to pass this filter.
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addInstanceFilter(ObjectReference instance);
+}
diff --git a/src/share/classes/com/sun/jdi/request/MonitorWaitedRequest.java b/src/share/classes/com/sun/jdi/request/MonitorWaitedRequest.java
new file mode 100644
index 0000000..6cc41fb
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/request/MonitorWaitedRequest.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.request;
+
+import com.sun.jdi.*;
+
+/**
+ * Request for notification when a thread in the target VM has finished waiting on
+ * a monitor object. That is, a thread is leaving Object.wait(). "
+ * When an enabled MonitorWaitedRequest is satisfied, an
+ * {@link com.sun.jdi.event.EventSet event set} containing a
+ * {@link com.sun.jdi.event.MonitorWaitedEvent MonitorWaitedEvent}
+ * will be placed on the
+ * {@link com.sun.jdi.event.EventQueue EventQueue}.
+ * The collection of existing MonitorWaitedEvents is
+ * managed by the {@link EventRequestManager}
+ *
+ * @see com.sun.jdi.event.MonitorWaitedEvent
+ * @see com.sun.jdi.event.EventQueue
+ * @see EventRequestManager
+ *
+ * @author Swamy Venkataramanappa
+ * @since  1.6
+ */
+@jdk.Exported
+public interface MonitorWaitedRequest extends EventRequest {
+
+    /**
+     * Restricts the events generated by this request to those in
+     * the given thread.
+     * @param thread the thread to filter on.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addThreadFilter(ThreadReference thread);
+
+    /**
+     * Restricts the events generated by this request to those whose
+     * monitor object is of the given reference type or any of
+     * its subtypes.
+     *
+     * @param refType the reference type to filter on.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassFilter(ReferenceType refType);
+
+    /**
+     * Restricts the events generated by this request to those
+     * in which the name of the class of the monitor object matches this restricted
+     * regular expression. Regular expressions are limited
+     * to exact matches and patterns that begin with '*' or end with '*';
+     * for example, "*.Foo" or "java.*".
+     *
+     * @param classPattern the pattern String to filter for.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassFilter(String classPattern);
+
+    /**
+     * Restricts the events generated by this request to those
+     * in which the name of the class of the monitor object does <b>not</b>match this restricted
+     * regular expression, e.g.  "java.*" or "*.Foo".
+     * @param classPattern the pattern String to filter against.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassExclusionFilter(String classPattern);
+
+    /**
+     * Restricts the events generated by this request to those in
+     * which the currently executing instance ("this") is the object
+     * specified.
+     * <P>
+     * Not all targets support this operation.
+     * Use {@link VirtualMachine#canUseInstanceFilters()}
+     * to determine if the operation is supported.
+     * @param instance the object which must be the current instance
+     * in order to pass this filter.
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addInstanceFilter(ObjectReference instance);
+}
diff --git a/src/share/classes/com/sun/jdi/request/StepRequest.java b/src/share/classes/com/sun/jdi/request/StepRequest.java
new file mode 100644
index 0000000..abcb249
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/request/StepRequest.java
@@ -0,0 +1,136 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.request;
+
+import com.sun.jdi.*;
+
+/**
+ * Request for notification when a step occurs in the target VM.
+ * When an enabled StepRequest is satisfied, an
+ * {@link com.sun.jdi.event.EventSet event set} containing a
+ * {@link com.sun.jdi.event.StepEvent StepEvent} will be placed on the
+ * {@link com.sun.jdi.event.EventQueue EventQueue}.
+ * The collection of existing StepRequests is
+ * managed by the {@link EventRequestManager}
+ *
+ * @see com.sun.jdi.event.StepEvent
+ * @see com.sun.jdi.event.EventQueue
+ * @see EventRequestManager
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface StepRequest extends EventRequest {
+
+    /** Step into any newly pushed frames */
+    int STEP_INTO = 1;
+    /** Step over any newly pushed frames */
+    int STEP_OVER = 2;
+    /** Step out of the current frame */
+    int STEP_OUT = 3;
+
+    /** Step to the next available location */
+    int STEP_MIN = -1;
+    /** Step to the next location on a different line */
+    int STEP_LINE = -2;
+
+    /**
+     * @return the thread on which the step event is being requested.
+     */
+    ThreadReference thread();
+
+    /**
+     * @return the step size
+     */
+    int size();
+
+    /**
+     * @return the step depth
+     */
+    int depth();
+
+    /**
+     * Restricts the events generated by this request to those whose
+     * location is in the given reference type or any of its subtypes.
+     * An event will be generated for any location in a reference type
+     * that can be safely cast to the given reference type.
+     *
+     * @param refType the reference type to filter on.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassFilter(ReferenceType refType);
+
+    /**
+     * Restricts the events generated by this request to those
+     * whose location is in a class whose name matches a restricted
+     * regular expression. Regular expressions are limited
+     * to exact matches and patterns that begin with '*' or end with '*';
+     * for example, "*.Foo" or "java.*".
+     *
+     * @param classPattern the pattern String to filter for.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassFilter(String classPattern);
+
+    /**
+     * Restricts the events generated by this request to those
+     * whose location is in a class whose name does <b>not</b> match a
+     * restricted regular expression. Regular expressions are limited
+     * to exact matches and patterns that begin with '*' or end with '*';
+     * for example, "*.Foo" or "java.*".
+     *
+     * @param classPattern the pattern String to filter against.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassExclusionFilter(String classPattern);
+
+    /**
+     * Restricts the events generated by this request to those in
+     * which the currently executing instance ("this") is the object
+     * specified.
+     * <P>
+     * Not all targets support this operation.
+     * Use {@link VirtualMachine#canUseInstanceFilters()}
+     * to determine if the operation is supported.
+     * @since 1.4
+     * @param instance the object which must be the current instance
+     * in order to pass this filter.
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addInstanceFilter(ObjectReference instance);
+}
diff --git a/src/share/classes/com/sun/jdi/request/ThreadDeathRequest.java b/src/share/classes/com/sun/jdi/request/ThreadDeathRequest.java
new file mode 100644
index 0000000..916fff4
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/request/ThreadDeathRequest.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.request;
+
+import com.sun.jdi.*;
+
+/**
+ * Request for notification when a thread terminates in the target VM.
+ * When an enabled ThreadDeathRequest is satisfied, an
+ * {@link com.sun.jdi.event.EventSet event set} containing a
+ * {@link com.sun.jdi.event.ThreadDeathEvent ThreadDeathEvent}
+ * will be placed on the
+ * {@link com.sun.jdi.event.EventQueue EventQueue}.
+ * The collection of existing ThreadDeathRequests is
+ * managed by the {@link EventRequestManager}
+ *
+ * @see com.sun.jdi.event.ThreadDeathEvent
+ * @see com.sun.jdi.event.EventQueue
+ * @see EventRequestManager
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ThreadDeathRequest extends EventRequest {
+
+    /**
+     * Restricts the events generated by this request to those in
+     * the given thread.
+     * @param thread the thread to filter on.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addThreadFilter(ThreadReference thread);
+}
diff --git a/src/share/classes/com/sun/jdi/request/ThreadStartRequest.java b/src/share/classes/com/sun/jdi/request/ThreadStartRequest.java
new file mode 100644
index 0000000..c34d171
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/request/ThreadStartRequest.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.request;
+
+import com.sun.jdi.*;
+
+/**
+ * Request for notification when a thread starts execution in the target VM.
+ * When an enabled ThreadStartRequest is hit, an
+ * {@link com.sun.jdi.event.EventSet event set} containing a
+ * {@link com.sun.jdi.event.ThreadStartEvent ThreadStartEvent}
+ * will be placed on the
+ * {@link com.sun.jdi.event.EventQueue EventQueue}.
+ * The collection of existing ThreadStartRequests is
+ * managed by the {@link EventRequestManager}
+ *
+ * @see com.sun.jdi.event.ThreadStartEvent
+ * @see com.sun.jdi.event.EventQueue
+ * @see EventRequestManager
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface ThreadStartRequest extends EventRequest {
+
+    /**
+     * Restricts the events generated by this request to those in
+     * the given thread.
+     * @param thread the thread to filter on.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addThreadFilter(ThreadReference thread);
+}
diff --git a/src/share/classes/com/sun/jdi/request/VMDeathRequest.java b/src/share/classes/com/sun/jdi/request/VMDeathRequest.java
new file mode 100644
index 0000000..69a767f
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/request/VMDeathRequest.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.request;
+
+import com.sun.jdi.*;
+
+/**
+ * Request for notification when the target VM terminates.
+ * When an enabled VMDeathRequest is satisfied, an
+ * {@link com.sun.jdi.event.EventSet event set} containing a
+ * {@link com.sun.jdi.event.VMDeathEvent VMDeathEvent}
+ * will be placed on the
+ * {@link com.sun.jdi.event.EventQueue EventQueue}.
+ * The collection of existing VMDeathRequests is
+ * managed by the {@link EventRequestManager}
+ * <P>
+ * Even without creating a VMDeathRequest, a single
+ * unsolicited VMDeathEvent will be sent with a
+ * {@link EventRequest#suspendPolicy() suspend policy}
+ * of {@link EventRequest#SUSPEND_NONE SUSPEND_NONE}.
+ * This request would typically be created so that a
+ * VMDeathEvent with a suspend policy of
+ * {@link EventRequest#SUSPEND_ALL SUSPEND_ALL}
+ * will be sent.  This event can be used to assure
+ * completion of any processing which requires the VM
+ * to be alive (e.g. event processing).  Note: the
+ * unsolicited VMDeathEvent will still be sent.
+ *
+ * @see com.sun.jdi.event.VMDeathEvent
+ * @see com.sun.jdi.event.EventQueue
+ * @see EventRequestManager
+ *
+ * @author Robert Field
+ * @since  1.4
+ */
+@jdk.Exported
+public interface VMDeathRequest extends EventRequest {
+
+}
diff --git a/src/share/classes/com/sun/jdi/request/WatchpointRequest.java b/src/share/classes/com/sun/jdi/request/WatchpointRequest.java
new file mode 100644
index 0000000..0b0de7e
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/request/WatchpointRequest.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.jdi.request;
+
+import com.sun.jdi.*;
+
+/**
+ * Identifies a {@link Field} in the target VM being watched.
+ *
+ * @see AccessWatchpointRequest
+ * @see ModificationWatchpointRequest
+ * @see com.sun.jdi.event.EventQueue
+ * @see EventRequestManager
+ *
+ * @author Robert Field
+ * @since  1.3
+ */
+@jdk.Exported
+public interface WatchpointRequest extends EventRequest {
+
+    /**
+     * Gets the Field being watched by this WatchpointRequest.
+     *
+     * @return the {@link Field}  this Watchpoint is monitoring.
+     */
+    Field field();
+
+    /**
+     * Restricts the events generated by this request to those in
+     * the given thread.
+     * @param thread the thread to filter on.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addThreadFilter(ThreadReference thread);
+
+    /**
+     * Restricts the events generated by this request to those whose
+     * location is in the given reference type or any of its subtypes.
+     * An event will be generated for any location in a reference type
+     * that can be safely cast to the given reference type.
+     *
+     * @param refType the reference type to filter on.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassFilter(ReferenceType refType);
+
+    /**
+     * Restricts the events generated by this request to those
+     * whose location is in a class whose name matches a restricted
+     * regular expression. Regular expressions are limited
+     * to exact matches and patterns that begin with '*' or end with '*';
+     * for example, "*.Foo" or "java.*".
+     *
+     * @param classPattern the pattern String to filter for.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassFilter(String classPattern);
+
+    /**
+     * Restricts the events generated by this request to those
+     * whose location is in a class whose name does <b>not</b> match this
+     * restricted regular expression. Regular expressions are limited
+     * to exact matches and patterns that begin with '*' or end with '*';
+     * for example, "*.Foo" or "java.*".
+     *
+     * @param classPattern the pattern String to filter against.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addClassExclusionFilter(String classPattern);
+
+    /**
+     * Restricts the events generated by this request to those in
+     * which the currently executing instance ("this") is the object
+     * specified.
+     * <P>
+     * Not all targets support this operation.
+     * Use {@link VirtualMachine#canUseInstanceFilters()}
+     * to determine if the operation is supported.
+     * @since 1.4
+     * @param instance the object which must be the current instance
+     * in order to pass this filter.
+     * @throws java.lang.UnsupportedOperationException if
+     * the target virtual machine does not support this
+     * operation.
+     * @throws InvalidRequestStateException if this request is currently
+     * enabled or has been deleted.
+     * Filters may be added only to disabled requests.
+     */
+    void addInstanceFilter(ObjectReference instance);
+}
diff --git a/src/share/classes/com/sun/jdi/request/package-info.java b/src/share/classes/com/sun/jdi/request/package-info.java
new file mode 100644
index 0000000..add151d
--- /dev/null
+++ b/src/share/classes/com/sun/jdi/request/package-info.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * This package is used to request that a JDI
+ * event be sent under specified conditions.
+ * With the exception of termination events, which are
+ * always sent, there is one kind of
+ * {@link com.sun.jdi.request.EventRequest} for each kind of
+ * {@link com.sun.jdi.event.Event Event} - for example,
+ * {@link com.sun.jdi.request.BreakpointRequest} is used to request a
+ * {@link com.sun.jdi.event.BreakpointEvent BreakpointEvent}.
+ * Event requests are created by the
+ * {@link com.sun.jdi.request.EventRequestManager}.
+ * Events and event processing are defined in the
+ * {@link com.sun.jdi.event} package.
+ * <p>
+ * Methods may be added to the interfaces in the JDI packages in future
+ * releases. Existing packages may be renamed if the JDI becomes a standard
+ * extension.
+ */
+
+@jdk.Exported
+package com.sun.jdi.request;
diff --git a/src/share/classes/com/sun/tools/jdi/AbstractLauncher.java b/src/share/classes/com/sun/tools/jdi/AbstractLauncher.java
new file mode 100644
index 0000000..75d5d0a
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/AbstractLauncher.java
@@ -0,0 +1,273 @@
+/*
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.tools.jdi.*;
+import com.sun.jdi.connect.*;
+import com.sun.jdi.connect.spi.*;
+import com.sun.jdi.*;
+
+import java.util.Map;
+import java.util.StringTokenizer;
+import java.util.List;
+import java.util.ArrayList;
+import java.io.IOException;
+import java.io.InterruptedIOException;
+
+abstract class AbstractLauncher extends ConnectorImpl implements LaunchingConnector {
+
+    abstract public VirtualMachine
+        launch(Map<String,? extends Connector.Argument> arguments)
+                                 throws IOException,
+                                        IllegalConnectorArgumentsException,
+                                        VMStartException;
+    abstract public String name();
+    abstract public String description();
+
+    ThreadGroup grp;
+
+    AbstractLauncher() {
+        super();
+
+        grp = Thread.currentThread().getThreadGroup();
+        ThreadGroup parent = null;
+        while ((parent = grp.getParent()) != null) {
+            grp = parent;
+        }
+    }
+
+    String[] tokenizeCommand(String command, char quote) {
+        String quoteStr = String.valueOf(quote); // easier to deal with
+
+        /*
+         * Tokenize the command, respecting the given quote character.
+         */
+        StringTokenizer tokenizer = new StringTokenizer(command,
+                                                        quote + " \t\r\n\f",
+                                                        true);
+        String quoted = null;
+        String pending = null;
+        List<String> tokenList = new ArrayList<String>();
+        while (tokenizer.hasMoreTokens()) {
+            String token = tokenizer.nextToken();
+            if (quoted != null) {
+                if (token.equals(quoteStr)) {
+                    tokenList.add(quoted);
+                    quoted = null;
+                } else {
+                    quoted += token;
+                }
+            } else if (pending != null) {
+                if (token.equals(quoteStr)) {
+                    quoted = pending;
+                } else if ((token.length() == 1) &&
+                           Character.isWhitespace(token.charAt(0))) {
+                    tokenList.add(pending);
+                } else {
+                    throw new InternalException("Unexpected token: " + token);
+                }
+                pending = null;
+            } else {
+                if (token.equals(quoteStr)) {
+                    quoted = "";
+                } else if ((token.length() == 1) &&
+                           Character.isWhitespace(token.charAt(0))) {
+                    // continue
+                } else {
+                    pending = token;
+                }
+            }
+        }
+
+        /*
+         * Add final token.
+         */
+        if (pending != null) {
+            tokenList.add(pending);
+        }
+
+        /*
+         * An unclosed quote at the end of the command. Do an
+         * implicit end quote.
+         */
+        if (quoted != null) {
+            tokenList.add(quoted);
+        }
+
+        String[] tokenArray = new String[tokenList.size()];
+        for (int i = 0; i < tokenList.size(); i++) {
+            tokenArray[i] = tokenList.get(i);
+        }
+        return tokenArray;
+    }
+
+    protected VirtualMachine launch(String[] commandArray, String address,
+                                    TransportService.ListenKey listenKey,
+                                    TransportService ts)
+                                    throws IOException, VMStartException {
+        Helper helper = new Helper(commandArray, address, listenKey, ts);
+        helper.launchAndAccept();
+
+        VirtualMachineManager manager =
+            Bootstrap.virtualMachineManager();
+
+        return manager.createVirtualMachine(helper.connection(),
+                                            helper.process());
+    }
+
+    /**
+     * This class simply provides a context for a single launch and
+     * accept. It provides instance fields that can be used by
+     * all threads involved. This stuff can't be in the Connector proper
+     * because the connector is a singleton and is not specific to any
+     * one launch.
+     */
+    private class Helper {
+        private final String address;
+        private TransportService.ListenKey listenKey;
+        private TransportService ts;
+        private final String[] commandArray;
+        private Process process = null;
+        private Connection connection = null;
+        private IOException acceptException = null;
+        private boolean exited = false;
+
+        Helper(String[] commandArray, String address, TransportService.ListenKey listenKey,
+            TransportService ts) {
+            this.commandArray = commandArray;
+            this.address = address;
+            this.listenKey = listenKey;
+            this.ts = ts;
+        }
+
+        String commandString() {
+            String str = "";
+            for (int i = 0; i < commandArray.length; i++) {
+                if (i > 0) {
+                    str += " ";
+                }
+                str += commandArray[i];
+            }
+            return str;
+        }
+
+        synchronized void launchAndAccept() throws
+                                IOException, VMStartException {
+
+            process = Runtime.getRuntime().exec(commandArray);
+
+            Thread acceptingThread = acceptConnection();
+            Thread monitoringThread = monitorTarget();
+            try {
+                while ((connection == null) &&
+                       (acceptException == null) &&
+                       !exited) {
+                    wait();
+                }
+
+                if (exited) {
+                    throw new VMStartException(
+                        "VM initialization failed for: " + commandString(), process);
+                }
+                if (acceptException != null) {
+                    // Rethrow the exception in this thread
+                    throw acceptException;
+                }
+            } catch (InterruptedException e) {
+                throw new InterruptedIOException("Interrupted during accept");
+            } finally {
+                acceptingThread.interrupt();
+                monitoringThread.interrupt();
+            }
+        }
+
+        Process process() {
+            return process;
+        }
+
+        Connection connection() {
+            return connection;
+        }
+
+        synchronized void notifyOfExit() {
+            exited = true;
+            notify();
+        }
+
+        synchronized void notifyOfConnection(Connection connection) {
+            this.connection = connection;
+            notify();
+        }
+
+        synchronized void notifyOfAcceptException(IOException acceptException) {
+            this.acceptException = acceptException;
+            notify();
+        }
+
+        Thread monitorTarget() {
+            Thread thread = new Thread(grp,
+                                       "launched target monitor") {
+                public void run() {
+                    try {
+                        process.waitFor();
+                        /*
+                         * Notify waiting thread of VM error termination
+                         */
+                        notifyOfExit();
+                    } catch (InterruptedException e) {
+                        // Connection has been established, stop monitoring
+                    }
+                }
+            };
+            thread.setDaemon(true);
+            thread.start();
+            return thread;
+        }
+
+        Thread acceptConnection() {
+            Thread thread = new Thread(grp,
+                                       "connection acceptor") {
+                public void run() {
+                    try {
+                        Connection connection = ts.accept(listenKey, 0, 0);
+                        /*
+                         * Notify waiting thread of connection
+                         */
+                        notifyOfConnection(connection);
+                    } catch (InterruptedIOException e) {
+                        // VM terminated, stop accepting
+                    } catch (IOException e) {
+                        // Report any other exception to waiting thread
+                        notifyOfAcceptException(e);
+                    }
+                }
+            };
+            thread.setDaemon(true);
+            thread.start();
+            return thread;
+        }
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/ArrayReferenceImpl.java b/src/share/classes/com/sun/tools/jdi/ArrayReferenceImpl.java
new file mode 100644
index 0000000..88d26e7
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/ArrayReferenceImpl.java
@@ -0,0 +1,283 @@
+/*
+ * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+
+public class ArrayReferenceImpl extends ObjectReferenceImpl
+    implements ArrayReference
+{
+    int length = -1;
+
+    ArrayReferenceImpl(VirtualMachine aVm,long aRef) {
+        super(aVm,aRef);
+    }
+
+    protected ClassTypeImpl invokableReferenceType(Method method) {
+        // The method has to be a method on Object since
+        // arrays don't have methods nor any other 'superclasses'
+        // So, use the ClassTypeImpl for Object instead of
+        // the ArrayTypeImpl for the array itself.
+        return (ClassTypeImpl)method.declaringType();
+    }
+
+    ArrayTypeImpl arrayType() {
+        return (ArrayTypeImpl)type();
+    }
+
+    /**
+     * Return array length.
+     * Need not be synchronized since it cannot be provably stale.
+     */
+    public int length() {
+        if(length == -1) {
+            try {
+                length = JDWP.ArrayReference.Length.
+                    process(vm, this).arrayLength;
+            } catch (JDWPException exc) {
+                throw exc.toJDIException();
+            }
+        }
+        return length;
+    }
+
+    public Value getValue(int index) {
+        List<Value> list = getValues(index, 1);
+        return list.get(0);
+    }
+
+    public List<Value> getValues() {
+        return getValues(0, -1);
+    }
+
+    /**
+     * Validate that the range to set/get is valid.
+     * length of -1 (meaning rest of array) has been converted
+     * before entry.
+     */
+    private void validateArrayAccess(int index, int length) {
+        // because length can be computed from index,
+        // index must be tested first for correct error message
+        if ((index < 0) || (index > length())) {
+            throw new IndexOutOfBoundsException(
+                        "Invalid array index: " + index);
+        }
+        if (length < 0) {
+            throw new IndexOutOfBoundsException(
+                        "Invalid array range length: " + length);
+        }
+        if (index + length > length()) {
+            throw new IndexOutOfBoundsException(
+                        "Invalid array range: " +
+                        index + " to " + (index + length - 1));
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    private static <T> T cast(Object x) {
+        return (T)x;
+    }
+
+    public List<Value> getValues(int index, int length) {
+        if (length == -1) { // -1 means the rest of the array
+           length = length() - index;
+        }
+        validateArrayAccess(index, length);
+        if (length == 0) {
+            return new ArrayList<Value>();
+        }
+
+        List<Value> vals;
+        try {
+            vals = cast(JDWP.ArrayReference.GetValues.process(vm, this, index, length).values);
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+
+        return vals;
+    }
+
+    public void setValue(int index, Value value)
+            throws InvalidTypeException,
+                   ClassNotLoadedException {
+        List<Value> list = new ArrayList<Value>(1);
+        list.add(value);
+        setValues(index, list, 0, 1);
+    }
+
+    public void setValues(List<? extends Value> values)
+            throws InvalidTypeException,
+                   ClassNotLoadedException {
+        setValues(0, values, 0, -1);
+    }
+
+    public void setValues(int index, List<? extends Value> values,
+                          int srcIndex, int length)
+            throws InvalidTypeException,
+                   ClassNotLoadedException {
+
+        if (length == -1) { // -1 means the rest of the array
+            // shorter of, the rest of the array and rest of
+            // the source values
+            length = Math.min(length() - index,
+                              values.size() - srcIndex);
+        }
+        validateMirrorsOrNulls(values);
+        validateArrayAccess(index, length);
+
+        if ((srcIndex < 0) || (srcIndex > values.size())) {
+            throw new IndexOutOfBoundsException(
+                        "Invalid source index: " + srcIndex);
+        }
+        if (srcIndex + length > values.size()) {
+            throw new IndexOutOfBoundsException(
+                        "Invalid source range: " +
+                        srcIndex + " to " +
+                        (srcIndex + length - 1));
+        }
+
+        boolean somethingToSet = false;;
+        ValueImpl[] setValues = new ValueImpl[length];
+
+        for (int i = 0; i < length; i++) {
+            ValueImpl value = (ValueImpl)values.get(srcIndex + i);
+
+            try {
+                // Validate and convert if necessary
+                setValues[i] =
+                  ValueImpl.prepareForAssignment(value,
+                                                 new Component());
+                somethingToSet = true;
+            } catch (ClassNotLoadedException e) {
+                /*
+                 * Since we got this exception,
+                 * the component must be a reference type.
+                 * This means the class has not yet been loaded
+                 * through the defining class's class loader.
+                 * If the value we're trying to set is null,
+                 * then setting to null is essentially a
+                 * no-op, and we should allow it without an
+                 * exception.
+                 */
+                if (value != null) {
+                    throw e;
+                }
+            }
+        }
+        if (somethingToSet) {
+            try {
+                JDWP.ArrayReference.SetValues.
+                    process(vm, this, index, setValues);
+            } catch (JDWPException exc) {
+                throw exc.toJDIException();
+            }
+        }
+    }
+
+    public String toString() {
+        return "instance of " + arrayType().componentTypeName() +
+               "[" + length() + "] (id=" + uniqueID() + ")";
+    }
+
+    byte typeValueKey() {
+        return JDWP.Tag.ARRAY;
+    }
+
+    void validateAssignment(ValueContainer destination)
+                            throws InvalidTypeException, ClassNotLoadedException {
+        try {
+            super.validateAssignment(destination);
+        } catch (ClassNotLoadedException e) {
+            /*
+             * An array can be used extensively without the
+             * enclosing loader being recorded by the VM as an
+             * initiating loader of the array type. In addition, the
+             * load of an array class is fairly harmless as long as
+             * the component class is already loaded. So we relax the
+             * rules a bit and allow the assignment as long as the
+             * ultimate component types are assignable.
+             */
+            boolean valid = false;
+            JNITypeParser destParser = new JNITypeParser(
+                                       destination.signature());
+            JNITypeParser srcParser = new JNITypeParser(
+                                       arrayType().signature());
+            int destDims = destParser.dimensionCount();
+            if (destDims <= srcParser.dimensionCount()) {
+                /*
+                 * Remove all dimensions from the destination. Remove
+                 * the same number of dimensions from the source.
+                 * Get types for both and check to see if they are
+                 * compatible.
+                 */
+                String destComponentSignature =
+                    destParser.componentSignature(destDims);
+                Type destComponentType =
+                    destination.findType(destComponentSignature);
+                String srcComponentSignature =
+                    srcParser.componentSignature(destDims);
+                Type srcComponentType =
+                    arrayType().findComponentType(srcComponentSignature);
+                valid = ArrayTypeImpl.isComponentAssignable(destComponentType,
+                                                          srcComponentType);
+            }
+
+            if (!valid) {
+                throw new InvalidTypeException("Cannot assign " +
+                                               arrayType().name() +
+                                               " to " +
+                                               destination.typeName());
+            }
+        }
+    }
+
+    /*
+     * Represents an array component to other internal parts of this
+     * implementation. This is not exposed at the JDI level. Currently,
+     * this class is needed only for type checking so it does not even
+     * reference a particular component - just a generic component
+     * of this array. In the future we may need to expand its use.
+     */
+    class Component implements ValueContainer {
+        public Type type() throws ClassNotLoadedException {
+            return arrayType().componentType();
+        }
+        public String typeName() {
+            return arrayType().componentTypeName();
+        }
+        public String signature() {
+            return arrayType().componentSignature();
+        }
+        public Type findType(String signature) throws ClassNotLoadedException {
+            return arrayType().findComponentType(signature);
+        }
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/ArrayTypeImpl.java b/src/share/classes/com/sun/tools/jdi/ArrayTypeImpl.java
new file mode 100644
index 0000000..3449a45
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/ArrayTypeImpl.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+public class ArrayTypeImpl extends ReferenceTypeImpl
+    implements ArrayType
+{
+    protected ArrayTypeImpl(VirtualMachine aVm, long aRef) {
+        super(aVm, aRef);
+    }
+
+    public ArrayReference newInstance(int length) {
+        try {
+            return (ArrayReference)JDWP.ArrayType.NewInstance.
+                                       process(vm, this, length).newArray;
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+    }
+
+    public String componentSignature() {
+        return signature().substring(1); // Just skip the leading '['
+    }
+
+    public String componentTypeName() {
+        JNITypeParser parser = new JNITypeParser(componentSignature());
+        return parser.typeName();
+    }
+
+    Type type() throws ClassNotLoadedException {
+        return findType(componentSignature());
+    }
+
+    @Override
+    void addVisibleMethods(Map<String, Method> map, Set<InterfaceType> seenInterfaces) {
+        // arrays don't have methods
+    }
+
+    public List<Method> allMethods() {
+        return new ArrayList<Method>(0);   // arrays don't have methods
+    }
+
+    /*
+     * Find the type object, if any, of a component type of this array.
+     * The component type does not have to be immediate; e.g. this method
+     * can be used to find the component Foo of Foo[][]. This method takes
+     * advantage of the property that an array and its component must have
+     * the same class loader. Since array set operations don't have an
+     * implicit enclosing type like field and variable set operations,
+     * this method is sometimes needed for proper type checking.
+     */
+    Type findComponentType(String signature) throws ClassNotLoadedException {
+        byte tag = (byte)signature.charAt(0);
+        if (PacketStream.isObjectTag(tag)) {
+            // It's a reference type
+            JNITypeParser parser = new JNITypeParser(componentSignature());
+            List<ReferenceType> list = vm.classesByName(parser.typeName());
+            Iterator<ReferenceType> iter = list.iterator();
+            while (iter.hasNext()) {
+                ReferenceType type = iter.next();
+                ClassLoaderReference cl = type.classLoader();
+                if ((cl == null)?
+                         (classLoader() == null) :
+                         (cl.equals(classLoader()))) {
+                    return type;
+                }
+            }
+            // Component class has not yet been loaded
+            throw new ClassNotLoadedException(componentTypeName());
+        } else {
+            // It's a primitive type
+            return vm.primitiveTypeMirror(tag);
+        }
+    }
+
+    public Type componentType() throws ClassNotLoadedException {
+        return findComponentType(componentSignature());
+    }
+
+    static boolean isComponentAssignable(Type destination, Type source) {
+        if (source instanceof PrimitiveType) {
+            // Assignment of primitive arrays requires identical
+            // component types.
+            return source.equals(destination);
+        } else {
+            if (destination instanceof PrimitiveType) {
+                return false;
+            }
+
+            ReferenceTypeImpl refSource = (ReferenceTypeImpl)source;
+            ReferenceTypeImpl refDestination = (ReferenceTypeImpl)destination;
+            // Assignment of object arrays requires availability
+            // of widening conversion of component types
+            return refSource.isAssignableTo(refDestination);
+        }
+    }
+
+    /*
+     * Return true if an instance of the  given reference type
+     * can be assigned to a variable of this type
+     */
+    boolean isAssignableTo(ReferenceType destType) {
+        if (destType instanceof ArrayType) {
+            try {
+                Type destComponentType = ((ArrayType)destType).componentType();
+                return isComponentAssignable(destComponentType, componentType());
+            } catch (ClassNotLoadedException e) {
+                // One or both component types has not yet been
+                // loaded => can't assign
+                return false;
+            }
+        } else if (destType instanceof InterfaceType) {
+            // Only valid InterfaceType assignee is Cloneable
+            return destType.name().equals("java.lang.Cloneable");
+        } else {
+            // Only valid ClassType assignee is Object
+            return destType.name().equals("java.lang.Object");
+        }
+    }
+
+    List<ReferenceType> inheritedTypes() {
+        return new ArrayList<ReferenceType>(0);
+    }
+
+    void getModifiers() {
+        if (modifiers != -1) {
+            return;
+        }
+        /*
+         * For object arrays, the return values for Interface
+         * Accessible.isPrivate(), Accessible.isProtected(),
+         * etc... are the same as would be returned for the
+         * component type.  Fetch the modifier bits from the
+         * component type and use those.
+         *
+         * For primitive arrays, the modifiers are always
+         *   VMModifiers.FINAL | VMModifiers.PUBLIC
+         *
+         * Reference com.sun.jdi.Accessible.java.
+         */
+        try {
+            Type t = componentType();
+            if (t instanceof PrimitiveType) {
+                modifiers = VMModifiers.FINAL | VMModifiers.PUBLIC;
+            } else {
+                ReferenceType rt = (ReferenceType)t;
+                modifiers = rt.modifiers();
+            }
+        } catch (ClassNotLoadedException cnle) {
+            cnle.printStackTrace();
+        }
+    }
+
+    public String toString() {
+       return "array class " + name() + " (" + loaderString() + ")";
+    }
+
+    /*
+     * Save a pointless trip over the wire for these methods
+     * which have undefined results for arrays.
+     */
+    public boolean isPrepared() { return true; }
+    public boolean isVerified() { return true; }
+    public boolean isInitialized() { return true; }
+    public boolean failedToInitialize() { return false; }
+    public boolean isAbstract() { return false; }
+
+    /*
+     * Defined always to be true for arrays
+     */
+    public boolean isFinal() { return true; }
+
+    /*
+     * Defined always to be false for arrays
+     */
+    public boolean isStatic() { return false; }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/BaseLineInfo.java b/src/share/classes/com/sun/tools/jdi/BaseLineInfo.java
new file mode 100644
index 0000000..872af85
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/BaseLineInfo.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+class BaseLineInfo implements LineInfo {
+    private final int lineNumber;
+    private final ReferenceTypeImpl declaringType;
+
+    BaseLineInfo(int lineNumber,
+                 ReferenceTypeImpl declaringType) {
+        this.lineNumber = lineNumber;
+        this.declaringType = declaringType;
+    }
+
+    public String liStratum() {
+        return SDE.BASE_STRATUM_NAME;
+    }
+
+    public int liLineNumber() {
+        return lineNumber;
+    }
+
+    public String liSourceName()
+                            throws AbsentInformationException {
+        return declaringType.baseSourceName();
+    }
+
+    public String liSourcePath()
+                            throws AbsentInformationException {
+        return declaringType.baseSourcePath();
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/BooleanTypeImpl.java b/src/share/classes/com/sun/tools/jdi/BooleanTypeImpl.java
new file mode 100644
index 0000000..31f560f
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/BooleanTypeImpl.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+public class BooleanTypeImpl extends PrimitiveTypeImpl implements BooleanType {
+    BooleanTypeImpl(VirtualMachine vm) {
+        super(vm);
+    }
+
+    public String signature() {
+        return String.valueOf((char)JDWP.Tag.BOOLEAN);
+    }
+
+    PrimitiveValue convert(PrimitiveValue value) throws InvalidTypeException {
+        return vm.mirrorOf(((PrimitiveValueImpl)value).checkedBooleanValue());
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/BooleanValueImpl.java b/src/share/classes/com/sun/tools/jdi/BooleanValueImpl.java
new file mode 100644
index 0000000..17144bb
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/BooleanValueImpl.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+public class BooleanValueImpl extends PrimitiveValueImpl
+                              implements BooleanValue {
+    private boolean value;
+
+    BooleanValueImpl(VirtualMachine aVm,boolean aValue) {
+        super(aVm);
+
+        value = aValue;
+    }
+
+    public boolean equals(Object obj) {
+        if ((obj != null) && (obj instanceof BooleanValue)) {
+            return (value == ((BooleanValue)obj).value())
+                   && super.equals(obj);
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        /*
+         * TO DO: Better hash code
+         */
+        return intValue();
+    }
+
+    public Type type() {
+        return vm.theBooleanType();
+    }
+
+    public boolean value() {
+        return value;
+    }
+
+    public boolean booleanValue() {
+        return value;
+    }
+
+    public byte byteValue() {
+        return(byte)((value)?1:0);
+    }
+
+    public char charValue() {
+        return(char)((value)?1:0);
+    }
+
+    public short shortValue() {
+        return(short)((value)?1:0);
+    }
+
+    public int intValue() {
+        return (value)?1:0;
+    }
+
+    public long longValue() {
+        return(long)((value)?1:0);
+    }
+
+    public float floatValue() {
+        return(float)((value)?1.0:0.0);
+    }
+
+    public double doubleValue() {
+        return (value)?1.0:0.0;
+    }
+
+    public String toString() {
+        return "" + value;
+    }
+
+    byte typeValueKey() {
+        return JDWP.Tag.BOOLEAN;
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/ByteTypeImpl.java b/src/share/classes/com/sun/tools/jdi/ByteTypeImpl.java
new file mode 100644
index 0000000..1e3b053
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/ByteTypeImpl.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+public class ByteTypeImpl extends PrimitiveTypeImpl implements ByteType {
+    ByteTypeImpl(VirtualMachine vm) {
+        super(vm);
+    }
+
+
+    public String signature() {
+        return String.valueOf((char)JDWP.Tag.BYTE);
+    }
+
+    PrimitiveValue convert(PrimitiveValue value) throws InvalidTypeException {
+        return vm.mirrorOf(((PrimitiveValueImpl)value).checkedByteValue());
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/ByteValueImpl.java b/src/share/classes/com/sun/tools/jdi/ByteValueImpl.java
new file mode 100644
index 0000000..effb240
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/ByteValueImpl.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+public class ByteValueImpl extends PrimitiveValueImpl
+                           implements ByteValue {
+    private byte value;
+
+    ByteValueImpl(VirtualMachine aVm,byte aValue) {
+        super(aVm);
+
+        value = aValue;
+    }
+
+    public boolean equals(Object obj) {
+        if ((obj != null) && (obj instanceof ByteValue)) {
+            return (value == ((ByteValue)obj).value())
+                   && super.equals(obj);
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        /*
+         * TO DO: Better hash code
+         */
+        return intValue();
+    }
+
+    public int compareTo(ByteValue obj) {
+        byte other = obj.value();
+        return value() - other;
+    }
+
+
+    public Type type() {
+        return vm.theByteType();
+    }
+
+    public byte value() {
+        return value;
+    }
+
+    public boolean booleanValue() {
+        return(value == 0)?false:true;
+    }
+
+    public byte byteValue() {
+        return value;
+    }
+
+    public char charValue() {
+        return(char)value;
+    }
+
+    public short shortValue() {
+        return(short)value;
+    }
+
+    public int intValue() {
+        return(int)value;
+    }
+
+    public long longValue() {
+        return(long)value;
+    }
+
+    public float floatValue() {
+        return(float)value;
+    }
+
+    public double doubleValue() {
+        return(double)value;
+    }
+
+    char checkedCharValue() throws InvalidTypeException {
+        if ((value > Character.MAX_VALUE) || (value < Character.MIN_VALUE)) {
+            throw new InvalidTypeException("Can't convert " + value + " to char");
+        } else {
+            return super.checkedCharValue();
+        }
+    }
+
+    public String toString() {
+        return "" + value;
+    }
+
+    byte typeValueKey() {
+        return JDWP.Tag.BYTE;
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/CharTypeImpl.java b/src/share/classes/com/sun/tools/jdi/CharTypeImpl.java
new file mode 100644
index 0000000..6dd150a
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/CharTypeImpl.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+public class CharTypeImpl extends PrimitiveTypeImpl implements CharType {
+    CharTypeImpl(VirtualMachine vm) {
+        super(vm);
+    }
+
+
+    public String signature() {
+        return String.valueOf((char)JDWP.Tag.CHAR);
+    }
+
+    PrimitiveValue convert(PrimitiveValue value) throws InvalidTypeException {
+        return vm.mirrorOf(((PrimitiveValueImpl)value).checkedCharValue());
+    }
+
+}
diff --git a/src/share/classes/com/sun/tools/jdi/CharValueImpl.java b/src/share/classes/com/sun/tools/jdi/CharValueImpl.java
new file mode 100644
index 0000000..f367968
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/CharValueImpl.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+public class CharValueImpl extends PrimitiveValueImpl
+                           implements CharValue {
+    private char value;
+
+    CharValueImpl(VirtualMachine aVm,char aValue) {
+        super(aVm);
+
+        value = aValue;
+    }
+
+    public boolean equals(Object obj) {
+        if ((obj != null) && (obj instanceof CharValue)) {
+            return (value == ((CharValue)obj).value()) &&
+                   super.equals(obj);
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        /*
+         * TO DO: Better hash code
+         */
+        return intValue();
+    }
+
+    public int compareTo(CharValue obj) {
+        char other = obj.value();
+        return value() - other;
+    }
+
+    public Type type() {
+        return vm.theCharType();
+    }
+
+    public char value() {
+        return value;
+    }
+
+    public boolean booleanValue() {
+        return(value == 0)?false:true;
+    }
+
+    public byte byteValue() {
+        return(byte)value;
+    }
+
+    public char charValue() {
+        return value;
+    }
+
+    public short shortValue() {
+        return(short)value;
+    }
+
+    public int intValue() {
+        return(int)value;
+    }
+
+    public long longValue() {
+        return(long)value;
+    }
+
+    public float floatValue() {
+        return(float)value;
+    }
+
+    public double doubleValue() {
+        return(double)value;
+    }
+
+    public String toString() {
+        return "" + value;
+    }
+
+    byte checkedByteValue() throws InvalidTypeException {
+        // Note: since char is unsigned, don't check against MIN_VALUE
+        if (value > Byte.MAX_VALUE) {
+            throw new InvalidTypeException("Can't convert " + value + " to byte");
+        } else {
+            return super.checkedByteValue();
+        }
+    }
+
+    short checkedShortValue() throws InvalidTypeException {
+        // Note: since char is unsigned, don't check against MIN_VALUE
+        if (value > Short.MAX_VALUE) {
+            throw new InvalidTypeException("Can't convert " + value + " to short");
+        } else {
+            return super.checkedShortValue();
+        }
+    }
+
+    byte typeValueKey() {
+        return JDWP.Tag.CHAR;
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/ClassLoaderReferenceImpl.java b/src/share/classes/com/sun/tools/jdi/ClassLoaderReferenceImpl.java
new file mode 100644
index 0000000..4b29acd
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/ClassLoaderReferenceImpl.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+import java.util.*;
+
+public class ClassLoaderReferenceImpl extends ObjectReferenceImpl
+                  implements ClassLoaderReference, VMListener  {
+
+    // This is cached only while the VM is suspended
+    private static class Cache extends ObjectReferenceImpl.Cache {
+        List<ReferenceType> visibleClasses = null;
+    }
+
+    protected ObjectReferenceImpl.Cache newCache() {
+        return new Cache();
+    }
+
+    ClassLoaderReferenceImpl(VirtualMachine aVm, long ref) {
+        super(aVm, ref);
+        vm.state().addListener(this);
+    }
+
+    protected String description() {
+        return "ClassLoaderReference " + uniqueID();
+    }
+
+    public List<ReferenceType> definedClasses() {
+        ArrayList<ReferenceType> definedClasses = new ArrayList<ReferenceType>();
+        for (ReferenceType type :  vm.allClasses()) {
+            if (type.isPrepared() &&
+                equals(type.classLoader())) {
+                definedClasses.add(type);
+            }
+        }
+        return definedClasses;
+    }
+
+    public List<ReferenceType> visibleClasses() {
+        List<ReferenceType> classes = null;
+        try {
+            Cache local = (Cache)getCache();
+
+            if (local != null) {
+                classes = local.visibleClasses;
+            }
+            if (classes == null) {
+                JDWP.ClassLoaderReference.VisibleClasses.ClassInfo[]
+                  jdwpClasses = JDWP.ClassLoaderReference.VisibleClasses.
+                                            process(vm, this).classes;
+                classes = new ArrayList<ReferenceType>(jdwpClasses.length);
+                for (int i = 0; i < jdwpClasses.length; ++i) {
+                    classes.add(vm.referenceType(jdwpClasses[i].typeID,
+                                                 jdwpClasses[i].refTypeTag));
+                }
+                classes = Collections.unmodifiableList(classes);
+                if (local != null) {
+                    local.visibleClasses = classes;
+                    if ((vm.traceFlags & VirtualMachine.TRACE_OBJREFS) != 0) {
+                        vm.printTrace(description() +
+                           " temporarily caching visible classes (count = " +
+                                      classes.size() + ")");
+                    }
+                }
+            }
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+        return classes;
+    }
+
+    Type findType(String signature) throws ClassNotLoadedException {
+        List<ReferenceType> types = visibleClasses();
+        Iterator<ReferenceType> iter = types.iterator();
+        while (iter.hasNext()) {
+            ReferenceType type = iter.next();
+            if (type.signature().equals(signature)) {
+                return type;
+            }
+        }
+        JNITypeParser parser = new JNITypeParser(signature);
+        throw new ClassNotLoadedException(parser.typeName(),
+                                         "Class " + parser.typeName() + " not loaded");
+    }
+
+    byte typeValueKey() {
+        return JDWP.Tag.CLASS_LOADER;
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/ClassObjectReferenceImpl.java b/src/share/classes/com/sun/tools/jdi/ClassObjectReferenceImpl.java
new file mode 100644
index 0000000..3cbbf34
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/ClassObjectReferenceImpl.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 1999, 2000, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+import java.util.*;
+
+public class ClassObjectReferenceImpl extends ObjectReferenceImpl
+                                      implements ClassObjectReference {
+    private ReferenceType reflectedType;
+
+    ClassObjectReferenceImpl(VirtualMachine vm, long ref) {
+        super(vm, ref);
+    }
+
+    public ReferenceType reflectedType() {
+        if (reflectedType == null) {
+            try {
+                JDWP.ClassObjectReference.ReflectedType reply =
+                    JDWP.ClassObjectReference.ReflectedType.process(vm, this);
+                reflectedType = vm.referenceType(reply.typeID,
+                                                 reply.refTypeTag);
+
+            } catch (JDWPException exc) {
+                throw exc.toJDIException();
+            }
+        }
+        return reflectedType;
+    }
+
+    byte typeValueKey() {
+        return JDWP.Tag.CLASS_OBJECT;
+    }
+
+    public String toString() {
+        return "instance of " + referenceType().name() +
+               "(reflected class=" + reflectedType().name() + ", " + "id=" + uniqueID() + ")";
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/ClassTypeImpl.java b/src/share/classes/com/sun/tools/jdi/ClassTypeImpl.java
new file mode 100644
index 0000000..b815d1a
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/ClassTypeImpl.java
@@ -0,0 +1,296 @@
+/*
+ * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+import java.util.*;
+
+final public class ClassTypeImpl extends InvokableTypeImpl
+    implements ClassType
+{
+    private static class IResult implements InvocationResult {
+        final private JDWP.ClassType.InvokeMethod rslt;
+
+        public IResult(JDWP.ClassType.InvokeMethod rslt) {
+            this.rslt = rslt;
+        }
+
+        @Override
+        public ObjectReferenceImpl getException() {
+            return rslt.exception;
+        }
+
+        @Override
+        public ValueImpl getResult() {
+            return rslt.returnValue;
+        }
+    }
+
+    private boolean cachedSuperclass = false;
+    private ClassType superclass = null;
+    private int lastLine = -1;
+    private List<InterfaceType> interfaces = null;
+
+    protected ClassTypeImpl(VirtualMachine aVm,long aRef) {
+        super(aVm, aRef);
+    }
+
+    public ClassType superclass() {
+        if(!cachedSuperclass)  {
+            ClassTypeImpl sup = null;
+            try {
+                sup = JDWP.ClassType.Superclass.
+                    process(vm, this).superclass;
+            } catch (JDWPException exc) {
+                throw exc.toJDIException();
+            }
+
+            /*
+             * If there is a superclass, cache its
+             * ClassType here. Otherwise,
+             * leave the cache reference null.
+             */
+            if (sup != null) {
+                superclass = sup;
+            }
+            cachedSuperclass = true;
+        }
+
+        return superclass;
+    }
+
+    @Override
+    public List<InterfaceType> interfaces()  {
+        if (interfaces == null) {
+            interfaces = getInterfaces();
+        }
+        return interfaces;
+    }
+
+    @Override
+    public List<InterfaceType> allInterfaces() {
+        return getAllInterfaces();
+    }
+
+    public List<ClassType> subclasses() {
+        List<ClassType> subs = new ArrayList<ClassType>();
+        for (ReferenceType refType : vm.allClasses()) {
+            if (refType instanceof ClassType) {
+                ClassType clazz = (ClassType)refType;
+                ClassType superclass = clazz.superclass();
+                if ((superclass != null) && superclass.equals(this)) {
+                    subs.add((ClassType)refType);
+                }
+            }
+        }
+
+        return subs;
+    }
+
+    public boolean isEnum() {
+        ClassType superclass = superclass();
+        if (superclass != null &&
+            superclass.name().equals("java.lang.Enum")) {
+            return true;
+        }
+        return false;
+    }
+
+    public void setValue(Field field, Value value)
+        throws InvalidTypeException, ClassNotLoadedException {
+
+        validateMirror(field);
+        validateMirrorOrNull(value);
+        validateFieldSet(field);
+
+        // More validation specific to setting from a ClassType
+        if(!field.isStatic()) {
+            throw new IllegalArgumentException(
+                            "Must set non-static field through an instance");
+        }
+
+        try {
+            JDWP.ClassType.SetValues.FieldValue[] values =
+                          new JDWP.ClassType.SetValues.FieldValue[1];
+            values[0] = new JDWP.ClassType.SetValues.FieldValue(
+                    ((FieldImpl)field).ref(),
+                    // validate and convert if necessary
+                    ValueImpl.prepareForAssignment(value, (FieldImpl)field));
+
+            try {
+                JDWP.ClassType.SetValues.process(vm, this, values);
+            } catch (JDWPException exc) {
+                throw exc.toJDIException();
+            }
+        } catch (ClassNotLoadedException e) {
+            /*
+             * Since we got this exception,
+             * the field type must be a reference type. The value
+             * we're trying to set is null, but if the field's
+             * class has not yet been loaded through the enclosing
+             * class loader, then setting to null is essentially a
+             * no-op, and we should allow it without an exception.
+             */
+            if (value != null) {
+                throw e;
+            }
+        }
+    }
+
+    PacketStream sendNewInstanceCommand(final ThreadReferenceImpl thread,
+                                   final MethodImpl method,
+                                   final ValueImpl[] args,
+                                   final int options) {
+        CommandSender sender =
+            new CommandSender() {
+                public PacketStream send() {
+                    return JDWP.ClassType.NewInstance.enqueueCommand(
+                                          vm, ClassTypeImpl.this, thread,
+                                          method.ref(), args, options);
+                }
+        };
+
+        PacketStream stream;
+        if ((options & INVOKE_SINGLE_THREADED) != 0) {
+            stream = thread.sendResumingCommand(sender);
+        } else {
+            stream = vm.sendResumingCommand(sender);
+        }
+        return stream;
+    }
+
+    public ObjectReference newInstance(ThreadReference threadIntf,
+                                       Method methodIntf,
+                                       List<? extends Value> origArguments,
+                                       int options)
+                                   throws InvalidTypeException,
+                                          ClassNotLoadedException,
+                                          IncompatibleThreadStateException,
+                                          InvocationException {
+        validateMirror(threadIntf);
+        validateMirror(methodIntf);
+        validateMirrorsOrNulls(origArguments);
+
+        MethodImpl method = (MethodImpl)methodIntf;
+        ThreadReferenceImpl thread = (ThreadReferenceImpl)threadIntf;
+
+        validateConstructorInvocation(method);
+
+        List<Value> arguments = method.validateAndPrepareArgumentsForInvoke(
+                                                       origArguments);
+        ValueImpl[] args = arguments.toArray(new ValueImpl[0]);
+        JDWP.ClassType.NewInstance ret = null;
+        try {
+            PacketStream stream =
+                sendNewInstanceCommand(thread, method, args, options);
+            ret = JDWP.ClassType.NewInstance.waitForReply(vm, stream);
+        } catch (JDWPException exc) {
+            if (exc.errorCode() == JDWP.Error.INVALID_THREAD) {
+                throw new IncompatibleThreadStateException();
+            } else {
+                throw exc.toJDIException();
+            }
+        }
+
+        /*
+         * There is an implict VM-wide suspend at the conclusion
+         * of a normal (non-single-threaded) method invoke
+         */
+        if ((options & INVOKE_SINGLE_THREADED) == 0) {
+            vm.notifySuspend();
+        }
+
+        if (ret.exception != null) {
+            throw new InvocationException(ret.exception);
+        } else {
+            return ret.newObject;
+        }
+    }
+
+    public Method concreteMethodByName(String name, String signature)  {
+       Method method = null;
+       for (Method candidate : visibleMethods()) {
+           if (candidate.name().equals(name) &&
+               candidate.signature().equals(signature) &&
+               !candidate.isAbstract()) {
+
+               method = candidate;
+               break;
+           }
+       }
+       return method;
+   }
+
+    void validateConstructorInvocation(Method method)
+                                   throws InvalidTypeException,
+                                          InvocationException {
+        /*
+         * Method must be in this class.
+         */
+        ReferenceTypeImpl declType = (ReferenceTypeImpl)method.declaringType();
+        if (!declType.equals(this)) {
+            throw new IllegalArgumentException("Invalid constructor");
+        }
+
+        /*
+         * Method must be a constructor
+         */
+        if (!method.isConstructor()) {
+            throw new IllegalArgumentException("Cannot create instance with non-constructor");
+        }
+    }
+
+
+    public String toString() {
+       return "class " + name() + " (" + loaderString() + ")";
+    }
+
+    @Override
+    CommandSender getInvokeMethodSender(ThreadReferenceImpl thread,
+                                        MethodImpl method,
+                                        ValueImpl[] args,
+                                        int options) {
+        return () ->
+            JDWP.ClassType.InvokeMethod.enqueueCommand(vm,
+                                                       ClassTypeImpl.this,
+                                                       thread,
+                                                       method.ref(),
+                                                       args,
+                                                       options);
+    }
+
+    @Override
+    InvocationResult waitForReply(PacketStream stream) throws JDWPException {
+        return new IResult(JDWP.ClassType.InvokeMethod.waitForReply(vm, stream));
+    }
+
+    @Override
+    boolean canInvoke(Method method) {
+        // Method must be in this class or a superclass.
+        return ((ReferenceTypeImpl)method.declaringType()).isAssignableFrom(this);
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/CommandSender.java b/src/share/classes/com/sun/tools/jdi/CommandSender.java
new file mode 100644
index 0000000..d7916c7
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/CommandSender.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+import java.util.EventListener;
+
+interface CommandSender {
+    PacketStream send();
+}
diff --git a/src/share/classes/com/sun/tools/jdi/ConcreteMethodImpl.java b/src/share/classes/com/sun/tools/jdi/ConcreteMethodImpl.java
new file mode 100644
index 0000000..a485f31
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/ConcreteMethodImpl.java
@@ -0,0 +1,545 @@
+/*
+ * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Iterator;
+import java.util.ListIterator;
+import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.lang.ref.SoftReference;
+
+/**
+ * Represents methods with method bodies.
+ * That is, non-native non-abstract methods.
+ * Private to MethodImpl.
+ */
+public class ConcreteMethodImpl extends MethodImpl {
+
+    /*
+     * A subset of the line number info that is softly cached
+     */
+    static private class SoftLocationXRefs {
+        final String stratumID;   // The stratum of this information
+        final Map<Integer, List<Location>> lineMapper;     // Maps line number to location(s)
+        final List<Location> lineLocations; // List of locations ordered by code index
+
+        /*
+         * Note: these do not necessarily correspond to
+         * the line numbers of the first and last elements
+         * in the lineLocations list. Use these only for bounds
+         * checking and with lineMapper.
+         */
+        final int lowestLine;
+        final int highestLine;
+
+        SoftLocationXRefs(String stratumID, Map<Integer, List<Location>> lineMapper, List<Location> lineLocations,
+                     int lowestLine, int highestLine) {
+            this.stratumID = stratumID;
+            this.lineMapper = Collections.unmodifiableMap(lineMapper);
+            this.lineLocations =
+                Collections.unmodifiableList(lineLocations);
+            this.lowestLine = lowestLine;
+            this.highestLine = highestLine;
+        }
+    }
+
+    private Location location = null;
+    private SoftReference<SoftLocationXRefs> softBaseLocationXRefsRef;
+    private SoftReference<SoftLocationXRefs> softOtherLocationXRefsRef;
+    private SoftReference<List<LocalVariable>> variablesRef = null;
+    private boolean absentVariableInformation = false;
+    private long firstIndex = -1;
+    private long lastIndex = -1;
+    private SoftReference<byte[]> bytecodesRef = null;
+    private int argSlotCount = -1;
+
+    ConcreteMethodImpl(VirtualMachine vm, ReferenceTypeImpl declaringType,
+                       long ref,
+                       String name, String signature,
+                       String genericSignature, int modifiers) {
+
+        // The generic signature is set when this is created
+        super(vm, declaringType, ref, name, signature,
+              genericSignature, modifiers);
+    }
+
+    public Location location() {
+        if (location == null) {
+            getBaseLocations();
+        }
+        return location;
+    }
+
+    List<Location> sourceNameFilter(List<Location> list,
+                          SDE.Stratum stratum,
+                          String sourceName)
+                            throws AbsentInformationException {
+        if (sourceName == null) {
+            return list;
+        } else {
+            /* needs sourceName filteration */
+            List<Location> locs = new ArrayList<Location>();
+            for (Location loc : list) {
+                if (((LocationImpl)loc).sourceName(stratum).equals(sourceName)) {
+                    locs.add(loc);
+                }
+            }
+            return locs;
+        }
+    }
+
+    List<Location> allLineLocations(SDE.Stratum stratum,
+                          String sourceName)
+                            throws AbsentInformationException {
+        List<Location> lineLocations = getLocations(stratum).lineLocations;
+
+        if (lineLocations.size() == 0) {
+            throw new AbsentInformationException();
+        }
+
+        return Collections.unmodifiableList(
+          sourceNameFilter(lineLocations, stratum, sourceName));
+    }
+
+    List<Location> locationsOfLine(SDE.Stratum stratum,
+                         String sourceName,
+                         int lineNumber)
+                            throws AbsentInformationException {
+        SoftLocationXRefs info = getLocations(stratum);
+
+        if (info.lineLocations.size() == 0) {
+            throw new AbsentInformationException();
+        }
+
+        /*
+         * Find the locations which match the line number
+         * passed in.
+         */
+        List<Location> list = info.lineMapper.get(new Integer(lineNumber));
+
+        if (list == null) {
+            list = new ArrayList<Location>(0);
+        }
+        return Collections.unmodifiableList(
+          sourceNameFilter(list, stratum, sourceName));
+    }
+
+
+    public Location locationOfCodeIndex(long codeIndex) {
+        if (firstIndex == -1) {
+            getBaseLocations();
+        }
+
+        /*
+         * Check for invalid code index.
+         */
+        if (codeIndex < firstIndex || codeIndex > lastIndex) {
+            return null;
+        }
+
+        return new LocationImpl(virtualMachine(), this, codeIndex);
+    }
+
+
+    LineInfo codeIndexToLineInfo(SDE.Stratum stratum,
+                                 long codeIndex) {
+        if (firstIndex == -1) {
+            getBaseLocations();
+        }
+
+        /*
+         * Check for invalid code index.
+         */
+        if (codeIndex < firstIndex || codeIndex > lastIndex) {
+            throw new InternalError(
+                    "Location with invalid code index");
+        }
+
+        List<Location> lineLocations = getLocations(stratum).lineLocations;
+
+        /*
+         * Check for absent line numbers.
+         */
+        if (lineLocations.size() == 0) {
+            return super.codeIndexToLineInfo(stratum, codeIndex);
+        }
+
+        Iterator<Location> iter = lineLocations.iterator();
+        /*
+         * Treat code before the beginning of the first line table
+         * entry as part of the first line.  javac will generate
+         * code like this for some local classes. This "prolog"
+         * code contains assignments from locals in the enclosing
+         * scope to synthetic fields in the local class.  Same for
+         * other language prolog code.
+         */
+        LocationImpl bestMatch = (LocationImpl)iter.next();
+        while (iter.hasNext()) {
+            LocationImpl current = (LocationImpl)iter.next();
+            if (current.codeIndex() > codeIndex) {
+                break;
+            }
+            bestMatch = current;
+        }
+        return bestMatch.getLineInfo(stratum);
+    }
+
+
+    public List<LocalVariable> variables() throws AbsentInformationException {
+        return getVariables();
+    }
+
+    public List<LocalVariable> variablesByName(String name) throws AbsentInformationException {
+        List<LocalVariable> variables = getVariables();
+
+        List<LocalVariable> retList = new ArrayList<LocalVariable>(2);
+        Iterator<LocalVariable> iter = variables.iterator();
+        while(iter.hasNext()) {
+            LocalVariable variable = iter.next();
+            if (variable.name().equals(name)) {
+                retList.add(variable);
+            }
+        }
+        return retList;
+    }
+
+    public List<LocalVariable> arguments() throws AbsentInformationException {
+        List<LocalVariable> variables = getVariables();
+
+        List<LocalVariable> retList = new ArrayList<LocalVariable>(variables.size());
+        Iterator<LocalVariable> iter = variables.iterator();
+        while(iter.hasNext()) {
+            LocalVariable variable = iter.next();
+            if (variable.isArgument()) {
+                retList.add(variable);
+            }
+        }
+        return retList;
+    }
+
+    public byte[] bytecodes() {
+        byte[] bytecodes = (bytecodesRef == null) ? null :
+                                     bytecodesRef.get();
+        if (bytecodes == null) {
+            try {
+                bytecodes = JDWP.Method.Bytecodes.
+                                 process(vm, declaringType, ref).bytes;
+            } catch (JDWPException exc) {
+                throw exc.toJDIException();
+            }
+            bytecodesRef = new SoftReference<byte[]>(bytecodes);
+        }
+        /*
+         * Arrays are always modifiable, so it is a little unsafe
+         * to return the cached bytecodes directly; instead, we
+         * make a clone at the cost of using more memory.
+         */
+        return bytecodes.clone();
+    }
+
+    int argSlotCount() throws AbsentInformationException {
+        if (argSlotCount == -1) {
+            getVariables();
+        }
+        return argSlotCount;
+    }
+
+    private SoftLocationXRefs getLocations(SDE.Stratum stratum) {
+        if (stratum.isJava()) {
+            return getBaseLocations();
+        }
+        String stratumID = stratum.id();
+        SoftLocationXRefs info =
+            (softOtherLocationXRefsRef == null) ? null :
+               softOtherLocationXRefsRef.get();
+        if (info != null && info.stratumID.equals(stratumID)) {
+            return info;
+        }
+
+        List<Location> lineLocations = new ArrayList<Location>();
+        Map<Integer, List<Location>> lineMapper = new HashMap<Integer, List<Location>>();
+        int lowestLine = -1;
+        int highestLine = -1;
+        SDE.LineStratum lastLineStratum = null;
+        SDE.Stratum baseStratum =
+            declaringType.stratum(SDE.BASE_STRATUM_NAME);
+        Iterator<Location> it = getBaseLocations().lineLocations.iterator();
+        while(it.hasNext()) {
+            LocationImpl loc = (LocationImpl)it.next();
+            int baseLineNumber = loc.lineNumber(baseStratum);
+            SDE.LineStratum lineStratum =
+                  stratum.lineStratum(declaringType,
+                                      baseLineNumber);
+
+            if (lineStratum == null) {
+                // location not mapped in this stratum
+                continue;
+            }
+
+            int lineNumber = lineStratum.lineNumber();
+
+            // remove unmapped and dup lines
+            if ((lineNumber != -1) &&
+                          (!lineStratum.equals(lastLineStratum))) {
+                lastLineStratum = lineStratum;
+
+                // Remember the largest/smallest line number
+                if (lineNumber > highestLine) {
+                    highestLine = lineNumber;
+                }
+                if ((lineNumber < lowestLine) || (lowestLine == -1)) {
+                    lowestLine = lineNumber;
+                }
+
+                loc.addStratumLineInfo(
+                  new StratumLineInfo(stratumID,
+                                      lineNumber,
+                                      lineStratum.sourceName(),
+                                      lineStratum.sourcePath()));
+
+                // Add to the location list
+                lineLocations.add(loc);
+
+                // Add to the line -> locations map
+                Integer key = new Integer(lineNumber);
+                List<Location> mappedLocs = lineMapper.get(key);
+                if (mappedLocs == null) {
+                    mappedLocs = new ArrayList<Location>(1);
+                    lineMapper.put(key, mappedLocs);
+                }
+                mappedLocs.add(loc);
+            }
+        }
+
+        info = new SoftLocationXRefs(stratumID,
+                                lineMapper, lineLocations,
+                                lowestLine, highestLine);
+        softOtherLocationXRefsRef = new SoftReference<SoftLocationXRefs>(info);
+        return info;
+    }
+
+    private SoftLocationXRefs getBaseLocations() {
+        SoftLocationXRefs info = (softBaseLocationXRefsRef == null) ? null :
+                                     softBaseLocationXRefsRef.get();
+        if (info != null) {
+            return info;
+        }
+
+        JDWP.Method.LineTable lntab = null;
+        try {
+            lntab = JDWP.Method.LineTable.process(vm, declaringType, ref);
+        } catch (JDWPException exc) {
+            /*
+             * Note: the absent info error shouldn't happen here
+             * because the first and last index are always available.
+             */
+            throw exc.toJDIException();
+        }
+
+        int count  = lntab.lines.length;
+
+        List<Location> lineLocations = new ArrayList<Location>(count);
+        Map<Integer, List<Location>>lineMapper = new HashMap<Integer, List<Location>>();
+        int lowestLine = -1;
+        int highestLine = -1;
+        for (int i = 0; i < count; i++) {
+            long bci = lntab.lines[i].lineCodeIndex;
+            int lineNumber = lntab.lines[i].lineNumber;
+
+            /*
+             * Some compilers will point multiple consecutive
+             * lines at the same location. We need to choose
+             * one of them so that we can consistently map back
+             * and forth between line and location. So we choose
+             * to record only the last line entry at a particular
+             * location.
+             */
+            if ((i + 1 == count) || (bci != lntab.lines[i+1].lineCodeIndex)) {
+                // Remember the largest/smallest line number
+                if (lineNumber > highestLine) {
+                    highestLine = lineNumber;
+                }
+                if ((lineNumber < lowestLine) || (lowestLine == -1)) {
+                    lowestLine = lineNumber;
+                }
+                LocationImpl loc =
+                    new LocationImpl(virtualMachine(), this, bci);
+                loc.addBaseLineInfo(
+                    new BaseLineInfo(lineNumber, declaringType));
+
+                // Add to the location list
+                lineLocations.add(loc);
+
+                // Add to the line -> locations map
+                Integer key = new Integer(lineNumber);
+                List<Location> mappedLocs = lineMapper.get(key);
+                if (mappedLocs == null) {
+                    mappedLocs = new ArrayList<Location>(1);
+                    lineMapper.put(key, mappedLocs);
+                }
+                mappedLocs.add(loc);
+            }
+        }
+
+        /*
+         * firstIndex, lastIndex, and startLocation need to be
+         * retrieved only once since they are strongly referenced.
+         */
+        if (location == null) {
+            firstIndex = lntab.start;
+            lastIndex = lntab.end;
+            /*
+             * The startLocation is the first one in the
+             * location list if we have one;
+             * otherwise, we construct a location for a
+             * method start with no line info
+             */
+            if (count > 0) {
+                location = lineLocations.get(0);
+            } else {
+                location = new LocationImpl(virtualMachine(), this,
+                                            firstIndex);
+            }
+        }
+
+        info = new SoftLocationXRefs(SDE.BASE_STRATUM_NAME,
+                                lineMapper, lineLocations,
+                                lowestLine, highestLine);
+        softBaseLocationXRefsRef = new SoftReference<SoftLocationXRefs>(info);
+        return info;
+    }
+
+    private List<LocalVariable> getVariables1_4() throws AbsentInformationException {
+        JDWP.Method.VariableTable vartab = null;
+        try {
+            vartab = JDWP.Method.VariableTable.
+                                     process(vm, declaringType, ref);
+        } catch (JDWPException exc) {
+            if (exc.errorCode() == JDWP.Error.ABSENT_INFORMATION) {
+                absentVariableInformation = true;
+                throw new AbsentInformationException();
+            } else {
+                throw exc.toJDIException();
+            }
+        }
+
+        // Get the number of slots used by argument variables
+        argSlotCount = vartab.argCnt;
+        int count = vartab.slots.length;
+        List<LocalVariable> variables = new ArrayList<LocalVariable>(count);
+        for (int i=0; i<count; i++) {
+            JDWP.Method.VariableTable.SlotInfo si = vartab.slots[i];
+
+            /*
+             * Skip "this*" entries because they are never real
+             * variables from the JLS perspective.
+             */
+            if (!si.name.startsWith("this$") && !si.name.equals("this")) {
+                Location scopeStart = new LocationImpl(virtualMachine(),
+                                                       this, si.codeIndex);
+                Location scopeEnd =
+                    new LocationImpl(virtualMachine(), this,
+                                     si.codeIndex + si.length - 1);
+                LocalVariable variable =
+                    new LocalVariableImpl(virtualMachine(), this,
+                                          si.slot, scopeStart, scopeEnd,
+                                          si.name, si.signature, null);
+                // Add to the variable list
+                variables.add(variable);
+            }
+        }
+        return variables;
+    }
+
+    private List<LocalVariable> getVariables1() throws AbsentInformationException {
+
+        if (!vm.canGet1_5LanguageFeatures()) {
+            return getVariables1_4();
+        }
+
+        JDWP.Method.VariableTableWithGeneric vartab = null;
+        try {
+            vartab = JDWP.Method.VariableTableWithGeneric.
+                                     process(vm, declaringType, ref);
+        } catch (JDWPException exc) {
+            if (exc.errorCode() == JDWP.Error.ABSENT_INFORMATION) {
+                absentVariableInformation = true;
+                throw new AbsentInformationException();
+            } else {
+                throw exc.toJDIException();
+            }
+        }
+
+        // Get the number of slots used by argument variables
+        argSlotCount = vartab.argCnt;
+        int count = vartab.slots.length;
+        List<LocalVariable> variables = new ArrayList<LocalVariable>(count);
+        for (int i=0; i<count; i++) {
+            JDWP.Method.VariableTableWithGeneric.SlotInfo si = vartab.slots[i];
+
+            /*
+             * Skip "this*" entries because they are never real
+             * variables from the JLS perspective.
+             */
+            if (!si.name.startsWith("this$") && !si.name.equals("this")) {
+                Location scopeStart = new LocationImpl(virtualMachine(),
+                                                       this, si.codeIndex);
+                Location scopeEnd =
+                    new LocationImpl(virtualMachine(), this,
+                                     si.codeIndex + si.length - 1);
+                LocalVariable variable =
+                    new LocalVariableImpl(virtualMachine(), this,
+                                          si.slot, scopeStart, scopeEnd,
+                                          si.name, si.signature,
+                                          si.genericSignature);
+                // Add to the variable list
+                variables.add(variable);
+            }
+        }
+        return variables;
+    }
+
+    private List<LocalVariable> getVariables() throws AbsentInformationException {
+        if (absentVariableInformation) {
+            throw new AbsentInformationException();
+        }
+
+        List<LocalVariable> variables = (variablesRef == null) ? null :
+                                        variablesRef.get();
+        if (variables != null) {
+            return variables;
+        }
+        variables = getVariables1();
+        variables = Collections.unmodifiableList(variables);
+        variablesRef = new SoftReference<List<LocalVariable>>(variables);
+        return variables;
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/ConnectorImpl.java b/src/share/classes/com/sun/tools/jdi/ConnectorImpl.java
new file mode 100644
index 0000000..d6b1e95
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/ConnectorImpl.java
@@ -0,0 +1,425 @@
+/*
+ * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.tools.jdi.*;
+import com.sun.jdi.*;
+import com.sun.jdi.connect.*;
+import com.sun.jdi.InternalException;
+import java.util.Collections;
+import java.util.Collection;
+import java.util.Map;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.ResourceBundle;
+import java.io.Serializable;
+
+abstract class ConnectorImpl implements Connector {
+    Map<String,Argument> defaultArguments = new java.util.LinkedHashMap<String,Argument>();
+
+    // Used by BooleanArgument
+    static String trueString = null;
+    static String falseString;
+
+    public Map<String,Argument> defaultArguments() {
+        Map<String,Argument> defaults = new java.util.LinkedHashMap<String,Argument>();
+        Collection<Argument> values = defaultArguments.values();
+
+        Iterator<Argument> iter = values.iterator();
+        while (iter.hasNext()) {
+            ArgumentImpl argument = (ArgumentImpl)iter.next();
+            defaults.put(argument.name(), (Argument)argument.clone());
+        }
+        return defaults;
+    }
+
+    void addStringArgument(String name, String label, String description,
+                           String defaultValue, boolean mustSpecify) {
+        defaultArguments.put(name,
+                             new StringArgumentImpl(name, label,
+                                                    description,
+                                                    defaultValue,
+                                                    mustSpecify));
+    }
+
+    void addBooleanArgument(String name, String label, String description,
+                            boolean defaultValue, boolean mustSpecify) {
+        defaultArguments.put(name,
+                             new BooleanArgumentImpl(name, label,
+                                                     description,
+                                                     defaultValue,
+                                                     mustSpecify));
+    }
+
+    void addIntegerArgument(String name, String label, String description,
+                            String defaultValue, boolean mustSpecify,
+                            int min, int max) {
+        defaultArguments.put(name,
+                             new IntegerArgumentImpl(name, label,
+                                                     description,
+                                                     defaultValue,
+                                                     mustSpecify,
+                                                     min, max));
+    }
+
+    void addSelectedArgument(String name, String label, String description,
+                             String defaultValue, boolean mustSpecify,
+                             List<String> list) {
+        defaultArguments.put(name,
+                             new SelectedArgumentImpl(name, label,
+                                                      description,
+                                                      defaultValue,
+                                                      mustSpecify, list));
+    }
+
+    ArgumentImpl argument(String name, Map<String, ? extends Argument> arguments)
+                throws IllegalConnectorArgumentsException {
+
+        ArgumentImpl argument = (ArgumentImpl)arguments.get(name);
+        if (argument == null) {
+            throw new IllegalConnectorArgumentsException(
+                         "Argument missing", name);
+        }
+        String value = argument.value();
+        if (value == null || value.length() == 0) {
+            if (argument.mustSpecify()) {
+            throw new IllegalConnectorArgumentsException(
+                         "Argument unspecified", name);
+            }
+        } else if(!argument.isValid(value)) {
+            throw new IllegalConnectorArgumentsException(
+                         "Argument invalid", name);
+        }
+
+        return argument;
+    }
+
+
+    private ResourceBundle messages = null;
+
+    String getString(String key) {
+        if (messages == null) {
+            messages = ResourceBundle.getBundle("com.sun.tools.jdi.resources.jdi");
+        }
+        return messages.getString(key);
+    }
+
+    public String toString() {
+        String string = name() + " (defaults: ";
+        Iterator<Argument> iter = defaultArguments().values().iterator();
+        boolean first = true;
+        while (iter.hasNext()) {
+            ArgumentImpl argument = (ArgumentImpl)iter.next();
+            if (!first) {
+                string += ", ";
+            }
+            string += argument.toString();
+            first = false;
+        }
+        string += ")";
+        return string;
+    }
+
+    abstract class ArgumentImpl implements Connector.Argument, Cloneable, Serializable {
+        private String name;
+        private String label;
+        private String description;
+        private String value;
+        private boolean mustSpecify;
+
+        ArgumentImpl(String name, String label, String description,
+                     String value,
+                     boolean mustSpecify) {
+            this.name = name;
+            this.label = label;
+            this.description = description;
+            this.value = value;
+            this.mustSpecify = mustSpecify;
+        }
+
+        public abstract boolean isValid(String value);
+
+        public String name() {
+            return name;
+        }
+
+        public String label() {
+            return label;
+        }
+
+        public String description() {
+            return description;
+        }
+
+        public String value() {
+            return value;
+        }
+
+        public void setValue(String value) {
+            if (value == null) {
+                throw new NullPointerException("Can't set null value");
+            }
+            this.value = value;
+        }
+
+        public boolean mustSpecify() {
+            return mustSpecify;
+        }
+
+        public boolean equals(Object obj) {
+            if ((obj != null) && (obj instanceof Connector.Argument)) {
+                Connector.Argument other = (Connector.Argument)obj;
+                return (name().equals(other.name())) &&
+                       (description().equals(other.description())) &&
+                       (mustSpecify() == other.mustSpecify()) &&
+                       (value().equals(other.value()));
+            } else {
+                return false;
+            }
+        }
+
+        public int hashCode() {
+            return description().hashCode();
+        }
+
+        public Object clone() {
+            try {
+                return super.clone();
+            } catch (CloneNotSupportedException e) {
+                // Object should always support clone
+                throw new InternalException();
+            }
+        }
+
+        public String toString() {
+            return name() + "=" + value();
+        }
+    }
+
+    class BooleanArgumentImpl extends ConnectorImpl.ArgumentImpl
+                              implements Connector.BooleanArgument {
+        private static final long serialVersionUID = 1624542968639361316L;
+        BooleanArgumentImpl(String name, String label, String description,
+                            boolean value,
+                            boolean mustSpecify) {
+            super(name, label, description, null, mustSpecify);
+            if(trueString == null) {
+                trueString = getString("true");
+                falseString = getString("false");
+            }
+            setValue(value);
+        }
+
+        /**
+         * Sets the value of the argument.
+         */
+        public void setValue(boolean value) {
+            setValue(stringValueOf(value));
+        }
+
+        /**
+         * Performs basic sanity check of argument.
+         * @return <code>true</code> if value is a string
+         * representation of a boolean value.
+         * @see #stringValueOf(boolean)
+         */
+        public boolean isValid(String value) {
+            return value.equals(trueString) || value.equals(falseString);
+        }
+
+        /**
+         * Return the string representation of the <code>value</code>
+         * parameter.
+         * Does not set or examine the value or the argument.
+         * @return the localized String representation of the
+         * boolean value.
+         */
+        public String stringValueOf(boolean value) {
+            return value? trueString : falseString;
+        }
+
+        /**
+         * Return the value of the argument as a boolean.  Since
+         * the argument may not have been set or may have an invalid
+         * value {@link #isValid(String)} should be called on
+         * {@link #value()} to check its validity.  If it is invalid
+         * the boolean returned by this method is undefined.
+         * @return the value of the argument as a boolean.
+         */
+        public boolean booleanValue() {
+            return value().equals(trueString);
+        }
+    }
+
+    class IntegerArgumentImpl extends ConnectorImpl.ArgumentImpl
+                              implements Connector.IntegerArgument {
+        private static final long serialVersionUID = 763286081923797770L;
+        private final int min;
+        private final int max;
+
+        IntegerArgumentImpl(String name, String label, String description,
+                            String value,
+                            boolean mustSpecify, int min, int max) {
+            super(name, label, description, value, mustSpecify);
+            this.min = min;
+            this.max = max;
+        }
+
+        /**
+         * Sets the value of the argument.
+         * The value should be checked with {@link #isValid(int)}
+         * before setting it; invalid values will throw an exception
+         * when the connection is established - for example,
+         * on {@link LaunchingConnector#launch}
+         */
+        public void setValue(int value) {
+            setValue(stringValueOf(value));
+        }
+
+        /**
+         * Performs basic sanity check of argument.
+         * @return <code>true</code> if value represents an int that is
+         * <code>{@link #min()} &lt;= value &lt;= {@link #max()}</code>
+         */
+        public boolean isValid(String value) {
+            if (value == null) {
+                return false;
+            }
+            try {
+                return isValid(Integer.decode(value).intValue());
+            } catch(NumberFormatException exc) {
+                return false;
+            }
+        }
+
+        /**
+         * Performs basic sanity check of argument.
+         * @return <code>true</code> if
+         * <code>{@link #min()} &lt;= value  &lt;= {@link #max()}</code>
+         */
+        public boolean isValid(int value) {
+            return min <= value && value <= max;
+        }
+
+        /**
+         * Return the string representation of the <code>value</code>
+         * parameter.
+         * Does not set or examine the value or the argument.
+         * @return the String representation of the
+         * int value.
+         */
+        public String stringValueOf(int value) {
+            // *** Should this be internationalized????
+            // *** Even Brian Beck was unsure if an Arabic programmer
+            // *** would expect port numbers in Arabic numerals,
+            // *** so punt for now.
+            return ""+value;
+        }
+
+        /**
+         * Return the value of the argument as a int.  Since
+         * the argument may not have been set or may have an invalid
+         * value {@link #isValid(String)} should be called on
+         * {@link #value()} to check its validity.  If it is invalid
+         * the int returned by this method is undefined.
+         * @return the value of the argument as a int.
+         */
+        public int intValue() {
+            if (value() == null) {
+                return 0;
+            }
+            try {
+                return Integer.decode(value()).intValue();
+            } catch(NumberFormatException exc) {
+                return 0;
+            }
+        }
+
+        /**
+         * The upper bound for the value.
+         * @return the maximum allowed value for this argument.
+         */
+        public int max() {
+            return max;
+        }
+
+        /**
+         * The lower bound for the value.
+         * @return the minimum allowed value for this argument.
+         */
+        public int min() {
+            return min;
+        }
+    }
+
+    class StringArgumentImpl extends ConnectorImpl.ArgumentImpl
+                              implements Connector.StringArgument {
+        private static final long serialVersionUID = 7500484902692107464L;
+        StringArgumentImpl(String name, String label, String description,
+                           String value,
+                           boolean mustSpecify) {
+            super(name, label, description, value, mustSpecify);
+        }
+
+        /**
+         * Performs basic sanity check of argument.
+         * @return <code>true</code> always
+         */
+        public boolean isValid(String value) {
+            return true;
+        }
+    }
+
+    class SelectedArgumentImpl extends ConnectorImpl.ArgumentImpl
+                              implements Connector.SelectedArgument {
+        private static final long serialVersionUID = -5689584530908382517L;
+        private final List<String> choices;
+
+        SelectedArgumentImpl(String name, String label, String description,
+                             String value,
+                             boolean mustSpecify, List<String> choices) {
+            super(name, label, description, value, mustSpecify);
+            this.choices = Collections.unmodifiableList(new ArrayList<String>(choices));
+        }
+
+        /**
+         * Return the possible values for the argument
+         * @return {@link List} of {@link String}
+         */
+        public List<String> choices() {
+            return choices;
+        }
+
+        /**
+         * Performs basic sanity check of argument.
+         * @return <code>true</code> if value is one of {@link #choices()}.
+         */
+        public boolean isValid(String value) {
+            return choices.contains(value);
+        }
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/DoubleTypeImpl.java b/src/share/classes/com/sun/tools/jdi/DoubleTypeImpl.java
new file mode 100644
index 0000000..d075999
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/DoubleTypeImpl.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+public class DoubleTypeImpl extends PrimitiveTypeImpl implements DoubleType {
+    DoubleTypeImpl(VirtualMachine vm) {
+        super(vm);
+    }
+
+
+    public String signature() {
+        return String.valueOf((char)JDWP.Tag.DOUBLE);
+    }
+
+    PrimitiveValue convert(PrimitiveValue value) throws InvalidTypeException {
+        return vm.mirrorOf(((PrimitiveValueImpl)value).checkedDoubleValue());
+    }
+
+}
diff --git a/src/share/classes/com/sun/tools/jdi/DoubleValueImpl.java b/src/share/classes/com/sun/tools/jdi/DoubleValueImpl.java
new file mode 100644
index 0000000..b144368
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/DoubleValueImpl.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+public class DoubleValueImpl extends PrimitiveValueImpl
+                             implements DoubleValue {
+    private double value;
+
+    DoubleValueImpl(VirtualMachine aVm,double aValue) {
+        super(aVm);
+
+        value = aValue;
+    }
+
+    public boolean equals(Object obj) {
+        if ((obj != null) && (obj instanceof DoubleValue)) {
+            return (value == ((DoubleValue)obj).value()) &&
+                   super.equals(obj);
+        } else {
+            return false;
+        }
+    }
+
+    public int compareTo(DoubleValue obj) {
+        double other = obj.value();
+        if (value() < other) {
+            return -1;
+        } else if (value() == other) {
+            return 0;
+        } else {
+            return 1;
+        }
+    }
+
+    public int hashCode() {
+        /*
+         * TO DO: Better hash code
+         */
+        return intValue();
+    }
+
+    public Type type() {
+        return vm.theDoubleType();
+    }
+
+    public double value() {
+        return value;
+    }
+
+    public boolean booleanValue() {
+        return(value == 0.0)?false:true;
+    }
+
+    public byte byteValue() {
+        return(byte)value;
+    }
+
+    public char charValue() {
+        return(char)value;
+    }
+
+    public short shortValue() {
+        return(short)value;
+    }
+
+    public int intValue() {
+        return(int)value;
+    }
+
+    public long longValue() {
+        return(long)value;
+    }
+
+    public float floatValue() {
+        return(float)value;
+    }
+
+    public double doubleValue() {
+        return value;
+    }
+
+    byte checkedByteValue() throws InvalidTypeException {
+        if ((value > Byte.MAX_VALUE) || (value < Byte.MIN_VALUE)) {
+            throw new InvalidTypeException("Can't convert " + value + " to byte");
+        } else {
+            return super.checkedByteValue();
+        }
+    }
+
+    char checkedCharValue() throws InvalidTypeException {
+        if ((value > Character.MAX_VALUE) || (value < Character.MIN_VALUE)) {
+            throw new InvalidTypeException("Can't convert " + value + " to char");
+        } else {
+            return super.checkedCharValue();
+        }
+    }
+
+    short checkedShortValue() throws InvalidTypeException {
+        if ((value > Short.MAX_VALUE) || (value < Short.MIN_VALUE)) {
+            throw new InvalidTypeException("Can't convert " + value + " to short");
+        } else {
+            return super.checkedShortValue();
+        }
+    }
+
+    int checkedIntValue() throws InvalidTypeException {
+        if ((value > Integer.MAX_VALUE) || (value < Integer.MIN_VALUE)) {
+            throw new InvalidTypeException("Can't convert " + value + " to int");
+        } else {
+            return super.checkedIntValue();
+        }
+    }
+
+    long checkedLongValue() throws InvalidTypeException {
+        long longValue = (long)value;
+        if (longValue != value) {
+            throw new InvalidTypeException("Can't convert " + value + " to long");
+        } else {
+            return super.checkedLongValue();
+        }
+    }
+
+    float checkedFloatValue() throws InvalidTypeException {
+        float floatValue = (float)value;
+        if (floatValue != value) {
+            throw new InvalidTypeException("Can't convert " + value + " to float");
+        } else {
+            return super.checkedFloatValue();
+        }
+    }
+
+    public String toString() {
+        return "" + value;
+    }
+
+    byte typeValueKey() {
+        return JDWP.Tag.DOUBLE;
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/EventQueueImpl.java b/src/share/classes/com/sun/tools/jdi/EventQueueImpl.java
new file mode 100644
index 0000000..ca8e33f
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/EventQueueImpl.java
@@ -0,0 +1,242 @@
+/*
+ * Copyright (c) 1998, 2006, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+import com.sun.jdi.event.EventQueue;
+import com.sun.jdi.event.EventSet;
+
+import java.util.*;
+
+public class EventQueueImpl extends MirrorImpl implements EventQueue {
+
+    /*
+     * Note this is not a synchronized list. Iteration/update should be
+     * protected through the 'this' monitor.
+     */
+    LinkedList<EventSet> eventSets = new LinkedList<EventSet>();
+
+    TargetVM target;
+    boolean closed = false;
+
+    EventQueueImpl(VirtualMachine vm, TargetVM target) {
+        super(vm);
+        this.target = target;
+        target.addEventQueue(this);
+    }
+
+    /*
+     * Override superclass back to default equality
+     */
+    public boolean equals(Object obj) {
+        return this == obj;
+    }
+
+    public int hashCode() {
+        return System.identityHashCode(this);
+    }
+
+    synchronized void enqueue(EventSet eventSet) {
+        eventSets.add(eventSet);
+        notifyAll();
+    }
+
+    synchronized int size() {
+        return eventSets.size();
+    }
+
+    synchronized void close() {
+        if (!closed) {
+            closed = true; // OK for this the be first since synchronized
+
+            // place VMDisconnectEvent into queue
+            enqueue(new EventSetImpl(vm,
+                                     (byte)JDWP.EventKind.VM_DISCONNECTED));
+        }
+    }
+
+    public EventSet remove() throws InterruptedException {
+        return remove(0);
+    }
+
+    /**
+     * Filter out events not for user's eyes.
+     * Then filter out empty sets.
+     */
+    public EventSet remove(long timeout) throws InterruptedException {
+        if (timeout < 0) {
+            throw new IllegalArgumentException("Timeout cannot be negative");
+        }
+
+        EventSet eventSet;
+        while (true) {
+            EventSetImpl fullEventSet = removeUnfiltered(timeout);
+            if (fullEventSet == null) {
+                eventSet = null;  // timeout
+                break;
+            }
+            /*
+             * Remove events from the event set for which
+             * there is no corresponding enabled request (
+             * this includes our internally requested events.)
+             * This never returns null
+             */
+            eventSet = fullEventSet.userFilter();
+            if (!eventSet.isEmpty()) {
+                break;
+            }
+        }
+
+        if ((eventSet != null) && (eventSet.suspendPolicy() == JDWP.SuspendPolicy.ALL)) {
+            vm.notifySuspend();
+        }
+
+        return eventSet;
+    }
+
+    EventSet removeInternal() throws InterruptedException {
+        EventSet eventSet;
+        do {
+            // Waiting forever, so removeUnfiltered() is never null
+            eventSet = removeUnfiltered(0).internalFilter();
+        } while (eventSet == null || eventSet.isEmpty());
+
+        /*
+         * Currently, no internal events are requested with a suspend
+         * policy other than none, so we don't check for notifySuspend()
+         * here. If this changes in the future, there is much
+         * infrastructure that needs to be updated.
+         */
+
+        return eventSet;
+    }
+
+    private TimerThread startTimerThread(long timeout) {
+        TimerThread thread = new TimerThread(timeout);
+        thread.setDaemon(true);
+        thread.start();
+        return thread;
+    }
+
+    private boolean shouldWait(TimerThread timerThread) {
+        return !closed && eventSets.isEmpty() &&
+               ((timerThread == null) ? true : !timerThread.timedOut());
+    }
+
+    private EventSetImpl removeUnfiltered(long timeout)
+                                               throws InterruptedException {
+        EventSetImpl eventSet = null;
+
+        /*
+         * Make sure the VM has completed initialization before
+         * trying to build events.
+         */
+        vm.waitInitCompletion();
+
+        synchronized(this) {
+            if (!eventSets.isEmpty()) {
+                /*
+                 * If there's already something there, no need
+                 * for anything elaborate.
+                 */
+                eventSet = (EventSetImpl)eventSets.removeFirst();
+            } else {
+                /*
+                 * If a timeout was specified, create a thread to
+                 * notify this one when a timeout
+                 * occurs. We can't use the timed version of wait()
+                 * because it is possible for multiple enqueue() calls
+                 * before we see something in the eventSet queue
+                 * (this is possible when multiple threads call
+                 * remove() concurrently -- not a great idea, but
+                 * it should be supported). Even if enqueue() did a
+                 * notify() instead of notifyAll() we are not able to
+                 * use a timed wait because there's no way to distinguish
+                 * a timeout from a notify.  That limitation implies a
+                 * possible race condition between a timed out thread
+                 * and a notified thread.
+                 */
+                TimerThread timerThread = null;
+                try {
+                    if (timeout > 0) {
+                        timerThread = startTimerThread(timeout);
+                    }
+
+                    while (shouldWait(timerThread)) {
+                        this.wait();
+                    }
+                } finally {
+                    if ((timerThread != null) && !timerThread.timedOut()) {
+                        timerThread.interrupt();
+                    }
+                }
+
+                if (eventSets.isEmpty()) {
+                    if (closed) {
+                        throw new VMDisconnectedException();
+                    }
+                } else {
+                    eventSet = (EventSetImpl)eventSets.removeFirst();
+                }
+            }
+        }
+
+        // The build is synchronized on the event set, don't hold
+        // the queue lock.
+        if (eventSet != null) {
+            target.notifyDequeueEventSet();
+            eventSet.build();
+        }
+        return eventSet;
+    }
+
+    private class TimerThread extends Thread {
+        private boolean timedOut = false;
+        private long timeout;
+
+        TimerThread(long timeout) {
+            super(vm.threadGroupForJDI(), "JDI Event Queue Timer");
+            this.timeout = timeout;
+        }
+
+        boolean timedOut() {
+            return timedOut;
+        }
+
+        public void run() {
+            try {
+                Thread.sleep(timeout);
+                EventQueueImpl queue = EventQueueImpl.this;
+                synchronized(queue) {
+                    timedOut = true;
+                    queue.notifyAll();
+                }
+            } catch (InterruptedException e) {
+                // Exit without notifying
+            }
+        }
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/EventRequestManagerImpl.java b/src/share/classes/com/sun/tools/jdi/EventRequestManagerImpl.java
new file mode 100644
index 0000000..1157216
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/EventRequestManagerImpl.java
@@ -0,0 +1,954 @@
+/*
+ * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+import com.sun.jdi.request.*;
+import com.sun.tools.jdi.JDWP;
+
+import java.util.*;
+
+/**
+ * This interface is used to create and remove Breakpoints, Watchpoints,
+ * etc.
+ * It include implementations of all the request interfaces..
+ */
+// Warnings from List filters and List[] requestLists is  hard to fix.
+// Remove SuppressWarning when we fix the warnings from List filters
+// and List[] requestLists. The generic array is not supported.
+@SuppressWarnings("unchecked")
+class EventRequestManagerImpl extends MirrorImpl
+                                       implements EventRequestManager
+{
+    List<? extends EventRequest>[] requestLists;
+    private static int methodExitEventCmd = 0;
+
+    static int JDWPtoJDISuspendPolicy(byte jdwpPolicy) {
+        switch(jdwpPolicy) {
+            case JDWP.SuspendPolicy.ALL:
+                return EventRequest.SUSPEND_ALL;
+            case JDWP.SuspendPolicy.EVENT_THREAD:
+                return EventRequest.SUSPEND_EVENT_THREAD;
+        case JDWP.SuspendPolicy.NONE:
+                return EventRequest.SUSPEND_NONE;
+            default:
+                throw new IllegalArgumentException("Illegal policy constant: " + jdwpPolicy);
+        }
+    }
+
+    static byte JDItoJDWPSuspendPolicy(int jdiPolicy) {
+        switch(jdiPolicy) {
+            case EventRequest.SUSPEND_ALL:
+                return JDWP.SuspendPolicy.ALL;
+            case EventRequest.SUSPEND_EVENT_THREAD:
+                return JDWP.SuspendPolicy.EVENT_THREAD;
+            case EventRequest.SUSPEND_NONE:
+                return JDWP.SuspendPolicy.NONE;
+            default:
+                throw new IllegalArgumentException("Illegal policy constant: " + jdiPolicy);
+        }
+    }
+
+    /*
+     * Override superclass back to default equality
+     */
+    public boolean equals(Object obj) {
+        return this == obj;
+    }
+
+    public int hashCode() {
+        return System.identityHashCode(this);
+    }
+
+    abstract class EventRequestImpl extends MirrorImpl implements EventRequest {
+        int id;
+
+        /*
+         * This list is not protected by a synchronized wrapper. All
+         * access/modification should be protected by synchronizing on
+         * the enclosing instance of EventRequestImpl.
+         */
+        List<Object> filters = new ArrayList<>();
+
+        boolean isEnabled = false;
+        boolean deleted = false;
+        byte suspendPolicy = JDWP.SuspendPolicy.ALL;
+        private Map<Object, Object> clientProperties = null;
+
+        EventRequestImpl() {
+            super(EventRequestManagerImpl.this.vm);
+        }
+
+
+        /*
+         * Override superclass back to default equality
+         */
+        public boolean equals(Object obj) {
+            return this == obj;
+        }
+
+        public int hashCode() {
+            return System.identityHashCode(this);
+        }
+
+        abstract int eventCmd();
+
+        InvalidRequestStateException invalidState() {
+            return new InvalidRequestStateException(toString());
+        }
+
+        String state() {
+            return deleted? " (deleted)" :
+                (isEnabled()? " (enabled)" : " (disabled)");
+        }
+
+        /**
+         * @return all the event request of this kind
+         */
+        List requestList() {
+            return EventRequestManagerImpl.this.requestList(eventCmd());
+        }
+
+        /**
+         * delete the event request
+         */
+        void delete() {
+            if (!deleted) {
+                requestList().remove(this);
+                disable(); /* must do BEFORE delete */
+                deleted = true;
+            }
+        }
+
+        public boolean isEnabled() {
+            return isEnabled;
+        }
+
+        public void enable() {
+            setEnabled(true);
+        }
+
+        public void disable() {
+            setEnabled(false);
+        }
+
+        public synchronized void setEnabled(boolean val) {
+            if (deleted) {
+                throw invalidState();
+            } else {
+                if (val != isEnabled) {
+                    if (isEnabled) {
+                        clear();
+                    } else {
+                        set();
+                    }
+                }
+            }
+        }
+
+        public synchronized void addCountFilter(int count) {
+            if (isEnabled() || deleted) {
+                throw invalidState();
+            }
+            if (count < 1) {
+                throw new IllegalArgumentException("count is less than one");
+            }
+            filters.add(JDWP.EventRequest.Set.Modifier.Count.create(count));
+        }
+
+        public void setSuspendPolicy(int policy) {
+            if (isEnabled() || deleted) {
+                throw invalidState();
+            }
+            suspendPolicy = JDItoJDWPSuspendPolicy(policy);
+        }
+
+        public int suspendPolicy() {
+            return JDWPtoJDISuspendPolicy(suspendPolicy);
+        }
+
+        /**
+         * set (enable) the event request
+         */
+        synchronized void set() {
+            JDWP.EventRequest.Set.Modifier[] mods =
+                filters.toArray(
+                    new JDWP.EventRequest.Set.Modifier[filters.size()]);
+            try {
+                id = JDWP.EventRequest.Set.process(vm, (byte)eventCmd(),
+                                                   suspendPolicy, mods).requestID;
+            } catch (JDWPException exc) {
+                throw exc.toJDIException();
+            }
+            isEnabled = true;
+        }
+
+        synchronized void clear() {
+            try {
+                JDWP.EventRequest.Clear.process(vm, (byte)eventCmd(), id);
+            } catch (JDWPException exc) {
+                throw exc.toJDIException();
+            }
+            isEnabled = false;
+        }
+
+        /**
+         * @return a small Map
+         * @see #putProperty
+         * @see #getProperty
+         */
+        private Map<Object, Object> getProperties() {
+            if (clientProperties == null) {
+                clientProperties = new HashMap<Object, Object>(2);
+            }
+            return clientProperties;
+        }
+
+        /**
+         * Returns the value of the property with the specified key.  Only
+         * properties added with <code>putProperty</code> will return
+         * a non-null value.
+         *
+         * @return the value of this property or null
+         * @see #putProperty
+         */
+        public final Object getProperty(Object key) {
+            if (clientProperties == null) {
+                return null;
+            } else {
+                return getProperties().get(key);
+            }
+        }
+
+        /**
+         * Add an arbitrary key/value "property" to this component.
+         *
+         * @see #getProperty
+         */
+        public final void putProperty(Object key, Object value) {
+            if (value != null) {
+                getProperties().put(key, value);
+            } else {
+                getProperties().remove(key);
+            }
+        }
+    }
+
+    abstract class ThreadVisibleEventRequestImpl extends EventRequestImpl {
+        public synchronized void addThreadFilter(ThreadReference thread) {
+            validateMirror(thread);
+            if (isEnabled() || deleted) {
+                throw invalidState();
+            }
+            filters.add(JDWP.EventRequest.Set.Modifier.ThreadOnly
+                                      .create((ThreadReferenceImpl)thread));
+        }
+    }
+
+    abstract class ClassVisibleEventRequestImpl
+                                  extends ThreadVisibleEventRequestImpl {
+        public synchronized void addClassFilter(ReferenceType clazz) {
+            validateMirror(clazz);
+            if (isEnabled() || deleted) {
+                throw invalidState();
+            }
+            filters.add(JDWP.EventRequest.Set.Modifier.ClassOnly
+                                      .create((ReferenceTypeImpl)clazz));
+        }
+
+        public synchronized void addClassFilter(String classPattern) {
+            if (isEnabled() || deleted) {
+                throw invalidState();
+            }
+            if (classPattern == null) {
+                throw new NullPointerException();
+            }
+            filters.add(JDWP.EventRequest.Set.Modifier.ClassMatch
+                                      .create(classPattern));
+        }
+
+        public synchronized void addClassExclusionFilter(String classPattern) {
+            if (isEnabled() || deleted) {
+                throw invalidState();
+            }
+            if (classPattern == null) {
+                throw new NullPointerException();
+            }
+            filters.add(JDWP.EventRequest.Set.Modifier.ClassExclude
+                                      .create(classPattern));
+        }
+
+        public synchronized void addInstanceFilter(ObjectReference instance) {
+            validateMirror(instance);
+            if (isEnabled() || deleted) {
+                throw invalidState();
+            }
+            if (!vm.canUseInstanceFilters()) {
+                throw new UnsupportedOperationException(
+                     "target does not support instance filters");
+            }
+            filters.add(JDWP.EventRequest.Set.Modifier.InstanceOnly
+                                      .create((ObjectReferenceImpl)instance));
+        }
+    }
+
+    class BreakpointRequestImpl extends ClassVisibleEventRequestImpl
+                                     implements BreakpointRequest {
+        private final Location location;
+
+        BreakpointRequestImpl(Location location) {
+            this.location = location;
+            filters.add(0,JDWP.EventRequest.Set.Modifier.LocationOnly
+                                                 .create(location));
+            requestList().add(this);
+        }
+
+        public Location location() {
+            return location;
+        }
+
+        int eventCmd() {
+            return JDWP.EventKind.BREAKPOINT;
+        }
+
+        public String toString() {
+            return "breakpoint request " + location() + state();
+        }
+    }
+
+    class ClassPrepareRequestImpl extends ClassVisibleEventRequestImpl
+                                     implements ClassPrepareRequest {
+        ClassPrepareRequestImpl() {
+            requestList().add(this);
+        }
+
+        int eventCmd() {
+            return JDWP.EventKind.CLASS_PREPARE;
+        }
+
+        public synchronized void addSourceNameFilter(String sourceNamePattern) {
+            if (isEnabled() || deleted) {
+                throw invalidState();
+            }
+            if (!vm.canUseSourceNameFilters()) {
+                throw new UnsupportedOperationException(
+                     "target does not support source name filters");
+            }
+            if (sourceNamePattern == null) {
+                throw new NullPointerException();
+            }
+
+            filters.add(JDWP.EventRequest.Set.Modifier.SourceNameMatch
+                                      .create(sourceNamePattern));
+        }
+
+        public String toString() {
+            return "class prepare request " + state();
+        }
+    }
+
+    class ClassUnloadRequestImpl extends ClassVisibleEventRequestImpl
+                                     implements ClassUnloadRequest {
+        ClassUnloadRequestImpl() {
+            requestList().add(this);
+        }
+
+        int eventCmd() {
+            return JDWP.EventKind.CLASS_UNLOAD;
+        }
+
+        public String toString() {
+            return "class unload request " + state();
+        }
+    }
+
+    class ExceptionRequestImpl extends ClassVisibleEventRequestImpl
+                                      implements ExceptionRequest {
+        ReferenceType exception = null;
+        boolean caught = true;
+        boolean uncaught = true;
+
+        ExceptionRequestImpl(ReferenceType refType,
+                          boolean notifyCaught, boolean notifyUncaught) {
+            exception = refType;
+            caught = notifyCaught;
+            uncaught = notifyUncaught;
+            {
+                ReferenceTypeImpl exc;
+                if (exception == null) {
+                    exc = new ClassTypeImpl(vm, 0);
+                } else {
+                    exc = (ReferenceTypeImpl)exception;
+                }
+                filters.add(JDWP.EventRequest.Set.Modifier.ExceptionOnly.
+                            create(exc, caught, uncaught));
+            }
+            requestList().add(this);
+        }
+
+        public ReferenceType exception() {
+            return exception;
+        }
+
+        public boolean notifyCaught() {
+            return caught;
+        }
+
+        public boolean notifyUncaught() {
+            return uncaught;
+        }
+
+        int eventCmd() {
+            return JDWP.EventKind.EXCEPTION;
+        }
+
+        public String toString() {
+            return "exception request " + exception() + state();
+        }
+    }
+
+    class MethodEntryRequestImpl extends ClassVisibleEventRequestImpl
+                                      implements MethodEntryRequest {
+        MethodEntryRequestImpl() {
+            requestList().add(this);
+        }
+
+        int eventCmd() {
+            return JDWP.EventKind.METHOD_ENTRY;
+        }
+
+        public String toString() {
+            return "method entry request " + state();
+        }
+    }
+
+    class MethodExitRequestImpl extends ClassVisibleEventRequestImpl
+                                      implements MethodExitRequest {
+        MethodExitRequestImpl() {
+            if (methodExitEventCmd == 0) {
+                /*
+                 * If we can get return values, then we always get them.
+                 * Thus, for JDI MethodExitRequests, we always use the
+                 * same JDWP EventKind.  Here we decide which to use and
+                 * save it so that it will be used for all future
+                 * MethodExitRequests.
+                 *
+                 * This call to canGetMethodReturnValues can't
+                 * be done in the EventRequestManager ctor because that is too early.
+                 */
+                if (vm.canGetMethodReturnValues()) {
+                    methodExitEventCmd = JDWP.EventKind.METHOD_EXIT_WITH_RETURN_VALUE;
+                } else {
+                    methodExitEventCmd = JDWP.EventKind.METHOD_EXIT;
+                }
+            }
+            requestList().add(this);
+        }
+
+        int eventCmd() {
+            return EventRequestManagerImpl.methodExitEventCmd;
+        }
+
+        public String toString() {
+            return "method exit request " + state();
+        }
+    }
+
+    class MonitorContendedEnterRequestImpl extends ClassVisibleEventRequestImpl
+                                      implements MonitorContendedEnterRequest {
+        MonitorContendedEnterRequestImpl() {
+            requestList().add(this);
+        }
+
+        int eventCmd() {
+            return JDWP.EventKind.MONITOR_CONTENDED_ENTER;
+        }
+
+        public String toString() {
+            return "monitor contended enter request " + state();
+        }
+    }
+
+    class MonitorContendedEnteredRequestImpl extends ClassVisibleEventRequestImpl
+                                      implements MonitorContendedEnteredRequest {
+        MonitorContendedEnteredRequestImpl() {
+            requestList().add(this);
+        }
+
+        int eventCmd() {
+            return JDWP.EventKind.MONITOR_CONTENDED_ENTERED;
+        }
+
+        public String toString() {
+            return "monitor contended entered request " + state();
+        }
+    }
+
+    class MonitorWaitRequestImpl extends ClassVisibleEventRequestImpl
+                                 implements MonitorWaitRequest {
+        MonitorWaitRequestImpl() {
+            requestList().add(this);
+        }
+
+        int eventCmd() {
+            return JDWP.EventKind.MONITOR_WAIT;
+        }
+
+        public String toString() {
+            return "monitor wait request " + state();
+        }
+    }
+
+    class MonitorWaitedRequestImpl extends ClassVisibleEventRequestImpl
+                                 implements MonitorWaitedRequest {
+        MonitorWaitedRequestImpl() {
+            requestList().add(this);
+        }
+
+        int eventCmd() {
+            return JDWP.EventKind.MONITOR_WAITED;
+        }
+
+        public String toString() {
+            return "monitor waited request " + state();
+        }
+    }
+
+    class StepRequestImpl extends ClassVisibleEventRequestImpl
+                                      implements StepRequest {
+        ThreadReferenceImpl thread;
+        int size;
+        int depth;
+
+        StepRequestImpl(ThreadReference thread, int size, int depth) {
+            this.thread = (ThreadReferenceImpl)thread;
+            this.size = size;
+            this.depth = depth;
+
+            /*
+             * Translate size and depth to corresponding JDWP values.
+             */
+            int jdwpSize;
+            switch (size) {
+                case STEP_MIN:
+                    jdwpSize = JDWP.StepSize.MIN;
+                    break;
+                case STEP_LINE:
+                    jdwpSize = JDWP.StepSize.LINE;
+                    break;
+                default:
+                    throw new IllegalArgumentException("Invalid step size");
+            }
+
+            int jdwpDepth;
+            switch (depth) {
+                case STEP_INTO:
+                    jdwpDepth = JDWP.StepDepth.INTO;
+                    break;
+                case STEP_OVER:
+                    jdwpDepth = JDWP.StepDepth.OVER;
+                    break;
+                case STEP_OUT:
+                    jdwpDepth = JDWP.StepDepth.OUT;
+                    break;
+                default:
+                    throw new IllegalArgumentException("Invalid step depth");
+            }
+
+            /*
+             * Make sure this isn't a duplicate
+             */
+            List<StepRequest> requests = stepRequests();
+            Iterator<StepRequest> iter = requests.iterator();
+            while (iter.hasNext()) {
+                StepRequest request = iter.next();
+                if ((request != this) &&
+                        request.isEnabled() &&
+                        request.thread().equals(thread)) {
+                    throw new DuplicateRequestException(
+                        "Only one step request allowed per thread");
+                }
+            }
+
+            filters.add(JDWP.EventRequest.Set.Modifier.Step.
+                        create(this.thread, jdwpSize, jdwpDepth));
+            requestList().add(this);
+
+        }
+        public int depth() {
+            return depth;
+        }
+
+        public int size() {
+            return size;
+        }
+
+        public ThreadReference thread() {
+            return thread;
+        }
+
+        int eventCmd() {
+            return JDWP.EventKind.SINGLE_STEP;
+        }
+
+        public String toString() {
+            return "step request " + thread() + state();
+        }
+    }
+
+    class ThreadDeathRequestImpl extends ThreadVisibleEventRequestImpl
+                                      implements ThreadDeathRequest {
+        ThreadDeathRequestImpl() {
+            requestList().add(this);
+        }
+
+        int eventCmd() {
+            return JDWP.EventKind.THREAD_DEATH;
+        }
+
+        public String toString() {
+            return "thread death request " + state();
+        }
+    }
+
+    class ThreadStartRequestImpl extends ThreadVisibleEventRequestImpl
+                                      implements ThreadStartRequest {
+        ThreadStartRequestImpl() {
+            requestList().add(this);
+        }
+
+        int eventCmd() {
+            return JDWP.EventKind.THREAD_START;
+        }
+
+        public String toString() {
+            return "thread start request " + state();
+        }
+    }
+
+    abstract class WatchpointRequestImpl extends ClassVisibleEventRequestImpl
+                                      implements WatchpointRequest {
+        final Field field;
+
+        WatchpointRequestImpl(Field field) {
+            this.field = field;
+            filters.add(0,
+                   JDWP.EventRequest.Set.Modifier.FieldOnly.create(
+                    (ReferenceTypeImpl)field.declaringType(),
+                    ((FieldImpl)field).ref()));
+        }
+
+        public Field field() {
+            return field;
+        }
+    }
+
+    class AccessWatchpointRequestImpl extends WatchpointRequestImpl
+                                  implements AccessWatchpointRequest {
+        AccessWatchpointRequestImpl(Field field) {
+            super(field);
+            requestList().add(this);
+        }
+
+        int eventCmd() {
+            return JDWP.EventKind.FIELD_ACCESS;
+        }
+
+        public String toString() {
+            return "access watchpoint request " + field + state();
+        }
+    }
+
+    class ModificationWatchpointRequestImpl extends WatchpointRequestImpl
+                                  implements ModificationWatchpointRequest {
+        ModificationWatchpointRequestImpl(Field field) {
+            super(field);
+            requestList().add(this);
+        }
+
+        int eventCmd() {
+            return JDWP.EventKind.FIELD_MODIFICATION;
+        }
+
+        public String toString() {
+            return "modification watchpoint request " + field + state();
+        }
+    }
+
+    class VMDeathRequestImpl extends EventRequestImpl
+                                        implements VMDeathRequest {
+        VMDeathRequestImpl() {
+            requestList().add(this);
+        }
+
+        int eventCmd() {
+            return JDWP.EventKind.VM_DEATH;
+        }
+
+        public String toString() {
+            return "VM death request " + state();
+        }
+    }
+
+    /**
+     * Constructor.
+     */
+    EventRequestManagerImpl(VirtualMachine vm) {
+        super(vm);
+        java.lang.reflect.Field[] ekinds =
+            JDWP.EventKind.class.getDeclaredFields();
+        int highest = 0;
+        for (int i = 0; i < ekinds.length; ++i) {
+            int val;
+            try {
+                val = ekinds[i].getInt(null);
+            } catch (IllegalAccessException exc) {
+                throw new RuntimeException("Got: " + exc);
+            }
+            if (val > highest) {
+                highest = val;
+            }
+        }
+        requestLists = new List[highest+1];
+        for (int i=0; i <= highest; i++) {
+            requestLists[i] = new ArrayList<>();
+        }
+    }
+
+    public ClassPrepareRequest createClassPrepareRequest() {
+        return new ClassPrepareRequestImpl();
+    }
+
+    public ClassUnloadRequest createClassUnloadRequest() {
+        return new ClassUnloadRequestImpl();
+    }
+
+    public ExceptionRequest createExceptionRequest(ReferenceType refType,
+                                                   boolean notifyCaught,
+                                                   boolean notifyUncaught) {
+        validateMirrorOrNull(refType);
+        return new ExceptionRequestImpl(refType, notifyCaught, notifyUncaught);
+    }
+
+    public StepRequest createStepRequest(ThreadReference thread,
+                                         int size, int depth) {
+        validateMirror(thread);
+        return new StepRequestImpl(thread, size, depth);
+    }
+
+    public ThreadDeathRequest createThreadDeathRequest() {
+        return new ThreadDeathRequestImpl();
+    }
+
+    public ThreadStartRequest createThreadStartRequest() {
+        return new ThreadStartRequestImpl();
+    }
+
+    public MethodEntryRequest createMethodEntryRequest() {
+        return new MethodEntryRequestImpl();
+    }
+
+    public MethodExitRequest createMethodExitRequest() {
+        return new MethodExitRequestImpl();
+    }
+
+    public MonitorContendedEnterRequest createMonitorContendedEnterRequest() {
+        if (!vm.canRequestMonitorEvents()) {
+            throw new UnsupportedOperationException(
+          "target VM does not support requesting Monitor events");
+        }
+        return new MonitorContendedEnterRequestImpl();
+    }
+
+    public MonitorContendedEnteredRequest createMonitorContendedEnteredRequest() {
+        if (!vm.canRequestMonitorEvents()) {
+            throw new UnsupportedOperationException(
+          "target VM does not support requesting Monitor events");
+        }
+        return new MonitorContendedEnteredRequestImpl();
+    }
+
+    public MonitorWaitRequest createMonitorWaitRequest() {
+        if (!vm.canRequestMonitorEvents()) {
+            throw new UnsupportedOperationException(
+          "target VM does not support requesting Monitor events");
+        }
+        return new MonitorWaitRequestImpl();
+    }
+
+    public MonitorWaitedRequest createMonitorWaitedRequest() {
+        if (!vm.canRequestMonitorEvents()) {
+            throw new UnsupportedOperationException(
+          "target VM does not support requesting Monitor events");
+        }
+        return new MonitorWaitedRequestImpl();
+    }
+
+    public BreakpointRequest createBreakpointRequest(Location location) {
+        validateMirror(location);
+        if (location.codeIndex() == -1) {
+            throw new NativeMethodException("Cannot set breakpoints on native methods");
+        }
+        return new BreakpointRequestImpl(location);
+    }
+
+    public AccessWatchpointRequest
+                              createAccessWatchpointRequest(Field field) {
+        validateMirror(field);
+        if (!vm.canWatchFieldAccess()) {
+            throw new UnsupportedOperationException(
+          "target VM does not support access watchpoints");
+        }
+        return new AccessWatchpointRequestImpl(field);
+    }
+
+    public ModificationWatchpointRequest
+                        createModificationWatchpointRequest(Field field) {
+        validateMirror(field);
+        if (!vm.canWatchFieldModification()) {
+            throw new UnsupportedOperationException(
+          "target VM does not support modification watchpoints");
+        }
+        return new ModificationWatchpointRequestImpl(field);
+    }
+
+    public VMDeathRequest createVMDeathRequest() {
+        if (!vm.canRequestVMDeathEvent()) {
+            throw new UnsupportedOperationException(
+          "target VM does not support requesting VM death events");
+        }
+        return new VMDeathRequestImpl();
+    }
+
+    public void deleteEventRequest(EventRequest eventRequest) {
+        validateMirror(eventRequest);
+        ((EventRequestImpl)eventRequest).delete();
+    }
+
+    public void deleteEventRequests(List<? extends EventRequest> eventRequests) {
+        validateMirrors(eventRequests);
+        // copy the eventRequests to avoid ConcurrentModificationException
+        Iterator<? extends EventRequest> iter = (new ArrayList<>(eventRequests)).iterator();
+        while (iter.hasNext()) {
+            ((EventRequestImpl)iter.next()).delete();
+        }
+    }
+
+    public void deleteAllBreakpoints() {
+        requestList(JDWP.EventKind.BREAKPOINT).clear();
+
+        try {
+            JDWP.EventRequest.ClearAllBreakpoints.process(vm);
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+    }
+
+    public List<StepRequest> stepRequests() {
+        return (List<StepRequest>)unmodifiableRequestList(JDWP.EventKind.SINGLE_STEP);
+    }
+
+    public List<ClassPrepareRequest> classPrepareRequests() {
+        return (List<ClassPrepareRequest>)unmodifiableRequestList(JDWP.EventKind.CLASS_PREPARE);
+    }
+
+    public List<ClassUnloadRequest> classUnloadRequests() {
+        return (List<ClassUnloadRequest>)unmodifiableRequestList(JDWP.EventKind.CLASS_UNLOAD);
+    }
+
+    public List<ThreadStartRequest> threadStartRequests() {
+        return (List<ThreadStartRequest>)unmodifiableRequestList(JDWP.EventKind.THREAD_START);
+    }
+
+    public List<ThreadDeathRequest> threadDeathRequests() {
+        return (List<ThreadDeathRequest>)unmodifiableRequestList(JDWP.EventKind.THREAD_DEATH);
+    }
+
+    public List<ExceptionRequest> exceptionRequests() {
+        return (List<ExceptionRequest>)unmodifiableRequestList(JDWP.EventKind.EXCEPTION);
+    }
+
+    public List<BreakpointRequest> breakpointRequests() {
+        return (List<BreakpointRequest>)unmodifiableRequestList(JDWP.EventKind.BREAKPOINT);
+    }
+
+    public List<AccessWatchpointRequest> accessWatchpointRequests() {
+        return (List<AccessWatchpointRequest>)unmodifiableRequestList(JDWP.EventKind.FIELD_ACCESS);
+    }
+
+    public List<ModificationWatchpointRequest> modificationWatchpointRequests() {
+        return (List<ModificationWatchpointRequest>)unmodifiableRequestList(JDWP.EventKind.FIELD_MODIFICATION);
+    }
+
+    public List<MethodEntryRequest> methodEntryRequests() {
+        return (List<MethodEntryRequest>)unmodifiableRequestList(JDWP.EventKind.METHOD_ENTRY);
+    }
+
+    public List<MethodExitRequest> methodExitRequests() {
+        return (List<MethodExitRequest>)unmodifiableRequestList(
+                               EventRequestManagerImpl.methodExitEventCmd);
+    }
+
+    public List<MonitorContendedEnterRequest> monitorContendedEnterRequests() {
+        return (List<MonitorContendedEnterRequest>)unmodifiableRequestList(JDWP.EventKind.MONITOR_CONTENDED_ENTER);
+    }
+
+    public List<MonitorContendedEnteredRequest> monitorContendedEnteredRequests() {
+        return (List<MonitorContendedEnteredRequest>)unmodifiableRequestList(JDWP.EventKind.MONITOR_CONTENDED_ENTERED);
+    }
+
+    public List<MonitorWaitRequest> monitorWaitRequests() {
+        return (List<MonitorWaitRequest>)unmodifiableRequestList(JDWP.EventKind.MONITOR_WAIT);
+    }
+
+    public List<MonitorWaitedRequest> monitorWaitedRequests() {
+        return (List<MonitorWaitedRequest>)unmodifiableRequestList(JDWP.EventKind.MONITOR_WAITED);
+    }
+
+    public List<VMDeathRequest> vmDeathRequests() {
+        return (List<VMDeathRequest>)unmodifiableRequestList(JDWP.EventKind.VM_DEATH);
+    }
+
+    List<? extends EventRequest> unmodifiableRequestList(int eventCmd) {
+        return Collections.unmodifiableList(requestList(eventCmd));
+    }
+
+    EventRequest request(int eventCmd, int requestId) {
+        List<? extends EventRequest> rl = requestList(eventCmd);
+        for (int i = rl.size() - 1; i >= 0; i--) {
+            EventRequestImpl er = (EventRequestImpl)rl.get(i);
+            if (er.id == requestId) {
+                return er;
+            }
+        }
+        return null;
+    }
+
+    List<? extends EventRequest>  requestList(int eventCmd) {
+        return requestLists[eventCmd];
+    }
+
+}
diff --git a/src/share/classes/com/sun/tools/jdi/EventSetImpl.java b/src/share/classes/com/sun/tools/jdi/EventSetImpl.java
new file mode 100644
index 0000000..d907e95
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/EventSetImpl.java
@@ -0,0 +1,879 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+import com.sun.jdi.event.*;
+import com.sun.jdi.request.*;
+
+import java.util.*;
+enum EventDestination {UNKNOWN_EVENT, INTERNAL_EVENT, CLIENT_EVENT};
+
+/*
+ * An EventSet is normally created by the transport reader thread when
+ * it reads a JDWP Composite command.  The constructor doesn't unpack
+ * the events contained in the Composite command and create EventImpls
+ * for them because that process might involve calling back into the back-end
+ * which should not be done by the transport reader thread.  Instead,
+ * the raw bytes of the packet are read and stored in the EventSet.
+ * The EventSet is then added to each EventQueue. When an EventSet is
+ * removed from an EventQueue, the EventSetImpl.build() method is called.
+ * This method reads the packet bytes and creates the actual EventImpl objects.
+ * build() also filters out events for our internal handler and puts them in
+ * their own EventSet.  This means that the EventImpls that are in the EventSet
+ * that is on the queues are all for client requests.
+ */
+public class EventSetImpl extends ArrayList<Event> implements EventSet {
+    private static final long serialVersionUID = -4857338819787924570L;
+    private VirtualMachineImpl vm; // we implement Mirror
+    private Packet pkt;
+    private byte suspendPolicy;
+    private EventSetImpl internalEventSet;
+
+    public String toString() {
+        String string = "event set, policy:" + suspendPolicy +
+                        ", count:" + this.size() + " = {";
+        boolean first = true;
+        for (Event event : this) {
+            if (!first) {
+                string += ", ";
+            }
+            string += event.toString();
+            first = false;
+        }
+        string += "}";
+        return string;
+    }
+
+    abstract class EventImpl extends MirrorImpl implements Event {
+
+        private final byte eventCmd;
+        private final int requestID;
+        // This is set only for client requests, not internal requests.
+        private final EventRequest request;
+
+        /**
+         * Constructor for events.
+         */
+        protected EventImpl(JDWP.Event.Composite.Events.EventsCommon evt,
+                            int requestID) {
+            super(EventSetImpl.this.vm);
+            this.eventCmd = evt.eventKind();
+            this.requestID = requestID;
+            EventRequestManagerImpl ermi = EventSetImpl.this.
+                vm.eventRequestManagerImpl();
+            this.request =  ermi.request(eventCmd, requestID);
+        }
+
+        /*
+         * Override superclass back to default equality
+         */
+        public boolean equals(Object obj) {
+            return this == obj;
+        }
+
+        public int hashCode() {
+            return System.identityHashCode(this);
+        }
+
+        /**
+         * Constructor for VM disconnected events.
+         */
+        protected EventImpl(byte eventCmd) {
+            super(EventSetImpl.this.vm);
+            this.eventCmd = eventCmd;
+            this.requestID = 0;
+            this.request = null;
+        }
+
+        public EventRequest request() {
+            return request;
+        }
+
+        int requestID() {
+            return requestID;
+        }
+
+        EventDestination destination() {
+            /*
+             * We need to decide if this event is for
+             * 1. an internal request
+             * 2. a client request that is no longer available, ie
+             *    it has been deleted, or disabled and re-enabled
+             *    which gives it a new ID.
+             * 3. a current client request that is disabled
+             * 4. a current enabled client request.
+             *
+             * We will filter this set into a set
+             * that contains only 1s for our internal queue
+             * and a set that contains only 4s for our client queue.
+             * If we get an EventSet that contains only 2 and 3
+             * then we have to resume it if it is not SUSPEND_NONE
+             * because no one else will.
+             */
+            if (requestID == 0) {
+                /* An unsolicited event.  These have traditionally
+                 * been treated as client events.
+                 */
+                return EventDestination.CLIENT_EVENT;
+            }
+
+            // Is this an event for a current client request?
+            if (request == null) {
+                // Nope.  Is it an event for an internal request?
+                EventRequestManagerImpl ermi = this.vm.getInternalEventRequestManager();
+                if (ermi.request(eventCmd, requestID) != null) {
+                    // Yep
+                    return EventDestination.INTERNAL_EVENT;
+                }
+                return EventDestination.UNKNOWN_EVENT;
+            }
+
+            // We found a client request
+            if (request.isEnabled()) {
+                return EventDestination.CLIENT_EVENT;
+            }
+            return EventDestination.UNKNOWN_EVENT;
+        }
+
+        abstract String eventName();
+
+        public String toString() {
+            return eventName();
+        }
+
+    }
+
+    abstract class ThreadedEventImpl extends EventImpl {
+        private ThreadReference thread;
+
+        ThreadedEventImpl(JDWP.Event.Composite.Events.EventsCommon evt,
+                          int requestID, ThreadReference thread) {
+            super(evt, requestID);
+            this.thread = thread;
+        }
+
+        public ThreadReference thread() {
+            return thread;
+        }
+
+        public String toString() {
+            return eventName() + " in thread " + thread.name();
+        }
+    }
+
+    abstract class LocatableEventImpl extends ThreadedEventImpl
+                                            implements Locatable {
+        private Location location;
+
+        LocatableEventImpl(JDWP.Event.Composite.Events.EventsCommon evt,
+                           int requestID,
+                           ThreadReference thread, Location location) {
+            super(evt, requestID, thread);
+            this.location = location;
+        }
+
+        public Location location() {
+            return location;
+        }
+
+        /**
+         * For MethodEntry and MethodExit
+         */
+        public Method method() {
+            return location.method();
+        }
+
+        public String toString() {
+            return eventName() + "@" +
+                   ((location() == null) ? " null" : location().toString()) +
+                   " in thread " + thread().name();
+        }
+    }
+
+    class BreakpointEventImpl extends LocatableEventImpl
+                            implements BreakpointEvent {
+        BreakpointEventImpl(JDWP.Event.Composite.Events.Breakpoint evt) {
+            super(evt, evt.requestID, evt.thread, evt.location);
+        }
+
+        String eventName() {
+            return "BreakpointEvent";
+        }
+    }
+
+    class StepEventImpl extends LocatableEventImpl implements StepEvent {
+        StepEventImpl(JDWP.Event.Composite.Events.SingleStep evt) {
+            super(evt, evt.requestID, evt.thread, evt.location);
+        }
+
+        String eventName() {
+            return "StepEvent";
+        }
+    }
+
+    class MethodEntryEventImpl extends LocatableEventImpl
+                            implements MethodEntryEvent {
+        MethodEntryEventImpl(JDWP.Event.Composite.Events.MethodEntry evt) {
+            super(evt, evt.requestID, evt.thread, evt.location);
+        }
+
+        String eventName() {
+            return "MethodEntryEvent";
+        }
+    }
+
+    class MethodExitEventImpl extends LocatableEventImpl
+                            implements MethodExitEvent {
+        private Value returnVal = null;
+
+        MethodExitEventImpl(JDWP.Event.Composite.Events.MethodExit evt) {
+            super(evt, evt.requestID, evt.thread, evt.location);
+        }
+
+        MethodExitEventImpl(JDWP.Event.Composite.Events.MethodExitWithReturnValue evt) {
+            super(evt, evt.requestID, evt.thread, evt.location);
+            returnVal = evt.value;
+        }
+
+        String eventName() {
+            return "MethodExitEvent";
+        }
+
+        public Value returnValue() {
+            if (!this.vm.canGetMethodReturnValues()) {
+                throw new UnsupportedOperationException(
+                "target does not support return values in MethodExit events");
+            }
+            return returnVal;
+        }
+
+    }
+
+    class MonitorContendedEnterEventImpl extends LocatableEventImpl
+                            implements MonitorContendedEnterEvent {
+        private ObjectReference monitor = null;
+
+        MonitorContendedEnterEventImpl(JDWP.Event.Composite.Events.MonitorContendedEnter evt) {
+            super(evt, evt.requestID, evt.thread, evt.location);
+            this.monitor = evt.object;
+        }
+
+        String eventName() {
+            return "MonitorContendedEnter";
+        }
+
+        public ObjectReference  monitor() {
+            return monitor;
+        };
+
+    }
+
+    class MonitorContendedEnteredEventImpl extends LocatableEventImpl
+                            implements MonitorContendedEnteredEvent {
+        private ObjectReference monitor = null;
+
+        MonitorContendedEnteredEventImpl(JDWP.Event.Composite.Events.MonitorContendedEntered evt) {
+            super(evt, evt.requestID, evt.thread, evt.location);
+            this.monitor = evt.object;
+        }
+
+        String eventName() {
+            return "MonitorContendedEntered";
+        }
+
+        public ObjectReference  monitor() {
+            return monitor;
+        };
+
+    }
+
+    class MonitorWaitEventImpl extends LocatableEventImpl
+                            implements MonitorWaitEvent {
+        private ObjectReference monitor = null;
+        private long timeout;
+
+        MonitorWaitEventImpl(JDWP.Event.Composite.Events.MonitorWait evt) {
+            super(evt, evt.requestID, evt.thread, evt.location);
+            this.monitor = evt.object;
+            this.timeout = evt.timeout;
+        }
+
+        String eventName() {
+            return "MonitorWait";
+        }
+
+        public ObjectReference  monitor() {
+            return monitor;
+        };
+
+        public long timeout() {
+            return timeout;
+        }
+    }
+
+    class MonitorWaitedEventImpl extends LocatableEventImpl
+                            implements MonitorWaitedEvent {
+        private ObjectReference monitor = null;
+        private boolean timed_out;
+
+        MonitorWaitedEventImpl(JDWP.Event.Composite.Events.MonitorWaited evt) {
+            super(evt, evt.requestID, evt.thread, evt.location);
+            this.monitor = evt.object;
+            this.timed_out = evt.timed_out;
+        }
+
+        String eventName() {
+            return "MonitorWaited";
+        }
+
+        public ObjectReference  monitor() {
+            return monitor;
+        };
+
+        public boolean timedout() {
+            return timed_out;
+        }
+    }
+
+    class ClassPrepareEventImpl extends ThreadedEventImpl
+                            implements ClassPrepareEvent {
+        private ReferenceType referenceType;
+
+        ClassPrepareEventImpl(JDWP.Event.Composite.Events.ClassPrepare evt) {
+            super(evt, evt.requestID, evt.thread);
+            referenceType = this.vm.referenceType(evt.typeID, evt.refTypeTag,
+                                                  evt.signature);
+            ((ReferenceTypeImpl)referenceType).setStatus(evt.status);
+        }
+
+        public ReferenceType referenceType() {
+            return referenceType;
+        }
+
+        String eventName() {
+            return "ClassPrepareEvent";
+        }
+    }
+
+    class ClassUnloadEventImpl extends EventImpl implements ClassUnloadEvent {
+        private String classSignature;
+
+        ClassUnloadEventImpl(JDWP.Event.Composite.Events.ClassUnload evt) {
+            super(evt, evt.requestID);
+            this.classSignature = evt.signature;
+        }
+
+        public String className() {
+            return classSignature.substring(1, classSignature.length()-1)
+                .replace('/', '.');
+        }
+
+        public String classSignature() {
+            return classSignature;
+        }
+
+        String eventName() {
+            return "ClassUnloadEvent";
+        }
+    }
+
+    class ExceptionEventImpl extends LocatableEventImpl
+                                             implements ExceptionEvent {
+        private ObjectReference exception;
+        private Location catchLocation;
+
+        ExceptionEventImpl(JDWP.Event.Composite.Events.Exception evt) {
+            super(evt, evt.requestID, evt.thread, evt.location);
+            this.exception = evt.exception;
+            this.catchLocation = evt.catchLocation;
+        }
+
+        public ObjectReference exception() {
+            return exception;
+        }
+
+        public Location catchLocation() {
+            return catchLocation;
+        }
+
+        String eventName() {
+            return "ExceptionEvent";
+        }
+    }
+
+    class ThreadDeathEventImpl extends ThreadedEventImpl
+                                        implements ThreadDeathEvent {
+        ThreadDeathEventImpl(JDWP.Event.Composite.Events.ThreadDeath evt) {
+            super(evt, evt.requestID, evt.thread);
+        }
+
+        String eventName() {
+            return "ThreadDeathEvent";
+        }
+    }
+
+    class ThreadStartEventImpl extends ThreadedEventImpl
+                                        implements ThreadStartEvent {
+        ThreadStartEventImpl(JDWP.Event.Composite.Events.ThreadStart evt) {
+            super(evt, evt.requestID, evt.thread);
+        }
+
+        String eventName() {
+            return "ThreadStartEvent";
+        }
+    }
+
+    class VMStartEventImpl extends ThreadedEventImpl
+                                        implements VMStartEvent {
+        VMStartEventImpl(JDWP.Event.Composite.Events.VMStart evt) {
+            super(evt, evt.requestID, evt.thread);
+        }
+
+        String eventName() {
+            return "VMStartEvent";
+        }
+    }
+
+    class VMDeathEventImpl extends EventImpl implements VMDeathEvent {
+
+        VMDeathEventImpl(JDWP.Event.Composite.Events.VMDeath evt) {
+            super(evt, evt.requestID);
+        }
+
+        String eventName() {
+            return "VMDeathEvent";
+        }
+    }
+
+    class VMDisconnectEventImpl extends EventImpl
+                                         implements VMDisconnectEvent {
+
+        VMDisconnectEventImpl() {
+            super((byte)JDWP.EventKind.VM_DISCONNECTED);
+        }
+
+        String eventName() {
+            return "VMDisconnectEvent";
+        }
+    }
+
+    abstract class WatchpointEventImpl extends LocatableEventImpl
+                                            implements WatchpointEvent {
+        private final ReferenceTypeImpl refType;
+        private final long fieldID;
+        private final ObjectReference object;
+        private Field field = null;
+
+        WatchpointEventImpl(JDWP.Event.Composite.Events.EventsCommon evt,
+                            int requestID,
+                            ThreadReference thread, Location location,
+                            byte refTypeTag, long typeID, long fieldID,
+                            ObjectReference object) {
+            super(evt, requestID, thread, location);
+            this.refType = this.vm.referenceType(typeID, refTypeTag);
+            this.fieldID = fieldID;
+            this.object = object;
+        }
+
+        public Field field() {
+            if (field == null) {
+                field = refType.getFieldMirror(fieldID);
+            }
+            return field;
+        }
+
+        public ObjectReference object() {
+            return object;
+        }
+
+        public Value valueCurrent() {
+            if (object == null) {
+                return refType.getValue(field());
+            } else {
+                return object.getValue(field());
+            }
+        }
+    }
+
+    class AccessWatchpointEventImpl extends WatchpointEventImpl
+                                            implements AccessWatchpointEvent {
+
+        AccessWatchpointEventImpl(JDWP.Event.Composite.Events.FieldAccess evt) {
+            super(evt, evt.requestID, evt.thread, evt.location,
+                  evt.refTypeTag, evt.typeID, evt.fieldID, evt.object);
+        }
+
+        String eventName() {
+            return "AccessWatchpoint";
+        }
+    }
+
+    class ModificationWatchpointEventImpl extends WatchpointEventImpl
+                           implements ModificationWatchpointEvent {
+        Value newValue;
+
+        ModificationWatchpointEventImpl(
+                        JDWP.Event.Composite.Events.FieldModification evt) {
+            super(evt, evt.requestID, evt.thread, evt.location,
+                  evt.refTypeTag, evt.typeID, evt.fieldID, evt.object);
+            this.newValue = evt.valueToBe;
+        }
+
+        public Value valueToBe() {
+            return newValue;
+        }
+
+        String eventName() {
+            return "ModificationWatchpoint";
+        }
+    }
+
+    /**
+     * Events are constructed on the thread which reads all data from the
+     * transport. This means that the packet cannot be converted to real
+     * JDI objects as that may involve further communications with the
+     * back end which would deadlock.
+     *
+     * Hence the {@link #build()} method below called by EventQueue.
+     */
+    EventSetImpl(VirtualMachine aVm, Packet pkt) {
+        super();
+
+        // From "MirrorImpl":
+        // Yes, its a bit of a hack. But by doing it this
+        // way, this is the only place we have to change
+        // typing to substitute a new impl.
+        vm = (VirtualMachineImpl)aVm;
+
+        this.pkt = pkt;
+    }
+
+    /**
+     * Constructor for special events like VM disconnected
+     */
+    EventSetImpl(VirtualMachine aVm, byte eventCmd) {
+        this(aVm, null);
+        suspendPolicy = JDWP.SuspendPolicy.NONE;
+        switch (eventCmd) {
+            case JDWP.EventKind.VM_DISCONNECTED:
+                addEvent(new VMDisconnectEventImpl());
+                break;
+
+            default:
+                throw new InternalException("Bad singleton event code");
+        }
+    }
+
+    private void addEvent(EventImpl evt) {
+        // Note that this class has a public add method that throws
+        // an exception so that clients can't modify the EventSet
+        super.add(evt);
+    }
+
+    /*
+     * Complete the construction of an EventSet.  This is called from
+     * an event handler thread.  It upacks the JDWP events inside
+     * the packet and creates EventImpls for them.  The EventSet is already
+     * on EventQueues when this is called, so it has to be synch.
+     */
+    synchronized void build() {
+        if (pkt == null) {
+            return;
+        }
+        PacketStream ps = new PacketStream(vm, pkt);
+        JDWP.Event.Composite compEvt = new JDWP.Event.Composite(vm, ps);
+        suspendPolicy = compEvt.suspendPolicy;
+        if ((vm.traceFlags & VirtualMachine.TRACE_EVENTS) != 0) {
+            switch(suspendPolicy) {
+                case JDWP.SuspendPolicy.ALL:
+                    vm.printTrace("EventSet: SUSPEND_ALL");
+                    break;
+
+                case JDWP.SuspendPolicy.EVENT_THREAD:
+                    vm.printTrace("EventSet: SUSPEND_EVENT_THREAD");
+                    break;
+
+                case JDWP.SuspendPolicy.NONE:
+                    vm.printTrace("EventSet: SUSPEND_NONE");
+                    break;
+            }
+        }
+
+        ThreadReference fix6485605 = null;
+        for (int i = 0; i < compEvt.events.length; i++) {
+            EventImpl evt = createEvent(compEvt.events[i]);
+            if ((vm.traceFlags & VirtualMachine.TRACE_EVENTS) != 0) {
+                try {
+                    vm.printTrace("Event: " + evt);
+                } catch (VMDisconnectedException ee) {
+                    // ignore - see bug 6502716
+                }
+            }
+
+            switch (evt.destination()) {
+                case UNKNOWN_EVENT:
+                    // Ignore disabled, deleted, unknown events, but
+                    // save the thread if there is one since we might
+                    // have to resume it.  Note that events for different
+                    // threads can't be in the same event set.
+                    if (evt instanceof ThreadedEventImpl &&
+                        suspendPolicy == JDWP.SuspendPolicy.EVENT_THREAD) {
+                        fix6485605 = ((ThreadedEventImpl)evt).thread();
+                    }
+                    continue;
+                case CLIENT_EVENT:
+                    addEvent(evt);
+                    break;
+                case INTERNAL_EVENT:
+                    if (internalEventSet == null) {
+                        internalEventSet = new EventSetImpl(this.vm, null);
+                    }
+                    internalEventSet.addEvent(evt);
+                    break;
+                default:
+                    throw new InternalException("Invalid event destination");
+            }
+        }
+        pkt = null; // No longer needed - free it up
+
+        // Avoid hangs described in 6296125, 6293795
+        if (super.size() == 0) {
+            // This set has no client events.  If we don't do
+            // needed resumes, no one else is going to.
+            if (suspendPolicy == JDWP.SuspendPolicy.ALL) {
+                vm.resume();
+            } else if (suspendPolicy == JDWP.SuspendPolicy.EVENT_THREAD) {
+                // See bug 6485605.
+                if (fix6485605 != null) {
+                    fix6485605.resume();
+                } else {
+                    // apparently, there is nothing to resume.
+                }
+            }
+            suspendPolicy = JDWP.SuspendPolicy.NONE;
+
+        }
+
+    }
+
+    /**
+     * Filter out internal events
+     */
+    EventSet userFilter() {
+        return this;
+    }
+
+    /**
+     * Filter out user events.
+     */
+    EventSet internalFilter() {
+        return this.internalEventSet;
+    }
+
+    EventImpl createEvent(JDWP.Event.Composite.Events evt) {
+        JDWP.Event.Composite.Events.EventsCommon comm = evt.aEventsCommon;
+        switch (evt.eventKind) {
+            case JDWP.EventKind.THREAD_START:
+                return new ThreadStartEventImpl(
+                      (JDWP.Event.Composite.Events.ThreadStart)comm);
+
+            case JDWP.EventKind.THREAD_END:
+                return new ThreadDeathEventImpl(
+                      (JDWP.Event.Composite.Events.ThreadDeath)comm);
+
+            case JDWP.EventKind.EXCEPTION:
+                return new ExceptionEventImpl(
+                      (JDWP.Event.Composite.Events.Exception)comm);
+
+            case JDWP.EventKind.BREAKPOINT:
+                return new BreakpointEventImpl(
+                      (JDWP.Event.Composite.Events.Breakpoint)comm);
+
+            case JDWP.EventKind.METHOD_ENTRY:
+                return new MethodEntryEventImpl(
+                      (JDWP.Event.Composite.Events.MethodEntry)comm);
+
+            case JDWP.EventKind.METHOD_EXIT:
+                return new MethodExitEventImpl(
+                      (JDWP.Event.Composite.Events.MethodExit)comm);
+
+            case JDWP.EventKind.METHOD_EXIT_WITH_RETURN_VALUE:
+                return new MethodExitEventImpl(
+                      (JDWP.Event.Composite.Events.MethodExitWithReturnValue)comm);
+
+            case JDWP.EventKind.FIELD_ACCESS:
+                return new AccessWatchpointEventImpl(
+                      (JDWP.Event.Composite.Events.FieldAccess)comm);
+
+            case JDWP.EventKind.FIELD_MODIFICATION:
+                return new ModificationWatchpointEventImpl(
+                      (JDWP.Event.Composite.Events.FieldModification)comm);
+
+            case JDWP.EventKind.SINGLE_STEP:
+                return new StepEventImpl(
+                      (JDWP.Event.Composite.Events.SingleStep)comm);
+
+            case JDWP.EventKind.CLASS_PREPARE:
+                return new ClassPrepareEventImpl(
+                      (JDWP.Event.Composite.Events.ClassPrepare)comm);
+
+            case JDWP.EventKind.CLASS_UNLOAD:
+                return new ClassUnloadEventImpl(
+                      (JDWP.Event.Composite.Events.ClassUnload)comm);
+
+            case JDWP.EventKind.MONITOR_CONTENDED_ENTER:
+                return new MonitorContendedEnterEventImpl(
+                      (JDWP.Event.Composite.Events.MonitorContendedEnter)comm);
+
+            case JDWP.EventKind.MONITOR_CONTENDED_ENTERED:
+                return new MonitorContendedEnteredEventImpl(
+                      (JDWP.Event.Composite.Events.MonitorContendedEntered)comm);
+
+            case JDWP.EventKind.MONITOR_WAIT:
+                return new MonitorWaitEventImpl(
+                      (JDWP.Event.Composite.Events.MonitorWait)comm);
+
+            case JDWP.EventKind.MONITOR_WAITED:
+                return new MonitorWaitedEventImpl(
+                      (JDWP.Event.Composite.Events.MonitorWaited)comm);
+
+            case JDWP.EventKind.VM_START:
+                return new VMStartEventImpl(
+                      (JDWP.Event.Composite.Events.VMStart)comm);
+
+            case JDWP.EventKind.VM_DEATH:
+                return new VMDeathEventImpl(
+                      (JDWP.Event.Composite.Events.VMDeath)comm);
+
+            default:
+                // Ignore unknown event types
+                System.err.println("Ignoring event cmd " +
+                                   evt.eventKind + " from the VM");
+                return null;
+        }
+    }
+
+    public VirtualMachine virtualMachine() {
+        return vm;
+    }
+
+    public int suspendPolicy() {
+        return EventRequestManagerImpl.JDWPtoJDISuspendPolicy(suspendPolicy);
+    }
+
+    private ThreadReference eventThread() {
+        for (Event event : this) {
+            if (event instanceof ThreadedEventImpl) {
+                return ((ThreadedEventImpl)event).thread();
+            }
+        }
+        return null;
+    }
+
+    public void resume() {
+        switch (suspendPolicy()) {
+            case EventRequest.SUSPEND_ALL:
+                vm.resume();
+                break;
+            case EventRequest.SUSPEND_EVENT_THREAD:
+                ThreadReference thread = eventThread();
+                if (thread == null) {
+                    throw new InternalException("Inconsistent suspend policy");
+                }
+                thread.resume();
+                break;
+            case EventRequest.SUSPEND_NONE:
+                // Do nothing
+                break;
+            default:
+                throw new InternalException("Invalid suspend policy");
+        }
+    }
+
+    public Iterator<Event> iterator() {
+        return new Itr();
+    }
+
+    public EventIterator eventIterator() {
+        return new Itr();
+    }
+
+    public class Itr implements EventIterator {
+        /**
+         * Index of element to be returned by subsequent call to next.
+         */
+        int cursor = 0;
+
+        public boolean hasNext() {
+            return cursor != size();
+        }
+
+        public Event next() {
+            try {
+                Event nxt = get(cursor);
+                ++cursor;
+                return nxt;
+            } catch(IndexOutOfBoundsException e) {
+                throw new NoSuchElementException();
+            }
+        }
+
+        public Event nextEvent() {
+            return next();
+        }
+
+        public void remove() {
+            throw new UnsupportedOperationException();
+        }
+    }
+
+    @Override
+    public Spliterator<Event> spliterator() {
+        return Spliterators.spliterator(this, Spliterator.DISTINCT);
+    }
+
+    /* below make this unmodifiable */
+
+    public boolean add(Event o){
+        throw new UnsupportedOperationException();
+    }
+    public boolean remove(Object o) {
+        throw new UnsupportedOperationException();
+    }
+    public boolean addAll(Collection<? extends Event> coll) {
+        throw new UnsupportedOperationException();
+    }
+    public boolean removeAll(Collection<?> coll) {
+        throw new UnsupportedOperationException();
+    }
+    public boolean retainAll(Collection<?> coll) {
+        throw new UnsupportedOperationException();
+    }
+    public void clear() {
+        throw new UnsupportedOperationException();
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/FieldImpl.java b/src/share/classes/com/sun/tools/jdi/FieldImpl.java
new file mode 100644
index 0000000..ecf6fdc
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/FieldImpl.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+
+public class FieldImpl extends TypeComponentImpl
+                       implements Field, ValueContainer {
+
+    FieldImpl(VirtualMachine vm, ReferenceTypeImpl declaringType,
+              long ref,
+              String name, String signature,
+              String genericSignature, int modifiers) {
+        super(vm, declaringType, ref, name, signature,
+              genericSignature, modifiers);
+    }
+
+    public boolean equals(Object obj) {
+        if ((obj != null) && (obj instanceof FieldImpl)) {
+            FieldImpl other = (FieldImpl)obj;
+            return (declaringType().equals(other.declaringType())) &&
+                   (ref() == other.ref()) &&
+                   super.equals(obj);
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        return (int)ref();
+    }
+
+    public int compareTo(Field field) {
+        ReferenceTypeImpl declaringType = (ReferenceTypeImpl)declaringType();
+        int rc = declaringType.compareTo(field.declaringType());
+        if (rc == 0) {
+            rc = declaringType.indexOf(this) -
+                 declaringType.indexOf(field);
+        }
+        return rc;
+    }
+
+    public Type type() throws ClassNotLoadedException {
+        return findType(signature());
+    }
+
+    public Type findType(String signature) throws ClassNotLoadedException {
+        ReferenceTypeImpl enclosing = (ReferenceTypeImpl)declaringType();
+        return enclosing.findType(signature);
+    }
+
+    /**
+     * @return a text representation of the declared type
+     * of this field.
+     */
+    public String typeName() {
+        JNITypeParser parser = new JNITypeParser(signature());
+        return parser.typeName();
+    }
+
+    public boolean isTransient() {
+        return isModifierSet(VMModifiers.TRANSIENT);
+    }
+
+    public boolean isVolatile() {
+        return isModifierSet(VMModifiers.VOLATILE);
+    }
+
+    public boolean isEnumConstant() {
+        return isModifierSet(VMModifiers.ENUM_CONSTANT);
+    }
+
+    public String toString() {
+        StringBuffer buf = new StringBuffer();
+
+        buf.append(declaringType().name());
+        buf.append('.');
+        buf.append(name());
+
+        return buf.toString();
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/FloatTypeImpl.java b/src/share/classes/com/sun/tools/jdi/FloatTypeImpl.java
new file mode 100644
index 0000000..dc6c857
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/FloatTypeImpl.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+public class FloatTypeImpl extends PrimitiveTypeImpl implements FloatType {
+    FloatTypeImpl(VirtualMachine vm) {
+        super(vm);
+    }
+
+
+    public String signature() {
+        return String.valueOf((char)JDWP.Tag.FLOAT);
+    }
+
+    PrimitiveValue convert(PrimitiveValue value) throws InvalidTypeException {
+        return vm.mirrorOf(((PrimitiveValueImpl)value).checkedFloatValue());
+    }
+
+}
diff --git a/src/share/classes/com/sun/tools/jdi/FloatValueImpl.java b/src/share/classes/com/sun/tools/jdi/FloatValueImpl.java
new file mode 100644
index 0000000..2e1d8d4
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/FloatValueImpl.java
@@ -0,0 +1,156 @@
+/*
+ * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+public class FloatValueImpl extends PrimitiveValueImpl
+                            implements FloatValue {
+    private float value;
+
+    FloatValueImpl(VirtualMachine aVm,float aValue) {
+        super(aVm);
+
+        value = aValue;
+    }
+
+    public boolean equals(Object obj) {
+        if ((obj != null) && (obj instanceof FloatValue)) {
+            return (value == ((FloatValue)obj).value()) &&
+                   super.equals(obj);
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        /*
+         * TO DO: Better hash code
+         */
+        return intValue();
+    }
+
+    public int compareTo(FloatValue obj) {
+        float other = obj.value();
+        if (value() < other) {
+            return -1;
+        } else if (value() == other) {
+            return 0;
+        } else {
+            return 1;
+        }
+    }
+
+    public Type type() {
+        return vm.theFloatType();
+    }
+
+    public float value() {
+        return value;
+    }
+
+    public boolean booleanValue() {
+        return(value == 0.0)?false:true;
+    }
+
+    public byte byteValue() {
+        return(byte)value;
+    }
+
+    public char charValue() {
+        return(char)value;
+    }
+
+    public short shortValue() {
+        return(short)value;
+    }
+
+    public int intValue() {
+        return(int)value;
+    }
+
+    public long longValue() {
+        return(long)value;
+    }
+
+    public float floatValue() {
+        return value;
+    }
+
+    public double doubleValue() {
+        return(double)value;
+    }
+
+    byte checkedByteValue() throws InvalidTypeException {
+        if ((value > Byte.MAX_VALUE) || (value < Byte.MIN_VALUE)) {
+            throw new InvalidTypeException("Can't convert " + value + " to byte");
+        } else {
+            return super.checkedByteValue();
+        }
+    }
+
+    char checkedCharValue() throws InvalidTypeException {
+        if ((value > Character.MAX_VALUE) || (value < Character.MIN_VALUE)) {
+            throw new InvalidTypeException("Can't convert " + value + " to char");
+        } else {
+            return super.checkedCharValue();
+        }
+    }
+
+    short checkedShortValue() throws InvalidTypeException {
+        if ((value > Short.MAX_VALUE) || (value < Short.MIN_VALUE)) {
+            throw new InvalidTypeException("Can't convert " + value + " to short");
+        } else {
+            return super.checkedShortValue();
+        }
+    }
+
+    int checkedIntValue() throws InvalidTypeException {
+        int intValue = (int)value;
+        if (intValue != value) {
+            throw new InvalidTypeException("Can't convert " + value + " to int");
+        } else {
+            return super.checkedIntValue();
+        }
+    }
+
+    long checkedLongValue() throws InvalidTypeException {
+        long longValue = (long)value;
+        if (longValue != value) {
+            throw new InvalidTypeException("Can't convert " + value + " to long");
+        } else {
+            return super.checkedLongValue();
+        }
+    }
+
+    public String toString() {
+        return "" + value;
+    }
+
+    byte typeValueKey() {
+        return JDWP.Tag.FLOAT;
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/GenericAttachingConnector.java b/src/share/classes/com/sun/tools/jdi/GenericAttachingConnector.java
new file mode 100644
index 0000000..e90afc1
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/GenericAttachingConnector.java
@@ -0,0 +1,145 @@
+/*
+ * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import java.io.IOException;
+import java.util.Map;
+
+import com.sun.jdi.Bootstrap;
+import com.sun.jdi.VirtualMachine;
+import com.sun.jdi.connect.*;
+import com.sun.jdi.connect.spi.*;
+
+/*
+ * An AttachingConnector to attach to a running VM using any
+ * TransportService.
+ */
+
+public class GenericAttachingConnector
+        extends ConnectorImpl implements AttachingConnector
+{
+    /*
+     * The arguments that this connector supports
+     */
+    static final String ARG_ADDRESS = "address";
+    static final String ARG_TIMEOUT = "timeout";
+
+    TransportService transportService;
+    Transport transport;
+
+    /*
+     * Initialize a new instance of this connector. The connector
+     * encapsulates a transport service and optionally has an
+     * "address" connector argument.
+     */
+    private GenericAttachingConnector(TransportService ts,
+                                      boolean addAddressArgument)
+    {
+        transportService = ts;
+        transport = new Transport() {
+                public String name() {
+                    // delegate name to the transport service
+                    return transportService.name();
+                }
+            };
+
+        if (addAddressArgument) {
+            addStringArgument(
+                ARG_ADDRESS,
+                getString("generic_attaching.address.label"),
+                getString("generic_attaching.address"),
+                "",
+                true);
+        }
+
+
+        addIntegerArgument(
+                ARG_TIMEOUT,
+                getString("generic_attaching.timeout.label"),
+                getString("generic_attaching.timeout"),
+                "",
+                false,
+                0, Integer.MAX_VALUE);
+    }
+
+    /**
+     * Initializes a new instance of this connector. This constructor
+     * is used when sub-classing - the resulting connector will have
+     * a "timeout" connector argument.
+     */
+    protected GenericAttachingConnector(TransportService ts) {
+        this(ts, false);
+    }
+
+    /*
+     * Create an instance of this connector. The resulting AttachingConnector
+     * will have address and timeout connector arguments.
+     */
+    public static GenericAttachingConnector create(TransportService ts) {
+        return new GenericAttachingConnector(ts, true);
+    }
+
+    /**
+     * Attach to a target VM using the specified address and Connector arguments.
+     */
+    public VirtualMachine attach(String address, Map<String, ? extends Connector.Argument> args)
+        throws IOException, IllegalConnectorArgumentsException
+    {
+        String ts  = argument(ARG_TIMEOUT, args).value();
+        int timeout = 0;
+        if (ts.length() > 0) {
+            timeout = Integer.decode(ts).intValue();
+        }
+        Connection connection = transportService.attach(address, timeout, 0);
+        return Bootstrap.virtualMachineManager().createVirtualMachine(connection);
+    }
+
+    /**
+     * Attach to a target VM using the specified arguments - the address
+     * of the target VM is specified by the <code>address</code> connector
+     * argument.
+     */
+    public VirtualMachine
+        attach(Map<String,? extends Connector.Argument> args)
+        throws IOException, IllegalConnectorArgumentsException
+    {
+        String address = argument(ARG_ADDRESS, args).value();
+        return attach(address, args);
+    }
+
+    public String name() {
+        return transport.name() + "Attach";
+    }
+
+    public String description() {
+        return transportService.description();
+    }
+
+    public Transport transport() {
+        return transport;
+    }
+
+}
diff --git a/src/share/classes/com/sun/tools/jdi/GenericListeningConnector.java b/src/share/classes/com/sun/tools/jdi/GenericListeningConnector.java
new file mode 100644
index 0000000..886a954
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/GenericListeningConnector.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import java.util.Map;
+import java.util.HashMap;
+import java.util.ArrayList;
+import java.io.IOException;
+
+import com.sun.jdi.Bootstrap;
+import com.sun.jdi.VirtualMachine;
+import com.sun.jdi.connect.*;
+import com.sun.jdi.connect.spi.*;
+
+/*
+ * A ListeningConnector to listen for connections from target VM
+ * using the configured transport service
+ */
+public class GenericListeningConnector
+        extends ConnectorImpl implements ListeningConnector
+{
+    static final String ARG_ADDRESS = "address";
+    static final String ARG_TIMEOUT = "timeout";
+
+    Map<Map<String,? extends Connector.Argument>, TransportService.ListenKey>  listenMap;
+    TransportService transportService;
+    Transport transport;
+
+    /**
+     * Initialize a new instance of this connector. The connector
+     * encapsulates a transport service, has a "timeout" connector argument,
+     * and optionally an "address" connector argument.
+     */
+    private GenericListeningConnector(TransportService ts,
+                                      boolean addAddressArgument)
+    {
+        transportService = ts;
+        transport = new Transport() {
+                public String name() {
+                    return transportService.name();
+                }
+            };
+
+        if (addAddressArgument) {
+            addStringArgument(
+                ARG_ADDRESS,
+                getString("generic_listening.address.label"),
+                getString("generic_listening.address"),
+                "",
+                false);
+        }
+
+        addIntegerArgument(
+                ARG_TIMEOUT,
+                getString("generic_listening.timeout.label"),
+                getString("generic_listening.timeout"),
+                "",
+                false,
+                0, Integer.MAX_VALUE);
+
+        listenMap = new HashMap<Map<String,? extends Connector.Argument>,TransportService.ListenKey>(10);
+    }
+
+    /**
+     * Initialize a new instance of this connector. This constructor is used
+     * when sub-classing - the resulting connector will a "timeout" connector
+     * argument.
+     */
+    protected GenericListeningConnector(TransportService ts) {
+        this(ts, false);
+    }
+
+    /**
+     * Create an instance of this Connector. The resulting ListeningConnector will
+     * have "address" and "timeout" connector arguments.
+     */
+    public static GenericListeningConnector create(TransportService ts) {
+        return new GenericListeningConnector(ts, true);
+    }
+
+    public String startListening(String address, Map<String,? extends Connector.Argument> args)
+        throws IOException, IllegalConnectorArgumentsException
+    {
+        TransportService.ListenKey listener = listenMap.get(args);
+        if (listener != null) {
+           throw new IllegalConnectorArgumentsException("Already listening",
+               new ArrayList<String>(args.keySet()));
+        }
+
+        listener = transportService.startListening(address);
+        listenMap.put(args, listener);
+        return listener.address();
+    }
+
+    public String
+        startListening(Map<String,? extends Connector.Argument> args)
+        throws IOException, IllegalConnectorArgumentsException
+    {
+        String address = argument(ARG_ADDRESS, args).value();
+        return startListening(address, args);
+    }
+
+    public void stopListening(Map<String,? extends Connector.Argument> args)
+        throws IOException, IllegalConnectorArgumentsException
+    {
+        TransportService.ListenKey listener = listenMap.get(args);
+        if (listener == null) {
+           throw new IllegalConnectorArgumentsException("Not listening",
+               new ArrayList<String>(args.keySet()));
+        }
+        transportService.stopListening(listener);
+        listenMap.remove(args);
+    }
+
+    public VirtualMachine
+        accept(Map<String,? extends Connector.Argument> args)
+        throws IOException, IllegalConnectorArgumentsException
+    {
+        String ts = argument(ARG_TIMEOUT, args).value();
+        int timeout = 0;
+        if (ts.length() > 0) {
+            timeout = Integer.decode(ts).intValue();
+        }
+
+        TransportService.ListenKey listener = listenMap.get(args);
+        Connection connection;
+        if (listener != null) {
+            connection = transportService.accept(listener, timeout, 0);
+        } else {
+            /*
+             * Keep compatibility with previous releases - if the
+             * debugger hasn't called startListening then we do a
+             * once-off accept
+             */
+             startListening(args);
+             listener = listenMap.get(args);
+             assert listener != null;
+             connection = transportService.accept(listener, timeout, 0);
+             stopListening(args);
+        }
+        return Bootstrap.virtualMachineManager().createVirtualMachine(connection);
+    }
+
+    public boolean supportsMultipleConnections() {
+        return transportService.capabilities().supportsMultipleConnections();
+    }
+
+    public String name() {
+        return transport.name() + "Listen";
+    }
+
+    public String description() {
+        return transportService.description();
+    }
+
+    public Transport transport() {
+        return transport;
+    }
+
+}
diff --git a/src/share/classes/com/sun/tools/jdi/IntegerTypeImpl.java b/src/share/classes/com/sun/tools/jdi/IntegerTypeImpl.java
new file mode 100644
index 0000000..806f35d
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/IntegerTypeImpl.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+public class IntegerTypeImpl extends PrimitiveTypeImpl implements IntegerType {
+    IntegerTypeImpl(VirtualMachine vm) {
+        super(vm);
+    }
+
+
+    public String signature() {
+        return String.valueOf((char)JDWP.Tag.INT);
+    }
+
+    PrimitiveValue convert(PrimitiveValue value) throws InvalidTypeException {
+        return vm.mirrorOf(((PrimitiveValueImpl)value).checkedIntValue());
+    }
+
+}
diff --git a/src/share/classes/com/sun/tools/jdi/IntegerValueImpl.java b/src/share/classes/com/sun/tools/jdi/IntegerValueImpl.java
new file mode 100644
index 0000000..e748f1d
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/IntegerValueImpl.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+public class IntegerValueImpl extends PrimitiveValueImpl
+                              implements IntegerValue {
+    private int value;
+
+    IntegerValueImpl(VirtualMachine aVm,int aValue) {
+        super(aVm);
+
+        value = aValue;
+    }
+
+    public boolean equals(Object obj) {
+        if ((obj != null) && (obj instanceof IntegerValue)) {
+            return (value == ((IntegerValue)obj).value()) &&
+                   super.equals(obj);
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        /*
+         * TO DO: Better hash code
+         */
+        return intValue();
+    }
+
+    public int compareTo(IntegerValue obj) {
+        int other = obj.value();
+        return (value()<other ? -1 : (value()==other ? 0 : 1));
+    }
+
+    public Type type() {
+        return vm.theIntegerType();
+    }
+
+    public int value() {
+        return value;
+    }
+
+    public boolean booleanValue() {
+        return(value == 0)?false:true;
+    }
+
+    public byte byteValue() {
+        return(byte)value;
+    }
+
+    public char charValue() {
+        return(char)value;
+    }
+
+    public short shortValue() {
+        return(short)value;
+    }
+
+    public int intValue() {
+        return value;
+    }
+
+    public long longValue() {
+        return(long)value;
+    }
+
+    public float floatValue() {
+        return(float)value;
+    }
+
+    public double doubleValue() {
+        return(double)value;
+    }
+
+    byte checkedByteValue() throws InvalidTypeException {
+        if ((value > Byte.MAX_VALUE) || (value < Byte.MIN_VALUE)) {
+            throw new InvalidTypeException("Can't convert " + value + " to byte");
+        } else {
+            return super.checkedByteValue();
+        }
+    }
+
+    char checkedCharValue() throws InvalidTypeException {
+        if ((value > Character.MAX_VALUE) || (value < Character.MIN_VALUE)) {
+            throw new InvalidTypeException("Can't convert " + value + " to char");
+        } else {
+            return super.checkedCharValue();
+        }
+    }
+
+    short checkedShortValue() throws InvalidTypeException {
+        if ((value > Short.MAX_VALUE) || (value < Short.MIN_VALUE)) {
+            throw new InvalidTypeException("Can't convert " + value + " to short");
+        } else {
+            return super.checkedShortValue();
+        }
+    }
+
+    public String toString() {
+        return "" + value;
+    }
+
+    byte typeValueKey() {
+        return JDWP.Tag.INT;
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/InterfaceTypeImpl.java b/src/share/classes/com/sun/tools/jdi/InterfaceTypeImpl.java
new file mode 100644
index 0000000..0f263ad
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/InterfaceTypeImpl.java
@@ -0,0 +1,152 @@
+/*
+ * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Set;
+import java.lang.ref.SoftReference;
+
+final public class InterfaceTypeImpl extends InvokableTypeImpl
+                                     implements InterfaceType {
+
+    private static class IResult implements InvocationResult {
+        final private JDWP.InterfaceType.InvokeMethod rslt;
+
+        public IResult(JDWP.InterfaceType.InvokeMethod rslt) {
+            this.rslt = rslt;
+        }
+
+        @Override
+        public ObjectReferenceImpl getException() {
+            return rslt.exception;
+        }
+
+        @Override
+        public ValueImpl getResult() {
+            return rslt.returnValue;
+        }
+
+    }
+
+    private SoftReference<List<InterfaceType>> superinterfacesRef = null;
+
+    protected InterfaceTypeImpl(VirtualMachine aVm,long aRef) {
+        super(aVm, aRef);
+    }
+
+    public List<InterfaceType> superinterfaces() {
+        List<InterfaceType> superinterfaces = (superinterfacesRef == null) ? null :
+                                     superinterfacesRef.get();
+        if (superinterfaces == null) {
+            superinterfaces = getInterfaces();
+            superinterfaces = Collections.unmodifiableList(superinterfaces);
+            superinterfacesRef = new SoftReference<List<InterfaceType>>(superinterfaces);
+        }
+        return superinterfaces;
+    }
+
+    public List<InterfaceType> subinterfaces() {
+        List<InterfaceType> subs = new ArrayList<InterfaceType>();
+        for (ReferenceType refType : vm.allClasses()) {
+            if (refType instanceof InterfaceType) {
+                InterfaceType interfaze = (InterfaceType)refType;
+                if (interfaze.isPrepared() && interfaze.superinterfaces().contains(this)) {
+                    subs.add(interfaze);
+                }
+            }
+        }
+        return subs;
+    }
+
+    public List<ClassType> implementors() {
+        List<ClassType> implementors = new ArrayList<ClassType>();
+        for (ReferenceType refType : vm.allClasses()) {
+            if (refType instanceof ClassType) {
+                ClassType clazz = (ClassType)refType;
+                if (clazz.isPrepared() && clazz.interfaces().contains(this)) {
+                    implementors.add(clazz);
+                }
+            }
+        }
+        return implementors;
+    }
+
+    public boolean isInitialized() {
+        return isPrepared();
+    }
+
+    public String toString() {
+       return "interface " + name() + " (" + loaderString() + ")";
+    }
+
+    @Override
+    InvocationResult waitForReply(PacketStream stream) throws JDWPException {
+        return new IResult(JDWP.InterfaceType.InvokeMethod.waitForReply(vm, stream));
+    }
+
+    @Override
+    CommandSender getInvokeMethodSender(final ThreadReferenceImpl thread,
+                                        final MethodImpl method,
+                                        final ValueImpl[] args,
+                                        final int options) {
+        return () ->
+            JDWP.InterfaceType.InvokeMethod.enqueueCommand(vm,
+                                                           InterfaceTypeImpl.this,
+                                                           thread,
+                                                           method.ref(),
+                                                           args,
+                                                           options);
+    }
+
+    @Override
+    ClassType superclass() {
+        return null;
+    }
+
+    @Override
+    boolean isAssignableTo(ReferenceType type) {
+        if (type.name().equals("java.lang.Object")) {
+            // interfaces are always assignable to j.l.Object
+            return true;
+        }
+        return super.isAssignableTo(type);
+    }
+
+    @Override
+    List<InterfaceType> interfaces() {
+        return superinterfaces();
+    }
+
+    @Override
+    boolean canInvoke(Method method) {
+        // method must be directly in this interface
+        return this.equals(method.declaringType());
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/InternalEventHandler.java b/src/share/classes/com/sun/tools/jdi/InternalEventHandler.java
new file mode 100644
index 0000000..fdf13f0
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/InternalEventHandler.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+import com.sun.jdi.event.*;
+import java.util.*;
+
+public class InternalEventHandler implements Runnable
+{
+    EventQueueImpl queue;
+    VirtualMachineImpl vm;
+
+    InternalEventHandler(VirtualMachineImpl vm, EventQueueImpl queue)
+    {
+        this.vm = vm;
+        this.queue = queue;
+        Thread thread = new Thread(vm.threadGroupForJDI(), this,
+                                   "JDI Internal Event Handler");
+        thread.setDaemon(true);
+        thread.start();
+    }
+
+    public void run() {
+        if ((vm.traceFlags & VirtualMachine.TRACE_EVENTS) != 0) {
+            vm.printTrace("Internal event handler running");
+        }
+        try {
+            while (true) {
+                try {
+                    EventSet eventSet = queue.removeInternal();
+                    EventIterator it = eventSet.eventIterator();
+                    while (it.hasNext()) {
+                        Event event = it.nextEvent();
+                        if (event instanceof ClassUnloadEvent) {
+                            ClassUnloadEvent cuEvent = (ClassUnloadEvent)event;
+                            vm.removeReferenceType(cuEvent.classSignature());
+
+                            if ((vm.traceFlags & VirtualMachine.TRACE_EVENTS) != 0) {
+                                vm.printTrace("Handled Unload Event for " +
+                                              cuEvent.classSignature());
+                            }
+                        } else if (event instanceof ClassPrepareEvent) {
+                            ClassPrepareEvent cpEvent = (ClassPrepareEvent)event;
+                            ((ReferenceTypeImpl)cpEvent.referenceType())
+                                                            .markPrepared();
+
+                            if ((vm.traceFlags & VirtualMachine.TRACE_EVENTS) != 0) {
+                                vm.printTrace("Handled Prepare Event for " +
+                                              cpEvent.referenceType().name());
+                            }
+                        }
+
+                    }
+
+                /*
+                 * Handle exceptions that can occur in normal operation
+                 * but which can't be accounted for by event builder
+                 * methods. The thread should not be terminated if they
+                 * occur.
+                 *
+                 * TO DO: We need a better way to log these conditions.
+                 */
+                } catch (VMOutOfMemoryException vmme) {
+                    vmme.printStackTrace();
+                } catch (InconsistentDebugInfoException idie) {
+                    idie.printStackTrace();
+
+                /*
+                 * If any of these exceptions below occurs, there is some
+                 * sort of programming error that should be addressed in
+                 * the JDI implemementation. However, it would cripple
+                 * the implementation if we let this thread die due to
+                 * one of them. So, a notification of the exception is
+                 * given and we attempt to continue.
+                 */
+                } catch (ObjectCollectedException oce) {
+                    oce.printStackTrace();
+                } catch (ClassNotPreparedException cnpe) {
+                    cnpe.printStackTrace();
+                }
+            }
+        } catch (InterruptedException e) {  // should we really die here
+        } catch (VMDisconnectedException e) {  // time to die
+        }
+        if ((vm.traceFlags & VirtualMachine.TRACE_EVENTS) != 0) {
+            vm.printTrace("Internal event handler exiting");
+        }
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/InvokableTypeImpl.java b/src/share/classes/com/sun/tools/jdi/InvokableTypeImpl.java
new file mode 100644
index 0000000..3672435
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/InvokableTypeImpl.java
@@ -0,0 +1,314 @@
+/*
+ * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.ClassNotLoadedException;
+import com.sun.jdi.ClassType;
+import com.sun.jdi.IncompatibleThreadStateException;
+import com.sun.jdi.InterfaceType;
+import com.sun.jdi.InvalidTypeException;
+import com.sun.jdi.InvocationException;
+import com.sun.jdi.Method;
+import com.sun.jdi.ReferenceType;
+import com.sun.jdi.ThreadReference;
+import com.sun.jdi.Value;
+import com.sun.jdi.VirtualMachine;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A supertype for ReferenceTypes allowing method invocations
+ */
+abstract class InvokableTypeImpl extends ReferenceTypeImpl {
+    /**
+     * The invocation result wrapper
+     * It is necessary because both ClassType and InterfaceType
+     * use their own type to represent the invocation result
+     */
+    static interface InvocationResult {
+        ObjectReferenceImpl getException();
+        ValueImpl getResult();
+    }
+
+    InvokableTypeImpl(VirtualMachine aVm, long aRef) {
+        super(aVm, aRef);
+    }
+
+    /**
+     * Method invocation support.
+     * Shared by ClassType and InterfaceType
+     * @param threadIntf the thread in which to invoke.
+     * @param methodIntf method the {@link Method} to invoke.
+     * @param origArguments the list of {@link Value} arguments bound to the
+     * invoked method. Values from the list are assigned to arguments
+     * in the order they appear in the method signature.
+     * @param options the integer bit flag options.
+     * @return a {@link Value} mirror of the invoked method's return value.
+     * @throws java.lang.IllegalArgumentException if the method is not
+     * a member of this type, if the size of the argument list
+     * does not match the number of declared arguments for the method, or
+     * if the method is not static or is a static initializer.
+     * @throws {@link InvalidTypeException} if any argument in the
+     * argument list is not assignable to the corresponding method argument
+     * type.
+     * @throws ClassNotLoadedException if any argument type has not yet been loaded
+     * through the appropriate class loader.
+     * @throws IncompatibleThreadStateException if the specified thread has not
+     * been suspended by an event.
+     * @throws InvocationException if the method invocation resulted in
+     * an exception in the target VM.
+     * @throws InvalidTypeException If the arguments do not meet this requirement --
+     *         Object arguments must be assignment compatible with the argument
+     *         type.  This implies that the argument type must be
+     *         loaded through the enclosing class's class loader.
+     *         Primitive arguments must be either assignment compatible with the
+     *         argument type or must be convertible to the argument type without loss
+     *         of information. See JLS section 5.2 for more information on assignment
+     *         compatibility.
+     * @throws VMCannotBeModifiedException if the VirtualMachine is read-only - see {@link VirtualMachine#canBeModified()}.
+     */
+    final public Value invokeMethod(ThreadReference threadIntf, Method methodIntf,
+                                    List<? extends Value> origArguments, int options)
+                                        throws InvalidTypeException,
+                                               ClassNotLoadedException,
+                                               IncompatibleThreadStateException,
+                                               InvocationException {
+        validateMirror(threadIntf);
+        validateMirror(methodIntf);
+        validateMirrorsOrNulls(origArguments);
+        MethodImpl method = (MethodImpl) methodIntf;
+        ThreadReferenceImpl thread = (ThreadReferenceImpl) threadIntf;
+        validateMethodInvocation(method);
+        List<? extends Value> arguments = method.validateAndPrepareArgumentsForInvoke(origArguments);
+        ValueImpl[] args = arguments.toArray(new ValueImpl[0]);
+        InvocationResult ret;
+        try {
+            PacketStream stream = sendInvokeCommand(thread, method, args, options);
+            ret = waitForReply(stream);
+        } catch (JDWPException exc) {
+            if (exc.errorCode() == JDWP.Error.INVALID_THREAD) {
+                throw new IncompatibleThreadStateException();
+            } else {
+                throw exc.toJDIException();
+            }
+        }
+        /*
+         * There is an implict VM-wide suspend at the conclusion
+         * of a normal (non-single-threaded) method invoke
+         */
+        if ((options & ClassType.INVOKE_SINGLE_THREADED) == 0) {
+            vm.notifySuspend();
+        }
+        if (ret.getException() != null) {
+            throw new InvocationException(ret.getException());
+        } else {
+            return ret.getResult();
+        }
+    }
+
+    @Override
+    boolean isAssignableTo(ReferenceType type) {
+        ClassTypeImpl superclazz = (ClassTypeImpl) superclass();
+        if (this.equals(type)) {
+            return true;
+        } else if ((superclazz != null) && superclazz.isAssignableTo(type)) {
+            return true;
+        } else {
+            List<InterfaceType> interfaces = interfaces();
+            Iterator<InterfaceType> iter = interfaces.iterator();
+            while (iter.hasNext()) {
+                InterfaceTypeImpl interfaze = (InterfaceTypeImpl) iter.next();
+                if (interfaze.isAssignableTo(type)) {
+                    return true;
+                }
+            }
+            return false;
+        }
+    }
+
+    @Override
+    final void addVisibleMethods(Map<String, Method> methodMap, Set<InterfaceType> seenInterfaces) {
+        /*
+         * Add methods from
+         * parent types first, so that the methods in this class will
+         * overwrite them in the hash table
+         */
+        Iterator<InterfaceType> iter = interfaces().iterator();
+        while (iter.hasNext()) {
+            InterfaceTypeImpl interfaze = (InterfaceTypeImpl) iter.next();
+            if (!seenInterfaces.contains(interfaze)) {
+                interfaze.addVisibleMethods(methodMap, seenInterfaces);
+                seenInterfaces.add(interfaze);
+            }
+        }
+        ClassTypeImpl clazz = (ClassTypeImpl) superclass();
+        if (clazz != null) {
+            clazz.addVisibleMethods(methodMap, seenInterfaces);
+        }
+        addToMethodMap(methodMap, methods());
+    }
+
+    final void addInterfaces(List<InterfaceType> list) {
+        List<InterfaceType> immediate = interfaces();
+        list.addAll(interfaces());
+        Iterator<InterfaceType> iter = immediate.iterator();
+        while (iter.hasNext()) {
+            InterfaceTypeImpl interfaze = (InterfaceTypeImpl) iter.next();
+            interfaze.addInterfaces(list);
+        }
+        ClassTypeImpl superclass = (ClassTypeImpl) superclass();
+        if (superclass != null) {
+            superclass.addInterfaces(list);
+        }
+    }
+
+    /**
+     * Returns all the implemented interfaces recursively
+     * @return A list of all the implemented interfaces (recursively)
+     */
+    final List<InterfaceType> getAllInterfaces() {
+        List<InterfaceType> all = new ArrayList<>();
+        addInterfaces(all);
+        return all;
+    }
+
+    /**
+     * Shared implementation of {@linkplain ClassType#allMethods()} and
+     * {@linkplain InterfaceType#allMethods()}
+     * @return A list of all methods (recursively)
+     */
+    public final List<Method> allMethods() {
+        ArrayList<Method> list = new ArrayList<>(methods());
+        ClassType clazz = superclass();
+        while (clazz != null) {
+            list.addAll(clazz.methods());
+            clazz = clazz.superclass();
+        }
+        /*
+         * Avoid duplicate checking on each method by iterating through
+         * duplicate-free allInterfaces() rather than recursing
+         */
+        for (InterfaceType interfaze : getAllInterfaces()) {
+            list.addAll(interfaze.methods());
+        }
+        return list;
+    }
+
+    @Override
+    final List<ReferenceType> inheritedTypes() {
+        List<ReferenceType> inherited = new ArrayList<>();
+        if (superclass() != null) {
+            inherited.add(0, superclass()); /* insert at front */
+        }
+        for (ReferenceType rt : interfaces()) {
+            inherited.add(rt);
+        }
+        return inherited;
+    }
+
+    private PacketStream sendInvokeCommand(final ThreadReferenceImpl thread,
+                                           final MethodImpl method,
+                                           final ValueImpl[] args,
+                                           final int options) {
+        /*
+         * Cache the values of args when TRACE_SENDS is enabled, for later printing.
+         * If not cached, printing causes a remote call while synchronized, and deadlock.
+         */
+        if ((vm.traceFlags & VirtualMachineImpl.TRACE_SENDS) != 0) {
+           for (ValueImpl arg: args) {
+              arg.toString();
+           }
+        }
+        CommandSender sender = getInvokeMethodSender(thread, method, args, options);
+        PacketStream stream;
+        if ((options & ClassType.INVOKE_SINGLE_THREADED) != 0) {
+            stream = thread.sendResumingCommand(sender);
+        } else {
+            stream = vm.sendResumingCommand(sender);
+        }
+        return stream;
+    }
+
+    private void validateMethodInvocation(Method method)
+                                            throws InvalidTypeException,
+                                                   InvocationException {
+        if (!canInvoke(method)) {
+            throw new IllegalArgumentException("Invalid method");
+        }
+        /*
+         * Method must be a static and not a static initializer
+         */
+        if (!method.isStatic()) {
+            throw new IllegalArgumentException("Cannot invoke instance method on a class/interface type");
+        } else if (method.isStaticInitializer()) {
+            throw new IllegalArgumentException("Cannot invoke static initializer");
+        }
+    }
+
+    /**
+     * A subclass will provide specific {@linkplain CommandSender}
+     * @param thread the current invocation thread
+     * @param method the method to invoke
+     * @param args the arguments to pass to the method
+     * @param options the integer bit flag options
+     * @return the specific {@literal CommandSender} instance
+     */
+    abstract CommandSender getInvokeMethodSender(ThreadReferenceImpl thread,
+                                                 MethodImpl method,
+                                                 ValueImpl[] args,
+                                                 int options);
+
+    /**
+     * Waits for the reply to the last sent command
+     * @param stream the stream to listen for the reply on
+     * @return the {@linkplain InvocationResult} instance
+     * @throws JDWPException when something goes wrong in JDWP
+     */
+    abstract InvocationResult waitForReply(PacketStream stream) throws JDWPException;
+
+    /**
+     * Get the {@linkplain ReferenceType} superclass
+     * @return the superclass or null
+     */
+    abstract ClassType superclass();
+
+    /**
+     * Get the implemented/extended interfaces
+     * @return the list of implemented/extended interfaces
+     */
+    abstract List<InterfaceType> interfaces();
+
+    /**
+     * Checks the provided method whether it can be invoked
+     * @param method the method to check
+     * @return {@code TRUE} if the implementation knows how to invoke the method,
+     *         {@code FALSE} otherwise
+     */
+    abstract boolean canInvoke(Method method);
+}
diff --git a/src/share/classes/com/sun/tools/jdi/JDWPException.java b/src/share/classes/com/sun/tools/jdi/JDWPException.java
new file mode 100644
index 0000000..6f3fdb5
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/JDWPException.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+import com.sun.jdi.*;
+
+class JDWPException extends Exception {
+    private static final long serialVersionUID = -6321344442751299874L;
+    short errorCode;
+
+    JDWPException(short errorCode) {
+        super();
+        this.errorCode = errorCode;
+    }
+
+    short errorCode() {
+        return errorCode;
+    }
+
+    RuntimeException toJDIException() {
+        switch (errorCode) {
+            case JDWP.Error.INVALID_OBJECT:
+                return new ObjectCollectedException();
+            case JDWP.Error.VM_DEAD:
+                return new VMDisconnectedException();
+            case JDWP.Error.OUT_OF_MEMORY:
+                return new VMOutOfMemoryException();
+            case JDWP.Error.CLASS_NOT_PREPARED:
+                return new ClassNotPreparedException();
+            case JDWP.Error.INVALID_FRAMEID:
+            case JDWP.Error.NOT_CURRENT_FRAME:
+                return new InvalidStackFrameException();
+            case JDWP.Error.NOT_IMPLEMENTED:
+                return new UnsupportedOperationException();
+            case JDWP.Error.INVALID_INDEX:
+            case JDWP.Error.INVALID_LENGTH:
+                return new IndexOutOfBoundsException();
+            case JDWP.Error.TYPE_MISMATCH:
+                return new InconsistentDebugInfoException();
+            case JDWP.Error.INVALID_THREAD:
+                return new IllegalThreadStateException();
+            default:
+                return new InternalException("Unexpected JDWP Error: " + errorCode, errorCode);
+        }
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/JNITypeParser.java b/src/share/classes/com/sun/tools/jdi/JNITypeParser.java
new file mode 100644
index 0000000..2ed7265
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/JNITypeParser.java
@@ -0,0 +1,241 @@
+/*
+ * Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import java.util.List;
+import java.util.ArrayList;
+
+public class JNITypeParser {
+
+    static final char SIGNATURE_ENDCLASS = ';';
+    static final char SIGNATURE_FUNC = '(';
+    static final char SIGNATURE_ENDFUNC = ')';
+
+    private String signature;
+    private List<String> typeNameList;
+    private List<String> signatureList;
+    private int currentIndex;
+
+    JNITypeParser(String signature) {
+        this.signature = signature;
+    }
+
+    static String typeNameToSignature(String signature) {
+        StringBuffer buffer = new StringBuffer();
+        int firstIndex = signature.indexOf('[');
+        int index = firstIndex;
+        while (index != -1) {
+            buffer.append('[');
+            index = signature.indexOf('[', index + 1);
+        }
+
+        if (firstIndex != -1) {
+            signature = signature.substring(0, firstIndex);
+        }
+
+        if (signature.equals("boolean")) {
+            buffer.append('Z');
+        } else if (signature.equals("byte")) {
+            buffer.append('B');
+        } else if (signature.equals("char")) {
+            buffer.append('C');
+        } else if (signature.equals("short")) {
+            buffer.append('S');
+        } else if (signature.equals("int")) {
+            buffer.append('I');
+        } else if (signature.equals("long")) {
+            buffer.append('J');
+        } else if (signature.equals("float")) {
+            buffer.append('F');
+        } else if (signature.equals("double")) {
+            buffer.append('D');
+        } else {
+            buffer.append('L');
+            buffer.append(signature.replace('.', '/'));
+            buffer.append(';');
+        }
+
+        return buffer.toString();
+    }
+
+    String typeName() {
+        return typeNameList().get(typeNameList().size()-1);
+    }
+
+    List<String> argumentTypeNames() {
+        return typeNameList().subList(0, typeNameList().size() - 1);
+    }
+
+    String signature() {
+        return signatureList().get(signatureList().size()-1);
+    }
+
+    List<String> argumentSignatures() {
+        return signatureList().subList(0, signatureList().size() - 1);
+    }
+
+    int dimensionCount() {
+        int count = 0;
+        String signature = signature();
+        while (signature.charAt(count) == '[') {
+            count++;
+        }
+        return count;
+    }
+
+    String componentSignature(int level) {
+        return signature().substring(level);
+    }
+
+    private synchronized List<String> signatureList() {
+        if (signatureList == null) {
+            signatureList = new ArrayList<String>(10);
+            String elem;
+
+            currentIndex = 0;
+
+            while(currentIndex < signature.length()) {
+                elem = nextSignature();
+                signatureList.add(elem);
+            }
+            if (signatureList.size() == 0) {
+                throw new IllegalArgumentException("Invalid JNI signature '" +
+                                                   signature + "'");
+            }
+        }
+        return signatureList;
+    }
+
+    private synchronized List<String> typeNameList() {
+        if (typeNameList == null) {
+            typeNameList = new ArrayList<String>(10);
+            String elem;
+
+            currentIndex = 0;
+
+            while(currentIndex < signature.length()) {
+                elem = nextTypeName();
+                typeNameList.add(elem);
+            }
+            if (typeNameList.size() == 0) {
+                throw new IllegalArgumentException("Invalid JNI signature '" +
+                                                   signature + "'");
+            }
+        }
+        return typeNameList;
+    }
+
+    private String nextSignature() {
+        char key = signature.charAt(currentIndex++);
+
+        switch(key) {
+            case (JDWP.Tag.ARRAY):
+                return  key + nextSignature();
+
+            case (JDWP.Tag.OBJECT):
+                int endClass = signature.indexOf(SIGNATURE_ENDCLASS,
+                                                 currentIndex);
+                String retVal = signature.substring(currentIndex - 1,
+                                                    endClass + 1);
+                currentIndex = endClass + 1;
+                return retVal;
+
+            case (JDWP.Tag.VOID):
+            case (JDWP.Tag.BOOLEAN):
+            case (JDWP.Tag.BYTE):
+            case (JDWP.Tag.CHAR):
+            case (JDWP.Tag.SHORT):
+            case (JDWP.Tag.INT):
+            case (JDWP.Tag.LONG):
+            case (JDWP.Tag.FLOAT):
+            case (JDWP.Tag.DOUBLE):
+                return String.valueOf(key);
+
+            case SIGNATURE_ENDFUNC:
+            case SIGNATURE_FUNC:
+                return nextSignature();
+
+            default:
+                throw new IllegalArgumentException(
+                    "Invalid JNI signature character '" + key + "'");
+
+        }
+    }
+
+    private String nextTypeName() {
+        char key = signature.charAt(currentIndex++);
+
+        switch(key) {
+            case (JDWP.Tag.ARRAY):
+                return  nextTypeName() + "[]";
+
+            case (JDWP.Tag.BYTE):
+                return "byte";
+
+            case (JDWP.Tag.CHAR):
+                return "char";
+
+            case (JDWP.Tag.OBJECT):
+                int endClass = signature.indexOf(SIGNATURE_ENDCLASS,
+                                                 currentIndex);
+                String retVal = signature.substring(currentIndex,
+                                                    endClass);
+                retVal = retVal.replace('/','.');
+                currentIndex = endClass + 1;
+                return retVal;
+
+            case (JDWP.Tag.FLOAT):
+                return "float";
+
+            case (JDWP.Tag.DOUBLE):
+                return "double";
+
+            case (JDWP.Tag.INT):
+                return "int";
+
+            case (JDWP.Tag.LONG):
+                return "long";
+
+            case (JDWP.Tag.SHORT):
+                return "short";
+
+            case (JDWP.Tag.VOID):
+                return "void";
+
+            case (JDWP.Tag.BOOLEAN):
+                return "boolean";
+
+            case SIGNATURE_ENDFUNC:
+            case SIGNATURE_FUNC:
+                return nextTypeName();
+
+            default:
+                throw new IllegalArgumentException(
+                    "Invalid JNI signature character '" + key + "'");
+
+        }
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/LineInfo.java b/src/share/classes/com/sun/tools/jdi/LineInfo.java
new file mode 100644
index 0000000..8a4bdef
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/LineInfo.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+interface LineInfo {
+
+    String liStratum();
+
+    int liLineNumber();
+
+    String liSourceName() throws AbsentInformationException;
+
+    String liSourcePath() throws AbsentInformationException;
+}
diff --git a/src/share/classes/com/sun/tools/jdi/LocalVariableImpl.java b/src/share/classes/com/sun/tools/jdi/LocalVariableImpl.java
new file mode 100644
index 0000000..0914eb1
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/LocalVariableImpl.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+import com.sun.jdi.*;
+
+public class LocalVariableImpl extends MirrorImpl
+                               implements LocalVariable, ValueContainer
+{
+    private final Method method;
+    private final int slot;
+    private final Location scopeStart;
+    private final Location scopeEnd;
+    private final String name;
+    private final String signature;
+    private String genericSignature = null;
+
+    LocalVariableImpl(VirtualMachine vm, Method method,
+                      int slot, Location scopeStart, Location scopeEnd,
+                      String name, String signature,
+                      String genericSignature) {
+        super(vm);
+        this.method = method;
+        this.slot = slot;
+        this.scopeStart = scopeStart;
+        this.scopeEnd = scopeEnd;
+        this.name = name;
+        this.signature = signature;
+        if (genericSignature != null && genericSignature.length() > 0) {
+            this.genericSignature = genericSignature;
+        } else {
+            // The Spec says to return null for non-generic types
+            this.genericSignature = null;
+        }
+    }
+
+    public boolean equals(Object obj) {
+        if ((obj != null) && (obj instanceof LocalVariableImpl)) {
+            LocalVariableImpl other = (LocalVariableImpl)obj;
+            return ((slot() == other.slot()) &&
+                    (scopeStart != null) &&
+                    (scopeStart.equals(other.scopeStart)) &&
+                    (super.equals(obj)));
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        /*
+         * TO DO: Better hash code
+         */
+        return ((scopeStart.hashCode() << 4) + slot());
+    }
+
+    public int compareTo(LocalVariable object) {
+        LocalVariableImpl other = (LocalVariableImpl)object;
+
+        int rc = scopeStart.compareTo(other.scopeStart);
+        if (rc == 0) {
+            rc = slot() - other.slot();
+        }
+        return rc;
+    }
+
+    public String name() {
+        return name;
+    }
+
+    /**
+     * @return a text representation of the declared type
+     * of this variable.
+     */
+    public String typeName() {
+        JNITypeParser parser = new JNITypeParser(signature);
+        return parser.typeName();
+    }
+
+    public Type type() throws ClassNotLoadedException {
+        return findType(signature());
+    }
+
+    public Type findType(String signature) throws ClassNotLoadedException {
+        ReferenceTypeImpl enclosing = (ReferenceTypeImpl)method.declaringType();
+        return enclosing.findType(signature);
+    }
+
+    public String signature() {
+        return signature;
+    }
+
+    public String genericSignature() {
+        return genericSignature;
+    }
+
+    public boolean isVisible(StackFrame frame) {
+        validateMirror(frame);
+        Method frameMethod = frame.location().method();
+
+        if (!frameMethod.equals(method)) {
+            throw new IllegalArgumentException(
+                       "frame method different than variable's method");
+        }
+
+        // this is here to cover the possibility that we will
+        // allow LocalVariables for native methods.  If we do
+        // so we will have to re-examinine this.
+        if (frameMethod.isNative()) {
+            return false;
+        }
+
+        return ((scopeStart.compareTo(frame.location()) <= 0)
+             && (scopeEnd.compareTo(frame.location()) >= 0));
+    }
+
+    public boolean isArgument() {
+        try {
+            MethodImpl method = (MethodImpl)scopeStart.method();
+            return (slot < method.argSlotCount());
+        } catch (AbsentInformationException e) {
+            // If this variable object exists, there shouldn't be absent info
+            throw new InternalException();
+        }
+    }
+
+    int slot() {
+        return slot;
+    }
+
+    /*
+     * Compilers/VMs can have byte code ranges for variables of the
+     * same names that overlap. This is because the byte code ranges
+     * aren't necessarily scopes; they may have more to do with the
+     * lifetime of the variable's slot, depending on implementation.
+     *
+     * This method determines whether this variable hides an
+     * identically named variable; ie, their byte code ranges overlap
+     * this one starts after the given one. If it returns true this
+     * variable should be preferred when looking for a single variable
+     * with its name when both variables are visible.
+     */
+    boolean hides(LocalVariable other) {
+        LocalVariableImpl otherImpl = (LocalVariableImpl)other;
+        if (!method.equals(otherImpl.method) ||
+            !name.equals(otherImpl.name)) {
+            return false;
+        } else {
+            return (scopeStart.compareTo(otherImpl.scopeStart) > 0);
+        }
+    }
+
+    public String toString() {
+       return name() + " in " + method.toString() +
+              "@" + scopeStart.toString();
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/LocationImpl.java b/src/share/classes/com/sun/tools/jdi/LocationImpl.java
new file mode 100644
index 0000000..5922dc0
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/LocationImpl.java
@@ -0,0 +1,227 @@
+/*
+ * Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+import java.util.*;
+
+public class LocationImpl extends MirrorImpl implements Location {
+    private final ReferenceTypeImpl declaringType;
+    private Method method;
+    private long methodRef;
+    private long codeIndex;
+    private LineInfo baseLineInfo = null;
+    private LineInfo otherLineInfo = null;
+
+    LocationImpl(VirtualMachine vm,
+                 Method method, long codeIndex) {
+        super(vm);
+
+        this.method = method;
+        this.codeIndex = method.isNative()? -1 : codeIndex;
+        this.declaringType = (ReferenceTypeImpl)method.declaringType();
+    }
+
+    /*
+     * This constructor allows lazy creation of the method mirror. This
+     * can be a performance savings if the method mirror does not yet
+     * exist.
+     */
+    LocationImpl(VirtualMachine vm, ReferenceTypeImpl declaringType,
+                 long methodRef, long codeIndex) {
+        super(vm);
+
+        this.method = null;
+        this.codeIndex = codeIndex;
+        this.declaringType = declaringType;
+        this.methodRef = methodRef;
+    }
+
+    public boolean equals(Object obj) {
+        if ((obj != null) && (obj instanceof Location)) {
+            Location other = (Location)obj;
+            return (method().equals(other.method())) &&
+                   (codeIndex() == other.codeIndex()) &&
+                   super.equals(obj);
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        /*
+         * TO DO: better hash code?
+         */
+        return method().hashCode() + (int)codeIndex();
+    }
+
+    public int compareTo(Location object) {
+        LocationImpl other = (LocationImpl)object;
+        int rc = method().compareTo(other.method());
+        if (rc == 0) {
+            long diff = codeIndex() - other.codeIndex();
+            if (diff < 0)
+                return -1;
+            else if (diff > 0)
+                return 1;
+            else
+                return 0;
+        }
+        return rc;
+    }
+
+    public ReferenceType declaringType() {
+        return declaringType;
+    }
+
+    public Method method() {
+        if (method == null) {
+            method = declaringType.getMethodMirror(methodRef);
+            if (method.isNative()) {
+                codeIndex = -1;
+            }
+        }
+        return method;
+    }
+
+    public long codeIndex() {
+        method();  // be sure information is up-to-date
+        return codeIndex;
+    }
+
+    LineInfo getBaseLineInfo(SDE.Stratum stratum) {
+        LineInfo lineInfo;
+
+        /* check if there is cached info to use */
+        if (baseLineInfo != null) {
+            return baseLineInfo;
+        }
+
+        /* compute the line info */
+        MethodImpl methodImpl = (MethodImpl)method();
+        lineInfo = methodImpl.codeIndexToLineInfo(stratum,
+                                                  codeIndex());
+
+        /* cache it */
+        addBaseLineInfo(lineInfo);
+
+        return lineInfo;
+    }
+
+    LineInfo getLineInfo(SDE.Stratum stratum) {
+        LineInfo lineInfo;
+
+        /* base stratum is done slighly differently */
+        if (stratum.isJava()) {
+            return getBaseLineInfo(stratum);
+        }
+
+        /* check if there is cached info to use */
+        lineInfo = otherLineInfo; // copy because of concurrency
+        if (lineInfo != null &&
+                           stratum.id().equals(lineInfo.liStratum())) {
+            return lineInfo;
+        }
+
+        int baseLineNumber = lineNumber(SDE.BASE_STRATUM_NAME);
+        SDE.LineStratum lineStratum =
+                  stratum.lineStratum(declaringType, baseLineNumber);
+
+        if (lineStratum != null && lineStratum.lineNumber() != -1) {
+            lineInfo = new StratumLineInfo(stratum.id(),
+                                           lineStratum.lineNumber(),
+                                           lineStratum.sourceName(),
+                                           lineStratum.sourcePath());
+        } else {
+            /* find best match */
+            MethodImpl methodImpl = (MethodImpl)method();
+            lineInfo = methodImpl.codeIndexToLineInfo(stratum,
+                                                      codeIndex());
+        }
+
+        /* cache it */
+        addStratumLineInfo(lineInfo);
+
+        return lineInfo;
+    }
+
+    void addStratumLineInfo(LineInfo lineInfo) {
+        otherLineInfo = lineInfo;
+    }
+
+    void addBaseLineInfo(LineInfo lineInfo) {
+        baseLineInfo = lineInfo;
+    }
+
+    public String sourceName() throws AbsentInformationException {
+        return sourceName(vm.getDefaultStratum());
+    }
+
+    public String sourceName(String stratumID)
+                               throws AbsentInformationException {
+        return sourceName(declaringType.stratum(stratumID));
+    }
+
+    String sourceName(SDE.Stratum stratum)
+                               throws AbsentInformationException {
+        return getLineInfo(stratum).liSourceName();
+    }
+
+    public String sourcePath() throws AbsentInformationException {
+        return sourcePath(vm.getDefaultStratum());
+    }
+
+    public String sourcePath(String stratumID)
+                               throws AbsentInformationException {
+        return sourcePath(declaringType.stratum(stratumID));
+    }
+
+    String sourcePath(SDE.Stratum stratum)
+                               throws AbsentInformationException {
+        return getLineInfo(stratum).liSourcePath();
+    }
+
+    public int lineNumber() {
+        return lineNumber(vm.getDefaultStratum());
+    }
+
+    public int lineNumber(String stratumID) {
+        return lineNumber(declaringType.stratum(stratumID));
+    }
+
+    int lineNumber(SDE.Stratum stratum) {
+        return getLineInfo(stratum).liLineNumber();
+    }
+
+    public String toString() {
+        if (lineNumber() == -1) {
+            return method().toString() + "+" + codeIndex();
+        } else {
+            return declaringType().name() + ":" + lineNumber();
+        }
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/LockObject.java b/src/share/classes/com/sun/tools/jdi/LockObject.java
new file mode 100644
index 0000000..250a8ca
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/LockObject.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 1998, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+/**
+ * This class is used by the back end to do thread synchronization.
+ * We don't want to use java.lang.Object(s) for two reasons: we can't
+ * filter them out, and this class should use less heap.
+ */
+
+public class LockObject
+{
+}
diff --git a/src/share/classes/com/sun/tools/jdi/LongTypeImpl.java b/src/share/classes/com/sun/tools/jdi/LongTypeImpl.java
new file mode 100644
index 0000000..5854d5e
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/LongTypeImpl.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+public class LongTypeImpl extends PrimitiveTypeImpl implements LongType {
+    LongTypeImpl(VirtualMachine vm) {
+        super(vm);
+    }
+
+
+    public String signature() {
+        return String.valueOf((char)JDWP.Tag.LONG);
+    }
+
+    PrimitiveValue convert(PrimitiveValue value) throws InvalidTypeException {
+        return vm.mirrorOf(((PrimitiveValueImpl)value).checkedLongValue());
+    }
+
+}
diff --git a/src/share/classes/com/sun/tools/jdi/LongValueImpl.java b/src/share/classes/com/sun/tools/jdi/LongValueImpl.java
new file mode 100644
index 0000000..ee64d11
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/LongValueImpl.java
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+public class LongValueImpl extends PrimitiveValueImpl
+                           implements LongValue {
+    private long value;
+
+    LongValueImpl(VirtualMachine aVm,long aValue) {
+        super(aVm);
+
+        value = aValue;
+    }
+
+    public boolean equals(Object obj) {
+        if ((obj != null) && (obj instanceof LongValue)) {
+            return (value == ((LongValue)obj).value()) &&
+                   super.equals(obj);
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        /*
+         * TO DO: Better hash code
+         */
+        return intValue();
+    }
+
+    public int compareTo(LongValue obj) {
+        long other = obj.value();
+        if (value() < other) {
+            return -1;
+        } else if (value() == other) {
+            return 0;
+        } else {
+            return 1;
+        }
+    }
+
+    public Type type() {
+        return vm.theLongType();
+    }
+
+    public long value() {
+        return value;
+    }
+
+    public boolean booleanValue() {
+        return(value == 0)?false:true;
+    }
+
+    public byte byteValue() {
+        return(byte)value;
+    }
+
+    public char charValue() {
+        return(char)value;
+    }
+
+    public short shortValue() {
+        return(short)value;
+    }
+
+    public int intValue() {
+        return(int)value;
+    }
+
+    public long longValue() {
+        return value;
+    }
+
+    public float floatValue() {
+        return(float)value;
+    }
+
+    public double doubleValue() {
+        return(double)value;
+    }
+
+    byte checkedByteValue() throws InvalidTypeException {
+        if ((value > Byte.MAX_VALUE) || (value < Byte.MIN_VALUE)) {
+            throw new InvalidTypeException("Can't convert " + value + " to byte");
+        } else {
+            return super.checkedByteValue();
+        }
+    }
+
+    char checkedCharValue() throws InvalidTypeException {
+        if ((value > Character.MAX_VALUE) || (value < Character.MIN_VALUE)) {
+            throw new InvalidTypeException("Can't convert " + value + " to char");
+        } else {
+            return super.checkedCharValue();
+        }
+    }
+
+    short checkedShortValue() throws InvalidTypeException {
+        if ((value > Short.MAX_VALUE) || (value < Short.MIN_VALUE)) {
+            throw new InvalidTypeException("Can't convert " + value + " to short");
+        } else {
+            return super.checkedShortValue();
+        }
+    }
+
+    int checkedIntValue() throws InvalidTypeException {
+        if ((value > Integer.MAX_VALUE) || (value < Integer.MIN_VALUE)) {
+            throw new InvalidTypeException("Can't convert " + value + " to int");
+        } else {
+            return super.checkedIntValue();
+        }
+    }
+
+    public String toString() {
+        return "" + value;
+    }
+
+    byte typeValueKey() {
+        return JDWP.Tag.LONG;
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/META-INF/services/com.sun.jdi.connect.Connector b/src/share/classes/com/sun/tools/jdi/META-INF/services/com.sun.jdi.connect.Connector
new file mode 100644
index 0000000..e9ecb5e
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/META-INF/services/com.sun.jdi.connect.Connector
@@ -0,0 +1,38 @@
+#
+# Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.  Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+# 
+
+#
+# List all Sun provided connector providers here. If there
+# are providers that are only available on a particular OS
+# then prefix the line with #[OS] and they will automatically
+# uncommented by the build process - see make/jpda/front/Makefile.
+#
+com.sun.tools.jdi.SunCommandLineLauncher
+com.sun.tools.jdi.RawCommandLineLauncher
+com.sun.tools.jdi.SocketAttachingConnector
+com.sun.tools.jdi.SocketListeningConnector
+#[windows]com.sun.tools.jdi.SharedMemoryAttachingConnector
+#[windows]com.sun.tools.jdi.SharedMemoryListeningConnector
+com.sun.tools.jdi.ProcessAttachingConnector
diff --git a/src/share/classes/com/sun/tools/jdi/META-INF/services/com.sun.jdi.connect.spi.TransportService b/src/share/classes/com/sun/tools/jdi/META-INF/services/com.sun.jdi.connect.spi.TransportService
new file mode 100644
index 0000000..603dcc9
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/META-INF/services/com.sun.jdi.connect.spi.TransportService
@@ -0,0 +1,30 @@
+#
+# Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+#
+# This code is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License version 2 only, as
+# published by the Free Software Foundation.  Oracle designates this
+# particular file as subject to the "Classpath" exception as provided
+# by Oracle in the LICENSE file that accompanied this code.
+#
+# This code is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+# version 2 for more details (a copy is included in the LICENSE file that
+# accompanied this code).
+#
+# You should have received a copy of the GNU General Public License version
+# 2 along with this work; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+# or visit www.oracle.com if you need additional information or have any
+# questions.
+# 
+
+#
+# List any additional Sun provided transport services here.
+# If any transport services are OS specific then prefix the line
+# with #[OS] and they will automatically be uncommented in the
+# build process - see make/jpda/front/Makefile.
diff --git a/src/share/classes/com/sun/tools/jdi/MethodImpl.java b/src/share/classes/com/sun/tools/jdi/MethodImpl.java
new file mode 100644
index 0000000..8135aed
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/MethodImpl.java
@@ -0,0 +1,410 @@
+/*
+ * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+import java.util.List;
+import java.util.Iterator;
+import java.util.ArrayList;
+import java.util.Comparator;
+
+public abstract class MethodImpl extends TypeComponentImpl
+    implements Method {
+    private JNITypeParser signatureParser;
+    abstract int argSlotCount() throws AbsentInformationException;
+
+    abstract List<Location> allLineLocations(SDE.Stratum stratum,
+                                   String sourceName)
+                           throws AbsentInformationException;
+
+    abstract List<Location> locationsOfLine(SDE.Stratum stratum,
+                                  String sourceName,
+                                  int lineNumber)
+                           throws AbsentInformationException;
+
+    MethodImpl(VirtualMachine vm, ReferenceTypeImpl declaringType,
+               long ref,
+               String name, String signature,
+               String genericSignature, int modifiers) {
+        super(vm, declaringType, ref, name, signature,
+              genericSignature, modifiers);
+        signatureParser = new JNITypeParser(signature);
+    }
+
+    static MethodImpl createMethodImpl(VirtualMachine vm,
+                                       ReferenceTypeImpl declaringType,
+                                       long ref,
+                                       String name,
+                                       String signature,
+                                       String genericSignature,
+                                       int modifiers) {
+        if ((modifiers &
+             (VMModifiers.NATIVE | VMModifiers.ABSTRACT)) != 0) {
+            return new NonConcreteMethodImpl(vm, declaringType, ref,
+                                             name, signature,
+                                             genericSignature,
+                                             modifiers);
+        } else {
+            return new ConcreteMethodImpl(vm, declaringType, ref,
+                                          name, signature,
+                                          genericSignature,
+                                          modifiers);
+        }
+    }
+
+    public boolean equals(Object obj) {
+        if ((obj != null) && (obj instanceof MethodImpl)) {
+            MethodImpl other = (MethodImpl)obj;
+            return (declaringType().equals(other.declaringType())) &&
+                   (ref() == other.ref()) &&
+                   super.equals(obj);
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        return (int)ref();
+    }
+
+    public final List<Location> allLineLocations()
+                           throws AbsentInformationException {
+        return allLineLocations(vm.getDefaultStratum(), null);
+    }
+
+    public List<Location> allLineLocations(String stratumID,
+                                 String sourceName)
+                           throws AbsentInformationException {
+        return allLineLocations(declaringType.stratum(stratumID),
+                                sourceName);
+    }
+
+    public final List<Location> locationsOfLine(int lineNumber)
+                           throws AbsentInformationException {
+        return locationsOfLine(vm.getDefaultStratum(),
+                               null, lineNumber);
+    }
+
+    public List<Location> locationsOfLine(String stratumID,
+                                String sourceName,
+                                int lineNumber)
+                           throws AbsentInformationException {
+        return locationsOfLine(declaringType.stratum(stratumID),
+                               sourceName, lineNumber);
+    }
+
+    LineInfo codeIndexToLineInfo(SDE.Stratum stratum,
+                                 long codeIndex) {
+        if (stratum.isJava()) {
+            return new BaseLineInfo(-1, declaringType);
+        } else {
+            return new StratumLineInfo(stratum.id(), -1,
+                                       null, null);
+        }
+    }
+
+    /**
+     * @return a text representation of the declared return type
+     * of this method.
+     */
+    public String returnTypeName() {
+        return signatureParser.typeName();
+    }
+
+    private String returnSignature() {
+        return signatureParser.signature();
+    }
+
+    public Type returnType() throws ClassNotLoadedException {
+        return findType(returnSignature());
+    }
+
+    public Type findType(String signature) throws ClassNotLoadedException {
+        ReferenceTypeImpl enclosing = (ReferenceTypeImpl)declaringType();
+        return enclosing.findType(signature);
+    }
+
+    public List<String> argumentTypeNames() {
+        return signatureParser.argumentTypeNames();
+    }
+
+    public List<String> argumentSignatures() {
+        return signatureParser.argumentSignatures();
+    }
+
+    Type argumentType(int index) throws ClassNotLoadedException {
+        ReferenceTypeImpl enclosing = (ReferenceTypeImpl)declaringType();
+        String signature = argumentSignatures().get(index);
+        return enclosing.findType(signature);
+    }
+
+    public List<Type> argumentTypes() throws ClassNotLoadedException {
+        int size = argumentSignatures().size();
+        ArrayList<Type> types = new ArrayList<Type>(size);
+        for (int i = 0; i < size; i++) {
+            Type type = argumentType(i);
+            types.add(type);
+        }
+
+        return types;
+    }
+
+    public int compareTo(Method method) {
+        ReferenceTypeImpl declaringType = (ReferenceTypeImpl)declaringType();
+        int rc = declaringType.compareTo(method.declaringType());
+        if (rc == 0) {
+            rc = declaringType.indexOf(this) -
+                    declaringType.indexOf(method);
+        }
+        return rc;
+    }
+
+    public boolean isAbstract() {
+        return isModifierSet(VMModifiers.ABSTRACT);
+    }
+
+    public boolean isDefault() {
+        return !isModifierSet(VMModifiers.ABSTRACT) &&
+               !isModifierSet(VMModifiers.STATIC) &&
+               !isModifierSet(VMModifiers.PRIVATE) &&
+               declaringType() instanceof InterfaceType;
+    }
+
+    public boolean isSynchronized() {
+        return isModifierSet(VMModifiers.SYNCHRONIZED);
+    }
+
+    public boolean isNative() {
+        return isModifierSet(VMModifiers.NATIVE);
+    }
+
+    public boolean isVarArgs() {
+        return isModifierSet(VMModifiers.VARARGS);
+    }
+
+    public boolean isBridge() {
+        return isModifierSet(VMModifiers.BRIDGE);
+    }
+
+    public boolean isConstructor() {
+        return name().equals("<init>");
+    }
+
+    public boolean isStaticInitializer() {
+        return name().equals("<clinit>");
+    }
+
+    public boolean isObsolete() {
+        try {
+            return JDWP.Method.IsObsolete.process(vm,
+                                    declaringType, ref).isObsolete;
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+    }
+
+
+    /*
+     * A container class for the return value to allow
+     * proper type-checking.
+     */
+    class ReturnContainer implements ValueContainer {
+        ReturnContainer() {
+        }
+        public Type type() throws ClassNotLoadedException {
+            return returnType();
+        }
+        public String typeName(){
+            return returnTypeName();
+        }
+        public String signature() {
+            return returnSignature(); //type().signature();
+        }
+        public Type findType(String signature) throws ClassNotLoadedException {
+            return MethodImpl.this.findType(signature);
+        }
+    }
+    ReturnContainer retValContainer = null;
+    ReturnContainer getReturnValueContainer() {
+        if (retValContainer == null) {
+            retValContainer = new ReturnContainer();
+        }
+        return retValContainer;
+    }
+
+    /*
+     * A container class for the argument to allow
+     * proper type-checking.
+     */
+    class ArgumentContainer implements ValueContainer {
+        int index;
+
+        ArgumentContainer(int index) {
+            this.index = index;
+        }
+        public Type type() throws ClassNotLoadedException {
+            return argumentType(index);
+        }
+        public String typeName(){
+            return argumentTypeNames().get(index);
+        }
+        public String signature() {
+            return argumentSignatures().get(index);
+        }
+        public Type findType(String signature) throws ClassNotLoadedException {
+            return MethodImpl.this.findType(signature);
+        }
+    }
+
+    /*
+     * This is a var args method.  Thus, its last param is an
+     * array. If the method has n params, then:
+     * 1.  If there are n args and the last is the same type as the type of
+     *     the last param, do nothing.  IE, a String[]
+     *     can be passed to a String...
+     * 2.  If there are >= n arguments and for each arg whose number is >= n,
+     *     the arg type is 'compatible' with the component type of
+     *     the last param, then do
+     *     - create an array of the type of the last param
+     *     - put the n, ... args into this array.
+     *       We might have to do conversions here.
+     *     - put this array into arguments(n)
+     *     - delete arguments(n+1), ...
+     * NOTE that this might modify the input list.
+     */
+    void handleVarArgs(List<Value> arguments)
+        throws ClassNotLoadedException, InvalidTypeException {
+        List<Type> paramTypes = this.argumentTypes();
+        ArrayType lastParamType = (ArrayType)paramTypes.get(paramTypes.size() - 1);
+        Type componentType = lastParamType.componentType();
+        int argCount = arguments.size();
+        int paramCount = paramTypes.size();
+        if (argCount < paramCount - 1) {
+            // Error; will be caught later.
+            return;
+        }
+        if (argCount == paramCount - 1) {
+            // It is ok to pass 0 args to the var arg.
+            // We have to gen a 0 length array.
+            ArrayReference argArray = lastParamType.newInstance(0);
+            arguments.add(argArray);
+            return;
+        }
+        Value nthArgValue = arguments.get(paramCount - 1);
+        if (nthArgValue == null && argCount == paramCount) {
+            // We have one varargs parameter and it is null
+            // so we don't have to do anything.
+            return;
+        }
+        // If the first varargs parameter is null, then don't
+        // access its type since it can't be an array.
+        Type nthArgType = (nthArgValue == null) ? null : nthArgValue.type();
+        if (nthArgType instanceof ArrayTypeImpl) {
+            if (argCount == paramCount &&
+                ((ArrayTypeImpl)nthArgType).isAssignableTo(lastParamType)) {
+                /*
+                 * This is case 1.  A compatible array is being passed to the
+                 * var args array param.  We don't have to do anything.
+                 */
+                return;
+            }
+        }
+
+        /*
+         * Case 2.  We have to verify that the n, n+1, ... args are compatible
+         * with componentType, and do conversions if necessary and create
+         * an array of componentType to hold these possibly converted values.
+         */
+        int count = argCount - paramCount + 1;
+        ArrayReference argArray = lastParamType.newInstance(count);
+
+        /*
+         * This will copy arguments(paramCount - 1) ... to argArray(0) ...
+         * doing whatever conversions are needed!  It will throw an
+         * exception if an incompatible arg is encountered
+         */
+        argArray.setValues(0, arguments, paramCount - 1, count);
+        arguments.set(paramCount - 1, argArray);
+
+        /*
+         * Remove the excess args
+         */
+        for (int ii = paramCount; ii < argCount; ii++) {
+            arguments.remove(paramCount);
+        }
+        return;
+    }
+
+    /*
+     * The output list will be different than the input list.
+     */
+    List<Value> validateAndPrepareArgumentsForInvoke(List<? extends Value> origArguments)
+                         throws ClassNotLoadedException, InvalidTypeException {
+
+        List<Value> arguments = new ArrayList<Value>(origArguments);
+        if (isVarArgs()) {
+            handleVarArgs(arguments);
+        }
+
+        int argSize = arguments.size();
+
+        JNITypeParser parser = new JNITypeParser(signature());
+        List<String> signatures = parser.argumentSignatures();
+
+        if (signatures.size() != argSize) {
+            throw new IllegalArgumentException("Invalid argument count: expected " +
+                                               signatures.size() + ", received " +
+                                               arguments.size());
+        }
+
+        for (int i = 0; i < argSize; i++) {
+            Value value = arguments.get(i);
+            value = ValueImpl.prepareForAssignment(value,
+                                                   new ArgumentContainer(i));
+            arguments.set(i, value);
+        }
+        return arguments;
+    }
+
+    public String toString() {
+        StringBuffer sb = new StringBuffer();
+        sb.append(declaringType().name());
+        sb.append(".");
+        sb.append(name());
+        sb.append("(");
+        boolean first = true;
+        for (String name : argumentTypeNames()) {
+            if (!first) {
+                sb.append(", ");
+            }
+            sb.append(name);
+            first = false;
+        }
+        sb.append(")");
+        return sb.toString();
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/MirrorImpl.java b/src/share/classes/com/sun/tools/jdi/MirrorImpl.java
new file mode 100644
index 0000000..554cb06
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/MirrorImpl.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+import java.util.Collection;
+import java.util.Iterator;
+
+abstract class MirrorImpl extends Object implements Mirror {
+
+    protected VirtualMachineImpl vm;
+
+    MirrorImpl(VirtualMachine aVm) {
+        super();
+
+        // Yes, its a bit of a hack. But by doing it this
+        // way, this is the only place we have to change
+        // typing to substitute a new impl.
+        vm = (VirtualMachineImpl)aVm;
+    }
+
+    public VirtualMachine virtualMachine() {
+        return vm;
+    }
+
+    public boolean equals(Object obj) {
+        if ((obj != null) && (obj instanceof Mirror)) {
+            Mirror other = (Mirror)obj;
+            return vm.equals(other.virtualMachine());
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        return vm.hashCode();
+    }
+
+    /**
+     * Throw NullPointerException on null mirror.
+     * Throw VMMismatchException on wrong VM.
+     */
+    void validateMirror(Mirror mirror) {
+        if (!vm.equals(mirror.virtualMachine())) {
+            throw new VMMismatchException(mirror.toString());
+        }
+    }
+
+    /**
+     * Allow null mirror.
+     * Throw VMMismatchException on wrong VM.
+     */
+    void validateMirrorOrNull(Mirror mirror) {
+        if ((mirror != null) && !vm.equals(mirror.virtualMachine())) {
+            throw new VMMismatchException(mirror.toString());
+        }
+    }
+
+    /**
+     * Throw NullPointerException on null mirrors.
+     * Throw VMMismatchException on wrong VM.
+     */
+    void validateMirrors(Collection<? extends Mirror> mirrors) {
+        Iterator<? extends Mirror> iter = mirrors.iterator();
+        while (iter.hasNext()) {
+            MirrorImpl mirror = (MirrorImpl)iter.next();
+            if (!vm.equals(mirror.vm)) {
+                throw new VMMismatchException(mirror.toString());
+            }
+        }
+    }
+    /**
+     * Allow null mirrors.
+     * Throw VMMismatchException on wrong VM.
+     */
+    void validateMirrorsOrNulls(Collection<? extends Mirror> mirrors) {
+        Iterator<? extends Mirror> iter = mirrors.iterator();
+        while (iter.hasNext()) {
+            MirrorImpl mirror = (MirrorImpl)iter.next();
+            if ((mirror != null) && !vm.equals(mirror.vm)) {
+                throw new VMMismatchException(mirror.toString());
+            }
+        }
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/MonitorInfoImpl.java b/src/share/classes/com/sun/tools/jdi/MonitorInfoImpl.java
new file mode 100644
index 0000000..9ebc059
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/MonitorInfoImpl.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+public class MonitorInfoImpl extends MirrorImpl
+    implements MonitorInfo, ThreadListener {
+
+    /* Once false, monitorInfo should not be used.
+     * access synchronized on (vm.state())
+     */
+    private boolean isValid = true;
+
+    ObjectReference monitor;
+    ThreadReference thread;
+    int  stack_depth;
+
+    MonitorInfoImpl(VirtualMachine vm, ObjectReference mon,
+                    ThreadReferenceImpl thread, int dpth) {
+        super(vm);
+        this.monitor = mon;
+        this.thread = thread;
+        this.stack_depth = dpth;
+        thread.addListener(this);
+    }
+
+
+    /*
+     * ThreadListener implementation
+     * Must be synchronized since we must protect against
+     * sending defunct (isValid == false) stack ids to the back-end.
+     */
+    public boolean threadResumable(ThreadAction action) {
+        synchronized (vm.state()) {
+            if (isValid) {
+                isValid = false;
+                return false;   /* remove this stack frame as a listener */
+            } else {
+                throw new InternalException(
+                                  "Invalid stack frame thread listener");
+            }
+        }
+    }
+
+    private void validateMonitorInfo() {
+        if (!isValid) {
+            throw new InvalidStackFrameException("Thread has been resumed");
+        }
+    }
+
+    public ObjectReference monitor() {
+        validateMonitorInfo();
+        return monitor;
+    }
+
+    public int stackDepth() {
+        validateMonitorInfo();
+        return stack_depth;
+    }
+
+    public ThreadReference thread() {
+        validateMonitorInfo();
+        return thread;
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/NonConcreteMethodImpl.java b/src/share/classes/com/sun/tools/jdi/NonConcreteMethodImpl.java
new file mode 100644
index 0000000..9fc7ddd
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/NonConcreteMethodImpl.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Iterator;
+import java.util.ListIterator;
+import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.Collections;
+
+/**
+ * Represents non-concrete (that is, native or abstract) methods.
+ * Private to MethodImpl.
+ */
+public class NonConcreteMethodImpl extends MethodImpl {
+
+    private Location location = null;
+
+    NonConcreteMethodImpl(VirtualMachine vm,
+                          ReferenceTypeImpl declaringType,
+                          long ref,
+                          String name, String signature,
+                          String genericSignature, int modifiers) {
+
+        // The generic signature is set when this is created
+        super(vm, declaringType, ref, name, signature,
+              genericSignature, modifiers);
+    }
+
+    public Location location() {
+        if (isAbstract()) {
+            return null;
+        }
+        if (location == null) {
+            location = new LocationImpl(vm, this, -1);
+        }
+        return location;
+    }
+
+    public List<Location> allLineLocations(String stratumID,
+                                 String sourceName) {
+        return new ArrayList<Location>(0);
+    }
+
+    public List<Location> allLineLocations(SDE.Stratum stratum,
+                                 String sourceName) {
+        return new ArrayList<Location>(0);
+    }
+
+    public List<Location> locationsOfLine(String stratumID,
+                                String sourceName,
+                                int lineNumber) {
+        return new ArrayList<Location>(0);
+    }
+
+    public List<Location> locationsOfLine(SDE.Stratum stratum,
+                                String sourceName,
+                                int lineNumber) {
+        return new ArrayList<Location>(0);
+    }
+
+    public Location locationOfCodeIndex(long codeIndex) {
+        return null;
+    }
+
+    public List<LocalVariable> variables() throws AbsentInformationException {
+        throw new AbsentInformationException();
+    }
+
+    public List<LocalVariable> variablesByName(String name) throws AbsentInformationException {
+        throw new AbsentInformationException();
+    }
+
+    public List<LocalVariable> arguments() throws AbsentInformationException {
+        throw new AbsentInformationException();
+    }
+
+    public byte[] bytecodes() {
+        return new byte[0];
+    }
+
+    int argSlotCount() throws AbsentInformationException {
+        throw new InternalException("should not get here");
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/ObjectReferenceImpl.java b/src/share/classes/com/sun/tools/jdi/ObjectReferenceImpl.java
new file mode 100644
index 0000000..f457337
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/ObjectReferenceImpl.java
@@ -0,0 +1,631 @@
+/*
+ * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+import java.util.*;
+import java.util.ArrayList;
+
+public class ObjectReferenceImpl extends ValueImpl
+             implements ObjectReference, VMListener {
+
+    protected long ref;
+    private ReferenceType type = null;
+    private int gcDisableCount = 0;
+    boolean addedListener = false;
+
+    // This is cached only while the VM is suspended
+    protected static class Cache {
+        JDWP.ObjectReference.MonitorInfo monitorInfo = null;
+    }
+
+    private static final Cache noInitCache = new Cache();
+    private static final Cache markerCache = new Cache();
+    private Cache cache = noInitCache;
+
+    private void disableCache() {
+        synchronized (vm.state()) {
+            cache = null;
+        }
+    }
+
+    private void enableCache() {
+        synchronized (vm.state()) {
+            cache = markerCache;
+        }
+    }
+
+    // Override in subclasses
+    protected Cache newCache() {
+        return new Cache();
+    }
+
+    protected Cache getCache() {
+        synchronized (vm.state()) {
+            if (cache == noInitCache) {
+                if (vm.state().isSuspended()) {
+                    // Set cache now, otherwise newly created objects are
+                    // not cached until resuspend
+                    enableCache();
+                } else {
+                    disableCache();
+                }
+            }
+            if (cache == markerCache) {
+                cache = newCache();
+            }
+            return cache;
+        }
+    }
+
+    // Return the ClassTypeImpl upon which to invoke a method.
+    // By default it is our very own referenceType() but subclasses
+    // can override.
+    protected ClassTypeImpl invokableReferenceType(Method method) {
+        return (ClassTypeImpl)referenceType();
+    }
+
+    ObjectReferenceImpl(VirtualMachine aVm,long aRef) {
+        super(aVm);
+
+        ref = aRef;
+    }
+
+    protected String description() {
+        return "ObjectReference " + uniqueID();
+    }
+
+    /*
+     * VMListener implementation
+     */
+    public boolean vmSuspended(VMAction action) {
+        enableCache();
+        return true;
+    }
+
+    public boolean vmNotSuspended(VMAction action) {
+        // make sure that cache and listener management are synchronized
+        synchronized (vm.state()) {
+            if (cache != null && (vm.traceFlags & VirtualMachine.TRACE_OBJREFS) != 0) {
+                vm.printTrace("Clearing temporary cache for " + description());
+            }
+            disableCache();
+            if (addedListener) {
+                /*
+                 * If a listener was added (i.e. this is not a
+                 * ObjectReference that adds a listener on startup),
+                 * remove it here.
+                 */
+                addedListener = false;
+                return false;  // false says remove
+            } else {
+                return true;
+            }
+        }
+    }
+
+    public boolean equals(Object obj) {
+        if ((obj != null) && (obj instanceof ObjectReferenceImpl)) {
+            ObjectReferenceImpl other = (ObjectReferenceImpl)obj;
+            return (ref() == other.ref()) &&
+                   super.equals(obj);
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        return(int)ref();
+    }
+
+    public Type type() {
+        return referenceType();
+    }
+
+    public ReferenceType referenceType() {
+        if (type == null) {
+            try {
+                JDWP.ObjectReference.ReferenceType rtinfo =
+                    JDWP.ObjectReference.ReferenceType.process(vm, this);
+                type = vm.referenceType(rtinfo.typeID,
+                                        rtinfo.refTypeTag);
+            } catch (JDWPException exc) {
+                throw exc.toJDIException();
+            }
+        }
+        return type;
+    }
+
+    public Value getValue(Field sig) {
+        List<Field> list = new ArrayList<Field>(1);
+        list.add(sig);
+        Map<Field, Value> map = getValues(list);
+        return map.get(sig);
+    }
+
+    public Map<Field,Value> getValues(List<? extends Field> theFields) {
+        validateMirrors(theFields);
+
+        List<Field> staticFields = new ArrayList<Field>(0);
+        int size = theFields.size();
+        List<Field> instanceFields = new ArrayList<Field>(size);
+
+        for (int i=0; i<size; i++) {
+            Field field = (Field)theFields.get(i);
+
+            // Make sure the field is valid
+            ((ReferenceTypeImpl)referenceType()).validateFieldAccess(field);
+
+            // FIX ME! We need to do some sanity checking
+            // here; make sure the field belongs to this
+            // object.
+            if (field.isStatic())
+                staticFields.add(field);
+            else {
+                instanceFields.add(field);
+            }
+        }
+
+        Map<Field, Value> map;
+        if (staticFields.size() > 0) {
+            map = referenceType().getValues(staticFields);
+        } else {
+            map = new HashMap<Field, Value>(size);
+        }
+
+        size = instanceFields.size();
+
+        JDWP.ObjectReference.GetValues.Field[] queryFields =
+                         new JDWP.ObjectReference.GetValues.Field[size];
+        for (int i=0; i<size; i++) {
+            FieldImpl field = (FieldImpl)instanceFields.get(i);/* thanks OTI */
+            queryFields[i] = new JDWP.ObjectReference.GetValues.Field(
+                                         field.ref());
+        }
+        ValueImpl[] values;
+        try {
+            values = JDWP.ObjectReference.GetValues.
+                                     process(vm, this, queryFields).values;
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+
+        if (size != values.length) {
+            throw new InternalException(
+                         "Wrong number of values returned from target VM");
+        }
+        for (int i=0; i<size; i++) {
+            FieldImpl field = (FieldImpl)instanceFields.get(i);
+            map.put(field, values[i]);
+        }
+
+        return map;
+    }
+
+    public void setValue(Field field, Value value)
+                   throws InvalidTypeException, ClassNotLoadedException {
+
+        validateMirror(field);
+        validateMirrorOrNull(value);
+
+        // Make sure the field is valid
+        ((ReferenceTypeImpl)referenceType()).validateFieldSet(field);
+
+        if (field.isStatic()) {
+            ReferenceType type = referenceType();
+            if (type instanceof ClassType) {
+                ((ClassType)type).setValue(field, value);
+                return;
+            } else {
+                throw new IllegalArgumentException(
+                                    "Invalid type for static field set");
+            }
+        }
+
+        try {
+            JDWP.ObjectReference.SetValues.FieldValue[] fvals =
+                      new JDWP.ObjectReference.SetValues.FieldValue[1];
+            fvals[0] = new JDWP.ObjectReference.SetValues.FieldValue(
+                           ((FieldImpl)field).ref(),
+                           // Validate and convert if necessary
+                           ValueImpl.prepareForAssignment(value,
+                                                          (FieldImpl)field));
+            try {
+                JDWP.ObjectReference.SetValues.process(vm, this, fvals);
+            } catch (JDWPException exc) {
+                throw exc.toJDIException();
+            }
+        } catch (ClassNotLoadedException e) {
+            /*
+             * Since we got this exception,
+             * the field type must be a reference type. The value
+             * we're trying to set is null, but if the field's
+             * class has not yet been loaded through the enclosing
+             * class loader, then setting to null is essentially a
+             * no-op, and we should allow it without an exception.
+             */
+            if (value != null) {
+                throw e;
+            }
+        }
+    }
+
+    void validateMethodInvocation(Method method, int options)
+                                         throws InvalidTypeException,
+                                         InvocationException {
+        /*
+         * Method must be in this object's class, a superclass, or
+         * implemented interface
+         */
+        ReferenceTypeImpl declType = (ReferenceTypeImpl)method.declaringType();
+        if (!declType.isAssignableFrom(this)) {
+            throw new IllegalArgumentException("Invalid method");
+        }
+
+        if (declType instanceof ClassTypeImpl) {
+            validateClassMethodInvocation(method, options);
+        } else if (declType instanceof InterfaceTypeImpl) {
+            validateIfaceMethodInvocation(method, options);
+        } else {
+            throw new InvalidTypeException();
+        }
+    }
+
+    void validateClassMethodInvocation(Method method, int options)
+                                         throws InvalidTypeException,
+                                         InvocationException {
+
+        ClassTypeImpl clazz = invokableReferenceType(method);
+
+        /*
+         * Method must be a non-constructor
+         */
+        if (method.isConstructor()) {
+            throw new IllegalArgumentException("Cannot invoke constructor");
+        }
+
+        /*
+         * For nonvirtual invokes, method must have a body
+         */
+        if (isNonVirtual(options)) {
+            if (method.isAbstract()) {
+                throw new IllegalArgumentException("Abstract method");
+            }
+        }
+
+        /*
+         * Get the class containing the method that will be invoked.
+         * This class is needed only for proper validation of the
+         * method argument types.
+         */
+        ClassTypeImpl invokedClass;
+        if (isNonVirtual(options)) {
+            // No overrides in non-virtual invokes
+            invokedClass = clazz;
+        } else {
+            /*
+             * For virtual invokes, find any override of the method.
+             * Since we are looking for a method with a real body, we
+             * don't need to bother with interfaces/abstract methods.
+             */
+            Method invoker = clazz.concreteMethodByName(method.name(),
+                                                        method.signature());
+            //  invoker is supposed to be non-null under normal circumstances
+            invokedClass = (ClassTypeImpl)invoker.declaringType();
+        }
+        /* The above code is left over from previous versions.
+         * We haven't had time to divine the intent.  jjh, 7/31/2003
+         */
+    }
+
+    void validateIfaceMethodInvocation(Method method, int options)
+                                         throws InvalidTypeException,
+                                         InvocationException {
+        /*
+         * Only default methods allowed for nonvirtual invokes
+         */
+        if (isNonVirtual(options) && !method.isDefault()) {
+            throw new IllegalArgumentException("Not a default method");
+        }
+    }
+
+    PacketStream sendInvokeCommand(final ThreadReferenceImpl thread,
+                                   final ClassTypeImpl refType,
+                                   final MethodImpl method,
+                                   final ValueImpl[] args,
+                                   final int options) {
+        CommandSender sender =
+            new CommandSender() {
+                public PacketStream send() {
+                    return JDWP.ObjectReference.InvokeMethod.enqueueCommand(
+                                          vm, ObjectReferenceImpl.this,
+                                          thread, refType,
+                                          method.ref(), args, options);
+                }
+        };
+
+        PacketStream stream;
+        if ((options & INVOKE_SINGLE_THREADED) != 0) {
+            stream = thread.sendResumingCommand(sender);
+        } else {
+            stream = vm.sendResumingCommand(sender);
+        }
+        return stream;
+    }
+
+    public Value invokeMethod(ThreadReference threadIntf, Method methodIntf,
+                              List<? extends Value> origArguments, int options)
+                              throws InvalidTypeException,
+                                     IncompatibleThreadStateException,
+                                     InvocationException,
+                                     ClassNotLoadedException {
+        validateMirror(threadIntf);
+        validateMirror(methodIntf);
+        validateMirrorsOrNulls(origArguments);
+
+        MethodImpl method = (MethodImpl)methodIntf;
+        ThreadReferenceImpl thread = (ThreadReferenceImpl)threadIntf;
+
+        if (method.isStatic()) {
+            if (referenceType() instanceof InterfaceType) {
+                InterfaceType type = (InterfaceType)referenceType();
+                return type.invokeMethod(thread, method, origArguments, options);
+            } else if (referenceType() instanceof ClassType) {
+                ClassType type = (ClassType)referenceType();
+                return type.invokeMethod(thread, method, origArguments, options);
+            } else {
+                throw new IllegalArgumentException("Invalid type for static method invocation");
+            }
+        }
+
+        validateMethodInvocation(method, options);
+
+        List<Value> arguments = method.validateAndPrepareArgumentsForInvoke(
+                                                  origArguments);
+
+        ValueImpl[] args = arguments.toArray(new ValueImpl[0]);
+        JDWP.ObjectReference.InvokeMethod ret;
+        try {
+            PacketStream stream =
+                sendInvokeCommand(thread, invokableReferenceType(method),
+                                  method, args, options);
+            ret = JDWP.ObjectReference.InvokeMethod.waitForReply(vm, stream);
+        } catch (JDWPException exc) {
+            if (exc.errorCode() == JDWP.Error.INVALID_THREAD) {
+                throw new IncompatibleThreadStateException();
+            } else {
+                throw exc.toJDIException();
+            }
+        }
+
+        /*
+         * There is an implict VM-wide suspend at the conclusion
+         * of a normal (non-single-threaded) method invoke
+         */
+        if ((options & INVOKE_SINGLE_THREADED) == 0) {
+            vm.notifySuspend();
+        }
+
+        if (ret.exception != null) {
+            throw new InvocationException(ret.exception);
+        } else {
+            return ret.returnValue;
+        }
+    }
+
+    /* leave synchronized to keep count accurate */
+    public synchronized void disableCollection() {
+        if (gcDisableCount == 0) {
+            try {
+                JDWP.ObjectReference.DisableCollection.process(vm, this);
+            } catch (JDWPException exc) {
+                throw exc.toJDIException();
+            }
+        }
+        gcDisableCount++;
+    }
+
+    /* leave synchronized to keep count accurate */
+    public synchronized void enableCollection() {
+        gcDisableCount--;
+
+        if (gcDisableCount == 0) {
+            try {
+                JDWP.ObjectReference.EnableCollection.process(vm, this);
+            } catch (JDWPException exc) {
+                // If already collected, no harm done, no exception
+                if (exc.errorCode() != JDWP.Error.INVALID_OBJECT) {
+                    throw exc.toJDIException();
+                }
+                return;
+            }
+        }
+    }
+
+    public boolean isCollected() {
+        try {
+            return JDWP.ObjectReference.IsCollected.process(vm, this).
+                                                              isCollected;
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+    }
+
+    public long uniqueID() {
+        return ref();
+    }
+
+    JDWP.ObjectReference.MonitorInfo jdwpMonitorInfo()
+                             throws IncompatibleThreadStateException {
+        JDWP.ObjectReference.MonitorInfo info = null;
+        try {
+            Cache local;
+
+            // getCache() and addlistener() must be synchronized
+            // so that no events are lost.
+            synchronized (vm.state()) {
+                local = getCache();
+
+                if (local != null) {
+                    info = local.monitorInfo;
+
+                    // Check if there will be something to cache
+                    // and there is not already a listener
+                    if (info == null && !vm.state().hasListener(this)) {
+                        /* For other, less numerous objects, this is done
+                         * in the constructor. Since there can be many
+                         * ObjectReferences, the VM listener is installed
+                         * and removed as needed.
+                         * Listener must be installed before process()
+                         */
+                        vm.state().addListener(this);
+                        addedListener = true;
+                    }
+                }
+            }
+            if (info == null) {
+                info = JDWP.ObjectReference.MonitorInfo.process(vm, this);
+                if (local != null) {
+                    local.monitorInfo = info;
+                    if ((vm.traceFlags & VirtualMachine.TRACE_OBJREFS) != 0) {
+                        vm.printTrace("ObjectReference " + uniqueID() +
+                                      " temporarily caching monitor info");
+                    }
+                }
+            }
+        } catch (JDWPException exc) {
+             if (exc.errorCode() == JDWP.Error.THREAD_NOT_SUSPENDED) {
+                 throw new IncompatibleThreadStateException();
+             } else {
+                 throw exc.toJDIException();
+             }
+         }
+        return info;
+    }
+
+    public List<ThreadReference> waitingThreads() throws IncompatibleThreadStateException {
+        return Arrays.asList((ThreadReference[])jdwpMonitorInfo().waiters);
+    }
+
+    public ThreadReference owningThread() throws IncompatibleThreadStateException {
+        return jdwpMonitorInfo().owner;
+    }
+
+    public int entryCount() throws IncompatibleThreadStateException {
+        return jdwpMonitorInfo().entryCount;
+    }
+
+
+    public List<ObjectReference> referringObjects(long maxReferrers) {
+        if (!vm.canGetInstanceInfo()) {
+            throw new UnsupportedOperationException(
+                "target does not support getting referring objects");
+        }
+
+        if (maxReferrers < 0) {
+            throw new IllegalArgumentException("maxReferrers is less than zero: "
+                                              + maxReferrers);
+        }
+
+        int intMax = (maxReferrers > Integer.MAX_VALUE)?
+            Integer.MAX_VALUE: (int)maxReferrers;
+        // JDWP can't currently handle more than this (in mustang)
+
+        try {
+            return Arrays.asList((ObjectReference[])JDWP.ObjectReference.ReferringObjects.
+                                process(vm, this, intMax).referringObjects);
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+    }
+
+    long ref() {
+        return ref;
+    }
+
+    boolean isClassObject() {
+        /*
+         * Don't need to worry about subclasses since java.lang.Class is final.
+         */
+        return referenceType().name().equals("java.lang.Class");
+    }
+
+    ValueImpl prepareForAssignmentTo(ValueContainer destination)
+                                 throws InvalidTypeException,
+                                        ClassNotLoadedException {
+
+        validateAssignment(destination);
+        return this;            // conversion never necessary
+    }
+
+    void validateAssignment(ValueContainer destination)
+                            throws InvalidTypeException, ClassNotLoadedException {
+
+        /*
+         * Do these simpler checks before attempting a query of the destination's
+         * type which might cause a confusing ClassNotLoadedException if
+         * the destination is primitive or an array.
+         */
+        /*
+         * TO DO: Centralize JNI signature knowledge
+         */
+        if (destination.signature().length() == 1) {
+            throw new InvalidTypeException("Can't assign object value to primitive");
+        }
+        if ((destination.signature().charAt(0) == '[') &&
+            (type().signature().charAt(0) != '[')) {
+            throw new InvalidTypeException("Can't assign non-array value to an array");
+        }
+        if ("void".equals(destination.typeName())) {
+            throw new InvalidTypeException("Can't assign object value to a void");
+        }
+
+        // Validate assignment
+        ReferenceType destType = (ReferenceTypeImpl)destination.type();
+        ReferenceTypeImpl myType = (ReferenceTypeImpl)referenceType();
+        if (!myType.isAssignableTo(destType)) {
+            JNITypeParser parser = new JNITypeParser(destType.signature());
+            String destTypeName = parser.typeName();
+            throw new InvalidTypeException("Can't assign " +
+                                           type().name() +
+                                           " to " + destTypeName);
+        }
+    }
+
+
+    public String toString() {
+        return "instance of " + referenceType().name() + "(id=" + uniqueID() + ")";
+    }
+
+    byte typeValueKey() {
+        return JDWP.Tag.OBJECT;
+    }
+
+    private static boolean isNonVirtual(int options) {
+        return (options & INVOKE_NONVIRTUAL) != 0;
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/ObsoleteMethodImpl.java b/src/share/classes/com/sun/tools/jdi/ObsoleteMethodImpl.java
new file mode 100644
index 0000000..d7113e9
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/ObsoleteMethodImpl.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * Represents methods which have changed when the class was redefined.
+ */
+public class ObsoleteMethodImpl extends NonConcreteMethodImpl {
+
+    private Location location = null;
+
+    ObsoleteMethodImpl(VirtualMachine vm,
+                          ReferenceTypeImpl declaringType) {
+        super(vm, declaringType, 0, "<obsolete>", "", null, 0);
+    }
+
+    public boolean isObsolete() {
+        return true;
+    }
+
+    public String returnTypeName() {
+        return "<unknown>";
+    }
+
+    public Type returnType() throws ClassNotLoadedException {
+        throw new ClassNotLoadedException("type unknown");
+    }
+
+    public List<String> argumentTypeNames() {
+        return new ArrayList<String>();
+    }
+
+    public List<String> argumentSignatures() {
+        return new ArrayList<String>();
+    }
+
+    Type argumentType(int index) throws ClassNotLoadedException {
+        throw new ClassNotLoadedException("type unknown");
+    }
+
+    public List<Type> argumentTypes() throws ClassNotLoadedException {
+        return new ArrayList<Type>();
+    }
+
+}
diff --git a/src/share/classes/com/sun/tools/jdi/Packet.java b/src/share/classes/com/sun/tools/jdi/Packet.java
new file mode 100644
index 0000000..18f0392
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/Packet.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+import java.io.IOException;
+
+public class Packet extends Object {
+    public final static short NoFlags = 0x0;
+    public final static short Reply = 0x80;
+    public final static short ReplyNoError = 0x0;
+
+    static int uID = 1;
+    final static byte[] nullData = new byte[0];
+
+    // Note! flags, cmdSet, and cmd are all byte values.
+    // We represent them as shorts to make them easier
+    // to work with.
+    int id;
+    short flags;
+    short cmdSet;
+    short cmd;
+    short errorCode;
+    byte[] data;
+    volatile boolean replied = false;
+
+    /**
+     * Return byte representation of the packet
+     */
+    public byte[] toByteArray() {
+        int len = data.length + 11;
+        byte b[] = new byte[len];
+        b[0] = (byte)((len >>> 24) & 0xff);
+        b[1] = (byte)((len >>> 16) & 0xff);
+        b[2] = (byte)((len >>>  8) & 0xff);
+        b[3] = (byte)((len >>>  0) & 0xff);
+        b[4] = (byte)((id >>> 24) & 0xff);
+        b[5] = (byte)((id >>> 16) & 0xff);
+        b[6] = (byte)((id >>>  8) & 0xff);
+        b[7] = (byte)((id >>>  0) & 0xff);
+        b[8] = (byte)flags;
+        if ((flags & Packet.Reply) == 0) {
+            b[9] = (byte)cmdSet;
+            b[10] = (byte)cmd;
+        } else {
+            b[9] = (byte)((errorCode >>>  8) & 0xff);
+            b[10] = (byte)((errorCode >>>  0) & 0xff);
+        }
+        if (data.length > 0) {
+            System.arraycopy(data, 0, b, 11, data.length);
+        }
+        return b;
+    }
+
+    /**
+     * Create a packet from its byte array representation
+     */
+    public static Packet fromByteArray(byte b[]) throws IOException {
+        if (b.length < 11) {
+            throw new IOException("packet is insufficient size");
+        }
+
+        int b0 = b[0] & 0xff;
+        int b1 = b[1] & 0xff;
+        int b2 = b[2] & 0xff;
+        int b3 = b[3] & 0xff;
+        int len = ((b0 << 24) | (b1 << 16) | (b2 << 8) | (b3 << 0));
+        if (len != b.length) {
+            throw new IOException("length size mis-match");
+        }
+
+        int b4 = b[4] & 0xff;
+        int b5 = b[5] & 0xff;
+        int b6 = b[6] & 0xff;
+        int b7 = b[7] & 0xff;
+
+        Packet p = new Packet();
+        p.id = ((b4 << 24) | (b5 << 16) | (b6 << 8) | (b7 << 0));
+
+        p.flags = (short)(b[8] & 0xff);
+
+        if ((p.flags & Packet.Reply) == 0) {
+            p.cmdSet = (short)(b[9] & 0xff);
+            p.cmd = (short)(b[10] & 0xff);
+        } else {
+            short b9 = (short)(b[9] & 0xff);
+            short b10 = (short)(b[10] & 0xff);
+            p.errorCode = (short)((b9 << 8) + (b10 << 0));
+        }
+
+        p.data = new byte[b.length - 11];
+        System.arraycopy(b, 11, p.data, 0, p.data.length);
+        return p;
+    }
+
+    Packet()
+    {
+        id = uniqID();
+        flags = NoFlags;
+        data = nullData;
+    }
+
+    static synchronized private int uniqID()
+    {
+        /*
+         * JDWP spec does not require this id to be sequential and
+         * increasing, but our implementation does. See
+         * VirtualMachine.notifySuspend, for example.
+         */
+        return uID++;
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/PacketStream.java b/src/share/classes/com/sun/tools/jdi/PacketStream.java
new file mode 100644
index 0000000..a0cd2f3
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/PacketStream.java
@@ -0,0 +1,628 @@
+/*
+ * Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+import java.util.*;
+import java.io.ByteArrayOutputStream;
+
+class PacketStream {
+    final VirtualMachineImpl vm;
+    private int inCursor = 0;
+    final Packet pkt;
+    private ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
+    private boolean isCommitted = false;
+
+    PacketStream(VirtualMachineImpl vm, int cmdSet, int cmd) {
+        this.vm = vm;
+        this.pkt = new Packet();
+        pkt.cmdSet = (short)cmdSet;
+        pkt.cmd = (short)cmd;
+    }
+
+    PacketStream(VirtualMachineImpl vm, Packet pkt) {
+        this.vm = vm;
+        this.pkt = pkt;
+        this.isCommitted = true; /* read only stream */
+    }
+
+    int id() {
+        return pkt.id;
+    }
+
+    void send() {
+        if (!isCommitted) {
+            pkt.data = dataStream.toByteArray();
+            vm.sendToTarget(pkt);
+            isCommitted = true;
+        }
+    }
+
+    void waitForReply() throws JDWPException {
+        if (!isCommitted) {
+            throw new InternalException("waitForReply without send");
+        }
+
+        vm.waitForTargetReply(pkt);
+
+        if (pkt.errorCode != Packet.ReplyNoError) {
+            throw new JDWPException(pkt.errorCode);
+        }
+    }
+
+    void writeBoolean(boolean data) {
+        if(data) {
+            dataStream.write( 1 );
+        } else {
+            dataStream.write( 0 );
+        }
+    }
+
+    void writeByte(byte data) {
+        dataStream.write( data );
+    }
+
+    void writeChar(char data) {
+        dataStream.write( (byte)((data >>> 8) & 0xFF) );
+        dataStream.write( (byte)((data >>> 0) & 0xFF) );
+    }
+
+    void writeShort(short data) {
+        dataStream.write( (byte)((data >>> 8) & 0xFF) );
+        dataStream.write( (byte)((data >>> 0) & 0xFF) );
+    }
+
+    void writeInt(int data) {
+        dataStream.write( (byte)((data >>> 24) & 0xFF) );
+        dataStream.write( (byte)((data >>> 16) & 0xFF) );
+        dataStream.write( (byte)((data >>> 8) & 0xFF) );
+        dataStream.write( (byte)((data >>> 0) & 0xFF) );
+    }
+
+    void writeLong(long data) {
+        dataStream.write( (byte)((data >>> 56) & 0xFF) );
+        dataStream.write( (byte)((data >>> 48) & 0xFF) );
+        dataStream.write( (byte)((data >>> 40) & 0xFF) );
+        dataStream.write( (byte)((data >>> 32) & 0xFF) );
+
+        dataStream.write( (byte)((data >>> 24) & 0xFF) );
+        dataStream.write( (byte)((data >>> 16) & 0xFF) );
+        dataStream.write( (byte)((data >>> 8) & 0xFF) );
+        dataStream.write( (byte)((data >>> 0) & 0xFF) );
+    }
+
+    void writeFloat(float data) {
+        writeInt(Float.floatToIntBits(data));
+    }
+
+    void writeDouble(double data) {
+        writeLong(Double.doubleToLongBits(data));
+    }
+
+    void writeID(int size, long data) {
+        switch (size) {
+            case 8:
+                writeLong(data);
+                break;
+            case 4:
+                writeInt((int)data);
+                break;
+            case 2:
+                writeShort((short)data);
+                break;
+            default:
+                throw new UnsupportedOperationException("JDWP: ID size not supported: " + size);
+        }
+    }
+
+    void writeNullObjectRef() {
+        writeObjectRef(0);
+    }
+
+    void writeObjectRef(long data) {
+        writeID(vm.sizeofObjectRef, data);
+    }
+
+    void writeClassRef(long data) {
+        writeID(vm.sizeofClassRef, data);
+    }
+
+    void writeMethodRef(long data) {
+        writeID(vm.sizeofMethodRef, data);
+    }
+
+    void writeFieldRef(long data) {
+        writeID(vm.sizeofFieldRef, data);
+    }
+
+    void writeFrameRef(long data) {
+        writeID(vm.sizeofFrameRef, data);
+    }
+
+    void writeByteArray(byte[] data) {
+        dataStream.write(data, 0, data.length);
+    }
+
+    void writeString(String string) {
+        try {
+            byte[] stringBytes = string.getBytes("UTF8");
+            writeInt(stringBytes.length);
+            writeByteArray(stringBytes);
+        } catch (java.io.UnsupportedEncodingException e) {
+            throw new InternalException("Cannot convert string to UTF8 bytes");
+        }
+    }
+
+    void writeLocation(Location location) {
+        ReferenceTypeImpl refType = (ReferenceTypeImpl)location.declaringType();
+        byte tag;
+        if (refType instanceof ClassType) {
+            tag = JDWP.TypeTag.CLASS;
+        } else if (refType instanceof InterfaceType) {
+            // It's possible to have executable code in an interface
+            tag = JDWP.TypeTag.INTERFACE;
+        } else {
+            throw new InternalException("Invalid Location");
+        }
+        writeByte(tag);
+        writeClassRef(refType.ref());
+        writeMethodRef(((MethodImpl)location.method()).ref());
+        writeLong(location.codeIndex());
+    }
+
+    void writeValue(Value val) {
+        try {
+            writeValueChecked(val);
+        } catch (InvalidTypeException exc) {  // should never happen
+            throw new RuntimeException(
+                "Internal error: Invalid Tag/Type pair");
+        }
+    }
+
+    void writeValueChecked(Value val) throws InvalidTypeException {
+        writeByte(ValueImpl.typeValueKey(val));
+        writeUntaggedValue(val);
+    }
+
+    void writeUntaggedValue(Value val) {
+        try {
+            writeUntaggedValueChecked(val);
+        } catch (InvalidTypeException exc) {  // should never happen
+            throw new RuntimeException(
+                "Internal error: Invalid Tag/Type pair");
+        }
+    }
+
+    void writeUntaggedValueChecked(Value val) throws InvalidTypeException {
+        byte tag = ValueImpl.typeValueKey(val);
+        if (isObjectTag(tag)) {
+            if (val == null) {
+                 writeObjectRef(0);
+            } else {
+                if (!(val instanceof ObjectReference)) {
+                    throw new InvalidTypeException();
+                }
+                writeObjectRef(((ObjectReferenceImpl)val).ref());
+            }
+        } else {
+            switch (tag) {
+                case JDWP.Tag.BYTE:
+                    if(!(val instanceof ByteValue))
+                        throw new InvalidTypeException();
+
+                    writeByte(((PrimitiveValue)val).byteValue());
+                    break;
+
+                case JDWP.Tag.CHAR:
+                    if(!(val instanceof CharValue))
+                        throw new InvalidTypeException();
+
+                    writeChar(((PrimitiveValue)val).charValue());
+                    break;
+
+                case JDWP.Tag.FLOAT:
+                    if(!(val instanceof FloatValue))
+                        throw new InvalidTypeException();
+
+                    writeFloat(((PrimitiveValue)val).floatValue());
+                    break;
+
+                case JDWP.Tag.DOUBLE:
+                    if(!(val instanceof DoubleValue))
+                        throw new InvalidTypeException();
+
+                    writeDouble(((PrimitiveValue)val).doubleValue());
+                    break;
+
+                case JDWP.Tag.INT:
+                    if(!(val instanceof IntegerValue))
+                        throw new InvalidTypeException();
+
+                    writeInt(((PrimitiveValue)val).intValue());
+                    break;
+
+                case JDWP.Tag.LONG:
+                    if(!(val instanceof LongValue))
+                        throw new InvalidTypeException();
+
+                    writeLong(((PrimitiveValue)val).longValue());
+                    break;
+
+                case JDWP.Tag.SHORT:
+                    if(!(val instanceof ShortValue))
+                        throw new InvalidTypeException();
+
+                    writeShort(((PrimitiveValue)val).shortValue());
+                    break;
+
+                case JDWP.Tag.BOOLEAN:
+                    if(!(val instanceof BooleanValue))
+                        throw new InvalidTypeException();
+
+                    writeBoolean(((PrimitiveValue)val).booleanValue());
+                    break;
+            }
+        }
+    }
+
+
+
+    /**
+     * Read byte represented as one bytes.
+     */
+    byte readByte() {
+        byte ret = pkt.data[inCursor];
+        inCursor += 1;
+        return ret;
+    }
+
+    /**
+     * Read boolean represented as one byte.
+     */
+    boolean readBoolean() {
+        byte ret = readByte();
+        return (ret != 0);
+    }
+
+    /**
+     * Read char represented as two bytes.
+     */
+    char readChar() {
+        int b1, b2;
+
+        b1 = pkt.data[inCursor++] & 0xff;
+        b2 = pkt.data[inCursor++] & 0xff;
+
+        return (char)((b1 << 8) + b2);
+    }
+
+    /**
+     * Read short represented as two bytes.
+     */
+    short readShort() {
+        int b1, b2;
+
+        b1 = pkt.data[inCursor++] & 0xff;
+        b2 = pkt.data[inCursor++] & 0xff;
+
+        return (short)((b1 << 8) + b2);
+    }
+
+    /**
+     * Read int represented as four bytes.
+     */
+    int readInt() {
+        int b1,b2,b3,b4;
+
+        b1 = pkt.data[inCursor++] & 0xff;
+        b2 = pkt.data[inCursor++] & 0xff;
+        b3 = pkt.data[inCursor++] & 0xff;
+        b4 = pkt.data[inCursor++] & 0xff;
+
+        return ((b1 << 24) + (b2 << 16) + (b3 << 8) + b4);
+    }
+
+    /**
+     * Read long represented as eight bytes.
+     */
+    long readLong() {
+        long b1,b2,b3,b4;
+        long b5,b6,b7,b8;
+
+        b1 = pkt.data[inCursor++] & 0xff;
+        b2 = pkt.data[inCursor++] & 0xff;
+        b3 = pkt.data[inCursor++] & 0xff;
+        b4 = pkt.data[inCursor++] & 0xff;
+
+        b5 = pkt.data[inCursor++] & 0xff;
+        b6 = pkt.data[inCursor++] & 0xff;
+        b7 = pkt.data[inCursor++] & 0xff;
+        b8 = pkt.data[inCursor++] & 0xff;
+
+        return ((b1 << 56) + (b2 << 48) + (b3 << 40) + (b4 << 32)
+                + (b5 << 24) + (b6 << 16) + (b7 << 8) + b8);
+    }
+
+    /**
+     * Read float represented as four bytes.
+     */
+    float readFloat() {
+        return Float.intBitsToFloat(readInt());
+    }
+
+    /**
+     * Read double represented as eight bytes.
+     */
+    double readDouble() {
+        return Double.longBitsToDouble(readLong());
+    }
+
+    /**
+     * Read string represented as four byte length followed by
+     * characters of the string.
+     */
+    String readString() {
+        String ret;
+        int len = readInt();
+
+        try {
+            ret = new String(pkt.data, inCursor, len, "UTF8");
+        } catch(java.io.UnsupportedEncodingException e) {
+            System.err.println(e);
+            ret = "Conversion error!";
+        }
+        inCursor += len;
+        return ret;
+    }
+
+    private long readID(int size) {
+        switch (size) {
+          case 8:
+              return readLong();
+          case 4:
+              return (long)readInt();
+          case 2:
+              return (long)readShort();
+          default:
+              throw new UnsupportedOperationException("JDWP: ID size not supported: " + size);
+        }
+    }
+
+    /**
+     * Read object represented as vm specific byte sequence.
+     */
+    long readObjectRef() {
+        return readID(vm.sizeofObjectRef);
+    }
+
+    long readClassRef() {
+        return readID(vm.sizeofClassRef);
+    }
+
+    ObjectReferenceImpl readTaggedObjectReference() {
+        byte typeKey = readByte();
+        return vm.objectMirror(readObjectRef(), typeKey);
+    }
+
+    ObjectReferenceImpl readObjectReference() {
+        return vm.objectMirror(readObjectRef());
+    }
+
+    StringReferenceImpl readStringReference() {
+        long ref = readObjectRef();
+        return vm.stringMirror(ref);
+    }
+
+    ArrayReferenceImpl readArrayReference() {
+        long ref = readObjectRef();
+        return vm.arrayMirror(ref);
+    }
+
+    ThreadReferenceImpl readThreadReference() {
+        long ref = readObjectRef();
+        return vm.threadMirror(ref);
+    }
+
+    ThreadGroupReferenceImpl readThreadGroupReference() {
+        long ref = readObjectRef();
+        return vm.threadGroupMirror(ref);
+    }
+
+    ClassLoaderReferenceImpl readClassLoaderReference() {
+        long ref = readObjectRef();
+        return vm.classLoaderMirror(ref);
+    }
+
+    ClassObjectReferenceImpl readClassObjectReference() {
+        long ref = readObjectRef();
+        return vm.classObjectMirror(ref);
+    }
+
+    ReferenceTypeImpl readReferenceType() {
+        byte tag = readByte();
+        long ref = readObjectRef();
+        return vm.referenceType(ref, tag);
+    }
+
+    /**
+     * Read method reference represented as vm specific byte sequence.
+     */
+    long readMethodRef() {
+        return readID(vm.sizeofMethodRef);
+    }
+
+    /**
+     * Read field reference represented as vm specific byte sequence.
+     */
+    long readFieldRef() {
+        return readID(vm.sizeofFieldRef);
+    }
+
+    /**
+     * Read field represented as vm specific byte sequence.
+     */
+    Field readField() {
+        ReferenceTypeImpl refType = readReferenceType();
+        long fieldRef = readFieldRef();
+        return refType.getFieldMirror(fieldRef);
+    }
+
+    /**
+     * Read frame represented as vm specific byte sequence.
+     */
+    long readFrameRef() {
+        return readID(vm.sizeofFrameRef);
+    }
+
+    /**
+     * Read a value, first byte describes type of value to read.
+     */
+    ValueImpl readValue() {
+        byte typeKey = readByte();
+        return readUntaggedValue(typeKey);
+    }
+
+    ValueImpl readUntaggedValue(byte typeKey) {
+        ValueImpl val = null;
+
+        if (isObjectTag(typeKey)) {
+            val = vm.objectMirror(readObjectRef(), typeKey);
+        } else {
+            switch(typeKey) {
+                case JDWP.Tag.BYTE:
+                    val = new ByteValueImpl(vm, readByte());
+                    break;
+
+                case JDWP.Tag.CHAR:
+                    val = new CharValueImpl(vm, readChar());
+                    break;
+
+                case JDWP.Tag.FLOAT:
+                    val = new FloatValueImpl(vm, readFloat());
+                    break;
+
+                case JDWP.Tag.DOUBLE:
+                    val = new DoubleValueImpl(vm, readDouble());
+                    break;
+
+                case JDWP.Tag.INT:
+                    val = new IntegerValueImpl(vm, readInt());
+                    break;
+
+                case JDWP.Tag.LONG:
+                    val = new LongValueImpl(vm, readLong());
+                    break;
+
+                case JDWP.Tag.SHORT:
+                    val = new ShortValueImpl(vm, readShort());
+                    break;
+
+                case JDWP.Tag.BOOLEAN:
+                    val = new BooleanValueImpl(vm, readBoolean());
+                    break;
+
+                case JDWP.Tag.VOID:
+                    val = new VoidValueImpl(vm);
+                    break;
+            }
+        }
+        return val;
+    }
+
+    /**
+     * Read location represented as vm specific byte sequence.
+     */
+    Location readLocation() {
+        byte tag = readByte();
+        long classRef = readObjectRef();
+        long methodRef = readMethodRef();
+        long codeIndex = readLong();
+        if (classRef != 0) {
+            /* Valid location */
+            ReferenceTypeImpl refType = vm.referenceType(classRef, tag);
+            return new LocationImpl(vm, refType, methodRef, codeIndex);
+        } else {
+            /* Null location (example: uncaught exception) */
+           return null;
+        }
+    }
+
+    byte[] readByteArray(int length) {
+        byte[] array = new byte[length];
+        System.arraycopy(pkt.data, inCursor, array, 0, length);
+        inCursor += length;
+        return array;
+    }
+
+    List<Value> readArrayRegion() {
+        byte typeKey = readByte();
+        int length = readInt();
+        List<Value> list = new ArrayList<Value>(length);
+        boolean gettingObjects = isObjectTag(typeKey);
+        for (int i = 0; i < length; i++) {
+            /*
+             * Each object comes back with a type key which might
+             * identify a more specific type than the type key we
+             * passed in, so we use it in the decodeValue call.
+             * (For primitives, we just use the original one)
+             */
+            if (gettingObjects) {
+                typeKey = readByte();
+            }
+            Value value = readUntaggedValue(typeKey);
+            list.add(value);
+        }
+
+        return list;
+    }
+
+    void writeArrayRegion(List<Value> srcValues) {
+        writeInt(srcValues.size());
+        for (int i = 0; i < srcValues.size(); i++) {
+            Value value = srcValues.get(i);
+            writeUntaggedValue(value);
+        }
+    }
+
+    int skipBytes(int n) {
+        inCursor += n;
+        return n;
+    }
+
+    byte command() {
+        return (byte)pkt.cmd;
+    }
+
+    static boolean isObjectTag(byte tag) {
+        return (tag == JDWP.Tag.OBJECT) ||
+               (tag == JDWP.Tag.ARRAY) ||
+               (tag == JDWP.Tag.STRING) ||
+               (tag == JDWP.Tag.THREAD) ||
+               (tag == JDWP.Tag.THREAD_GROUP) ||
+               (tag == JDWP.Tag.CLASS_LOADER) ||
+               (tag == JDWP.Tag.CLASS_OBJECT);
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/PrimitiveTypeImpl.java b/src/share/classes/com/sun/tools/jdi/PrimitiveTypeImpl.java
new file mode 100644
index 0000000..05d0370
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/PrimitiveTypeImpl.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+abstract class PrimitiveTypeImpl extends TypeImpl implements PrimitiveType {
+
+    PrimitiveTypeImpl(VirtualMachine vm) {
+        super(vm);
+    }
+
+    /*
+     * Converts the given primitive value to a value of this type.
+     */
+    abstract PrimitiveValue convert(PrimitiveValue value) throws InvalidTypeException;
+
+    public String toString() {
+        return name();
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/PrimitiveValueImpl.java b/src/share/classes/com/sun/tools/jdi/PrimitiveValueImpl.java
new file mode 100644
index 0000000..930ab68
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/PrimitiveValueImpl.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 1998, 2006, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+public abstract class PrimitiveValueImpl extends ValueImpl
+                                         implements PrimitiveValue {
+
+    PrimitiveValueImpl(VirtualMachine aVm) {
+        super(aVm);
+    }
+
+    abstract public boolean booleanValue();
+    abstract public byte byteValue();
+    abstract public char charValue();
+    abstract public short shortValue();
+    abstract public int intValue();
+    abstract public long longValue();
+    abstract public float floatValue();
+    abstract public double doubleValue();
+
+    /*
+     * The checked versions of the value accessors throw
+     * InvalidTypeException if the required conversion is
+     * narrowing and would result in the loss of information
+     * (either magnitude or precision).
+     *
+     * Default implementations here do no checking; subclasses
+     * override as necessary to do the proper checking.
+     */
+    byte checkedByteValue() throws InvalidTypeException {
+        return byteValue();
+    }
+    char checkedCharValue() throws InvalidTypeException {
+        return charValue();
+    }
+    short checkedShortValue() throws InvalidTypeException {
+        return shortValue();
+    }
+    int checkedIntValue() throws InvalidTypeException {
+        return intValue();
+    }
+    long checkedLongValue() throws InvalidTypeException {
+        return longValue();
+    }
+    float checkedFloatValue() throws InvalidTypeException {
+        return floatValue();
+    }
+
+    final boolean checkedBooleanValue() throws InvalidTypeException {
+        /*
+         * Always disallow a conversion to boolean from any other
+         * primitive
+         */
+        if (this instanceof BooleanValue) {
+            return booleanValue();
+        } else {
+            throw new InvalidTypeException("Can't convert non-boolean value to boolean");
+        }
+    }
+
+    final double checkedDoubleValue() throws InvalidTypeException {
+        /*
+         * Can't overflow by converting to double, so this method
+         * is never overridden
+         */
+        return doubleValue();
+    }
+
+    ValueImpl prepareForAssignmentTo(ValueContainer destination)
+                    throws InvalidTypeException {
+
+        return convertForAssignmentTo(destination);
+    }
+
+    ValueImpl convertForAssignmentTo(ValueContainer destination)
+                 throws InvalidTypeException {
+
+        /*
+         * TO DO: Centralize JNI signature knowledge
+         */
+        if (destination.signature().length() > 1) {
+            throw new InvalidTypeException("Can't assign primitive value to object");
+        }
+
+        if ((destination.signature().charAt(0) == 'Z') &&
+            (type().signature().charAt(0) != 'Z')) {
+            throw new InvalidTypeException("Can't assign non-boolean value to a boolean");
+        }
+
+        if ((destination.signature().charAt(0) != 'Z') &&
+            (type().signature().charAt(0) == 'Z')) {
+            throw new InvalidTypeException("Can't assign boolean value to an non-boolean");
+        }
+
+        if ("void".equals(destination.typeName())) {
+            throw new InvalidTypeException("Can't assign primitive value to a void");
+        }
+
+        try {
+            PrimitiveTypeImpl primitiveType = (PrimitiveTypeImpl)destination.type();
+            return (ValueImpl)(primitiveType.convert(this));
+        } catch (ClassNotLoadedException e) {
+            throw new InternalException("Signature and type inconsistent for: " +
+                                        destination.typeName());
+        }
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/ProcessAttachingConnector.java b/src/share/classes/com/sun/tools/jdi/ProcessAttachingConnector.java
new file mode 100644
index 0000000..35d209a
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/ProcessAttachingConnector.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.util.Map;
+import java.util.Properties;
+
+import com.sun.jdi.Bootstrap;
+import com.sun.jdi.VirtualMachine;
+import com.sun.jdi.connect.*;
+import com.sun.jdi.connect.spi.*;
+
+/*
+ * An AttachingConnector that connects to a debuggee by specifying the process
+ * id (pid) as the connector argument. If the process is a debuggee listening
+ * on a transport address then this connector reads the transport address
+ * and attempts to attach to it using the appropriate transport.
+ */
+
+public class ProcessAttachingConnector
+        extends ConnectorImpl implements AttachingConnector
+{
+    /*
+     * The arguments that this connector supports
+     */
+    static final String ARG_PID = "pid";
+    static final String ARG_TIMEOUT = "timeout";
+
+    com.sun.tools.attach.VirtualMachine vm;
+    Transport transport;
+
+    public ProcessAttachingConnector() {
+        addStringArgument(
+            ARG_PID,
+            getString("process_attaching.pid.label"),
+            getString("process_attaching.pid"),
+            "",
+            true);
+
+        addIntegerArgument(
+            ARG_TIMEOUT,
+            getString("generic_attaching.timeout.label"),       // use generic keys to keep
+            getString("generic_attaching.timeout"),             // resource bundle small
+            "",
+            false,
+            0, Integer.MAX_VALUE);
+
+        transport = new Transport() {
+            public String name() {
+                return "local";
+            }
+        };
+    }
+
+
+    /**
+     * Attach to a target VM using the specified address and Connector arguments.
+     */
+    public VirtualMachine attach(Map<String,? extends Connector.Argument> args)
+                throws IOException, IllegalConnectorArgumentsException
+    {
+        String pid = argument(ARG_PID, args).value();
+        String t = argument(ARG_TIMEOUT, args).value();
+        int timeout = 0;
+        if (t.length() > 0) {
+            timeout = Integer.decode(t).intValue();
+        }
+
+        // Use Attach API to attach to target VM and read value of
+        // sun.jdwp.listenAddress property.
+
+        String address = null;
+        com.sun.tools.attach.VirtualMachine vm = null;
+        try {
+            vm = com.sun.tools.attach.VirtualMachine.attach(pid);
+            Properties props = vm.getAgentProperties();
+            address = props.getProperty("sun.jdwp.listenerAddress");
+        } catch (Exception x) {
+            throw new IOException(x.getMessage());
+        } finally {
+            if (vm != null) vm.detach();
+        }
+
+        // check that the property value is formatted correctly
+
+        if (address == null) {
+            throw new IOException("Not a debuggee, or not listening for debugger to attach");
+        }
+        int pos = address.indexOf(':');
+        if (pos < 1) {
+            throw new IOException("Unable to determine transport endpoint");
+        }
+
+        // parse into transport library name and address
+
+        final String lib = address.substring(0, pos);
+        address = address.substring(pos+1, address.length());
+
+        TransportService ts = null;
+        if (lib.equals("dt_socket")) {
+            ts = new SocketTransportService();
+        } else {
+            if (lib.equals("dt_shmem")) {
+                try {
+                    Class<?> c = Class.forName("com.sun.tools.jdi.SharedMemoryTransportService");
+                    ts = (TransportService)c.newInstance();
+                } catch (Exception x) { }
+            }
+        }
+        if (ts == null) {
+            throw new IOException("Transport " + lib + " not recognized");
+        }
+
+        // connect to the debuggee
+
+        Connection connection = ts.attach(address, timeout, 0);
+        return Bootstrap.virtualMachineManager().createVirtualMachine(connection);
+    }
+
+    public String name() {
+        return "com.sun.jdi.ProcessAttach";
+    }
+
+    public String description() {
+        return getString("process_attaching.description");
+    }
+
+    public Transport transport() {
+        if (transport == null) {
+            return new Transport() {
+                public String name() {
+                    return "local";
+                }
+            };
+        }
+        return transport;
+    }
+
+}
diff --git a/src/share/classes/com/sun/tools/jdi/RawCommandLineLauncher.java b/src/share/classes/com/sun/tools/jdi/RawCommandLineLauncher.java
new file mode 100644
index 0000000..525a840
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/RawCommandLineLauncher.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.tools.jdi.*;
+import com.sun.jdi.connect.*;
+import com.sun.jdi.connect.spi.*;
+import com.sun.jdi.VirtualMachine;
+import java.util.Map;
+import java.io.IOException;
+
+public class RawCommandLineLauncher extends AbstractLauncher implements LaunchingConnector {
+
+    static private final String ARG_COMMAND = "command";
+    static private final String ARG_ADDRESS = "address";
+    static private final String ARG_QUOTE   = "quote";
+
+    TransportService transportService;
+    Transport transport;
+
+    public TransportService transportService() {
+        return transportService;
+    }
+
+    public Transport transport() {
+        return transport;
+    }
+
+    public RawCommandLineLauncher() {
+        super();
+
+        try {
+            Class<?> c = Class.forName("com.sun.tools.jdi.SharedMemoryTransportService");
+            transportService = (TransportService)c.newInstance();
+            transport = new Transport() {
+                public String name() {
+                    return "dt_shmem";
+                }
+            };
+        } catch (ClassNotFoundException x) {
+        } catch (UnsatisfiedLinkError x) {
+        } catch (InstantiationException x) {
+        } catch (IllegalAccessException x) {
+        };
+
+        if (transportService == null) {
+            transportService = new SocketTransportService();
+            transport = new Transport() {
+                public String name() {
+                    return "dt_socket";
+                }
+            };
+        }
+
+        addStringArgument(
+                ARG_COMMAND,
+                getString("raw.command.label"),
+                getString("raw.command"),
+                "",
+                true);
+        addStringArgument(
+                ARG_QUOTE,
+                getString("raw.quote.label"),
+                getString("raw.quote"),
+                "\"",
+                true);
+
+        addStringArgument(
+                ARG_ADDRESS,
+                getString("raw.address.label"),
+                getString("raw.address"),
+                "",
+                true);
+    }
+
+
+    public VirtualMachine
+        launch(Map<String,? extends Connector.Argument> arguments)
+        throws IOException, IllegalConnectorArgumentsException,
+               VMStartException
+    {
+        String command = argument(ARG_COMMAND, arguments).value();
+        String address = argument(ARG_ADDRESS, arguments).value();
+
+        String quote = argument(ARG_QUOTE, arguments).value();
+
+        if (quote.length() > 1) {
+            throw new IllegalConnectorArgumentsException("Invalid length",
+                                                         ARG_QUOTE);
+        }
+
+        TransportService.ListenKey listener = transportService.startListening(address);
+
+        try {
+            return launch(tokenizeCommand(command, quote.charAt(0)),
+                          address, listener, transportService);
+        } finally {
+            transportService.stopListening(listener);
+        }
+    }
+
+    public String name() {
+        return "com.sun.jdi.RawCommandLineLaunch";
+    }
+
+    public String description() {
+        return getString("raw.description");
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/ReferenceTypeImpl.java b/src/share/classes/com/sun/tools/jdi/ReferenceTypeImpl.java
new file mode 100644
index 0000000..51c4478
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/ReferenceTypeImpl.java
@@ -0,0 +1,1174 @@
+/*
+ * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+import java.util.*;
+import java.lang.ref.SoftReference;
+
+public abstract class ReferenceTypeImpl extends TypeImpl
+implements ReferenceType {
+    protected long ref;
+    private String signature = null;
+    private String genericSignature = null;
+    private boolean genericSignatureGotten = false;
+    private String baseSourceName = null;
+    private String baseSourceDir = null;
+    private String baseSourcePath = null;
+    protected int modifiers = -1;
+    private SoftReference<List<Field>> fieldsRef = null;
+    private SoftReference<List<Method>> methodsRef = null;
+    private SoftReference<SDE> sdeRef = null;
+
+    private boolean isClassLoaderCached = false;
+    private ClassLoaderReference classLoader = null;
+    private ClassObjectReference classObject = null;
+
+    private int status = 0;
+    private boolean isPrepared = false;
+
+
+    private boolean versionNumberGotten = false;
+    private int majorVersion;
+    private int minorVersion;
+
+    private boolean constantPoolInfoGotten = false;
+    private int constanPoolCount;
+    private byte[] constantPoolBytes;
+    private SoftReference<byte[]> constantPoolBytesRef = null;
+
+    /* to mark a SourceFile request that returned a genuine JDWP.Error.ABSENT_INFORMATION */
+    private static final String ABSENT_BASE_SOURCE_NAME = "**ABSENT_BASE_SOURCE_NAME**";
+
+    /* to mark when no info available */
+    static final SDE NO_SDE_INFO_MARK = new SDE();
+
+    // bits set when initialization was attempted (succeeded or failed)
+    private static final int INITIALIZED_OR_FAILED =
+        JDWP.ClassStatus.INITIALIZED | JDWP.ClassStatus.ERROR;
+
+
+    protected ReferenceTypeImpl(VirtualMachine aVm, long aRef) {
+        super(aVm);
+        ref = aRef;
+        genericSignatureGotten = false;
+    }
+
+    void noticeRedefineClass() {
+        //Invalidate information previously fetched and cached.
+        //These will be refreshed later on demand.
+        baseSourceName = null;
+        baseSourcePath = null;
+        modifiers = -1;
+        fieldsRef = null;
+        methodsRef = null;
+        sdeRef = null;
+        versionNumberGotten = false;
+        constantPoolInfoGotten = false;
+    }
+
+    Method getMethodMirror(long ref) {
+        if (ref == 0) {
+            // obsolete method
+            return new ObsoleteMethodImpl(vm, this);
+        }
+        // Fetch all methods for the class, check performance impact
+        // Needs no synchronization now, since methods() returns
+        // unmodifiable local data
+        Iterator<Method> it = methods().iterator();
+        while (it.hasNext()) {
+            MethodImpl method = (MethodImpl)it.next();
+            if (method.ref() == ref) {
+                return method;
+            }
+        }
+        throw new IllegalArgumentException("Invalid method id: " + ref);
+    }
+
+    Field getFieldMirror(long ref) {
+        // Fetch all fields for the class, check performance impact
+        // Needs no synchronization now, since fields() returns
+        // unmodifiable local data
+        Iterator<Field>it = fields().iterator();
+        while (it.hasNext()) {
+            FieldImpl field = (FieldImpl)it.next();
+            if (field.ref() == ref) {
+                return field;
+            }
+        }
+        throw new IllegalArgumentException("Invalid field id: " + ref);
+    }
+
+    public boolean equals(Object obj) {
+        if ((obj != null) && (obj instanceof ReferenceTypeImpl)) {
+            ReferenceTypeImpl other = (ReferenceTypeImpl)obj;
+            return (ref() == other.ref()) &&
+                (vm.equals(other.virtualMachine()));
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        return(int)ref();
+    }
+
+    public int compareTo(ReferenceType object) {
+        /*
+         * Note that it is critical that compareTo() == 0
+         * implies that equals() == true. Otherwise, TreeSet
+         * will collapse classes.
+         *
+         * (Classes of the same name loaded by different class loaders
+         * or in different VMs must not return 0).
+         */
+        ReferenceTypeImpl other = (ReferenceTypeImpl)object;
+        int comp = name().compareTo(other.name());
+        if (comp == 0) {
+            long rf1 = ref();
+            long rf2 = other.ref();
+            // optimize for typical case: refs equal and VMs equal
+            if (rf1 == rf2) {
+                // sequenceNumbers are always positive
+                comp = vm.sequenceNumber -
+                 ((VirtualMachineImpl)(other.virtualMachine())).sequenceNumber;
+            } else {
+                comp = (rf1 < rf2)? -1 : 1;
+            }
+        }
+        return comp;
+    }
+
+    public String signature() {
+        if (signature == null) {
+            // Does not need synchronization, since worst-case
+            // static info is fetched twice
+            if (vm.canGet1_5LanguageFeatures()) {
+                /*
+                 * we might as well get both the signature and the
+                 * generic signature.
+                 */
+                genericSignature();
+            } else {
+                try {
+                    signature = JDWP.ReferenceType.Signature.
+                        process(vm, this).signature;
+                } catch (JDWPException exc) {
+                    throw exc.toJDIException();
+                }
+            }
+        }
+        return signature;
+    }
+
+    public String genericSignature() {
+        // This gets both the signature and the generic signature
+        if (vm.canGet1_5LanguageFeatures() && !genericSignatureGotten) {
+            // Does not need synchronization, since worst-case
+            // static info is fetched twice
+            JDWP.ReferenceType.SignatureWithGeneric result;
+            try {
+                result = JDWP.ReferenceType.SignatureWithGeneric.
+                    process(vm, this);
+            } catch (JDWPException exc) {
+                throw exc.toJDIException();
+            }
+            signature = result.signature;
+            setGenericSignature(result.genericSignature);
+        }
+        return genericSignature;
+    }
+
+    public ClassLoaderReference classLoader() {
+        if (!isClassLoaderCached) {
+            // Does not need synchronization, since worst-case
+            // static info is fetched twice
+            try {
+                classLoader = (ClassLoaderReference)
+                    JDWP.ReferenceType.ClassLoader.
+                    process(vm, this).classLoader;
+                isClassLoaderCached = true;
+            } catch (JDWPException exc) {
+                throw exc.toJDIException();
+            }
+        }
+        return classLoader;
+    }
+
+    public boolean isPublic() {
+        if (modifiers == -1)
+            getModifiers();
+
+        return((modifiers & VMModifiers.PUBLIC) > 0);
+    }
+
+    public boolean isProtected() {
+        if (modifiers == -1)
+            getModifiers();
+
+        return((modifiers & VMModifiers.PROTECTED) > 0);
+    }
+
+    public boolean isPrivate() {
+        if (modifiers == -1)
+            getModifiers();
+
+        return((modifiers & VMModifiers.PRIVATE) > 0);
+    }
+
+    public boolean isPackagePrivate() {
+        return !isPublic() && !isPrivate() && !isProtected();
+    }
+
+    public boolean isAbstract() {
+        if (modifiers == -1)
+            getModifiers();
+
+        return((modifiers & VMModifiers.ABSTRACT) > 0);
+    }
+
+    public boolean isFinal() {
+        if (modifiers == -1)
+            getModifiers();
+
+        return((modifiers & VMModifiers.FINAL) > 0);
+    }
+
+    public boolean isStatic() {
+        if (modifiers == -1)
+            getModifiers();
+
+        return((modifiers & VMModifiers.STATIC) > 0);
+    }
+
+    public boolean isPrepared() {
+        // This ref type may have been prepared before we were getting
+        // events, so get it once.  After that,
+        // this status flag is updated through the ClassPrepareEvent,
+        // there is no need for the expense of a JDWP query.
+        if (status == 0) {
+            updateStatus();
+        }
+        return isPrepared;
+    }
+
+    public boolean isVerified() {
+        // Once true, it never resets, so we don't need to update
+        if ((status & JDWP.ClassStatus.VERIFIED) == 0) {
+            updateStatus();
+        }
+        return (status & JDWP.ClassStatus.VERIFIED) != 0;
+    }
+
+    public boolean isInitialized() {
+        // Once initialization succeeds or fails, it never resets,
+        // so we don't need to update
+        if ((status & INITIALIZED_OR_FAILED) == 0) {
+            updateStatus();
+        }
+        return (status & JDWP.ClassStatus.INITIALIZED) != 0;
+    }
+
+    public boolean failedToInitialize() {
+        // Once initialization succeeds or fails, it never resets,
+        // so we don't need to update
+        if ((status & INITIALIZED_OR_FAILED) == 0) {
+            updateStatus();
+        }
+        return (status & JDWP.ClassStatus.ERROR) != 0;
+    }
+
+    public List<Field> fields() {
+        List<Field> fields = (fieldsRef == null) ? null : fieldsRef.get();
+        if (fields == null) {
+            if (vm.canGet1_5LanguageFeatures()) {
+                JDWP.ReferenceType.FieldsWithGeneric.FieldInfo[] jdwpFields;
+                try {
+                    jdwpFields = JDWP.ReferenceType.FieldsWithGeneric.process(vm, this).declared;
+                } catch (JDWPException exc) {
+                    throw exc.toJDIException();
+                }
+                fields = new ArrayList<Field>(jdwpFields.length);
+                for (int i=0; i<jdwpFields.length; i++) {
+                    JDWP.ReferenceType.FieldsWithGeneric.FieldInfo fi
+                        = jdwpFields[i];
+
+                    Field field = new FieldImpl(vm, this, fi.fieldID,
+                                                fi.name, fi.signature,
+                                                fi.genericSignature,
+                                                fi.modBits);
+                    fields.add(field);
+                }
+            } else {
+                JDWP.ReferenceType.Fields.FieldInfo[] jdwpFields;
+                try {
+                    jdwpFields = JDWP.ReferenceType.Fields.
+                        process(vm, this).declared;
+                } catch (JDWPException exc) {
+                    throw exc.toJDIException();
+                }
+                fields = new ArrayList<Field>(jdwpFields.length);
+                for (int i=0; i<jdwpFields.length; i++) {
+                    JDWP.ReferenceType.Fields.FieldInfo fi = jdwpFields[i];
+
+                    Field field = new FieldImpl(vm, this, fi.fieldID,
+                                            fi.name, fi.signature,
+                                            null,
+                                            fi.modBits);
+                    fields.add(field);
+                }
+            }
+
+            fields = Collections.unmodifiableList(fields);
+            fieldsRef = new SoftReference<List<Field>>(fields);
+        }
+        return fields;
+    }
+
+    abstract List<? extends ReferenceType> inheritedTypes();
+
+    void addVisibleFields(List<Field> visibleList, Map<String, Field> visibleTable, List<String> ambiguousNames) {
+        for (Field field : visibleFields()) {
+            String name = field.name();
+            if (!ambiguousNames.contains(name)) {
+                Field duplicate = visibleTable.get(name);
+                if (duplicate == null) {
+                    visibleList.add(field);
+                    visibleTable.put(name, field);
+                } else if (!field.equals(duplicate)) {
+                    ambiguousNames.add(name);
+                    visibleTable.remove(name);
+                    visibleList.remove(duplicate);
+                } else {
+                    // identical field from two branches; do nothing
+                }
+            }
+        }
+    }
+
+    public List<Field> visibleFields() {
+        /*
+         * Maintain two different collections of visible fields. The
+         * list maintains a reasonable order for return. The
+         * hash map provides an efficient way to lookup visible fields
+         * by name, important for finding hidden or ambiguous fields.
+         */
+        List<Field> visibleList = new ArrayList<Field>();
+        Map<String, Field>  visibleTable = new HashMap<String, Field>();
+
+        /* Track fields removed from above collection due to ambiguity */
+        List<String> ambiguousNames = new ArrayList<String>();
+
+        /* Add inherited, visible fields */
+        List<? extends ReferenceType> types = inheritedTypes();
+        Iterator<? extends ReferenceType> iter = types.iterator();
+        while (iter.hasNext()) {
+            /*
+             * TO DO: Be defensive and check for cyclic interface inheritance
+             */
+            ReferenceTypeImpl type = (ReferenceTypeImpl)iter.next();
+            type.addVisibleFields(visibleList, visibleTable, ambiguousNames);
+        }
+
+        /*
+         * Insert fields from this type, removing any inherited fields they
+         * hide.
+         */
+        List<Field> retList = new ArrayList<Field>(fields());
+        for (Field field : retList) {
+            Field hidden = visibleTable.get(field.name());
+            if (hidden != null) {
+                visibleList.remove(hidden);
+            }
+        }
+        retList.addAll(visibleList);
+        return retList;
+    }
+
+    void addAllFields(List<Field> fieldList, Set<ReferenceType> typeSet) {
+        /* Continue the recursion only if this type is new */
+        if (!typeSet.contains(this)) {
+            typeSet.add((ReferenceType)this);
+
+            /* Add local fields */
+            fieldList.addAll(fields());
+
+            /* Add inherited fields */
+            List<? extends ReferenceType> types = inheritedTypes();
+            Iterator<? extends ReferenceType> iter = types.iterator();
+            while (iter.hasNext()) {
+                ReferenceTypeImpl type = (ReferenceTypeImpl)iter.next();
+                type.addAllFields(fieldList, typeSet);
+            }
+        }
+    }
+    public List<Field> allFields() {
+        List<Field> fieldList = new ArrayList<Field>();
+        Set<ReferenceType> typeSet = new HashSet<ReferenceType>();
+        addAllFields(fieldList, typeSet);
+        return fieldList;
+    }
+
+    public Field fieldByName(String fieldName) {
+        List<Field> searchList = visibleFields();
+
+        for (int i=0; i<searchList.size(); i++) {
+            Field f = searchList.get(i);
+
+            if (f.name().equals(fieldName)) {
+                return f;
+            }
+        }
+        //throw new NoSuchFieldException("Field '" + fieldName + "' not found in " + name());
+        return null;
+    }
+
+    public List<Method> methods() {
+        List<Method> methods = (methodsRef == null) ? null : methodsRef.get();
+        if (methods == null) {
+            if (!vm.canGet1_5LanguageFeatures()) {
+                methods = methods1_4();
+            } else {
+                JDWP.ReferenceType.MethodsWithGeneric.MethodInfo[] declared;
+                try {
+                    declared = JDWP.ReferenceType.MethodsWithGeneric.
+                        process(vm, this).declared;
+                } catch (JDWPException exc) {
+                    throw exc.toJDIException();
+                }
+                methods = new ArrayList<Method>(declared.length);
+                for (int i=0; i<declared.length; i++) {
+                    JDWP.ReferenceType.MethodsWithGeneric.MethodInfo
+                        mi = declared[i];
+
+                    Method method = MethodImpl.createMethodImpl(vm, this,
+                                                         mi.methodID,
+                                                         mi.name, mi.signature,
+                                                         mi.genericSignature,
+                                                         mi.modBits);
+                    methods.add(method);
+                }
+            }
+            methods = Collections.unmodifiableList(methods);
+            methodsRef = new SoftReference<List<Method>>(methods);
+        }
+        return methods;
+    }
+
+    private List<Method> methods1_4() {
+        List<Method> methods;
+        JDWP.ReferenceType.Methods.MethodInfo[] declared;
+        try {
+            declared = JDWP.ReferenceType.Methods.
+                process(vm, this).declared;
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+        methods = new ArrayList<Method>(declared.length);
+        for (int i=0; i<declared.length; i++) {
+            JDWP.ReferenceType.Methods.MethodInfo mi = declared[i];
+
+            Method method = MethodImpl.createMethodImpl(vm, this,
+                                                        mi.methodID,
+                                                        mi.name, mi.signature,
+                                                        null,
+                                                        mi.modBits);
+            methods.add(method);
+        }
+        return methods;
+    }
+
+    /*
+     * Utility method used by subclasses to build lists of visible
+     * methods.
+     */
+    void addToMethodMap(Map<String, Method> methodMap, List<Method> methodList) {
+        for (Method method : methodList)
+            methodMap.put(method.name().concat(method.signature()), method);
+        }
+
+    abstract void addVisibleMethods(Map<String, Method> methodMap, Set<InterfaceType> seenInterfaces);
+
+    public List<Method> visibleMethods() {
+        /*
+         * Build a collection of all visible methods. The hash
+         * map allows us to do this efficiently by keying on the
+         * concatenation of name and signature.
+         */
+        Map<String, Method> map = new HashMap<String, Method>();
+        addVisibleMethods(map, new HashSet<InterfaceType>());
+
+        /*
+         * ... but the hash map destroys order. Methods should be
+         * returned in a sensible order, as they are in allMethods().
+         * So, start over with allMethods() and use the hash map
+         * to filter that ordered collection.
+         */
+        List<Method> list = allMethods();
+        list.retainAll(map.values());
+        return list;
+    }
+
+    abstract public List<Method> allMethods();
+
+    public List<Method> methodsByName(String name) {
+        List<Method> methods = visibleMethods();
+        ArrayList<Method> retList = new ArrayList<Method>(methods.size());
+        for (Method candidate : methods) {
+            if (candidate.name().equals(name)) {
+                retList.add(candidate);
+            }
+        }
+        retList.trimToSize();
+        return retList;
+    }
+
+    public List<Method> methodsByName(String name, String signature) {
+        List<Method> methods = visibleMethods();
+        ArrayList<Method> retList = new ArrayList<Method>(methods.size());
+        for (Method candidate : methods) {
+            if (candidate.name().equals(name) &&
+                candidate.signature().equals(signature)) {
+                retList.add(candidate);
+            }
+        }
+        retList.trimToSize();
+        return retList;
+    }
+
+    List<InterfaceType> getInterfaces() {
+        InterfaceTypeImpl[] intfs;
+        try {
+            intfs = JDWP.ReferenceType.Interfaces.
+                                         process(vm, this).interfaces;
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+        return Arrays.asList((InterfaceType[])intfs);
+    }
+
+    public List<ReferenceType> nestedTypes() {
+        List<ReferenceType> all = vm.allClasses();
+        List<ReferenceType> nested = new ArrayList<ReferenceType>();
+        String outername = name();
+        int outerlen = outername.length();
+        Iterator<ReferenceType> iter = all.iterator();
+        while (iter.hasNext()) {
+            ReferenceType refType = iter.next();
+            String name = refType.name();
+            int len = name.length();
+            /* The separator is historically '$' but could also be '#' */
+            if ( len > outerlen && name.startsWith(outername) ) {
+                char c = name.charAt(outerlen);
+                if ( c =='$' || c== '#' ) {
+                    nested.add(refType);
+                }
+            }
+        }
+        return nested;
+    }
+
+    public Value getValue(Field sig) {
+        List<Field> list = new ArrayList<Field>(1);
+        list.add(sig);
+        Map<Field, Value> map = getValues(list);
+        return map.get(sig);
+    }
+
+
+    void validateFieldAccess(Field field) {
+        /*
+         * Field must be in this object's class, a superclass, or
+         * implemented interface
+         */
+        ReferenceTypeImpl declType = (ReferenceTypeImpl)field.declaringType();
+        if (!declType.isAssignableFrom(this)) {
+            throw new IllegalArgumentException("Invalid field");
+        }
+    }
+
+    void validateFieldSet(Field field) {
+        validateFieldAccess(field);
+        if (field.isFinal()) {
+            throw new IllegalArgumentException("Cannot set value of final field");
+        }
+    }
+
+    /**
+     * Returns a map of field values
+     */
+    public Map<Field,Value> getValues(List<? extends Field> theFields) {
+        validateMirrors(theFields);
+
+        int size = theFields.size();
+        JDWP.ReferenceType.GetValues.Field[] queryFields =
+                         new JDWP.ReferenceType.GetValues.Field[size];
+
+        for (int i=0; i<size; i++) {
+            FieldImpl field = (FieldImpl)theFields.get(i);
+
+            validateFieldAccess(field);
+
+            // Do more validation specific to ReferenceType field getting
+            if (!field.isStatic()) {
+                throw new IllegalArgumentException(
+                     "Attempt to use non-static field with ReferenceType");
+            }
+            queryFields[i] = new JDWP.ReferenceType.GetValues.Field(
+                                         field.ref());
+        }
+
+        Map<Field, Value> map = new HashMap<Field, Value>(size);
+
+        ValueImpl[] values;
+        try {
+            values = JDWP.ReferenceType.GetValues.
+                                     process(vm, this, queryFields).values;
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+
+        if (size != values.length) {
+            throw new InternalException(
+                         "Wrong number of values returned from target VM");
+        }
+        for (int i=0; i<size; i++) {
+            FieldImpl field = (FieldImpl)theFields.get(i);
+            map.put(field, values[i]);
+        }
+
+        return map;
+    }
+
+    public ClassObjectReference classObject() {
+        if (classObject == null) {
+            // Are classObjects unique for an Object, or
+            // created each time? Is this spec'ed?
+            synchronized(this) {
+                if (classObject == null) {
+                    try {
+                        classObject = JDWP.ReferenceType.ClassObject.
+                            process(vm, this).classObject;
+                    } catch (JDWPException exc) {
+                        throw exc.toJDIException();
+                    }
+                }
+            }
+        }
+        return classObject;
+    }
+
+    SDE.Stratum stratum(String stratumID) {
+        SDE sde = sourceDebugExtensionInfo();
+        if (!sde.isValid()) {
+            sde = NO_SDE_INFO_MARK;
+        }
+        return sde.stratum(stratumID);
+    }
+
+    public String sourceName() throws AbsentInformationException {
+        return sourceNames(vm.getDefaultStratum()).get(0);
+    }
+
+    public List<String> sourceNames(String stratumID)
+                                throws AbsentInformationException {
+        SDE.Stratum stratum = stratum(stratumID);
+        if (stratum.isJava()) {
+            List<String> result = new ArrayList<String>(1);
+            result.add(baseSourceName());
+            return result;
+        }
+        return stratum.sourceNames(this);
+    }
+
+    public List<String> sourcePaths(String stratumID)
+                                throws AbsentInformationException {
+        SDE.Stratum stratum = stratum(stratumID);
+        if (stratum.isJava()) {
+            List<String> result = new ArrayList<String>(1);
+            result.add(baseSourceDir() + baseSourceName());
+            return result;
+        }
+        return stratum.sourcePaths(this);
+    }
+
+    String baseSourceName() throws AbsentInformationException {
+        String bsn = baseSourceName;
+        if (bsn == null) {
+            // Does not need synchronization, since worst-case
+            // static info is fetched twice
+            try {
+                bsn = JDWP.ReferenceType.SourceFile.
+                    process(vm, this).sourceFile;
+            } catch (JDWPException exc) {
+                if (exc.errorCode() == JDWP.Error.ABSENT_INFORMATION) {
+                    bsn = ABSENT_BASE_SOURCE_NAME;
+                } else {
+                    throw exc.toJDIException();
+                }
+            }
+            baseSourceName = bsn;
+        }
+        if (bsn == ABSENT_BASE_SOURCE_NAME) {
+            throw new AbsentInformationException();
+        }
+        return bsn;
+    }
+
+    String baseSourcePath() throws AbsentInformationException {
+        String bsp = baseSourcePath;
+        if (bsp == null) {
+            bsp = baseSourceDir() + baseSourceName();
+            baseSourcePath = bsp;
+        }
+        return bsp;
+    }
+
+    String baseSourceDir() {
+        if (baseSourceDir == null) {
+            String typeName = name();
+            StringBuffer sb = new StringBuffer(typeName.length() + 10);
+            int index = 0;
+            int nextIndex;
+
+            while ((nextIndex = typeName.indexOf('.', index)) > 0) {
+                sb.append(typeName.substring(index, nextIndex));
+                sb.append(java.io.File.separatorChar);
+                index = nextIndex + 1;
+            }
+            baseSourceDir = sb.toString();
+        }
+        return baseSourceDir;
+    }
+
+    public String sourceDebugExtension()
+                           throws AbsentInformationException {
+        if (!vm.canGetSourceDebugExtension()) {
+            throw new UnsupportedOperationException();
+        }
+        SDE sde = sourceDebugExtensionInfo();
+        if (sde == NO_SDE_INFO_MARK) {
+            throw new AbsentInformationException();
+        }
+        return sde.sourceDebugExtension;
+    }
+
+    private SDE sourceDebugExtensionInfo() {
+        if (!vm.canGetSourceDebugExtension()) {
+            return NO_SDE_INFO_MARK;
+        }
+        SDE sde = (sdeRef == null) ?  null : sdeRef.get();
+        if (sde == null) {
+            String extension = null;
+            try {
+                extension = JDWP.ReferenceType.SourceDebugExtension.
+                    process(vm, this).extension;
+            } catch (JDWPException exc) {
+                if (exc.errorCode() != JDWP.Error.ABSENT_INFORMATION) {
+                    sdeRef = new SoftReference<SDE>(NO_SDE_INFO_MARK);
+                    throw exc.toJDIException();
+                }
+            }
+            if (extension == null) {
+                sde = NO_SDE_INFO_MARK;
+            } else {
+                sde = new SDE(extension);
+            }
+            sdeRef = new SoftReference<SDE>(sde);
+        }
+        return sde;
+    }
+
+    public List<String> availableStrata() {
+        SDE sde = sourceDebugExtensionInfo();
+        if (sde.isValid()) {
+            return sde.availableStrata();
+        } else {
+            List<String> strata = new ArrayList<String>();
+            strata.add(SDE.BASE_STRATUM_NAME);
+            return strata;
+        }
+    }
+
+    /**
+     * Always returns non-null stratumID
+     */
+    public String defaultStratum() {
+        SDE sdei = sourceDebugExtensionInfo();
+        if (sdei.isValid()) {
+            return sdei.defaultStratumId;
+        } else {
+            return SDE.BASE_STRATUM_NAME;
+        }
+    }
+
+    public int modifiers() {
+        if (modifiers == -1)
+            getModifiers();
+
+        return modifiers;
+    }
+
+    public List<Location> allLineLocations()
+                            throws AbsentInformationException {
+        return allLineLocations(vm.getDefaultStratum(), null);
+    }
+
+    public List<Location> allLineLocations(String stratumID, String sourceName)
+                            throws AbsentInformationException {
+        boolean someAbsent = false; // A method that should have info, didn't
+        SDE.Stratum stratum = stratum(stratumID);
+        List<Location> list = new ArrayList<Location>();  // location list
+
+        for (Iterator<Method> iter = methods().iterator(); iter.hasNext(); ) {
+            MethodImpl method = (MethodImpl)iter.next();
+            try {
+                list.addAll(
+                   method.allLineLocations(stratum, sourceName));
+            } catch(AbsentInformationException exc) {
+                someAbsent = true;
+            }
+        }
+
+        // If we retrieved no line info, and at least one of the methods
+        // should have had some (as determined by an
+        // AbsentInformationException being thrown) then we rethrow
+        // the AbsentInformationException.
+        if (someAbsent && list.size() == 0) {
+            throw new AbsentInformationException();
+        }
+        return list;
+    }
+
+    public List<Location> locationsOfLine(int lineNumber)
+                           throws AbsentInformationException {
+        return locationsOfLine(vm.getDefaultStratum(),
+                               null,
+                               lineNumber);
+    }
+
+    public List<Location> locationsOfLine(String stratumID,
+                                String sourceName,
+                                int lineNumber)
+                           throws AbsentInformationException {
+        // A method that should have info, didn't
+        boolean someAbsent = false;
+        // A method that should have info, did
+        boolean somePresent = false;
+        List<Method> methods = methods();
+        SDE.Stratum stratum = stratum(stratumID);
+
+        List<Location> list = new ArrayList<Location>();
+
+        Iterator<Method> iter = methods.iterator();
+        while(iter.hasNext()) {
+            MethodImpl method = (MethodImpl)iter.next();
+            // eliminate native and abstract to eliminate
+            // false positives
+            if (!method.isAbstract() &&
+                !method.isNative()) {
+                try {
+                    list.addAll(
+                       method.locationsOfLine(stratum,
+                                              sourceName,
+                                              lineNumber));
+                    somePresent = true;
+                } catch(AbsentInformationException exc) {
+                    someAbsent = true;
+                }
+            }
+        }
+        if (someAbsent && !somePresent) {
+            throw new AbsentInformationException();
+        }
+        return list;
+    }
+
+    public List<ObjectReference> instances(long maxInstances) {
+        if (!vm.canGetInstanceInfo()) {
+            throw new UnsupportedOperationException(
+                "target does not support getting instances");
+        }
+
+        if (maxInstances < 0) {
+            throw new IllegalArgumentException("maxInstances is less than zero: "
+                                              + maxInstances);
+        }
+        int intMax = (maxInstances > Integer.MAX_VALUE)?
+            Integer.MAX_VALUE: (int)maxInstances;
+        // JDWP can't currently handle more than this (in mustang)
+
+        try {
+            return Arrays.asList(
+                (ObjectReference[])JDWP.ReferenceType.Instances.
+                        process(vm, this, intMax).instances);
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+    }
+
+    private void getClassFileVersion() {
+        if (!vm.canGetClassFileVersion()) {
+            throw new UnsupportedOperationException();
+        }
+        JDWP.ReferenceType.ClassFileVersion classFileVersion;
+        if (versionNumberGotten) {
+            return;
+        } else {
+            try {
+                classFileVersion = JDWP.ReferenceType.ClassFileVersion.process(vm, this);
+            } catch (JDWPException exc) {
+                if (exc.errorCode() == JDWP.Error.ABSENT_INFORMATION) {
+                    majorVersion = 0;
+                    minorVersion = 0;
+                    versionNumberGotten = true;
+                    return;
+                } else {
+                    throw exc.toJDIException();
+                }
+            }
+            majorVersion = classFileVersion.majorVersion;
+            minorVersion = classFileVersion.minorVersion;
+            versionNumberGotten = true;
+        }
+    }
+
+    public int majorVersion() {
+        try {
+            getClassFileVersion();
+        } catch (RuntimeException exc) {
+            throw exc;
+        }
+        return majorVersion;
+    }
+
+    public int minorVersion() {
+        try {
+            getClassFileVersion();
+        } catch (RuntimeException exc) {
+            throw exc;
+        }
+        return minorVersion;
+    }
+
+    private byte[] getConstantPoolInfo() {
+        JDWP.ReferenceType.ConstantPool jdwpCPool;
+        if (!vm.canGetConstantPool()) {
+            throw new UnsupportedOperationException();
+        }
+        if (constantPoolInfoGotten) {
+            if (constantPoolBytesRef == null) {
+                return null;
+            }
+            byte[] cpbytes = constantPoolBytesRef.get();
+            if (cpbytes != null) {
+                return cpbytes;
+            }
+        }
+
+        try {
+            jdwpCPool = JDWP.ReferenceType.ConstantPool.process(vm, this);
+        } catch (JDWPException exc) {
+            if (exc.errorCode() == JDWP.Error.ABSENT_INFORMATION) {
+                constanPoolCount = 0;
+                constantPoolBytesRef = null;
+                constantPoolInfoGotten = true;
+                return null;
+            } else {
+                throw exc.toJDIException();
+            }
+        }
+        byte[] cpbytes;
+        constanPoolCount = jdwpCPool.count;
+        cpbytes = jdwpCPool.bytes;
+        constantPoolBytesRef = new SoftReference<byte[]>(cpbytes);
+        constantPoolInfoGotten = true;
+        return cpbytes;
+    }
+
+    public int constantPoolCount() {
+        try {
+            getConstantPoolInfo();
+        } catch (RuntimeException exc) {
+            throw exc;
+        }
+        return constanPoolCount;
+    }
+
+    public byte[] constantPool() {
+        byte[] cpbytes;
+        try {
+            cpbytes = getConstantPoolInfo();
+        } catch (RuntimeException exc) {
+            throw exc;
+        }
+        if (cpbytes != null) {
+            /*
+             * Arrays are always modifiable, so it is a little unsafe
+             * to return the cached bytecodes directly; instead, we
+             * make a clone at the cost of using more memory.
+             */
+            return cpbytes.clone();
+        } else {
+            return null;
+        }
+    }
+
+    // Does not need synchronization, since worst-case
+    // static info is fetched twice
+    void getModifiers() {
+        if (modifiers != -1) {
+            return;
+        }
+        try {
+            modifiers = JDWP.ReferenceType.Modifiers.
+                                  process(vm, this).modBits;
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+    }
+
+    void decodeStatus(int status) {
+        this.status = status;
+        if ((status & JDWP.ClassStatus.PREPARED) != 0) {
+            isPrepared = true;
+        }
+    }
+
+    void updateStatus() {
+        try {
+            decodeStatus(JDWP.ReferenceType.Status.process(vm, this).status);
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+    }
+
+    void markPrepared() {
+        isPrepared = true;
+    }
+
+    long ref() {
+        return ref;
+    }
+
+    int indexOf(Method method) {
+        // Make sure they're all here - the obsolete method
+        // won't be found and so will have index -1
+        return methods().indexOf(method);
+    }
+
+    int indexOf(Field field) {
+        // Make sure they're all here
+        return fields().indexOf(field);
+    }
+
+    /*
+     * Return true if an instance of this type
+     * can be assigned to a variable of the given type
+     */
+    abstract boolean isAssignableTo(ReferenceType type);
+
+    boolean isAssignableFrom(ReferenceType type) {
+        return ((ReferenceTypeImpl)type).isAssignableTo(this);
+    }
+
+    boolean isAssignableFrom(ObjectReference object) {
+        return object == null ||
+               isAssignableFrom(object.referenceType());
+    }
+
+    void setStatus(int status) {
+        decodeStatus(status);
+    }
+
+    void setSignature(String signature) {
+        this.signature = signature;
+    }
+
+    void setGenericSignature(String signature) {
+        if (signature != null && signature.length() == 0) {
+            this.genericSignature = null;
+        } else{
+            this.genericSignature = signature;
+        }
+        this.genericSignatureGotten = true;
+    }
+
+    private static boolean isPrimitiveArray(String signature) {
+        int i = signature.lastIndexOf('[');
+        /*
+         * TO DO: Centralize JNI signature knowledge.
+         *
+         * Ref:
+         *  jdk1.4/doc/guide/jpda/jdi/com/sun/jdi/doc-files/signature.html
+         */
+        boolean isPA;
+        if (i < 0) {
+            isPA = false;
+        } else {
+            char c = signature.charAt(i + 1);
+            isPA = (c != 'L');
+        }
+        return isPA;
+    }
+
+    Type findType(String signature) throws ClassNotLoadedException {
+        Type type;
+        if (signature.length() == 1) {
+            /* OTI FIX: Must be a primitive type or the void type */
+            char sig = signature.charAt(0);
+            if (sig == 'V') {
+                type = vm.theVoidType();
+            } else {
+                type = vm.primitiveTypeMirror((byte)sig);
+            }
+        } else {
+            // Must be a reference type.
+            ClassLoaderReferenceImpl loader =
+                       (ClassLoaderReferenceImpl)classLoader();
+            if ((loader == null) ||
+                (isPrimitiveArray(signature)) //Work around 4450091
+                ) {
+                // Caller wants type of boot class field
+                type = vm.findBootType(signature);
+            } else {
+                // Caller wants type of non-boot class field
+                type = loader.findType(signature);
+            }
+        }
+        return type;
+    }
+
+    String loaderString() {
+        if (classLoader() != null) {
+            return "loaded by " + classLoader().toString();
+        } else {
+            return "no class loader";
+        }
+    }
+
+}
diff --git a/src/share/classes/com/sun/tools/jdi/SDE.java b/src/share/classes/com/sun/tools/jdi/SDE.java
new file mode 100644
index 0000000..2ccaf25
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/SDE.java
@@ -0,0 +1,691 @@
+/*
+ * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+import java.util.*;
+import java.io.File;
+
+class SDE {
+    private static final int INIT_SIZE_FILE = 3;
+    private static final int INIT_SIZE_LINE = 100;
+    private static final int INIT_SIZE_STRATUM = 3;
+
+    static final String BASE_STRATUM_NAME = "Java";
+
+    /* for C capatibility */
+    static final String NullString = null;
+
+    private class FileTableRecord {
+        int fileId;
+        String sourceName;
+        String sourcePath; // do not read - use accessor
+        boolean isConverted = false;
+
+        /**
+         * Return the sourcePath, computing it if not set.
+         * If set, convert '/' in the sourcePath to the
+         * local file separator.
+         */
+        String getSourcePath(ReferenceTypeImpl refType) {
+            if (!isConverted) {
+                if (sourcePath == null) {
+                    sourcePath = refType.baseSourceDir() + sourceName;
+                } else {
+                    StringBuffer buf = new StringBuffer();
+                    for (int i = 0; i < sourcePath.length(); ++i) {
+                        char ch = sourcePath.charAt(i);
+                        if (ch == '/') {
+                            buf.append(File.separatorChar);
+                        } else {
+                            buf.append(ch);
+                        }
+                    }
+                    sourcePath = buf.toString();
+                }
+                isConverted = true;
+            }
+            return sourcePath;
+        }
+    }
+
+    private class LineTableRecord {
+        int jplsStart;
+        int jplsEnd;
+        int jplsLineInc;
+        int njplsStart;
+        int njplsEnd;
+        int fileId;
+    }
+
+    private class StratumTableRecord {
+        String id;
+        int fileIndex;
+        int lineIndex;
+    }
+
+    class Stratum {
+        private final int sti; /* stratum index */
+
+        private Stratum(int sti) {
+            this.sti = sti;
+        }
+
+        String id() {
+            return stratumTable[sti].id;
+        }
+
+        boolean isJava() {
+            return sti == baseStratumIndex;
+        }
+
+        /**
+         * Return all the sourceNames for this stratum.
+         * Look from our starting fileIndex upto the starting
+         * fileIndex of next stratum - can do this since there
+         * is always a terminator stratum.
+         * Default sourceName (the first one) must be first.
+         */
+        List<String> sourceNames(ReferenceTypeImpl refType) {
+            int i;
+            int fileIndexStart = stratumTable[sti].fileIndex;
+            /* one past end */
+            int fileIndexEnd = stratumTable[sti+1].fileIndex;
+            List<String> result = new ArrayList<String>(fileIndexEnd - fileIndexStart);
+            for (i = fileIndexStart; i < fileIndexEnd; ++i) {
+                result.add(fileTable[i].sourceName);
+            }
+            return result;
+        }
+
+        /**
+         * Return all the sourcePaths for this stratum.
+         * Look from our starting fileIndex upto the starting
+         * fileIndex of next stratum - can do this since there
+         * is always a terminator stratum.
+         * Default sourcePath (the first one) must be first.
+         */
+        List<String> sourcePaths(ReferenceTypeImpl refType) {
+            int i;
+            int fileIndexStart = stratumTable[sti].fileIndex;
+            /* one past end */
+            int fileIndexEnd = stratumTable[sti+1].fileIndex;
+            List<String> result = new ArrayList<String>(fileIndexEnd - fileIndexStart);
+            for (i = fileIndexStart; i < fileIndexEnd; ++i) {
+                result.add(fileTable[i].getSourcePath(refType));
+            }
+            return result;
+        }
+
+        LineStratum lineStratum(ReferenceTypeImpl refType,
+                                int jplsLine) {
+            int lti = stiLineTableIndex(sti, jplsLine);
+            if (lti < 0) {
+                return null;
+            } else {
+                return new LineStratum(sti, lti, refType,
+                                       jplsLine);
+            }
+        }
+    }
+
+    class LineStratum {
+        private final int sti; /* stratum index */
+        private final int lti; /* line table index */
+        private final ReferenceTypeImpl refType;
+        private final int jplsLine;
+        private String sourceName = null;
+        private String sourcePath = null;
+
+        private LineStratum(int sti, int lti,
+                            ReferenceTypeImpl refType,
+                            int jplsLine) {
+            this.sti = sti;
+            this.lti = lti;
+            this.refType = refType;
+            this.jplsLine = jplsLine;
+        }
+
+        public boolean equals(Object obj) {
+            if (obj instanceof LineStratum) {
+                LineStratum other = (LineStratum)obj;
+                return (lti == other.lti) &&
+                       (sti == other.sti) &&
+                       (lineNumber() == other.lineNumber()) &&
+                       (refType.equals(other.refType));
+            } else {
+                return false;
+            }
+        }
+
+        @Override
+        public int hashCode() {
+            return (lineNumber() * 17) ^ refType.hashCode();
+        }
+
+        int lineNumber() {
+            return stiLineNumber(sti, lti, jplsLine);
+        }
+
+        /**
+         * Fetch the source name and source path for
+         * this line, converting or constructing
+         * the source path if needed.
+         */
+        void getSourceInfo() {
+            if (sourceName != null) {
+                // already done
+                return;
+            }
+            int fti = stiFileTableIndex(sti, lti);
+            if (fti == -1) {
+                throw new InternalError(
+              "Bad SourceDebugExtension, no matching source id " +
+              lineTable[lti].fileId + " jplsLine: " + jplsLine);
+            }
+            FileTableRecord ftr = fileTable[fti];
+            sourceName = ftr.sourceName;
+            sourcePath = ftr.getSourcePath(refType);
+        }
+
+        String sourceName() {
+            getSourceInfo();
+            return sourceName;
+        }
+
+        String sourcePath() {
+            getSourceInfo();
+            return sourcePath;
+        }
+    }
+
+    private FileTableRecord[] fileTable = null;
+    private LineTableRecord[] lineTable = null;
+    private StratumTableRecord[] stratumTable = null;
+
+    private int fileIndex = 0;
+    private int lineIndex = 0;
+    private int stratumIndex = 0;
+    private int currentFileId = 0;
+
+    private int defaultStratumIndex = -1;
+    private int baseStratumIndex = -2; /* so as not to match -1 above */
+    private int sdePos = 0;
+
+    final String sourceDebugExtension;
+    String jplsFilename = null;
+    String defaultStratumId = null;
+    boolean isValid = false;
+
+    SDE(String sourceDebugExtension) {
+        this.sourceDebugExtension = sourceDebugExtension;
+        decode();
+    }
+
+    SDE() {
+        this.sourceDebugExtension = null;
+        createProxyForAbsentSDE();
+    }
+
+    char sdePeek() {
+        if (sdePos >= sourceDebugExtension.length()) {
+            syntax();
+        }
+        return sourceDebugExtension.charAt(sdePos);
+    }
+
+    char sdeRead() {
+        if (sdePos >= sourceDebugExtension.length()) {
+            syntax();
+        }
+        return sourceDebugExtension.charAt(sdePos++);
+    }
+
+    void sdeAdvance() {
+        sdePos++;
+    }
+
+    void syntax() {
+        throw new InternalError("bad SourceDebugExtension syntax - position " +
+                                sdePos);
+    }
+
+    void syntax(String msg) {
+        throw new InternalError("bad SourceDebugExtension syntax: " + msg);
+    }
+
+    void assureLineTableSize() {
+        int len = lineTable == null? 0 : lineTable.length;
+        if (lineIndex >= len) {
+            int i;
+            int newLen = len == 0? INIT_SIZE_LINE : len * 2;
+            LineTableRecord[] newTable = new LineTableRecord[newLen];
+            for (i = 0; i < len; ++i) {
+                newTable[i] = lineTable[i];
+            }
+            for (; i < newLen; ++i) {
+                newTable[i] = new LineTableRecord();
+            }
+            lineTable = newTable;
+        }
+    }
+
+    void assureFileTableSize() {
+        int len = fileTable == null? 0 : fileTable.length;
+        if (fileIndex >= len) {
+            int i;
+            int newLen = len == 0? INIT_SIZE_FILE : len * 2;
+            FileTableRecord[] newTable = new FileTableRecord[newLen];
+            for (i = 0; i < len; ++i) {
+                newTable[i] = fileTable[i];
+            }
+            for (; i < newLen; ++i) {
+                newTable[i] = new FileTableRecord();
+            }
+            fileTable = newTable;
+        }
+    }
+
+    void assureStratumTableSize() {
+        int len = stratumTable == null? 0 : stratumTable.length;
+        if (stratumIndex >= len) {
+            int i;
+            int newLen = len == 0? INIT_SIZE_STRATUM : len * 2;
+            StratumTableRecord[] newTable = new StratumTableRecord[newLen];
+            for (i = 0; i < len; ++i) {
+                newTable[i] = stratumTable[i];
+            }
+            for (; i < newLen; ++i) {
+                newTable[i] = new StratumTableRecord();
+            }
+            stratumTable = newTable;
+        }
+    }
+
+    String readLine() {
+        StringBuffer sb = new StringBuffer();
+        char ch;
+
+        ignoreWhite();
+        while (((ch = sdeRead()) != '\n') && (ch != '\r')) {
+            sb.append(ch);
+        }
+        // check for CR LF
+        if ((ch == '\r') && (sdePeek() == '\n')) {
+            sdeRead();
+        }
+        ignoreWhite(); // leading white
+        return sb.toString();
+    }
+
+    private int defaultStratumTableIndex() {
+        if ((defaultStratumIndex == -1) && (defaultStratumId != null)) {
+            defaultStratumIndex =
+                stratumTableIndex(defaultStratumId);
+        }
+        return defaultStratumIndex;
+    }
+
+    int stratumTableIndex(String stratumId) {
+        int i;
+
+        if (stratumId == null) {
+            return defaultStratumTableIndex();
+        }
+        for (i = 0; i < (stratumIndex-1); ++i) {
+            if (stratumTable[i].id.equals(stratumId)) {
+                return i;
+            }
+        }
+        return defaultStratumTableIndex();
+    }
+
+    Stratum stratum(String stratumID) {
+        int sti = stratumTableIndex(stratumID);
+        return new Stratum(sti);
+    }
+
+    List<String> availableStrata() {
+        List<String> strata = new ArrayList<String>();
+
+        for (int i = 0; i < (stratumIndex-1); ++i) {
+            StratumTableRecord rec = stratumTable[i];
+            strata.add(rec.id);
+        }
+        return strata;
+    }
+
+/*****************************
+ * below functions/methods are written to compile under either Java or C
+ *
+ * Needed support functions:
+ *   sdePeek()
+ *   sdeRead()
+ *   sdeAdvance()
+ *   readLine()
+ *   assureLineTableSize()
+ *   assureFileTableSize()
+ *   assureStratumTableSize()
+ *   syntax()
+ *
+ *   stratumTableIndex(String)
+ *
+ * Needed support variables:
+ *   lineTable
+ *   lineIndex
+ *   fileTable
+ *   fileIndex
+ *   currentFileId
+ *
+ * Needed types:
+ *   String
+ *
+ * Needed constants:
+ *   NullString
+ */
+
+    void ignoreWhite() {
+        char ch;
+
+        while (((ch = sdePeek()) == ' ') || (ch == '\t')) {
+            sdeAdvance();
+        }
+    }
+
+    void ignoreLine() {
+        char ch;
+
+        while (((ch = sdeRead()) != '\n') && (ch != '\r')) {
+        }
+        /* check for CR LF */
+        if ((ch == '\r') && (sdePeek() == '\n')) {
+            sdeAdvance();
+        }
+        ignoreWhite(); /* leading white */
+    }
+
+    int readNumber() {
+        int value = 0;
+        char ch;
+
+        ignoreWhite();
+        while (((ch = sdePeek()) >= '0') && (ch <= '9')) {
+            sdeAdvance();
+            value = (value * 10) + ch - '0';
+        }
+        ignoreWhite();
+        return value;
+    }
+
+    void storeFile(int fileId, String sourceName, String sourcePath) {
+        assureFileTableSize();
+        fileTable[fileIndex].fileId = fileId;
+        fileTable[fileIndex].sourceName = sourceName;
+        fileTable[fileIndex].sourcePath = sourcePath;
+        ++fileIndex;
+    }
+
+    void fileLine() {
+        int hasAbsolute = 0; /* acts as boolean */
+        int fileId;
+        String sourceName;
+        String sourcePath = null;
+
+        /* is there an absolute filename? */
+        if (sdePeek() == '+') {
+            sdeAdvance();
+            hasAbsolute = 1;
+        }
+        fileId = readNumber();
+        sourceName = readLine();
+        if (hasAbsolute == 1) {
+            sourcePath = readLine();
+        }
+
+        storeFile(fileId, sourceName, sourcePath);
+    }
+
+    void storeLine(int jplsStart, int jplsEnd, int jplsLineInc,
+                  int njplsStart, int njplsEnd, int fileId) {
+        assureLineTableSize();
+        lineTable[lineIndex].jplsStart = jplsStart;
+        lineTable[lineIndex].jplsEnd = jplsEnd;
+        lineTable[lineIndex].jplsLineInc = jplsLineInc;
+        lineTable[lineIndex].njplsStart = njplsStart;
+        lineTable[lineIndex].njplsEnd = njplsEnd;
+        lineTable[lineIndex].fileId = fileId;
+        ++lineIndex;
+    }
+
+    /**
+     * Parse line translation info.  Syntax is
+     *     <NJ-start-line> [ # <file-id> ] [ , <line-count> ] :
+     *                 <J-start-line> [ , <line-increment> ] CR
+     */
+    void lineLine() {
+        int lineCount = 1;
+        int lineIncrement = 1;
+        int njplsStart;
+        int jplsStart;
+
+        njplsStart = readNumber();
+
+        /* is there a fileID? */
+        if (sdePeek() == '#') {
+            sdeAdvance();
+            currentFileId = readNumber();
+        }
+
+        /* is there a line count? */
+        if (sdePeek() == ',') {
+            sdeAdvance();
+            lineCount = readNumber();
+        }
+
+        if (sdeRead() != ':') {
+            syntax();
+        }
+        jplsStart = readNumber();
+        if (sdePeek() == ',') {
+            sdeAdvance();
+            lineIncrement = readNumber();
+        }
+        ignoreLine(); /* flush the rest */
+
+        storeLine(jplsStart,
+                  jplsStart + (lineCount * lineIncrement) -1,
+                  lineIncrement,
+                  njplsStart,
+                  njplsStart + lineCount -1,
+                  currentFileId);
+    }
+
+    /**
+     * Until the next stratum section, everything after this
+     * is in stratumId - so, store the current indicies.
+     */
+    void storeStratum(String stratumId) {
+        /* remove redundant strata */
+        if (stratumIndex > 0) {
+            if ((stratumTable[stratumIndex-1].fileIndex
+                                            == fileIndex) &&
+                (stratumTable[stratumIndex-1].lineIndex
+                                            == lineIndex)) {
+                /* nothing changed overwrite it */
+                --stratumIndex;
+            }
+        }
+        /* store the results */
+        assureStratumTableSize();
+        stratumTable[stratumIndex].id = stratumId;
+        stratumTable[stratumIndex].fileIndex = fileIndex;
+        stratumTable[stratumIndex].lineIndex = lineIndex;
+        ++stratumIndex;
+        currentFileId = 0;
+    }
+
+    /**
+     * The beginning of a stratum's info
+     */
+    void stratumSection() {
+        storeStratum(readLine());
+    }
+
+    void fileSection() {
+        ignoreLine();
+        while (sdePeek() != '*') {
+            fileLine();
+        }
+    }
+
+    void lineSection() {
+        ignoreLine();
+        while (sdePeek() != '*') {
+            lineLine();
+        }
+    }
+
+    /**
+     * Ignore a section we don't know about.
+     */
+    void ignoreSection() {
+        ignoreLine();
+        while (sdePeek() != '*') {
+            ignoreLine();
+        }
+    }
+
+    /**
+     * A base "Java" stratum is always available, though
+     * it is not in the SourceDebugExtension.
+     * Create the base stratum.
+     */
+    void createJavaStratum() {
+        baseStratumIndex = stratumIndex;
+        storeStratum(BASE_STRATUM_NAME);
+        storeFile(1, jplsFilename, NullString);
+        /* JPL line numbers cannot exceed 65535 */
+        storeLine(1, 65536, 1, 1, 65536, 1);
+        storeStratum("Aux"); /* in case they don't declare */
+    }
+
+    /**
+     * Decode a SourceDebugExtension which is in SourceMap format.
+     * This is the entry point into the recursive descent parser.
+     */
+    void decode() {
+        /* check for "SMAP" - allow EOF if not ours */
+        if ((sourceDebugExtension.length() < 4) ||
+            (sdeRead() != 'S') ||
+            (sdeRead() != 'M') ||
+            (sdeRead() != 'A') ||
+            (sdeRead() != 'P')) {
+            return; /* not our info */
+        }
+        ignoreLine(); /* flush the rest */
+        jplsFilename = readLine();
+        defaultStratumId = readLine();
+        createJavaStratum();
+        while (true) {
+            if (sdeRead() != '*') {
+                syntax();
+            }
+            switch (sdeRead()) {
+                case 'S':
+                    stratumSection();
+                    break;
+                case 'F':
+                    fileSection();
+                    break;
+                case 'L':
+                    lineSection();
+                    break;
+                case 'E':
+                    /* set end points */
+                    storeStratum("*terminator*");
+                    isValid = true;
+                    return;
+                default:
+                    ignoreSection();
+            }
+        }
+    }
+
+    void createProxyForAbsentSDE() {
+        jplsFilename = null;
+        defaultStratumId = BASE_STRATUM_NAME;
+        defaultStratumIndex = stratumIndex;
+        createJavaStratum();
+        storeStratum("*terminator*");
+    }
+
+    /***************** query functions ***********************/
+
+    private int stiLineTableIndex(int sti, int jplsLine) {
+        int i;
+        int lineIndexStart;
+        int lineIndexEnd;
+
+        lineIndexStart = stratumTable[sti].lineIndex;
+        /* one past end */
+        lineIndexEnd = stratumTable[sti+1].lineIndex;
+        for (i = lineIndexStart; i < lineIndexEnd; ++i) {
+            if ((jplsLine >= lineTable[i].jplsStart) &&
+                            (jplsLine <= lineTable[i].jplsEnd)) {
+                return i;
+            }
+        }
+        return -1;
+    }
+
+    private int stiLineNumber(int sti, int lti, int jplsLine) {
+        return lineTable[lti].njplsStart +
+                (((jplsLine - lineTable[lti].jplsStart) /
+                                   lineTable[lti].jplsLineInc));
+    }
+
+    private int fileTableIndex(int sti, int fileId) {
+        int i;
+        int fileIndexStart = stratumTable[sti].fileIndex;
+        /* one past end */
+        int fileIndexEnd = stratumTable[sti+1].fileIndex;
+        for (i = fileIndexStart; i < fileIndexEnd; ++i) {
+            if (fileTable[i].fileId == fileId) {
+                return i;
+            }
+        }
+        return -1;
+    }
+
+    private int stiFileTableIndex(int sti, int lti) {
+        return fileTableIndex(sti, lineTable[lti].fileId);
+    }
+
+    boolean isValid() {
+        return isValid;
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/ShortTypeImpl.java b/src/share/classes/com/sun/tools/jdi/ShortTypeImpl.java
new file mode 100644
index 0000000..fa8795b
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/ShortTypeImpl.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+public class ShortTypeImpl extends PrimitiveTypeImpl implements ShortType {
+    ShortTypeImpl(VirtualMachine vm) {
+        super(vm);
+    }
+
+
+    public String signature() {
+        return String.valueOf((char)JDWP.Tag.SHORT);
+    }
+
+    PrimitiveValue convert(PrimitiveValue value) throws InvalidTypeException {
+        return vm.mirrorOf(((PrimitiveValueImpl)value).checkedShortValue());
+    }
+
+}
diff --git a/src/share/classes/com/sun/tools/jdi/ShortValueImpl.java b/src/share/classes/com/sun/tools/jdi/ShortValueImpl.java
new file mode 100644
index 0000000..dd980fe
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/ShortValueImpl.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+public class ShortValueImpl extends PrimitiveValueImpl
+                            implements ShortValue {
+    private short value;
+
+    ShortValueImpl(VirtualMachine aVm,short aValue) {
+        super(aVm);
+
+        value = aValue;
+    }
+
+    public boolean equals(Object obj) {
+        if ((obj != null) && (obj instanceof ShortValue)) {
+            return (value == ((ShortValue)obj).value()) &&
+                   super.equals(obj);
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        /*
+         * TO DO: Better hash code
+         */
+        return intValue();
+    }
+
+    public int compareTo(ShortValue obj) {
+        short other = obj.value();
+        return value() - other;
+    }
+
+    public Type type() {
+        return vm.theShortType();
+    }
+
+    public short value() {
+        return value;
+    }
+
+    public boolean booleanValue() {
+        return(value == 0)?false:true;
+    }
+
+    public byte byteValue() {
+        return(byte)value;
+    }
+
+    public char charValue() {
+        return(char)value;
+    }
+
+    public short shortValue() {
+        return value;
+    }
+
+    public int intValue() {
+        return(int)value;
+    }
+
+    public long longValue() {
+        return(long)value;
+    }
+
+    public float floatValue() {
+        return(float)value;
+    }
+
+    public double doubleValue() {
+        return(double)value;
+    }
+
+    byte checkedByteValue() throws InvalidTypeException {
+        if ((value > Byte.MAX_VALUE) || (value < Byte.MIN_VALUE)) {
+            throw new InvalidTypeException("Can't convert " + value + " to byte");
+        } else {
+            return super.checkedByteValue();
+        }
+    }
+
+    char checkedCharValue() throws InvalidTypeException {
+        if ((value > Character.MAX_VALUE) || (value < Character.MIN_VALUE)) {
+            throw new InvalidTypeException("Can't convert " + value + " to char");
+        } else {
+            return super.checkedCharValue();
+        }
+    }
+
+    public String toString() {
+        return "" + value;
+    }
+
+    byte typeValueKey() {
+        return JDWP.Tag.SHORT;
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/SocketAttachingConnector.java b/src/share/classes/com/sun/tools/jdi/SocketAttachingConnector.java
new file mode 100644
index 0000000..a8c2bed
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/SocketAttachingConnector.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.tools.jdi;
+
+import com.sun.jdi.VirtualMachine;
+import com.sun.jdi.connect.*;
+import com.sun.jdi.connect.spi.*;
+import java.util.Map;
+import java.util.HashMap;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/*
+ * An AttachingConnector that uses the SocketTransportService
+ */
+public class SocketAttachingConnector extends GenericAttachingConnector {
+
+    static final String ARG_PORT = "port";
+    static final String ARG_HOST = "hostname";
+
+    public SocketAttachingConnector() {
+        super(new SocketTransportService());
+
+        String defaultHostName;
+        try {
+            defaultHostName = InetAddress.getLocalHost().getHostName();
+        } catch (UnknownHostException e) {
+            defaultHostName = "";
+        }
+
+        addStringArgument(
+            ARG_HOST,
+            getString("socket_attaching.host.label"),
+            getString("socket_attaching.host"),
+            defaultHostName,
+            false);
+
+        addIntegerArgument(
+            ARG_PORT,
+            getString("socket_attaching.port.label"),
+            getString("socket_attaching.port"),
+            "",
+            true,
+            0, Integer.MAX_VALUE);
+
+        transport = new Transport() {
+            public String name() {
+                return "dt_socket";     // for compatibility reasons
+            }
+        };
+
+    }
+
+    /*
+     * Create an "address" from the hostname and port connector
+     * arguments and attach to the target VM.
+     */
+    public VirtualMachine
+        attach(Map<String,? extends Connector.Argument> arguments)
+        throws IOException, IllegalConnectorArgumentsException
+    {
+        String host = argument(ARG_HOST, arguments).value();
+        if (host.length() > 0) {
+            host = host + ":";
+        }
+        String address = host + argument(ARG_PORT, arguments).value();
+        return super.attach(address, arguments);
+    }
+
+    public String name() {
+       return "com.sun.jdi.SocketAttach";
+    }
+
+    public String description() {
+       return getString("socket_attaching.description");
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/SocketListeningConnector.java b/src/share/classes/com/sun/tools/jdi/SocketListeningConnector.java
new file mode 100644
index 0000000..95f0410
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/SocketListeningConnector.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.sun.tools.jdi;
+
+import com.sun.jdi.connect.*;
+import com.sun.jdi.connect.spi.*;
+import java.util.Map;
+import java.util.HashMap;
+import java.io.IOException;
+
+/*
+ * An ListeningConnector that uses the SocketTransportService
+ */
+public class SocketListeningConnector extends GenericListeningConnector {
+
+    static final String ARG_PORT = "port";
+    static final String ARG_LOCALADDR = "localAddress";
+
+    public SocketListeningConnector() {
+        super(new SocketTransportService());
+
+        addIntegerArgument(
+            ARG_PORT,
+            getString("socket_listening.port.label"),
+            getString("socket_listening.port"),
+            "",
+            false,
+            0, Integer.MAX_VALUE);
+
+        addStringArgument(
+            ARG_LOCALADDR,
+            getString("socket_listening.localaddr.label"),
+            getString("socket_listening.localaddr"),
+            "",                                         // default is wildcard
+            false);
+
+        transport = new Transport() {
+            public String name() {
+                return "dt_socket";     // for compatibility reasons
+            }
+        };
+    }
+
+
+    public String
+        startListening(Map<String,? extends Connector.Argument> args)
+        throws IOException, IllegalConnectorArgumentsException
+    {
+        String port = argument(ARG_PORT, args).value();
+        String localaddr = argument(ARG_LOCALADDR, args).value();
+
+        // default to system chosen port
+        if (port.length() == 0) {
+            port = "0";
+        }
+
+        if (localaddr.length() > 0) {
+           localaddr = localaddr + ":" + port;
+        } else {
+           localaddr = port;
+        }
+
+        return super.startListening(localaddr, args);
+    }
+
+    public String name() {
+        return "com.sun.jdi.SocketListen";
+    }
+
+    public String description() {
+        return getString("socket_listening.description");
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/SocketTransportService.java b/src/share/classes/com/sun/tools/jdi/SocketTransportService.java
new file mode 100644
index 0000000..5585a00
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/SocketTransportService.java
@@ -0,0 +1,536 @@
+/*
+ * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+import com.sun.jdi.connect.*;
+import com.sun.jdi.connect.spi.*;
+import java.net.*;
+import java.io.*;
+import java.util.Map;
+import java.util.ResourceBundle;
+
+/*
+ * A transport service based on a TCP connection between the
+ * debugger and debugee.
+ */
+
+public class SocketTransportService extends TransportService {
+    private ResourceBundle messages = null;
+
+    /**
+     * The listener returned by startListening encapsulates
+     * the ServerSocket.
+     */
+    static class SocketListenKey extends ListenKey {
+        ServerSocket ss;
+
+        SocketListenKey(ServerSocket ss) {
+            this.ss = ss;
+        }
+
+        ServerSocket socket() {
+            return ss;
+        }
+
+        /*
+         * Returns the string representation of the address that this
+         * listen key represents.
+         */
+        public String address() {
+            InetAddress address = ss.getInetAddress();
+
+            /*
+             * If bound to the wildcard address then use current local
+             * hostname. In the event that we don't know our own hostname
+             * then assume that host supports IPv4 and return something to
+             * represent the loopback address.
+             */
+            if (address.isAnyLocalAddress()) {
+                try {
+                    address = InetAddress.getLocalHost();
+                } catch (UnknownHostException uhe) {
+                    byte[] loopback = {0x7f,0x00,0x00,0x01};
+                    try {
+                        address = InetAddress.getByAddress("127.0.0.1", loopback);
+                    } catch (UnknownHostException x) {
+                        throw new InternalError("unable to get local hostname");
+                    }
+                }
+            }
+
+            /*
+             * Now decide if we return a hostname or IP address. Where possible
+             * return a hostname but in the case that we are bound to an
+             * address that isn't registered in the name service then we
+             * return an address.
+             */
+            String result;
+            String hostname = address.getHostName();
+            String hostaddr = address.getHostAddress();
+            if (hostname.equals(hostaddr)) {
+                if (address instanceof Inet6Address) {
+                    result = "[" + hostaddr + "]";
+                } else {
+                    result = hostaddr;
+                }
+            } else {
+                result = hostname;
+            }
+
+            /*
+             * Finally return "hostname:port", "ipv4-address:port" or
+             * "[ipv6-address]:port".
+             */
+            return result + ":" + ss.getLocalPort();
+        }
+
+        public String toString() {
+            return address();
+        }
+    }
+
+    /**
+     * Handshake with the debuggee
+     */
+    void handshake(Socket s, long timeout) throws IOException {
+        s.setSoTimeout((int)timeout);
+
+        byte[] hello = "JDWP-Handshake".getBytes("UTF-8");
+        s.getOutputStream().write(hello);
+
+        byte[] b = new byte[hello.length];
+        int received = 0;
+        while (received < hello.length) {
+            int n;
+            try {
+                n = s.getInputStream().read(b, received, hello.length-received);
+            } catch (SocketTimeoutException x) {
+                throw new IOException("handshake timeout");
+            }
+            if (n < 0) {
+                s.close();
+                throw new IOException("handshake failed - connection prematurally closed");
+            }
+            received += n;
+        }
+        for (int i=0; i<hello.length; i++) {
+            if (b[i] != hello[i]) {
+                throw new IOException("handshake failed - unrecognized message from target VM");
+            }
+        }
+
+        // disable read timeout
+        s.setSoTimeout(0);
+    }
+
+    /**
+     * No-arg constructor
+     */
+    public SocketTransportService() {
+    }
+
+    /**
+     * The name of this transport service
+     */
+    public String name() {
+        return "Socket";
+    }
+
+    /**
+     * Return localized description of this transport service
+     */
+    public String description() {
+        synchronized (this) {
+            if (messages == null) {
+                messages = ResourceBundle.getBundle("com.sun.tools.jdi.resources.jdi");
+            }
+        }
+        return messages.getString("socket_transportservice.description");
+    }
+
+    /**
+     * Return the capabilities of this transport service
+     */
+    public Capabilities capabilities() {
+        return new SocketTransportServiceCapabilities();
+    }
+
+
+    /**
+     * Attach to the specified address with optional attach and handshake
+     * timeout.
+     */
+    public Connection attach(String address, long attachTimeout, long handshakeTimeout)
+        throws IOException {
+
+        if (address == null) {
+            throw new NullPointerException("address is null");
+        }
+        if (attachTimeout < 0 || handshakeTimeout < 0) {
+            throw new IllegalArgumentException("timeout is negative");
+        }
+
+        int splitIndex = address.indexOf(':');
+        String host;
+        String portStr;
+        if (splitIndex < 0) {
+            host = InetAddress.getLocalHost().getHostName();
+            portStr = address;
+        } else {
+            host = address.substring(0, splitIndex);
+            portStr = address.substring(splitIndex+1);
+        }
+
+        int port;
+        try {
+            port = Integer.decode(portStr).intValue();
+        } catch (NumberFormatException e) {
+            throw new IllegalArgumentException(
+                "unable to parse port number in address");
+        }
+
+
+        // open TCP connection to VM
+
+        InetSocketAddress sa = new InetSocketAddress(host, port);
+        Socket s = new Socket();
+        try {
+            s.connect(sa, (int)attachTimeout);
+        } catch (SocketTimeoutException exc) {
+            try {
+                s.close();
+            } catch (IOException x) { }
+            throw new TransportTimeoutException("timed out trying to establish connection");
+        }
+
+        // handshake with the target VM
+        try {
+            handshake(s, handshakeTimeout);
+        } catch (IOException exc) {
+            try {
+                s.close();
+            } catch (IOException x) { }
+            throw exc;
+        }
+
+        return new SocketConnection(s);
+    }
+
+    /*
+     * Listen on the specified address and port. Return a listener
+     * that encapsulates the ServerSocket.
+     */
+    ListenKey startListening(String localaddress, int port) throws IOException {
+        InetSocketAddress sa;
+        if (localaddress == null) {
+            sa = new InetSocketAddress(port);
+        } else {
+            sa = new InetSocketAddress(localaddress, port);
+        }
+        ServerSocket ss = new ServerSocket();
+        ss.bind(sa);
+        return new SocketListenKey(ss);
+    }
+
+    /**
+     * Listen on the specified address
+     */
+    public ListenKey startListening(String address) throws IOException {
+        // use ephemeral port if address isn't specified.
+        if (address == null || address.length() == 0) {
+            address = "0";
+        }
+
+        int splitIndex = address.indexOf(':');
+        String localaddr = null;
+        if (splitIndex >= 0) {
+            localaddr = address.substring(0, splitIndex);
+            address = address.substring(splitIndex+1);
+        }
+
+        int port;
+        try {
+            port = Integer.decode(address).intValue();
+        } catch (NumberFormatException e) {
+            throw new IllegalArgumentException(
+                    "unable to parse port number in address");
+        }
+
+        return startListening(localaddr, port);
+    }
+
+    /**
+     * Listen on the default address
+     */
+    public ListenKey startListening() throws IOException {
+        return startListening(null, 0);
+    }
+
+    /**
+     * Stop the listener
+     */
+    public void stopListening(ListenKey listener) throws IOException {
+        if (!(listener instanceof SocketListenKey)) {
+            throw new IllegalArgumentException("Invalid listener");
+        }
+
+        synchronized (listener) {
+            ServerSocket ss = ((SocketListenKey)listener).socket();
+
+            // if the ServerSocket has been closed it means
+            // the listener is invalid
+            if (ss.isClosed()) {
+                throw new IllegalArgumentException("Invalid listener");
+            }
+            ss.close();
+        }
+    }
+
+    /**
+     * Accept a connection from a debuggee and handshake with it.
+     */
+    public Connection accept(ListenKey listener, long acceptTimeout, long handshakeTimeout) throws IOException {
+        if (acceptTimeout < 0 || handshakeTimeout < 0) {
+            throw new IllegalArgumentException("timeout is negative");
+        }
+        if (!(listener instanceof SocketListenKey)) {
+            throw new IllegalArgumentException("Invalid listener");
+        }
+        ServerSocket ss;
+
+        // obtain the ServerSocket from the listener - if the
+        // socket is closed it means the listener is invalid
+        synchronized (listener) {
+            ss = ((SocketListenKey)listener).socket();
+            if (ss.isClosed()) {
+               throw new IllegalArgumentException("Invalid listener");
+            }
+        }
+
+        // from here onwards it's possible that the ServerSocket
+        // may be closed by a call to stopListening - that's okay
+        // because the ServerSocket methods will throw an
+        // IOException indicating the socket is closed.
+        //
+        // Additionally, it's possible that another thread calls accept
+        // with a different accept timeout - that creates a same race
+        // condition between setting the timeout and calling accept.
+        // As it is such an unlikely scenario (requires both threads
+        // to be using the same listener we've chosen to ignore the issue).
+
+        ss.setSoTimeout((int)acceptTimeout);
+        Socket s;
+        try {
+            s = ss.accept();
+        } catch (SocketTimeoutException x) {
+            throw new TransportTimeoutException("timeout waiting for connection");
+        }
+
+        // handshake here
+        handshake(s, handshakeTimeout);
+
+        return new SocketConnection(s);
+    }
+
+    public String toString() {
+       return name();
+    }
+}
+
+
+/*
+ * The Connection returned by attach and accept is one of these
+ */
+class SocketConnection extends Connection {
+    private Socket socket;
+    private boolean closed = false;
+    private OutputStream socketOutput;
+    private InputStream socketInput;
+    private Object receiveLock = new Object();
+    private Object sendLock = new Object();
+    private Object closeLock = new Object();
+
+    SocketConnection(Socket socket) throws IOException {
+        this.socket = socket;
+        socket.setTcpNoDelay(true);
+        socketInput = socket.getInputStream();
+        socketOutput = socket.getOutputStream();
+    }
+
+    public void close() throws IOException {
+        synchronized (closeLock) {
+           if (closed) {
+                return;
+           }
+           socketOutput.close();
+           socketInput.close();
+           socket.close();
+           closed = true;
+        }
+    }
+
+    public boolean isOpen() {
+        synchronized (closeLock) {
+            return !closed;
+        }
+    }
+
+    public byte[] readPacket() throws IOException {
+        if (!isOpen()) {
+            throw new ClosedConnectionException("connection is closed");
+        }
+        synchronized (receiveLock) {
+            int b1,b2,b3,b4;
+
+            // length
+            try {
+                b1 = socketInput.read();
+                b2 = socketInput.read();
+                b3 = socketInput.read();
+                b4 = socketInput.read();
+            } catch (IOException ioe) {
+                if (!isOpen()) {
+                    throw new ClosedConnectionException("connection is closed");
+                } else {
+                    throw ioe;
+                }
+            }
+
+            // EOF
+            if (b1<0) {
+               return new byte[0];
+            }
+
+            if (b2<0 || b3<0 || b4<0) {
+                throw new IOException("protocol error - premature EOF");
+            }
+
+            int len = ((b1 << 24) | (b2 << 16) | (b3 << 8) | (b4 << 0));
+
+            if (len < 0) {
+                throw new IOException("protocol error - invalid length");
+            }
+
+            byte b[] = new byte[len];
+            b[0] = (byte)b1;
+            b[1] = (byte)b2;
+            b[2] = (byte)b3;
+            b[3] = (byte)b4;
+
+            int off = 4;
+            len -= off;
+
+            while (len > 0) {
+                int count;
+                try {
+                    count = socketInput.read(b, off, len);
+                } catch (IOException ioe) {
+                    if (!isOpen()) {
+                        throw new ClosedConnectionException("connection is closed");
+                    } else {
+                        throw ioe;
+                    }
+                }
+                if (count < 0) {
+                    throw new IOException("protocol error - premature EOF");
+                }
+                len -= count;
+                off += count;
+            }
+
+            return b;
+        }
+    }
+
+    public void writePacket(byte b[]) throws IOException {
+        if (!isOpen()) {
+            throw new ClosedConnectionException("connection is closed");
+        }
+
+        /*
+         * Check the packet size
+         */
+        if (b.length < 11) {
+            throw new IllegalArgumentException("packet is insufficient size");
+        }
+        int b0 = b[0] & 0xff;
+        int b1 = b[1] & 0xff;
+        int b2 = b[2] & 0xff;
+        int b3 = b[3] & 0xff;
+        int len = ((b0 << 24) | (b1 << 16) | (b2 << 8) | (b3 << 0));
+        if (len < 11) {
+            throw new IllegalArgumentException("packet is insufficient size");
+        }
+
+        /*
+         * Check that the byte array contains the complete packet
+         */
+        if (len > b.length) {
+            throw new IllegalArgumentException("length mis-match");
+        }
+
+        synchronized (sendLock) {
+            try {
+                /*
+                 * Send the packet (ignoring any bytes that follow
+                 * the packet in the byte array).
+                 */
+                socketOutput.write(b, 0, len);
+            } catch (IOException ioe) {
+                if (!isOpen()) {
+                    throw new ClosedConnectionException("connection is closed");
+                } else {
+                    throw ioe;
+                }
+            }
+        }
+    }
+}
+
+
+/*
+ * The capabilities of the socket transport service
+ */
+class SocketTransportServiceCapabilities extends TransportService.Capabilities {
+
+    public boolean supportsMultipleConnections() {
+        return true;
+    }
+
+    public boolean supportsAttachTimeout() {
+        return true;
+    }
+
+    public boolean supportsAcceptTimeout() {
+        return true;
+    }
+
+    public boolean supportsHandshakeTimeout() {
+        return true;
+    }
+
+}
diff --git a/src/share/classes/com/sun/tools/jdi/StackFrameImpl.java b/src/share/classes/com/sun/tools/jdi/StackFrameImpl.java
new file mode 100644
index 0000000..04eeea1
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/StackFrameImpl.java
@@ -0,0 +1,404 @@
+/*
+ * Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+import java.util.List;
+import java.util.Map;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Collections;
+
+public class StackFrameImpl extends MirrorImpl
+                            implements StackFrame, ThreadListener
+{
+    /* Once false, frame should not be used.
+     * access synchronized on (vm.state())
+     */
+    private boolean isValid = true;
+
+    private final ThreadReferenceImpl thread;
+    private final long id;
+    private final Location location;
+    private Map<String, LocalVariable> visibleVariables =  null;
+    private ObjectReference thisObject = null;
+
+    StackFrameImpl(VirtualMachine vm, ThreadReferenceImpl thread,
+                   long id, Location location) {
+        super(vm);
+        this.thread = thread;
+        this.id = id;
+        this.location = location;
+        thread.addListener(this);
+    }
+
+    /*
+     * ThreadListener implementation
+     * Must be synchronized since we must protect against
+     * sending defunct (isValid == false) stack ids to the back-end.
+     */
+    public boolean threadResumable(ThreadAction action) {
+        synchronized (vm.state()) {
+            if (isValid) {
+                isValid = false;
+                return false;   /* remove this stack frame as a listener */
+            } else {
+                throw new InternalException(
+                                  "Invalid stack frame thread listener");
+            }
+        }
+    }
+
+    void validateStackFrame() {
+        if (!isValid) {
+            throw new InvalidStackFrameException("Thread has been resumed");
+        }
+    }
+
+    /**
+     * Return the frame location.
+     * Need not be synchronized since it cannot be provably stale.
+     */
+    public Location location() {
+        validateStackFrame();
+        return location;
+    }
+
+    /**
+     * Return the thread holding the frame.
+     * Need not be synchronized since it cannot be provably stale.
+     */
+    public ThreadReference thread() {
+        validateStackFrame();
+        return thread;
+    }
+
+    public boolean equals(Object obj) {
+        if ((obj != null) && (obj instanceof StackFrameImpl)) {
+            StackFrameImpl other = (StackFrameImpl)obj;
+            return (id == other.id) &&
+                   (thread().equals(other.thread())) &&
+                   (location().equals(other.location())) &&
+                    super.equals(obj);
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        return (thread().hashCode() << 4) + ((int)id);
+    }
+
+    public ObjectReference thisObject() {
+        validateStackFrame();
+        MethodImpl currentMethod = (MethodImpl)location.method();
+        if (currentMethod.isStatic() || currentMethod.isNative()) {
+            return null;
+        } else {
+            if (thisObject == null) {
+                PacketStream ps;
+
+                /* protect against defunct frame id */
+                synchronized (vm.state()) {
+                    validateStackFrame();
+                    ps = JDWP.StackFrame.ThisObject.
+                                      enqueueCommand(vm, thread, id);
+                }
+
+                /* actually get it, now that order is guaranteed */
+                try {
+                    thisObject = JDWP.StackFrame.ThisObject.
+                                      waitForReply(vm, ps).objectThis;
+                } catch (JDWPException exc) {
+                    switch (exc.errorCode()) {
+                    case JDWP.Error.INVALID_FRAMEID:
+                    case JDWP.Error.THREAD_NOT_SUSPENDED:
+                    case JDWP.Error.INVALID_THREAD:
+                        throw new InvalidStackFrameException();
+                    default:
+                        throw exc.toJDIException();
+                    }
+                }
+            }
+        }
+        return thisObject;
+    }
+
+    /**
+     * Build the visible variable map.
+     * Need not be synchronized since it cannot be provably stale.
+     */
+    private void createVisibleVariables() throws AbsentInformationException {
+        if (visibleVariables == null) {
+            List<LocalVariable> allVariables = location.method().variables();
+            Map<String, LocalVariable> map = new HashMap<String, LocalVariable>(allVariables.size());
+
+            for (LocalVariable variable : allVariables) {
+                String name = variable.name();
+                if (variable.isVisible(this)) {
+                    LocalVariable existing = map.get(name);
+                    if ((existing == null) ||
+                        ((LocalVariableImpl)variable).hides(existing)) {
+                        map.put(name, variable);
+                    }
+                }
+            }
+            visibleVariables = map;
+        }
+    }
+
+    /**
+     * Return the list of visible variable in the frame.
+     * Need not be synchronized since it cannot be provably stale.
+     */
+    public List<LocalVariable> visibleVariables() throws AbsentInformationException {
+        validateStackFrame();
+        createVisibleVariables();
+        List<LocalVariable> mapAsList = new ArrayList<LocalVariable>(visibleVariables.values());
+        Collections.sort(mapAsList);
+        return mapAsList;
+    }
+
+    /**
+     * Return a particular variable in the frame.
+     * Need not be synchronized since it cannot be provably stale.
+     */
+    public LocalVariable visibleVariableByName(String name) throws AbsentInformationException  {
+        validateStackFrame();
+        createVisibleVariables();
+        return visibleVariables.get(name);
+    }
+
+    public Value getValue(LocalVariable variable) {
+        List<LocalVariable> list = new ArrayList<LocalVariable>(1);
+        list.add(variable);
+        return getValues(list).get(variable);
+    }
+
+    public Map<LocalVariable, Value> getValues(List<? extends LocalVariable> variables) {
+        validateStackFrame();
+        validateMirrors(variables);
+
+        int count = variables.size();
+        JDWP.StackFrame.GetValues.SlotInfo[] slots =
+                           new JDWP.StackFrame.GetValues.SlotInfo[count];
+
+        for (int i=0; i<count; ++i) {
+            LocalVariableImpl variable = (LocalVariableImpl)variables.get(i);
+            if (!variable.isVisible(this)) {
+                throw new IllegalArgumentException(variable.name() +
+                                 " is not valid at this frame location");
+            }
+            slots[i] = new JDWP.StackFrame.GetValues.SlotInfo(variable.slot(),
+                                      (byte)variable.signature().charAt(0));
+        }
+
+        PacketStream ps;
+
+        /* protect against defunct frame id */
+        synchronized (vm.state()) {
+            validateStackFrame();
+            ps = JDWP.StackFrame.GetValues.enqueueCommand(vm, thread, id, slots);
+        }
+
+        /* actually get it, now that order is guaranteed */
+        ValueImpl[] values;
+        try {
+            values = JDWP.StackFrame.GetValues.waitForReply(vm, ps).values;
+        } catch (JDWPException exc) {
+            switch (exc.errorCode()) {
+                case JDWP.Error.INVALID_FRAMEID:
+                case JDWP.Error.THREAD_NOT_SUSPENDED:
+                case JDWP.Error.INVALID_THREAD:
+                    throw new InvalidStackFrameException();
+                default:
+                    throw exc.toJDIException();
+            }
+        }
+
+        if (count != values.length) {
+            throw new InternalException(
+                      "Wrong number of values returned from target VM");
+        }
+        Map<LocalVariable, Value> map = new HashMap<LocalVariable, Value>(count);
+        for (int i=0; i<count; ++i) {
+            LocalVariableImpl variable = (LocalVariableImpl)variables.get(i);
+            map.put(variable, values[i]);
+        }
+        return map;
+    }
+
+    public void setValue(LocalVariable variableIntf, Value valueIntf)
+        throws InvalidTypeException, ClassNotLoadedException {
+
+        validateStackFrame();
+        validateMirror(variableIntf);
+        validateMirrorOrNull(valueIntf);
+
+        LocalVariableImpl variable = (LocalVariableImpl)variableIntf;
+        ValueImpl value = (ValueImpl)valueIntf;
+
+        if (!variable.isVisible(this)) {
+            throw new IllegalArgumentException(variable.name() +
+                             " is not valid at this frame location");
+        }
+
+        try {
+            // Validate and convert value if necessary
+            value = ValueImpl.prepareForAssignment(value, variable);
+
+            JDWP.StackFrame.SetValues.SlotInfo[] slotVals =
+                new JDWP.StackFrame.SetValues.SlotInfo[1];
+            slotVals[0] = new JDWP.StackFrame.SetValues.
+                                       SlotInfo(variable.slot(), value);
+
+            PacketStream ps;
+
+            /* protect against defunct frame id */
+            synchronized (vm.state()) {
+                validateStackFrame();
+                ps = JDWP.StackFrame.SetValues.
+                                     enqueueCommand(vm, thread, id, slotVals);
+            }
+
+            /* actually set it, now that order is guaranteed */
+            try {
+                JDWP.StackFrame.SetValues.waitForReply(vm, ps);
+            } catch (JDWPException exc) {
+                switch (exc.errorCode()) {
+                case JDWP.Error.INVALID_FRAMEID:
+                case JDWP.Error.THREAD_NOT_SUSPENDED:
+                case JDWP.Error.INVALID_THREAD:
+                    throw new InvalidStackFrameException();
+                default:
+                    throw exc.toJDIException();
+                }
+            }
+        } catch (ClassNotLoadedException e) {
+            /*
+             * Since we got this exception,
+             * the variable type must be a reference type. The value
+             * we're trying to set is null, but if the variable's
+             * class has not yet been loaded through the enclosing
+             * class loader, then setting to null is essentially a
+             * no-op, and we should allow it without an exception.
+             */
+            if (value != null) {
+                throw e;
+            }
+        }
+    }
+
+    public List<Value> getArgumentValues() {
+        validateStackFrame();
+        MethodImpl mmm = (MethodImpl)location.method();
+        List<String> argSigs = mmm.argumentSignatures();
+        int count = argSigs.size();
+        JDWP.StackFrame.GetValues.SlotInfo[] slots =
+                           new JDWP.StackFrame.GetValues.SlotInfo[count];
+
+        int slot;
+        if (mmm.isStatic()) {
+            slot = 0;
+        } else {
+            slot = 1;
+        }
+        for (int ii = 0; ii < count; ++ii) {
+            char sigChar = argSigs.get(ii).charAt(0);
+            slots[ii] = new JDWP.StackFrame.GetValues.SlotInfo(slot++,(byte)sigChar);
+            if (sigChar == 'J' || sigChar == 'D') {
+                slot++;
+            }
+        }
+
+        PacketStream ps;
+
+        /* protect against defunct frame id */
+        synchronized (vm.state()) {
+            validateStackFrame();
+            ps = JDWP.StackFrame.GetValues.enqueueCommand(vm, thread, id, slots);
+        }
+
+        ValueImpl[] values;
+        try {
+            values = JDWP.StackFrame.GetValues.waitForReply(vm, ps).values;
+        } catch (JDWPException exc) {
+            switch (exc.errorCode()) {
+                case JDWP.Error.INVALID_FRAMEID:
+                case JDWP.Error.THREAD_NOT_SUSPENDED:
+                case JDWP.Error.INVALID_THREAD:
+                    throw new InvalidStackFrameException();
+                default:
+                    throw exc.toJDIException();
+            }
+        }
+
+        if (count != values.length) {
+            throw new InternalException(
+                      "Wrong number of values returned from target VM");
+        }
+        return Arrays.asList((Value[])values);
+    }
+
+    void pop() throws IncompatibleThreadStateException {
+        validateStackFrame();
+        // flush caches and disable caching until command completion
+        CommandSender sender =
+            new CommandSender() {
+                public PacketStream send() {
+                    return JDWP.StackFrame.PopFrames.enqueueCommand(vm,
+                                 thread, id);
+                }
+        };
+        try {
+            PacketStream stream = thread.sendResumingCommand(sender);
+            JDWP.StackFrame.PopFrames.waitForReply(vm, stream);
+        } catch (JDWPException exc) {
+            switch (exc.errorCode()) {
+            case JDWP.Error.THREAD_NOT_SUSPENDED:
+                throw new IncompatibleThreadStateException(
+                         "Thread not current or suspended");
+            case JDWP.Error.INVALID_THREAD:   /* zombie */
+                throw new IncompatibleThreadStateException("zombie");
+            case JDWP.Error.NO_MORE_FRAMES:
+                throw new InvalidStackFrameException(
+                         "No more frames on the stack");
+            default:
+                throw exc.toJDIException();
+            }
+        }
+
+        // enable caching - suspended again
+        vm.state().freeze();
+    }
+
+    public String toString() {
+       return location.toString() + " in thread " + thread.toString();
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/StratumLineInfo.java b/src/share/classes/com/sun/tools/jdi/StratumLineInfo.java
new file mode 100644
index 0000000..197b5bd
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/StratumLineInfo.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+class StratumLineInfo implements LineInfo {
+    private final String stratumID;
+    private final int lineNumber;
+    private final String sourceName;
+    private final String sourcePath;
+
+    StratumLineInfo(String stratumID, int lineNumber,
+                    String sourceName, String sourcePath) {
+        this.stratumID = stratumID;
+        this.lineNumber = lineNumber;
+        this.sourceName = sourceName;
+        this.sourcePath = sourcePath;
+    }
+
+    public String liStratum() {
+        return stratumID;
+    }
+
+    public int liLineNumber() {
+        return lineNumber;
+    }
+
+    public String liSourceName()
+                            throws AbsentInformationException {
+        if (sourceName == null) {
+            throw new AbsentInformationException();
+        }
+        return sourceName;
+    }
+
+    public String liSourcePath()
+                            throws AbsentInformationException {
+        if (sourcePath == null) {
+            throw new AbsentInformationException();
+        }
+        return sourcePath;
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/StringReferenceImpl.java b/src/share/classes/com/sun/tools/jdi/StringReferenceImpl.java
new file mode 100644
index 0000000..eeeec68
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/StringReferenceImpl.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+public class StringReferenceImpl extends ObjectReferenceImpl
+    implements StringReference
+{
+    private String value;
+
+    StringReferenceImpl(VirtualMachine aVm,long aRef) {
+        super(aVm,aRef);
+    }
+
+    public String value() {
+        if(value == null) {
+            // Does not need synchronization, since worst-case
+            // static info is fetched twice
+            try {
+                value = JDWP.StringReference.Value.
+                    process(vm, this).stringValue;
+            } catch (JDWPException exc) {
+                throw exc.toJDIException();
+            }
+        }
+        return value;
+    }
+
+    public String toString() {
+        return "\"" + value() + "\"";
+    }
+
+    byte typeValueKey() {
+        return JDWP.Tag.STRING;
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/SunCommandLineLauncher.java b/src/share/classes/com/sun/tools/jdi/SunCommandLineLauncher.java
new file mode 100644
index 0000000..84a1455
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/SunCommandLineLauncher.java
@@ -0,0 +1,240 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.tools.jdi.*;
+import com.sun.jdi.connect.*;
+import com.sun.jdi.connect.spi.*;
+import com.sun.jdi.VirtualMachine;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Random;
+import java.io.IOException;
+import java.io.File;
+
+public class SunCommandLineLauncher extends AbstractLauncher implements LaunchingConnector {
+
+    static private final String ARG_HOME = "home";
+    static private final String ARG_OPTIONS = "options";
+    static private final String ARG_MAIN = "main";
+    static private final String ARG_INIT_SUSPEND = "suspend";
+    static private final String ARG_QUOTE = "quote";
+    static private final String ARG_VM_EXEC = "vmexec";
+
+    TransportService transportService;
+    Transport transport;
+    boolean usingSharedMemory = false;
+
+    TransportService transportService() {
+        return transportService;
+    }
+
+    public Transport transport() {
+        return transport;
+    }
+
+    public SunCommandLineLauncher() {
+        super();
+
+        /**
+         * By default this connector uses either the shared memory
+         * transport or the socket transport
+         */
+        try {
+            Class<?> c = Class.forName("com.sun.tools.jdi.SharedMemoryTransportService");
+            transportService = (TransportService)c.newInstance();
+            transport = new Transport() {
+                public String name() {
+                    return "dt_shmem";
+                }
+            };
+            usingSharedMemory = true;
+        } catch (ClassNotFoundException x) {
+        } catch (UnsatisfiedLinkError x) {
+        } catch (InstantiationException x) {
+        } catch (IllegalAccessException x) {
+        };
+        if (transportService == null) {
+            transportService = new SocketTransportService();
+            transport = new Transport() {
+                public String name() {
+                    return "dt_socket";
+                }
+            };
+        }
+
+        addStringArgument(
+                ARG_HOME,
+                getString("sun.home.label"),
+                getString("sun.home"),
+                System.getProperty("java.home"),
+                false);
+        addStringArgument(
+                ARG_OPTIONS,
+                getString("sun.options.label"),
+                getString("sun.options"),
+                "",
+                false);
+        addStringArgument(
+                ARG_MAIN,
+                getString("sun.main.label"),
+                getString("sun.main"),
+                "",
+                true);
+
+        addBooleanArgument(
+                ARG_INIT_SUSPEND,
+                getString("sun.init_suspend.label"),
+                getString("sun.init_suspend"),
+                true,
+                false);
+
+        addStringArgument(
+                ARG_QUOTE,
+                getString("sun.quote.label"),
+                getString("sun.quote"),
+                "\"",
+                true);
+        addStringArgument(
+                ARG_VM_EXEC,
+                getString("sun.vm_exec.label"),
+                getString("sun.vm_exec"),
+                "java",
+                true);
+    }
+
+    static boolean hasWhitespace(String string) {
+        int length = string.length();
+        for (int i = 0; i < length; i++) {
+            if (Character.isWhitespace(string.charAt(i))) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public VirtualMachine
+        launch(Map<String,? extends Connector.Argument> arguments)
+        throws IOException, IllegalConnectorArgumentsException,
+               VMStartException
+    {
+        VirtualMachine vm;
+
+        String home = argument(ARG_HOME, arguments).value();
+        String options = argument(ARG_OPTIONS, arguments).value();
+        String mainClassAndArgs = argument(ARG_MAIN, arguments).value();
+        boolean wait = ((BooleanArgumentImpl)argument(ARG_INIT_SUSPEND,
+                                                  arguments)).booleanValue();
+        String quote = argument(ARG_QUOTE, arguments).value();
+        String exe = argument(ARG_VM_EXEC, arguments).value();
+        String exePath = null;
+
+        if (quote.length() > 1) {
+            throw new IllegalConnectorArgumentsException("Invalid length",
+                                                         ARG_QUOTE);
+        }
+
+        if ((options.indexOf("-Djava.compiler=") != -1) &&
+            (options.toLowerCase().indexOf("-djava.compiler=none") == -1)) {
+            throw new IllegalConnectorArgumentsException("Cannot debug with a JIT compiler",
+                                                         ARG_OPTIONS);
+        }
+
+        /*
+         * Start listening.
+         * If we're using the shared memory transport then we pick a
+         * random address rather than using the (fixed) default.
+         * Random() uses System.currentTimeMillis() as the seed
+         * which can be a problem on windows (many calls to
+         * currentTimeMillis can return the same value), so
+         * we do a few retries if we get an IOException (we
+         * assume the IOException is the filename is already in use.)
+         */
+        TransportService.ListenKey listenKey;
+        if (usingSharedMemory) {
+            Random rr = new Random();
+            int failCount = 0;
+            while(true) {
+                try {
+                    String address = "javadebug" +
+                        String.valueOf(rr.nextInt(100000));
+                    listenKey = transportService().startListening(address);
+                    break;
+                } catch (IOException ioe) {
+                    if (++failCount > 5) {
+                        throw ioe;
+                    }
+                }
+            }
+        } else {
+            listenKey = transportService().startListening();
+        }
+        String address = listenKey.address();
+
+        try {
+            if (home.length() > 0) {
+                exePath = home + File.separator + "bin" + File.separator + exe;
+            } else {
+                exePath = exe;
+            }
+            // Quote only if necessary in case the quote arg value is bogus
+            if (hasWhitespace(exePath)) {
+                exePath = quote + exePath + quote;
+            }
+
+            String xrun = "transport=" + transport().name() +
+                          ",address=" + address +
+                          ",suspend=" + (wait? 'y' : 'n');
+            // Quote only if necessary in case the quote arg value is bogus
+            if (hasWhitespace(xrun)) {
+                xrun = quote + xrun + quote;
+            }
+
+            String command = exePath + ' ' +
+                             options + ' ' +
+                             "-Xdebug " +
+                             "-Xrunjdwp:" + xrun + ' ' +
+                             mainClassAndArgs;
+
+            // System.err.println("Command: \"" + command + '"');
+            vm = launch(tokenizeCommand(command, quote.charAt(0)), address, listenKey,
+                        transportService());
+        } finally {
+            transportService().stopListening(listenKey);
+        }
+
+        return vm;
+    }
+
+    public String name() {
+        return "com.sun.jdi.CommandLineLaunch";
+    }
+
+    public String description() {
+        return getString("sun.description");
+
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/TargetVM.java b/src/share/classes/com/sun/tools/jdi/TargetVM.java
new file mode 100644
index 0000000..b4fdcb8
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/TargetVM.java
@@ -0,0 +1,378 @@
+/*
+ * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+import com.sun.jdi.event.*;
+import com.sun.jdi.connect.spi.Connection;
+import com.sun.jdi.event.EventSet;
+
+import java.util.*;
+import java.io.IOException;
+
+public class TargetVM implements Runnable {
+    private Map<String, Packet> waitingQueue = new HashMap<String, Packet>(32,0.75f);
+    private boolean shouldListen = true;
+    private List<EventQueue> eventQueues = Collections.synchronizedList(new ArrayList<EventQueue>(2));
+    private VirtualMachineImpl vm;
+    private Connection connection;
+    private Thread readerThread;
+    private EventController eventController = null;
+    private boolean eventsHeld = false;
+
+    /*
+     * TO DO: The limit numbers below are somewhat arbitrary and should
+     * be configurable in the future.
+     */
+    static private final int OVERLOADED_QUEUE = 2000;
+    static private final int UNDERLOADED_QUEUE = 100;
+
+    TargetVM(VirtualMachineImpl vm, Connection connection) {
+        this.vm = vm;
+        this.connection = connection;
+        this.readerThread = new Thread(vm.threadGroupForJDI(),
+                                       this, "JDI Target VM Interface");
+        this.readerThread.setDaemon(true);
+    }
+
+    void start() {
+        readerThread.start();
+    }
+
+    private void dumpPacket(Packet packet, boolean sending) {
+        String direction = sending ? "Sending" : "Receiving";
+        if (sending) {
+            vm.printTrace(direction + " Command. id=" + packet.id +
+                          ", length=" + packet.data.length +
+                          ", commandSet=" + packet.cmdSet +
+                          ", command=" + packet.cmd +
+                          ", flags=" + packet.flags);
+        } else {
+            String type = (packet.flags & Packet.Reply) != 0 ?
+                          "Reply" : "Event";
+            vm.printTrace(direction + " " + type + ". id=" + packet.id +
+                          ", length=" + packet.data.length +
+                          ", errorCode=" + packet.errorCode +
+                          ", flags=" + packet.flags);
+        }
+        StringBuffer line = new StringBuffer(80);
+        line.append("0000: ");
+        for (int i = 0; i < packet.data.length; i++) {
+            if ((i > 0) && (i % 16 == 0)) {
+                vm.printTrace(line.toString());
+                line.setLength(0);
+                line.append(String.valueOf(i));
+                line.append(": ");
+                int len = line.length();
+                for (int j = 0; j < 6 - len; j++) {
+                    line.insert(0, '0');
+                }
+            }
+            int val = 0xff & packet.data[i];
+            String str = Integer.toHexString(val);
+            if (str.length() == 1) {
+                line.append('0');
+            }
+            line.append(str);
+            line.append(' ');
+        }
+        if (line.length() > 6) {
+            vm.printTrace(line.toString());
+        }
+    }
+
+    public void run() {
+        if ((vm.traceFlags & VirtualMachine.TRACE_SENDS) != 0) {
+            vm.printTrace("Target VM interface thread running");
+        }
+        Packet p=null,p2;
+        String idString;
+
+        while(shouldListen) {
+
+            boolean done = false;
+            try {
+                byte b[] = connection.readPacket();
+                if (b.length == 0) {
+                    done = true;
+                }
+                p = Packet.fromByteArray(b);
+            } catch (IOException e) {
+                done = true;
+            }
+
+            if (done) {
+                shouldListen = false;
+                try {
+                    connection.close();
+                } catch (IOException ioe) { }
+                break;
+            }
+
+            if ((vm.traceFlags & VirtualMachineImpl.TRACE_RAW_RECEIVES) != 0)  {
+                dumpPacket(p, false);
+            }
+
+            if((p.flags & Packet.Reply) == 0) {
+                // It's a command
+                handleVMCommand(p);
+            } else {
+                /*if(p.errorCode != Packet.ReplyNoError) {
+                    System.err.println("Packet " + p.id + " returned failure = " + p.errorCode);
+                }*/
+
+                vm.state().notifyCommandComplete(p.id);
+                idString = String.valueOf(p.id);
+
+                synchronized(waitingQueue) {
+                    p2 = waitingQueue.get(idString);
+
+                    if (p2 != null)
+                        waitingQueue.remove(idString);
+                }
+
+                if(p2 == null) {
+                    // Whoa! a reply without a sender. Problem.
+                    // FIX ME! Need to post an error.
+
+                    System.err.println("Recieved reply with no sender!");
+                    continue;
+                }
+                p2.errorCode = p.errorCode;
+                p2.data = p.data;
+                p2.replied = true;
+
+                synchronized(p2) {
+                    p2.notify();
+                }
+            }
+        }
+
+        // inform the VM mamager that this VM is history
+        vm.vmManager.disposeVirtualMachine(vm);
+
+        if (eventController != null) {
+            eventController.release();
+        }
+
+        // close down all the event queues
+        // Closing a queue causes a VMDisconnectEvent to
+        // be put onto the queue.
+        synchronized(eventQueues) {
+            Iterator<EventQueue> iter = eventQueues.iterator();
+            while (iter.hasNext()) {
+                ((EventQueueImpl)iter.next()).close();
+            }
+        }
+
+        // indirectly throw VMDisconnectedException to
+        // command requesters.
+        synchronized(waitingQueue) {
+            Iterator<Packet> iter = waitingQueue.values().iterator();
+            while (iter.hasNext()) {
+                Packet packet = iter.next();
+                synchronized(packet) {
+                    packet.notify();
+                }
+            }
+            waitingQueue.clear();
+        }
+
+        if ((vm.traceFlags & VirtualMachine.TRACE_SENDS) != 0) {
+            vm.printTrace("Target VM interface thread exiting");
+        }
+    }
+
+    protected void handleVMCommand(Packet p) {
+        switch (p.cmdSet) {
+            case JDWP.Event.COMMAND_SET:
+                handleEventCmdSet(p);
+                break;
+
+            default:
+                System.err.println("Ignoring cmd " + p.id + "/" +
+                                   p.cmdSet + "/" + p.cmd + " from the VM");
+                return;
+        }
+    }
+
+    /* Events should not be constructed on this thread (the thread
+     * which reads all data from the transport). This means that the
+     * packet cannot be converted to real JDI objects as that may
+     * involve further communications with the back end which would
+     * deadlock.
+     *
+     * Instead the whole packet is passed for lazy eval by a queue
+     * reading thread.
+     */
+    protected void handleEventCmdSet(Packet p) {
+        EventSet eventSet = new EventSetImpl(vm, p);
+
+        if (eventSet != null) {
+            queueEventSet(eventSet);
+        }
+    }
+
+    private EventController eventController() {
+        if (eventController == null) {
+            eventController = new EventController(vm);
+        }
+        return eventController;
+    }
+
+    private synchronized void controlEventFlow(int maxQueueSize) {
+        if (!eventsHeld && (maxQueueSize > OVERLOADED_QUEUE)) {
+            eventController().hold();
+            eventsHeld = true;
+        } else if (eventsHeld && (maxQueueSize < UNDERLOADED_QUEUE)) {
+            eventController().release();
+            eventsHeld = false;
+        }
+    }
+
+    void notifyDequeueEventSet() {
+        int maxQueueSize = 0;
+        synchronized(eventQueues) {
+            Iterator<EventQueue> iter = eventQueues.iterator();
+            while (iter.hasNext()) {
+                EventQueueImpl queue = (EventQueueImpl)iter.next();
+                maxQueueSize = Math.max(maxQueueSize, queue.size());
+            }
+        }
+        controlEventFlow(maxQueueSize);
+    }
+
+    private void queueEventSet(EventSet eventSet) {
+        int maxQueueSize = 0;
+
+        synchronized(eventQueues) {
+            Iterator<EventQueue> iter = eventQueues.iterator();
+            while (iter.hasNext()) {
+                EventQueueImpl queue = (EventQueueImpl)iter.next();
+                queue.enqueue(eventSet);
+                maxQueueSize = Math.max(maxQueueSize, queue.size());
+            }
+        }
+
+        controlEventFlow(maxQueueSize);
+    }
+
+    void send(Packet packet) {
+        String id = String.valueOf(packet.id);
+
+        synchronized(waitingQueue) {
+            waitingQueue.put(id, packet);
+        }
+
+        if ((vm.traceFlags & VirtualMachineImpl.TRACE_RAW_SENDS) != 0) {
+            dumpPacket(packet, true);
+        }
+
+        try {
+            connection.writePacket(packet.toByteArray());
+        } catch (IOException e) {
+            throw new VMDisconnectedException(e.getMessage());
+        }
+    }
+
+    void waitForReply(Packet packet) {
+        synchronized(packet) {
+            while ((!packet.replied) && shouldListen) {
+                try { packet.wait(); } catch (InterruptedException e) {;}
+            }
+
+            if (!packet.replied) {
+                throw new VMDisconnectedException();
+            }
+        }
+    }
+
+    void addEventQueue(EventQueueImpl queue) {
+        if ((vm.traceFlags & VirtualMachine.TRACE_EVENTS) != 0) {
+            vm.printTrace("New event queue added");
+        }
+        eventQueues.add(queue);
+    }
+
+    void stopListening() {
+        if ((vm.traceFlags & VirtualMachine.TRACE_EVENTS) != 0) {
+            vm.printTrace("Target VM i/f closing event queues");
+        }
+        shouldListen = false;
+        try {
+            connection.close();
+        } catch (IOException ioe) { }
+    }
+
+    private class EventController extends Thread {
+        int controlRequest = 0;
+
+        EventController(VirtualMachineImpl vm) {
+            super(vm.threadGroupForJDI(), "JDI Event Control Thread");
+            setDaemon(true);
+            setPriority((MAX_PRIORITY + NORM_PRIORITY)/2);
+            super.start();
+        }
+
+        synchronized void hold() {
+            controlRequest++;
+            notifyAll();
+        }
+
+        synchronized void release() {
+            controlRequest--;
+            notifyAll();
+        }
+
+        public void run() {
+            while(true) {
+                int currentRequest;
+                synchronized(this) {
+                    while (controlRequest == 0) {
+                        try {wait();} catch (InterruptedException e) {}
+                        if (!shouldListen) return;
+                    }
+                    currentRequest = controlRequest;
+                    controlRequest = 0;
+                }
+                try {
+                    if (currentRequest > 0) {
+                        JDWP.VirtualMachine.HoldEvents.process(vm);
+                    } else {
+                        JDWP.VirtualMachine.ReleaseEvents.process(vm);
+                    }
+                } catch (JDWPException e) {
+                    /*
+                     * Don't want to terminate the thread, so the
+                     * stack trace is printed and we continue.
+                     */
+                    e.toJDIException().printStackTrace(System.err);
+                }
+            }
+        }
+    }
+
+}
diff --git a/src/share/classes/com/sun/tools/jdi/ThreadAction.java b/src/share/classes/com/sun/tools/jdi/ThreadAction.java
new file mode 100644
index 0000000..da50652
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/ThreadAction.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+import java.util.EventObject;
+
+/*
+ * The name "action" is used to avoid confusion
+ * with JDI events.
+ */
+class ThreadAction extends EventObject {
+    private static final long serialVersionUID = 5690763191100515283L;
+    // Event ids
+    /*static final int THREAD_SUSPENDED = 1;*/
+    static final int THREAD_RESUMABLE = 2;
+
+    int id;
+
+    ThreadAction(ThreadReference thread, int id) {
+        super(thread);
+        this.id = id;
+    }
+    ThreadReference thread() {
+        return (ThreadReference)getSource();
+    }
+    int id() {
+        return id;
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/ThreadGroupReferenceImpl.java b/src/share/classes/com/sun/tools/jdi/ThreadGroupReferenceImpl.java
new file mode 100644
index 0000000..c4fd6aa
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/ThreadGroupReferenceImpl.java
@@ -0,0 +1,149 @@
+/*
+ * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+import java.util.*;
+
+public class ThreadGroupReferenceImpl extends ObjectReferenceImpl
+    implements ThreadGroupReference, VMListener
+{
+    // Cached components that cannot change
+    String name;
+    ThreadGroupReference parent;
+    boolean triedParent;
+
+    // This is cached only while the VM is suspended
+    private static class Cache extends ObjectReferenceImpl.Cache {
+        JDWP.ThreadGroupReference.Children kids = null;
+    }
+
+    protected ObjectReferenceImpl.Cache newCache() {
+        return new Cache();
+    }
+
+    ThreadGroupReferenceImpl(VirtualMachine aVm,long aRef) {
+        super(aVm,aRef);
+        vm.state().addListener(this);
+    }
+
+    protected String description() {
+        return "ThreadGroupReference " + uniqueID();
+    }
+
+    public String name() {
+        if (name == null) {
+            // Does not need synchronization, since worst-case
+            // static info is fetched twice (Thread group name
+            // cannot change)
+            try {
+                name = JDWP.ThreadGroupReference.Name.
+                                     process(vm, this).groupName;
+            } catch (JDWPException exc) {
+                throw exc.toJDIException();
+            }
+        }
+        return name;
+    }
+
+    public ThreadGroupReference parent() {
+        if (!triedParent) {
+            // Does not need synchronization, since worst-case
+            // static info is fetched twice (Thread group parent cannot
+            // change)
+            try {
+                parent = JDWP.ThreadGroupReference.Parent.
+                                 process(vm, this).parentGroup;
+                triedParent = true;
+            } catch (JDWPException exc) {
+                throw exc.toJDIException();
+            }
+        }
+       return parent;
+    }
+
+    public void suspend() {
+        for (ThreadReference thread : threads()) {
+            thread.suspend();
+        }
+
+        for (ThreadGroupReference threadGroup : threadGroups()) {
+            threadGroup.suspend();
+        }
+    }
+
+    public void resume() {
+        for (ThreadReference thread : threads()) {
+            thread.resume();
+        }
+
+        for (ThreadGroupReference threadGroup : threadGroups()) {
+            threadGroup.resume();
+        }
+    }
+
+    private JDWP.ThreadGroupReference.Children kids() {
+        JDWP.ThreadGroupReference.Children kids = null;
+        try {
+            Cache local = (Cache)getCache();
+
+            if (local != null) {
+                kids = local.kids;
+            }
+            if (kids == null) {
+                kids = JDWP.ThreadGroupReference.Children
+                                                  .process(vm, this);
+                if (local != null) {
+                    local.kids = kids;
+                    if ((vm.traceFlags & VirtualMachine.TRACE_OBJREFS) != 0) {
+                        vm.printTrace(description() +
+                                      " temporarily caching children ");
+                    }
+                }
+            }
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+        return kids;
+    }
+
+    public List<ThreadReference> threads() {
+        return Arrays.asList((ThreadReference[])kids().childThreads);
+    }
+
+    public List<ThreadGroupReference> threadGroups() {
+        return Arrays.asList((ThreadGroupReference[])kids().childGroups);
+    }
+
+    public String toString() {
+        return "instance of " + referenceType().name() +
+               "(name='" + name() + "', " + "id=" + uniqueID() + ")";
+    }
+
+    byte typeValueKey() {
+        return JDWP.Tag.THREAD_GROUP;
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/ThreadListener.java b/src/share/classes/com/sun/tools/jdi/ThreadListener.java
new file mode 100644
index 0000000..d14622c
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/ThreadListener.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+import java.util.EventListener;
+
+interface ThreadListener extends EventListener {
+    boolean threadResumable(ThreadAction action);
+    /*
+     * Not needed for current implementation, and hard to implement
+     * correctly. (See TargetVM.handleEventCmdSet)
+     *   void threadSuspended(ThreadAction action);
+     */
+}
diff --git a/src/share/classes/com/sun/tools/jdi/ThreadReferenceImpl.java b/src/share/classes/com/sun/tools/jdi/ThreadReferenceImpl.java
new file mode 100644
index 0000000..9034771
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/ThreadReferenceImpl.java
@@ -0,0 +1,644 @@
+/*
+ * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+import com.sun.jdi.request.BreakpointRequest;
+import java.util.*;
+import java.lang.ref.WeakReference;
+
+public class ThreadReferenceImpl extends ObjectReferenceImpl
+             implements ThreadReference, VMListener {
+    static final int SUSPEND_STATUS_SUSPENDED = 0x1;
+    static final int SUSPEND_STATUS_BREAK = 0x2;
+
+    private int suspendedZombieCount = 0;
+
+    /*
+     * Some objects can only be created while a thread is suspended and are valid
+     * only while the thread remains suspended.  Examples are StackFrameImpl
+     * and MonitorInfoImpl.  When the thread resumes, these objects have to be
+     * marked as invalid so that their methods can throw
+     * InvalidStackFrameException if they are called.  To do this, such objects
+     * register themselves as listeners of the associated thread.  When the
+     * thread is resumed, its listeners are notified and mark themselves
+     * invalid.
+     * Also, note that ThreadReferenceImpl itself caches some info that
+     * is valid only as long as the thread is suspended.  When the thread
+     * is resumed, that cache must be purged.
+     * Lastly, note that ThreadReferenceImpl and its super, ObjectReferenceImpl
+     * cache some info that is only valid as long as the entire VM is suspended.
+     * If _any_ thread is resumed, this cache must be purged.  To handle this,
+     * both ThreadReferenceImpl and ObjectReferenceImpl register themselves as
+     * VMListeners so that they get notified when all threads are suspended and
+     * when any thread is resumed.
+     */
+
+    // This is cached for the life of the thread
+    private ThreadGroupReference threadGroup;
+
+    // This is cached only while this one thread is suspended.  Each time
+    // the thread is resumed, we abandon the current cache object and
+    // create a new initialized one.
+    private static class LocalCache {
+        JDWP.ThreadReference.Status status = null;
+        List<StackFrame> frames = null;
+        int framesStart = -1;
+        int framesLength = 0;
+        int frameCount = -1;
+        List<ObjectReference> ownedMonitors = null;
+        List<MonitorInfo> ownedMonitorsInfo = null;
+        ObjectReference contendedMonitor = null;
+        boolean triedCurrentContended = false;
+    }
+
+    /*
+     * The localCache instance var is set by resetLocalCache to an initialized
+     * object as shown above.  This occurs when the ThreadReference
+     * object is created, and when the mirrored thread is resumed.
+     * The fields are then filled in by the relevant methods as they
+     * are called.  A problem can occur if resetLocalCache is called
+     * (ie, a resume() is executed) at certain points in the execution
+     * of some of these methods - see 6751643.  To avoid this, each
+     * method that wants to use this cache must make a local copy of
+     * this variable and use that.  This means that each invocation of
+     * these methods will use a copy of the cache object that was in
+     * effect at the point that the copy was made; if a racy resume
+     * occurs, it won't affect the method's local copy.  This means that
+     * the values returned by these calls may not match the state of
+     * the debuggee at the time the caller gets the values.  EG,
+     * frameCount() is called and comes up with 5 frames.  But before
+     * it returns this, a resume of the debuggee thread is executed in a
+     * different debugger thread.  The thread is resumed and running at
+     * the time that the value 5 is returned.  Or even worse, the thread
+     * could be suspended again and have a different number of frames, eg, 24,
+     * but this call will still return 5.
+     */
+    private LocalCache localCache;
+
+    private void resetLocalCache() {
+        localCache = new LocalCache();
+    }
+
+    // This is cached only while all threads in the VM are suspended
+    // Yes, someone could change the name of a thread while it is suspended.
+    private static class Cache extends ObjectReferenceImpl.Cache {
+        String name = null;
+    }
+    protected ObjectReferenceImpl.Cache newCache() {
+        return new Cache();
+    }
+
+    // Listeners - synchronized on vm.state()
+    private List<WeakReference<ThreadListener>> listeners = new ArrayList<WeakReference<ThreadListener>>();
+
+
+    ThreadReferenceImpl(VirtualMachine aVm, long aRef) {
+        super(aVm,aRef);
+        resetLocalCache();
+        vm.state().addListener(this);
+    }
+
+    protected String description() {
+        return "ThreadReference " + uniqueID();
+    }
+
+    /*
+     * VMListener implementation
+     */
+    public boolean vmNotSuspended(VMAction action) {
+        if (action.resumingThread() == null) {
+            // all threads are being resumed
+            synchronized (vm.state()) {
+                processThreadAction(new ThreadAction(this,
+                                            ThreadAction.THREAD_RESUMABLE));
+            }
+
+        }
+
+        /*
+         * Othewise, only one thread is being resumed:
+         *   if it is us,
+         *      we have already done our processThreadAction to notify our
+         *      listeners when we processed the resume.
+         *   if it is not us,
+         *      we don't want to notify our listeners
+         *       because we are not being resumed.
+         */
+        return super.vmNotSuspended(action);
+    }
+
+    /**
+     * Note that we only cache the name string while the entire VM is suspended
+     * because the name can change via Thread.setName arbitrarily while this
+     * thread is running.
+     */
+    public String name() {
+        String name = null;
+        try {
+            Cache local = (Cache)getCache();
+
+            if (local != null) {
+                name = local.name;
+            }
+            if (name == null) {
+                name = JDWP.ThreadReference.Name.process(vm, this)
+                                                             .threadName;
+                if (local != null) {
+                    local.name = name;
+                }
+            }
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+        return name;
+    }
+
+    /*
+     * Sends a command to the back end which is defined to do an
+     * implicit vm-wide resume.
+     */
+    PacketStream sendResumingCommand(CommandSender sender) {
+        synchronized (vm.state()) {
+            processThreadAction(new ThreadAction(this,
+                                        ThreadAction.THREAD_RESUMABLE));
+            return sender.send();
+        }
+    }
+
+    public void suspend() {
+        try {
+            JDWP.ThreadReference.Suspend.process(vm, this);
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+        // Don't consider the thread suspended yet. On reply, notifySuspend()
+        // will be called.
+    }
+
+    public void resume() {
+        /*
+         * If it's a zombie, we can just update internal state without
+         * going to back end.
+         */
+        if (suspendedZombieCount > 0) {
+            suspendedZombieCount--;
+            return;
+        }
+
+        PacketStream stream;
+        synchronized (vm.state()) {
+            processThreadAction(new ThreadAction(this,
+                                      ThreadAction.THREAD_RESUMABLE));
+            stream = JDWP.ThreadReference.Resume.enqueueCommand(vm, this);
+        }
+        try {
+            JDWP.ThreadReference.Resume.waitForReply(vm, stream);
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+    }
+
+    public int suspendCount() {
+        /*
+         * If it's a zombie, we maintain the count in the front end.
+         */
+        if (suspendedZombieCount > 0) {
+            return suspendedZombieCount;
+        }
+
+        try {
+            return JDWP.ThreadReference.SuspendCount.process(vm, this).suspendCount;
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+    }
+
+    public void stop(ObjectReference throwable) throws InvalidTypeException {
+        validateMirror(throwable);
+        // Verify that the given object is a Throwable instance
+        List<ReferenceType> list = vm.classesByName("java.lang.Throwable");
+        ClassTypeImpl throwableClass = (ClassTypeImpl)list.get(0);
+        if ((throwable == null) ||
+            !throwableClass.isAssignableFrom(throwable)) {
+             throw new InvalidTypeException("Not an instance of Throwable");
+        }
+
+        try {
+            JDWP.ThreadReference.Stop.process(vm, this,
+                                         (ObjectReferenceImpl)throwable);
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+    }
+
+    public void interrupt() {
+        try {
+            JDWP.ThreadReference.Interrupt.process(vm, this);
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+    }
+
+    private JDWP.ThreadReference.Status jdwpStatus() {
+        LocalCache snapshot = localCache;
+        JDWP.ThreadReference.Status myStatus = snapshot.status;
+        try {
+             if (myStatus == null) {
+                 myStatus = JDWP.ThreadReference.Status.process(vm, this);
+                if ((myStatus.suspendStatus & SUSPEND_STATUS_SUSPENDED) != 0) {
+                    // thread is suspended, we can cache the status.
+                    snapshot.status = myStatus;
+                }
+            }
+         } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+        return myStatus;
+    }
+
+    public int status() {
+        return jdwpStatus().threadStatus;
+    }
+
+    public boolean isSuspended() {
+        return ((suspendedZombieCount > 0) ||
+                ((jdwpStatus().suspendStatus & SUSPEND_STATUS_SUSPENDED) != 0));
+    }
+
+    public boolean isAtBreakpoint() {
+        /*
+         * TO DO: This fails to take filters into account.
+         */
+        try {
+            StackFrame frame = frame(0);
+            Location location = frame.location();
+            List<BreakpointRequest> requests = vm.eventRequestManager().breakpointRequests();
+            Iterator<BreakpointRequest> iter = requests.iterator();
+            while (iter.hasNext()) {
+                BreakpointRequest request = iter.next();
+                if (location.equals(request.location())) {
+                    return true;
+                }
+            }
+            return false;
+        } catch (IndexOutOfBoundsException iobe) {
+            return false;  // no frames on stack => not at breakpoint
+        } catch (IncompatibleThreadStateException itse) {
+            // Per the javadoc, not suspended => return false
+            return false;
+        }
+    }
+
+    public ThreadGroupReference threadGroup() {
+        /*
+         * Thread group can't change, so it's cached once and for all.
+         */
+        if (threadGroup == null) {
+            try {
+                threadGroup = JDWP.ThreadReference.ThreadGroup.
+                    process(vm, this).group;
+            } catch (JDWPException exc) {
+                throw exc.toJDIException();
+            }
+        }
+        return threadGroup;
+    }
+
+    public int frameCount() throws IncompatibleThreadStateException  {
+        LocalCache snapshot = localCache;
+        try {
+            if (snapshot.frameCount == -1) {
+                snapshot.frameCount = JDWP.ThreadReference.FrameCount
+                                          .process(vm, this).frameCount;
+            }
+        } catch (JDWPException exc) {
+            switch (exc.errorCode()) {
+            case JDWP.Error.THREAD_NOT_SUSPENDED:
+            case JDWP.Error.INVALID_THREAD:   /* zombie */
+                throw new IncompatibleThreadStateException();
+            default:
+                throw exc.toJDIException();
+            }
+        }
+        return snapshot.frameCount;
+    }
+
+    public List<StackFrame> frames() throws IncompatibleThreadStateException  {
+        return privateFrames(0, -1);
+    }
+
+    public StackFrame frame(int index) throws IncompatibleThreadStateException  {
+        List<StackFrame> list = privateFrames(index, 1);
+        return list.get(0);
+    }
+
+    /**
+     * Is the requested subrange within what has been retrieved?
+     * local is known to be non-null.  Should only be called from
+     * a sync method.
+     */
+    private boolean isSubrange(LocalCache snapshot,
+                               int start, int length) {
+        if (start < snapshot.framesStart) {
+            return false;
+        }
+        if (length == -1) {
+            return (snapshot.framesLength == -1);
+        }
+        if (snapshot.framesLength == -1) {
+            if ((start + length) > (snapshot.framesStart +
+                                    snapshot.frames.size())) {
+                throw new IndexOutOfBoundsException();
+            }
+            return true;
+        }
+        return ((start + length) <= (snapshot.framesStart + snapshot.framesLength));
+    }
+
+    public List<StackFrame> frames(int start, int length)
+                              throws IncompatibleThreadStateException  {
+        if (length < 0) {
+            throw new IndexOutOfBoundsException(
+                "length must be greater than or equal to zero");
+        }
+        return privateFrames(start, length);
+    }
+
+    /**
+     * Private version of frames() allows "-1" to specify all
+     * remaining frames.
+     */
+    synchronized private List<StackFrame> privateFrames(int start, int length)
+                              throws IncompatibleThreadStateException  {
+
+        // Lock must be held while creating stack frames so if that two threads
+        // do this at the same time, one won't clobber the subset created by the other.
+        LocalCache snapshot = localCache;
+        try {
+            if (snapshot.frames == null || !isSubrange(snapshot, start, length)) {
+                JDWP.ThreadReference.Frames.Frame[] jdwpFrames
+                    = JDWP.ThreadReference.Frames.
+                    process(vm, this, start, length).frames;
+                int count = jdwpFrames.length;
+                snapshot.frames = new ArrayList<StackFrame>(count);
+
+                for (int i = 0; i<count; i++) {
+                    if (jdwpFrames[i].location == null) {
+                        throw new InternalException("Invalid frame location");
+                    }
+                    StackFrame frame = new StackFrameImpl(vm, this,
+                                                          jdwpFrames[i].frameID,
+                                                          jdwpFrames[i].location);
+                    // Add to the frame list
+                    snapshot.frames.add(frame);
+                }
+                snapshot.framesStart = start;
+                snapshot.framesLength = length;
+                return Collections.unmodifiableList(snapshot.frames);
+            } else {
+                int fromIndex = start - snapshot.framesStart;
+                int toIndex;
+                if (length == -1) {
+                    toIndex = snapshot.frames.size() - fromIndex;
+                } else {
+                    toIndex = fromIndex + length;
+                }
+                return Collections.unmodifiableList(snapshot.frames.subList(fromIndex, toIndex));
+            }
+        } catch (JDWPException exc) {
+            switch (exc.errorCode()) {
+            case JDWP.Error.THREAD_NOT_SUSPENDED:
+            case JDWP.Error.INVALID_THREAD:   /* zombie */
+                throw new IncompatibleThreadStateException();
+            default:
+                throw exc.toJDIException();
+            }
+        }
+    }
+
+    public List<ObjectReference> ownedMonitors()  throws IncompatibleThreadStateException  {
+        LocalCache snapshot = localCache;
+        try {
+            if (snapshot.ownedMonitors == null) {
+                snapshot.ownedMonitors = Arrays.asList(
+                                 (ObjectReference[])JDWP.ThreadReference.OwnedMonitors.
+                                         process(vm, this).owned);
+                if ((vm.traceFlags & VirtualMachine.TRACE_OBJREFS) != 0) {
+                    vm.printTrace(description() +
+                                  " temporarily caching owned monitors"+
+                                  " (count = " + snapshot.ownedMonitors.size() + ")");
+                }
+            }
+        } catch (JDWPException exc) {
+            switch (exc.errorCode()) {
+            case JDWP.Error.THREAD_NOT_SUSPENDED:
+            case JDWP.Error.INVALID_THREAD:   /* zombie */
+                throw new IncompatibleThreadStateException();
+            default:
+                throw exc.toJDIException();
+            }
+        }
+        return snapshot.ownedMonitors;
+    }
+
+    public ObjectReference currentContendedMonitor()
+                              throws IncompatibleThreadStateException  {
+        LocalCache snapshot = localCache;
+        try {
+            if (snapshot.contendedMonitor == null &&
+                !snapshot.triedCurrentContended) {
+                snapshot.contendedMonitor = JDWP.ThreadReference.CurrentContendedMonitor.
+                    process(vm, this).monitor;
+                snapshot.triedCurrentContended = true;
+                if ((snapshot.contendedMonitor != null) &&
+                    ((vm.traceFlags & VirtualMachine.TRACE_OBJREFS) != 0)) {
+                    vm.printTrace(description() +
+                                  " temporarily caching contended monitor"+
+                                  " (id = " + snapshot.contendedMonitor.uniqueID() + ")");
+                }
+            }
+        } catch (JDWPException exc) {
+            switch (exc.errorCode()) {
+            case JDWP.Error.THREAD_NOT_SUSPENDED:
+            case JDWP.Error.INVALID_THREAD:   /* zombie */
+                throw new IncompatibleThreadStateException();
+            default:
+                throw exc.toJDIException();
+            }
+        }
+        return snapshot.contendedMonitor;
+    }
+
+    public List<MonitorInfo> ownedMonitorsAndFrames()  throws IncompatibleThreadStateException  {
+        LocalCache snapshot = localCache;
+        try {
+            if (snapshot.ownedMonitorsInfo == null) {
+                JDWP.ThreadReference.OwnedMonitorsStackDepthInfo.monitor[] minfo;
+                minfo = JDWP.ThreadReference.OwnedMonitorsStackDepthInfo.process(vm, this).owned;
+
+                snapshot.ownedMonitorsInfo = new ArrayList<MonitorInfo>(minfo.length);
+
+                for (int i=0; i < minfo.length; i++) {
+                    JDWP.ThreadReference.OwnedMonitorsStackDepthInfo.monitor mi =
+                                                                         minfo[i];
+                    MonitorInfo mon = new MonitorInfoImpl(vm, minfo[i].monitor, this, minfo[i].stack_depth);
+                    snapshot.ownedMonitorsInfo.add(mon);
+                }
+
+                if ((vm.traceFlags & VirtualMachine.TRACE_OBJREFS) != 0) {
+                    vm.printTrace(description() +
+                                  " temporarily caching owned monitors"+
+                                  " (count = " + snapshot.ownedMonitorsInfo.size() + ")");
+                    }
+                }
+
+        } catch (JDWPException exc) {
+            switch (exc.errorCode()) {
+            case JDWP.Error.THREAD_NOT_SUSPENDED:
+            case JDWP.Error.INVALID_THREAD:   /* zombie */
+                throw new IncompatibleThreadStateException();
+            default:
+                throw exc.toJDIException();
+            }
+        }
+        return snapshot.ownedMonitorsInfo;
+    }
+
+    public void popFrames(StackFrame frame) throws IncompatibleThreadStateException {
+        // Note that interface-wise this functionality belongs
+        // here in ThreadReference, but implementation-wise it
+        // belongs in StackFrame, so we just forward it.
+        if (!frame.thread().equals(this)) {
+            throw new IllegalArgumentException("frame does not belong to this thread");
+        }
+        if (!vm.canPopFrames()) {
+            throw new UnsupportedOperationException(
+                "target does not support popping frames");
+        }
+        ((StackFrameImpl)frame).pop();
+    }
+
+    public void forceEarlyReturn(Value  returnValue) throws InvalidTypeException,
+                                                            ClassNotLoadedException,
+                                             IncompatibleThreadStateException {
+        if (!vm.canForceEarlyReturn()) {
+            throw new UnsupportedOperationException(
+                "target does not support the forcing of a method to return early");
+        }
+
+        validateMirrorOrNull(returnValue);
+
+        StackFrameImpl sf;
+        try {
+           sf = (StackFrameImpl)frame(0);
+        } catch (IndexOutOfBoundsException exc) {
+           throw new InvalidStackFrameException("No more frames on the stack");
+        }
+        sf.validateStackFrame();
+        MethodImpl meth = (MethodImpl)sf.location().method();
+        ValueImpl convertedValue  = ValueImpl.prepareForAssignment(returnValue,
+                                                                   meth.getReturnValueContainer());
+
+        try {
+            JDWP.ThreadReference.ForceEarlyReturn.process(vm, this, convertedValue);
+        } catch (JDWPException exc) {
+            switch (exc.errorCode()) {
+            case JDWP.Error.OPAQUE_FRAME:
+                throw new NativeMethodException();
+            case JDWP.Error.THREAD_NOT_SUSPENDED:
+                throw new IncompatibleThreadStateException(
+                         "Thread not suspended");
+            case JDWP.Error.THREAD_NOT_ALIVE:
+                throw new IncompatibleThreadStateException(
+                                     "Thread has not started or has finished");
+            case JDWP.Error.NO_MORE_FRAMES:
+                throw new InvalidStackFrameException(
+                         "No more frames on the stack");
+            default:
+                throw exc.toJDIException();
+            }
+        }
+    }
+
+    public String toString() {
+        return "instance of " + referenceType().name() +
+               "(name='" + name() + "', " + "id=" + uniqueID() + ")";
+    }
+
+    byte typeValueKey() {
+        return JDWP.Tag.THREAD;
+    }
+
+    void addListener(ThreadListener listener) {
+        synchronized (vm.state()) {
+            listeners.add(new WeakReference<ThreadListener>(listener));
+        }
+    }
+
+    void removeListener(ThreadListener listener) {
+        synchronized (vm.state()) {
+            Iterator<WeakReference<ThreadListener>> iter = listeners.iterator();
+            while (iter.hasNext()) {
+                WeakReference<ThreadListener> ref = iter.next();
+                if (listener.equals(ref.get())) {
+                    iter.remove();
+                    break;
+                }
+            }
+        }
+    }
+
+    /**
+     * Propagate the the thread state change information
+     * to registered listeners.
+     * Must be entered while synchronized on vm.state()
+     */
+    private void processThreadAction(ThreadAction action) {
+        synchronized (vm.state()) {
+            Iterator<WeakReference<ThreadListener>> iter = listeners.iterator();
+            while (iter.hasNext()) {
+                WeakReference<ThreadListener> ref = iter.next();
+                ThreadListener listener = ref.get();
+                if (listener != null) {
+                    switch (action.id()) {
+                        case ThreadAction.THREAD_RESUMABLE:
+                            if (!listener.threadResumable(action)) {
+                                iter.remove();
+                            }
+                            break;
+                    }
+                } else {
+                    // Listener is unreachable; clean up
+                    iter.remove();
+                }
+            }
+
+            // Discard our local cache
+            resetLocalCache();
+        }
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/TypeComponentImpl.java b/src/share/classes/com/sun/tools/jdi/TypeComponentImpl.java
new file mode 100644
index 0000000..593940d
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/TypeComponentImpl.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+import java.util.List;
+
+abstract public class TypeComponentImpl extends MirrorImpl
+    implements TypeComponent
+{
+    protected final long ref;
+    protected final String name;
+    protected final String signature;
+    protected final String genericSignature;
+    protected final ReferenceTypeImpl declaringType;
+    private final int modifiers;
+
+    TypeComponentImpl(VirtualMachine vm, ReferenceTypeImpl declaringType,
+                      long ref,
+                      String name, String signature,
+                      String genericSignature, int modifiers) {
+        // The generic signature is set when this is created.
+        super(vm);
+        this.declaringType = declaringType;
+        this.ref = ref;
+        this.name = name;
+        this.signature = signature;
+        if (genericSignature != null && genericSignature.length() != 0) {
+            this.genericSignature = genericSignature;
+        } else {
+            this.genericSignature = null;
+        }
+        this.modifiers = modifiers;
+    }
+
+    public String name() {
+        return name;
+    }
+
+    public String signature() {
+        return signature;
+    }
+    public String genericSignature() {
+        return genericSignature;
+    }
+
+    public int modifiers() {
+        return modifiers;
+    }
+
+    public ReferenceType declaringType() {
+        return declaringType;
+    }
+
+    public boolean isStatic() {
+        return isModifierSet(VMModifiers.STATIC);
+    }
+
+    public boolean isFinal() {
+        return isModifierSet(VMModifiers.FINAL);
+    }
+
+    public boolean isPrivate() {
+        return isModifierSet(VMModifiers.PRIVATE);
+    }
+
+    public boolean isPackagePrivate() {
+        return !isModifierSet(VMModifiers.PRIVATE
+                              | VMModifiers.PROTECTED
+                              | VMModifiers.PUBLIC);
+    }
+
+    public boolean isProtected() {
+        return isModifierSet(VMModifiers.PROTECTED);
+    }
+
+    public boolean isPublic() {
+        return isModifierSet(VMModifiers.PUBLIC);
+    }
+
+    public boolean isSynthetic() {
+        return isModifierSet(VMModifiers.SYNTHETIC);
+    }
+
+    long ref() {
+        return ref;
+    }
+
+    boolean isModifierSet(int compareBits) {
+        return (modifiers & compareBits) != 0;
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/TypeImpl.java b/src/share/classes/com/sun/tools/jdi/TypeImpl.java
new file mode 100644
index 0000000..5f85184
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/TypeImpl.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 1998, 2005, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+public abstract class TypeImpl extends MirrorImpl implements Type
+{
+    private String myName = null;
+
+    TypeImpl(VirtualMachine vm)
+    {
+        super(vm);
+    }
+
+    public abstract String signature();
+
+    public String name() {
+        if (myName == null) {
+            JNITypeParser parser = new JNITypeParser(signature());
+            myName = parser.typeName();
+        }
+        return myName;
+    }
+
+    public boolean equals(Object obj) {
+        if ((obj != null) && (obj instanceof Type)) {
+            Type other = (Type)obj;
+            return signature().equals(other.signature()) &&
+                   super.equals(obj);
+        } else {
+            return false;
+        }
+    }
+
+    public int hashCode() {
+        return signature().hashCode();
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/VMAction.java b/src/share/classes/com/sun/tools/jdi/VMAction.java
new file mode 100644
index 0000000..242a9d9
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/VMAction.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+import java.util.EventObject;
+
+/*
+ * The name "action" is used to avoid confusion
+ * with JDI events.
+ */
+class VMAction extends EventObject {
+    private static final long serialVersionUID = -1701944679310296090L;
+
+    // Event ids
+    static final int VM_SUSPENDED = 1;
+    static final int VM_NOT_SUSPENDED = 2;
+
+    int id;
+    ThreadReference resumingThread;
+
+    VMAction(VirtualMachine vm, int id) {
+        this(vm, null, id);
+    }
+
+    // For id = VM_NOT_SUSPENDED, if resumingThread != null, then it is
+    // the only thread that is being resumed.
+     VMAction(VirtualMachine vm,  ThreadReference resumingThread, int id) {
+        super(vm);
+        this.id = id;
+        this.resumingThread = resumingThread;
+    }
+    VirtualMachine vm() {
+        return (VirtualMachine)getSource();
+    }
+    int id() {
+        return id;
+    }
+
+    ThreadReference resumingThread() {
+        return resumingThread;
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/VMListener.java b/src/share/classes/com/sun/tools/jdi/VMListener.java
new file mode 100644
index 0000000..9da16b3
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/VMListener.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 1999, 2000, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+import java.util.EventListener;
+
+interface VMListener extends EventListener {
+    boolean vmSuspended(VMAction action);
+    boolean vmNotSuspended(VMAction action);
+}
diff --git a/src/share/classes/com/sun/tools/jdi/VMModifiers.java b/src/share/classes/com/sun/tools/jdi/VMModifiers.java
new file mode 100644
index 0000000..8713521
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/VMModifiers.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+public interface VMModifiers
+{
+    int PUBLIC = 0x00000001;       /* visible to everyone */
+    int PRIVATE = 0x00000002;      /* visible only to the defining class */
+    int PROTECTED = 0x00000004;    /* visible to subclasses */
+    int STATIC = 0x00000008;       /* instance variable is static */
+    int FINAL = 0x00000010;        /* no further subclassing, overriding */
+    int SYNCHRONIZED = 0x00000020; /* wrap method call in monitor lock */
+    int VOLATILE = 0x00000040;     /* can cache in registers */
+    int BRIDGE = 0x00000040;       /* Bridge method generated by compiler */
+    int TRANSIENT = 0x00000080;    /* not persistant */
+    int VARARGS = 0x00000080;      /* Method accepts var. args*/
+    int NATIVE = 0x00000100;       /* implemented in C */
+    int INTERFACE = 0x00000200;    /* class is an interface */
+    int ABSTRACT = 0x00000400;     /* no definition provided */
+    int ENUM_CONSTANT = 0x00004000; /* enum constant field*/
+    int SYNTHETIC = 0xf0000000;    /* not in source code */
+}
diff --git a/src/share/classes/com/sun/tools/jdi/VMState.java b/src/share/classes/com/sun/tools/jdi/VMState.java
new file mode 100644
index 0000000..b4cd56f
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/VMState.java
@@ -0,0 +1,245 @@
+/*
+ * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+import java.lang.ref.WeakReference;
+import java.util.*;
+
+class VMState {
+    private final VirtualMachineImpl vm;
+
+    // Listeners
+    private final List<WeakReference<VMListener>> listeners = new ArrayList<WeakReference<VMListener>>(); // synchronized (this)
+    private boolean notifyingListeners = false;  // synchronized (this)
+
+    /*
+     * Certain information can be cached only when the entire VM is
+     * suspended and there are no pending resumes. The fields below
+     * are used to track whether there are pending resumes. (There
+     * is an assumption that JDWP command ids are increasing over time.)
+     */
+    private int lastCompletedCommandId = 0;   // synchronized (this)
+    private int lastResumeCommandId = 0;      // synchronized (this)
+
+    // This is cached only while the VM is suspended
+    private static class Cache {
+        List<ThreadGroupReference> groups = null;  // cached Top Level ThreadGroups
+        List<ThreadReference> threads = null; // cached Threads
+    }
+
+    private Cache cache = null;               // synchronized (this)
+    private static final Cache markerCache = new Cache();
+
+    private void disableCache() {
+        synchronized (this) {
+            cache = null;
+        }
+    }
+
+    private void enableCache() {
+        synchronized (this) {
+            cache = markerCache;
+        }
+    }
+
+    private Cache getCache() {
+        synchronized (this) {
+            if (cache == markerCache) {
+                cache = new Cache();
+            }
+            return cache;
+        }
+    }
+
+    VMState(VirtualMachineImpl vm) {
+        this.vm = vm;
+    }
+
+    /**
+     * Is the VM currently suspended, for the purpose of caching?
+     * Must be called synchronized on vm.state()
+     */
+    boolean isSuspended() {
+        return cache != null;
+    }
+
+    /*
+     * A JDWP command has been completed (reply has been received).
+     * Update data that tracks pending resume commands.
+     */
+    synchronized void notifyCommandComplete(int id) {
+        lastCompletedCommandId = id;
+    }
+
+    synchronized void freeze() {
+        if (cache == null && (lastCompletedCommandId >= lastResumeCommandId)) {
+            /*
+             * No pending resumes to worry about. The VM is suspended
+             * and additional state can be cached. Notify all
+             * interested listeners.
+             */
+            processVMAction(new VMAction(vm, VMAction.VM_SUSPENDED));
+            enableCache();
+        }
+    }
+
+    synchronized PacketStream thawCommand(CommandSender sender) {
+        PacketStream stream = sender.send();
+        lastResumeCommandId = stream.id();
+        thaw();
+        return stream;
+    }
+
+    /**
+     * All threads are resuming
+     */
+    void thaw() {
+        thaw(null);
+    }
+
+    /**
+     * Tell listeners to invalidate suspend-sensitive caches.
+     * If resumingThread != null, then only that thread is being
+     * resumed.
+     */
+    synchronized void thaw(ThreadReference resumingThread) {
+        if (cache != null) {
+            if ((vm.traceFlags & VirtualMachine.TRACE_OBJREFS) != 0) {
+                vm.printTrace("Clearing VM suspended cache");
+            }
+            disableCache();
+        }
+        processVMAction(new VMAction(vm, resumingThread, VMAction.VM_NOT_SUSPENDED));
+    }
+
+    private synchronized void processVMAction(VMAction action) {
+        if (!notifyingListeners) {
+            // Prevent recursion
+            notifyingListeners = true;
+
+            Iterator<WeakReference<VMListener>> iter = listeners.iterator();
+            while (iter.hasNext()) {
+                WeakReference<VMListener> ref = iter.next();
+                VMListener listener = ref.get();
+                if (listener != null) {
+                    boolean keep = true;
+                    switch (action.id()) {
+                        case VMAction.VM_SUSPENDED:
+                            keep = listener.vmSuspended(action);
+                            break;
+                        case VMAction.VM_NOT_SUSPENDED:
+                            keep = listener.vmNotSuspended(action);
+                            break;
+                    }
+                    if (!keep) {
+                        iter.remove();
+                    }
+                } else {
+                    // Listener is unreachable; clean up
+                    iter.remove();
+                }
+            }
+
+            notifyingListeners = false;
+        }
+    }
+
+    synchronized void addListener(VMListener listener) {
+        listeners.add(new WeakReference<VMListener>(listener));
+    }
+
+    synchronized boolean hasListener(VMListener listener) {
+        return listeners.contains(listener);
+    }
+
+    synchronized void removeListener(VMListener listener) {
+        Iterator<WeakReference<VMListener>> iter = listeners.iterator();
+        while (iter.hasNext()) {
+            WeakReference<VMListener> ref = iter.next();
+            if (listener.equals(ref.get())) {
+                iter.remove();
+                break;
+            }
+        }
+    }
+
+    List<ThreadReference> allThreads() {
+        List<ThreadReference> threads = null;
+        try {
+            Cache local = getCache();
+
+            if (local != null) {
+                // may be stale when returned, but not provably so
+                threads = local.threads;
+            }
+            if (threads == null) {
+                threads = Arrays.asList((ThreadReference[])JDWP.VirtualMachine.AllThreads.
+                                        process(vm).threads);
+                if (local != null) {
+                    local.threads = threads;
+                    if ((vm.traceFlags & VirtualMachine.TRACE_OBJREFS) != 0) {
+                        vm.printTrace("Caching all threads (count = " +
+                                      threads.size() + ") while VM suspended");
+                    }
+                }
+            }
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+        return threads;
+    }
+
+
+    List<ThreadGroupReference> topLevelThreadGroups() {
+        List<ThreadGroupReference> groups = null;
+        try {
+            Cache local = getCache();
+
+            if (local != null) {
+                groups = local.groups;
+            }
+            if (groups == null) {
+                groups = Arrays.asList(
+                                (ThreadGroupReference[])JDWP.VirtualMachine.TopLevelThreadGroups.
+                                       process(vm).groups);
+                if (local != null) {
+                    local.groups = groups;
+                    if ((vm.traceFlags & VirtualMachine.TRACE_OBJREFS) != 0) {
+                        vm.printTrace(
+                          "Caching top level thread groups (count = " +
+                          groups.size() + ") while VM suspended");
+                    }
+                }
+            }
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+        return groups;
+    }
+
+}
diff --git a/src/share/classes/com/sun/tools/jdi/ValueContainer.java b/src/share/classes/com/sun/tools/jdi/ValueContainer.java
new file mode 100644
index 0000000..a0a5135
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/ValueContainer.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+/*
+ * This interface allows us to pass fields, variables, and
+ * array components through the same interfaces. This currently allows
+ * more common code for type checking. In the future we could use it for
+ * more.
+ */
+interface ValueContainer {
+    Type type() throws ClassNotLoadedException;
+    Type findType(String signature) throws ClassNotLoadedException;
+    String typeName();
+    String signature();
+}
diff --git a/src/share/classes/com/sun/tools/jdi/ValueImpl.java b/src/share/classes/com/sun/tools/jdi/ValueImpl.java
new file mode 100644
index 0000000..6a9ca4b
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/ValueImpl.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+abstract class ValueImpl extends MirrorImpl implements Value {
+
+    ValueImpl(VirtualMachine aVm) {
+        super(aVm);
+    }
+
+    static ValueImpl prepareForAssignment(Value value,
+                                          ValueContainer destination)
+                  throws InvalidTypeException, ClassNotLoadedException {
+        if (value == null) {
+            /*
+             * TO DO: Centralize JNI signature knowledge
+             */
+            if (destination.signature().length() == 1) {
+                throw new InvalidTypeException("Can't set a primitive type to null");
+            }
+            return null;    // no further checking or conversion necessary
+        } else {
+            return ((ValueImpl)value).prepareForAssignmentTo(destination);
+        }
+    }
+
+    static byte typeValueKey(Value val) {
+        if (val == null) {
+            return JDWP.Tag.OBJECT;
+        } else {
+            return ((ValueImpl)val).typeValueKey();
+        }
+    }
+
+    abstract ValueImpl prepareForAssignmentTo(ValueContainer destination)
+                 throws InvalidTypeException, ClassNotLoadedException;
+
+    abstract byte typeValueKey();
+}
diff --git a/src/share/classes/com/sun/tools/jdi/VirtualMachineImpl.java b/src/share/classes/com/sun/tools/jdi/VirtualMachineImpl.java
new file mode 100644
index 0000000..83547e4
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/VirtualMachineImpl.java
@@ -0,0 +1,1441 @@
+/*
+ * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+import com.sun.jdi.connect.spi.Connection;
+import com.sun.jdi.request.EventRequestManager;
+import com.sun.jdi.request.EventRequest;
+import com.sun.jdi.request.BreakpointRequest;
+import com.sun.jdi.event.EventQueue;
+
+import java.util.*;
+import java.text.MessageFormat;
+import java.lang.ref.ReferenceQueue;
+import java.lang.ref.Reference;
+import java.lang.ref.SoftReference;
+import java.lang.ref.WeakReference;
+
+class VirtualMachineImpl extends MirrorImpl
+             implements PathSearchingVirtualMachine, ThreadListener {
+    // VM Level exported variables, these
+    // are unique to a given vm
+    public final int sizeofFieldRef;
+    public final int sizeofMethodRef;
+    public final int sizeofObjectRef;
+    public final int sizeofClassRef;
+    public final int sizeofFrameRef;
+
+    final int sequenceNumber;
+
+    private final TargetVM target;
+    private final EventQueueImpl eventQueue;
+    private final EventRequestManagerImpl internalEventRequestManager;
+    private final EventRequestManagerImpl eventRequestManager;
+    final VirtualMachineManagerImpl vmManager;
+    private final ThreadGroup threadGroupForJDI;
+
+    // Allow direct access to this field so that that tracing code slows down
+    // JDI as little as possible when not enabled.
+    int traceFlags = TRACE_NONE;
+
+    static int TRACE_RAW_SENDS     = 0x01000000;
+    static int TRACE_RAW_RECEIVES  = 0x02000000;
+
+    boolean traceReceives = false;   // pre-compute because of frequency
+
+    // ReferenceType access - updated with class prepare and unload events
+    // Protected by "synchronized(this)". "retrievedAllTypes" may be
+    // tested unsynchronized (since once true, it stays true), but must
+    // be set synchronously
+    private Map<Long, ReferenceType> typesByID;
+    private TreeSet<ReferenceType> typesBySignature;
+    private boolean retrievedAllTypes = false;
+
+    // For other languages support
+    private String defaultStratum = null;
+
+    // ObjectReference cache
+    // "objectsByID" protected by "synchronized(this)".
+    private final Map<Long, SoftObjectReference> objectsByID = new HashMap<Long, SoftObjectReference>();
+    private final ReferenceQueue<ObjectReferenceImpl> referenceQueue = new ReferenceQueue<ObjectReferenceImpl>();
+    static private final int DISPOSE_THRESHOLD = 50;
+    private final List<SoftObjectReference> batchedDisposeRequests =
+            Collections.synchronizedList(new ArrayList<SoftObjectReference>(DISPOSE_THRESHOLD + 10));
+
+    // These are cached once for the life of the VM
+    private JDWP.VirtualMachine.Version versionInfo;
+    private JDWP.VirtualMachine.ClassPaths pathInfo;
+    private JDWP.VirtualMachine.Capabilities capabilities = null;
+    private JDWP.VirtualMachine.CapabilitiesNew capabilitiesNew = null;
+
+    // Per-vm singletons for primitive types and for void.
+    // singleton-ness protected by "synchronized(this)".
+    private BooleanType theBooleanType;
+    private ByteType    theByteType;
+    private CharType    theCharType;
+    private ShortType   theShortType;
+    private IntegerType theIntegerType;
+    private LongType    theLongType;
+    private FloatType   theFloatType;
+    private DoubleType  theDoubleType;
+
+    private VoidType    theVoidType;
+
+    private VoidValue voidVal;
+
+    // Launched debuggee process
+    private Process process;
+
+    // coordinates state changes and corresponding listener notifications
+    private VMState state = new VMState(this);
+
+    private Object initMonitor = new Object();
+    private boolean initComplete = false;
+    private boolean shutdown = false;
+
+    private void notifyInitCompletion() {
+        synchronized(initMonitor) {
+            initComplete = true;
+            initMonitor.notifyAll();
+        }
+    }
+
+    void waitInitCompletion() {
+        synchronized(initMonitor) {
+            while (!initComplete) {
+                try {
+                    initMonitor.wait();
+                } catch (InterruptedException e) {
+                    // ignore
+                }
+            }
+        }
+    }
+
+    VMState state() {
+        return state;
+    }
+
+    /*
+     * ThreadListener implementation
+     */
+    public boolean threadResumable(ThreadAction action) {
+        /*
+         * If any thread is resumed, the VM is considered not suspended.
+         * Just one thread is being resumed so pass it to thaw.
+         */
+        state.thaw(action.thread());
+        return true;
+    }
+
+    VirtualMachineImpl(VirtualMachineManager manager,
+                       Connection connection, Process process,
+                       int sequenceNumber) {
+        super(null);  // Can't use super(this)
+        vm = this;
+
+        this.vmManager = (VirtualMachineManagerImpl)manager;
+        this.process = process;
+        this.sequenceNumber = sequenceNumber;
+
+        /* Create ThreadGroup to be used by all threads servicing
+         * this VM.
+         */
+        threadGroupForJDI = new ThreadGroup(vmManager.mainGroupForJDI(),
+                                            "JDI [" +
+                                            this.hashCode() + "]");
+
+        /*
+         * Set up a thread to communicate with the target VM over
+         * the specified transport.
+         */
+        target = new TargetVM(this, connection);
+
+        /*
+         * Set up a thread to handle events processed internally
+         * the JDI implementation.
+         */
+        EventQueueImpl internalEventQueue = new EventQueueImpl(this, target);
+        new InternalEventHandler(this, internalEventQueue);
+        /*
+         * Initialize client access to event setting and handling
+         */
+        eventQueue = new EventQueueImpl(this, target);
+        eventRequestManager = new EventRequestManagerImpl(this);
+
+        target.start();
+
+        /*
+         * Many ids are variably sized, depending on target VM.
+         * Find out the sizes right away.
+         */
+        JDWP.VirtualMachine.IDSizes idSizes;
+        try {
+            idSizes = JDWP.VirtualMachine.IDSizes.process(vm);
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+        sizeofFieldRef  = idSizes.fieldIDSize;
+        sizeofMethodRef = idSizes.methodIDSize;
+        sizeofObjectRef = idSizes.objectIDSize;
+        sizeofClassRef = idSizes.referenceTypeIDSize;
+        sizeofFrameRef  = idSizes.frameIDSize;
+
+        /**
+         * Set up requests needed by internal event handler.
+         * Make sure they are distinguished by creating them with
+         * an internal event request manager.
+         *
+         * Warning: create events only with SUSPEND_NONE policy.
+         * In the current implementation other policies will not
+         * be handled correctly when the event comes in. (notfiySuspend()
+         * will not be properly called, and if the event is combined
+         * with external events in the same set, suspend policy is not
+         * correctly determined for the internal vs. external event sets)
+         */
+        internalEventRequestManager = new EventRequestManagerImpl(this);
+        EventRequest er = internalEventRequestManager.createClassPrepareRequest();
+        er.setSuspendPolicy(EventRequest.SUSPEND_NONE);
+        er.enable();
+        er = internalEventRequestManager.createClassUnloadRequest();
+        er.setSuspendPolicy(EventRequest.SUSPEND_NONE);
+        er.enable();
+
+        /*
+         * Tell other threads, notably TargetVM, that initialization
+         * is complete.
+         */
+        notifyInitCompletion();
+    }
+
+    EventRequestManagerImpl getInternalEventRequestManager() {
+        return internalEventRequestManager;
+    }
+
+    void validateVM() {
+        /*
+         * We no longer need to do this.  The spec now says
+         * that a VMDisconnected _may_ be thrown in these
+         * cases, not that it _will_ be thrown.
+         * So, to simplify things we will just let the
+         * caller's of this method proceed with their business.
+         * If the debuggee is disconnected, either because it
+         * crashed or finished or something, or because the
+         * debugger called exit() or dispose(), then if
+         * we end up trying to communicate with the debuggee,
+         * code in TargetVM will throw a VMDisconnectedException.
+         * This means that if we can satisfy a request without
+         * talking to the debuggee, (eg, with cached data) then
+         * VMDisconnectedException will _not_ be thrown.
+         * if (shutdown) {
+         *    throw new VMDisconnectedException();
+         * }
+         */
+    }
+
+    public boolean equals(Object obj) {
+        return this == obj;
+    }
+
+    public int hashCode() {
+        return System.identityHashCode(this);
+    }
+
+    public List<ReferenceType> classesByName(String className) {
+        validateVM();
+        String signature = JNITypeParser.typeNameToSignature(className);
+        List<ReferenceType> list;
+        if (retrievedAllTypes) {
+           list = findReferenceTypes(signature);
+        } else {
+           list = retrieveClassesBySignature(signature);
+        }
+        return Collections.unmodifiableList(list);
+    }
+
+    public List<ReferenceType> allClasses() {
+        validateVM();
+
+        if (!retrievedAllTypes) {
+            retrieveAllClasses();
+        }
+        ArrayList<ReferenceType> a;
+        synchronized (this) {
+            a = new ArrayList<ReferenceType>(typesBySignature);
+        }
+        return Collections.unmodifiableList(a);
+    }
+
+    public void
+        redefineClasses(Map<? extends ReferenceType,byte[]> classToBytes)
+    {
+        int cnt = classToBytes.size();
+        JDWP.VirtualMachine.RedefineClasses.ClassDef[] defs =
+            new JDWP.VirtualMachine.RedefineClasses.ClassDef[cnt];
+        validateVM();
+        if (!canRedefineClasses()) {
+            throw new UnsupportedOperationException();
+        }
+        Iterator<?> it = classToBytes.entrySet().iterator();
+        for (int i = 0; it.hasNext(); i++) {
+            Map.Entry<?,?> entry = (Map.Entry)it.next();
+            ReferenceTypeImpl refType = (ReferenceTypeImpl)entry.getKey();
+            validateMirror(refType);
+            defs[i] = new JDWP.VirtualMachine.RedefineClasses
+                       .ClassDef(refType, (byte[])entry.getValue());
+        }
+
+        // flush caches and disable caching until the next suspend
+        vm.state().thaw();
+
+        try {
+            JDWP.VirtualMachine.RedefineClasses.
+                process(vm, defs);
+        } catch (JDWPException exc) {
+            switch (exc.errorCode()) {
+            case JDWP.Error.INVALID_CLASS_FORMAT :
+                throw new ClassFormatError(
+                        "class not in class file format");
+            case JDWP.Error.CIRCULAR_CLASS_DEFINITION :
+                throw new ClassCircularityError(
+       "circularity has been detected while initializing a class");
+            case JDWP.Error.FAILS_VERIFICATION :
+                throw new VerifyError(
+   "verifier detected internal inconsistency or security problem");
+            case JDWP.Error.UNSUPPORTED_VERSION :
+                throw new UnsupportedClassVersionError(
+                    "version numbers of class are not supported");
+            case JDWP.Error.ADD_METHOD_NOT_IMPLEMENTED:
+                throw new UnsupportedOperationException(
+                              "add method not implemented");
+            case JDWP.Error.SCHEMA_CHANGE_NOT_IMPLEMENTED :
+                throw new UnsupportedOperationException(
+                              "schema change not implemented");
+            case JDWP.Error.HIERARCHY_CHANGE_NOT_IMPLEMENTED:
+                throw new UnsupportedOperationException(
+                              "hierarchy change not implemented");
+            case JDWP.Error.DELETE_METHOD_NOT_IMPLEMENTED :
+                throw new UnsupportedOperationException(
+                              "delete method not implemented");
+            case JDWP.Error.CLASS_MODIFIERS_CHANGE_NOT_IMPLEMENTED:
+                throw new UnsupportedOperationException(
+                       "changes to class modifiers not implemented");
+            case JDWP.Error.METHOD_MODIFIERS_CHANGE_NOT_IMPLEMENTED :
+                throw new UnsupportedOperationException(
+                       "changes to method modifiers not implemented");
+            case JDWP.Error.NAMES_DONT_MATCH :
+                throw new NoClassDefFoundError(
+                              "class names do not match");
+            default:
+                throw exc.toJDIException();
+            }
+        }
+
+        // Delete any record of the breakpoints
+        List<BreakpointRequest> toDelete = new ArrayList<BreakpointRequest>();
+        EventRequestManager erm = eventRequestManager();
+        it = erm.breakpointRequests().iterator();
+        while (it.hasNext()) {
+            BreakpointRequest req = (BreakpointRequest)it.next();
+            if (classToBytes.containsKey(req.location().declaringType())) {
+                toDelete.add(req);
+            }
+        }
+        erm.deleteEventRequests(toDelete);
+
+        // Invalidate any information cached for the classes just redefined.
+        it = classToBytes.keySet().iterator();
+        while (it.hasNext()) {
+            ReferenceTypeImpl rti = (ReferenceTypeImpl)it.next();
+            rti.noticeRedefineClass();
+        }
+    }
+
+    public List<ThreadReference> allThreads() {
+        validateVM();
+        return state.allThreads();
+    }
+
+    public List<ThreadGroupReference> topLevelThreadGroups() {
+        validateVM();
+        return state.topLevelThreadGroups();
+    }
+
+    /*
+     * Sends a command to the back end which is defined to do an
+     * implicit vm-wide resume. The VM can no longer be considered
+     * suspended, so certain cached data must be invalidated.
+     */
+    PacketStream sendResumingCommand(CommandSender sender) {
+        return state.thawCommand(sender);
+    }
+
+    /*
+     * The VM has been suspended. Additional caching can be done
+     * as long as there are no pending resumes.
+     */
+    void notifySuspend() {
+        state.freeze();
+    }
+
+    public void suspend() {
+        validateVM();
+        try {
+            JDWP.VirtualMachine.Suspend.process(vm);
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+        notifySuspend();
+    }
+
+    public void resume() {
+        validateVM();
+        CommandSender sender =
+            new CommandSender() {
+                public PacketStream send() {
+                    return JDWP.VirtualMachine.Resume.enqueueCommand(vm);
+                }
+        };
+        try {
+            PacketStream stream = state.thawCommand(sender);
+            JDWP.VirtualMachine.Resume.waitForReply(vm, stream);
+        } catch (VMDisconnectedException exc) {
+            /*
+             * If the debugger makes a VMDeathRequest with SUSPEND_ALL,
+             * then when it does an EventSet.resume after getting the
+             * VMDeathEvent, the normal flow of events is that the
+             * BE shuts down, but the waitForReply comes back ok.  In this
+             * case, the run loop in TargetVM that is waiting for a packet
+             * gets an EOF because the socket closes. It generates a
+             * VMDisconnectedEvent and everyone is happy.
+             * However, sometimes, the BE gets shutdown before this
+             * waitForReply completes.  In this case, TargetVM.waitForReply
+             * gets awakened with no reply and so gens a VMDisconnectedException
+             * which is not what we want.  It might be possible to fix this
+             * in the BE, but it is ok to just ignore the VMDisconnectedException
+             * here.  This will allow the VMDisconnectedEvent to be generated
+             * correctly.  And, if the debugger should happen to make another
+             * request, it will get a VMDisconnectedException at that time.
+             */
+        } catch (JDWPException exc) {
+            switch (exc.errorCode()) {
+                case JDWP.Error.VM_DEAD:
+                    return;
+                default:
+                    throw exc.toJDIException();
+            }
+        }
+    }
+
+    public EventQueue eventQueue() {
+        /*
+         * No VM validation here. We allow access to the event queue
+         * after disconnection, so that there is access to the terminating
+         * events.
+         */
+        return eventQueue;
+    }
+
+    public EventRequestManager eventRequestManager() {
+        validateVM();
+        return eventRequestManager;
+    }
+
+    EventRequestManagerImpl eventRequestManagerImpl() {
+        return eventRequestManager;
+    }
+
+    public BooleanValue mirrorOf(boolean value) {
+        validateVM();
+        return new BooleanValueImpl(this,value);
+    }
+
+    public ByteValue mirrorOf(byte value) {
+        validateVM();
+        return new ByteValueImpl(this,value);
+    }
+
+    public CharValue mirrorOf(char value) {
+        validateVM();
+        return new CharValueImpl(this,value);
+    }
+
+    public ShortValue mirrorOf(short value) {
+        validateVM();
+        return new ShortValueImpl(this,value);
+    }
+
+    public IntegerValue mirrorOf(int value) {
+        validateVM();
+        return new IntegerValueImpl(this,value);
+    }
+
+    public LongValue mirrorOf(long value) {
+        validateVM();
+        return new LongValueImpl(this,value);
+    }
+
+    public FloatValue mirrorOf(float value) {
+        validateVM();
+        return new FloatValueImpl(this,value);
+    }
+
+    public DoubleValue mirrorOf(double value) {
+        validateVM();
+        return new DoubleValueImpl(this,value);
+    }
+
+    public StringReference mirrorOf(String value) {
+        validateVM();
+        try {
+            return (StringReference)JDWP.VirtualMachine.CreateString.
+                             process(vm, value).stringObject;
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+    }
+
+    public VoidValue mirrorOfVoid() {
+        if (voidVal == null) {
+            voidVal = new VoidValueImpl(this);
+        }
+        return voidVal;
+    }
+
+    public long[] instanceCounts(List<? extends ReferenceType> classes) {
+        if (!canGetInstanceInfo()) {
+            throw new UnsupportedOperationException(
+                "target does not support getting instances");
+        }
+        long[] retValue ;
+        ReferenceTypeImpl[] rtArray = new ReferenceTypeImpl[classes.size()];
+        int ii = 0;
+        for (ReferenceType rti: classes) {
+            validateMirror(rti);
+            rtArray[ii++] = (ReferenceTypeImpl)rti;
+        }
+        try {
+            retValue = JDWP.VirtualMachine.InstanceCounts.
+                                process(vm, rtArray).counts;
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+
+        return retValue;
+    }
+
+    public void dispose() {
+        validateVM();
+        shutdown = true;
+        try {
+            JDWP.VirtualMachine.Dispose.process(vm);
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+        target.stopListening();
+    }
+
+    public void exit(int exitCode) {
+        validateVM();
+        shutdown = true;
+        try {
+            JDWP.VirtualMachine.Exit.process(vm, exitCode);
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+        target.stopListening();
+    }
+
+    public Process process() {
+        validateVM();
+        return process;
+    }
+
+    private JDWP.VirtualMachine.Version versionInfo() {
+       try {
+           if (versionInfo == null) {
+               // Need not be synchronized since it is static information
+               versionInfo = JDWP.VirtualMachine.Version.process(vm);
+           }
+           return versionInfo;
+       } catch (JDWPException exc) {
+           throw exc.toJDIException();
+       }
+   }
+    public String description() {
+        validateVM();
+
+        return MessageFormat.format(vmManager.getString("version_format"),
+                                    "" + vmManager.majorInterfaceVersion(),
+                                    "" + vmManager.minorInterfaceVersion(),
+                                     versionInfo().description);
+    }
+
+    public String version() {
+        validateVM();
+        return versionInfo().vmVersion;
+    }
+
+    public String name() {
+        validateVM();
+        return versionInfo().vmName;
+    }
+
+    public boolean canWatchFieldModification() {
+        validateVM();
+        return capabilities().canWatchFieldModification;
+    }
+    public boolean canWatchFieldAccess() {
+        validateVM();
+        return capabilities().canWatchFieldAccess;
+    }
+    public boolean canGetBytecodes() {
+        validateVM();
+        return capabilities().canGetBytecodes;
+    }
+    public boolean canGetSyntheticAttribute() {
+        validateVM();
+        return capabilities().canGetSyntheticAttribute;
+    }
+    public boolean canGetOwnedMonitorInfo() {
+        validateVM();
+        return capabilities().canGetOwnedMonitorInfo;
+    }
+    public boolean canGetCurrentContendedMonitor() {
+        validateVM();
+        return capabilities().canGetCurrentContendedMonitor;
+    }
+    public boolean canGetMonitorInfo() {
+        validateVM();
+        return capabilities().canGetMonitorInfo;
+    }
+
+    private boolean hasNewCapabilities() {
+        return versionInfo().jdwpMajor > 1 ||
+            versionInfo().jdwpMinor >= 4;
+    }
+
+    boolean canGet1_5LanguageFeatures() {
+        return versionInfo().jdwpMajor > 1 ||
+            versionInfo().jdwpMinor >= 5;
+    }
+
+    public boolean canUseInstanceFilters() {
+        validateVM();
+        return hasNewCapabilities() &&
+            capabilitiesNew().canUseInstanceFilters;
+    }
+    public boolean canRedefineClasses() {
+        validateVM();
+        return hasNewCapabilities() &&
+            capabilitiesNew().canRedefineClasses;
+    }
+    public boolean canAddMethod() {
+        validateVM();
+        return hasNewCapabilities() &&
+            capabilitiesNew().canAddMethod;
+    }
+    public boolean canUnrestrictedlyRedefineClasses() {
+        validateVM();
+        return hasNewCapabilities() &&
+            capabilitiesNew().canUnrestrictedlyRedefineClasses;
+    }
+    public boolean canPopFrames() {
+        validateVM();
+        return hasNewCapabilities() &&
+            capabilitiesNew().canPopFrames;
+    }
+    public boolean canGetMethodReturnValues() {
+        return versionInfo().jdwpMajor > 1 ||
+            versionInfo().jdwpMinor >= 6;
+    }
+    public boolean canGetInstanceInfo() {
+        if (versionInfo().jdwpMajor < 1 ||
+            versionInfo().jdwpMinor < 6) {
+            return false;
+        }
+        validateVM();
+        return hasNewCapabilities() &&
+            capabilitiesNew().canGetInstanceInfo;
+    }
+    public boolean canUseSourceNameFilters() {
+        if (versionInfo().jdwpMajor < 1 ||
+            versionInfo().jdwpMinor < 6) {
+            return false;
+        }
+        return true;
+    }
+    public boolean canForceEarlyReturn() {
+        validateVM();
+        return hasNewCapabilities() &&
+            capabilitiesNew().canForceEarlyReturn;
+    }
+    public boolean canBeModified() {
+        return true;
+    }
+    public boolean canGetSourceDebugExtension() {
+        validateVM();
+        return hasNewCapabilities() &&
+            capabilitiesNew().canGetSourceDebugExtension;
+    }
+    public boolean canGetClassFileVersion() {
+        if ( versionInfo().jdwpMajor < 1 &&
+             versionInfo().jdwpMinor  < 6) {
+            return false;
+        } else {
+            return true;
+        }
+    }
+    public boolean canGetConstantPool() {
+        validateVM();
+        return hasNewCapabilities() &&
+            capabilitiesNew().canGetConstantPool;
+    }
+    public boolean canRequestVMDeathEvent() {
+        validateVM();
+        return hasNewCapabilities() &&
+            capabilitiesNew().canRequestVMDeathEvent;
+    }
+    public boolean canRequestMonitorEvents() {
+        validateVM();
+        return hasNewCapabilities() &&
+            capabilitiesNew().canRequestMonitorEvents;
+    }
+    public boolean canGetMonitorFrameInfo() {
+        validateVM();
+        return hasNewCapabilities() &&
+            capabilitiesNew().canGetMonitorFrameInfo;
+    }
+
+    public void setDebugTraceMode(int traceFlags) {
+        validateVM();
+        this.traceFlags = traceFlags;
+        this.traceReceives = (traceFlags & TRACE_RECEIVES) != 0;
+    }
+
+    void printTrace(String string) {
+        System.err.println("[JDI: " + string + "]");
+    }
+
+    void printReceiveTrace(int depth, String string) {
+        StringBuffer sb = new StringBuffer("Receiving:");
+        for (int i = depth; i > 0; --i) {
+            sb.append("    ");
+        }
+        sb.append(string);
+        printTrace(sb.toString());
+    }
+
+    private synchronized ReferenceTypeImpl addReferenceType(long id,
+                                                       int tag,
+                                                       String signature) {
+        if (typesByID == null) {
+            initReferenceTypes();
+        }
+        ReferenceTypeImpl type = null;
+        switch(tag) {
+            case JDWP.TypeTag.CLASS:
+                type = new ClassTypeImpl(vm, id);
+                break;
+            case JDWP.TypeTag.INTERFACE:
+                type = new InterfaceTypeImpl(vm, id);
+                break;
+            case JDWP.TypeTag.ARRAY:
+                type = new ArrayTypeImpl(vm, id);
+                break;
+            default:
+                throw new InternalException("Invalid reference type tag");
+        }
+
+        /*
+         * If a signature was specified, make sure to set it ASAP, to
+         * prevent any needless JDWP command to retrieve it. (for example,
+         * typesBySignature.add needs the signature, to maintain proper
+         * ordering.
+         */
+        if (signature != null) {
+            type.setSignature(signature);
+        }
+
+        typesByID.put(new Long(id), type);
+        typesBySignature.add(type);
+
+        if ((vm.traceFlags & VirtualMachine.TRACE_REFTYPES) != 0) {
+           vm.printTrace("Caching new ReferenceType, sig=" + signature +
+                         ", id=" + id);
+        }
+
+        return type;
+    }
+
+    synchronized void removeReferenceType(String signature) {
+        if (typesByID == null) {
+            return;
+        }
+        /*
+         * There can be multiple classes with the same name. Since
+         * we can't differentiate here, we first remove all
+         * matching classes from our cache...
+         */
+        Iterator<ReferenceType> iter = typesBySignature.iterator();
+        int matches = 0;
+        while (iter.hasNext()) {
+            ReferenceTypeImpl type = (ReferenceTypeImpl)iter.next();
+            int comp = signature.compareTo(type.signature());
+            if (comp == 0) {
+                matches++;
+                iter.remove();
+                typesByID.remove(new Long(type.ref()));
+                if ((vm.traceFlags & VirtualMachine.TRACE_REFTYPES) != 0) {
+                   vm.printTrace("Uncaching ReferenceType, sig=" + signature +
+                                 ", id=" + type.ref());
+                }
+/* fix for 4359077 , don't break out. list is no longer sorted
+        in the order we think
+ */
+            }
+        }
+
+        /*
+         * ...and if there was more than one, re-retrieve the classes
+         * with that name
+         */
+        if (matches > 1) {
+            retrieveClassesBySignature(signature);
+        }
+    }
+
+    private synchronized List<ReferenceType> findReferenceTypes(String signature) {
+        if (typesByID == null) {
+            return new ArrayList<ReferenceType>(0);
+        }
+        Iterator<ReferenceType> iter = typesBySignature.iterator();
+        List<ReferenceType> list = new ArrayList<ReferenceType>();
+        while (iter.hasNext()) {
+            ReferenceTypeImpl type = (ReferenceTypeImpl)iter.next();
+            int comp = signature.compareTo(type.signature());
+            if (comp == 0) {
+                list.add(type);
+/* fix for 4359077 , don't break out. list is no longer sorted
+        in the order we think
+ */
+            }
+        }
+        return list;
+    }
+
+    private void initReferenceTypes() {
+        typesByID = new HashMap<Long, ReferenceType>(300);
+        typesBySignature = new TreeSet<ReferenceType>();
+    }
+
+    ReferenceTypeImpl referenceType(long ref, byte tag) {
+        return referenceType(ref, tag, null);
+    }
+
+    ClassTypeImpl classType(long ref) {
+        return (ClassTypeImpl)referenceType(ref, JDWP.TypeTag.CLASS, null);
+    }
+
+    InterfaceTypeImpl interfaceType(long ref) {
+        return (InterfaceTypeImpl)referenceType(ref, JDWP.TypeTag.INTERFACE, null);
+    }
+
+    ArrayTypeImpl arrayType(long ref) {
+        return (ArrayTypeImpl)referenceType(ref, JDWP.TypeTag.ARRAY, null);
+    }
+
+    ReferenceTypeImpl referenceType(long id, int tag,
+                                                 String signature) {
+        if ((vm.traceFlags & VirtualMachine.TRACE_REFTYPES) != 0) {
+            StringBuffer sb = new StringBuffer();
+            sb.append("Looking up ");
+            if (tag == JDWP.TypeTag.CLASS) {
+                sb.append("Class");
+            } else if (tag == JDWP.TypeTag.INTERFACE) {
+                sb.append("Interface");
+            } else if (tag == JDWP.TypeTag.ARRAY) {
+                sb.append("ArrayType");
+            } else {
+                sb.append("UNKNOWN TAG: " + tag);
+            }
+            if (signature != null) {
+                sb.append(", signature='" + signature + "'");
+            }
+            sb.append(", id=" + id);
+            vm.printTrace(sb.toString());
+        }
+        if (id == 0) {
+            return null;
+        } else {
+            ReferenceTypeImpl retType = null;
+            synchronized (this) {
+                if (typesByID != null) {
+                    retType = (ReferenceTypeImpl)typesByID.get(new Long(id));
+                }
+                if (retType == null) {
+                    retType = addReferenceType(id, tag, signature);
+                }
+            }
+            return retType;
+        }
+    }
+
+    private JDWP.VirtualMachine.Capabilities capabilities() {
+        if (capabilities == null) {
+            try {
+                capabilities = JDWP.VirtualMachine
+                                 .Capabilities.process(vm);
+            } catch (JDWPException exc) {
+                throw exc.toJDIException();
+            }
+        }
+        return capabilities;
+    }
+
+    private JDWP.VirtualMachine.CapabilitiesNew capabilitiesNew() {
+        if (capabilitiesNew == null) {
+            try {
+                capabilitiesNew = JDWP.VirtualMachine
+                                 .CapabilitiesNew.process(vm);
+            } catch (JDWPException exc) {
+                throw exc.toJDIException();
+            }
+        }
+        return capabilitiesNew;
+    }
+
+    private List<ReferenceType> retrieveClassesBySignature(String signature) {
+        if ((vm.traceFlags & VirtualMachine.TRACE_REFTYPES) != 0) {
+            vm.printTrace("Retrieving matching ReferenceTypes, sig=" + signature);
+        }
+        JDWP.VirtualMachine.ClassesBySignature.ClassInfo[] cinfos;
+        try {
+            cinfos = JDWP.VirtualMachine.ClassesBySignature.
+                                      process(vm, signature).classes;
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+
+        int count = cinfos.length;
+        List<ReferenceType> list = new ArrayList<ReferenceType>(count);
+
+        // Hold lock during processing to improve performance
+        synchronized (this) {
+            for (int i = 0; i < count; i++) {
+                JDWP.VirtualMachine.ClassesBySignature.ClassInfo ci =
+                                                               cinfos[i];
+                ReferenceTypeImpl type = referenceType(ci.typeID,
+                                                       ci.refTypeTag,
+                                                       signature);
+                type.setStatus(ci.status);
+                list.add(type);
+            }
+        }
+        return list;
+    }
+
+    private void retrieveAllClasses1_4() {
+        JDWP.VirtualMachine.AllClasses.ClassInfo[] cinfos;
+        try {
+            cinfos = JDWP.VirtualMachine.AllClasses.process(vm).classes;
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+
+        // Hold lock during processing to improve performance
+        // and to have safe check/set of retrievedAllTypes
+        synchronized (this) {
+            if (!retrievedAllTypes) {
+                // Number of classes
+                int count = cinfos.length;
+                for (int i=0; i<count; i++) {
+                    JDWP.VirtualMachine.AllClasses.ClassInfo ci =
+                                                               cinfos[i];
+                    ReferenceTypeImpl type = referenceType(ci.typeID,
+                                                           ci.refTypeTag,
+                                                           ci.signature);
+                    type.setStatus(ci.status);
+                }
+                retrievedAllTypes = true;
+            }
+        }
+    }
+
+    private void retrieveAllClasses() {
+        if ((vm.traceFlags & VirtualMachine.TRACE_REFTYPES) != 0) {
+            vm.printTrace("Retrieving all ReferenceTypes");
+        }
+
+        if (!vm.canGet1_5LanguageFeatures()) {
+            retrieveAllClasses1_4();
+            return;
+        }
+
+        /*
+         * To save time (assuming the caller will be
+         * using then) we will get the generic sigs too.
+         */
+
+        JDWP.VirtualMachine.AllClassesWithGeneric.ClassInfo[] cinfos;
+        try {
+            cinfos = JDWP.VirtualMachine.AllClassesWithGeneric.process(vm).classes;
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+
+        // Hold lock during processing to improve performance
+        // and to have safe check/set of retrievedAllTypes
+        synchronized (this) {
+            if (!retrievedAllTypes) {
+                // Number of classes
+                int count = cinfos.length;
+                for (int i=0; i<count; i++) {
+                    JDWP.VirtualMachine.AllClassesWithGeneric.ClassInfo ci =
+                                                               cinfos[i];
+                    ReferenceTypeImpl type = referenceType(ci.typeID,
+                                                           ci.refTypeTag,
+                                                           ci.signature);
+                    type.setGenericSignature(ci.genericSignature);
+                    type.setStatus(ci.status);
+                }
+                retrievedAllTypes = true;
+            }
+        }
+    }
+
+    void sendToTarget(Packet packet) {
+        target.send(packet);
+    }
+
+    void waitForTargetReply(Packet packet) {
+        target.waitForReply(packet);
+        /*
+         * If any object disposes have been batched up, send them now.
+         */
+        processBatchedDisposes();
+    }
+
+    Type findBootType(String signature) throws ClassNotLoadedException {
+        List<ReferenceType> types = retrieveClassesBySignature(signature);
+        Iterator<ReferenceType> iter = types.iterator();
+        while (iter.hasNext()) {
+            ReferenceType type = iter.next();
+            if (type.classLoader() == null) {
+                return type;
+            }
+        }
+        JNITypeParser parser = new JNITypeParser(signature);
+        throw new ClassNotLoadedException(parser.typeName(),
+                                         "Type " + parser.typeName() + " not loaded");
+    }
+
+    BooleanType theBooleanType() {
+        if (theBooleanType == null) {
+            synchronized(this) {
+                if (theBooleanType == null) {
+                    theBooleanType = new BooleanTypeImpl(this);
+                }
+            }
+        }
+        return theBooleanType;
+    }
+
+    ByteType theByteType() {
+        if (theByteType == null) {
+            synchronized(this) {
+                if (theByteType == null) {
+                    theByteType = new ByteTypeImpl(this);
+                }
+            }
+        }
+        return theByteType;
+    }
+
+    CharType theCharType() {
+        if (theCharType == null) {
+            synchronized(this) {
+                if (theCharType == null) {
+                    theCharType = new CharTypeImpl(this);
+                }
+            }
+        }
+        return theCharType;
+    }
+
+    ShortType theShortType() {
+        if (theShortType == null) {
+            synchronized(this) {
+                if (theShortType == null) {
+                    theShortType = new ShortTypeImpl(this);
+                }
+            }
+        }
+        return theShortType;
+    }
+
+    IntegerType theIntegerType() {
+        if (theIntegerType == null) {
+            synchronized(this) {
+                if (theIntegerType == null) {
+                    theIntegerType = new IntegerTypeImpl(this);
+                }
+            }
+        }
+        return theIntegerType;
+    }
+
+    LongType theLongType() {
+        if (theLongType == null) {
+            synchronized(this) {
+                if (theLongType == null) {
+                    theLongType = new LongTypeImpl(this);
+                }
+            }
+        }
+        return theLongType;
+    }
+
+    FloatType theFloatType() {
+        if (theFloatType == null) {
+            synchronized(this) {
+                if (theFloatType == null) {
+                    theFloatType = new FloatTypeImpl(this);
+                }
+            }
+        }
+        return theFloatType;
+    }
+
+    DoubleType theDoubleType() {
+        if (theDoubleType == null) {
+            synchronized(this) {
+                if (theDoubleType == null) {
+                    theDoubleType = new DoubleTypeImpl(this);
+                }
+            }
+        }
+        return theDoubleType;
+    }
+
+    VoidType theVoidType() {
+        if (theVoidType == null) {
+            synchronized(this) {
+                if (theVoidType == null) {
+                    theVoidType = new VoidTypeImpl(this);
+                }
+            }
+        }
+        return theVoidType;
+    }
+
+    PrimitiveType primitiveTypeMirror(byte tag) {
+        switch (tag) {
+            case JDWP.Tag.BOOLEAN:
+                return theBooleanType();
+            case JDWP.Tag.BYTE:
+                return theByteType();
+            case JDWP.Tag.CHAR:
+                return theCharType();
+            case JDWP.Tag.SHORT:
+                return theShortType();
+            case JDWP.Tag.INT:
+                return theIntegerType();
+            case JDWP.Tag.LONG:
+                return theLongType();
+            case JDWP.Tag.FLOAT:
+                return theFloatType();
+            case JDWP.Tag.DOUBLE:
+                return theDoubleType();
+            default:
+                throw new IllegalArgumentException("Unrecognized primitive tag " + tag);
+        }
+    }
+
+    private void processBatchedDisposes() {
+        if (shutdown) {
+            return;
+        }
+
+        JDWP.VirtualMachine.DisposeObjects.Request[] requests = null;
+        synchronized(batchedDisposeRequests) {
+            int size = batchedDisposeRequests.size();
+            if (size >= DISPOSE_THRESHOLD) {
+                if ((traceFlags & TRACE_OBJREFS) != 0) {
+                    printTrace("Dispose threashold reached. Will dispose "
+                               + size + " object references...");
+                }
+                requests = new JDWP.VirtualMachine.DisposeObjects.Request[size];
+                for (int i = 0; i < requests.length; i++) {
+                    SoftObjectReference ref = batchedDisposeRequests.get(i);
+                    if ((traceFlags & TRACE_OBJREFS) != 0) {
+                        printTrace("Disposing object " + ref.key().longValue() +
+                                   " (ref count = " + ref.count() + ")");
+                    }
+
+                    // This is kludgy. We temporarily re-create an object
+                    // reference so that we can correctly pass its id to the
+                    // JDWP command.
+                    requests[i] =
+                        new JDWP.VirtualMachine.DisposeObjects.Request(
+                            new ObjectReferenceImpl(this, ref.key().longValue()),
+                            ref.count());
+                }
+                batchedDisposeRequests.clear();
+            }
+        }
+        if (requests != null) {
+            try {
+                JDWP.VirtualMachine.DisposeObjects.process(vm, requests);
+            } catch (JDWPException exc) {
+                throw exc.toJDIException();
+            }
+        }
+    }
+
+    private void batchForDispose(SoftObjectReference ref) {
+        if ((traceFlags & TRACE_OBJREFS) != 0) {
+            printTrace("Batching object " + ref.key().longValue() +
+                       " for dispose (ref count = " + ref.count() + ")");
+        }
+        batchedDisposeRequests.add(ref);
+    }
+
+    private void processQueue() {
+        Reference<?> ref;
+        //if ((traceFlags & TRACE_OBJREFS) != 0) {
+        //    printTrace("Checking for softly reachable objects");
+        //}
+        while ((ref = referenceQueue.poll()) != null) {
+            SoftObjectReference softRef = (SoftObjectReference)ref;
+            removeObjectMirror(softRef);
+            batchForDispose(softRef);
+        }
+    }
+
+    synchronized ObjectReferenceImpl objectMirror(long id, int tag) {
+
+        // Handle any queue elements that are not strongly reachable
+        processQueue();
+
+        if (id == 0) {
+            return null;
+        }
+        ObjectReferenceImpl object = null;
+        Long key = new Long(id);
+
+        /*
+         * Attempt to retrieve an existing object object reference
+         */
+        SoftObjectReference ref = objectsByID.get(key);
+        if (ref != null) {
+            object = ref.object();
+        }
+
+        /*
+         * If the object wasn't in the table, or it's soft reference was
+         * cleared, create a new instance.
+         */
+        if (object == null) {
+            switch (tag) {
+                case JDWP.Tag.OBJECT:
+                    object = new ObjectReferenceImpl(vm, id);
+                    break;
+                case JDWP.Tag.STRING:
+                    object = new StringReferenceImpl(vm, id);
+                    break;
+                case JDWP.Tag.ARRAY:
+                    object = new ArrayReferenceImpl(vm, id);
+                    break;
+                case JDWP.Tag.THREAD:
+                    ThreadReferenceImpl thread =
+                        new ThreadReferenceImpl(vm, id);
+                    thread.addListener(this);
+                    object = thread;
+                    break;
+                case JDWP.Tag.THREAD_GROUP:
+                    object = new ThreadGroupReferenceImpl(vm, id);
+                    break;
+                case JDWP.Tag.CLASS_LOADER:
+                    object = new ClassLoaderReferenceImpl(vm, id);
+                    break;
+                case JDWP.Tag.CLASS_OBJECT:
+                    object = new ClassObjectReferenceImpl(vm, id);
+                    break;
+                default:
+                    throw new IllegalArgumentException("Invalid object tag: " + tag);
+            }
+            ref = new SoftObjectReference(key, object, referenceQueue);
+
+            /*
+             * If there was no previous entry in the table, we add one here
+             * If the previous entry was cleared, we replace it here.
+             */
+            objectsByID.put(key, ref);
+            if ((traceFlags & TRACE_OBJREFS) != 0) {
+                printTrace("Creating new " +
+                           object.getClass().getName() + " (id = " + id + ")");
+            }
+        } else {
+            ref.incrementCount();
+        }
+
+        return object;
+    }
+
+    synchronized void removeObjectMirror(ObjectReferenceImpl object) {
+
+        // Handle any queue elements that are not strongly reachable
+        processQueue();
+
+        SoftObjectReference ref = objectsByID.remove(new Long(object.ref()));
+        if (ref != null) {
+            batchForDispose(ref);
+        } else {
+            /*
+             * If there's a live ObjectReference about, it better be part
+             * of the cache.
+             */
+            throw new InternalException("ObjectReference " + object.ref() +
+                                        " not found in object cache");
+        }
+    }
+
+    synchronized void removeObjectMirror(SoftObjectReference ref) {
+        /*
+         * This will remove the soft reference if it has not been
+         * replaced in the cache.
+         */
+        objectsByID.remove(ref.key());
+    }
+
+    ObjectReferenceImpl objectMirror(long id) {
+        return objectMirror(id, JDWP.Tag.OBJECT);
+    }
+
+    StringReferenceImpl stringMirror(long id) {
+        return (StringReferenceImpl)objectMirror(id, JDWP.Tag.STRING);
+    }
+
+    ArrayReferenceImpl arrayMirror(long id) {
+       return (ArrayReferenceImpl)objectMirror(id, JDWP.Tag.ARRAY);
+    }
+
+    ThreadReferenceImpl threadMirror(long id) {
+        return (ThreadReferenceImpl)objectMirror(id, JDWP.Tag.THREAD);
+    }
+
+    ThreadGroupReferenceImpl threadGroupMirror(long id) {
+        return (ThreadGroupReferenceImpl)objectMirror(id,
+                                                      JDWP.Tag.THREAD_GROUP);
+    }
+
+    ClassLoaderReferenceImpl classLoaderMirror(long id) {
+        return (ClassLoaderReferenceImpl)objectMirror(id,
+                                                      JDWP.Tag.CLASS_LOADER);
+    }
+
+    ClassObjectReferenceImpl classObjectMirror(long id) {
+        return (ClassObjectReferenceImpl)objectMirror(id,
+                                                      JDWP.Tag.CLASS_OBJECT);
+    }
+
+    /*
+     * Implementation of PathSearchingVirtualMachine
+     */
+    private JDWP.VirtualMachine.ClassPaths getClasspath() {
+        if (pathInfo == null) {
+            try {
+                pathInfo = JDWP.VirtualMachine.ClassPaths.process(vm);
+            } catch (JDWPException exc) {
+                throw exc.toJDIException();
+            }
+        }
+        return pathInfo;
+    }
+
+   public List<String> classPath() {
+       return Arrays.asList(getClasspath().classpaths);
+   }
+
+   public List<String> bootClassPath() {
+       return Arrays.asList(getClasspath().bootclasspaths);
+   }
+
+   public String baseDirectory() {
+       return getClasspath().baseDir;
+   }
+
+    public void setDefaultStratum(String stratum) {
+        defaultStratum = stratum;
+        if (stratum == null) {
+            stratum = "";
+        }
+        try {
+            JDWP.VirtualMachine.SetDefaultStratum.process(vm,
+                                                          stratum);
+        } catch (JDWPException exc) {
+            throw exc.toJDIException();
+        }
+    }
+
+    public String getDefaultStratum() {
+        return defaultStratum;
+    }
+
+    ThreadGroup threadGroupForJDI() {
+        return threadGroupForJDI;
+    }
+
+   static private class SoftObjectReference extends SoftReference<ObjectReferenceImpl> {
+       int count;
+       Long key;
+
+       SoftObjectReference(Long key, ObjectReferenceImpl mirror,
+                           ReferenceQueue<ObjectReferenceImpl> queue) {
+           super(mirror, queue);
+           this.count = 1;
+           this.key = key;
+       }
+
+       int count() {
+           return count;
+       }
+
+       void incrementCount() {
+           count++;
+       }
+
+       Long key() {
+           return key;
+       }
+
+       ObjectReferenceImpl object() {
+           return get();
+       }
+   }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/VirtualMachineManagerImpl.java b/src/share/classes/com/sun/tools/jdi/VirtualMachineManagerImpl.java
new file mode 100644
index 0000000..3704b41
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/VirtualMachineManagerImpl.java
@@ -0,0 +1,271 @@
+/*
+ * Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+import com.sun.jdi.connect.*;
+import com.sun.jdi.connect.spi.*;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.ResourceBundle;
+import java.io.IOException;
+
+import java.util.ServiceLoader;
+
+/* Public for use by com.sun.jdi.Bootstrap */
+public class VirtualMachineManagerImpl implements VirtualMachineManagerService {
+    private List<Connector> connectors = new ArrayList<Connector>();
+    private LaunchingConnector defaultConnector = null;
+    private List<VirtualMachine> targets = new ArrayList<VirtualMachine>();
+    private final ThreadGroup mainGroupForJDI;
+    private ResourceBundle messages = null;
+    private int vmSequenceNumber = 0;
+    private static final int majorVersion = 1;
+    private static final int minorVersion = 8;
+
+    private static final Object lock = new Object();
+    private static VirtualMachineManagerImpl vmm;
+
+    public static VirtualMachineManager virtualMachineManager() {
+        SecurityManager sm = System.getSecurityManager();
+        if (sm != null) {
+            JDIPermission vmmPermission =
+                new JDIPermission("virtualMachineManager");
+            sm.checkPermission(vmmPermission);
+        }
+        synchronized (lock) {
+            if (vmm == null) {
+                vmm = new VirtualMachineManagerImpl();
+            }
+        }
+        return vmm;
+    }
+
+    protected VirtualMachineManagerImpl() {
+
+        /*
+         * Create a top-level thread group
+         */
+        ThreadGroup top = Thread.currentThread().getThreadGroup();
+        ThreadGroup parent = null;
+        while ((parent = top.getParent()) != null) {
+            top = parent;
+        }
+        mainGroupForJDI = new ThreadGroup(top, "JDI main");
+
+        /*
+         * Load the connectors
+         */
+        ServiceLoader<Connector> connectorLoader =
+            ServiceLoader.load(Connector.class, Connector.class.getClassLoader());
+
+        Iterator<Connector> connectors = connectorLoader.iterator();
+
+        while (connectors.hasNext()) {
+            Connector connector;
+
+            try {
+                connector = connectors.next();
+            } catch (ThreadDeath x) {
+                throw x;
+            } catch (Exception x) {
+                System.err.println(x);
+                continue;
+            } catch (Error x) {
+                System.err.println(x);
+                continue;
+            }
+
+            addConnector(connector);
+        }
+
+        /*
+         * Load any transport services and encapsulate them with
+         * an attaching and listening connector.
+         */
+        ServiceLoader<TransportService> transportLoader =
+            ServiceLoader.load(TransportService.class,
+                               TransportService.class.getClassLoader());
+
+        Iterator<TransportService> transportServices =
+            transportLoader.iterator();
+
+        while (transportServices.hasNext()) {
+            TransportService transportService;
+
+            try {
+                transportService = transportServices.next();
+            } catch (ThreadDeath x) {
+                throw x;
+            } catch (Exception x) {
+                System.err.println(x);
+                continue;
+            } catch (Error x) {
+                System.err.println(x);
+                continue;
+            }
+
+            addConnector(GenericAttachingConnector.create(transportService));
+            addConnector(GenericListeningConnector.create(transportService));
+        }
+
+        // no connectors found
+        if (allConnectors().size() == 0) {
+            throw new Error("no Connectors loaded");
+        }
+
+        // Set the default launcher. In order to be compatible
+        // 1.2/1.3/1.4 we try to make the default launcher
+        // "com.sun.jdi.CommandLineLaunch". If this connector
+        // isn't found then we arbitarly pick the first connector.
+        //
+        boolean found = false;
+        List<LaunchingConnector> launchers = launchingConnectors();
+        for (LaunchingConnector lc: launchers) {
+            if (lc.name().equals("com.sun.jdi.CommandLineLaunch")) {
+                setDefaultConnector(lc);
+                found = true;
+                break;
+            }
+        }
+        if (!found && launchers.size() > 0) {
+            setDefaultConnector(launchers.get(0));
+        }
+
+    }
+
+    public LaunchingConnector defaultConnector() {
+        if (defaultConnector == null) {
+            throw new Error("no default LaunchingConnector");
+        }
+        return defaultConnector;
+    }
+
+    public void setDefaultConnector(LaunchingConnector connector) {
+        defaultConnector = connector;
+    }
+
+    public List<LaunchingConnector> launchingConnectors() {
+        List<LaunchingConnector> launchingConnectors = new ArrayList<LaunchingConnector>(connectors.size());
+        for (Connector connector: connectors) {
+            if (connector instanceof LaunchingConnector) {
+                launchingConnectors.add((LaunchingConnector)connector);
+            }
+        }
+        return Collections.unmodifiableList(launchingConnectors);
+    }
+
+    public List<AttachingConnector> attachingConnectors() {
+        List<AttachingConnector> attachingConnectors = new ArrayList<AttachingConnector>(connectors.size());
+        for (Connector connector: connectors) {
+            if (connector instanceof AttachingConnector) {
+                attachingConnectors.add((AttachingConnector)connector);
+            }
+        }
+        return Collections.unmodifiableList(attachingConnectors);
+    }
+
+    public List<ListeningConnector> listeningConnectors() {
+        List<ListeningConnector> listeningConnectors = new ArrayList<ListeningConnector>(connectors.size());
+        for (Connector connector: connectors) {
+            if (connector instanceof ListeningConnector) {
+                listeningConnectors.add((ListeningConnector)connector);
+            }
+        }
+        return Collections.unmodifiableList(listeningConnectors);
+    }
+
+    public List<Connector> allConnectors() {
+        return Collections.unmodifiableList(connectors);
+    }
+
+    public List<VirtualMachine> connectedVirtualMachines() {
+        return Collections.unmodifiableList(targets);
+    }
+
+    public void addConnector(Connector connector) {
+        connectors.add(connector);
+    }
+
+    public void removeConnector(Connector connector) {
+        connectors.remove(connector);
+    }
+
+    public synchronized VirtualMachine createVirtualMachine(
+                                        Connection connection,
+                                        Process process) throws IOException {
+
+        if (!connection.isOpen()) {
+            throw new IllegalStateException("connection is not open");
+        }
+
+        VirtualMachine vm;
+        try {
+            vm = new VirtualMachineImpl(this, connection, process,
+                                                   ++vmSequenceNumber);
+        } catch (VMDisconnectedException e) {
+            throw new IOException(e.getMessage());
+        }
+        targets.add(vm);
+        return vm;
+    }
+
+    public VirtualMachine createVirtualMachine(Connection connection) throws IOException {
+        return createVirtualMachine(connection, null);
+    }
+
+    public void addVirtualMachine(VirtualMachine vm) {
+        targets.add(vm);
+    }
+
+    void disposeVirtualMachine(VirtualMachine vm) {
+        targets.remove(vm);
+    }
+
+    public int majorInterfaceVersion() {
+        return majorVersion;
+    }
+
+    public int minorInterfaceVersion() {
+        return minorVersion;
+    }
+
+    ThreadGroup mainGroupForJDI() {
+        return mainGroupForJDI;
+    }
+
+    String getString(String key) {
+        if (messages == null) {
+            messages = ResourceBundle.getBundle("com.sun.tools.jdi.resources.jdi");
+        }
+        return messages.getString(key);
+    }
+
+}
diff --git a/src/share/classes/com/sun/tools/jdi/VirtualMachineManagerService.java b/src/share/classes/com/sun/tools/jdi/VirtualMachineManagerService.java
new file mode 100644
index 0000000..55252ad
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/VirtualMachineManagerService.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.connect.*;
+import com.sun.jdi.VirtualMachine;
+import com.sun.jdi.VirtualMachineManager;
+import java.io.IOException;
+
+/**
+ * VirtualMachineManager SPI
+ */
+public interface VirtualMachineManagerService extends VirtualMachineManager {
+    /**
+     * Replaces the default connector.
+     *
+     * @return the default {@link LaunchingConnector}
+     * @throws java.lang.IllegalArgumentException if the given
+     * connector is not a member of the list returned by
+     * {@link #launchingConnectors}
+     *
+     * @param connector the new default connector
+     */
+    void setDefaultConnector(LaunchingConnector connector);
+
+    /**
+     * Adds a connector to the list of known connectors.
+     *
+     * @param connector the connector to be added
+     */
+    void addConnector(Connector connector);
+
+    /**
+     * Removes a connector from the list of known connectors.
+     *
+     * @param connector the connector to be removed
+     */
+    void removeConnector(Connector connector);
+
+}
diff --git a/src/share/classes/com/sun/tools/jdi/VoidTypeImpl.java b/src/share/classes/com/sun/tools/jdi/VoidTypeImpl.java
new file mode 100644
index 0000000..dba2a86
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/VoidTypeImpl.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+public class VoidTypeImpl extends TypeImpl implements VoidType {
+    VoidTypeImpl(VirtualMachine vm) {
+        super(vm);
+    }
+
+    public String signature() {
+        return String.valueOf((char)JDWP.Tag.VOID);
+    }
+
+    public String toString() {
+        return name();
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/VoidValueImpl.java b/src/share/classes/com/sun/tools/jdi/VoidValueImpl.java
new file mode 100644
index 0000000..8ad5f64
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/VoidValueImpl.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 1998, 2006, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package com.sun.tools.jdi;
+
+import com.sun.jdi.*;
+
+public class VoidValueImpl extends ValueImpl implements VoidValue {
+
+    VoidValueImpl(VirtualMachine aVm) {
+        super(aVm);
+    }
+
+    public boolean equals(Object obj) {
+        return (obj != null) && (obj instanceof VoidValue) && super.equals(obj);
+    }
+
+    public int hashCode() {
+        /*
+         * TO DO: Better hash code
+         */
+        return 47245;
+    }
+
+    public Type type() {
+        return vm.theVoidType();
+    }
+
+    ValueImpl prepareForAssignmentTo(ValueContainer destination)
+                    throws InvalidTypeException {
+        if ("void".equals(destination.typeName())) {
+            return this;
+        }
+        throw new InvalidTypeException();
+    }
+
+    public String toString() {
+        return "<void value>";
+    }
+
+    byte typeValueKey() {
+        return JDWP.Tag.VOID;
+    }
+}
diff --git a/src/share/classes/com/sun/tools/jdi/resources/jdi.properties b/src/share/classes/com/sun/tools/jdi/resources/jdi.properties
new file mode 100644
index 0000000..44ee7d7
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/resources/jdi.properties
@@ -0,0 +1,52 @@
+true = true
+false = false
+version_format = Java Debug Interface (Reference Implementation) version {0}.{1} \n{2}
+raw.command = Raw command to start the debugged application VM
+raw.command.label = Command
+raw.address = Address from which to listen for a connection after the raw command is run
+raw.address.label = Address
+raw.quote = Character used to combine space-delimited text into a single command line argument
+raw.quote.label = Quote
+raw.description = Launches target using user-specified command line and attaches to it
+sun.home = Home directory of the SDK or runtime environment used to launch the application
+sun.home.label = Home 
+sun.options = Launched VM options
+sun.options.label = Options
+sun.main = Main class and arguments, or if -jar is an option, the main jar file and arguments
+sun.main.label = Main
+sun.init_suspend = All threads will be suspended before execution of main
+sun.init_suspend.label = Suspend
+sun.quote = Character used to combine space-delimited text into a single command line argument
+sun.quote.label = Quote
+sun.vm_exec = Name of the Java VM launcher
+sun.vm_exec.label = Launcher
+sun.description = Launches target using Sun Java VM command line and attaches to it
+generic_attaching.address = Address to which to attach for VM connections
+generic_attaching.address.label = Address
+generic_attaching.timeout = Timeout while waiting to attach 
+generic_attaching.timeout.label = Timeout
+generic_listening.address = Address to listen for VM connections
+generic_listening.address.label = Address
+generic_listening.timeout = Timeout while waiting for connection
+generic_listening.timeout.label = Timeout
+socket_transportservice.description = Connects debugger and debugee using a TCP connection
+memory_transportservice.description = Connects debugger and debugee using a shared memory connection
+socket_attaching.host = Machine name to which to attach for VM connections
+socket_attaching.host.label = Host
+socket_attaching.port = Port number to which to attach for VM connections
+socket_attaching.port.label = Port
+socket_attaching.description = Attaches by socket to other VMs
+socket_listening.localaddr = Local address that the listener binds to
+socket_listening.localaddr.label = Local address
+socket_listening.port = Port number at which to listen for VM connections
+socket_listening.port.label = Port
+socket_listening.description = Accepts socket connections initiated by other VMs
+memory_attaching.name = Name of the shared memory area to which to attach for VM connections
+memory_attaching.name.label = Name
+memory_attaching.description = Attaches by shared memory to other VMs
+memory_listening.name = Name of the shared memory area at which to listen for VM connection
+memory_listening.name.label = Name
+memory_listening.description = Accepts shared memory connections initiated by other VMs
+process_attaching.description = Attaches to debuggee by process-id (pid)
+process_attaching.pid = pid
+process_attaching.pid.label = Process-id (pid) of debuggee
diff --git a/src/share/classes/com/sun/tools/jdi/resources/jdi_ja.properties b/src/share/classes/com/sun/tools/jdi/resources/jdi_ja.properties
new file mode 100644
index 0000000..072936b
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/resources/jdi_ja.properties
@@ -0,0 +1,52 @@
+true = true
+false = false
+version_format = Java Debug Interface(\u30EA\u30D5\u30A1\u30EC\u30F3\u30B9\u5B9F\u88C5)\u30D0\u30FC\u30B8\u30E7\u30F3{0}.{1}\n{2}
+raw.command = \u30C7\u30D0\u30C3\u30B0\u3059\u308B\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3VM\u3092\u8D77\u52D5\u3055\u305B\u308Braw\u30B3\u30DE\u30F3\u30C9
+raw.command.label = \u30B3\u30DE\u30F3\u30C9
+raw.address = raw\u30B3\u30DE\u30F3\u30C9\u5B9F\u884C\u5F8C\u306B\u63A5\u7D9A\u3092\u30EA\u30B9\u30CB\u30F3\u30B0\u3059\u308B\u30A2\u30C9\u30EC\u30B9
+raw.address.label = \u30A2\u30C9\u30EC\u30B9
+raw.quote = \u5358\u4E00\u306E\u30B3\u30DE\u30F3\u30C9\u884C\u5F15\u6570\u5185\u306B\u30B9\u30DA\u30FC\u30B9\u3067\u533A\u5207\u3089\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u3092\u7D50\u3073\u4ED8\u3051\u308B\u305F\u3081\u306B\u4F7F\u7528\u3055\u308C\u308B\u6587\u5B57
+raw.quote.label = \u5F15\u7528\u7B26
+raw.description = \u30E6\u30FC\u30B6\u30FC\u304C\u6307\u5B9A\u3057\u305F\u30B3\u30DE\u30F3\u30C9\u884C\u3092\u4F7F\u7528\u3057\u3066\u30BF\u30FC\u30B2\u30C3\u30C8\u3092\u8D77\u52D5\u3057\u3001\u63A5\u7D9A\u3057\u307E\u3059
+sun.home = SDK\u306E\u30DB\u30FC\u30E0\u30FB\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u307E\u305F\u306F\u3001\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u306E\u8D77\u52D5\u306B\u4F7F\u7528\u3055\u308C\u308B\u5B9F\u884C\u74B0\u5883
+sun.home.label = \u30DB\u30FC\u30E0 
+sun.options = \u8D77\u52D5\u3059\u308BVM\u306E\u30AA\u30D7\u30B7\u30E7\u30F3
+sun.options.label = \u30AA\u30D7\u30B7\u30E7\u30F3
+sun.main = \u30E1\u30A4\u30F3\u30FB\u30AF\u30E9\u30B9\u3068\u5F15\u6570\u3001\u307E\u305F\u306F-jar\u304C\u30AA\u30D7\u30B7\u30E7\u30F3\u306E\u5834\u5408\u306B\u306F\u30E1\u30A4\u30F3jar\u30D5\u30A1\u30A4\u30EB\u3068\u5F15\u6570
+sun.main.label = \u30E1\u30A4\u30F3
+sun.init_suspend = \u30E1\u30A4\u30F3\u306E\u5B9F\u884C\u524D\u306B\u3059\u3079\u3066\u306E\u30B9\u30EC\u30C3\u30C9\u304C\u4E2D\u65AD\u3055\u308C\u307E\u3059\u3002
+sun.init_suspend.label = \u4E2D\u65AD
+sun.quote = \u5358\u4E00\u306E\u30B3\u30DE\u30F3\u30C9\u884C\u5F15\u6570\u5185\u306B\u30B9\u30DA\u30FC\u30B9\u3067\u533A\u5207\u3089\u308C\u305F\u30C6\u30AD\u30B9\u30C8\u3092\u7D50\u3073\u4ED8\u3051\u308B\u305F\u3081\u306B\u4F7F\u7528\u3055\u308C\u308B\u6587\u5B57
+sun.quote.label = \u5F15\u7528\u7B26
+sun.vm_exec = Java VM\u8D77\u52D5\u30C4\u30FC\u30EB\u540D
+sun.vm_exec.label = \u8D77\u52D5\u30C4\u30FC\u30EB
+sun.description = Sun\u306EJava VM\u30B3\u30DE\u30F3\u30C9\u884C\u3092\u4F7F\u7528\u3057\u3066\u30BF\u30FC\u30B2\u30C3\u30C8\u3092\u8D77\u52D5\u3057\u3001\u63A5\u7D9A\u3057\u307E\u3059
+generic_attaching.address = VM\u306B\u63A5\u7D9A\u3059\u308B\u30A2\u30C9\u30EC\u30B9
+generic_attaching.address.label = \u30A2\u30C9\u30EC\u30B9
+generic_attaching.timeout = \u63A5\u7D9A\u3092\u5F85\u3064\u9593\u306E\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8 
+generic_attaching.timeout.label = \u30BF\u30A4\u30E0\u30A2\u30A6\u30C8
+generic_listening.address = VM\u3078\u306E\u63A5\u7D9A\u3092\u30EA\u30B9\u30CB\u30F3\u30B0\u3059\u308B\u30A2\u30C9\u30EC\u30B9
+generic_listening.address.label = \u30A2\u30C9\u30EC\u30B9
+generic_listening.timeout = \u63A5\u7D9A\u3092\u5F85\u3064\u9593\u306E\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8
+generic_listening.timeout.label = \u30BF\u30A4\u30E0\u30A2\u30A6\u30C8
+socket_transportservice.description = TCP\u63A5\u7D9A\u3067\u30C7\u30D0\u30C3\u30AC\u3068\u30BF\u30FC\u30B2\u30C3\u30C8\u3092\u63A5\u7D9A\u3057\u307E\u3059
+memory_transportservice.description = \u5171\u6709\u30E1\u30E2\u30EA\u30FC\u63A5\u7D9A\u3067\u30C7\u30D0\u30C3\u30AC\u3068\u30BF\u30FC\u30B2\u30C3\u30C8\u3092\u63A5\u7D9A\u3057\u307E\u3059
+socket_attaching.host = VM\u306B\u63A5\u7D9A\u3059\u308B\u30DE\u30B7\u30F3\u540D
+socket_attaching.host.label = \u30DB\u30B9\u30C8
+socket_attaching.port = VM\u306B\u63A5\u7D9A\u3059\u308B\u30DD\u30FC\u30C8\u756A\u53F7
+socket_attaching.port.label = \u30DD\u30FC\u30C8
+socket_attaching.description = \u30BD\u30B1\u30C3\u30C8\u3067\u305D\u306E\u4ED6\u306EVM\u306B\u63A5\u7D9A\u3057\u307E\u3059
+socket_listening.localaddr = \u30EA\u30B9\u30CA\u30FC\u306E\u30D0\u30A4\u30F3\u30C9\u5148\u30ED\u30FC\u30AB\u30EB\u30FB\u30A2\u30C9\u30EC\u30B9
+socket_listening.localaddr.label = \u30ED\u30FC\u30AB\u30EB\u30FB\u30A2\u30C9\u30EC\u30B9
+socket_listening.port = VM\u3078\u306E\u63A5\u7D9A\u3092\u30EA\u30B9\u30CB\u30F3\u30B0\u3059\u308B\u30DD\u30FC\u30C8\u756A\u53F7
+socket_listening.port.label = \u30DD\u30FC\u30C8
+socket_listening.description = \u305D\u306E\u4ED6\u306EVM\u306B\u3088\u308A\u958B\u59CB\u3055\u308C\u308B\u30BD\u30B1\u30C3\u30C8\u63A5\u7D9A\u3092\u53D7\u5165\u308C\u307E\u3059
+memory_attaching.name = VM\u3078\u306E\u63A5\u7D9A\u306B\u4F7F\u7528\u3055\u308C\u308B\u5171\u6709\u30E1\u30E2\u30EA\u30FC\u9818\u57DF\u540D
+memory_attaching.name.label = \u540D\u524D
+memory_attaching.description = \u5171\u6709\u30E1\u30E2\u30EA\u30FC\u3067\u305D\u306E\u4ED6\u306EVM\u306B\u63A5\u7D9A\u3057\u307E\u3059
+memory_listening.name = VM\u3078\u306E\u63A5\u7D9A\u3092\u30EA\u30B9\u30CB\u30F3\u30B0\u3059\u308B\u305F\u3081\u306E\u5171\u6709\u30E1\u30E2\u30EA\u30FC\u9818\u57DF\u540D
+memory_listening.name.label = \u540D\u524D
+memory_listening.description = \u305D\u306E\u4ED6\u306EVM\u306B\u3088\u308A\u958B\u59CB\u3055\u308C\u308B\u5171\u6709\u30E1\u30E2\u30EA\u30FC\u63A5\u7D9A\u3092\u53D7\u3051\u5165\u308C\u307E\u3059
+process_attaching.description = \u30C7\u30D0\u30C3\u30B0\u3059\u308B\u30D7\u30ED\u30BB\u30B9\u306B\u30D7\u30ED\u30BB\u30B9ID (pid)\u3092\u4F7F\u7528\u3057\u3066\u63A5\u7D9A\u3057\u307E\u3059
+process_attaching.pid = pid
+process_attaching.pid.label = \u30C7\u30D0\u30C3\u30B0\u3059\u308B\u30D7\u30ED\u30BB\u30B9ID (pid)
diff --git a/src/share/classes/com/sun/tools/jdi/resources/jdi_zh_CN.properties b/src/share/classes/com/sun/tools/jdi/resources/jdi_zh_CN.properties
new file mode 100644
index 0000000..743a203
--- /dev/null
+++ b/src/share/classes/com/sun/tools/jdi/resources/jdi_zh_CN.properties
@@ -0,0 +1,52 @@
+true = true
+false = false
+version_format = Java \u8C03\u8BD5\u63A5\u53E3 (\u53C2\u8003\u5B9E\u73B0) \u7248\u672C {0}.{1}\n{2}
+raw.command = \u7528\u4E8E\u542F\u52A8\u8C03\u8BD5\u5E94\u7528\u7A0B\u5E8F VM \u7684\u539F\u59CB\u547D\u4EE4
+raw.command.label = \u547D\u4EE4
+raw.address = \u8FD0\u884C\u539F\u59CB\u547D\u4EE4\u4E4B\u540E, \u76D1\u542C\u8FDE\u63A5\u65F6\u4F7F\u7528\u7684\u5730\u5740
+raw.address.label = \u5730\u5740
+raw.quote = \u7528\u4E8E\u5C06\u4EE5\u7A7A\u683C\u5206\u9694\u7684\u6587\u672C\u7EC4\u5408\u4E3A\u4E00\u4E2A\u547D\u4EE4\u884C\u53C2\u6570\u7684\u5B57\u7B26
+raw.quote.label = \u5F15\u53F7
+raw.description = \u4F7F\u7528\u7528\u6237\u6307\u5B9A\u7684\u547D\u4EE4\u884C\u542F\u52A8\u76EE\u6807\u5E76\u9644\u52A0\u5230\u8BE5\u76EE\u6807
+sun.home = \u7528\u4E8E\u542F\u52A8\u5E94\u7528\u7A0B\u5E8F\u7684 SDK \u6216\u8FD0\u884C\u65F6\u73AF\u5883\u7684\u4E3B\u76EE\u5F55
+sun.home.label = \u4E3B\u76EE\u5F55 
+sun.options = \u5DF2\u542F\u52A8\u7684 VM \u9009\u9879
+sun.options.label = \u9009\u9879
+sun.main = \u4E3B\u7C7B\u548C\u53C2\u6570, \u6216\u8005\u5982\u679C -jar \u662F\u4E00\u4E2A\u9009\u9879, \u5219\u4E3A\u4E3B jar \u6587\u4EF6\u548C\u53C2\u6570
+sun.main.label = \u4E3B
+sun.init_suspend = \u5728\u6267\u884C\u4E3B\u7C7B\u4E4B\u524D, \u5C06\u6302\u8D77\u6240\u6709\u7EBF\u7A0B
+sun.init_suspend.label = \u6302\u8D77
+sun.quote = \u7528\u4E8E\u5C06\u4EE5\u7A7A\u683C\u5206\u9694\u7684\u6587\u672C\u7EC4\u5408\u4E3A\u4E00\u4E2A\u547D\u4EE4\u884C\u53C2\u6570\u7684\u5B57\u7B26
+sun.quote.label = \u5F15\u53F7
+sun.vm_exec = Java VM \u542F\u52A8\u7A0B\u5E8F\u7684\u540D\u79F0
+sun.vm_exec.label = \u542F\u52A8\u7A0B\u5E8F
+sun.description = \u4F7F\u7528 Sun Java VM \u547D\u4EE4\u884C\u542F\u52A8\u76EE\u6807\u5E76\u9644\u52A0\u5230\u8BE5\u76EE\u6807
+generic_attaching.address = VM \u8FDE\u63A5\u6240\u9644\u52A0\u5230\u7684\u5730\u5740
+generic_attaching.address.label = \u5730\u5740
+generic_attaching.timeout = \u7B49\u5F85\u9644\u52A0\u64CD\u4F5C\u65F6\u7684\u8D85\u65F6
+generic_attaching.timeout.label = \u8D85\u65F6
+generic_listening.address = \u76D1\u542C VM \u8FDE\u63A5\u65F6\u4F7F\u7528\u7684\u5730\u5740
+generic_listening.address.label = \u5730\u5740
+generic_listening.timeout = \u7B49\u5F85\u8FDE\u63A5\u65F6\u7684\u8D85\u65F6
+generic_listening.timeout.label = \u8D85\u65F6
+socket_transportservice.description = \u4F7F\u7528 TCP \u8FDE\u63A5\u6765\u8FDE\u63A5\u8C03\u8BD5\u5668\u548C\u88AB\u8C03\u8BD5\u8FDB\u7A0B
+memory_transportservice.description = \u4F7F\u7528\u5171\u4EAB\u5185\u5B58\u8FDE\u63A5\u6765\u8FDE\u63A5\u8C03\u8BD5\u5668\u548C\u88AB\u8C03\u8BD5\u8FDB\u7A0B
+socket_attaching.host = VM \u8FDE\u63A5\u6240\u9644\u52A0\u5230\u7684\u8BA1\u7B97\u673A\u540D\u79F0
+socket_attaching.host.label = \u4E3B\u673A
+socket_attaching.port = VM \u8FDE\u63A5\u6240\u9644\u52A0\u5230\u7684\u7AEF\u53E3\u53F7
+socket_attaching.port.label = \u7AEF\u53E3
+socket_attaching.description = \u901A\u8FC7\u5957\u63A5\u5B57\u9644\u52A0\u5230\u5176\u4ED6 VM
+socket_listening.localaddr = \u76D1\u542C\u7A0B\u5E8F\u7ED1\u5B9A\u5230\u7684\u672C\u5730\u5730\u5740
+socket_listening.localaddr.label = \u672C\u5730\u5730\u5740
+socket_listening.port = \u76D1\u542C VM \u8FDE\u63A5\u65F6\u4F7F\u7528\u7684\u7AEF\u53E3\u53F7
+socket_listening.port.label = \u7AEF\u53E3
+socket_listening.description = \u63A5\u53D7\u7531\u5176\u4ED6 VM \u542F\u52A8\u7684\u5957\u63A5\u5B57\u8FDE\u63A5
+memory_attaching.name = VM \u8FDE\u63A5\u6240\u9644\u52A0\u5230\u7684\u5171\u4EAB\u5185\u5B58\u533A\u57DF\u7684\u540D\u79F0
+memory_attaching.name.label = \u540D\u79F0
+memory_attaching.description = \u901A\u8FC7\u5171\u4EAB\u5185\u5B58\u9644\u52A0\u5230\u5176\u4ED6 VM
+memory_listening.name = \u76D1\u542C VM \u8FDE\u63A5\u65F6\u6240\u5728\u7684\u5171\u4EAB\u5185\u5B58\u533A\u57DF\u7684\u540D\u79F0
+memory_listening.name.label = \u540D\u79F0
+memory_listening.description = \u63A5\u53D7\u7531\u5176\u4ED6 VM \u542F\u52A8\u7684\u5171\u4EAB\u5185\u5B58\u8FDE\u63A5
+process_attaching.description = \u901A\u8FC7\u8FDB\u7A0B ID (PID) \u9644\u52A0\u5230\u88AB\u8C03\u8BD5\u8FDB\u7A0B
+process_attaching.pid = PID
+process_attaching.pid.label = \u88AB\u8C03\u8BD5\u8FDB\u7A0B\u7684\u8FDB\u7A0B ID (PID)