GitHub import

Jonathan Bell [2013-09-11 10:00:00]
GitHub import
Filename
.classpath
Ant-JUnitFormatterVMVM/.classpath
Ant-JUnitFormatterVMVM/.project
Ant-JUnitFormatterVMVM/jar-descriptor.jardesc
Ant-JUnitFormatterVMVM/lib/ant-1.7.0.jar
Ant-JUnitFormatterVMVM/lib/ant-junit-1.6.1.jar
Ant-JUnitFormatterVMVM/lib/mysql-connector-java-5.0.8-bin.jar
Ant-JUnitFormatterVMVM/src/edu/columbia/cs/psl/vmvm/AntJUnitTestListener.java
Ant-JUnitFormatterVMVM/src/edu/columbia/cs/psl/vmvm/MvnReportingListener.java
Ant-JUnitFormatterVMVM/src/edu/columbia/cs/psl/vmvm/TestReportingListener.java
InternalStaticDetector/.classpath
InternalStaticDetector/.project
InternalStaticDetector/bin/log4j.properties
InternalStaticDetector/lib/asm-all-4.0.jar
InternalStaticDetector/lib/asm-src.zip
InternalStaticDetector/lib/log4j-1.2.16.jar
InternalStaticDetector/src/edu/columbia/cs/psl/vmvm/util/StaticPutDetector.java
InternalStaticDetector/src/log4j.properties
InternalStaticDetector/static-mod
LICENSE
META-INF/MANIFEST.MF
SIRHackyJUnitRunner/.classpath
SIRHackyJUnitRunner/.project
SIRHackyJUnitRunner/.settings/org.eclipse.core.resources.prefs
SIRHackyJUnitRunner/jar-descriptor.jardesc
SIRHackyJUnitRunner/junit.jar
SIRHackyJUnitRunner/mysql-connector-java-5.0.8-bin.jar
SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/AntRunner.java
SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/JMeterRunner.java
SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/JTopasRunner.java
SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/SuiteWrapper.java
SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/TestRunner.java
SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/XMLSecurityRunner.java
fs-methods.txt
fs-output-methods.txt
instrumented-test/.classpath
instrumented-test/bin/edu/columbia/cs/psl/vmvm/test/OtherClass.class
instrumented-test/bin/edu/columbia/cs/psl/vmvm/test/SimpleClass.class
instrumented-test/src/edu/columbia/cs/psl/vmvm/test/OtherClass.java
instrumented-test/src/edu/columbia/cs/psl/vmvm/test/SimpleClass.java
jar-descriptor.jardesc
lib/asm-all-4.0.jar
lib/asm-all-4.1.jar
lib/asm-src.zip
network-methods.txt
src/DummyClass.java
src/com/rits/cloning/Cloner.java
src/edu/columbia/cs/psl/vmvm/AbstractInterceptor.java
src/edu/columbia/cs/psl/vmvm/COWAInterceptor.java
src/edu/columbia/cs/psl/vmvm/CloningUtils.java
src/edu/columbia/cs/psl/vmvm/Constants.java
src/edu/columbia/cs/psl/vmvm/FieldReflectionWrapper.java
src/edu/columbia/cs/psl/vmvm/Instrumenter.java
src/edu/columbia/cs/psl/vmvm/InstrumenterClassWriter.java
src/edu/columbia/cs/psl/vmvm/ReflectionWrapper.java
src/edu/columbia/cs/psl/vmvm/VMState.java
src/edu/columbia/cs/psl/vmvm/VMVMInstrumented.java
src/edu/columbia/cs/psl/vmvm/VirtualRuntime.java
src/edu/columbia/cs/psl/vmvm/Virtualizer.java
src/edu/columbia/cs/psl/vmvm/agent/ClassLoaderBasedTransformer.java
src/edu/columbia/cs/psl/vmvm/agent/Premain.java
src/edu/columbia/cs/psl/vmvm/agent/VMVMClassFileTransformer.java
src/edu/columbia/cs/psl/vmvm/asm/ChrootMethodVisitor.java
src/edu/columbia/cs/psl/vmvm/asm/ClinitPrintingCV.java
src/edu/columbia/cs/psl/vmvm/asm/InterceptingClassVisitor.java
src/edu/columbia/cs/psl/vmvm/asm/InterceptingMethodVisitor.java
src/edu/columbia/cs/psl/vmvm/asm/IntializedTypeAnalyzer.java
src/edu/columbia/cs/psl/vmvm/asm/InvivoAdapter.java
src/edu/columbia/cs/psl/vmvm/asm/JUnitResettingClassVisitor.java
src/edu/columbia/cs/psl/vmvm/asm/LazyCloneInterceptingMethodVisitor.java
src/edu/columbia/cs/psl/vmvm/asm/SandboxPropogatingMV.java
src/edu/columbia/cs/psl/vmvm/asm/StaticFieldIsolatorMV.java
src/edu/columbia/cs/psl/vmvm/asm/VMVMClassVisitor.java
src/edu/columbia/cs/psl/vmvm/asm/mvs/ChrootMethodVisitor.java
src/edu/columbia/cs/psl/vmvm/asm/mvs/ClassDefineInterceptMethodVisitor.java
src/edu/columbia/cs/psl/vmvm/asm/mvs/CloningAdapter.java
src/edu/columbia/cs/psl/vmvm/asm/mvs/InsnCountingMV.java
src/edu/columbia/cs/psl/vmvm/asm/mvs/InvivoAdapter.java
src/edu/columbia/cs/psl/vmvm/asm/mvs/JUnitRunnerMV.java
src/edu/columbia/cs/psl/vmvm/asm/mvs/LazyCloneInterceptingMethodVisitor.java
src/edu/columbia/cs/psl/vmvm/asm/mvs/ReflectionHackMV.java
src/edu/columbia/cs/psl/vmvm/asm/mvs/SandboxPropogatingMV.java
src/edu/columbia/cs/psl/vmvm/asm/mvs/StaticFieldIsolatorMV.java
src/edu/columbia/cs/psl/vmvm/asm/mvs/StaticFinalMutibleizer.java
src/edu/columbia/cs/psl/vmvm/asm/mvs/SystemPropertyLogger.java
src/edu/columbia/cs/psl/vmvm/asm/mvs/TypeRememberingLocalVariableSorter.java
src/edu/columbia/cs/psl/vmvm/asm/mvs/UnconditionalChrootMethodVisitor.java
src/edu/columbia/cs/psl/vmvm/asm/struct/EqFieldInsnNode.java
src/edu/columbia/cs/psl/vmvm/asm/struct/EqMethodInsnNode.java
src/edu/columbia/cs/psl/vmvm/asm/struct/EqMethodNode.java
src/edu/columbia/cs/psl/vmvm/asm/struct/MethodListClassNode.java
src/edu/columbia/cs/psl/vmvm/chroot/ChrootUtils.java
src/edu/columbia/cs/psl/vmvm/chroot/FSDetector.java
src/edu/columbia/cs/psl/vmvm/eval/DacapoPatchCallback.java
src/edu/columbia/cs/psl/vmvm/struct/MutableInstance.java
src/log4j.properties
tomcatRunner/.classpath
tomcatRunner/.project
tomcatRunner/junit.jar
tomcatRunner/src/edu/columbia/cs/psl/vmvm/junit/driver/CopyOfDriver.java
tomcatRunner/src/edu/columbia/cs/psl/vmvm/junit/driver/Driver.java
tomcatRunner/src/edu/columbia/cs/psl/vmvm/junit/driver/IvyDriver.java
tomcatRunner/src/log4j.properties
vmvm.log
diff --git a/.classpath b/.classpath
index 4ee6e61..19945d8 100644
--- a/.classpath
+++ b/.classpath
@@ -2,8 +2,8 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="lib" path="lib/asm-all-4.0.jar" sourcepath="lib/asm-src.zip"/>
-	<classpathentry kind="lib" path="lib/log4j-1.2.16.jar"/>
+	<classpathentry kind="lib" path="/Users/jon/Documents/PSL/Projects/in-vivo/vmvm/lib/asm-all-4.1.jar" sourcepath="lib/asm-src.zip"/>
 	<classpathentry kind="lib" path="lib/objenesis-1.2.jar"/>
+	<classpathentry kind="lib" path="dacapo.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/Ant-JUnitFormatterVMVM/.classpath b/Ant-JUnitFormatterVMVM/.classpath
new file mode 100644
index 0000000..6836e9c
--- /dev/null
+++ b/Ant-JUnitFormatterVMVM/.classpath
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/VMVM"/>
+	<classpathentry kind="lib" path="/VMVM/apache-tomcat-7.0.42-src/tomcatlibs/junit-4.11/junit-4.11.jar" sourcepath="/Users/jon/.m2/repository/junit/junit/4.11/junit-4.11-sources.jar"/>
+	<classpathentry kind="lib" path="lib/ant-junit-1.6.1.jar"/>
+	<classpathentry kind="lib" path="lib/ant-1.7.0.jar"/>
+	<classpathentry kind="lib" path="lib/mysql-connector-java-5.0.8-bin.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/Ant-JUnitFormatterVMVM/.project b/Ant-JUnitFormatterVMVM/.project
new file mode 100644
index 0000000..fd15ab5
--- /dev/null
+++ b/Ant-JUnitFormatterVMVM/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>Ant-JUnitFormatterVMVM</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/Ant-JUnitFormatterVMVM/jar-descriptor.jardesc b/Ant-JUnitFormatterVMVM/jar-descriptor.jardesc
new file mode 100644
index 0000000..6fc5589
--- /dev/null
+++ b/Ant-JUnitFormatterVMVM/jar-descriptor.jardesc
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="US-ASCII" standalone="no"?>
+<jardesc>
+    <jar path="VMVM/ant-formatter.jar"/>
+    <options buildIfNeeded="true" compress="false" descriptionLocation="/Ant-JUnitFormatterVMVM/jar-descriptor.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="true" overwrite="true" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
+    <storedRefactorings deprecationInfo="true" structuralOnly="false"/>
+    <selectedProjects/>
+    <manifest generateManifest="true" manifestLocation="/VMVM/META-INF/MANIFEST.MF" manifestVersion="1.0" reuseManifest="false" saveManifest="false" usesManifest="true">
+        <sealing sealJar="false">
+            <packagesToSeal/>
+            <packagesToUnSeal/>
+        </sealing>
+    </manifest>
+    <selectedElements exportClassFiles="false" exportJavaFiles="false" exportOutputFolder="true">
+        <file path="/Ant-JUnitFormatterVMVM/.project"/>
+        <file path="/Ant-JUnitFormatterVMVM/jar-descriptor.jardesc"/>
+        <file path="/Ant-JUnitFormatterVMVM/.classpath"/>
+        <javaElement handleIdentifier="=Ant-JUnitFormatterVMVM/src"/>
+    </selectedElements>
+</jardesc>
diff --git a/Ant-JUnitFormatterVMVM/lib/ant-1.7.0.jar b/Ant-JUnitFormatterVMVM/lib/ant-1.7.0.jar
new file mode 100644
index 0000000..0a56a58
Binary files /dev/null and b/Ant-JUnitFormatterVMVM/lib/ant-1.7.0.jar differ
diff --git a/Ant-JUnitFormatterVMVM/lib/ant-junit-1.6.1.jar b/Ant-JUnitFormatterVMVM/lib/ant-junit-1.6.1.jar
new file mode 100644
index 0000000..727dfdf
Binary files /dev/null and b/Ant-JUnitFormatterVMVM/lib/ant-junit-1.6.1.jar differ
diff --git a/Ant-JUnitFormatterVMVM/lib/mysql-connector-java-5.0.8-bin.jar b/Ant-JUnitFormatterVMVM/lib/mysql-connector-java-5.0.8-bin.jar
new file mode 100644
index 0000000..0170c3e
Binary files /dev/null and b/Ant-JUnitFormatterVMVM/lib/mysql-connector-java-5.0.8-bin.jar differ
diff --git a/Ant-JUnitFormatterVMVM/src/edu/columbia/cs/psl/vmvm/AntJUnitTestListener.java b/Ant-JUnitFormatterVMVM/src/edu/columbia/cs/psl/vmvm/AntJUnitTestListener.java
new file mode 100644
index 0000000..e5a7f07
--- /dev/null
+++ b/Ant-JUnitFormatterVMVM/src/edu/columbia/cs/psl/vmvm/AntJUnitTestListener.java
@@ -0,0 +1,70 @@
+package edu.columbia.cs.psl.vmvm;
+
+
+import java.io.OutputStream;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.optional.junit.JUnitResultFormatter;
+import org.apache.tools.ant.taskdefs.optional.junit.JUnitTest;
+
+
+
+public class AntJUnitTestListener implements JUnitResultFormatter{
+
+	@Override
+	public void endTestSuite(JUnitTest arg0) throws BuildException {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void setOutput(OutputStream arg0) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void setSystemError(String arg0) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void setSystemOutput(String arg0) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void startTestSuite(JUnitTest arg0) throws BuildException {
+		VirtualRuntime.resetStatics();
+	}
+
+	@Override
+	public void addError(Test arg0, Throwable arg1) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void addFailure(Test arg0, AssertionFailedError arg1) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void endTest(Test arg0) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void startTest(Test arg0) {
+		// TODO Auto-generated method stub
+
+	}
+
+}
diff --git a/Ant-JUnitFormatterVMVM/src/edu/columbia/cs/psl/vmvm/MvnReportingListener.java b/Ant-JUnitFormatterVMVM/src/edu/columbia/cs/psl/vmvm/MvnReportingListener.java
new file mode 100644
index 0000000..f1a6f7d
--- /dev/null
+++ b/Ant-JUnitFormatterVMVM/src/edu/columbia/cs/psl/vmvm/MvnReportingListener.java
@@ -0,0 +1,143 @@
+package edu.columbia.cs.psl.vmvm;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.Scanner;
+
+import org.junit.runner.Description;
+import org.junit.runner.Result;
+import org.junit.runner.notification.Failure;
+import org.junit.runner.notification.RunListener;
+
+import edu.columbia.cs.psl.vmvm.TestReportingListener.TestResult;
+
+public class MvnReportingListener extends RunListener{
+	static final Connection db = getConnection();
+	static int testID;
+	static
+	{
+		try{
+		testID  = Integer.valueOf(System.getProperty("vmvm.study.testID"));
+		}
+		catch(NumberFormatException ex)
+		{
+			Scanner s;
+			try {
+				s = new Scanner(new File("vmvm.study.testID"));
+				testID = s.nextInt();
+				s.close();
+			} catch (FileNotFoundException e) {
+				throw new IllegalStateException("No test id set!", e);
+			}
+
+		}
+		Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
+
+			@Override
+			public void run() {
+				try {
+					db.close();
+				} catch (SQLException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+			}
+		}));
+	}
+	static Connection getConnection() {
+		try {
+			Class.forName("com.mysql.jdbc.Driver");
+			return DriverManager.getConnection("jdbc:mysql://molly.cs.columbia.edu/foss?user=foss&password=f055");
+		} catch (Exception ex) {
+			ex.printStackTrace();
+		}
+		return null;
+	}
+	int nFailures;
+	Class<?> lastTestClass =null;
+	/**
+	 *  Called when an atomic test is about to be started.
+	 * */
+	public void testStarted(Description description) throws java.lang.Exception
+	{
+		if(description.getTestClass() != lastTestClass)
+		{
+			//we are doing another test class
+			if(res != null)
+				finishedClass();
+			res = new TestResult(description.getTestClass().getName());
+			lastTestClass = description.getTestClass();
+		}
+		res.nMethods++;
+	}
+	@Override
+	public void testFinished(Description description) throws Exception {
+		res.stdout.append(description.getDisplayName() + "Finished\n");
+	}
+	int nErrors;
+	@Override
+	public void testRunFinished(Result result) throws Exception {
+
+		nFailures = result.getFailureCount();
+		finishedClass();
+	}
+	private void finishedClass()
+	{
+		res.finished = System.currentTimeMillis();
+		try{
+			PreparedStatement ps = db.prepareStatement("INSERT INTO test_result_test (test_execution_id,test,time,output,success,nTestMethods,start,end,nFailures) VALUES (?,?,?,?,?,?,?,?,?)");
+			ps.setInt(1, testID);
+			ps.setString(2, res.name);
+			ps.setLong(3, res.finished-res.startTime);
+			ps.setString(4, "Stdout:\n"+res.stdout.toString()+"\n\nStderr:\n"+res.stderr.toString());
+			ps.setInt(5, nFailures>0?0:1);
+			ps.setInt(6, res.nMethods);
+			ps.setLong(7, res.startTime);
+			ps.setLong(8,res.finished);
+			ps.setInt(9, nFailures);
+			ps.executeUpdate();
+			}
+			catch(SQLException ex)
+			{
+				ex.printStackTrace();
+			}
+	}
+
+
+	/**
+	 *  Called when an atomic test fails.
+	 * */
+	public void testFailure(Failure failure) throws java.lang.Exception
+	{
+		nFailures++;
+		res.failed = true;
+		res.stderr.append("Failed on  "+failure.getTestHeader()+": " + failure.getMessage()+Arrays.toString(failure.getException().getStackTrace()));
+	}
+	TestResult res;
+	/**
+	 *  Called when a test will not be run, generally because a test method is annotated with Ignore.
+	 * */
+	public void testIgnored(Description description) throws java.lang.Exception
+	{
+		System.out.println("Execution of test case ignored : "+ description.getMethodName());
+	}
+	class TestResult
+	{
+		StringBuffer stdout = new StringBuffer();
+		StringBuffer stderr = new StringBuffer();
+		int nMethods=0;
+		long startTime = System.currentTimeMillis();
+		long finished;
+		boolean failed;
+		String name;
+		public TestResult(String name)
+		{
+			this.name=name;
+		}
+	}
+}
diff --git a/Ant-JUnitFormatterVMVM/src/edu/columbia/cs/psl/vmvm/TestReportingListener.java b/Ant-JUnitFormatterVMVM/src/edu/columbia/cs/psl/vmvm/TestReportingListener.java
new file mode 100644
index 0000000..528de38
--- /dev/null
+++ b/Ant-JUnitFormatterVMVM/src/edu/columbia/cs/psl/vmvm/TestReportingListener.java
@@ -0,0 +1,162 @@
+package edu.columbia.cs.psl.vmvm;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.OutputStream;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.Scanner;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.optional.junit.JUnitResultFormatter;
+import org.apache.tools.ant.taskdefs.optional.junit.JUnitTest;
+
+
+public class TestReportingListener implements JUnitResultFormatter {
+
+	static Connection db = getConnection();
+	static int testID;
+
+	static
+	{
+		try{
+		testID  = Integer.valueOf(System.getProperty("vmvm.study.testID"));
+		}
+		catch(NumberFormatException ex)
+		{
+			Scanner s;
+			try {
+				s = new Scanner(new File("vmvm.study.testID"));
+				testID = s.nextInt();
+				s.close();
+			} catch (FileNotFoundException e) {
+				throw new IllegalStateException("No test id set!", e);
+			}
+
+		}
+		Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
+
+			@Override
+			public void run() {
+				try {
+					db.close();
+				} catch (SQLException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+			}
+		}));
+	}
+	static Connection getConnection() {
+		try {
+			Class.forName("com.mysql.jdbc.Driver");
+			return DriverManager.getConnection("jdbc:mysql://127.0.0.1/foss?user=foss&password=f055");
+		} catch (Exception ex) {
+			ex.printStackTrace();
+		}
+		return null;
+	}
+	int nFailures;
+	@Override
+	public void addError(Test arg0, Throwable arg1) {
+		nErrors++;
+		res.failed = true;
+		res.stderr.append("Failed on  "+arg0+": " + arg1.getMessage()+Arrays.toString(arg1.getStackTrace()));
+	}
+	TestResult res;
+	@Override
+	public void addFailure(Test arg0, AssertionFailedError arg1) {
+		{
+			nFailures++;
+			res.failed = true;
+			res.stderr.append("Failed: " + arg1.getMessage());
+		}
+	}
+
+	@Override
+	public void endTest(Test arg0) {
+
+	}
+
+	@Override
+	public void startTest(Test arg0) {
+			res.nMethods++;
+	}
+static int nErrors;
+	static boolean done = false;
+	@Override
+	public void endTestSuite(JUnitTest arg0) throws BuildException {
+			res.finished = System.currentTimeMillis();
+			if(done)
+				return;
+			done = true;
+			try{
+				if(db == null)
+					db =getConnection();
+			PreparedStatement ps = db.prepareStatement("INSERT INTO test_result_test (test_execution_id,test,time,output,success,nTestMethods,start,end,nFailures,nErrors) VALUES (?,?,?,?,?,?,?,?,?,?)");
+			ps.setInt(1, testID);
+			ps.setString(2, res.name);
+			ps.setLong(3, res.finished-res.startTime);
+			ps.setString(4, "Stdout:\n"+res.stdout.toString()+"\n\nStderr:\n"+res.stderr.toString());
+			ps.setInt(5, nFailures>0?0:1);
+			ps.setInt(6, res.nMethods);
+			ps.setLong(7, res.startTime);
+			ps.setLong(8,res.finished);
+			ps.setInt(9, nFailures);
+			ps.setInt(10,nErrors);
+			ps.executeUpdate();
+			}
+			catch(SQLException ex)
+			{
+				ex.printStackTrace();
+			}
+	}
+
+	@Override
+	public void setOutput(OutputStream arg0) {
+		// TODO Auto-generated method stub
+
+	}
+
+	@Override
+	public void setSystemError(String arg0) {
+			res.stderr.append(arg0);
+	}
+
+	@Override
+	public void setSystemOutput(String arg0) {
+			res.stdout.append(arg0);
+	}
+
+	@Override
+	public void startTestSuite(JUnitTest arg0) throws BuildException {
+		done = false;
+		nFailures=0;
+		nErrors=0;
+		res = (new TestResult(arg0.getName()));
+	}
+
+	class TestResult
+	{
+		StringBuffer stdout = new StringBuffer();
+		StringBuffer stderr = new StringBuffer();
+		int nMethods=0;
+		long startTime = System.currentTimeMillis();
+		long finished;
+		boolean failed;
+		String name;
+		public TestResult(String name)
+		{
+			this.name=name;
+		}
+	}
+}
diff --git a/InternalStaticDetector/.classpath b/InternalStaticDetector/.classpath
new file mode 100644
index 0000000..9610bac
--- /dev/null
+++ b/InternalStaticDetector/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="lib" path="lib/asm-all-4.0.jar" sourcepath="lib/asm-src.zip"/>
+	<classpathentry kind="lib" path="lib/log4j-1.2.16.jar"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/VMVM"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/InternalStaticDetector/.project b/InternalStaticDetector/.project
new file mode 100644
index 0000000..7116be5
--- /dev/null
+++ b/InternalStaticDetector/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>InternalStaticDetector</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/InternalStaticDetector/bin/log4j.properties b/InternalStaticDetector/bin/log4j.properties
new file mode 100755
index 0000000..8e750ea
--- /dev/null
+++ b/InternalStaticDetector/bin/log4j.properties
@@ -0,0 +1,17 @@
+
+log4j.rootCategory=INFO, stderr, file
+
+# Pattern to output the caller's file name and line number.
+log4j.appender.stderr=org.apache.log4j.ConsoleAppender
+log4j.appender.stderr.target=System.err
+log4j.appender.stderr.layout=org.apache.log4j.PatternLayout
+log4j.appender.stderr.layout.ConversionPattern=[sd %d{HH:mm:ss}] %p [%t] %C{1}.%M(%L) | %m%n
+
+#[native-detector %d] %p [%t] %C.%M(%L) | %m%n
+
+log4j.appender.file=org.apache.log4j.RollingFileAppender
+log4j.appender.file.File=native-detector.log
+log4j.appender.file.MaxFileSize=100000KB
+log4j.appender.file.MaxBackupIndex=10
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=[sd %d{HH:mm:ss}] %p [%t] %C{1}.%M(%L) | %m%n
diff --git a/InternalStaticDetector/lib/asm-all-4.0.jar b/InternalStaticDetector/lib/asm-all-4.0.jar
new file mode 100644
index 0000000..221baed
Binary files /dev/null and b/InternalStaticDetector/lib/asm-all-4.0.jar differ
diff --git a/InternalStaticDetector/lib/asm-src.zip b/InternalStaticDetector/lib/asm-src.zip
new file mode 100644
index 0000000..2fcfff5
Binary files /dev/null and b/InternalStaticDetector/lib/asm-src.zip differ
diff --git a/InternalStaticDetector/lib/log4j-1.2.16.jar b/InternalStaticDetector/lib/log4j-1.2.16.jar
new file mode 100644
index 0000000..3f9d847
Binary files /dev/null and b/InternalStaticDetector/lib/log4j-1.2.16.jar differ
diff --git a/InternalStaticDetector/src/edu/columbia/cs/psl/vmvm/util/StaticPutDetector.java b/InternalStaticDetector/src/edu/columbia/cs/psl/vmvm/util/StaticPutDetector.java
new file mode 100644
index 0000000..eeecc0b
--- /dev/null
+++ b/InternalStaticDetector/src/edu/columbia/cs/psl/vmvm/util/StaticPutDetector.java
@@ -0,0 +1,122 @@
+package edu.columbia.cs.psl.vmvm.util;
+
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+import org.apache.log4j.Logger;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+import edu.columbia.cs.psl.vmvm.Instrumenter;
+import edu.columbia.cs.psl.vmvm.asm.struct.MethodListClassNode;
+
+
+public class StaticPutDetector {
+	private static final Logger logger = Logger.getLogger(StaticPutDetector.class);
+	private static FileWriter fw;
+	public static void main(String[] args) throws Throwable {
+		File f = new File("static-mod-methods.txt");
+		if (f.exists())
+			f.delete();
+//		fw = new FileWriter(f);
+		Instrumenter.pass_number = 0;
+		Instrumenter.MAX_CLASSES = Integer.valueOf(args[1]);
+		long start = System.currentTimeMillis();
+		Instrumenter.processJar(new File(args[0]),null);
+		Instrumenter.finishedPass();
+		long end = System.currentTimeMillis();
+		System.err.println(Instrumenter.classesInstrumented +"\t"+(end-start));
+//		for(MethodListClassNode cn : Instrumenter.instrumentedClasses.values())
+//		{
+//			if(cn.clInitCalculatedNecessary && (cn.name.startsWith("java") || cn.name.startsWith("System")))
+//			{
+//				System.err.println(cn.name);
+//			}
+//		}
+//		fw.close();
+//		findAllStatics("/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home/jre/lib/rt.jar");
+	}
+	private static void findAllStatics(String path)
+	{
+		JarFile classJar;
+		try {
+			classJar = new JarFile(path);
+
+			Enumeration<JarEntry> jarContents = classJar.entries();
+			int i = 0;
+			while (jarContents.hasMoreElements()) {
+				String name = jarContents.nextElement().getName();
+				if (!name.endsWith(".class"))
+					continue;
+				name = name.substring(0, name.length() - 6);
+				try{
+				ClassReader cr = new ClassReader(name);
+				StaticFinderCV ccv = new StaticFinderCV(Opcodes.ASM4)
+;				cr.accept(ccv, 0);
+				}
+				catch(IOException ex)
+				{
+					System.out.println(name);
+				    ex.printStackTrace();
+				}
+				i++;
+				if (i % 5000 == 0)
+					logger.info(i + " classes processed");
+			}
+			classJar.close();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
+	}
+	static class StaticFinderCV extends ClassVisitor{
+		private String className;
+		public StaticFinderCV(int api) {
+			super(api);
+		}
+		@Override
+		public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
+			this.className = name;
+		}
+		@Override
+		public void visitEnd() {
+			if(isBad && className.startsWith("java") && (sets.size() >0 || adds.size() >0))
+				System.err.println(className + adds + "." + removes + "."+sets+"."+gets);
+			super.visitEnd();
+		}
+		private boolean isBad = false;
+		private HashSet<String> adds = new HashSet<String>();
+		private HashSet<String> sets = new HashSet<String>();
+		private HashSet<String> gets = new HashSet<String>();
+		private HashSet<String> removes = new HashSet<String>();
+		@Override
+		public MethodVisitor visitMethod(int access, final String methodName, final String methodDesc, String signature, String[] exceptions) {
+			if((access & Opcodes.ACC_STATIC) != 0 && (methodName.startsWith("set") || methodName.startsWith("add") || methodName.startsWith("remove") || methodName.startsWith("get")))
+			{
+				if((access & Opcodes.ACC_PUBLIC) == 0)
+					return null;
+				if(methodName.startsWith("add"))
+					adds.add(methodName);
+				if(methodName.startsWith("remove"))
+					removes.add(methodName);
+				if(methodName.startsWith("set"))
+					sets.add(methodName);
+				if(methodName.startsWith("get"))
+					gets.add(methodName);
+
+				isBad = true;
+			}
+			return null;
+		}
+
+	}
+}
diff --git a/InternalStaticDetector/src/log4j.properties b/InternalStaticDetector/src/log4j.properties
new file mode 100755
index 0000000..8e750ea
--- /dev/null
+++ b/InternalStaticDetector/src/log4j.properties
@@ -0,0 +1,17 @@
+
+log4j.rootCategory=INFO, stderr, file
+
+# Pattern to output the caller's file name and line number.
+log4j.appender.stderr=org.apache.log4j.ConsoleAppender
+log4j.appender.stderr.target=System.err
+log4j.appender.stderr.layout=org.apache.log4j.PatternLayout
+log4j.appender.stderr.layout.ConversionPattern=[sd %d{HH:mm:ss}] %p [%t] %C{1}.%M(%L) | %m%n
+
+#[native-detector %d] %p [%t] %C.%M(%L) | %m%n
+
+log4j.appender.file=org.apache.log4j.RollingFileAppender
+log4j.appender.file.File=native-detector.log
+log4j.appender.file.MaxFileSize=100000KB
+log4j.appender.file.MaxBackupIndex=10
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=[sd %d{HH:mm:ss}] %p [%t] %C{1}.%M(%L) | %m%n
diff --git a/InternalStaticDetector/static-mod b/InternalStaticDetector/static-mod
new file mode 100644
index 0000000..208e0dd
--- /dev/null
+++ b/InternalStaticDetector/static-mod
@@ -0,0 +1,613 @@
+java/beans/Beans.setDesignTime(Z)V writes to field java/beans/Beans.designTimeZ
+java/beans/Beans.setGuiAvailable(Z)V writes to field java/beans/Beans.guiAvailableZ
+java/beans/Introspector.setBeanInfoSearchPath([Ljava/lang/String;)V writes to field java/beans/Introspector.searchPath[Ljava/lang/String;
+java/beans/MetaData.getPersistenceDelegate(Ljava/lang/Class;)Ljava/beans/PersistenceDelegate; writes to field java/beans/MetaData.arrayPersistenceDelegateLjava/beans/PersistenceDelegate;
+java/beans/MetaData.getPersistenceDelegate(Ljava/lang/Class;)Ljava/beans/PersistenceDelegate; writes to field java/beans/MetaData.proxyPersistenceDelegateLjava/beans/PersistenceDelegate;
+java/beans/PropertyEditorManager.getRegistry()Ljava/util/Hashtable; writes to field java/beans/PropertyEditorManager.registryLjava/util/Hashtable;
+java/beans/PropertyEditorManager.setEditorSearchPath([Ljava/lang/String;)V writes to field java/beans/PropertyEditorManager.searchPath[Ljava/lang/String;
+java/beans/ReflectionUtils.getMethod(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method; writes to field java/beans/ReflectionUtils.methodCacheRefLjava/lang/ref/Reference;
+java/io/Console.access$602(Ljava/io/Console;)Ljava/io/Console; writes to field java/io/Console.consLjava/io/Console;
+java/io/Console.readPassword(Ljava/lang/String;[Ljava/lang/Object;)[C writes to field java/io/Console.echoOffZ
+java/io/Console.readPassword(Ljava/lang/String;[Ljava/lang/Object;)[C writes to field java/io/Console.echoOffZ
+java/io/DeleteOnExitHook.runHooks()V writes to field java/io/DeleteOnExitHook.filesLjava/util/LinkedHashSet;
+java/lang/ApplicationShutdownHooks.runHooks()V writes to field java/lang/ApplicationShutdownHooks.hooksLjava/util/IdentityHashMap;
+java/lang/Class.access$202(Z)Z writes to field java/lang/Class.useCachesZ
+java/lang/Class.access$302(Z)Z writes to field java/lang/Class.inittedZ
+java/lang/Class.getProtectionDomain()Ljava/security/ProtectionDomain; writes to field java/lang/Class.allPermDomainLjava/security/ProtectionDomain;
+java/lang/Class.getReflectionFactory()Lsun/reflect/ReflectionFactory; writes to field java/lang/Class.reflectionFactoryLsun/reflect/ReflectionFactory;
+java/lang/ClassLoader.initSystemClassLoader()V writes to field java/lang/ClassLoader.sclLjava/lang/ClassLoader;
+java/lang/ClassLoader.initSystemClassLoader()V writes to field java/lang/ClassLoader.sclLjava/lang/ClassLoader;
+java/lang/ClassLoader.initSystemClassLoader()V writes to field java/lang/ClassLoader.sclSetZ
+java/lang/ClassLoader.loadLibrary(Ljava/lang/Class;Ljava/lang/String;Z)V writes to field java/lang/ClassLoader.sys_paths[Ljava/lang/String;
+java/lang/ClassLoader.loadLibrary(Ljava/lang/Class;Ljava/lang/String;Z)V writes to field java/lang/ClassLoader.usr_paths[Ljava/lang/String;
+java/lang/Integer.getAndRemoveCacheProperties()V writes to field java/lang/Integer.integerCacheHighPropValueLjava/lang/String;
+java/lang/Math.initRNG()V writes to field java/lang/Math.randomNumberGeneratorLjava/util/Random;
+java/lang/SecurityManager.checkPackageAccess(Ljava/lang/String;)V writes to field java/lang/SecurityManager.packageAccessValidZ
+java/lang/SecurityManager.checkPackageAccess(Ljava/lang/String;)V writes to field java/lang/SecurityManager.packageAccess[Ljava/lang/String;
+java/lang/SecurityManager.checkPackageDefinition(Ljava/lang/String;)V writes to field java/lang/SecurityManager.packageDefinitionValidZ
+java/lang/SecurityManager.checkPackageDefinition(Ljava/lang/String;)V writes to field java/lang/SecurityManager.packageDefinition[Ljava/lang/String;
+java/lang/Shutdown.exit(I)V writes to field java/lang/Shutdown.runFinalizersOnExitZ
+java/lang/Shutdown.exit(I)V writes to field java/lang/Shutdown.stateI
+java/lang/Shutdown.sequence()V writes to field java/lang/Shutdown.stateI
+java/lang/Shutdown.setRunFinalizersOnExit(Z)V writes to field java/lang/Shutdown.runFinalizersOnExitZ
+java/lang/Shutdown.shutdown()V writes to field java/lang/Shutdown.stateI
+java/lang/StrictMath.initRNG()V writes to field java/lang/StrictMath.randomNumberGeneratorLjava/util/Random;
+java/lang/StringCoding.warnUnsupportedCharset(Ljava/lang/String;)V writes to field java/lang/StringCoding.warnUnsupportedCharsetZ
+java/lang/System.console()Ljava/io/Console; writes to field java/lang/System.consLjava/io/Console;
+java/lang/System.initializeSystemClass()V writes to field java/lang/System.propsLjava/util/Properties;
+java/lang/System.setProperties(Ljava/util/Properties;)V writes to field java/lang/System.propsLjava/util/Properties;
+java/lang/System.setSecurityManager0(Ljava/lang/SecurityManager;)V writes to field java/lang/System.securityLjava/lang/SecurityManager;
+java/lang/Terminator.setup()V writes to field java/lang/Terminator.handlerLsun/misc/SignalHandler;
+java/lang/Thread.nextThreadID()J writes to field java/lang/Thread.threadSeqNumberJ
+java/lang/Thread.nextThreadNum()I writes to field java/lang/Thread.threadInitNumberI
+java/lang/Thread.setDefaultUncaughtExceptionHandler(Ljava/lang/Thread$UncaughtExceptionHandler;)V writes to field java/lang/Thread.defaultUncaughtExceptionHandlerLjava/lang/Thread$UncaughtExceptionHandler;
+java/lang/management/ManagementFactory.getPlatformMBeanServer()Ljavax/management/MBeanServer; writes to field java/lang/management/ManagementFactory.platformMBeanServerLjavax/management/MBeanServer;
+java/lang/ref/Finalizer.access$302(Ljava/lang/ref/Finalizer;)Ljava/lang/ref/Finalizer; writes to field java/lang/ref/Finalizer.unfinalizedLjava/lang/ref/Finalizer;
+java/lang/ref/Finalizer.add()V writes to field java/lang/ref/Finalizer.unfinalizedLjava/lang/ref/Finalizer;
+java/lang/ref/Finalizer.remove()V writes to field java/lang/ref/Finalizer.unfinalizedLjava/lang/ref/Finalizer;
+java/lang/ref/Finalizer.remove()V writes to field java/lang/ref/Finalizer.unfinalizedLjava/lang/ref/Finalizer;
+java/lang/ref/Reference.access$202(Ljava/lang/ref/Reference;)Ljava/lang/ref/Reference; writes to field java/lang/ref/Reference.pendingLjava/lang/ref/Reference;
+java/lang/reflect/Proxy.getProxyClass0(Ljava/lang/ClassLoader;[Ljava/lang/Class;)Ljava/lang/Class; writes to field java/lang/reflect/Proxy.nextUniqueNumberJ
+java/math/BigDecimal.expandBigIntegerTenPowers(I)Ljava/math/BigInteger; writes to field java/math/BigDecimal.BIG_TEN_POWERS_TABLE[Ljava/math/BigInteger;
+java/math/BigInteger.getSecureRandom()Ljava/util/Random; writes to field java/math/BigInteger.staticRandomLjava/util/Random;
+java/net/Authenticator.setDefault(Ljava/net/Authenticator;)V writes to field java/net/Authenticator.theAuthenticatorLjava/net/Authenticator;
+java/net/CookieHandler.setDefault(Ljava/net/CookieHandler;)V writes to field java/net/CookieHandler.cookieHandlerLjava/net/CookieHandler;
+java/net/DatagramSocket.createImpl()V writes to field java/net/DatagramSocket.implClassLjava/lang/Class;
+java/net/DatagramSocket.createImpl()V writes to field java/net/DatagramSocket.implClassLjava/lang/Class;
+java/net/DatagramSocket.setDatagramSocketImplFactory(Ljava/net/DatagramSocketImplFactory;)V writes to field java/net/DatagramSocket.factoryLjava/net/DatagramSocketImplFactory;
+java/net/HttpURLConnection.setFollowRedirects(Z)V writes to field java/net/HttpURLConnection.followRedirectsZ
+java/net/InetAddress.access$002(Lsun/net/spi/nameservice/NameService;)Lsun/net/spi/nameservice/NameService; writes to field java/net/InetAddress.nameServiceLsun/net/spi/nameservice/NameService;
+java/net/InetAddress.cacheInitIfNeeded()V writes to field java/net/InetAddress.addressCacheInitZ
+java/net/InetAddress.cacheInitIfNeeded()V writes to field java/net/InetAddress.unknown_array[Ljava/net/InetAddress;
+java/net/ProxySelector.setDefault(Ljava/net/ProxySelector;)V writes to field java/net/ProxySelector.theProxySelectorLjava/net/ProxySelector;
+java/net/ResponseCache.setDefault(Ljava/net/ResponseCache;)V writes to field java/net/ResponseCache.theResponseCacheLjava/net/ResponseCache;
+java/net/ServerSocket.setSocketFactory(Ljava/net/SocketImplFactory;)V writes to field java/net/ServerSocket.factoryLjava/net/SocketImplFactory;
+java/net/Socket.setSocketImplFactory(Ljava/net/SocketImplFactory;)V writes to field java/net/Socket.factoryLjava/net/SocketImplFactory;
+java/net/SocketPermission.getDebug()Lsun/security/util/Debug; writes to field java/net/SocketPermission.debugInitZ
+java/net/SocketPermission.getDebug()Lsun/security/util/Debug; writes to field java/net/SocketPermission.debugLsun/security/util/Debug;
+java/net/SocksSocketImpl.matchNonProxyHosts(Ljava/lang/String;)Z writes to field java/net/SocksSocketImpl.nonProxyHostsPoolLsun/misc/RegexpPool;
+java/net/SocksSocketImpl.matchNonProxyHosts(Ljava/lang/String;)Z writes to field java/net/SocksSocketImpl.nonProxyHostsPoolLsun/misc/RegexpPool;
+java/net/SocksSocketImpl.matchNonProxyHosts(Ljava/lang/String;)Z writes to field java/net/SocksSocketImpl.nonProxyHostsSourceLjava/lang/String;
+java/net/URL.setURLStreamHandlerFactory(Ljava/net/URLStreamHandlerFactory;)V writes to field java/net/URL.factoryLjava/net/URLStreamHandlerFactory;
+java/net/URLConnection.getFileNameMap()Ljava/net/FileNameMap; writes to field java/net/URLConnection.fileNameMapLjava/net/FileNameMap;
+java/net/URLConnection.getFileNameMap()Ljava/net/FileNameMap; writes to field java/net/URLConnection.fileNameMapLoadedZ
+java/net/URLConnection.setContentHandlerFactory(Ljava/net/ContentHandlerFactory;)V writes to field java/net/URLConnection.factoryLjava/net/ContentHandlerFactory;
+java/net/URLConnection.setDefaultAllowUserInteraction(Z)V writes to field java/net/URLConnection.defaultAllowUserInteractionZ
+java/net/URLConnection.setDefaultUseCaches(Z)V writes to field java/net/URLConnection.defaultUseCachesZ
+java/net/URLConnection.setFileNameMap(Ljava/net/FileNameMap;)V writes to field java/net/URLConnection.fileNameMapLjava/net/FileNameMap;
+java/nio/Bits.byteOrder()Ljava/nio/ByteOrder; writes to field java/nio/Bits.byteOrderLjava/nio/ByteOrder;
+java/nio/Bits.byteOrder()Ljava/nio/ByteOrder; writes to field java/nio/Bits.byteOrderLjava/nio/ByteOrder;
+java/nio/Bits.pageSize()I writes to field java/nio/Bits.pageSizeI
+java/nio/Bits.reserveMemory(J)V writes to field java/nio/Bits.maxMemoryJ
+java/nio/Bits.reserveMemory(J)V writes to field java/nio/Bits.memoryLimitSetZ
+java/nio/Bits.reserveMemory(J)V writes to field java/nio/Bits.reservedMemoryJ
+java/nio/Bits.reserveMemory(J)V writes to field java/nio/Bits.reservedMemoryJ
+java/nio/Bits.unaligned()Z writes to field java/nio/Bits.unalignedKnownZ
+java/nio/Bits.unaligned()Z writes to field java/nio/Bits.unalignedZ
+java/nio/Bits.unreserveMemory(J)V writes to field java/nio/Bits.reservedMemoryJ
+java/nio/channels/spi/SelectorProvider.access$102(Ljava/nio/channels/spi/SelectorProvider;)Ljava/nio/channels/spi/SelectorProvider; writes to field java/nio/channels/spi/SelectorProvider.providerLjava/nio/channels/spi/SelectorProvider;
+java/nio/channels/spi/SelectorProvider.loadProviderAsService()Z writes to field java/nio/channels/spi/SelectorProvider.providerLjava/nio/channels/spi/SelectorProvider;
+java/nio/channels/spi/SelectorProvider.loadProviderFromProperty()Z writes to field java/nio/channels/spi/SelectorProvider.providerLjava/nio/channels/spi/SelectorProvider;
+java/nio/charset/Charset.access$102(Ljava/nio/charset/spi/CharsetProvider;)Ljava/nio/charset/spi/CharsetProvider; writes to field java/nio/charset/Charset.extendedProviderLjava/nio/charset/spi/CharsetProvider;
+java/nio/charset/Charset.atBugLevel(Ljava/lang/String;)Z writes to field java/nio/charset/Charset.bugLevelLjava/lang/String;
+java/nio/charset/Charset.cache(Ljava/lang/String;Ljava/nio/charset/Charset;)V writes to field java/nio/charset/Charset.cache1[Ljava/lang/Object;
+java/nio/charset/Charset.cache(Ljava/lang/String;Ljava/nio/charset/Charset;)V writes to field java/nio/charset/Charset.cache2[Ljava/lang/Object;
+java/nio/charset/Charset.defaultCharset()Ljava/nio/charset/Charset; writes to field java/nio/charset/Charset.defaultCharsetLjava/nio/charset/Charset;
+java/nio/charset/Charset.defaultCharset()Ljava/nio/charset/Charset; writes to field java/nio/charset/Charset.defaultCharsetLjava/nio/charset/Charset;
+java/nio/charset/Charset.lookup2(Ljava/lang/String;)Ljava/nio/charset/Charset; writes to field java/nio/charset/Charset.cache1[Ljava/lang/Object;
+java/nio/charset/Charset.lookup2(Ljava/lang/String;)Ljava/nio/charset/Charset; writes to field java/nio/charset/Charset.cache2[Ljava/lang/Object;
+java/nio/charset/Charset.lookupExtendedCharset(Ljava/lang/String;)Ljava/nio/charset/Charset; writes to field java/nio/charset/Charset.extendedProviderProbedZ
+java/rmi/activation/ActivationGroup.createGroup(Ljava/rmi/activation/ActivationGroupID;Ljava/rmi/activation/ActivationGroupDesc;J)Ljava/rmi/activation/ActivationGroup; writes to field java/rmi/activation/ActivationGroup.canCreateZ
+java/rmi/activation/ActivationGroup.createGroup(Ljava/rmi/activation/ActivationGroupID;Ljava/rmi/activation/ActivationGroupDesc;J)Ljava/rmi/activation/ActivationGroup; writes to field java/rmi/activation/ActivationGroup.currGroupIDLjava/rmi/activation/ActivationGroupID;
+java/rmi/activation/ActivationGroup.createGroup(Ljava/rmi/activation/ActivationGroupID;Ljava/rmi/activation/ActivationGroupDesc;J)Ljava/rmi/activation/ActivationGroup; writes to field java/rmi/activation/ActivationGroup.currGroupLjava/rmi/activation/ActivationGroup;
+java/rmi/activation/ActivationGroup.createGroup(Ljava/rmi/activation/ActivationGroupID;Ljava/rmi/activation/ActivationGroupDesc;J)Ljava/rmi/activation/ActivationGroup; writes to field java/rmi/activation/ActivationGroup.currSystemLjava/rmi/activation/ActivationSystem;
+java/rmi/activation/ActivationGroup.destroyGroup()V writes to field java/rmi/activation/ActivationGroup.currGroupIDLjava/rmi/activation/ActivationGroupID;
+java/rmi/activation/ActivationGroup.destroyGroup()V writes to field java/rmi/activation/ActivationGroup.currGroupLjava/rmi/activation/ActivationGroup;
+java/rmi/activation/ActivationGroup.getSystem()Ljava/rmi/activation/ActivationSystem; writes to field java/rmi/activation/ActivationGroup.currSystemLjava/rmi/activation/ActivationSystem;
+java/rmi/activation/ActivationGroup.setSystem(Ljava/rmi/activation/ActivationSystem;)V writes to field java/rmi/activation/ActivationGroup.currSystemLjava/rmi/activation/ActivationSystem;
+java/rmi/server/LogStream.setDefaultStream(Ljava/io/PrintStream;)V writes to field java/rmi/server/LogStream.defaultStreamLjava/io/PrintStream;
+java/rmi/server/RMISocketFactory.getDefaultSocketFactory()Ljava/rmi/server/RMISocketFactory; writes to field java/rmi/server/RMISocketFactory.defaultSocketFactoryLjava/rmi/server/RMISocketFactory;
+java/rmi/server/RMISocketFactory.setFailureHandler(Ljava/rmi/server/RMIFailureHandler;)V writes to field java/rmi/server/RMISocketFactory.handlerLjava/rmi/server/RMIFailureHandler;
+java/rmi/server/RMISocketFactory.setSocketFactory(Ljava/rmi/server/RMISocketFactory;)V writes to field java/rmi/server/RMISocketFactory.factoryLjava/rmi/server/RMISocketFactory;
+java/rmi/server/RemoteServer.setLog(Ljava/io/OutputStream;)V writes to field java/rmi/server/RemoteServer.logNullZ
+java/rmi/server/UID.<init>()V writes to field java/rmi/server/UID.hostUniqueI
+java/rmi/server/UID.<init>()V writes to field java/rmi/server/UID.hostUniqueSetZ
+java/rmi/server/UID.<init>()V writes to field java/rmi/server/UID.lastCountS
+java/rmi/server/UID.<init>()V writes to field java/rmi/server/UID.lastCountS
+java/rmi/server/UID.<init>()V writes to field java/rmi/server/UID.lastTimeJ
+java/security/AccessControlContext.getDebug()Lsun/security/util/Debug; writes to field java/security/AccessControlContext.debugInitZ
+java/security/AccessControlContext.getDebug()Lsun/security/util/Debug; writes to field java/security/AccessControlContext.debugLsun/security/util/Debug;
+java/security/IdentityScope.setSystemScope(Ljava/security/IdentityScope;)V writes to field java/security/IdentityScope.scopeLjava/security/IdentityScope;
+java/security/Provider.getService(Ljava/lang/String;Ljava/lang/String;)Ljava/security/Provider$Service; writes to field java/security/Provider.previousKeyLjava/security/Provider$ServiceKey;
+java/security/SecureRandom.getSeed(I)[B writes to field java/security/SecureRandom.seedGeneratorLjava/security/SecureRandom;
+java/security/Security.initialize()V writes to field java/security/Security.propsLjava/util/Properties;
+java/security/Security.initialize()V writes to field java/security/Security.propsLjava/util/Properties;
+java/security/Signature$Delegate.chooseFirstProvider()V writes to field java/security/Signature$Delegate.warnCountI
+java/security/cert/CertPathHelperImpl.initialize()V writes to field sun/security/provider/certpath/CertPathHelper.instanceLsun/security/provider/certpath/CertPathHelper;
+java/sql/DriverManager.deregisterDriver(Ljava/sql/Driver;)V writes to field java/sql/DriverManager.readDriversLjava/util/Vector;
+java/sql/DriverManager.initialize()V writes to field java/sql/DriverManager.initializedZ
+java/sql/DriverManager.registerDriver(Ljava/sql/Driver;)V writes to field java/sql/DriverManager.readDriversLjava/util/Vector;
+java/sql/DriverManager.setLogStream(Ljava/io/PrintStream;)V writes to field java/sql/DriverManager.logStreamLjava/io/PrintStream;
+java/sql/DriverManager.setLogStream(Ljava/io/PrintStream;)V writes to field java/sql/DriverManager.logWriterLjava/io/PrintWriter;
+java/sql/DriverManager.setLogStream(Ljava/io/PrintStream;)V writes to field java/sql/DriverManager.logWriterLjava/io/PrintWriter;
+java/sql/DriverManager.setLogWriter(Ljava/io/PrintWriter;)V writes to field java/sql/DriverManager.logStreamLjava/io/PrintStream;
+java/sql/DriverManager.setLogWriter(Ljava/io/PrintWriter;)V writes to field java/sql/DriverManager.logWriterLjava/io/PrintWriter;
+java/sql/DriverManager.setLoginTimeout(I)V writes to field java/sql/DriverManager.loginTimeoutI
+java/util/Collections.shuffle(Ljava/util/List;)V writes to field java/util/Collections.rLjava/util/Random;
+java/util/Currency$1.run()Ljava/lang/Object; writes to field java/util/Currency.mainTableLjava/lang/String;
+java/util/Currency$1.run()Ljava/lang/Object; writes to field java/util/Currency.otherCurrenciesDFD[I
+java/util/Currency$1.run()Ljava/lang/Object; writes to field java/util/Currency.otherCurrenciesLjava/lang/String;
+java/util/Currency$1.run()Ljava/lang/Object; writes to field java/util/Currency.scCutOverTimes[J
+java/util/Currency$1.run()Ljava/lang/Object; writes to field java/util/Currency.scNewCurrenciesDFD[I
+java/util/Currency$1.run()Ljava/lang/Object; writes to field java/util/Currency.scNewCurrencies[Ljava/lang/String;
+java/util/Currency$1.run()Ljava/lang/Object; writes to field java/util/Currency.scOldCurrenciesDFD[I
+java/util/Currency$1.run()Ljava/lang/Object; writes to field java/util/Currency.scOldCurrencies[Ljava/lang/String;
+java/util/Date.getJulianCalendar()Lsun/util/calendar/BaseCalendar; writes to field java/util/Date.jcalLsun/util/calendar/BaseCalendar;
+java/util/Date.parse(Ljava/lang/String;)J writes to field java/util/Date.defaultCenturyStartI
+java/util/Formatter.access$202(D)D writes to field java/util/Formatter.scaleUpD
+java/util/GregorianCalendar.getJulianCalendarSystem()Lsun/util/calendar/BaseCalendar; writes to field java/util/GregorianCalendar.jcalLsun/util/calendar/JulianCalendar;
+java/util/GregorianCalendar.getJulianCalendarSystem()Lsun/util/calendar/BaseCalendar; writes to field java/util/GregorianCalendar.jeras[Lsun/util/calendar/Era;
+java/util/Locale.getDefault()Ljava/util/Locale; writes to field java/util/Locale.defaultLocaleLjava/util/Locale;
+java/util/Locale.getISOCountries()[Ljava/lang/String; writes to field java/util/Locale.isoCountries[Ljava/lang/String;
+java/util/Locale.getISOLanguages()[Ljava/lang/String; writes to field java/util/Locale.isoLanguages[Ljava/lang/String;
+java/util/Locale.setDefault(Ljava/util/Locale;)V writes to field java/util/Locale.defaultLocaleLjava/util/Locale;
+java/util/Random.<init>()V writes to field java/util/Random.seedUniquifierJ
+java/util/Scanner.boolPattern()Ljava/util/regex/Pattern; writes to field java/util/Scanner.boolPatternLjava/util/regex/Pattern;
+java/util/Scanner.linePattern()Ljava/util/regex/Pattern; writes to field java/util/Scanner.linePatternLjava/util/regex/Pattern;
+java/util/Scanner.separatorPattern()Ljava/util/regex/Pattern; writes to field java/util/Scanner.separatorPatternLjava/util/regex/Pattern;
+java/util/TimeZone.getDefaultInAppContext()Ljava/util/TimeZone; writes to field java/util/TimeZone.javaAWTAccessLsun/misc/JavaAWTAccess;
+java/util/TimeZone.setDefault(Ljava/util/TimeZone;)V writes to field java/util/TimeZone.defaultTimeZoneLjava/util/TimeZone;
+java/util/TimeZone.setDefaultInAppContext(Ljava/util/TimeZone;)V writes to field java/util/TimeZone.javaAWTAccessLsun/misc/JavaAWTAccess;
+java/util/TimeZone.setDefaultInAppContext(Ljava/util/TimeZone;)V writes to field java/util/TimeZone.mainAppContextDefaultLjava/util/TimeZone;
+java/util/TimeZone.setDefaultInAppContext(Ljava/util/TimeZone;)V writes to field java/util/TimeZone.mainAppContextDefaultLjava/util/TimeZone;
+java/util/TimeZone.setDefaultZone()Ljava/util/TimeZone; writes to field java/util/TimeZone.defaultTimeZoneLjava/util/TimeZone;
+java/util/Timer.serialNumber()I writes to field java/util/Timer.nextSerialNumberI
+java/util/jar/JarFile.isKnownToNotHaveClassPathAttribute()Z writes to field java/util/jar/JarFile.jarNames[Ljava/lang/String;
+java/util/jar/JarFile.isKnownToNotHaveClassPathAttribute()Z writes to field java/util/jar/JarFile.javaHomeLjava/lang/String;
+java/util/logging/LogManager.access$102(Ljava/util/logging/LogManager;)Ljava/util/logging/LogManager; writes to field java/util/logging/LogManager.managerLjava/util/logging/LogManager;
+java/util/logging/LogManager.getLoggingMXBean()Ljava/util/logging/LoggingMXBean; writes to field java/util/logging/LogManager.loggingMXBeanLjava/util/logging/LoggingMXBean;
+java/util/logging/LogRecord.<init>(Ljava/util/logging/Level;Ljava/lang/String;)V writes to field java/util/logging/LogRecord.globalSequenceNumberJ
+java/util/logging/LogRecord.<init>(Ljava/util/logging/Level;Ljava/lang/String;)V writes to field java/util/logging/LogRecord.nextThreadIdI
+java/util/prefs/AbstractPreferences.startEventDispatchThreadIfNecessary()V writes to field java/util/prefs/AbstractPreferences.eventDispatchThreadLjava/lang/Thread;
+java/util/prefs/FileSystemPreferences$2.run()Ljava/lang/Object; writes to field java/util/prefs/FileSystemPreferences.userLockFileLjava/io/File;
+java/util/prefs/FileSystemPreferences$3.run()Ljava/lang/Object; writes to field java/util/prefs/FileSystemPreferences.systemLockFileLjava/io/File;
+java/util/prefs/FileSystemPreferences.access$002(Ljava/io/File;)Ljava/io/File; writes to field java/util/prefs/FileSystemPreferences.userRootDirLjava/io/File;
+java/util/prefs/FileSystemPreferences.access$2102(Z)Z writes to field java/util/prefs/FileSystemPreferences.isUserRootModifiedZ
+java/util/prefs/FileSystemPreferences.access$2202(Z)Z writes to field java/util/prefs/FileSystemPreferences.isSystemRootModifiedZ
+java/util/prefs/FileSystemPreferences.access$302(Z)Z writes to field java/util/prefs/FileSystemPreferences.isUserRootWritableZ
+java/util/prefs/FileSystemPreferences.access$402(Ljava/io/File;)Ljava/io/File; writes to field java/util/prefs/FileSystemPreferences.userRootModFileLjava/io/File;
+java/util/prefs/FileSystemPreferences.access$502(J)J writes to field java/util/prefs/FileSystemPreferences.userRootModTimeJ
+java/util/prefs/FileSystemPreferences.access$602(Ljava/io/File;)Ljava/io/File; writes to field java/util/prefs/FileSystemPreferences.systemRootDirLjava/io/File;
+java/util/prefs/FileSystemPreferences.access$702(Z)Z writes to field java/util/prefs/FileSystemPreferences.isSystemRootWritableZ
+java/util/prefs/FileSystemPreferences.access$802(Ljava/io/File;)Ljava/io/File; writes to field java/util/prefs/FileSystemPreferences.systemRootModFileLjava/io/File;
+java/util/prefs/FileSystemPreferences.access$902(J)J writes to field java/util/prefs/FileSystemPreferences.systemRootModTimeJ
+java/util/prefs/FileSystemPreferences.getSystemRoot()Ljava/util/prefs/Preferences; writes to field java/util/prefs/FileSystemPreferences.systemRootLjava/util/prefs/Preferences;
+java/util/prefs/FileSystemPreferences.getUserRoot()Ljava/util/prefs/Preferences; writes to field java/util/prefs/FileSystemPreferences.userRootLjava/util/prefs/Preferences;
+java/util/prefs/FileSystemPreferences.lockFile(Z)Z writes to field java/util/prefs/FileSystemPreferences.systemRootLockHandleI
+java/util/prefs/FileSystemPreferences.lockFile(Z)Z writes to field java/util/prefs/FileSystemPreferences.userRootLockHandleI
+java/util/prefs/FileSystemPreferences.unlockFile()V writes to field java/util/prefs/FileSystemPreferences.systemRootLockHandleI
+java/util/prefs/FileSystemPreferences.unlockFile()V writes to field java/util/prefs/FileSystemPreferences.userRootLockHandleI
+java/util/prefs/MacOSXPreferences.getSystemRoot()Ljava/util/prefs/Preferences; writes to field java/util/prefs/MacOSXPreferences.systemRootLjava/util/prefs/MacOSXPreferences;
+java/util/prefs/MacOSXPreferences.getUserRoot()Ljava/util/prefs/Preferences; writes to field java/util/prefs/MacOSXPreferences.userRootLjava/util/prefs/MacOSXPreferences;
+java/util/prefs/MacOSXPreferencesFile.flushDelay()J writes to field java/util/prefs/MacOSXPreferencesFile.flushDelayJ
+java/util/prefs/MacOSXPreferencesFile.flushDelay()J writes to field java/util/prefs/MacOSXPreferencesFile.flushDelayJ
+java/util/prefs/MacOSXPreferencesFile.flushWorld()Z writes to field java/util/prefs/MacOSXPreferencesFile.flushTimerTaskLjava/util/prefs/MacOSXPreferencesFile$FlushTask;
+java/util/prefs/MacOSXPreferencesFile.getFile(Ljava/lang/String;Z)Ljava/util/prefs/MacOSXPreferencesFile; writes to field java/util/prefs/MacOSXPreferencesFile.cachedFilesLjava/util/HashMap;
+java/util/prefs/MacOSXPreferencesFile.initSyncTimerIfNeeded()V writes to field java/util/prefs/MacOSXPreferencesFile.syncIntervalJ
+java/util/prefs/MacOSXPreferencesFile.initSyncTimerIfNeeded()V writes to field java/util/prefs/MacOSXPreferencesFile.syncIntervalJ
+java/util/prefs/MacOSXPreferencesFile.initSyncTimerIfNeeded()V writes to field java/util/prefs/MacOSXPreferencesFile.syncIntervalJ
+java/util/prefs/MacOSXPreferencesFile.initSyncTimerIfNeeded()V writes to field java/util/prefs/MacOSXPreferencesFile.syncIntervalJ
+java/util/prefs/MacOSXPreferencesFile.markChanged()V writes to field java/util/prefs/MacOSXPreferencesFile.changedFilesLjava/util/HashSet;
+java/util/prefs/MacOSXPreferencesFile.markChanged()V writes to field java/util/prefs/MacOSXPreferencesFile.flushTimerTaskLjava/util/prefs/MacOSXPreferencesFile$FlushTask;
+java/util/prefs/MacOSXPreferencesFile.syncWorld()Z writes to field java/util/prefs/MacOSXPreferencesFile.flushTimerTaskLjava/util/prefs/MacOSXPreferencesFile$FlushTask;
+java/util/prefs/MacOSXPreferencesFile.timer()Ljava/util/Timer; writes to field java/util/prefs/MacOSXPreferencesFile.timerLjava/util/Timer;
+javax/activation/CommandMap.getDefaultCommandMap()Ljavax/activation/CommandMap; writes to field javax/activation/CommandMap.defaultCommandMapLjavax/activation/CommandMap;
+javax/activation/CommandMap.setDefaultCommandMap(Ljavax/activation/CommandMap;)V writes to field javax/activation/CommandMap.defaultCommandMapLjavax/activation/CommandMap;
+javax/activation/DataHandler.setDataContentHandlerFactory(Ljavax/activation/DataContentHandlerFactory;)V writes to field javax/activation/DataHandler.factoryLjavax/activation/DataContentHandlerFactory;
+javax/activation/FileTypeMap.getDefaultFileTypeMap()Ljavax/activation/FileTypeMap; writes to field javax/activation/FileTypeMap.defaultMapLjavax/activation/FileTypeMap;
+javax/activation/FileTypeMap.setDefaultFileTypeMap(Ljavax/activation/FileTypeMap;)V writes to field javax/activation/FileTypeMap.defaultMapLjavax/activation/FileTypeMap;
+javax/activation/MailcapCommandMap.<init>()V writes to field javax/activation/MailcapCommandMap.defDBLcom/sun/activation/registries/MailcapFile;
+javax/activation/MimetypesFileTypeMap.<init>()V writes to field javax/activation/MimetypesFileTypeMap.defDBLcom/sun/activation/registries/MimeTypeFile;
+javax/imageio/metadata/IIOMetadataFormatImpl.createStandardFormat()V writes to field javax/imageio/metadata/IIOMetadataFormatImpl.standardFormatLjavax/imageio/metadata/IIOMetadataFormat;
+javax/management/MBeanServerDelegate.getStamp()J writes to field javax/management/MBeanServerDelegate.oldStampJ
+javax/management/MBeanServerFactory.checkMBeanServerBuilder()V writes to field javax/management/MBeanServerFactory.builderLjavax/management/MBeanServerBuilder;
+javax/management/modelmbean/RequiredModelMBean.isRMMBMethodName(Ljava/lang/String;)Z writes to field javax/management/modelmbean/RequiredModelMBean.rmmbMethodNamesLjava/util/Set;
+javax/management/remote/JMXConnectorServer.nextSequenceNumber()J writes to field javax/management/remote/JMXConnectorServer.sequenceNumberJ
+javax/management/remote/rmi/RMIConnector.resolveOrb(Ljava/util/Map;)Lorg/omg/CORBA/ORB; writes to field javax/management/remote/rmi/RMIConnector.orbLjava/lang/ref/WeakReference;
+javax/management/remote/rmi/RMIServerImpl.makeConnectionId(Ljava/lang/String;Ljavax/security/auth/Subject;)Ljava/lang/String; writes to field javax/management/remote/rmi/RMIServerImpl.connectionIdNumberI
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.array$Ljava$lang$IntegerLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.array$Ljava$lang$IntegerLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.array$Ljava$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.array$Ljava$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.array$Ljava$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.array$Ljava$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.array$Ljava$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.array$Ljava$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.array$Ljavax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.array$Ljavax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$lang$IntegerLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$util$SetLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$java$util$SetLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$AttributeListLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$AttributeListLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$AttributeNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$AttributeNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$InstanceAlreadyExistsExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$InstanceAlreadyExistsExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$InstanceAlreadyExistsExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$InstanceAlreadyExistsExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$IntrospectionExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$InvalidAttributeValueExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ListenerNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ListenerNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ListenerNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$MBeanExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$MBeanExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$MBeanExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$MBeanExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$MBeanExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$MBeanExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$MBeanExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$MBeanInfoLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$MBeanRegistrationExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$NotCompliantMBeanExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$NotCompliantMBeanExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$NotCompliantMBeanExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$NotCompliantMBeanExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectInstanceLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectInstanceLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectInstanceLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectInstanceLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectInstanceLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ReflectionExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ReflectionExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ReflectionExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ReflectionExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ReflectionExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ReflectionExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ReflectionExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ReflectionExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ReflectionExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$ReflectionExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$management$remote$NotificationResultLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnectionImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIConnectionImpl_Tie.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.addNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.addNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.addNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.addNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.addNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.addNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.addNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.addNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.addNotificationListeners([Ljavax/management/ObjectName;[Ljava/rmi/MarshalledObject;[Ljavax/security/auth/Subject;)[Ljava/lang/Integer; writes to field javax/management/remote/rmi/_RMIConnection_Stub.array$Ljava$lang$IntegerLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.addNotificationListeners([Ljavax/management/ObjectName;[Ljava/rmi/MarshalledObject;[Ljavax/security/auth/Subject;)[Ljava/lang/Integer; writes to field javax/management/remote/rmi/_RMIConnection_Stub.array$Ljava$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.addNotificationListeners([Ljavax/management/ObjectName;[Ljava/rmi/MarshalledObject;[Ljavax/security/auth/Subject;)[Ljava/lang/Integer; writes to field javax/management/remote/rmi/_RMIConnection_Stub.array$Ljavax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.addNotificationListeners([Ljavax/management/ObjectName;[Ljava/rmi/MarshalledObject;[Ljavax/security/auth/Subject;)[Ljava/lang/Integer; writes to field javax/management/remote/rmi/_RMIConnection_Stub.array$Ljavax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.addNotificationListeners([Ljavax/management/ObjectName;[Ljava/rmi/MarshalledObject;[Ljavax/security/auth/Subject;)[Ljava/lang/Integer; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.addNotificationListeners([Ljavax/management/ObjectName;[Ljava/rmi/MarshalledObject;[Ljavax/security/auth/Subject;)[Ljava/lang/Integer; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.addNotificationListeners([Ljavax/management/ObjectName;[Ljava/rmi/MarshalledObject;[Ljavax/security/auth/Subject;)[Ljava/lang/Integer; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.close()V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.close()V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.array$Ljava$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$InstanceAlreadyExistsExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$MBeanExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$MBeanRegistrationExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$NotCompliantMBeanExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectInstanceLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ReflectionExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.array$Ljava$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$InstanceAlreadyExistsExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$MBeanExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$MBeanRegistrationExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$NotCompliantMBeanExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectInstanceLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ReflectionExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$InstanceAlreadyExistsExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$MBeanExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$MBeanRegistrationExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$NotCompliantMBeanExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectInstanceLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ReflectionExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$InstanceAlreadyExistsExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$MBeanExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$MBeanRegistrationExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$NotCompliantMBeanExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectInstanceLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ReflectionExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.createMBean(Ljava/lang/String;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.fetchNotifications(JIJ)Ljavax/management/remote/NotificationResult; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.fetchNotifications(JIJ)Ljavax/management/remote/NotificationResult; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$NotificationResultLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.fetchNotifications(JIJ)Ljavax/management/remote/NotificationResult; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getAttribute(Ljavax/management/ObjectName;Ljava/lang/String;Ljavax/security/auth/Subject;)Ljava/lang/Object; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getAttribute(Ljavax/management/ObjectName;Ljava/lang/String;Ljavax/security/auth/Subject;)Ljava/lang/Object; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getAttribute(Ljavax/management/ObjectName;Ljava/lang/String;Ljavax/security/auth/Subject;)Ljava/lang/Object; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$AttributeNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getAttribute(Ljavax/management/ObjectName;Ljava/lang/String;Ljavax/security/auth/Subject;)Ljava/lang/Object; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getAttribute(Ljavax/management/ObjectName;Ljava/lang/String;Ljavax/security/auth/Subject;)Ljava/lang/Object; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$MBeanExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getAttribute(Ljavax/management/ObjectName;Ljava/lang/String;Ljavax/security/auth/Subject;)Ljava/lang/Object; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getAttribute(Ljavax/management/ObjectName;Ljava/lang/String;Ljavax/security/auth/Subject;)Ljava/lang/Object; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ReflectionExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getAttribute(Ljavax/management/ObjectName;Ljava/lang/String;Ljavax/security/auth/Subject;)Ljava/lang/Object; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getAttribute(Ljavax/management/ObjectName;Ljava/lang/String;Ljavax/security/auth/Subject;)Ljava/lang/Object; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getAttributes(Ljavax/management/ObjectName;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/AttributeList; writes to field javax/management/remote/rmi/_RMIConnection_Stub.array$Ljava$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getAttributes(Ljavax/management/ObjectName;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/AttributeList; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getAttributes(Ljavax/management/ObjectName;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/AttributeList; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$AttributeListLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getAttributes(Ljavax/management/ObjectName;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/AttributeList; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getAttributes(Ljavax/management/ObjectName;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/AttributeList; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getAttributes(Ljavax/management/ObjectName;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/AttributeList; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ReflectionExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getAttributes(Ljavax/management/ObjectName;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/AttributeList; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getAttributes(Ljavax/management/ObjectName;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljavax/management/AttributeList; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getConnectionId()Ljava/lang/String; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getConnectionId()Ljava/lang/String; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getConnectionId()Ljava/lang/String; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getDefaultDomain(Ljavax/security/auth/Subject;)Ljava/lang/String; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getDefaultDomain(Ljavax/security/auth/Subject;)Ljava/lang/String; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getDefaultDomain(Ljavax/security/auth/Subject;)Ljava/lang/String; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getDefaultDomain(Ljavax/security/auth/Subject;)Ljava/lang/String; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getDomains(Ljavax/security/auth/Subject;)[Ljava/lang/String; writes to field javax/management/remote/rmi/_RMIConnection_Stub.array$Ljava$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getDomains(Ljavax/security/auth/Subject;)[Ljava/lang/String; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getDomains(Ljavax/security/auth/Subject;)[Ljava/lang/String; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getDomains(Ljavax/security/auth/Subject;)[Ljava/lang/String; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getMBeanCount(Ljavax/security/auth/Subject;)Ljava/lang/Integer; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getMBeanCount(Ljavax/security/auth/Subject;)Ljava/lang/Integer; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$lang$IntegerLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getMBeanCount(Ljavax/security/auth/Subject;)Ljava/lang/Integer; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getMBeanCount(Ljavax/security/auth/Subject;)Ljava/lang/Integer; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getMBeanInfo(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/MBeanInfo; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getMBeanInfo(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/MBeanInfo; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getMBeanInfo(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/MBeanInfo; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$IntrospectionExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getMBeanInfo(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/MBeanInfo; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$MBeanInfoLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getMBeanInfo(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/MBeanInfo; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getMBeanInfo(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/MBeanInfo; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ReflectionExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getMBeanInfo(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/MBeanInfo; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getMBeanInfo(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/MBeanInfo; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getObjectInstance(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getObjectInstance(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getObjectInstance(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectInstanceLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getObjectInstance(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getObjectInstance(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.getObjectInstance(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Ljavax/management/ObjectInstance; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.invoke(Ljavax/management/ObjectName;Ljava/lang/String;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljava/lang/Object; writes to field javax/management/remote/rmi/_RMIConnection_Stub.array$Ljava$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.invoke(Ljavax/management/ObjectName;Ljava/lang/String;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljava/lang/Object; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.invoke(Ljavax/management/ObjectName;Ljava/lang/String;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljava/lang/Object; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.invoke(Ljavax/management/ObjectName;Ljava/lang/String;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljava/lang/Object; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.invoke(Ljavax/management/ObjectName;Ljava/lang/String;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljava/lang/Object; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.invoke(Ljavax/management/ObjectName;Ljava/lang/String;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljava/lang/Object; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$MBeanExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.invoke(Ljavax/management/ObjectName;Ljava/lang/String;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljava/lang/Object; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.invoke(Ljavax/management/ObjectName;Ljava/lang/String;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljava/lang/Object; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ReflectionExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.invoke(Ljavax/management/ObjectName;Ljava/lang/String;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljava/lang/Object; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.invoke(Ljavax/management/ObjectName;Ljava/lang/String;Ljava/rmi/MarshalledObject;[Ljava/lang/String;Ljavax/security/auth/Subject;)Ljava/lang/Object; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.isInstanceOf(Ljavax/management/ObjectName;Ljava/lang/String;Ljavax/security/auth/Subject;)Z writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.isInstanceOf(Ljavax/management/ObjectName;Ljava/lang/String;Ljavax/security/auth/Subject;)Z writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.isInstanceOf(Ljavax/management/ObjectName;Ljava/lang/String;Ljavax/security/auth/Subject;)Z writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.isInstanceOf(Ljavax/management/ObjectName;Ljava/lang/String;Ljavax/security/auth/Subject;)Z writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.isInstanceOf(Ljavax/management/ObjectName;Ljava/lang/String;Ljavax/security/auth/Subject;)Z writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.isInstanceOf(Ljavax/management/ObjectName;Ljava/lang/String;Ljavax/security/auth/Subject;)Z writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.isRegistered(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Z writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.isRegistered(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Z writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.isRegistered(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Z writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.isRegistered(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)Z writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.queryMBeans(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)Ljava/util/Set; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.queryMBeans(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)Ljava/util/Set; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.queryMBeans(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)Ljava/util/Set; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$util$SetLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.queryMBeans(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)Ljava/util/Set; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.queryMBeans(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)Ljava/util/Set; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.queryMBeans(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)Ljava/util/Set; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.queryNames(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)Ljava/util/Set; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.queryNames(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)Ljava/util/Set; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.queryNames(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)Ljava/util/Set; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$util$SetLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.queryNames(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)Ljava/util/Set; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.queryNames(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)Ljava/util/Set; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.queryNames(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)Ljava/util/Set; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.removeNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.removeNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.removeNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.removeNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.removeNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ListenerNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.removeNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.removeNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.removeNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.removeNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.removeNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.removeNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.removeNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ListenerNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.removeNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.removeNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.removeNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.removeNotificationListener(Ljavax/management/ObjectName;Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.removeNotificationListeners(Ljavax/management/ObjectName;[Ljava/lang/Integer;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.array$Ljava$lang$IntegerLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.removeNotificationListeners(Ljavax/management/ObjectName;[Ljava/lang/Integer;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.removeNotificationListeners(Ljavax/management/ObjectName;[Ljava/lang/Integer;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.removeNotificationListeners(Ljavax/management/ObjectName;[Ljava/lang/Integer;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ListenerNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.removeNotificationListeners(Ljavax/management/ObjectName;[Ljava/lang/Integer;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.removeNotificationListeners(Ljavax/management/ObjectName;[Ljava/lang/Integer;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.removeNotificationListeners(Ljavax/management/ObjectName;[Ljava/lang/Integer;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.setAttribute(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.setAttribute(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.setAttribute(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$AttributeNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.setAttribute(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.setAttribute(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$InvalidAttributeValueExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.setAttribute(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$MBeanExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.setAttribute(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.setAttribute(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ReflectionExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.setAttribute(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.setAttribute(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.setAttributes(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)Ljavax/management/AttributeList; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.setAttributes(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)Ljavax/management/AttributeList; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$rmi$MarshalledObjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.setAttributes(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)Ljavax/management/AttributeList; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$AttributeListLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.setAttributes(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)Ljavax/management/AttributeList; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.setAttributes(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)Ljavax/management/AttributeList; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.setAttributes(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)Ljavax/management/AttributeList; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ReflectionExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.setAttributes(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)Ljavax/management/AttributeList; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.setAttributes(Ljavax/management/ObjectName;Ljava/rmi/MarshalledObject;Ljavax/security/auth/Subject;)Ljavax/management/AttributeList; writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.unregisterMBean(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.unregisterMBean(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$InstanceNotFoundExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.unregisterMBean(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$MBeanRegistrationExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.unregisterMBean(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$ObjectNameLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.unregisterMBean(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIConnection_Stub.unregisterMBean(Ljavax/management/ObjectName;Ljavax/security/auth/Subject;)V writes to field javax/management/remote/rmi/_RMIConnection_Stub.class$javax$security$auth$SubjectLjava/lang/Class;
+javax/management/remote/rmi/_RMIServerImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIServerImpl_Tie.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIServerImpl_Tie._invoke(Ljava/lang/String;Lorg/omg/CORBA/portable/InputStream;Lorg/omg/CORBA/portable/ResponseHandler;)Lorg/omg/CORBA/portable/OutputStream; writes to field javax/management/remote/rmi/_RMIServerImpl_Tie.class$java$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIServer_Stub.getVersion()Ljava/lang/String; writes to field javax/management/remote/rmi/_RMIServer_Stub.class$java$lang$StringLjava/lang/Class;
+javax/management/remote/rmi/_RMIServer_Stub.getVersion()Ljava/lang/String; writes to field javax/management/remote/rmi/_RMIServer_Stub.class$javax$management$remote$rmi$RMIServerLjava/lang/Class;
+javax/management/remote/rmi/_RMIServer_Stub.newClient(Ljava/lang/Object;)Ljavax/management/remote/rmi/RMIConnection; writes to field javax/management/remote/rmi/_RMIServer_Stub.class$java$io$IOExceptionLjava/lang/Class;
+javax/management/remote/rmi/_RMIServer_Stub.newClient(Ljava/lang/Object;)Ljavax/management/remote/rmi/RMIConnection; writes to field javax/management/remote/rmi/_RMIServer_Stub.class$javax$management$remote$rmi$RMIConnectionLjava/lang/Class;
+javax/management/remote/rmi/_RMIServer_Stub.newClient(Ljava/lang/Object;)Ljavax/management/remote/rmi/RMIConnection; writes to field javax/management/remote/rmi/_RMIServer_Stub.class$javax$management$remote$rmi$RMIServerLjava/lang/Class;
+javax/naming/spi/NamingManager.setInitialContextFactoryBuilder(Ljavax/naming/spi/InitialContextFactoryBuilder;)V writes to field javax/naming/spi/NamingManager.initctx_factory_builderLjavax/naming/spi/InitialContextFactoryBuilder;
+javax/naming/spi/NamingManager.setObjectFactoryBuilder(Ljavax/naming/spi/ObjectFactoryBuilder;)V writes to field javax/naming/spi/NamingManager.object_factory_builderLjavax/naming/spi/ObjectFactoryBuilder;
+javax/rmi/ssl/SslRMIClientSocketFactory.getDefaultClientSocketFactory()Ljavax/net/SocketFactory; writes to field javax/rmi/ssl/SslRMIClientSocketFactory.defaultSocketFactoryLjavax/net/SocketFactory;
+javax/rmi/ssl/SslRMIServerSocketFactory.getDefaultSSLSocketFactory()Ljavax/net/ssl/SSLSocketFactory; writes to field javax/rmi/ssl/SslRMIServerSocketFactory.defaultSSLSocketFactoryLjavax/net/ssl/SSLSocketFactory;
+javax/security/auth/Policy.getPolicyNoCheck()Ljavax/security/auth/Policy; writes to field javax/security/auth/Policy.policyLjavax/security/auth/Policy;
+javax/security/auth/Policy.setPolicy(Ljavax/security/auth/Policy;)V writes to field javax/security/auth/Policy.policyLjavax/security/auth/Policy;
+javax/security/auth/login/Configuration.getConfiguration()Ljavax/security/auth/login/Configuration; writes to field javax/security/auth/login/Configuration.configurationLjavax/security/auth/login/Configuration;
+javax/security/auth/login/Configuration.setConfiguration(Ljavax/security/auth/login/Configuration;)V writes to field javax/security/auth/login/Configuration.configurationLjavax/security/auth/login/Configuration;
+javax/sql/rowset/spi/SyncFactory.getSyncFactory()Ljavax/sql/rowset/spi/SyncFactory; writes to field javax/sql/rowset/spi/SyncFactory.syncFactoryLjavax/sql/rowset/spi/SyncFactory;
+javax/sql/rowset/spi/SyncFactory.initJNDIContext()V writes to field javax/sql/rowset/spi/SyncFactory.lazyJNDICtxRefreshZ
+javax/sql/rowset/spi/SyncFactory.initMapIfNecessary()V writes to field javax/sql/rowset/spi/SyncFactory.ROWSET_PROPERTIESLjava/lang/String;
+javax/sql/rowset/spi/SyncFactory.initMapIfNecessary()V writes to field javax/sql/rowset/spi/SyncFactory.ROWSET_PROPERTIESLjava/lang/String;
+javax/sql/rowset/spi/SyncFactory.initMapIfNecessary()V writes to field javax/sql/rowset/spi/SyncFactory.implementationsLjava/util/Hashtable;
+javax/sql/rowset/spi/SyncFactory.parseProperties(Ljava/util/Properties;)V writes to field javax/sql/rowset/spi/SyncFactory.providerImplIndexI
+javax/sql/rowset/spi/SyncFactory.setJNDIContext(Ljavax/naming/Context;)V writes to field javax/sql/rowset/spi/SyncFactory.icLjavax/naming/Context;
+javax/sql/rowset/spi/SyncFactory.setJNDIContext(Ljavax/naming/Context;)V writes to field javax/sql/rowset/spi/SyncFactory.jndiCtxEstablishedZ
+javax/sql/rowset/spi/SyncFactory.setLogger(Ljava/util/logging/Logger;)V writes to field javax/sql/rowset/spi/SyncFactory.rsLoggerLjava/util/logging/Logger;
+javax/sql/rowset/spi/SyncFactory.setLogger(Ljava/util/logging/Logger;Ljava/util/logging/Level;)V writes to field javax/sql/rowset/spi/SyncFactory.rsLoggerLjava/util/logging/Logger;
+javax/xml/bind/DatatypeConverter.setDatatypeConverter(Ljavax/xml/bind/DatatypeConverterInterface;)V writes to field javax/xml/bind/DatatypeConverter.theConverterLjavax/xml/bind/DatatypeConverterInterface;
+javax/xml/bind/JAXB.getContext(Ljava/lang/Class;)Ljavax/xml/bind/JAXBContext; writes to field javax/xml/bind/JAXB.cacheLjava/lang/ref/WeakReference;
+javax/xml/datatype/FactoryFinder.find(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object; writes to field javax/xml/datatype/FactoryFinder.firstTimeZ
+javax/xml/parsers/FactoryFinder.find(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object; writes to field javax/xml/parsers/FactoryFinder.firstTimeZ
+javax/xml/stream/FactoryFinder.find(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object; writes to field javax/xml/stream/FactoryFinder.firstTimeZ
+javax/xml/transform/FactoryFinder.find(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/Object; writes to field javax/xml/transform/FactoryFinder.firstTimeZ
+javax/xml/validation/SchemaFactoryFinder._newFactory(Ljava/lang/String;)Ljavax/xml/validation/SchemaFactory; writes to field javax/xml/validation/SchemaFactoryFinder.firstTimeZ
+javax/xml/xpath/XPathFactoryFinder._newFactory(Ljava/lang/String;)Ljavax/xml/xpath/XPathFactory; writes to field javax/xml/xpath/XPathFactoryFinder.firstTimeZ
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..e69de29
diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5593807
--- /dev/null
+++ b/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Created-By: 1.6.0_06 (Sun Microsystems Inc.)
+Main-Class: edu.columbia.cs.psl.vmvm.Instrumenter
+X-Comment: Premain-Class: edu.columbia.cs.psl.vmvm.agent.Premain
+X-Comment: Agent-Class: edu.columbia.cs.psl.vmvm.agent.Premain
+Boot-Class-Path: lib/asm-all-4.1.jar
+X-Comment: Can-Redefine-Classes: true
+X-Comment: Can-Retransform-Classes: true
+Class-Path: ./:lib/asm-all-4.1.jar
+
diff --git a/SIRHackyJUnitRunner/.classpath b/SIRHackyJUnitRunner/.classpath
new file mode 100644
index 0000000..ba9db89
--- /dev/null
+++ b/SIRHackyJUnitRunner/.classpath
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="lib" path="mysql-connector-java-5.0.8-bin.jar"/>
+	<classpathentry kind="lib" path="/VMVM/samples/sir/jakarta-jmeter/versions.alt/orig/v1/JMeter/build/components"/>
+	<classpathentry kind="lib" path="/VMVM/samples/sir/jakarta-jmeter/versions.alt/orig/v1/JMeter/build/core"/>
+	<classpathentry kind="lib" path="/VMVM/samples/sir/jakarta-jmeter/versions.alt/orig/v1/JMeter/build/functions"/>
+	<classpathentry kind="lib" path="/VMVM/samples/sir/jakarta-jmeter/versions.alt/orig/v1/JMeter/build/jorphan"/>
+	<classpathentry kind="lib" path="/VMVM/samples/sir/jakarta-jmeter/versions.alt/orig/v1/JMeter/build/org" sourcepath="/VMVM/samples/sir/jakarta-jmeter/versions.alt/orig/v1/JMeter/src/core"/>
+	<classpathentry kind="lib" path="/VMVM/samples/sir/jakarta-jmeter/versions.alt/orig/v1/JMeter/build/protocol" sourcepath="/VMVM/samples/sir/jakarta-jmeter/versions.alt/orig/v1/JMeter/src"/>
+	<classpathentry kind="lib" path="/VMVM/samples/sir/jakarta-jmeter/versions.alt/orig/v1/JMeter/lib/junit.jar"/>
+	<classpathentry kind="lib" path="/VMVM/samples/sir/apache-ant/versions.alt/orig/v0/ant/build/ant/classes"/>
+	<classpathentry kind="lib" path="/VMVM/samples/sir/apache-ant/versions.alt/orig/v0/ant/build/ant/testcases"/>
+	<classpathentry kind="lib" path="/VMVM/samples/sir/apache-xml-security/versions.alt/orig/v0/xml-security/build/classes"/>
+	<classpathentry kind="lib" path="/VMVM/samples/sir/jtopas/source/junit"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/VMVM"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/SIRHackyJUnitRunner/.project b/SIRHackyJUnitRunner/.project
new file mode 100644
index 0000000..bb4335d
--- /dev/null
+++ b/SIRHackyJUnitRunner/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>SIRHackyJUnitRunner</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/SIRHackyJUnitRunner/.settings/org.eclipse.core.resources.prefs b/SIRHackyJUnitRunner/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..d54cfc6
--- /dev/null
+++ b/SIRHackyJUnitRunner/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding//src/edu/columbia/cs/psl/vmvm/sirRunner/SuiteWrapper.java=UTF-8
diff --git a/SIRHackyJUnitRunner/jar-descriptor.jardesc b/SIRHackyJUnitRunner/jar-descriptor.jardesc
new file mode 100644
index 0000000..c9f8a6d
--- /dev/null
+++ b/SIRHackyJUnitRunner/jar-descriptor.jardesc
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="US-ASCII" standalone="no"?>
+<jardesc>
+    <jar path="/Volumes/Waldorf/sirRunner.jar"/>
+    <options buildIfNeeded="true" compress="false" descriptionLocation="/SIRHackyJUnitRunner/jar-descriptor.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="true" overwrite="true" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
+    <storedRefactorings deprecationInfo="true" structuralOnly="false"/>
+    <selectedProjects/>
+    <manifest generateManifest="true" manifestLocation="/VMVM/META-INF/MANIFEST.MF" manifestVersion="1.0" reuseManifest="false" saveManifest="false" usesManifest="true">
+        <sealing sealJar="false">
+            <packagesToSeal/>
+            <packagesToUnSeal/>
+        </sealing>
+    </manifest>
+    <selectedElements exportClassFiles="false" exportJavaFiles="false" exportOutputFolder="true">
+        <file path="/SIRHackyJUnitRunner/jar-descriptor.jardesc"/>
+        <file path="/SIRHackyJUnitRunner/.project"/>
+        <file path="/SIRHackyJUnitRunner/junit.jar"/>
+        <file path="/SIRHackyJUnitRunner/.classpath"/>
+        <javaElement handleIdentifier="=SIRHackyJUnitRunner/src"/>
+    </selectedElements>
+</jardesc>
diff --git a/SIRHackyJUnitRunner/junit.jar b/SIRHackyJUnitRunner/junit.jar
new file mode 100644
index 0000000..954851e
Binary files /dev/null and b/SIRHackyJUnitRunner/junit.jar differ
diff --git a/SIRHackyJUnitRunner/mysql-connector-java-5.0.8-bin.jar b/SIRHackyJUnitRunner/mysql-connector-java-5.0.8-bin.jar
new file mode 100644
index 0000000..0170c3e
Binary files /dev/null and b/SIRHackyJUnitRunner/mysql-connector-java-5.0.8-bin.jar differ
diff --git a/SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/AntRunner.java b/SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/AntRunner.java
new file mode 100644
index 0000000..35bc15b
--- /dev/null
+++ b/SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/AntRunner.java
@@ -0,0 +1,829 @@
+package edu.columbia.cs.psl.vmvm.sirRunner;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+
+import junit.framework.TestSuite;
+
+public class AntRunner {
+	public static void main(String[] args) {
+		String[] _args = new String[args.length-2];
+		System.arraycopy(args, 0, _args, 0, args.length-2);
+		ArrayList<String> tests = new ArrayList<>();
+		if(args[args.length - 2].equals("v0")){
+			tests.add("org.apache.tools.ant.taskdefs.GzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.GUnzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.AntStructureTest");
+			tests.add("org.apache.tools.ant.taskdefs.AntTest");
+			tests.add("org.apache.tools.ant.taskdefs.AvailableTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopydirTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopyfileTest");
+			tests.add("org.apache.tools.ant.taskdefs.DeleteTest");
+			tests.add("org.apache.tools.ant.taskdefs.DeltreeTest");
+			tests.add("org.apache.tools.ant.taskdefs.EchoTest");
+			tests.add("org.apache.tools.ant.taskdefs.FailTest");
+			tests.add("org.apache.tools.ant.taskdefs.FilterTest");
+			tests.add("org.apache.tools.ant.taskdefs.GetTest");
+			tests.add("org.apache.tools.ant.taskdefs.MkdirTest");
+			tests.add("org.apache.tools.ant.taskdefs.RenameTest");
+			tests.add("org.apache.tools.ant.taskdefs.ReplaceTest");
+			tests.add("org.apache.tools.ant.taskdefs.TarTest");
+			tests.add("org.apache.tools.ant.taskdefs.TaskdefTest");
+			tests.add("org.apache.tools.ant.taskdefs.UnzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.ZipTest");
+			tests.add("org.apache.tools.ant.types.CommandlineJavaTest");
+			tests.add("org.apache.tools.ant.types.CommandlineTest");
+			tests.add("org.apache.tools.ant.types.EnumeratedAttributeTest");
+			tests.add("org.apache.tools.ant.types.FileSetTest");
+			tests.add("org.apache.tools.ant.types.PathTest");
+			tests.add("org.apache.tools.ant.types.PatternSetTest");
+			tests.add("org.apache.tools.ant.IntrospectionHelperTest");
+			tests.add("org.apache.tools.ant.ProjectTest");
+		}else if(args[args.length - 2].equals("v1")){
+			tests.add("org.apache.tools.ant.taskdefs.GzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.GUnzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.AntStructureTest");
+			tests.add("org.apache.tools.ant.taskdefs.AntTest");
+			tests.add("org.apache.tools.ant.taskdefs.AvailableTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopydirTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopyfileTest");
+			tests.add("org.apache.tools.ant.taskdefs.DeleteTest");
+			tests.add("org.apache.tools.ant.taskdefs.DeltreeTest");
+			tests.add("org.apache.tools.ant.taskdefs.EchoTest");
+			tests.add("org.apache.tools.ant.taskdefs.FailTest");
+			tests.add("org.apache.tools.ant.taskdefs.FilterTest");
+			tests.add("org.apache.tools.ant.taskdefs.GetTest");
+			tests.add("org.apache.tools.ant.taskdefs.MkdirTest");
+			tests.add("org.apache.tools.ant.taskdefs.RenameTest");
+			tests.add("org.apache.tools.ant.taskdefs.ReplaceTest");
+			tests.add("org.apache.tools.ant.taskdefs.TarTest");
+			tests.add("org.apache.tools.ant.taskdefs.TaskdefTest");
+			tests.add("org.apache.tools.ant.taskdefs.UnzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.ZipTest");
+			tests.add("org.apache.tools.ant.types.CommandlineJavaTest");
+			tests.add("org.apache.tools.ant.types.CommandlineTest");
+			tests.add("org.apache.tools.ant.types.EnumeratedAttributeTest");
+			tests.add("org.apache.tools.ant.types.FileSetTest");
+			tests.add("org.apache.tools.ant.types.PathTest");
+			tests.add("org.apache.tools.ant.types.PatternSetTest");
+			tests.add("org.apache.tools.ant.IntrospectionHelperTest");
+			tests.add("org.apache.tools.ant.ProjectTest");
+			tests.add("org.apache.tools.ant.taskdefs.ExecuteWatchdogTest");
+			tests.add("org.apache.tools.ant.taskdefs.PropertyTest");
+			tests.add("org.apache.tools.ant.types.MapperTest");
+			tests.add("org.apache.tools.ant.util.DOMElementWriterTest");
+			tests.add("org.apache.tools.ant.util.GlobPatternMapperTest");
+			tests.add("org.apache.tools.ant.IncludeTest");
+		}else if(args[args.length - 2].equals("v2")){
+			tests.add("org.apache.tools.ant.taskdefs.GzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.GUnzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.AntStructureTest");
+			tests.add("org.apache.tools.ant.taskdefs.AntTest");
+			tests.add("org.apache.tools.ant.taskdefs.AvailableTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopydirTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopyfileTest");
+			tests.add("org.apache.tools.ant.taskdefs.DeleteTest");
+			tests.add("org.apache.tools.ant.taskdefs.DeltreeTest");
+			tests.add("org.apache.tools.ant.taskdefs.EchoTest");
+			tests.add("org.apache.tools.ant.taskdefs.FailTest");
+			tests.add("org.apache.tools.ant.taskdefs.FilterTest");
+			tests.add("org.apache.tools.ant.taskdefs.GetTest");
+			tests.add("org.apache.tools.ant.taskdefs.MkdirTest");
+			tests.add("org.apache.tools.ant.taskdefs.RenameTest");
+			tests.add("org.apache.tools.ant.taskdefs.ReplaceTest");
+			tests.add("org.apache.tools.ant.taskdefs.TarTest");
+			tests.add("org.apache.tools.ant.taskdefs.TaskdefTest");
+			tests.add("org.apache.tools.ant.taskdefs.UnzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.ZipTest");
+			tests.add("org.apache.tools.ant.types.CommandlineJavaTest");
+			tests.add("org.apache.tools.ant.types.CommandlineTest");
+			tests.add("org.apache.tools.ant.types.EnumeratedAttributeTest");
+			tests.add("org.apache.tools.ant.types.FileSetTest");
+			tests.add("org.apache.tools.ant.types.PathTest");
+			tests.add("org.apache.tools.ant.types.PatternSetTest");
+			tests.add("org.apache.tools.ant.IntrospectionHelperTest");
+			tests.add("org.apache.tools.ant.ProjectTest");
+			tests.add("org.apache.tools.ant.taskdefs.ExecuteWatchdogTest");
+			tests.add("org.apache.tools.ant.taskdefs.PropertyTest");
+			tests.add("org.apache.tools.ant.types.MapperTest");
+			tests.add("org.apache.tools.ant.util.DOMElementWriterTest");
+			tests.add("org.apache.tools.ant.util.GlobPatternMapperTest");
+			tests.add("org.apache.tools.ant.IncludeTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunnerTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopyTest");
+			tests.add("org.apache.tools.ant.taskdefs.CVSPassTest");
+			tests.add("org.apache.tools.ant.taskdefs.DependSetTest");
+			tests.add("org.apache.tools.ant.taskdefs.FixCrLfTest");
+			tests.add("org.apache.tools.ant.taskdefs.JarTest");
+			tests.add("org.apache.tools.ant.taskdefs.JavaTest");
+			tests.add("org.apache.tools.ant.taskdefs.SleepTest");
+			tests.add("org.apache.tools.ant.types.DescriptionTest");
+			tests.add("org.apache.tools.ant.types.FileListTest");
+			tests.add("org.apache.tools.ant.types.FilterSetTest");
+			tests.add("org.apache.tools.ant.util.FileUtilsTest");
+			tests.add("org.apache.tools.ant.DirectoryScannerTest");
+			tests.add("org.apache.tools.zip.AsiExtraFieldTest");
+			tests.add("org.apache.tools.zip.ExtraFieldUtilsTest");
+			tests.add("org.apache.tools.zip.ZipEntryTest");
+			tests.add("org.apache.tools.zip.ZipShortTest");
+			tests.add("org.apache.tools.zip.ZipLongTest");
+		}else if(args[args.length - 2].equals("v3")){
+			tests.add("org.apache.tools.ant.taskdefs.GzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.GUnzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.AntStructureTest");
+			tests.add("org.apache.tools.ant.taskdefs.AntTest");
+			tests.add("org.apache.tools.ant.taskdefs.AvailableTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopydirTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopyfileTest");
+			tests.add("org.apache.tools.ant.taskdefs.DeleteTest");
+			tests.add("org.apache.tools.ant.taskdefs.DeltreeTest");
+			tests.add("org.apache.tools.ant.taskdefs.EchoTest");
+			tests.add("org.apache.tools.ant.taskdefs.FailTest");
+			tests.add("org.apache.tools.ant.taskdefs.FilterTest");
+			tests.add("org.apache.tools.ant.taskdefs.GetTest");
+			tests.add("org.apache.tools.ant.taskdefs.MkdirTest");
+			tests.add("org.apache.tools.ant.taskdefs.RenameTest");
+			tests.add("org.apache.tools.ant.taskdefs.ReplaceTest");
+			tests.add("org.apache.tools.ant.taskdefs.TarTest");
+			tests.add("org.apache.tools.ant.taskdefs.TaskdefTest");
+			tests.add("org.apache.tools.ant.taskdefs.UnzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.ZipTest");
+			tests.add("org.apache.tools.ant.types.CommandlineJavaTest");
+			tests.add("org.apache.tools.ant.types.CommandlineTest");
+			tests.add("org.apache.tools.ant.types.EnumeratedAttributeTest");
+			tests.add("org.apache.tools.ant.types.FileSetTest");
+			tests.add("org.apache.tools.ant.types.PathTest");
+			tests.add("org.apache.tools.ant.types.PatternSetTest");
+			tests.add("org.apache.tools.ant.IntrospectionHelperTest");
+			tests.add("org.apache.tools.ant.ProjectTest");
+			tests.add("org.apache.tools.ant.taskdefs.ExecuteWatchdogTest");
+			tests.add("org.apache.tools.ant.taskdefs.PropertyTest");
+			tests.add("org.apache.tools.ant.types.MapperTest");
+			tests.add("org.apache.tools.ant.util.DOMElementWriterTest");
+			tests.add("org.apache.tools.ant.util.GlobPatternMapperTest");
+			tests.add("org.apache.tools.ant.IncludeTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunnerTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopyTest");
+			tests.add("org.apache.tools.ant.taskdefs.CVSPassTest");
+			tests.add("org.apache.tools.ant.taskdefs.DependSetTest");
+			tests.add("org.apache.tools.ant.taskdefs.FixCrLfTest");
+			tests.add("org.apache.tools.ant.taskdefs.JarTest");
+			tests.add("org.apache.tools.ant.taskdefs.JavaTest");
+			tests.add("org.apache.tools.ant.taskdefs.SleepTest");
+			tests.add("org.apache.tools.ant.types.DescriptionTest");
+			tests.add("org.apache.tools.ant.types.FileListTest");
+			tests.add("org.apache.tools.ant.types.FilterSetTest");
+			tests.add("org.apache.tools.ant.util.FileUtilsTest");
+			tests.add("org.apache.tools.ant.DirectoryScannerTest");
+			tests.add("org.apache.tools.zip.AsiExtraFieldTest");
+			tests.add("org.apache.tools.zip.ExtraFieldUtilsTest");
+			tests.add("org.apache.tools.zip.ZipEntryTest");
+			tests.add("org.apache.tools.zip.ZipShortTest");
+			tests.add("org.apache.tools.zip.ZipLongTest");
+		}else if(args[args.length - 2].equals("v4")){
+			tests.add("org.apache.tools.ant.taskdefs.GzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.GUnzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.AntStructureTest");
+			tests.add("org.apache.tools.ant.taskdefs.AntTest");
+			tests.add("org.apache.tools.ant.taskdefs.AvailableTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopydirTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopyfileTest");
+			tests.add("org.apache.tools.ant.taskdefs.DeleteTest");
+			tests.add("org.apache.tools.ant.taskdefs.DeltreeTest");
+			tests.add("org.apache.tools.ant.taskdefs.EchoTest");
+			tests.add("org.apache.tools.ant.taskdefs.FailTest");
+			tests.add("org.apache.tools.ant.taskdefs.FilterTest");
+			tests.add("org.apache.tools.ant.taskdefs.GetTest");
+			tests.add("org.apache.tools.ant.taskdefs.MkdirTest");
+			tests.add("org.apache.tools.ant.taskdefs.RenameTest");
+			tests.add("org.apache.tools.ant.taskdefs.ReplaceTest");
+			tests.add("org.apache.tools.ant.taskdefs.TarTest");
+			tests.add("org.apache.tools.ant.taskdefs.TaskdefTest");
+			tests.add("org.apache.tools.ant.taskdefs.UnzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.ZipTest");
+			tests.add("org.apache.tools.ant.types.CommandlineJavaTest");
+			tests.add("org.apache.tools.ant.types.CommandlineTest");
+			tests.add("org.apache.tools.ant.types.EnumeratedAttributeTest");
+			tests.add("org.apache.tools.ant.types.FileSetTest");
+			tests.add("org.apache.tools.ant.types.PathTest");
+			tests.add("org.apache.tools.ant.types.PatternSetTest");
+			tests.add("org.apache.tools.ant.IntrospectionHelperTest");
+			tests.add("org.apache.tools.ant.ProjectTest");
+			tests.add("org.apache.tools.ant.taskdefs.ExecuteWatchdogTest");
+			tests.add("org.apache.tools.ant.taskdefs.PropertyTest");
+			tests.add("org.apache.tools.ant.types.MapperTest");
+			tests.add("org.apache.tools.ant.util.DOMElementWriterTest");
+			tests.add("org.apache.tools.ant.util.GlobPatternMapperTest");
+			tests.add("org.apache.tools.ant.IncludeTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunnerTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopyTest");
+			tests.add("org.apache.tools.ant.taskdefs.CVSPassTest");
+			tests.add("org.apache.tools.ant.taskdefs.DependSetTest");
+			tests.add("org.apache.tools.ant.taskdefs.FixCrLfTest");
+			tests.add("org.apache.tools.ant.taskdefs.JarTest");
+			tests.add("org.apache.tools.ant.taskdefs.JavaTest");
+			tests.add("org.apache.tools.ant.taskdefs.SleepTest");
+			tests.add("org.apache.tools.ant.types.DescriptionTest");
+			tests.add("org.apache.tools.ant.types.FileListTest");
+			tests.add("org.apache.tools.ant.types.FilterSetTest");
+			tests.add("org.apache.tools.ant.util.FileUtilsTest");
+			tests.add("org.apache.tools.ant.DirectoryScannerTest");
+			tests.add("org.apache.tools.zip.AsiExtraFieldTest");
+			tests.add("org.apache.tools.zip.ExtraFieldUtilsTest");
+			tests.add("org.apache.tools.zip.ZipEntryTest");
+			tests.add("org.apache.tools.zip.ZipShortTest");
+			tests.add("org.apache.tools.zip.ZipLongTest");
+			tests.add("org.apache.tools.ant.taskdefs.condition.ContainsTest");
+			tests.add("org.apache.tools.ant.taskdefs.condition.EqualsTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.depend.DependTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.EchoPropertiesTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.PropertyFileTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.XmlValidateTest");
+			tests.add("org.apache.tools.ant.taskdefs.BasenameTest");
+			tests.add("org.apache.tools.ant.taskdefs.BUnzip2Test");
+			tests.add("org.apache.tools.ant.taskdefs.BZip2Test");
+			tests.add("org.apache.tools.ant.taskdefs.ChecksumTest");
+			tests.add("org.apache.tools.ant.taskdefs.ConcatTest");
+			tests.add("org.apache.tools.ant.taskdefs.ConditionTest");
+			tests.add("org.apache.tools.ant.taskdefs.DirnameTest");
+			tests.add("org.apache.tools.ant.taskdefs.DynamicTest");
+			tests.add("org.apache.tools.ant.taskdefs.ExecuteJavaTest");
+			tests.add("org.apache.tools.ant.taskdefs.InitializeClassTest");
+			tests.add("org.apache.tools.ant.taskdefs.InputTest");
+			tests.add("org.apache.tools.ant.taskdefs.JavacTest");
+			tests.add("org.apache.tools.ant.taskdefs.LoadFileTest");
+			tests.add("org.apache.tools.ant.taskdefs.LoadPropertiesTest");
+			tests.add("org.apache.tools.ant.taskdefs.ManifestTest");
+			tests.add("org.apache.tools.ant.taskdefs.MoveTest");
+			tests.add("org.apache.tools.ant.taskdefs.ParallelTest");
+			tests.add("org.apache.tools.ant.taskdefs.RmicTest");
+			tests.add("org.apache.tools.ant.taskdefs.TStampTest");
+			tests.add("org.apache.tools.ant.taskdefs.TypedefTest");
+			tests.add("org.apache.tools.ant.taskdefs.UntarTest");
+			tests.add("org.apache.tools.ant.taskdefs.WarTest");
+			tests.add("org.apache.tools.ant.taskdefs.XmlPropertyTest");
+			tests.add("org.apache.tools.ant.types.selectors.ContainsSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.DateSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.DependSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.DepthSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.FilenameSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.PresentSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.SizeSelectorTest");
+			tests.add("org.apache.tools.ant.types.DirSetTest");
+			tests.add("org.apache.tools.ant.types.FlexIntegerTest");
+			tests.add("org.apache.tools.ant.types.XMLCatalogTest");
+			tests.add("org.apache.tools.ant.util.facade.FacadeTaskHelperTest");
+			tests.add("org.apache.tools.ant.util.facade.ImplementationSpecificArgumentTest");
+			tests.add("org.apache.tools.ant.util.CollectionUtilsTest");
+			tests.add("org.apache.tools.ant.util.DateUtilsTest");
+			tests.add("org.apache.tools.ant.util.JavaEnvUtilsTest");
+			tests.add("org.apache.tools.ant.util.PackageNameMapperTest");
+			tests.add("org.apache.tools.ant.util.StringUtilsTest");
+			tests.add("org.apache.tools.ant.AntClassLoaderTest");
+			tests.add("org.apache.tools.ant.ImmutableTest");
+			tests.add("org.apache.tools.ant.PropertyExpansionTest");
+		}else if(args[args.length - 2].equals("v5")){
+			tests.add("org.apache.tools.ant.taskdefs.GzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.GUnzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.AntStructureTest");
+			tests.add("org.apache.tools.ant.taskdefs.AntTest");
+			tests.add("org.apache.tools.ant.taskdefs.AvailableTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopydirTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopyfileTest");
+			tests.add("org.apache.tools.ant.taskdefs.DeleteTest");
+			tests.add("org.apache.tools.ant.taskdefs.DeltreeTest");
+			tests.add("org.apache.tools.ant.taskdefs.EchoTest");
+			tests.add("org.apache.tools.ant.taskdefs.FailTest");
+			tests.add("org.apache.tools.ant.taskdefs.FilterTest");
+			tests.add("org.apache.tools.ant.taskdefs.GetTest");
+			tests.add("org.apache.tools.ant.taskdefs.MkdirTest");
+			tests.add("org.apache.tools.ant.taskdefs.RenameTest");
+			tests.add("org.apache.tools.ant.taskdefs.ReplaceTest");
+			tests.add("org.apache.tools.ant.taskdefs.TarTest");
+			tests.add("org.apache.tools.ant.taskdefs.TaskdefTest");
+			tests.add("org.apache.tools.ant.taskdefs.UnzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.ZipTest");
+			tests.add("org.apache.tools.ant.types.CommandlineJavaTest");
+			tests.add("org.apache.tools.ant.types.CommandlineTest");
+			tests.add("org.apache.tools.ant.types.EnumeratedAttributeTest");
+			tests.add("org.apache.tools.ant.types.FileSetTest");
+			tests.add("org.apache.tools.ant.types.PathTest");
+			tests.add("org.apache.tools.ant.types.PatternSetTest");
+			tests.add("org.apache.tools.ant.IntrospectionHelperTest");
+			tests.add("org.apache.tools.ant.ProjectTest");
+			tests.add("org.apache.tools.ant.taskdefs.ExecuteWatchdogTest");
+			tests.add("org.apache.tools.ant.taskdefs.PropertyTest");
+			tests.add("org.apache.tools.ant.types.MapperTest");
+			tests.add("org.apache.tools.ant.util.DOMElementWriterTest");
+			tests.add("org.apache.tools.ant.util.GlobPatternMapperTest");
+			tests.add("org.apache.tools.ant.IncludeTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunnerTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopyTest");
+			tests.add("org.apache.tools.ant.taskdefs.CVSPassTest");
+			tests.add("org.apache.tools.ant.taskdefs.DependSetTest");
+			tests.add("org.apache.tools.ant.taskdefs.FixCrLfTest");
+			tests.add("org.apache.tools.ant.taskdefs.JarTest");
+			tests.add("org.apache.tools.ant.taskdefs.JavaTest");
+			tests.add("org.apache.tools.ant.taskdefs.SleepTest");
+			tests.add("org.apache.tools.ant.types.DescriptionTest");
+			tests.add("org.apache.tools.ant.types.FileListTest");
+			tests.add("org.apache.tools.ant.types.FilterSetTest");
+			tests.add("org.apache.tools.ant.util.FileUtilsTest");
+			tests.add("org.apache.tools.ant.DirectoryScannerTest");
+			tests.add("org.apache.tools.zip.AsiExtraFieldTest");
+			tests.add("org.apache.tools.zip.ExtraFieldUtilsTest");
+			tests.add("org.apache.tools.zip.ZipEntryTest");
+			tests.add("org.apache.tools.zip.ZipShortTest");
+			tests.add("org.apache.tools.zip.ZipLongTest");
+			tests.add("org.apache.tools.ant.taskdefs.condition.ContainsTest");
+			tests.add("org.apache.tools.ant.taskdefs.condition.EqualsTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.depend.DependTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.EchoPropertiesTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.PropertyFileTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.XmlValidateTest");
+			tests.add("org.apache.tools.ant.taskdefs.BasenameTest");
+			tests.add("org.apache.tools.ant.taskdefs.BUnzip2Test");
+			tests.add("org.apache.tools.ant.taskdefs.BZip2Test");
+			tests.add("org.apache.tools.ant.taskdefs.ChecksumTest");
+			tests.add("org.apache.tools.ant.taskdefs.ConcatTest");
+			tests.add("org.apache.tools.ant.taskdefs.ConditionTest");
+			tests.add("org.apache.tools.ant.taskdefs.DirnameTest");
+			tests.add("org.apache.tools.ant.taskdefs.DynamicTest");
+			tests.add("org.apache.tools.ant.taskdefs.ExecuteJavaTest");
+			tests.add("org.apache.tools.ant.taskdefs.InitializeClassTest");
+			tests.add("org.apache.tools.ant.taskdefs.InputTest");
+			tests.add("org.apache.tools.ant.taskdefs.JavacTest");
+			tests.add("org.apache.tools.ant.taskdefs.LoadFileTest");
+			tests.add("org.apache.tools.ant.taskdefs.LoadPropertiesTest");
+			tests.add("org.apache.tools.ant.taskdefs.ManifestTest");
+			tests.add("org.apache.tools.ant.taskdefs.MoveTest");
+			tests.add("org.apache.tools.ant.taskdefs.ParallelTest");
+			tests.add("org.apache.tools.ant.taskdefs.RmicTest");
+			tests.add("org.apache.tools.ant.taskdefs.TStampTest");
+			tests.add("org.apache.tools.ant.taskdefs.TypedefTest");
+			tests.add("org.apache.tools.ant.taskdefs.UntarTest");
+			tests.add("org.apache.tools.ant.taskdefs.WarTest");
+			tests.add("org.apache.tools.ant.taskdefs.XmlPropertyTest");
+			tests.add("org.apache.tools.ant.types.selectors.ContainsSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.DateSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.DependSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.DepthSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.FilenameSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.PresentSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.SizeSelectorTest");
+			tests.add("org.apache.tools.ant.types.DirSetTest");
+			tests.add("org.apache.tools.ant.types.FlexIntegerTest");
+			tests.add("org.apache.tools.ant.types.XMLCatalogTest");
+			tests.add("org.apache.tools.ant.util.facade.FacadeTaskHelperTest");
+			tests.add("org.apache.tools.ant.util.facade.ImplementationSpecificArgumentTest");
+			tests.add("org.apache.tools.ant.util.CollectionUtilsTest");
+			tests.add("org.apache.tools.ant.util.DateUtilsTest");
+			tests.add("org.apache.tools.ant.util.JavaEnvUtilsTest");
+			tests.add("org.apache.tools.ant.util.PackageNameMapperTest");
+			tests.add("org.apache.tools.ant.util.StringUtilsTest");
+			tests.add("org.apache.tools.ant.AntClassLoaderTest");
+			tests.add("org.apache.tools.ant.ImmutableTest");
+			tests.add("org.apache.tools.ant.PropertyExpansionTest");
+			tests.add("org.apache.tools.ant.filters.LineContainsTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.junit.JUnitVersionHelperTest");
+			tests.add("org.apache.tools.ant.util.JAXPUtilsTest");
+		}else if(args[args.length - 2].equals("v6")){
+			tests.add("org.apache.tools.ant.taskdefs.GzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.GUnzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.AntStructureTest");
+			tests.add("org.apache.tools.ant.taskdefs.AntTest");
+			tests.add("org.apache.tools.ant.taskdefs.AvailableTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopydirTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopyfileTest");
+			tests.add("org.apache.tools.ant.taskdefs.DeleteTest");
+			tests.add("org.apache.tools.ant.taskdefs.DeltreeTest");
+			tests.add("org.apache.tools.ant.taskdefs.EchoTest");
+			tests.add("org.apache.tools.ant.taskdefs.FailTest");
+			tests.add("org.apache.tools.ant.taskdefs.FilterTest");
+			tests.add("org.apache.tools.ant.taskdefs.GetTest");
+			tests.add("org.apache.tools.ant.taskdefs.MkdirTest");
+			tests.add("org.apache.tools.ant.taskdefs.RenameTest");
+			tests.add("org.apache.tools.ant.taskdefs.ReplaceTest");
+			tests.add("org.apache.tools.ant.taskdefs.TarTest");
+			tests.add("org.apache.tools.ant.taskdefs.TaskdefTest");
+			tests.add("org.apache.tools.ant.taskdefs.UnzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.ZipTest");
+			tests.add("org.apache.tools.ant.types.CommandlineJavaTest");
+			tests.add("org.apache.tools.ant.types.CommandlineTest");
+			tests.add("org.apache.tools.ant.types.EnumeratedAttributeTest");
+			tests.add("org.apache.tools.ant.types.FileSetTest");
+			tests.add("org.apache.tools.ant.types.PathTest");
+			tests.add("org.apache.tools.ant.types.PatternSetTest");
+			tests.add("org.apache.tools.ant.IntrospectionHelperTest");
+			tests.add("org.apache.tools.ant.ProjectTest");
+			tests.add("org.apache.tools.ant.taskdefs.ExecuteWatchdogTest");
+			tests.add("org.apache.tools.ant.taskdefs.PropertyTest");
+			tests.add("org.apache.tools.ant.types.MapperTest");
+			tests.add("org.apache.tools.ant.util.DOMElementWriterTest");
+			tests.add("org.apache.tools.ant.util.GlobPatternMapperTest");
+			tests.add("org.apache.tools.ant.IncludeTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunnerTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopyTest");
+			tests.add("org.apache.tools.ant.taskdefs.CVSPassTest");
+			tests.add("org.apache.tools.ant.taskdefs.DependSetTest");
+			tests.add("org.apache.tools.ant.taskdefs.FixCrLfTest");
+			tests.add("org.apache.tools.ant.taskdefs.JarTest");
+			tests.add("org.apache.tools.ant.taskdefs.JavaTest");
+			tests.add("org.apache.tools.ant.taskdefs.SleepTest");
+			tests.add("org.apache.tools.ant.types.DescriptionTest");
+			tests.add("org.apache.tools.ant.types.FileListTest");
+			tests.add("org.apache.tools.ant.types.FilterSetTest");
+			tests.add("org.apache.tools.ant.util.FileUtilsTest");
+			tests.add("org.apache.tools.ant.DirectoryScannerTest");
+			tests.add("org.apache.tools.zip.AsiExtraFieldTest");
+			tests.add("org.apache.tools.zip.ExtraFieldUtilsTest");
+			tests.add("org.apache.tools.zip.ZipEntryTest");
+			tests.add("org.apache.tools.zip.ZipShortTest");
+			tests.add("org.apache.tools.zip.ZipLongTest");
+			tests.add("org.apache.tools.ant.taskdefs.condition.ContainsTest");
+			tests.add("org.apache.tools.ant.taskdefs.condition.EqualsTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.depend.DependTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.EchoPropertiesTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.PropertyFileTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.XmlValidateTest");
+			tests.add("org.apache.tools.ant.taskdefs.BasenameTest");
+			tests.add("org.apache.tools.ant.taskdefs.BUnzip2Test");
+			tests.add("org.apache.tools.ant.taskdefs.BZip2Test");
+			tests.add("org.apache.tools.ant.taskdefs.ChecksumTest");
+			tests.add("org.apache.tools.ant.taskdefs.ConcatTest");
+			tests.add("org.apache.tools.ant.taskdefs.ConditionTest");
+			tests.add("org.apache.tools.ant.taskdefs.DirnameTest");
+			tests.add("org.apache.tools.ant.taskdefs.DynamicTest");
+			tests.add("org.apache.tools.ant.taskdefs.ExecuteJavaTest");
+			tests.add("org.apache.tools.ant.taskdefs.InitializeClassTest");
+			tests.add("org.apache.tools.ant.taskdefs.InputTest");
+			tests.add("org.apache.tools.ant.taskdefs.JavacTest");
+			tests.add("org.apache.tools.ant.taskdefs.LoadFileTest");
+			tests.add("org.apache.tools.ant.taskdefs.LoadPropertiesTest");
+			tests.add("org.apache.tools.ant.taskdefs.ManifestTest");
+			tests.add("org.apache.tools.ant.taskdefs.MoveTest");
+			tests.add("org.apache.tools.ant.taskdefs.ParallelTest");
+			tests.add("org.apache.tools.ant.taskdefs.RmicTest");
+			tests.add("org.apache.tools.ant.taskdefs.TStampTest");
+			tests.add("org.apache.tools.ant.taskdefs.TypedefTest");
+			tests.add("org.apache.tools.ant.taskdefs.UntarTest");
+			tests.add("org.apache.tools.ant.taskdefs.WarTest");
+			tests.add("org.apache.tools.ant.taskdefs.XmlPropertyTest");
+			tests.add("org.apache.tools.ant.types.selectors.ContainsSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.DateSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.DependSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.DepthSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.FilenameSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.PresentSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.SizeSelectorTest");
+			tests.add("org.apache.tools.ant.types.DirSetTest");
+			tests.add("org.apache.tools.ant.types.FlexIntegerTest");
+			tests.add("org.apache.tools.ant.types.XMLCatalogTest");
+			tests.add("org.apache.tools.ant.util.facade.FacadeTaskHelperTest");
+			tests.add("org.apache.tools.ant.util.facade.ImplementationSpecificArgumentTest");
+			tests.add("org.apache.tools.ant.util.CollectionUtilsTest");
+			tests.add("org.apache.tools.ant.util.DateUtilsTest");
+			tests.add("org.apache.tools.ant.util.JavaEnvUtilsTest");
+			tests.add("org.apache.tools.ant.util.PackageNameMapperTest");
+			tests.add("org.apache.tools.ant.util.StringUtilsTest");
+			tests.add("org.apache.tools.ant.AntClassLoaderTest");
+			tests.add("org.apache.tools.ant.ImmutableTest");
+			tests.add("org.apache.tools.ant.PropertyExpansionTest");
+			tests.add("org.apache.tools.ant.filters.LineContainsTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.junit.JUnitVersionHelperTest");
+			tests.add("org.apache.tools.ant.util.JAXPUtilsTest");
+			tests.add("org.apache.tools.ant.TaskContainerTest");
+		}else if(args[args.length - 2].equals("v7")){
+			tests.add("org.apache.tools.ant.taskdefs.GzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.GUnzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.AntStructureTest");
+			tests.add("org.apache.tools.ant.taskdefs.AntTest");
+			tests.add("org.apache.tools.ant.taskdefs.AvailableTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopydirTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopyfileTest");
+			tests.add("org.apache.tools.ant.taskdefs.DeleteTest");
+			tests.add("org.apache.tools.ant.taskdefs.DeltreeTest");
+			tests.add("org.apache.tools.ant.taskdefs.EchoTest");
+			tests.add("org.apache.tools.ant.taskdefs.FailTest");
+			tests.add("org.apache.tools.ant.taskdefs.FilterTest");
+			tests.add("org.apache.tools.ant.taskdefs.GetTest");
+			tests.add("org.apache.tools.ant.taskdefs.MkdirTest");
+			tests.add("org.apache.tools.ant.taskdefs.RenameTest");
+			tests.add("org.apache.tools.ant.taskdefs.ReplaceTest");
+			tests.add("org.apache.tools.ant.taskdefs.TarTest");
+			tests.add("org.apache.tools.ant.taskdefs.TaskdefTest");
+			tests.add("org.apache.tools.ant.taskdefs.UnzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.ZipTest");
+			tests.add("org.apache.tools.ant.types.CommandlineJavaTest");
+			tests.add("org.apache.tools.ant.types.CommandlineTest");
+			tests.add("org.apache.tools.ant.types.EnumeratedAttributeTest");
+			tests.add("org.apache.tools.ant.types.FileSetTest");
+			tests.add("org.apache.tools.ant.types.PathTest");
+			tests.add("org.apache.tools.ant.types.PatternSetTest");
+			tests.add("org.apache.tools.ant.IntrospectionHelperTest");
+			tests.add("org.apache.tools.ant.ProjectTest");
+			tests.add("org.apache.tools.ant.taskdefs.ExecuteWatchdogTest");
+			tests.add("org.apache.tools.ant.taskdefs.PropertyTest");
+			tests.add("org.apache.tools.ant.types.MapperTest");
+			tests.add("org.apache.tools.ant.util.DOMElementWriterTest");
+			tests.add("org.apache.tools.ant.util.GlobPatternMapperTest");
+			tests.add("org.apache.tools.ant.IncludeTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunnerTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopyTest");
+			tests.add("org.apache.tools.ant.taskdefs.CVSPassTest");
+			tests.add("org.apache.tools.ant.taskdefs.DependSetTest");
+			tests.add("org.apache.tools.ant.taskdefs.FixCrLfTest");
+			tests.add("org.apache.tools.ant.taskdefs.JarTest");
+			tests.add("org.apache.tools.ant.taskdefs.JavaTest");
+			tests.add("org.apache.tools.ant.taskdefs.SleepTest");
+			tests.add("org.apache.tools.ant.types.DescriptionTest");
+			tests.add("org.apache.tools.ant.types.FileListTest");
+			tests.add("org.apache.tools.ant.types.FilterSetTest");
+			tests.add("org.apache.tools.ant.util.FileUtilsTest");
+			tests.add("org.apache.tools.ant.DirectoryScannerTest");
+			tests.add("org.apache.tools.zip.AsiExtraFieldTest");
+			tests.add("org.apache.tools.zip.ExtraFieldUtilsTest");
+			tests.add("org.apache.tools.zip.ZipEntryTest");
+			tests.add("org.apache.tools.zip.ZipShortTest");
+			tests.add("org.apache.tools.zip.ZipLongTest");
+			tests.add("org.apache.tools.ant.taskdefs.condition.ContainsTest");
+			tests.add("org.apache.tools.ant.taskdefs.condition.EqualsTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.depend.DependTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.EchoPropertiesTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.PropertyFileTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.XmlValidateTest");
+			tests.add("org.apache.tools.ant.taskdefs.BasenameTest");
+			tests.add("org.apache.tools.ant.taskdefs.BUnzip2Test");
+			tests.add("org.apache.tools.ant.taskdefs.BZip2Test");
+			tests.add("org.apache.tools.ant.taskdefs.ChecksumTest");
+			tests.add("org.apache.tools.ant.taskdefs.ConcatTest");
+			tests.add("org.apache.tools.ant.taskdefs.ConditionTest");
+			tests.add("org.apache.tools.ant.taskdefs.DirnameTest");
+			tests.add("org.apache.tools.ant.taskdefs.DynamicTest");
+			tests.add("org.apache.tools.ant.taskdefs.ExecuteJavaTest");
+			tests.add("org.apache.tools.ant.taskdefs.InitializeClassTest");
+			tests.add("org.apache.tools.ant.taskdefs.InputTest");
+			tests.add("org.apache.tools.ant.taskdefs.JavacTest");
+			tests.add("org.apache.tools.ant.taskdefs.LoadFileTest");
+			tests.add("org.apache.tools.ant.taskdefs.LoadPropertiesTest");
+			tests.add("org.apache.tools.ant.taskdefs.ManifestTest");
+			tests.add("org.apache.tools.ant.taskdefs.MoveTest");
+			tests.add("org.apache.tools.ant.taskdefs.ParallelTest");
+			tests.add("org.apache.tools.ant.taskdefs.RmicTest");
+			tests.add("org.apache.tools.ant.taskdefs.TStampTest");
+			tests.add("org.apache.tools.ant.taskdefs.TypedefTest");
+			tests.add("org.apache.tools.ant.taskdefs.UntarTest");
+			tests.add("org.apache.tools.ant.taskdefs.WarTest");
+			tests.add("org.apache.tools.ant.taskdefs.XmlPropertyTest");
+			tests.add("org.apache.tools.ant.types.selectors.ContainsSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.DateSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.DependSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.DepthSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.FilenameSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.PresentSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.SizeSelectorTest");
+			tests.add("org.apache.tools.ant.types.DirSetTest");
+			tests.add("org.apache.tools.ant.types.FlexIntegerTest");
+			tests.add("org.apache.tools.ant.types.XMLCatalogTest");
+			tests.add("org.apache.tools.ant.util.facade.FacadeTaskHelperTest");
+			tests.add("org.apache.tools.ant.util.facade.ImplementationSpecificArgumentTest");
+			tests.add("org.apache.tools.ant.util.CollectionUtilsTest");
+			tests.add("org.apache.tools.ant.util.DateUtilsTest");
+			tests.add("org.apache.tools.ant.util.JavaEnvUtilsTest");
+			tests.add("org.apache.tools.ant.util.PackageNameMapperTest");
+			tests.add("org.apache.tools.ant.util.StringUtilsTest");
+			tests.add("org.apache.tools.ant.AntClassLoaderTest");
+			tests.add("org.apache.tools.ant.ImmutableTest");
+			tests.add("org.apache.tools.ant.PropertyExpansionTest");
+			tests.add("org.apache.tools.ant.filters.LineContainsTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.junit.JUnitVersionHelperTest");
+			tests.add("org.apache.tools.ant.util.JAXPUtilsTest");
+			tests.add("org.apache.tools.ant.TaskContainerTest");
+			tests.add("org.apache.tools.ant.taskdefs.AntLikeTasksAtTopLevelTest");
+			tests.add("org.apache.tools.ant.taskdefs.AntlibTest");
+			tests.add("org.apache.tools.ant.taskdefs.CallTargetTest");
+			tests.add("org.apache.tools.ant.taskdefs.DefaultExcludesTest");
+			tests.add("org.apache.tools.ant.taskdefs.ExecTaskTest");
+			tests.add("org.apache.tools.ant.taskdefs.ImportTest");
+			tests.add("org.apache.tools.ant.taskdefs.MacroDefTest");
+			tests.add("org.apache.tools.ant.taskdefs.MultiMapTest");
+			tests.add("org.apache.tools.ant.taskdefs.PreSetDefTest");
+			tests.add("org.apache.tools.ant.taskdefs.SignJarTest");
+			tests.add("org.apache.tools.ant.taskdefs.SubAntTest");
+			tests.add("org.apache.tools.ant.taskdefs.TouchTest");
+			tests.add("org.apache.tools.ant.taskdefs.TypeAdapterTest");
+			tests.add("org.apache.tools.ant.taskdefs.XmlnsTest");
+			tests.add("org.apache.tools.ant.taskdefs.condition.IsReferenceTest");
+			tests.add("org.apache.tools.ant.taskdefs.email.EmailAddressTest");
+			tests.add("org.apache.tools.ant.taskdefs.email.EmailTaskTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.i18n.TranslateTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.unix.SymlinkTest");
+			tests.add("org.apache.tools.ant.types.AddTypeTest");
+			tests.add("org.apache.tools.ant.types.AssertionsTest");
+			tests.add("org.apache.tools.ant.types.PermissionsTest");
+			tests.add("org.apache.tools.ant.types.PolyTest");
+			tests.add("org.apache.tools.ant.types.ZipFileSetTest");
+			tests.add("org.apache.tools.ant.types.selectors.ModifiedSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.TypeSelectorTest");
+			tests.add("org.apache.tools.ant.util.LazyFileOutputStreamTest");
+			tests.add("org.apache.tools.ant.util.LoaderUtilsTest");
+			tests.add("org.apache.tools.ant.util.ReferencesTest");
+			tests.add("org.apache.tools.ant.util.ResourceUtilsTest");
+			tests.add("org.apache.tools.ant.util.UnPackageNameMapperTest");
+			tests.add("org.apache.tools.mail.MailMessageTest");
+			tests.add("org.apache.tools.tar.TarEntryTest");
+			tests.add("org.apache.tools.tar.TarRoundTripTest");
+			tests.add("org.apache.tools.ant.CaseTest");
+			tests.add("org.apache.tools.ant.LoaderRefTest");
+			tests.add("org.apache.tools.ant.TopLevelTaskTest");
+			tests.add("org.apache.tools.ant.filters.ConcatFilterTest");
+			tests.add("org.apache.tools.ant.filters.DynamicFilterTest");
+			tests.add("org.apache.tools.ant.filters.EscapeUnicodeTest");
+			tests.add("org.apache.tools.ant.filters.HeadTailTest");
+			tests.add("org.apache.tools.ant.filters.NoNewLineTest");
+			tests.add("org.apache.tools.ant.filters.ReplaceTokensTest");
+			tests.add("org.apache.tools.ant.filters.StripJavaCommentsTest");
+			tests.add("org.apache.tools.ant.filters.TokenFilterTest");
+		}else if(args[args.length - 2].equals("v8")){
+			tests.add("org.apache.tools.ant.taskdefs.GzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.GUnzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.AntStructureTest");
+			tests.add("org.apache.tools.ant.taskdefs.AntTest");
+			tests.add("org.apache.tools.ant.taskdefs.AvailableTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopydirTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopyfileTest");
+			tests.add("org.apache.tools.ant.taskdefs.DeleteTest");
+			tests.add("org.apache.tools.ant.taskdefs.DeltreeTest");
+			tests.add("org.apache.tools.ant.taskdefs.EchoTest");
+			tests.add("org.apache.tools.ant.taskdefs.FailTest");
+			tests.add("org.apache.tools.ant.taskdefs.FilterTest");
+			tests.add("org.apache.tools.ant.taskdefs.GetTest");
+			tests.add("org.apache.tools.ant.taskdefs.MkdirTest");
+			tests.add("org.apache.tools.ant.taskdefs.RenameTest");
+			tests.add("org.apache.tools.ant.taskdefs.ReplaceTest");
+			tests.add("org.apache.tools.ant.taskdefs.TarTest");
+			tests.add("org.apache.tools.ant.taskdefs.TaskdefTest");
+			tests.add("org.apache.tools.ant.taskdefs.UnzipTest");
+			tests.add("org.apache.tools.ant.taskdefs.ZipTest");
+			tests.add("org.apache.tools.ant.types.CommandlineJavaTest");
+			tests.add("org.apache.tools.ant.types.CommandlineTest");
+			tests.add("org.apache.tools.ant.types.EnumeratedAttributeTest");
+			tests.add("org.apache.tools.ant.types.FileSetTest");
+			tests.add("org.apache.tools.ant.types.PathTest");
+			tests.add("org.apache.tools.ant.types.PatternSetTest");
+			tests.add("org.apache.tools.ant.IntrospectionHelperTest");
+			tests.add("org.apache.tools.ant.ProjectTest");
+			tests.add("org.apache.tools.ant.taskdefs.ExecuteWatchdogTest");
+			tests.add("org.apache.tools.ant.taskdefs.PropertyTest");
+			tests.add("org.apache.tools.ant.types.MapperTest");
+			tests.add("org.apache.tools.ant.util.DOMElementWriterTest");
+			tests.add("org.apache.tools.ant.util.GlobPatternMapperTest");
+			tests.add("org.apache.tools.ant.IncludeTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunnerTest");
+			tests.add("org.apache.tools.ant.taskdefs.CopyTest");
+			tests.add("org.apache.tools.ant.taskdefs.CVSPassTest");
+			tests.add("org.apache.tools.ant.taskdefs.DependSetTest");
+			tests.add("org.apache.tools.ant.taskdefs.FixCrLfTest");
+			tests.add("org.apache.tools.ant.taskdefs.JarTest");
+			tests.add("org.apache.tools.ant.taskdefs.JavaTest");
+			tests.add("org.apache.tools.ant.taskdefs.SleepTest");
+			tests.add("org.apache.tools.ant.types.DescriptionTest");
+			tests.add("org.apache.tools.ant.types.FileListTest");
+			tests.add("org.apache.tools.ant.types.FilterSetTest");
+			tests.add("org.apache.tools.ant.util.FileUtilsTest");
+			tests.add("org.apache.tools.ant.DirectoryScannerTest");
+			tests.add("org.apache.tools.zip.AsiExtraFieldTest");
+			tests.add("org.apache.tools.zip.ExtraFieldUtilsTest");
+			tests.add("org.apache.tools.zip.ZipEntryTest");
+			tests.add("org.apache.tools.zip.ZipShortTest");
+			tests.add("org.apache.tools.zip.ZipLongTest");
+			tests.add("org.apache.tools.ant.taskdefs.condition.ContainsTest");
+			tests.add("org.apache.tools.ant.taskdefs.condition.EqualsTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.depend.DependTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.EchoPropertiesTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.PropertyFileTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.XmlValidateTest");
+			tests.add("org.apache.tools.ant.taskdefs.BasenameTest");
+			tests.add("org.apache.tools.ant.taskdefs.BUnzip2Test");
+			tests.add("org.apache.tools.ant.taskdefs.BZip2Test");
+			tests.add("org.apache.tools.ant.taskdefs.ChecksumTest");
+			tests.add("org.apache.tools.ant.taskdefs.ConcatTest");
+			tests.add("org.apache.tools.ant.taskdefs.ConditionTest");
+			tests.add("org.apache.tools.ant.taskdefs.DirnameTest");
+			tests.add("org.apache.tools.ant.taskdefs.DynamicTest");
+			tests.add("org.apache.tools.ant.taskdefs.ExecuteJavaTest");
+			tests.add("org.apache.tools.ant.taskdefs.InitializeClassTest");
+			tests.add("org.apache.tools.ant.taskdefs.InputTest");
+			tests.add("org.apache.tools.ant.taskdefs.JavacTest");
+			tests.add("org.apache.tools.ant.taskdefs.LoadFileTest");
+			tests.add("org.apache.tools.ant.taskdefs.LoadPropertiesTest");
+			tests.add("org.apache.tools.ant.taskdefs.ManifestTest");
+			tests.add("org.apache.tools.ant.taskdefs.MoveTest");
+			tests.add("org.apache.tools.ant.taskdefs.ParallelTest");
+			tests.add("org.apache.tools.ant.taskdefs.RmicTest");
+			tests.add("org.apache.tools.ant.taskdefs.TStampTest");
+			tests.add("org.apache.tools.ant.taskdefs.TypedefTest");
+			tests.add("org.apache.tools.ant.taskdefs.UntarTest");
+			tests.add("org.apache.tools.ant.taskdefs.WarTest");
+			tests.add("org.apache.tools.ant.taskdefs.XmlPropertyTest");
+			tests.add("org.apache.tools.ant.types.selectors.ContainsSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.DateSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.DependSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.DepthSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.FilenameSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.PresentSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.SizeSelectorTest");
+			tests.add("org.apache.tools.ant.types.DirSetTest");
+			tests.add("org.apache.tools.ant.types.FlexIntegerTest");
+			tests.add("org.apache.tools.ant.types.XMLCatalogTest");
+			tests.add("org.apache.tools.ant.util.facade.FacadeTaskHelperTest");
+			tests.add("org.apache.tools.ant.util.facade.ImplementationSpecificArgumentTest");
+			tests.add("org.apache.tools.ant.util.CollectionUtilsTest");
+			tests.add("org.apache.tools.ant.util.DateUtilsTest");
+			tests.add("org.apache.tools.ant.util.JavaEnvUtilsTest");
+			tests.add("org.apache.tools.ant.util.PackageNameMapperTest");
+			tests.add("org.apache.tools.ant.util.StringUtilsTest");
+			tests.add("org.apache.tools.ant.AntClassLoaderTest");
+			tests.add("org.apache.tools.ant.ImmutableTest");
+			tests.add("org.apache.tools.ant.PropertyExpansionTest");
+			tests.add("org.apache.tools.ant.filters.LineContainsTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.junit.JUnitVersionHelperTest");
+			tests.add("org.apache.tools.ant.util.JAXPUtilsTest");
+			tests.add("org.apache.tools.ant.TaskContainerTest");
+			tests.add("org.apache.tools.ant.taskdefs.AntLikeTasksAtTopLevelTest");
+			tests.add("org.apache.tools.ant.taskdefs.AntlibTest");
+			tests.add("org.apache.tools.ant.taskdefs.CallTargetTest");
+			tests.add("org.apache.tools.ant.taskdefs.DefaultExcludesTest");
+			tests.add("org.apache.tools.ant.taskdefs.ExecTaskTest");
+			tests.add("org.apache.tools.ant.taskdefs.ImportTest");
+			tests.add("org.apache.tools.ant.taskdefs.MacroDefTest");
+			tests.add("org.apache.tools.ant.taskdefs.MultiMapTest");
+			tests.add("org.apache.tools.ant.taskdefs.PreSetDefTest");
+			tests.add("org.apache.tools.ant.taskdefs.SignJarTest");
+			tests.add("org.apache.tools.ant.taskdefs.SubAntTest");
+			tests.add("org.apache.tools.ant.taskdefs.TouchTest");
+			tests.add("org.apache.tools.ant.taskdefs.TypeAdapterTest");
+			tests.add("org.apache.tools.ant.taskdefs.XmlnsTest");
+			tests.add("org.apache.tools.ant.taskdefs.condition.IsReferenceTest");
+			tests.add("org.apache.tools.ant.taskdefs.email.EmailAddressTest");
+			tests.add("org.apache.tools.ant.taskdefs.email.EmailTaskTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.i18n.TranslateTest");
+			tests.add("org.apache.tools.ant.taskdefs.optional.unix.SymlinkTest");
+			tests.add("org.apache.tools.ant.types.AddTypeTest");
+			tests.add("org.apache.tools.ant.types.AssertionsTest");
+			tests.add("org.apache.tools.ant.types.PermissionsTest");
+			tests.add("org.apache.tools.ant.types.PolyTest");
+			tests.add("org.apache.tools.ant.types.ZipFileSetTest");
+			tests.add("org.apache.tools.ant.types.selectors.ModifiedSelectorTest");
+			tests.add("org.apache.tools.ant.types.selectors.TypeSelectorTest");
+			tests.add("org.apache.tools.ant.util.LazyFileOutputStreamTest");
+			tests.add("org.apache.tools.ant.util.LoaderUtilsTest");
+			tests.add("org.apache.tools.ant.util.ReferencesTest");
+			tests.add("org.apache.tools.ant.util.ResourceUtilsTest");
+			tests.add("org.apache.tools.ant.util.UnPackageNameMapperTest");
+			tests.add("org.apache.tools.mail.MailMessageTest");
+			tests.add("org.apache.tools.tar.TarEntryTest");
+			tests.add("org.apache.tools.tar.TarRoundTripTest");
+			tests.add("org.apache.tools.ant.CaseTest");
+			tests.add("org.apache.tools.ant.LoaderRefTest");
+			tests.add("org.apache.tools.ant.TopLevelTaskTest");
+			tests.add("org.apache.tools.ant.filters.ConcatFilterTest");
+			tests.add("org.apache.tools.ant.filters.DynamicFilterTest");
+			tests.add("org.apache.tools.ant.filters.EscapeUnicodeTest");
+			tests.add("org.apache.tools.ant.filters.HeadTailTest");
+			tests.add("org.apache.tools.ant.filters.NoNewLineTest");
+			tests.add("org.apache.tools.ant.filters.ReplaceTokensTest");
+			tests.add("org.apache.tools.ant.filters.StripJavaCommentsTest");
+			tests.add("org.apache.tools.ant.filters.TokenFilterTest");
+		}
+//		TestSuite suite;
+//		try {
+//			Object antTestSuite = Class.forName("AntTestSuite").newInstance();
+//			suite = (TestSuite) Class.forName("AntTestSuite").getMethod("suite").invoke(antTestSuite);
+			SuiteWrapper.runSuite(tests, "Ant " + args[args.length-2], args[args.length-1],false,"");
+//
+//		} catch (InstantiationException e) {
+//			// TODO Auto-generated catch block
+//			e.printStackTrace();
+//		} catch (IllegalAccessException e) {
+//			// TODO Auto-generated catch block
+//			e.printStackTrace();
+//		} catch (ClassNotFoundException e) {
+//			// TODO Auto-generated catch block
+//			e.printStackTrace();
+//		} catch (IllegalArgumentException e) {
+//			// TODO Auto-generated catch block
+//			e.printStackTrace();
+//		} catch (InvocationTargetException e) {
+//			// TODO Auto-generated catch block
+//			e.printStackTrace();
+//		} catch (NoSuchMethodException e) {
+//			// TODO Auto-generated catch block
+//			e.printStackTrace();
+//		} catch (SecurityException e) {
+//			// TODO Auto-generated catch block
+//			e.printStackTrace();
+//		}
+
+	}
+}
diff --git a/SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/JMeterRunner.java b/SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/JMeterRunner.java
new file mode 100644
index 0000000..8fdaf2e
--- /dev/null
+++ b/SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/JMeterRunner.java
@@ -0,0 +1,276 @@
+package edu.columbia.cs.psl.vmvm.sirRunner;
+
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.Properties;
+
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import org.apache.jmeter.gui.tree.JMeterTreeNode;
+//import org.apache.log.Hierarchy;
+//import org.apache.log.Logger;
+import org.apache.jorphan.logging.LoggingManager;
+import org.apache.jorphan.reflect.ClassFinder;
+import org.apache.jorphan.test.UnitTestManager;
+
+import junit.framework.TestSuite;
+
+public class JMeterRunner {
+	static String[] _args;
+
+	public static void reinit() {
+		//		initializeLogging(_args);
+		initializeManager(_args);
+	}
+
+	public static void main(String[] args) {
+		_args = new String[args.length - 2];
+		System.arraycopy(args, 0, _args, 0, args.length - 2);
+		reinit();
+		//		TestSuite suite = suite(args[0]);
+		ArrayList<String> tests = new ArrayList<>();
+
+		if(args[args.length - 2].equals("v0")){
+			tests.add("org.apache.jmeter.gui.action.Load$Test");
+			tests.add("org.apache.jmeter.gui.action.Save$Test");
+			tests.add("org.apache.jmeter.engine.TreeCloner$Test");
+			tests.add("org.apache.jmeter.util.ListedHashTree$Test");
+			tests.add("org.apache.jmeter.util.SearchByClass$Test");
+			tests.add("org.apache.jmeter.util.ClassFinder$Test");
+			tests.add("org.apache.jmeter.functions.CompoundFunction$Test");
+			tests.add("org.apache.jmeter.threads.TestCompiler$Test");
+			tests.add("org.apache.jmeter.junit.JMeterTest");
+			tests.add("org.apache.jmeter.save.SaveService$Test");
+			tests.add("org.apache.jmeter.config.gui.ArgumentsPanel$Test");
+			tests.add("org.apache.jmeter.control.OnceOnlyController$Test");
+			tests.add("org.apache.jmeter.control.GenericController$Test");
+			tests.add("org.apache.jmeter.control.InterleaveControl$Test");
+			tests.add("org.apache.jmeter.control.LoopController$Test");
+			tests.add("org.apache.jmeter.functions.RegexFunction$Test");
+			tests.add("org.apache.jmeter.junit.protocol.http.config.UrlConfigTest");
+			tests.add("org.apache.jmeter.junit.protocol.http.parser.HtmlParserTester");
+			tests.add("org.apache.jmeter.protocol.http.sampler.HTTPSampler$Test");
+			tests.add("org.apache.jmeter.protocol.http.sampler.HTTPSamplerFull$Test");
+			tests.add("org.apache.jmeter.protocol.http.modifier.URLRewritingModifier$Test");
+			tests.add("org.apache.jmeter.protocol.http.parser.HtmlParser$Test");
+			tests.add("org.apache.jmeter.protocol.http.proxy.ProxyControl$Test");
+			tests.add("org.apache.jmeter.protocol.http.util.HTTPArgument$Test");
+		}else if(args[args.length - 2].equals("v1")){
+			tests.add("org.apache.jmeter.gui.action.Load$Test");
+			tests.add("org.apache.jmeter.gui.action.Save$Test");
+			tests.add("org.apache.jmeter.engine.TreeCloner$Test");
+			tests.add("org.apache.jmeter.functions.ValueReplacer$Test");
+			tests.add("org.apache.jmeter.functions.CompoundFunction$Test");
+			tests.add("org.apache.jmeter.threads.TestCompiler$Test");
+			tests.add("org.apache.jmeter.junit.JMeterTest");
+			tests.add("org.apache.jmeter.save.SaveService$Test");
+			tests.add("org.apache.jmeter.util.StringUtilities$Test");
+			tests.add("org.apache.jmeter.config.gui.ArgumentsPanel$Test");
+			tests.add("org.apache.jmeter.control.OnceOnlyController$Test");
+			tests.add("org.apache.jmeter.control.GenericController$Test");
+			tests.add("org.apache.jmeter.control.InterleaveControl$Test");
+			tests.add("org.apache.jmeter.control.LoopController$Test");
+			tests.add("org.apache.jmeter.functions.RegexFunction$Test");
+			tests.add("org.apache.jmeter.junit.protocol.http.config.UrlConfigTest");
+			tests.add("org.apache.jmeter.junit.protocol.http.parser.HtmlParserTester");
+			tests.add("org.apache.jmeter.protocol.http.sampler.HTTPSampler$Test");
+			tests.add("org.apache.jmeter.protocol.http.sampler.HTTPSamplerFull$Test");
+			tests.add("org.apache.jmeter.protocol.http.modifier.URLRewritingModifier$Test");
+			tests.add("org.apache.jmeter.protocol.http.parser.HtmlParser$Test");
+			tests.add("org.apache.jmeter.protocol.http.proxy.ProxyControl$Test");
+			tests.add("org.apache.jmeter.protocol.http.util.HTTPArgument$Test");
+		}else if(args[args.length - 2].equals("v2")){
+			tests.add("org.apache.jmeter.gui.action.Load$Test");
+			tests.add("org.apache.jmeter.gui.action.Save$Test");
+			tests.add("org.apache.jmeter.engine.TreeCloner$Test");
+			tests.add("org.apache.jmeter.functions.ValueReplacer$Test");
+			tests.add("org.apache.jmeter.functions.CompoundFunction$Test");
+			tests.add("org.apache.jmeter.threads.TestCompiler$Test");
+			tests.add("org.apache.jmeter.junit.JMeterTest");
+			tests.add("org.apache.jmeter.save.SaveService$Test");
+			tests.add("org.apache.jmeter.util.StringUtilities$Test");
+			tests.add("org.apache.jmeter.config.gui.ArgumentsPanel$Test");
+			tests.add("org.apache.jmeter.control.OnceOnlyController$Test");
+			tests.add("org.apache.jmeter.control.GenericController$Test");
+			tests.add("org.apache.jmeter.control.InterleaveControl$Test");
+			tests.add("org.apache.jmeter.control.LoopController$Test");
+			tests.add("org.apache.jmeter.functions.RegexFunction$Test");
+			tests.add("org.apache.jmeter.junit.protocol.http.config.UrlConfigTest");
+			tests.add("org.apache.jmeter.junit.protocol.http.parser.HtmlParserTester");
+			tests.add("org.apache.jmeter.protocol.http.sampler.HTTPSampler$Test");
+			tests.add("org.apache.jmeter.protocol.http.sampler.HTTPSamplerFull$Test");
+			tests.add("org.apache.jmeter.protocol.http.modifier.URLRewritingModifier$Test");
+			tests.add("org.apache.jmeter.protocol.http.parser.HtmlParser$Test");
+			tests.add("org.apache.jmeter.protocol.http.proxy.ProxyControl$Test");
+			tests.add("org.apache.jmeter.protocol.http.util.HTTPArgument$Test");
+			tests.add("org.apache.jmeter.protocol.http.proxy.HttpRequestHdr$Test");
+			tests.add("org.apache.jmeter.visualizers.StatVisualizerModel$Test");
+		}else if(args[args.length - 2].equals("v3")){
+			tests.add("org.apache.jmeter.gui.action.Load$Test");
+			tests.add("org.apache.jmeter.gui.action.Save$Test");
+			tests.add("org.apache.jmeter.engine.TreeCloner$Test");
+			tests.add("org.apache.jmeter.threads.TestCompiler$Test");
+			tests.add("org.apache.jmeter.junit.JMeterTest");
+			tests.add("org.apache.jmeter.save.SaveService$Test");
+			tests.add("org.apache.jmeter.util.StringUtilities$Test");
+			tests.add("org.apache.jmeter.config.gui.ArgumentsPanel$Test");
+			tests.add("org.apache.jmeter.control.OnceOnlyController$Test");
+			tests.add("org.apache.jmeter.control.GenericController$Test");
+			tests.add("org.apache.jmeter.control.InterleaveControl$Test");
+			tests.add("org.apache.jmeter.control.LoopController$Test");
+			tests.add("org.apache.jmeter.junit.protocol.http.config.UrlConfigTest");
+			tests.add("org.apache.jmeter.junit.protocol.http.parser.HtmlParserTester");
+			tests.add("org.apache.jmeter.protocol.http.sampler.HTTPSampler$Test");
+			tests.add("org.apache.jmeter.protocol.http.sampler.HTTPSamplerFull$Test");
+			tests.add("org.apache.jmeter.protocol.http.modifier.URLRewritingModifier$Test");
+			tests.add("org.apache.jmeter.protocol.http.parser.HtmlParser$Test");
+			tests.add("org.apache.jmeter.protocol.http.proxy.ProxyControl$Test");
+			tests.add("org.apache.jmeter.protocol.http.util.HTTPArgument$Test");
+			tests.add("org.apache.jmeter.protocol.http.proxy.HttpRequestHdr$Test");
+			tests.add("org.apache.jmeter.visualizers.StatVisualizerModel$Test");
+			tests.add("org.apache.jmeter.engine.util.ValueReplacer$Test");
+			tests.add("org.apache.jmeter.testelement.property.CollectionProperty$Test");
+			tests.add("org.apache.jmeter.extractor.RegexExtractor$Test");
+			tests.add("org.apache.jmeter.protocol.http.control.CookieManager$Test");
+			tests.add("org.apache.jmeter.protocol.http.control.gui.HttpTestSampleGui$Test");
+			tests.add("org.apache.jmeter.protocol.http.modifier.AnchorModifier$Test");
+		}else if(args[args.length - 2].equals("v4")){
+			tests.add("org.apache.jmeter.gui.action.Load$Test");
+			tests.add("org.apache.jmeter.gui.action.Save$Test");
+			tests.add("org.apache.jmeter.engine.TreeCloner$Test");
+			tests.add("org.apache.jmeter.threads.TestCompiler$Test");
+			tests.add("org.apache.jmeter.junit.JMeterTest");
+			tests.add("org.apache.jmeter.save.SaveService$Test");
+			tests.add("org.apache.jmeter.util.StringUtilities$Test");
+			tests.add("org.apache.jmeter.config.gui.ArgumentsPanel$Test");
+			tests.add("org.apache.jmeter.control.OnceOnlyController$Test");
+			tests.add("org.apache.jmeter.control.GenericController$Test");
+			tests.add("org.apache.jmeter.control.InterleaveControl$Test");
+			tests.add("org.apache.jmeter.control.LoopController$Test");
+			tests.add("org.apache.jmeter.junit.protocol.http.config.UrlConfigTest");
+			tests.add("org.apache.jmeter.junit.protocol.http.parser.HtmlParserTester");
+			tests.add("org.apache.jmeter.protocol.http.sampler.HTTPSampler$Test");
+			tests.add("org.apache.jmeter.protocol.http.sampler.HTTPSamplerFull$Test");
+			tests.add("org.apache.jmeter.protocol.http.modifier.URLRewritingModifier$Test");
+			tests.add("org.apache.jmeter.protocol.http.parser.HtmlParser$Test");
+			tests.add("org.apache.jmeter.protocol.http.proxy.ProxyControl$Test");
+			tests.add("org.apache.jmeter.protocol.http.util.HTTPArgument$Test");
+			tests.add("org.apache.jmeter.protocol.http.proxy.HttpRequestHdr$Test");
+			tests.add("org.apache.jmeter.visualizers.StatVisualizerModel$Test");
+			tests.add("org.apache.jmeter.engine.util.ValueReplacer$Test");
+			tests.add("org.apache.jmeter.testelement.property.CollectionProperty$Test");
+			tests.add("org.apache.jmeter.extractor.RegexExtractor$Test");
+			tests.add("org.apache.jmeter.protocol.http.control.CookieManager$Test");
+			tests.add("org.apache.jmeter.protocol.http.control.gui.HttpTestSampleGui$Test");
+			tests.add("org.apache.jmeter.protocol.http.modifier.AnchorModifier$Test");
+		}else if(args[args.length - 2].equals("v5")){
+			tests.add("org.apache.jmeter.gui.action.Load$Test");
+			tests.add("org.apache.jmeter.gui.action.Save$Test");
+			tests.add("org.apache.jmeter.engine.TreeCloner$Test");
+			tests.add("org.apache.jmeter.threads.TestCompiler$Test");
+			tests.add("org.apache.jmeter.junit.JMeterTest");
+			tests.add("org.apache.jmeter.save.SaveService$Test");
+			tests.add("org.apache.jmeter.util.StringUtilities$Test");
+			tests.add("org.apache.jmeter.config.gui.ArgumentsPanel$Test");
+			tests.add("org.apache.jmeter.control.OnceOnlyController$Test");
+			tests.add("org.apache.jmeter.control.GenericController$Test");
+			tests.add("org.apache.jmeter.control.InterleaveControl$Test");
+			tests.add("org.apache.jmeter.control.LoopController$Test");
+			tests.add("org.apache.jmeter.junit.protocol.http.config.UrlConfigTest");
+			tests.add("org.apache.jmeter.junit.protocol.http.parser.HtmlParserTester");
+			tests.add("org.apache.jmeter.protocol.http.sampler.HTTPSampler$Test");
+			tests.add("org.apache.jmeter.protocol.http.sampler.HTTPSamplerFull$Test");
+			tests.add("org.apache.jmeter.protocol.http.modifier.URLRewritingModifier$Test");
+			tests.add("org.apache.jmeter.protocol.http.parser.HtmlParser$Test");
+			tests.add("org.apache.jmeter.protocol.http.proxy.ProxyControl$Test");
+			tests.add("org.apache.jmeter.protocol.http.util.HTTPArgument$Test");
+			tests.add("org.apache.jmeter.protocol.http.proxy.HttpRequestHdr$Test");
+			tests.add("org.apache.jmeter.visualizers.StatVisualizerModel$Test");
+			tests.add("org.apache.jmeter.engine.util.ValueReplacer$Test");
+			tests.add("org.apache.jmeter.testelement.property.CollectionProperty$Test");
+			tests.add("org.apache.jmeter.extractor.RegexExtractor$Test");
+			tests.add("org.apache.jmeter.protocol.http.control.CookieManager$Test");
+			tests.add("org.apache.jmeter.protocol.http.control.gui.HttpTestSampleGui$Test");
+			tests.add("org.apache.jmeter.protocol.http.modifier.AnchorModifier$Test");
+			tests.add("org.apache.jmeter.testelement.property.PackageTest");
+			tests.add("org.apache.jmeter.testelement.PackageTest");
+			tests.add("org.apache.jmeter.engine.util.PackageTest");
+			tests.add("org.apache.jmeter.protocol.http.sampler.PackageTest");
+		}
+
+
+		synchronized (JMeterTreeNode.class) {
+			System.out.println("JMetertreenode ok");
+		}
+		synchronized (org.apache.jmeter.config.Arguments.class) {
+			System.out.println("Arguments OK");
+		}
+		SuiteWrapper.runSuite(tests, "JMeter " + args[args.length - 2], args[args.length - 1], false, args[1] + " " + args[2]);
+	}
+
+	private static TestSuite suite(String searchPaths) {
+		TestSuite suite = new TestSuite();
+		try {
+			Iterator classes = ClassFinder.findClassesThatExtend(searchPaths.split(","), new Class[] { TestCase.class }, true).iterator();
+			while (classes.hasNext()) {
+				String name = (String) classes.next();
+				try {
+					suite.addTest(new TestSuite(Class.forName(name)));
+				} catch (Exception ex) {
+					ex.printStackTrace();
+				}
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		} catch (ClassNotFoundException e) {
+			e.printStackTrace();
+		}
+		return suite;
+	}
+
+	/**
+	 * An overridable method that initializes the logging for the unit test run,
+	 * using the properties file passed in as the second argument.
+	 *
+	 * @param args
+	 */
+	protected static void initializeLogging(String[] args) {
+		if (args.length >= 2) {
+			Properties props = new Properties();
+			try {
+				System.out.println("setting up logging props using file: " + args[1]);
+				props.load(new FileInputStream(args[1]));
+				LoggingManager.initializeLogging(props);
+			} catch (FileNotFoundException e) {
+			} catch (IOException e) {
+			}
+		}
+	}
+
+	/**
+	 * An overridable method that that instantiates a UnitTestManager (if one
+	 * was specified in the command-line arguments), and hands it the name of
+	 * the properties file to use to configure the system.
+	 *
+	 * @param args
+	 */
+	public static void initializeManager(String[] args) {
+		System.err.println("JMR: " + args.length);
+		if (args.length >= 3) {
+			try {
+				UnitTestManager um = (UnitTestManager) Class.forName(args[2]).newInstance();
+				um.initializeProperties(args[1]);
+			} catch (Exception e) {
+				System.out.println("Couldn't create: " + args[2]);
+				e.printStackTrace();
+			}
+		}
+	}
+
+}
diff --git a/SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/JTopasRunner.java b/SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/JTopasRunner.java
new file mode 100644
index 0000000..0b58c3b
--- /dev/null
+++ b/SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/JTopasRunner.java
@@ -0,0 +1,70 @@
+package edu.columbia.cs.psl.vmvm.sirRunner;
+
+import java.util.ArrayList;
+
+import de.susebox.java.util.TestDifficultSituations;
+import de.susebox.java.util.TestEmbeddedTokenizer;
+import de.susebox.java.util.TestInputStreamTokenizer;
+import de.susebox.java.util.TestTokenProperties;
+import de.susebox.java.util.TestTokenizerProperties;
+import de.susebox.jtopas.TestPluginTokenizer;
+import de.susebox.jtopas.TestTokenizerSpeed;
+import junit.framework.TestSuite;
+
+public class JTopasRunner {
+	public static void main(String[] args) {
+		ArrayList<String> tests = new ArrayList<>();
+		if(args[args.length - 2].equals("v0")){
+			tests.add("de.susebox.java.util.TestTokenizerProperties");
+			tests.add("de.susebox.java.util.TestTokenProperties");
+			tests.add("de.susebox.java.util.TestInputStreamTokenizer");
+			tests.add("de.susebox.java.util.TestDifficultSituations");
+			tests.add("de.susebox.java.util.TestEmbeddedTokenizer");
+			tests.add("de.susebox.jtopas.TestPluginTokenizer");
+			tests.add("de.susebox.jtopas.TestTokenizerSpeed");
+		}else if(args[args.length - 2].equals("v1")){
+			tests.add("de.susebox.java.util.TestTokenizerProperties");
+			tests.add("de.susebox.java.util.TestTokenProperties");
+			tests.add("de.susebox.java.util.TestInputStreamTokenizer");
+			tests.add("de.susebox.java.util.TestDifficultSituations");
+			tests.add("de.susebox.java.util.TestEmbeddedTokenizer");
+			tests.add("de.susebox.java.lang.TestExceptionList");
+			tests.add("de.susebox.jtopas.TestPluginTokenizer");
+			tests.add("de.susebox.jtopas.TestTokenizerSpeed");
+			tests.add("de.susebox.jtopas.TestJavaTokenizing");
+			tests.add("de.susebox.TestExceptions");
+		}else if(args[args.length - 2].equals("v2")){
+			tests.add("de.susebox.java.util.TestTokenizerProperties");
+			tests.add("de.susebox.java.util.TestTokenProperties");
+			tests.add("de.susebox.java.util.TestInputStreamTokenizer");
+			tests.add("de.susebox.java.util.TestTextAccess");
+			tests.add("de.susebox.java.util.TestDifficultSituations");
+			tests.add("de.susebox.java.util.TestEmbeddedTokenizer");
+			tests.add("de.susebox.java.lang.TestExceptionList");
+			tests.add("de.susebox.jtopas.TestPluginTokenizer");
+			tests.add("de.susebox.jtopas.TestTokenizerSpeed");
+			tests.add("de.susebox.jtopas.TestJavaTokenizing");
+			tests.add("de.susebox.TestExceptions");
+		}else if(args[args.length - 2].equals("v3")){
+			tests.add("de.susebox.java.util.TestTokenizerProperties");
+			tests.add("de.susebox.java.util.TestTokenProperties");
+			tests.add("de.susebox.java.util.TestInputStreamTokenizer");
+			tests.add("de.susebox.java.util.TestTextAccess");
+			tests.add("de.susebox.java.util.TestDifficultSituations");
+			tests.add("de.susebox.java.util.TestEmbeddedTokenizer");
+			tests.add("de.susebox.java.lang.TestExceptionList");
+			tests.add("de.susebox.jtopas.TestPluginTokenizer");
+			tests.add("de.susebox.jtopas.TestTokenizerSpeed");
+			tests.add("de.susebox.jtopas.TestJavaTokenizing");
+			tests.add("de.susebox.jtopas.TestTokenizerProperties");
+			tests.add("de.susebox.jtopas.TestMultithreadTokenizerProperties");
+			tests.add("de.susebox.jtopas.TestDifficultSituations");
+			tests.add("de.susebox.jtopas.TestStandardTokenizer");
+			tests.add("de.susebox.jtopas.TestEmbeddedTokenizer");
+			tests.add("de.susebox.jtopas.TestTextAccess");
+			tests.add("de.susebox.jtopas.TestMultithreadTokenizer");
+			tests.add("de.susebox.TestExceptions");
+		}
+		SuiteWrapper.runSuite(tests, "jtopas " + args[args.length - 2], args[args.length - 1],true,"");
+	}
+}
diff --git a/SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/SuiteWrapper.java b/SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/SuiteWrapper.java
new file mode 100644
index 0000000..613cfdb
--- /dev/null
+++ b/SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/SuiteWrapper.java
@@ -0,0 +1,221 @@
+package edu.columbia.cs.psl.vmvm.sirRunner;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.lang.management.ManagementFactory;
+import java.lang.management.RuntimeMXBean;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+
+import edu.columbia.cs.psl.vmvm.ReflectionWrapper;
+import edu.columbia.cs.psl.vmvm.VirtualRuntime;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+public class SuiteWrapper {
+	static Connection db = getConnection();
+
+	static Connection getConnection() {
+		try {
+			if(db == null || db.isClosed())
+			{
+			Class.forName("com.mysql.jdbc.Driver");
+			db = DriverManager.getConnection("jdbc:mysql://127.0.0.1/foss?user=foss&password=f055");
+			}
+			return db;
+		} catch (Exception ex) {
+			ex.printStackTrace();
+		}
+		return null;
+	}
+
+
+	public static void runSuite(TestSuite s, String name, String mode) {
+		try {
+			System.err.println("Running suite: " + name + " in mode " + mode);
+			PreparedStatement ps = getConnection().prepareStatement("INSERT INTO test_execution(type,mode,manual_name) VALUES (?,?,?)", PreparedStatement.RETURN_GENERATED_KEYS);
+			ps.setString(1, "SIR");
+			ps.setString(2, mode);
+			ps.setString(3, name);
+			ps.executeUpdate();
+			ResultSet rs = ps.getGeneratedKeys();
+			int testID=-1;
+			if (rs != null && rs.next()) {
+			    testID= rs.getInt(1);
+			}
+			if(mode.startsWith("fork"))
+			{
+				Enumeration<Test> e = s.tests();
+				while(e.hasMoreElements())
+				{
+					TestSuite t = (TestSuite) e.nextElement();
+//					TestRunner.main(new String[]{t.testAt(0).getClass().getName(),""+testID});
+
+					RuntimeMXBean mx = ManagementFactory.getRuntimeMXBean();
+				    String cp = mx.getClassPath();
+
+				    List<String> listArgs = new ArrayList<String>();
+				    listArgs.add("/usr/java/jdk1.7.0_10/bin/java");
+				    listArgs.add("-Dlog4j.configuration=mylogging.properties");
+				    listArgs.add("-cp");
+				    listArgs.add(cp);
+				    listArgs.add("edu.columbia.cs.psl.vmvm.sirRunner.TestRunner");
+				    listArgs.add(t.testAt(0).getClass().getName());
+				    listArgs.add(""+testID);
+				    System.err.println(listArgs);
+				    String[] res = new String[listArgs.size()];
+				    Process process = Runtime.getRuntime().exec(listArgs.toArray(res));
+				    process.waitFor();
+//				    InputStream stderr = process.getErrorStream ();
+//				    InputStream stdout = process.getInputStream ();
+//				    String line;
+//				    BufferedReader reader = new BufferedReader (new InputStreamReader(stdout));
+//				    while ((line = reader.readLine ()) != null) {
+//				    	System.out.println ("Stdout: " + line);
+//				    	}
+//				     reader = new BufferedReader (new InputStreamReader(stderr));
+//				    while ((line = reader.readLine ()) != null) {
+//				    	System.out.println ("stderr: " + line);
+//				    	}
+
+				}
+				System.exit(0);
+			}
+			else if(mode.startsWith("normal"))
+			{
+//				junit.textui.TestRunner runner = new junit.textui.TestRunner(System.out);
+//				runner.run(s);
+
+				Enumeration<Test> e = s.tests();
+				while(e.hasMoreElements())
+				{
+
+					TestSuite t = (TestSuite) e.nextElement();
+					System.err.println(t.testAt(0).getClass().getName());
+					TestRunner.main(new String[]{t.testAt(0).getClass().getName(),""+testID});
+				}
+				System.exit(0);
+			}
+			else if(mode.startsWith("vmvm"))
+			{
+				Enumeration<Test> e = s.tests();
+				while(e.hasMoreElements())
+				{
+
+					TestSuite t = (TestSuite) e.nextElement();
+					System.err.println(t.testAt(0).getClass().getName());
+					ReflectionWrapper.forName(t.testAt(0).getClass().getName(), SuiteWrapper.class.getClassLoader());
+					TestRunner.main(new String[]{t.testAt(0).getClass().getName(),""+testID});
+					VirtualRuntime.resetStatics();
+				}
+				System.exit(0);
+			}
+			db.close();
+		} catch (Exception ex) {
+			ex.printStackTrace();
+		}
+	}
+	public static void runSuite(ArrayList<String> s, String name, String mode,boolean hack,String extraArgs) {
+		try {
+			System.err.println("Running suite: " + name + " in mode " + mode);
+			PreparedStatement ps = getConnection().prepareStatement("INSERT INTO test_execution(type,mode,manual_name) VALUES (?,?,?)", PreparedStatement.RETURN_GENERATED_KEYS);
+			ps.setString(1, "SIR");
+			ps.setString(2, mode);
+			ps.setString(3, name);
+			ps.executeUpdate();
+			ResultSet rs = ps.getGeneratedKeys();
+			int testID=-1;
+			if (rs != null && rs.next()) {
+			    testID= rs.getInt(1);
+			}
+			if(mode.startsWith("fork"))
+			{
+				for(String t : s)
+				{
+//					TestRunner.main(new String[]{t.testAt(0).getClass().getName(),""+testID});
+
+					RuntimeMXBean mx = ManagementFactory.getRuntimeMXBean();
+				    String cp = mx.getClassPath();
+
+				    List<String> listArgs = new ArrayList<String>();
+				    listArgs.add("/usr/java/jdk1.7.0_10/bin/java");
+				    listArgs.add("-Dlog4j.configuration=mylogging.properties");
+
+				    listArgs.add("-cp");
+				    listArgs.add(cp);
+				    listArgs.add("edu.columbia.cs.psl.vmvm.sirRunner.TestRunner");
+				    listArgs.add(t);
+				    listArgs.add(""+testID);
+				    if(hack)
+				    listArgs.add("hack");
+				    if(extraArgs.length()>0)
+				    {
+				    	for(String str : extraArgs.split(" "))
+				    		listArgs.add(str);
+				    }
+				    System.err.println("Forking: " + t);
+//				    System.out.println(listArgs);
+				    String[] res = new String[listArgs.size()];
+				    Process process = Runtime.getRuntime().exec(listArgs.toArray(res));
+				    process.waitFor();
+				    InputStream stderr = process.getErrorStream ();
+				    InputStream stdout = process.getInputStream ();
+				    String line;
+				    BufferedReader reader = new BufferedReader (new InputStreamReader(stdout));
+				    while ((line = reader.readLine ()) != null) {
+				    	System.out.println ("Stdout: " + line);
+				    	}
+				    reader.close();
+				     reader = new BufferedReader (new InputStreamReader(stderr));
+				    while ((line = reader.readLine ()) != null) {
+				    	System.out.println ("stderr: " + line);
+				    	}
+				    reader.close();
+//				    System.err.println(listArgs);
+				}
+				System.exit(0);
+			}
+			else if(mode.startsWith("normal"))
+			{
+//				junit.textui.TestRunner runner = new junit.textui.TestRunner(System.out);
+//				runner.run(s);
+
+				for(String t : s){
+					if(hack)
+						TestRunner.main(new String[]{t,""+testID,"hack"});
+					else
+						TestRunner.main(new String[]{t,""+testID});
+				}
+				System.exit(0);
+			}
+			else if(mode.startsWith("vmvm"))
+			{
+				for(String t : s){
+					ReflectionWrapper.forName(t, SuiteWrapper.class.getClassLoader());
+
+					if(hack)
+						TestRunner.main(new String[]{t,""+testID,"hack"});
+					else if(extraArgs.length()>0)
+						TestRunner.main(new String[]{t,""+testID,extraArgs.split(" ")[0],extraArgs.split(" ")[1]});
+					else
+						TestRunner.main(new String[]{t,""+testID});
+					VirtualRuntime.resetStatics();
+				}
+				System.exit(0);
+			}
+			db.close();
+		} catch (Exception ex) {
+			ex.printStackTrace();
+		}
+	}
+}
diff --git a/SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/TestRunner.java b/SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/TestRunner.java
new file mode 100644
index 0000000..90551e9
--- /dev/null
+++ b/SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/TestRunner.java
@@ -0,0 +1,125 @@
+package edu.columbia.cs.psl.vmvm.sirRunner;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+import org.apache.jmeter.util.JMeterUtils;
+
+import sun.awt.windows.ThemeReader;
+
+import edu.columbia.cs.psl.vmvm.ReflectionWrapper;
+
+import junit.framework.TestCase;
+import junit.framework.TestResult;
+import junit.framework.TestSuite;
+
+public class TestRunner {
+	static int globalFailures;
+	static int globalErrors;
+
+	static Connection getConnection() {
+		try {
+			Class.forName("com.mysql.jdbc.Driver");
+			return DriverManager.getConnection("jdbc:mysql://127.0.0.1/foss?user=foss&password=f055");
+		} catch (Exception ex) {
+			ex.printStackTrace();
+		}
+		return null;
+	}
+	public static void main(String[] args) {
+		Connection db = getConnection();
+		long starTime = System.currentTimeMillis();
+		String clazz = args[0];
+		int id = Integer.valueOf(args[1]);
+		ByteArrayOutputStream bos = new ByteArrayOutputStream();
+		junit.textui.TestRunner runner = new junit.textui.TestRunner(new PrintStream(bos));
+		int nCases = 0;
+		System.err.println(args[0]);
+		int nFailures= 0;
+		int nErrors = 0;
+		try {
+			if(args.length == 4)
+			{
+				JMeterRunner.initializeManager(new String[]{"",args[2],args[3]});
+				ReflectionWrapper.forName(org.apache.jmeter.config.Arguments.class.getName(), TestRunner.class.getClassLoader());
+				ReflectionWrapper.forName(org.apache.jmeter.testelement.TestPlan.class.getName(), TestRunner.class.getClassLoader());
+				Class<?> c= ReflectionWrapper.forName(clazz,TestRunner.class.getClassLoader());
+
+				ReflectionWrapper.forName(org.apache.jmeter.config.Arguments.class.getName(), TestRunner.class.getClassLoader());
+				ReflectionWrapper.forName(org.apache.jmeter.testelement.TestPlan.class.getName(), TestRunner.class.getClassLoader());
+
+				ReflectionWrapper.forName(org.apache.jmeter.util.JMeterUtils.class.getName(), TestRunner.class.getClassLoader());
+
+				System.err.println("Reinited: " + org.apache.jmeter.config.Arguments.class);
+			}
+			Class<?> c= ReflectionWrapper.forName(clazz,TestRunner.class.getClassLoader());
+            if(c.getName().startsWith("org.apache.xml.security"))
+            {
+            	System.err.println("Initing!!");
+                org.apache.xml.security.Init.init();
+            }
+			if(args.length == 2 || args.length == 4)
+			{
+				TestSuite suite = new TestSuite(c);
+				nCases = suite.countTestCases();
+				TestResult r = runner.doRun(suite,false);
+				nFailures = r.failureCount();
+				nErrors = r.errorCount();
+
+			}
+			else
+			{
+				TestSuite theSuite = (TestSuite) c.getMethod("suite").invoke(null);
+				nCases = theSuite.countTestCases();
+				TestResult r=  runner.doRun(theSuite, false);
+
+//				theSuite.run(r);
+				nFailures = r.failureCount();
+				nErrors = r.errorCount();
+//				junit.textui.TestRunner.run(theSuite);
+			}
+			if(nErrors> 0 || nFailures >0)
+			{
+				System.err.println("!!!!!!!!!!!!! nErrors=" + nErrors+", nFailures=" + nFailures);
+				System.out.println(bos.toString());
+			}
+			System.err.println("Finished, inserting");
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		long endTime = System.currentTimeMillis();
+
+		try{
+			if(db == null)
+				db =getConnection();
+		PreparedStatement ps = db.prepareStatement("INSERT INTO test_result_test (test_execution_id,test,time,output,success,nTestMethods,start,end,nFailures,nErrors) VALUES (?,?,?,?,?,?,?,?,?,?)");
+		ps.setInt(1, id);
+		ps.setString(2, args[0]);
+		ps.setLong(3, endTime -starTime);
+		ps.setString(4, "Stdout:\n"+bos.toString());
+		ps.setInt(5, (nFailures == 0 && nErrors == 0) ? 1:0);
+		ps.setInt(6, nCases);
+		ps.setLong(7, starTime);
+		ps.setLong(8,endTime);
+
+		ps.setInt(9,nFailures);
+		ps.setInt(10,nErrors);
+		ps.executeUpdate();
+		globalFailures+=nFailures;
+		globalErrors += nErrors;
+
+		}
+		catch(SQLException ex)
+		{
+			ex.printStackTrace();
+		}
+		System.err.println("Done");
+	}
+}
diff --git a/SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/XMLSecurityRunner.java b/SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/XMLSecurityRunner.java
new file mode 100644
index 0000000..89ee3d2
--- /dev/null
+++ b/SIRHackyJUnitRunner/src/edu/columbia/cs/psl/vmvm/sirRunner/XMLSecurityRunner.java
@@ -0,0 +1,87 @@
+package edu.columbia.cs.psl.vmvm.sirRunner;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Enumeration;
+
+
+public class XMLSecurityRunner {
+	public static void main(String[] args) {
+		String[] _args = new String[args.length-2];
+		System.arraycopy(args, 0, _args, 0, args.length-2);
+		try {
+			ArrayList<String> tests =new ArrayList<>();
+			if(args[args.length - 2].equals("v0")){
+				tests.add("org.apache.xml.security.test.c14n.helper.AttrCompareTest");
+				tests.add("org.apache.xml.security.test.c14n.helper.C14nHelperTest");
+				tests.add("org.apache.xml.security.test.c14n.helper.NamespaceSearcherTest");
+				tests.add("org.apache.xml.security.test.c14n.implementations.Canonicalizer20010315Test");
+				tests.add("org.apache.xml.security.test.c14n.implementations.Canonicalizer20010315WithoutXPathSupportTest");
+				tests.add("org.apache.xml.security.test.external.org.apache.xalan.XPathAPI.XalanBug1425Test");
+				tests.add("org.apache.xml.security.test.external.org.apache.xalan.XPathAPI.AttributeAncestorOrSelf");
+				tests.add("org.apache.xml.security.test.signature.XMLSignatureInputTest");
+				tests.add("org.apache.xml.security.test.transforms.implementations.TransformBase64DecodeTest");
+				tests.add("org.apache.xml.security.test.utils.resolver.ResourceResolverSpiTest");
+				tests.add("org.apache.xml.security.test.utils.Base64Test");
+				tests.add("org.apache.xml.security.test.algorithms.implementations.KeyWrapTest");
+				tests.add("org.apache.xml.security.test.algorithms.implementations.BlockEncryptionTest");
+				tests.add("org.apache.xml.security.test.interop.BaltimoreTest");
+				tests.add("org.apache.xml.security.test.interop.IAIKTest");
+				tests.add("org.apache.xml.security.test.interop.RSASecurityTest");
+			}else if(args[args.length - 2].equals("v1")){
+				tests.add("org.apache.xml.security.test.c14n.helper.C14nHelperTest");
+				tests.add("org.apache.xml.security.test.c14n.implementations.Canonicalizer20010315Test");
+				tests.add("org.apache.xml.security.test.c14n.implementations.Canonicalizer20010315ExclusiveTest");
+				tests.add("org.apache.xml.security.test.external.org.apache.xalan.XPathAPI.XalanBug1425Test");
+				tests.add("org.apache.xml.security.test.external.org.apache.xalan.XPathAPI.AttributeAncestorOrSelf");
+				tests.add("org.apache.xml.security.test.signature.XMLSignatureInputTest");
+				tests.add("org.apache.xml.security.test.transforms.implementations.TransformBase64DecodeTest");
+				tests.add("org.apache.xml.security.test.utils.resolver.ResourceResolverSpiTest");
+				tests.add("org.apache.xml.security.test.utils.Base64Test");
+				tests.add("org.apache.xml.security.test.algorithms.implementations.KeyWrapTest");
+				tests.add("org.apache.xml.security.test.algorithms.implementations.BlockEncryptionTest");
+				tests.add("org.apache.xml.security.test.interop.BaltimoreTest");
+				tests.add("org.apache.xml.security.test.interop.IAIKTest");
+				tests.add("org.apache.xml.security.test.interop.RSASecurityTest");
+				tests.add("org.apache.xml.security.test.c14n.implementations.ExclusiveC14NInterop");
+			}else if(args[args.length - 2].equals("v2")){
+				tests.add("org.apache.xml.security.test.c14n.helper.C14nHelperTest");
+				tests.add("org.apache.xml.security.test.c14n.implementations.Canonicalizer20010315Test");
+				tests.add("org.apache.xml.security.test.c14n.implementations.Canonicalizer20010315ExclusiveTest");
+				tests.add("org.apache.xml.security.test.external.org.apache.xalan.XPathAPI.XalanBug1425Test");
+				tests.add("org.apache.xml.security.test.external.org.apache.xalan.XPathAPI.AttributeAncestorOrSelf");
+				tests.add("org.apache.xml.security.test.signature.XMLSignatureInputTest");
+				tests.add("org.apache.xml.security.test.transforms.implementations.TransformBase64DecodeTest");
+				tests.add("org.apache.xml.security.test.utils.resolver.ResourceResolverSpiTest");
+				tests.add("org.apache.xml.security.test.utils.Base64Test");
+				tests.add("org.apache.xml.security.test.algorithms.implementations.KeyWrapTest");
+				tests.add("org.apache.xml.security.test.algorithms.implementations.BlockEncryptionTest");
+				tests.add("org.apache.xml.security.test.interop.BaltimoreTest");
+				tests.add("org.apache.xml.security.test.interop.IAIKTest");
+				tests.add("org.apache.xml.security.test.interop.RSASecurityTest");
+				tests.add("org.apache.xml.security.test.c14n.implementations.ExclusiveC14NInterop");
+			}else if(args[args.length - 2].equals("v3")){
+				tests.add("org.apache.xml.security.test.c14n.helper.C14nHelperTest");
+				tests.add("org.apache.xml.security.test.c14n.implementations.Canonicalizer20010315Test");
+				tests.add("org.apache.xml.security.test.c14n.implementations.Canonicalizer20010315ExclusiveTest");
+				tests.add("org.apache.xml.security.test.external.org.apache.xalan.XPathAPI.XalanBug1425Test");
+				tests.add("org.apache.xml.security.test.external.org.apache.xalan.XPathAPI.AttributeAncestorOrSelf");
+				tests.add("org.apache.xml.security.test.signature.XMLSignatureInputTest");
+				tests.add("org.apache.xml.security.test.transforms.implementations.TransformBase64DecodeTest");
+				tests.add("org.apache.xml.security.test.utils.resolver.ResourceResolverSpiTest");
+				tests.add("org.apache.xml.security.test.utils.Base64Test");
+				tests.add("org.apache.xml.security.test.interop.BaltimoreTest");
+				tests.add("org.apache.xml.security.test.interop.IAIKTest");
+				tests.add("org.apache.xml.security.test.interop.RSASecurityTest");
+				tests.add("org.apache.xml.security.test.c14n.implementations.ExclusiveC14NInterop");
+			}
+
+ 			SuiteWrapper.runSuite(tests, "xml-security " + args[args.length-2], args[args.length-1],false,"");
+
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
+	}
+}
diff --git a/fs-methods.txt b/fs-methods.txt
index ec30fc2..fc8a07f 100644
--- a/fs-methods.txt
+++ b/fs-methods.txt
@@ -1,37 +1,31 @@
-java/io/FilePermission.<init>(Ljava/lang/String;Ljava/lang/String;)V
-java/io/FileWriter.<init>(Ljava/lang/String;)V
-java/util/zip/ZipFile.<init>(Ljava/lang/String;Ljava/nio/charset/Charset;)V
-java/io/File.<init>(Ljava/lang/String;)V
-java/io/FileOutputStream.<init>(Ljava/lang/String;)V
-java/nio/file/Path.resolveSibling(Ljava/lang/String;)Ljava/nio/file/Path;
-java/io/FileReader.<init>(Ljava/lang/String;)V
-javax/swing/filechooser/FileSystemView$FileSystemRoot.<init>(Ljava/lang/String;)V
-java/nio/file/FileSystem.getPath(Ljava/lang/String;[Ljava/lang/String;)Ljava/nio/file/Path;
-java/nio/file/FileSystems.newFileSystem(Ljava/nio/file/Path;Ljava/lang/ClassLoader;)Ljava/nio/file/FileSystem;
-java/nio/file/FileSystems.newFileSystem(Ljava/net/URI;Ljava/util/Map;Ljava/lang/ClassLoader;)Ljava/nio/file/FileSystem;
-java/net/URI.<init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-java/io/FileOutputStream.<init>(Ljava/lang/String;Z)V
-java/net/URI.<init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-java/nio/file/FileSystems.getDefault()Ljava/nio/file/FileSystem;
-java/nio/file/Path.resolve(Ljava/lang/String;)Ljava/nio/file/Path;
-java/io/FileWriter.<init>(Ljava/lang/String;Z)V
-java/nio/file/FileSystems.getFileSystem(Ljava/net/URI;)Ljava/nio/file/FileSystem;
-java/util/jar/JarFile.<init>(Ljava/lang/String;)V
-java/nio/file/Path.resolve(Ljava/nio/file/Path;)Ljava/nio/file/Path;
-java/net/URL.<init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)V
-java/nio/file/Files.createTempFile(Ljava/lang/String;Ljava/lang/String;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;
-java/net/URI.<init>(Ljava/lang/String;)V
-java/util/zip/ZipFile.<init>(Ljava/lang/String;)V
-java/net/URI.<init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-java/nio/file/Path.resolveSibling(Ljava/nio/file/Path;)Ljava/nio/file/Path;
-java/io/FileInputStream.<init>(Ljava/lang/String;)V
-java/net/URL.<init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-java/util/jar/JarFile.<init>(Ljava/lang/String;Z)V
-java/io/File.<init>(Ljava/lang/String;Ljava/lang/String;)V
-java/net/URI.<init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
-java/io/File.<init>(Ljava/io/File;Ljava/lang/String;)V
-java/nio/file/FileSystems.newFileSystem(Ljava/net/URI;Ljava/util/Map;)Ljava/nio/file/FileSystem;
-java/nio/file/Path.relativize(Ljava/nio/file/Path;)Ljava/nio/file/Path;
-java/net/URL.<init>(Ljava/lang/String;)V
-java/net/URL.<init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/net/URLStreamHandler;)V
-java/io/RandomAccessFile.<init>(Ljava/lang/String;Ljava/lang/String;)V
+#java/io/File.<init>(Ljava/io/File;Ljava/lang/String;)V	1
+java/io/File.<init>(Ljava/lang/String;)V	0
+java/io/File.<init>(Ljava/lang/String;Ljava/lang/String;)V	0
+java/io/FileInputStream.<init>(Ljava/lang/String;)V	0
+java/io/FileOutputStream.<init>(Ljava/lang/String;)V	0
+java/io/FileOutputStream.<init>(Ljava/lang/String;Z)V	0
+java/io/FilePermission.<init>(Ljava/lang/String;Ljava/lang/String;)V	0
+java/io/FileReader.<init>(Ljava/lang/String;)V	0
+java/io/FileWriter.<init>(Ljava/lang/String;)V	0
+java/io/FileWriter.<init>(Ljava/lang/String;Z)V	0
+java/io/RandomAccessFile.<init>(Ljava/lang/String;Ljava/lang/String;)V	0
+java/net/URI.<init>(Ljava/lang/String;)V	URI
+java/net/URI.<init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V	URI
+java/net/URI.<init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V	URI
+java/net/URI.<init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V	URI
+java/net/URI.<init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V	URI
+java/net/URL.<init>(Ljava/lang/String;)V	URL
+java/net/URL.<init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)V	URL
+java/net/URL.<init>(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/net/URLStreamHandler;)V	URL
+java/net/URL.<init>(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V	URL
+java/nio/file/FileSystem.getPath(Ljava/lang/String;[Ljava/lang/String;)Ljava/nio/file/Path;	FS
+java/nio/file/FileSystems.getDefault()Ljava/nio/file/FileSystem;	FS
+java/nio/file/Path.relativize(Ljava/nio/file/Path;)Ljava/nio/file/Path;	PATH
+java/nio/file/Path.resolve(Ljava/lang/String;)Ljava/nio/file/Path;	0
+java/nio/file/Path.resolveSibling(Ljava/lang/String;)Ljava/nio/file/Path;	PATH
+java/nio/file/Path.resolveSibling(Ljava/nio/file/Path;)Ljava/nio/file/Path;	PATH
+java/util/jar/JarFile.<init>(Ljava/lang/String;)V	0
+java/util/jar/JarFile.<init>(Ljava/lang/String;Z)V	0
+java/util/zip/ZipFile.<init>(Ljava/lang/String;)V	0
+java/util/zip/ZipFile.<init>(Ljava/lang/String;Ljava/nio/charset/Charset;)V	0
+javax/swing/filechooser/FileSystemView$FileSystemRoot.<init>(Ljava/lang/String;)V	0
diff --git a/fs-output-methods.txt b/fs-output-methods.txt
new file mode 100644
index 0000000..09b2f58
--- /dev/null
+++ b/fs-output-methods.txt
@@ -0,0 +1,23 @@
+java/io/FileOutputStream.<init>(Ljava/lang/String;)V
+java/io/FileOutputStream.<init>(Ljava/lang/String;Z)V
+java/io/FileOutputStream.<init>(Ljava/io/File;)V
+java/io/FileOutputStream.<init>(Ljava/io/File;Z)V
+java/io/FileWriter.<init>(Ljava/io/File;)V
+java/io/FileWriter.<init>(Ljava/io/File;Z)V
+java/io/FileWriter.<init>(Ljava/io/File;)V
+java/io/FileWriter.<init>(Ljava/io/File;Z)V
+java/net/URLConnection.getOutputStream()Ljava/io/OutputStream;
+java/nio/file/Files.newOutputStream(Ljava/nio/file/Path;[Ljava/nio/file/OpenOption;)Ljava/io/OutputStream;
+java/nio/file/Files.write(Ljava/nio/file/Path;[B[Ljava/nio/file/OpenOption;)Ljava/nio/file/Path;
+java/nio/file/Files.write(Ljava/nio/file/Path;Ljava/lang/Iterable;Ljava/nio/charset/Charset;[Ljava/nio/file/OpenOption;)Ljava/nio/file/Path;
+java/nio/file/Files.createFile(Ljava/nio/file/Path;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;
+java/nio/file/Files.createDirectory(Ljava/nio/file/Path;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;
+java/nio/file/Files.delete(Ljava/nio/file/Path;)V
+java/io/File.delete()Z
+java/io/File.deleteOnExit()Z
+java/io/File.mkdir()Z
+java/io/File.mkdirs()Z
+java/io/File.createTempFile(Ljava/io/String;Ljava/io/String;)Ljava/io/File;
+java/io/File.createTempFile(Ljava/io/String;Ljava/io/String;Ljava/io/File;)Ljava/io/File;
+java/nio/file/Files.createTempDirectory(Ljava/nio/file/Path;Ljava/io/String;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;
+java/nio/file/Files.createTempDirectory(Ljava/io/String;[Ljava/nio/file/attribute/FileAttribute;)Ljava/nio/file/Path;
\ No newline at end of file
diff --git a/instrumented-test/.classpath b/instrumented-test/.classpath
index fb50116..e2dde54 100644
--- a/instrumented-test/.classpath
+++ b/instrumented-test/.classpath
@@ -2,5 +2,6 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/VMVM"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/instrumented-test/bin/edu/columbia/cs/psl/vmvm/test/OtherClass.class b/instrumented-test/bin/edu/columbia/cs/psl/vmvm/test/OtherClass.class
deleted file mode 100644
index 5766972..0000000
Binary files a/instrumented-test/bin/edu/columbia/cs/psl/vmvm/test/OtherClass.class and /dev/null differ
diff --git a/instrumented-test/bin/edu/columbia/cs/psl/vmvm/test/SimpleClass.class b/instrumented-test/bin/edu/columbia/cs/psl/vmvm/test/SimpleClass.class
deleted file mode 100644
index 7ecc249..0000000
Binary files a/instrumented-test/bin/edu/columbia/cs/psl/vmvm/test/SimpleClass.class and /dev/null differ
diff --git a/instrumented-test/src/edu/columbia/cs/psl/vmvm/test/OtherClass.java b/instrumented-test/src/edu/columbia/cs/psl/vmvm/test/OtherClass.java
deleted file mode 100644
index 8da6199..0000000
--- a/instrumented-test/src/edu/columbia/cs/psl/vmvm/test/OtherClass.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package edu.columbia.cs.psl.vmvm.test;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-
-public class OtherClass {
-//	private static int foo = 3;
-	static
-	{
-//		int x = 3;
-		inst = new OtherClass();
-	}
-	private static OtherClass inst = new OtherClass();
-	public void go() {
-		System.out.println("I did go");
-	}
-
-	public static void foo(int a)
-	{
-		String p = "foo";
-	}
-	@Override
-		public String toString() {
-
-			String r = "[OtherClass ";
-			try{
-			Field f = OtherClass.class.getDeclaredField("_invivo_cloned");
-			if(f !=null)
-				r += " sandboxId=" + f.getInt(this);
-			else
-				r += " sandboxId = <NO SANDBOX ENV>";
-			r+="]";
-			}
-			catch(Exception ex)
-			{
-
-			}
-			return r;
-		}
-	public static void main(String[] args) {
-		OtherClass sc = new OtherClass();
-		sc.go();
-
-		System.out.println("Scanning fields");
-		System.out.println(OtherClass.class.getDeclaredFields().length);
-		for(Field f : OtherClass.class.getDeclaredFields())
-		{
-//			System.out.println(f);
-			if(Modifier.isStatic(f.getModifiers()))
-			try {
-				System.out.println(f.getName() + " -> " + f.get(sc));
-			} catch (IllegalArgumentException e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
-			} catch (IllegalAccessException e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
-			}
-		}
-	}
-}
diff --git a/instrumented-test/src/edu/columbia/cs/psl/vmvm/test/SimpleClass.java b/instrumented-test/src/edu/columbia/cs/psl/vmvm/test/SimpleClass.java
deleted file mode 100644
index 084b788..0000000
--- a/instrumented-test/src/edu/columbia/cs/psl/vmvm/test/SimpleClass.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package edu.columbia.cs.psl.vmvm.test;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-
-public class SimpleClass {
-//	private static int foo = 3;
-	static
-	{
-//		int x = 3;
-		inst = new SimpleClass();
-	}
-	private static SimpleClass inst = new SimpleClass();
-	public void go() {
-		System.out.println("I did go");
-	}
-	OtherClass child = new OtherClass();
-
-	public static void foo(int a)
-	{
-		String p = "foo";
-	}
-	@Override
-		public String toString() {
-
-			String r = "[SimpleClass ";
-			try{
-			Field f = SimpleClass.class.getDeclaredField("_invivo_cloned");
-			if(f !=null)
-				r += " sandboxId=" + f.getInt(this);
-			else
-				r += " sandboxId = <NO SANDBOX ENV>";
-			r += "[child = " + child.toString()+"]";
-			r+="]";
-			}
-			catch(Exception ex)
-			{
-
-			}
-			return r;
-		}
-	public static void main(String[] args) {
-		SimpleClass sc = new SimpleClass();
-		sc.go();
-
-		System.out.println("Scanning fields");
-		System.out.println(SimpleClass.class.getDeclaredFields().length);
-		for(Field f : SimpleClass.class.getDeclaredFields())
-		{
-//			System.out.println(f);
-			if(Modifier.isStatic(f.getModifiers()))
-			try {
-				System.out.println(f.getName() + " -> " + f.get(sc));
-			} catch (IllegalArgumentException e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
-			} catch (IllegalAccessException e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
-			}
-		}
-	}
-}
diff --git a/jar-descriptor.jardesc b/jar-descriptor.jardesc
new file mode 100644
index 0000000..e68b2f1
--- /dev/null
+++ b/jar-descriptor.jardesc
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="MacRoman" standalone="no"?>
+<jardesc>
+    <jar path="VMVM/vmvm.jar"/>
+    <options buildIfNeeded="true" compress="false" descriptionLocation="/VMVM/jar-descriptor.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="true" overwrite="true" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
+    <storedRefactorings deprecationInfo="true" structuralOnly="false"/>
+    <selectedProjects/>
+    <manifest generateManifest="false" manifestLocation="/VMVM/META-INF/MANIFEST.MF" manifestVersion="1.0" reuseManifest="false" saveManifest="false" usesManifest="true">
+        <sealing sealJar="false">
+            <packagesToSeal/>
+            <packagesToUnSeal/>
+        </sealing>
+    </manifest>
+    <selectedElements exportClassFiles="false" exportJavaFiles="false" exportOutputFolder="true">
+        <javaElement handleIdentifier="=VMVM/src&lt;com.rits.cloning"/>
+        <javaElement handleIdentifier="=VMVM/src&lt;edu.columbia.cs.psl.vmvm.asm.mvs"/>
+        <file path="/VMVM/core-fs.txt"/>
+        <file path="/VMVM/fs-output-methods.txt"/>
+        <file path="/VMVM/all-methods.txt"/>
+        <file path="/VMVM/allfile"/>
+        <javaElement handleIdentifier="=VMVM/src&lt;"/>
+        <file path="/VMVM/.gitignore"/>
+        <javaElement handleIdentifier="=VMVM/src&lt;edu.columbia.cs.psl.vmvm.agent"/>
+        <file path="/VMVM/.project"/>
+        <javaElement handleIdentifier="=VMVM/src&lt;edu.columbia.cs.psl.vmvm.eval"/>
+        <javaElement handleIdentifier="=VMVM/src&lt;edu.columbia.cs.psl.vmvm.asm.struct"/>
+        <javaElement handleIdentifier="=VMVM/src&lt;edu.columbia.cs.psl.vmvm.struct"/>
+        <javaElement handleIdentifier="=VMVM/src&lt;edu.columbia.cs.psl.vmvm"/>
+        <file path="/VMVM/fs-methods.txt"/>
+        <file path="/VMVM/network-methods.txt"/>
+        <javaElement handleIdentifier="=VMVM/src&lt;edu.columbia.cs.psl.vmvm.chroot"/>
+        <javaElement handleIdentifier="=VMVM/src&lt;edu.columbia.cs.psl.vmvm.asm"/>
+        <file path="/VMVM/.classpath"/>
+    </selectedElements>
+</jardesc>
diff --git a/lib/asm-all-4.0.jar b/lib/asm-all-4.0.jar
deleted file mode 100644
index 221baed..0000000
Binary files a/lib/asm-all-4.0.jar and /dev/null differ
diff --git a/lib/asm-all-4.1.jar b/lib/asm-all-4.1.jar
new file mode 100644
index 0000000..f35daa6
Binary files /dev/null and b/lib/asm-all-4.1.jar differ
diff --git a/lib/asm-src.zip b/lib/asm-src.zip
index 2fcfff5..27ef2fa 100644
Binary files a/lib/asm-src.zip and b/lib/asm-src.zip differ
diff --git a/network-methods.txt b/network-methods.txt
index 06db48c..e738507 100644
--- a/network-methods.txt
+++ b/network-methods.txt
@@ -1,58 +1,22 @@
-java/net/DatagramPacket.init:()V
-java/net/Inet4Address.init:()V
-java/net/Inet4AddressImpl.getHostByAddr:([B)Ljava/lang/String;
-java/net/Inet4AddressImpl.getLocalHostName:()Ljava/lang/String;
-java/net/Inet4AddressImpl.isReachable0:([BI[BI)Z
-java/net/Inet4AddressImpl.lookupAllHostAddr:(Ljava/lang/String;)[Ljava/net/InetAddress;
-java/net/Inet6Address.init:()V
-java/net/Inet6AddressImpl.getHostByAddr:([B)Ljava/lang/String;
-java/net/Inet6AddressImpl.getLocalHostName:()Ljava/lang/String;
-java/net/Inet6AddressImpl.isReachable0:([BII[BII)Z
-java/net/Inet6AddressImpl.lookupAllHostAddr:(Ljava/lang/String;)[Ljava/net/InetAddress;
-java/net/InetAddress.init:()V
-java/net/InetAddressImplFactory.isIPv6Supported:()Z
-java/net/NetworkInterface.getAll:()[Ljava/net/NetworkInterface;
-java/net/NetworkInterface.getByIndex0:(I)Ljava/net/NetworkInterface;
-java/net/NetworkInterface.getByInetAddress0:(Ljava/net/InetAddress;)Ljava/net/NetworkInterface;
-java/net/NetworkInterface.getByName0:(Ljava/lang/String;)Ljava/net/NetworkInterface;
-java/net/NetworkInterface.getMTU0:(Ljava/lang/String;I)I
-java/net/NetworkInterface.getMacAddr0:([BLjava/lang/String;I)[B
-java/net/NetworkInterface.init:()V
-java/net/NetworkInterface.isLoopback0:(Ljava/lang/String;I)Z
-java/net/NetworkInterface.isP2P0:(Ljava/lang/String;I)Z
-java/net/NetworkInterface.isUp0:(Ljava/lang/String;I)Z
-java/net/NetworkInterface.supportsMulticast0:(Ljava/lang/String;I)Z
-java/net/PlainDatagramSocketImpl.bind0:(ILjava/net/InetAddress;)V
-java/net/PlainDatagramSocketImpl.connect0:(Ljava/net/InetAddress;I)V
-java/net/PlainDatagramSocketImpl.datagramSocketClose:()V
-java/net/PlainDatagramSocketImpl.datagramSocketCreate:()V
-java/net/PlainDatagramSocketImpl.disconnect0:(I)V
-java/net/PlainDatagramSocketImpl.getTTL:()B
-java/net/PlainDatagramSocketImpl.getTimeToLive:()I
-java/net/PlainDatagramSocketImpl.init:()V
-java/net/PlainDatagramSocketImpl.join:(Ljava/net/InetAddress;Ljava/net/NetworkInterface;)V
-java/net/PlainDatagramSocketImpl.leave:(Ljava/net/InetAddress;Ljava/net/NetworkInterface;)V
-java/net/PlainDatagramSocketImpl.peek:(Ljava/net/InetAddress;)I
-java/net/PlainDatagramSocketImpl.peekData:(Ljava/net/DatagramPacket;)I
-java/net/PlainDatagramSocketImpl.receive0:(Ljava/net/DatagramPacket;)V
-java/net/PlainDatagramSocketImpl.send:(Ljava/net/DatagramPacket;)V
-java/net/PlainDatagramSocketImpl.setTTL:(B)V
-java/net/PlainDatagramSocketImpl.setTimeToLive:(I)V
-java/net/PlainDatagramSocketImpl.socketGetOption:(I)Ljava/lang/Object;
-java/net/PlainDatagramSocketImpl.socketSetOption:(ILjava/lang/Object;)V
-java/net/PlainSocketImpl.initProto:()V
-java/net/PlainSocketImpl.socketAccept:(Ljava/net/SocketImpl;)V
-java/net/PlainSocketImpl.socketAvailable:()I
-java/net/PlainSocketImpl.socketBind:(Ljava/net/InetAddress;I)V
-java/net/PlainSocketImpl.socketClose0:(Z)V
-java/net/PlainSocketImpl.socketConnect:(Ljava/net/InetAddress;II)V
-java/net/PlainSocketImpl.socketCreate:(Z)V
-java/net/PlainSocketImpl.socketGetOption:(ILjava/lang/Object;)I
-java/net/PlainSocketImpl.socketListen:(I)V
-java/net/PlainSocketImpl.socketSendUrgentData:(I)V
-java/net/PlainSocketImpl.socketSetOption:(IZLjava/lang/Object;)V
-java/net/PlainSocketImpl.socketShutdown:(I)V
-java/net/SocketInputStream.init:()V
-java/net/SocketInputStream.socketRead0:(Ljava/io/FileDescriptor;[BIII)I
-java/net/SocketOutputStream.init:()V
-java/net/SocketOutputStream.socketWrite0:(Ljava/io/FileDescriptor;[BII)V
\ No newline at end of file
+java/net/Socket.<init>(Ljava/lang/String;I)V	0
+java/net/Socket.<init>(Ljava/lang/String;ILjava/net/InetAddress;I)V	0
+java/net/Socket.<init>(Ljava/lang/String;IZ)V	0
+java/net/Socket.<init>(Ljava/net/InetAddress;I)V	0
+java/net/Socket.<init>(Ljava/net/InetAddress;ILjava/net/InetAddress;I)V	0
+java/net/Socket.<init>(Ljava/net/InetAddress;IZ)V	0
+java/net/Socket.bind(Ljava/net/SocketAddress;)V	0
+java/net/Socket.connect(Ljava/net/SocketAddress;)V	0
+java/net/Socket.connect(Ljava/net/SocketAddress;I)V	0
+javax/net/SocketFactory.createSocket(Ljava/lang/String;I)Ljava/net/Socket;	0
+javax/net/SocketFactory.createSocket(Ljava/lang/String;ILjava/net/InetAddress;I)Ljava/net/Socket;	0
+javax/net/SocketFactory.createSocket(Ljava/net/InetAddress;I)Ljava/net/Socket;	0
+javax/net/SocketFactory.createSocket(Ljava/net/InetAddress;ILjava/net/InetAddress;I)Ljava/net/Socket;	0
+java/net/DatagramSocket.<init>(ILjava/net/InetAddress;)V	1
+java/net/DatagramSocket.<init>(Ljava/net/SocketAddress;)V	0
+java/net/DatagramSocket.bind(Ljava/net/SocketAddress;)V	0
+java/net/DatagramSocket.connect(Ljava/net/InetAddress;I)V	0
+java/net/DatagramSocket.connect(Ljava/net/SocketAddress;)V	0
+java/nio/channels/SocketChannel.bind(Ljava/net/SocketAddress;)Ljava/nio/channels/NetworkChannel;	0
+java/nio/channels/SocketChannel.bind(Ljava/net/SocketAddress;)Ljava/nio/channels/SocketChannel;	0
+java/nio/channels/SocketChannel.connect(Ljava/net/SocketAddress;)Z	0
+java/nio/channels/SocketChannel.open(Ljava/net/SocketAddress;)Ljava/nio/channels/SocketChannel;	0
\ No newline at end of file
diff --git a/src/DummyClass.java b/src/DummyClass.java
new file mode 100644
index 0000000..ded59fb
--- /dev/null
+++ b/src/DummyClass.java
@@ -0,0 +1,7 @@
+
+public class DummyClass {
+	public void foo()
+	{
+
+	}
+}
diff --git a/src/com/rits/cloning/Cloner.java b/src/com/rits/cloning/Cloner.java
index 5cf0ec5..786402d 100644
--- a/src/com/rits/cloning/Cloner.java
+++ b/src/com/rits/cloning/Cloner.java
@@ -423,7 +423,7 @@ public class Cloner
 		final Class<T> clz = (Class<T>) o.getClass();
 		if (clz.isEnum()) return o;
 		// skip cloning ignored classes
-		if (nullInstead.contains(clz)) return null;
+//		if (nullInstead.contains(clz)) return null;
 		if (ignored.contains(clz)) return o;
 		if (isImmutable(clz)) return o;
 		if (isIgnored(clz)) return o;
@@ -489,6 +489,7 @@ public class Cloner
 						field.set(newInstance, sandboxField);
 					else
 					{
+
 						final Object fieldObject = field.get(o);
 						final boolean shouldClone = cloneSynthetics || (!cloneSynthetics && !field.isSynthetic());
 						final Object fieldObjectClone = clones != null ? (shouldClone ? cloneInternal(fieldObject, clones, sandboxField) : fieldObject) : fieldObject;
@@ -497,7 +498,7 @@ public class Cloner
 						{
 							System.out.println("cloned field>" + field + "  -- of class " + o.getClass());
 						}
-					}
+					}
 				}
 			}
 		}
diff --git a/src/edu/columbia/cs/psl/vmvm/AbstractInterceptor.java b/src/edu/columbia/cs/psl/vmvm/AbstractInterceptor.java
index e3e6f26..6557ab4 100644
--- a/src/edu/columbia/cs/psl/vmvm/AbstractInterceptor.java
+++ b/src/edu/columbia/cs/psl/vmvm/AbstractInterceptor.java
@@ -190,16 +190,16 @@ public abstract class AbstractInterceptor implements Constants{

 	private static Cloner cloner = new Cloner();

-	public static <T> T shallowClone(T obj) {
-		T ret = cloner.shallowClone(obj);
-		COWAInterceptor.setIsAClonedObject(ret);
-		return ret;
-	}
-
-	public static <T> T deepClone(T obj) {
-		T ret = cloner.deepClone(obj);
-		return ret;
-	}
+//	public static <T> T shallowClone(T obj) {
+//		T ret = cloner.shallowClone(obj);
+//		COWAInterceptor.setIsAClonedObject(ret);
+//		return ret;
+//	}
+//
+//	public static <T> T deepClone(T obj) {
+//		T ret = cloner.deepClone(obj);
+//		return ret;
+//	}

 	public final void __onExit(Object val, int op, int id) {
 		onExit(val, op, id);
diff --git a/src/edu/columbia/cs/psl/vmvm/COWAInterceptor.java b/src/edu/columbia/cs/psl/vmvm/COWAInterceptor.java
deleted file mode 100644
index 3eabd4c..0000000
--- a/src/edu/columbia/cs/psl/vmvm/COWAInterceptor.java
+++ /dev/null
@@ -1,164 +0,0 @@
-package edu.columbia.cs.psl.vmvm;
-
-import java.lang.reflect.Array;
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.IdentityHashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.apache.log4j.Logger;
-
-import com.rits.cloning.Cloner;
-
-/**
- *
- * @author jon
- *
- */
-public class COWAInterceptor implements Constants {
-	private static Logger logger = Logger.getLogger(COWAInterceptor.class);
-	private static Cloner deepCloner = new Cloner();
-
-	public static Object readAndCOAIfNecessary(Object theOwner, Object theFieldValue, Object callee) {
-		Object r = doCopy(AbstractLazyCloningInterceptor.getRootCallee(), theFieldValue);
-		int childNum = AbstractInterceptor.getThreadChildId();
-		logger.info(childNum + "Copying on " +r);
-		synchronized (pointsTo) {
-			if(!pointsTo.containsKey(childNum))
-				pointsTo.put(childNum, new IdentityHashMap<Object, Object>());
-		}
-		IdentityHashMap<Object, Object> myPointsTo = pointsTo.get(childNum);
-
-		final List<Field> fields = allFields(r.getClass());
-		for (final Field field : fields) {
-			final int modifiers = field.getModifiers();
-			if (!Modifier.isStatic(modifiers)) {
-				try {
-					final Object fieldObject = field.get(r);
-					synchronized (myPointsTo) {
-						if(myPointsTo.containsKey(fieldObject))
-							field.set(r, myPointsTo.get(fieldObject));
-					}
-				} catch (Exception ex) {
-					ex.printStackTrace();
-				}
-			}
-		}
-
-		myPointsTo.put(theFieldValue, r);
-		return r;
-	}
-
-	public static void setIsAClonedObject(Object obj) {
-		try {
-			obj.getClass().getField(BEEN_CLONED_FIELD).setBoolean(obj, true);
-			obj.getClass().getField(CHILD_FIELD).setInt(obj, AbstractLazyCloningInterceptor.getThreadChildId());
-		} catch (Exception ex) {
-//			logger.error("Unable to set cloned on " + obj, ex);
-		}
-	}
-	private static void setFieldCloned(Object obj, Field f)
-	{
-		try {
-			obj.getClass().getField(f.getName()+BEEN_CLONED_FIELD).setBoolean(obj, true);
-		} catch (Exception ex) {
-			ex.printStackTrace();
-		}
-	}
-
-	private static boolean isAClonedObject(Object obj) {
-		try {
-			return obj.getClass().getField(BEEN_CLONED_FIELD).getBoolean(obj);
-		} catch (Exception ex) {
-			return false;
-		}
-	}
-
-	public static void setAndCOWIfNecessary(Object theOwner, Object value, Object callee, String owner, String name, String desc) {
-
-	}
-
-	/**
-	 * Will perform a minimal deep clone of the object graph started at root
-	 * such that leaf is cloned.
-	 *
-	 * @param root
-	 * @param leaf
-	 */
-	public static Object doCopy(Object root, Object leaf) {
-		Object newLeaf = deepCloner.shallowClone(leaf);
-		setIsAClonedObject(leaf);
-		traverseGraphAndReplace(root, leaf, newLeaf);
-		return newLeaf;
-	}
-
-	private static List<Field> allFields(final Class<?> c) {
-		List<Field> l = fieldsCache.get(c);
-		if (l == null) {
-			l = new LinkedList<Field>();
-			final Field[] fields = c.getDeclaredFields();
-			addAll(l, fields);
-			Class<?> sc = c;
-			while ((sc = sc.getSuperclass()) != Object.class && sc != null) {
-				addAll(l, sc.getDeclaredFields());
-			}
-			fieldsCache.putIfAbsent(c, l);
-		}
-		return l;
-	}
-	private final static ConcurrentHashMap<Integer,IdentityHashMap<Object, Object>> pointsTo = new ConcurrentHashMap<Integer, IdentityHashMap<Object,Object>>();
-	private final static ConcurrentHashMap<Class<?>, List<Field>> fieldsCache = new ConcurrentHashMap<Class<?>, List<Field>>();
-
-	private static void addAll(final List<Field> l, final Field[] fields) {
-		for (final Field field : fields) {
-			if (!field.isAccessible())
-				field.setAccessible(true);
-			l.add(field);
-		}
-	}
-
-	private static void traverseGraphAndReplace(Object root, Object leaf, Object newLeaf) {
-//		logger.info(root);
-//		logger.info(leaf);
-//		System.out.println("Searching for obj " + leaf + " on " + root + (isAClonedObject(root) ? " (cloned) " : " not cloned"));
-		if (root == null)
-			return;
-		if (!isAClonedObject(root))
-			return;
-		Class<?> clz = root.getClass();
-//		logger.info(clz);
-		if (clz.isArray()) {
-			final int length = Array.getLength(root);
-			for (int i = 0; i < length; i++) {
-				final Object v = Array.get(root, i);
-				if (isAClonedObject(v)) {
-					if (v == leaf)
-						Array.set(root, i, newLeaf);
-					else
-						traverseGraphAndReplace(v, leaf, newLeaf);
-				}
-			}
-		}
-		final List<Field> fields = allFields(clz);
-		for (final Field field : fields) {
-			final int modifiers = field.getModifiers();
-			if (!Modifier.isStatic(modifiers)) {
-				try {
-					final Object fieldObject = field.get(root);
-						if (fieldObject == leaf)
-						{
-//							System.out.println("Found obj " + fieldObject + " on " + root);
-							setFieldCloned(root, field);
-							field.set(root, newLeaf);
-						}
-						else if(isAClonedObject(fieldObject))
-							traverseGraphAndReplace(fieldObject, leaf, newLeaf);
-				} catch (Exception ex) {
-					ex.printStackTrace();
-				}
-			}
-		}
-	}
-}
diff --git a/src/edu/columbia/cs/psl/vmvm/CloningUtils.java b/src/edu/columbia/cs/psl/vmvm/CloningUtils.java
index a5e28ba..1d6c25e 100644
--- a/src/edu/columbia/cs/psl/vmvm/CloningUtils.java
+++ b/src/edu/columbia/cs/psl/vmvm/CloningUtils.java
@@ -1,14 +1,10 @@
 package edu.columbia.cs.psl.vmvm;

-import java.io.Closeable;
+import java.io.BufferedWriter;
 import java.io.File;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.ServerSocket;
-import java.net.Socket;
+import java.io.FileWriter;
+import java.io.IOException;
 import java.net.URI;
-import java.nio.channels.Channel;
-import java.security.Permissions;
 import java.util.HashSet;
 import java.util.IdentityHashMap;
 import java.util.concurrent.locks.ReadWriteLock;
@@ -27,8 +23,9 @@ public class CloningUtils {
 	private static HashSet<Class<?>>	moreIgnoredImmutables;
 	private static HashSet<Class<?>>	nullInsteads;

-//	private static BufferedWriter		log;
+	private static BufferedWriter		log;
 	static {
+		try{
 		moreIgnoredImmutables = new HashSet<Class<?>>();
 		moreIgnoredImmutables.add(ClassLoader.class);
 		moreIgnoredImmutables.add(Thread.class);
@@ -37,37 +34,61 @@ public class CloningUtils {
 		moreIgnoredImmutables.add(ZipFile.class);
 		moreIgnoredImmutables.add(ZipEntry.class);
 		moreIgnoredImmutables.add(Inflater.class);
-		moreIgnoredImmutables.add(InputStream.class);
-		moreIgnoredImmutables.add(OutputStream.class);
+//		moreIgnoredImmutables.add(InputStream.class);
+//		moreIgnoredImmutables.add(OutputStream.class);
 		moreIgnoredImmutables.add(Deflater.class);
-		moreIgnoredImmutables.add(Socket.class);
-		moreIgnoredImmutables.add(ServerSocket.class);
-		moreIgnoredImmutables.add(Channel.class);
-		moreIgnoredImmutables.add(Closeable.class);
+//		moreIgnoredImmutables.add(Socket.class);
+//		moreIgnoredImmutables.add(ServerSocket.class);
+//		moreIgnoredImmutables.add(Channel.class);
+//		moreIgnoredImmutables.add(Closeable.class);
 		moreIgnoredImmutables.add(Class.class);
-		cloner.setExtraNullInsteadOfClone(moreIgnoredImmutables);
 		cloner.setExtraImmutables(moreIgnoredImmutables);
-
-		nullInsteads = new HashSet<Class<?>>();
-		nullInsteads.add(Permissions.class);
-		cloner.setExtraNullInsteadOfClone(nullInsteads);
 //		cloner.setDumpClonedClasses(true);
 //		try {
-//			File f = new File("cloneLog");
-//			if (f.exists())
-//				f.delete();
-//			log = new BufferedWriter(new FileWriter("cloneLog"));
+			File f = new File("cloneLog");
+			if (f.exists())
+				f.delete();
+			log = new BufferedWriter(new FileWriter("cloneLog"));
+		}
 //		} catch (IOException e) {
-//			// TODO Auto-generated catch block
+			// TODO Auto-generated catch block
 //			e.printStackTrace();
 //		}
+		catch(Throwable t)
+		{
+			System.err.println("AHAHAHAHAHAHAH");
+			t.printStackTrace();
+//			throw t;
+		}
 	}

 	public static final <T> T clone(T obj, String debug, int sandboxFlag) {
-// 		System.out.println("source>"+debug);
+// 		System.out.println("source>"+obj + ";"+debug + "; " + sandboxFlag);
 			return cloner.deepClone(obj, sandboxFlag);
 	}
+	public static final <T> T clone(T obj, String debug) {
+		if(obj == null)
+			return null;
+		try {
+			log.append(debug);
+			log.newLine();
+			log.flush();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return cloner.deepClone(obj,0);
+	}

+	public static String debugString(String in)
+	{
+		if(in != null && in.contains("equalsstartt"))
+		{
+			System.out.println("Method return: >" + in);
+			new Exception().printStackTrace();
+		}
+		return in;
+	}
 	public static IdentityHashMap<Object, Object>	cloneCache	= new IdentityHashMap<Object, Object>();	;


diff --git a/src/edu/columbia/cs/psl/vmvm/Constants.java b/src/edu/columbia/cs/psl/vmvm/Constants.java
index c701944..3b146f4 100644
--- a/src/edu/columbia/cs/psl/vmvm/Constants.java
+++ b/src/edu/columbia/cs/psl/vmvm/Constants.java
@@ -1,9 +1,16 @@
 package edu.columbia.cs.psl.vmvm;

 public interface Constants {
-	public static String BEEN_CLONED_FIELD = "_invivo_cloned";
+	public static String BEEN_CLONED_FIELD = "_vmvm_acc_logged";
 	public static String CHILD_FIELD = "_invivo_cloned";
 	public static String THREAD_PREFIX = "_invivo_child";
 	public static String SANDBOX_SUFFIX = "_vmvm_";
 	public static int MAX_CHILDREN = 1;
+	public static String CHROOT_DIR = "/private/tmp/chroot";
+	public static String VMVM_STATIC_RESET_METHOD = "vmvm_reinit_statics";
+	public static String VMVM_NEEDS_RESET = "vmvm_needs_reset";
+	public static String VMVM_RESET_IN_PROGRESS = "vmvm_reset_in_progress";
+
+	public static String VMVM_STATIC_RESET_METHOD_WITH_CHECK = "vmvm_reinit_statics_with_check";
+
 }
diff --git a/src/edu/columbia/cs/psl/vmvm/FieldReflectionWrapper.java b/src/edu/columbia/cs/psl/vmvm/FieldReflectionWrapper.java
new file mode 100644
index 0000000..c1a5557
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/FieldReflectionWrapper.java
@@ -0,0 +1,20 @@
+package edu.columbia.cs.psl.vmvm;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+
+public class FieldReflectionWrapper {
+
+	public static Field tryToInit(Field f, Object obj)
+	{
+		if (Modifier.isStatic(f.getModifiers()))
+			ReflectionWrapper.tryToInit(f.getDeclaringClass());
+		return f;
+	}
+
+	public static Field tryToInit(Field f) throws IllegalArgumentException, IllegalAccessException {
+		if (Modifier.isStatic(f.getModifiers()))
+			ReflectionWrapper.tryToInit(f.getDeclaringClass());
+		return f;
+	}
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/Instrumenter.java b/src/edu/columbia/cs/psl/vmvm/Instrumenter.java
index 5e201ed..bca5e0d 100644
--- a/src/edu/columbia/cs/psl/vmvm/Instrumenter.java
+++ b/src/edu/columbia/cs/psl/vmvm/Instrumenter.java
@@ -5,81 +5,556 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
+import java.io.FileReader;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.ObjectOutputStream;
+import java.io.OutputStream;
+import java.io.PrintWriter;
 import java.net.URL;
 import java.net.URLClassLoader;
 import java.nio.channels.FileChannel;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Enumeration;
 import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Scanner;
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
 import java.util.jar.JarOutputStream;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipException;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipOutputStream;

-import org.apache.log4j.Logger;
 import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.GeneratorAdapter;
+import org.objectweb.asm.commons.SerialVersionUIDAdder;
+import org.objectweb.asm.tree.AbstractInsnNode;
 import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.FieldInsnNode;
+import org.objectweb.asm.tree.FieldNode;
+import org.objectweb.asm.tree.InsnList;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+import org.objectweb.asm.tree.analysis.AnalyzerException;
+import org.objectweb.asm.tree.analysis.BasicInterpreter;
+import org.objectweb.asm.tree.analysis.Frame;
 import org.objectweb.asm.util.CheckClassAdapter;

+import com.sun.org.apache.bcel.internal.generic.INVOKESTATIC;
+
+import edu.columbia.cs.psl.vmvm.asm.ClinitPrintingCV;
 import edu.columbia.cs.psl.vmvm.asm.InterceptingClassVisitor;
+import edu.columbia.cs.psl.vmvm.asm.IntializedTypeAnalyzer;
+import edu.columbia.cs.psl.vmvm.asm.IntializedTypeAnalyzer.Node;
+import edu.columbia.cs.psl.vmvm.asm.JUnitResettingClassVisitor;
+import edu.columbia.cs.psl.vmvm.asm.VMVMClassVisitor;
+import edu.columbia.cs.psl.vmvm.asm.mvs.StaticFieldIsolatorMV;
+import edu.columbia.cs.psl.vmvm.asm.mvs.StaticFinalMutibleizer;
+import edu.columbia.cs.psl.vmvm.asm.struct.EqFieldInsnNode;
+import edu.columbia.cs.psl.vmvm.asm.struct.EqMethodNode;
+import edu.columbia.cs.psl.vmvm.asm.struct.MethodListClassNode;

 public class Instrumenter {
-	public static URLClassLoader						loader;
-	private static Logger								logger				= Logger.getLogger(Instrumenter.class);
-	public static HashMap<String, ClassNode>			instrumentedClasses	= new HashMap<String, ClassNode>();
+	public static URLClassLoader loader;
+
+	public static HashSet<String> ignoredClasses = new HashSet<>();
+	static
+	{
+		try{
+//		Scanner s = new Scanner(new File("ignored-clinits.txt"));
+//		while(s.hasNextLine())
+//			ignoredClasses.add(s.nextLine());
+//		s.close();
+		}
+		catch(Exception ex)
+		{
+			//nop
+			ex.printStackTrace();
+		}
+	}
+	private static final ClassVisitorFactory cvFactory =
+//			new DebugVisitorFactory();
+			new JUnitVisitorFactory();
+
+	private static Logger logger = Logger.getLogger("edu.columbia.cs.psl.vmvm");
+	public static HashMap<String, MethodListClassNode> instrumentedClassesBypath = new HashMap<String, MethodListClassNode>();

-	private static final int							NUM_PASSES			= 2;
-	private static final int							PASS_ANALYZE		= 0;
-	private static final int							PASS_OUTPUT			= 1;
+	public static HashMap<String, MethodListClassNode> instrumentedClasses = new HashMap<String, MethodListClassNode>();
+	private static HashMap<String, MethodListClassNode> unInstrumentedClasses = new HashMap<String, MethodListClassNode>();
+	public static HashSet<String> remappedInterfaces = new HashSet<>();
+	public static HashMap<String, HashSet<String>> superToSubClass = new HashMap<>();
+	private static final int NUM_PASSES = 2;
+	private static final int PASS_ANALYZE = 0;
+	private static final int PASS_OUTPUT = 1;

-	private static int									pass_number			= 0;
+	public static int pass_number = 0;

-	private static File									rootOutputDir;
-	private static String								lastInstrumentedClass;
+	private static File rootOutputDir;
+	private static String lastInstrumentedClass;

-	public static int									MAX_SANDBOXES		= 3;
-
-	private static void finishedPass() {
+	public static int MAX_SANDBOXES = 2;
+	public static HashMap<String, String> mutablizedFields = new HashMap<>();
+	public static void finishedPass() {
 		switch (pass_number) {
 		case PASS_ANALYZE:
+			calculateMutableClasses();
+			calculateIgnoredReRunningClinits();
+			calculatedWhatsClinitedPerMethod();
 			break;
 		case PASS_OUTPUT:
+			//Write out all of the info on classes that we have already instrumented
+			File f = new File("vmvm-runtimecheat");
+			if (f.exists())
+				f.delete();
+			try {
+				ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f));
+				oos.writeObject(instrumentedClasses); //TODO reenable this
+				oos.writeObject(remappedInterfaces);
+				oos.close();
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
 			break;
 		}
 	}

+	private static void calculatedWhatsClinitedPerMethod() {
+		LinkedList<EqMethodNode> nodesToVisit = new LinkedList<>();
+		for (MethodListClassNode cn : instrumentedClasses.values()) {
+			for (EqMethodNode mn : cn.methodsHashSet) {
+				if ((mn.name.equals("<clinit>") || mn.name.equals("main")) && (mn.access & Opcodes.ACC_STATIC) != 0)
+					nodesToVisit.add(mn);
+			}
+		}
+		for (EqMethodNode mn : nodesToVisit) {
+			mn.typesToIgnoreInit = new HashSet<>();
+		}
+		while (!nodesToVisit.isEmpty()) {
+			EqMethodNode mn = nodesToVisit.pop();
+			for (EqMethodNode child : mn.methodsICall) {
+				if (child.typesToIgnoreInit == null) {
+					child.typesToIgnoreInit = new HashSet<>();
+					child.typesToIgnoreInit.addAll(mn.typesThatIInit);
+					child.typesToIgnoreInit.addAll(mn.typesToIgnoreInit);
+					nodesToVisit.add(child);
+				} else {
+					HashSet<String> tmp = new HashSet<>();
+					tmp.addAll(mn.typesThatIInit);
+					tmp.addAll(mn.typesToIgnoreInit);
+					child.typesToIgnoreInit.retainAll(tmp);
+				}
+			}
+		}
+	}
+	private static boolean getClinitBySuper(MethodListClassNode cn)
+	{
+		if(cn == null)
+			return false;
+		if(cn.hasClinit)
+		{
+			cn.hasClinitOrSuperHasClinit = true;
+			cn.superClinitExplored = true;
+			return true;
+		}
+		if(cn.superClinitExplored)
+			return cn.hasClinitOrSuperHasClinit;

-	private static byte[] instrumentClass(InputStream is) {
+		if(cn.superName != null && !"java/lang/Object".equals(cn.superName))
+		{
+			cn.hasClinitOrSuperHasClinit = getClinitBySuper(getClassNodeNOLOAD(cn.superName));
+			cn.hasClinit = cn.hasClinitOrSuperHasClinit;
+			cn.superClinitExplored = true;
+		}
+		cn.hasClinitOrSuperHasClinit = cn.hasClinit;
+		cn.superClinitExplored = true;
+		return cn.hasClinitOrSuperHasClinit;
+
+	}
+	private static void calculateIgnoredReRunningClinits() {
+		for (MethodListClassNode cn : instrumentedClasses.values()) {
+			if(!cn.hasClinit && ! cn.superClinitExplored && !ignoredClasses.contains(cn.name))
+			{
+				cn.hasClinit = getClinitBySuper(cn);
+			}
+		}
+		for (String s : instrumentedClassesBypath.keySet()) {
+			MethodListClassNode cn = instrumentedClassesBypath.get(s);
+			if(!cn.hasClinit && ! cn.superClinitExplored && !ignoredClasses.contains(cn.name))
+			{
+				cn.hasClinit = getClinitBySuper(cn);
+			}
+		}
+		for (MethodListClassNode cn : instrumentedClasses.values()) {
+			if(ignoredClasses.contains(cn.name))
+				continue;
+			for(Object o : cn.fields)
+			{
+				FieldNode fn = (FieldNode) o;
+				if((fn.access & Opcodes.ACC_STATIC) == 0)
+					continue; //ignore instance fields
+				if((fn.access & Opcodes.ACC_FINAL) == 0 && ! fn.name.toUpperCase().equals(fn.name))
+					cn.clInitCalculatedNecessary = true; //require all static fields to be final
+//				if(fn.desc.startsWith("["))
+//					cn.clInitCalculatedNecessary = true; //whenever we have an array, let's crap out and say we need to
+				else if(fn.desc.startsWith("L") && !fn.desc.equals("Ljava/lang/String;"))
+				{
+					MethodListClassNode ownerCN = instrumentedClasses.get(Type.getType(fn.desc).getInternalName());
+					if(ownerCN != null)
+						cn.clInitCalculatedNecessary = cn.clInitCalculatedNecessary | ownerCN.isMutable;
+				}
+				if(CLASS_TO_DEBUG != null && cn.name.startsWith(CLASS_TO_DEBUG))
+				{
+					System.err.println(cn.name + "." + fn.name);
+				}
+			}
+			if(cn != null && cn.name != null && CLASS_TO_DEBUG != null && cn.name.startsWith(CLASS_TO_DEBUG)){
+				System.out.println(cn.name+": " + (cn.clInitCalculatedNecessary ? "Y" : "N"));
+				System.out.println(cn.clInitInsns);
+			}
+			if(cn.clInitCalculatedNecessary || cn.clInitInsns == null)
+				continue;
+
+			boolean calcNecessaryBeforeVMVMIniit = false;
+			for (int i = 0; i < cn.clInitInsns.size(); i++) {
+				switch(cn.clInitInsns.get(i).getType())
+				{
+				case AbstractInsnNode.FIELD_INSN:
+					FieldInsnNode fin = (FieldInsnNode) cn.clInitInsns.get(i);
+					if(fin.getOpcode() == Opcodes.PUTSTATIC && ! fin.owner.equals(cn.name))
+					{
+						if(CLASS_TO_DEBUG != null && cn.name.startsWith(CLASS_TO_DEBUG))
+						{
+							System.err.println(cn.name + "->" + fin.name);
+						}
+						calcNecessaryBeforeVMVMIniit = true;
+						cn.clInitCalculatedNecessary = true;
+					}
+					else if(fin.getOpcode() == Opcodes.GETSTATIC)
+					{
+						//we will propogate through this stuff below.
+					}
+					break;
+				case AbstractInsnNode.METHOD_INSN:
+					MethodInsnNode min = (MethodInsnNode) cn.clInitInsns.get(i);
+					if(cn.name.endsWith("util/StringUtils"))
+						System.err.println(min.owner + ", " + min.name);
+					if(!min.name.startsWith("$VRi") && !(min.name.equals("<init>") && !min.owner.equals(cn.name))&&
+							!min.name.equals("getLogger") && !min.owner.equals("java/lang/String") &&
+							!(min.owner.equals("java/util/Arrays") && min.name.equals("fill")))
+					{
+						cn.clInitCalculatedNecessary = true;
+						calcNecessaryBeforeVMVMIniit = true;
+					}
+					if(calcNecessaryBeforeVMVMIniit && min.owner.equals(Type.getInternalName(VirtualRuntime.class)))
+						cn.clInitCalculatedNecessary = false; //might have triggered this in the preamble to register clinit
+					if(min.owner.equals(cn.name) && cn.getMethod(min.name, min.desc) != null && (cn.getMethod(min.name, min.desc).access & Opcodes.ACC_NATIVE) != 0)
+						cn.clInitCalculatedNecessary = false;
+					if(CLASS_TO_DEBUG != null && cn.name.startsWith(CLASS_TO_DEBUG))
+					{
+						System.err.println(cn.name + "->" + min.owner+"."+min.name);
+					}
+					break;
+				}
+			}
+		}
+		boolean hadChanges = false;
+		do{
+			hadChanges = false;
+		for (MethodListClassNode cn : instrumentedClasses.values()) {
+			if(cn.clInitCalculatedNecessary)
+				continue;
+			if(ignoredClasses.contains(cn.name))
+				continue;
+			MethodListClassNode sup = instrumentedClasses.get(cn.superName);
+			if(sup != null && CLASS_TO_DEBUG != null && cn.name.startsWith(CLASS_TO_DEBUG))
+			{
+				System.err.println(cn.name + "->" + sup.name+"."+(sup.clInitCalculatedNecessary?"Y":"N"));
+			}
+			if(sup != null && sup.clInitCalculatedNecessary)
+				cn.clInitCalculatedNecessary = true;
+			for(Object intf : cn.interfaces)
+			{
+				sup = instrumentedClasses.get((String) intf);
+				if(sup != null && cn.clInitCalculatedNecessary)
+					cn.clInitCalculatedNecessary = true;
+				if(sup != null && CLASS_TO_DEBUG != null && cn.name.startsWith(CLASS_TO_DEBUG))
+				{
+					System.err.println(cn.name + "->" + sup.name+"."+(sup.clInitCalculatedNecessary?"Y":"N"));
+				}
+			}
+			if(cn.clInitCalculatedNecessary || cn.clInitInsns == null || ignoredClasses.contains(cn.name))
+				continue;
+
+			for (int i = 0; i < cn.clInitInsns.size(); i++) {
+				switch(cn.clInitInsns.get(i).getType())
+				{
+				case AbstractInsnNode.METHOD_INSN:
+					MethodInsnNode min = (MethodInsnNode) cn.clInitInsns.get(i);
+					if(min.getOpcode() == Opcodes.INVOKESTATIC && !min.name.startsWith("$VRi") &&
+							!min.name.equals("getLogger") && !min.owner.equals("java/lang/String") &&
+							!(min.owner.equals("java/util/Arrays") && min.name.equals("fill")))
+					{
+						MethodListClassNode owner = instrumentedClasses.get(min.owner);
+						if(owner!= null && owner.clInitCalculatedNecessary
+								&& ! ((owner.getMethod(min.name, min.desc).access & Opcodes.ACC_NATIVE) != 0 &&
+								min.owner.equals(cn.name)))
+						{
+							cn.clInitCalculatedNecessary = true;
+							hadChanges = true;
+						}
+					}
+					break;
+				case AbstractInsnNode.FIELD_INSN:
+					FieldInsnNode fin = (FieldInsnNode) cn.clInitInsns.get(i);
+					if(fin.getOpcode() == Opcodes.GETSTATIC)
+					{
+						MethodListClassNode owner = instrumentedClasses.get(fin.owner);
+						if(owner != null && owner.clInitCalculatedNecessary)
+						{
+							cn.clInitCalculatedNecessary =true;
+							hadChanges = true;
+						}
+					}
+					else if(fin.getOpcode() == Opcodes.PUTSTATIC)
+					{
+						MethodListClassNode owner = instrumentedClasses.get(fin.owner);
+						if(owner != null && owner.clInitCalculatedNecessary)
+						{
+							cn.clInitCalculatedNecessary =true;
+							hadChanges = true;
+						}
+					}
+					break;
+				}
+			}
+		}
+		}while(hadChanges);
+		for (MethodListClassNode cn : instrumentedClasses.values()) {
+//			if(cn.isMutable)
+//			{
+//				System.out.println(cn.name + " is found mutable");
+//			}
+			if(cn != null && cn.name != null && CLASS_TO_DEBUG!= null && cn.name.startsWith(CLASS_TO_DEBUG))
+			{
+				System.err.println(cn.name);
+				if(cn.hasClinit)
+					System.err.println("has clinit");
+				if(cn.clInitCalculatedNecessary)
+					System.err.println("clinit necessary");
+			}
+//			if(cn.hasClinit && ! cn.clInitCalculatedNecessary)
+//			{
+//				System.out.println("Safely ignoring clinit on  " + cn.name);
+//			}
+			cn.hasClinit = cn.hasClinit && cn.clInitCalculatedNecessary;
+
+		}
+	}
+	private static String CLASS_TO_DEBUG = "java/lang/Object";//"java/util/regex/Pattern";
+	private static void calculateMutableClasses()
+	{
+		for(MethodListClassNode cn : instrumentedClasses.values())
+		{
+			if(cn.isMutable)
+				continue;
+			boolean mutable = false;
+			for(EqMethodNode mn : cn.methodsHashSet)
+			{
+				if(mn.name.equals("<init>"))
+					continue;
+				if(!mn.sideEffectsExplored)
+				{
+					mn.hasSideEffects = checkHasSideEffects(mn);
+				}
+				if(mn.hasSideEffects)
+				{
+					mutable = true;
+					break;
+				}
+			}
+			cn.isMutable = mutable;
+		}
+	}
+	private static boolean checkHasSideEffects(EqMethodNode mn) {
+		if(mn.sideEffectsExplored)
+			return mn.hasSideEffects;
+		mn.sideEffectsExplored = true;
+		for(EqMethodNode c : mn.methodsICall)
+		{
+			if(!c.sideEffectsExplored)
+			{
+				c.hasSideEffects = checkHasSideEffects(c);
+			}
+			if(c.hasSideEffects)
+			{
+				mn.hasSideEffects = true;
+				return true;
+			}
+		}
+		return false;
+	}
+	public static String remapInterface(String intfc) {
+		if(intfc.contains("JSSEFactory") && remappedInterfaces.contains(intfc))
+			System.out.println(intfc);
+		if (remappedInterfaces.contains(intfc)) {
+			return intfc+"$vmvm";
+		}
+		return intfc;
+	}
+
+	public static MethodListClassNode getClassNode(String clazz) {
+		MethodListClassNode cn = null;
+		if(clazz.endsWith("DetectorFactoryCollection"))
+			System.err.println("DetectorFactoryCollection path is " + curPath);
+		if(curPath != null)
+			cn = instrumentedClassesBypath.get(curPath + clazz);
+		if(cn == null && clazz.endsWith("DetectorFactoryCollection"))
+			System.err.println("DetectorFactoryCollection not in " + curPath + " registry");
+		if(cn == null)
+			cn = instrumentedClasses.get(clazz);
+		if (cn == null) {
+			cn = getJREClassInfo(clazz);
+			if (cn == null)
+				return null;
+		}
+		return cn;
+	}
+	public static MethodListClassNode getClassNodeNOLOAD(String clazz) {
+		MethodListClassNode cn = null;
+		if(curPath != null)
+			cn = instrumentedClassesBypath.get(curPath + clazz);
+		if(cn == null && clazz.endsWith("DetectorFactoryCollection"))
+			System.err.println("DetectorFactoryCollection not in " + curPath + " registry");
+		if(cn == null)
+			cn = instrumentedClasses.get(clazz);
+		return cn;
+	}
+
+	public static MethodNode getMethodNode(ClassNode thisClassInfo, String name2, String desc2) {
+		if(name2.contains("foo"))
+		{
+			System.out.println(name2+desc2);
+		}
+		for (Object o : thisClassInfo.methods) {
+			MethodNode mn = (MethodNode) o;
+			if (mn.name.equals(name2) && mn.desc.equals(desc2))
+				return mn;
+		}
+		return null;
+	}
+
+	public static boolean atLeastASuperEq(String classToCheck, String whatWeWant, int n) {
+		ClassNode cn = Instrumenter.getClassNode(classToCheck);
+		if (cn == null || cn.superName == null)
+			return false;
+		if (cn.superName.equals(whatWeWant))
+			return true;
+		else if (n < 20)
+			return atLeastASuperEq(cn.superName, whatWeWant, n + 1);
+		return false;
+	}
+	public static EqMethodNode getMethodNodeInstOnly(String clazz, String name, String desc) {
+		MethodListClassNode cn = instrumentedClasses.get(clazz);
+		if (cn == null) {
+				return null;
+		}
+		for (EqMethodNode mn : cn.methodsHashSet) {
+			if (mn.name.equals(name) && mn.desc.equals(desc))
+				return mn;
+		}
+		return null;
+	}
+
+	public static EqMethodNode getMethodNode(String clazz, String name, String desc) {
+		MethodListClassNode cn = instrumentedClasses.get(clazz);
+		if (cn == null) {
+			cn = getJREClassInfo(clazz);
+			if (cn == null)
+				return null;
+		}
+		for (EqMethodNode mn : cn.methodsHashSet) {
+			if (mn.name.equals(name) && mn.desc.equals(desc))
+				return mn;
+		}
+		return null;
+	}
+	private static String curPath = null;
+
+
+	static class InstrumentResult
+	{
+		byte[] clazz;
+		byte[] intfc;
+		byte[] intfcReseter;
+	}
+	public static InstrumentResult instrumentClass(String path, InputStream is, boolean renameInterfaces) {
 		try {
+			InstrumentResult out = new InstrumentResult();
+			curPath = path;
+
 			ClassReader cr = new ClassReader(is);
+			//TODO why did we need to add the serial version uid??
+//			{
+//				ClassWriter cw = new ClassWriter(cr, 0);
+//				SerialVersionUIDAdder uidAdder = new SerialVersionUIDAdder(cw);
+//				cr.accept(uidAdder, ClassReader.SKIP_FRAMES);
+//				byte[] b = cw.toByteArray();
+//				cr = new ClassReader(b);
+//			}
+
+			ClassNode cn = new ClassNode();
+			cr.accept(cn, ClassReader.SKIP_FRAMES);
+
 			ClassWriter cw = new InstrumenterClassWriter(cr, ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES, loader);
-			InterceptingClassVisitor cv = new InterceptingClassVisitor(cw);

-			cr.accept(cv, ClassReader.EXPAND_FRAMES);
+			VMVMClassVisitor cv = cvFactory.getVisitor(cw, cn, true);
+
+			cr.accept(cv, ClassReader.SKIP_FRAMES);

 			lastInstrumentedClass = cv.getClassName();
-			byte[] out = cw.toByteArray();
-			try{
-			 ClassReader cr2 = new ClassReader(out);
-			 cr2.accept(new CheckClassAdapter(new ClassWriter(0)), ClassReader.EXPAND_FRAMES);
-			}
-			catch(Exception ex)
+			out.clazz = cw.toByteArray();
+
+			if((cn.access & Opcodes.ACC_INTERFACE) != 0)
 			{
-				System.err.println(lastInstrumentedClass);
+				out.intfcReseter = generateInterfaceCLinits(instrumentedClasses.get(cn.name));
+			}
+			if (cv.hasExtraInterface() && renameInterfaces) {
+				out.intfc = cv.getExtraInterface();
+			}
+			try {
+				ClassReader cr2 = new ClassReader(out.clazz);
+				cr2.accept(new CheckClassAdapter(new ClassWriter(0)), ClassReader.SKIP_FRAMES);
+			} catch (Exception ex) {
+				System.out.println(lastInstrumentedClass);
 				ex.printStackTrace();
 			}
+			curPath = null;
 			return out;
 		} catch (Exception ex) {
-			logger.error("Exception processing class: " + lastInstrumentedClass, ex);
+			curPath = null;
+			logger.log(Level.SEVERE, "Exception processing class: " + lastInstrumentedClass, ex);
 			ex.printStackTrace();
 			return null;
 		}
 	}
-public static void main(String[] args) {
-	_main(args);
-}
+
+	public static void main(String[] args) {
+		_main(args);
+	}
+
 	public static void _main(String[] args) {

 		String outputFolder = args[1];
@@ -117,7 +592,13 @@ public static void main(String[] args) {
 			if (f.isDirectory())
 				processDirectory(f, rootOutputDir, true);
 			else if (inputFolder.endsWith(".jar"))
+				//				try {
+				//					FileOutputStream fos =  new FileOutputStream(rootOutputDir.getPath() + File.separator + f.getName());
 				processJar(f, rootOutputDir);
+			//				} catch (FileNotFoundException e1) {
+			//					// TODO Auto-generated catch block
+			//					e1.printStackTrace();
+			//				}
 			else if (inputFolder.endsWith(".class"))
 				try {
 					processClass(f.getName(), new FileInputStream(f), rootOutputDir);
@@ -125,47 +606,391 @@ public static void main(String[] args) {
 					// TODO Auto-generated catch block
 					e.printStackTrace();
 				}
-			else {
+			else if (inputFolder.endsWith(".zip")) {
+				processZip(f, rootOutputDir);
+			} else {
 				System.err.println("Unknown type for path " + inputFolder);
 				System.exit(-1);
 			}
 			finishedPass();
 		}
+//		generateInterfaceCLinits(rootOutputDir);
 		// }

 	}
-	private static void analyzeClass(InputStream is)
+
+	private static byte[] generateInterfaceCLinits(MethodListClassNode cn)
 	{
-		ClassReader cr;
-		try {
-			cr = new ClassReader(is);
-			ClassNode cn = new ClassNode();
-			cr.accept(cn, 0);
-			ClassNode cn2 = new ClassNode();
-			cn2.superName = cn.superName;
-			cn2.interfaces = cn.interfaces;
-			cn2.name = cn.name;
-			instrumentedClasses.put(cn.name, cn2);
-		} catch (IOException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
+		if(cn != null && (cn.access & Opcodes.ACC_INTERFACE) != 0)
+		{
+			//Need to generate the clinit wrap
+
+			ClassWriter cv = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
+//			JUnitResettingClassVisitor cv = new JUnitResettingClassVisitor(cw, cn, false);
+			cv.visit(51, Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER, cn.name+"$vmvmReseter", null, "java/lang/Object", null);
+			cv.visitSource(null, null);
+			cv.visitAnnotation(Type.getDescriptor(VMVMInstrumented.class), false);
+
+
+			MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "vmvm_reinit_statics", "()V", null, null);
+			StaticFinalMutibleizer gmv = new StaticFinalMutibleizer(mv, Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, cn.name, "vmvm_reinit_statics", "()V");
+			gmv.visitCode();
+			gmv.visitInsn(Opcodes.ICONST_0);
+			gmv.visitFieldInsn(Opcodes.PUTSTATIC, cn.name+"$vmvmReseter", Constants.VMVM_NEEDS_RESET, "Z");
+
+			gmv.visitLdcInsn(Type.getType("L" + cn.name+"$vmvmReseter"+ ";"));
+			gmv.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(VirtualRuntime.class), "registerClInit", "(Ljava/lang/Class;)V");
+
+			if(StaticFieldIsolatorMV.CLINIT_ORDER_DEBUG)
+			{
+
+			gmv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "err", "Ljava/io/PrintStream;");
+			gmv.visitLdcInsn("clinit  rerunning>" + cn.name+"$vmvmReseter");
+			gmv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
+			}
+
+
+			//				gmv.visitCode();
+			if (cn.clInitInsns != null) {
+				MethodNode mn2 = new MethodNode();
+				mn2.maxLocals = 0;
+				mn2.maxStack = 0;
+				mn2.instructions = cn.clInitInsns;
+				mn2.instructions.resetLabels();
+				mn2.accept(gmv);
+//				gmv.returnValue();
+//				gmv.visitMaxs(0, 0);
+				gmv.visitEnd();
+			} else {
+				gmv.returnValue();
+				gmv.visitMaxs(0, 0);
+				gmv.visitEnd();
+			}
+
+		     {
+		         mv = cv.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
+		         mv.visitVarInsn(Opcodes.ALOAD, 0);
+		         mv.visitMethodInsn(Opcodes.INVOKESPECIAL,
+		                 "java/lang/Object",
+		                 "<init>",
+		                 "()V");
+		         mv.visitInsn(Opcodes.RETURN);
+		         mv.visitMaxs(1, 1);
+		         mv.visitEnd();
+		     }
+				cv.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, Constants.VMVM_NEEDS_RESET, "Z", null, true);
+				cv.visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, Constants.VMVM_RESET_IN_PROGRESS, "Ljava/lang/Thread;", null,null);
+			cv.visitEnd();
+
+			return cv.toByteArray();
+		}
+		return null;
+	}
+
+	public static MethodListClassNode getJREClassInfo(String className) {
+		if (!unInstrumentedClasses.containsKey(className)) {
+			try {
+				//				System.out.println(className);
+				analyzeClass(null,new ClassReader(className), unInstrumentedClasses);
+			} catch (IOException e) {
+				// TODO Auto-generated catch block
+				//				e.printStackTrace();
+			}
+		}
+		return unInstrumentedClasses.get(className);
+
+	}
+	private static HashSet<EqFieldInsnNode> getFieldsEffectedBy(String className, String methodName, String methodDesc, HashSet<EqMethodNode> explored)
+	{
+		HashSet<EqFieldInsnNode> ret = new HashSet<>();
+		EqMethodNode mn = getMethodNodeInstOnly(className, methodName, methodDesc);
+		if(mn != null && ! explored.contains(mn) && !className.startsWith("java/"))
+		{
+			explored.add(mn);
+			for(int i = 0; i < mn.instructions.size(); i++)
+			{
+				Object o = mn.instructions.get(i);
+				if(o instanceof FieldInsnNode)
+				{
+					FieldInsnNode fin = (FieldInsnNode)o;
+					if(instrumentedClasses.containsKey(fin.owner))
+						ret.add(new EqFieldInsnNode(0, fin.owner, fin.name, fin.desc));
+				}
+				else if (o instanceof MethodInsnNode)
+				{
+					MethodInsnNode min = (MethodInsnNode) o;
+					ret.addAll(getFieldsEffectedBy(min.owner, min.name, min.desc,explored));
+				}
+			}
+		}
+		return ret;
+
+	}
+	public static HashSet<EqFieldInsnNode> getFieldsEffectedBy(String className, String methodName, String methodDesc)
+	{
+		return getFieldsEffectedBy(className, methodName, methodDesc, new HashSet<EqMethodNode>());
+	}
+	private static HashMap<String, EqMethodNode> methods = new HashMap<>();
+
+	public static int MAX_CLASSES = -1;
+	public static int classesInstrumented = 0;
+	private static EqMethodNode getMethodNodeInternal(String owner, String name, String desc)
+	{
+		EqMethodNode mn = methods.get(owner+"."+name+desc);
+		if(mn == null)
+		{
+			mn = new EqMethodNode(0, name, desc, owner, null, null);
+			methods.put(owner+"."+name+desc, mn);
 		}
+		return mn;
+	}
+	public static void analyzeClass(String path, ClassReader cr, HashMap<String, MethodListClassNode> cacheMap) {
+		ClassNode cn = new ClassNode();
+		cr.accept(cn, 0);
+		MethodListClassNode cn2 = new MethodListClassNode();
+		cn2.methodsHashSet = new HashSet<>();
+//		if(cn.name.endsWith("DetectorFactoryCollection"))
+//			System.err.println("Visiting class: " + cn.name);
+

+		instrumentedClassesBypath.put(path+cn.name, cn2);
+
+		if (cacheMap.containsKey(cn.name))
+		{
+			cn2.isMutable = cacheMap.get(cn.name).isMutable;
+		}
+
+		cacheMap.put(cn.name, cn2);
+		cn2.superName = cn.superName;
+		cn2.interfaces = cn.interfaces;
+		cn2.name = cn.name;
+		cn2.access = cn.access;
+
+		cn2.fields = cn.fields;
+
+		if (cn.superName != null && !cn.superName.equals("java/lang/Object") && cacheMap != unInstrumentedClasses) {
+			if (!superToSubClass.containsKey(cn.superName))
+				superToSubClass.put(cn.superName, new HashSet<String>());
+			superToSubClass.get(cn.superName).add(cn.name);
+		}
+		if (cn.interfaces != null && cacheMap != unInstrumentedClasses) {
+			for (int i = 0; i < cn.interfaces.size(); i++) {
+				String interfc = (String) cn.interfaces.get(i);
+				if (!superToSubClass.containsKey(interfc))
+					superToSubClass.put(interfc, new HashSet<String>());
+				superToSubClass.get(interfc).add(cn.name);
+			}
+		}
+		IntializedTypeAnalyzer a = new IntializedTypeAnalyzer();
+
+		for (Object o : cn.methods) {
+			MethodNode m = (MethodNode) o;
+			EqMethodNode mn;
+			if(methods.containsKey(cn.name+"."+m.name+m.desc))
+			{
+				mn = methods.get(cn.name+"."+m.name+m.desc);
+				mn.access = m.access;
+				mn.name = m.name;
+				mn.desc = m.desc;
+				mn.owner = cn.name;
+				mn.signature = m.signature;
+			}
+			else
+			{
+				mn = new EqMethodNode(m.access, m.name, m.desc, cn.name, m.signature, null);
+				methods.put(cn.name+"."+m.name+m.desc,mn);
+			}
+			if(m.name.equals("<clinit>"))
+			{
+				cn2.hasClinit = true;
+//				cn2.clInit = mn;
+			}
+
+			try {
+				Frame[] frames = a.analyze(cn.name, m);
+				if (frames != null && frames.length > 0) {
+//					System.out.println(mn);
+
+					mn.typesThatIInit = a.getTypesDefinitelyInitedStartingWith(frames[0]);
+//					System.out.println(mn.typesThatIInit);
+					int i = -1;
+					for(Frame f : frames)
+					{
+						if(f != null && ((Node)f).isUnnecessary)
+							mn.ignoredInitCalls.add(i);
+//						if(f!=null)
+//						System.out.println((((Node) f).isUnnecessary ? "IGNORE\t" : "\t") + i + f);
+						i++;
+					}
+				}
+			} catch (AnalyzerException e) {
+				e.printStackTrace();
+			}
+
+
+
+			mn.localVariables = m.localVariables;
+			mn.invisibleAnnotations = m.invisibleAnnotations;
+			mn.visibleAnnotations = m.visibleAnnotations;
+			cn2.methodsHashSet.add(mn);
+			mn.instructions = new InsnList();
+			Iterator<?> iter = m.instructions.iterator();
+			while (iter.hasNext()) {
+				AbstractInsnNode in = (AbstractInsnNode) iter.next();
+				if (in.getOpcode() == Opcodes.GETSTATIC || in.getOpcode() == Opcodes.PUTSTATIC) {
+					FieldInsnNode fn = (FieldInsnNode) in;
+					mn.instructions.add(new FieldInsnNode(fn.getOpcode(), fn.owner, fn.name, fn.desc));
+				} else if (in.getType() == AbstractInsnNode.METHOD_INSN) {
+					MethodInsnNode min = (MethodInsnNode) in;
+					mn.instructions.add(new MethodInsnNode(min.getOpcode(), min.owner, min.name, min.desc));
+					//Add to the callgraph
+
+					if(methods.containsKey(min.owner+"."+min.name+min.desc))
+					{
+						mn.methodsICall.add(methods.get(min.owner+"."+min.name+min.desc));
+						methods.get(min.owner+"."+min.name+min.desc).methodsThatCallMe.add(mn);
+					}
+					else
+					{
+						EqMethodNode mnICall = new EqMethodNode(0, min.name, min.desc,cn2.name, null, null);
+						methods.put(min.owner+"."+min.name+min.desc,mnICall);
+						mn.methodsICall.add(mnICall);
+						mnICall.methodsThatCallMe.add(mn);
+					}
+				}
+				else if(in.getOpcode() == Opcodes.PUTFIELD)
+				{
+					//This method has side effects.
+					FieldInsnNode fn = (FieldInsnNode) in;
+					if (mn.name.equals("<init>") && cn2.name.equals(fn.owner)) {
+						//it's fine to have putfield in the constructor
+					} else {
+						MethodListClassNode ownerCN = cacheMap.get(fn.owner);
+						if (ownerCN == null) {
+							ownerCN = new MethodListClassNode();
+							cacheMap.put(fn.owner, ownerCN);
+						}
+						ownerCN.isMutable = true;
+					}
+				}
+			}
+			if(m.name.equals("<clinit>"))//XXX why was this filteirng this? && ((cn.access & Opcodes.ACC_INTERFACE) != 0) || (cn.access & Opcodes.ACC_ENUM) != 0)
+			{
+				cn2.clInitInsns= m.instructions;
+			}
+		}
+		if((cn.access & Opcodes.ACC_INTERFACE) != 0 && !cn.name.endsWith("/package-info"))
+		{
+			if(!InterceptingClassVisitor.shouldIgnoreClass(cn.name))
+				remappedInterfaces.add(cn.name);
+
+			cn2 = new MethodListClassNode();
+			cn2.methodsHashSet = new HashSet<>();
+			cn2.name = getInstrumentedInterfaceName(cn.name);
+			if (cacheMap.containsKey(cn2.name))
+				cn2 = cacheMap.get(cn2.name);
+			else
+				cacheMap.put(cn2.name, cn2);
+			cn2.superName = cn.name;
+			cn2.interfaces = cn.interfaces;
+			cn2.name = getInstrumentedInterfaceName(cn.name);
+			cn2.access = Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC + Opcodes.ACC_ABSTRACT + Opcodes.ACC_INTERFACE;
+
+			if (cn2.superName != null && !cn2.superName.equals("java/lang/Object") && cacheMap != unInstrumentedClasses) {
+				if (!superToSubClass.containsKey(cn.superName))
+					superToSubClass.put(cn2.superName, new HashSet<String>());
+				superToSubClass.get(cn2.superName).add(cn2.name);
+			}
+			if (cn2.interfaces != null && cacheMap != unInstrumentedClasses) {
+				for (int i = 0; i < cn.interfaces.size(); i++) {
+					String interfc = (String) cn2.interfaces.get(i);
+					if (!superToSubClass.containsKey(interfc))
+						superToSubClass.put(interfc, new HashSet<String>());
+					superToSubClass.get(interfc).add(cn2.name);
+				}
+			}
+
+			for (Object o : cn.methods) {
+				MethodNode m = (MethodNode) o;
+				Type[] argTypes = Type.getArgumentTypes(m.desc);
+				Type[] nTypes = new Type[argTypes.length+1];
+				nTypes[argTypes.length] = Type.getType(VMState.class);
+				System.arraycopy(argTypes, 0, nTypes, 0, argTypes.length);
+				EqMethodNode mn = new EqMethodNode(m.access, "_"+m.name, Type.getMethodDescriptor(Type.getReturnType(m.desc), nTypes),cn.name, m.signature, null);
+				mn.localVariables = m.localVariables;
+				cn2.methodsHashSet.add(mn);
+				mn.instructions = new InsnList();
+				Iterator<?> iter = m.instructions.iterator();
+				while (iter.hasNext()) {
+					AbstractInsnNode in = (AbstractInsnNode) iter.next();
+					if (in.getOpcode() == Opcodes.GETSTATIC || in.getOpcode() == Opcodes.PUTSTATIC) {
+						FieldInsnNode fn = (FieldInsnNode) in;
+						mn.instructions.add(new FieldInsnNode(fn.getOpcode(), fn.owner, fn.name, fn.desc));
+					} else if (in.getType() == AbstractInsnNode.METHOD_INSN) {
+						MethodInsnNode min = (MethodInsnNode) in;
+						mn.instructions.add(new MethodInsnNode(min.getOpcode(), min.owner, min.name, min.desc));
+					}
+				}
+				if(m.name.equals("<clinit>") && (cn.access & Opcodes.ACC_INTERFACE) != 0)
+				{
+					cn2.clInitInsns= m.instructions;
+				}
+			}
+		}
+	}
+	public static String getReseterName(String oldName) {
+		if (oldName.endsWith(".class"))
+			return oldName.replace(".class", "$vmvmReseter.class");
+		else
+			return oldName + "$vmvmReseter";
+	}
+	public static String getInstrumentedInterfaceName(String oldName) {
+		if (oldName.endsWith(".class"))
+			return oldName.replace(".class", "$vmvm.class");
+		else
+			return oldName + "$vmvm";
 	}
+
 	private static void processClass(String name, InputStream is, File outputDir) {
 		switch (pass_number) {
 		case PASS_ANALYZE:
-			analyzeClass(is);
+			try {
+				analyzeClass(outputDir.getAbsolutePath(),new ClassReader(is), instrumentedClasses);
+			} catch (IOException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+			catch(ArrayIndexOutOfBoundsException ex)
+			{
+
+			}
 			break;
 		case PASS_OUTPUT:
 			try {
-					FileOutputStream fos = new FileOutputStream(outputDir.getPath() + File.separator + name);
-					ByteArrayOutputStream bos = new ByteArrayOutputStream();
-					lastInstrumentedClass = outputDir.getPath() + File.separator + name;
-					bos.write(instrumentClass(is));
+				FileOutputStream fos = new FileOutputStream(outputDir.getPath() + File.separator + name);
+				ByteArrayOutputStream bos = new ByteArrayOutputStream();
+				lastInstrumentedClass = outputDir.getPath() + File.separator + name;
+
+				InstrumentResult c = instrumentClass(outputDir.getAbsolutePath(),is, true);
+				bos.write(c.clazz);
+				bos.writeTo(fos);
+				fos.close();
+				if (c.intfc != null) {
+					fos = new FileOutputStream(outputDir.getPath() + File.separator + getInstrumentedInterfaceName(name));
+					bos = new ByteArrayOutputStream();
+					lastInstrumentedClass = outputDir.getPath() + File.separator + getInstrumentedInterfaceName(name);
+					bos.write(c.intfc);
 					bos.writeTo(fos);
 					fos.close();
-
+				}
+				if(c.intfcReseter != null)
+				{
+					fos = new FileOutputStream(outputDir.getPath() + File.separator + getReseterName(name));
+					bos = new ByteArrayOutputStream();
+					bos.write(c.intfcReseter);
+					bos.writeTo(fos);
+					fos.close();
+				}

 			} catch (Exception ex) {
 				ex.printStackTrace();
@@ -173,9 +998,9 @@ public static void main(String[] args) {
 		}
 	}

-
-
 	private static void processDirectory(File f, File parentOutputDir, boolean isFirstLevel) {
+		if(f.getName().equals(".AppleDouble"))
+			return;
 		File thisOutputDir;
 		if (isFirstLevel) {
 			thisOutputDir = parentOutputDir;
@@ -195,7 +1020,16 @@ public static void main(String[] args) {
 					e.printStackTrace();
 				}
 			else if (fi.getName().endsWith(".jar"))
+				//				try {
+				//					FileOutputStream fos = new FileOutputStream(thisOutputDir.getPath() + File.separator + f.getName());
 				processJar(fi, thisOutputDir);
+			//					fos.close();
+			//				} catch (IOException e1) {
+			// TODO Auto-generated catch block
+			//					e1.printStackTrace();
+			//				}
+			else if (fi.getName().endsWith(".zip"))
+				processZip(fi, thisOutputDir);
 			else if (pass_number == PASS_OUTPUT) {
 				File dest = new File(thisOutputDir.getPath() + File.separator + fi.getName());
 				FileChannel source = null;
@@ -206,8 +1040,8 @@ public static void main(String[] args) {
 					destination = new FileOutputStream(dest).getChannel();
 					destination.transferFrom(source, 0, source.size());
 				} catch (Exception ex) {
-					logger.error("Unable to copy file " + fi, ex);
-					System.exit(-1);
+					logger.log(Level.SEVERE, "Unable to copy file " + fi, ex);
+//					System.exit(-1);
 				} finally {
 					if (source != null) {
 						try {
@@ -232,12 +1066,219 @@ public static void main(String[] args) {

 	}

-	private static void processJar(File f, File outputDir) {
+	//	private static void processJar(InputStream inputStream, OutputStream os) {
+	//		try {
+	//			File f = new File("/tmp/classfile");
+	//			if (f.exists())
+	//				f.delete();
+	//			FileOutputStream fos = new FileOutputStream(f);
+	//			byte buf[] = new byte[1024];
+	//			int len;
+	//			while ((len = inputStream.read(buf)) > 0) {
+	//				fos.write(buf, 0, len);
+	//			}
+	//			fos.close();
+	//			inputStream.close();
+	//
+	//			JarFile jar = new JarFile(f);
+	//			JarOutputStream jos = null;
+	//			if (pass_number == PASS_OUTPUT)
+	//				jos = new JarOutputStream(os);
+	//			//				jos = new JarOutputStream(new FileOutputStream(outputDir.getPath() + File.separator + f.getName()));
+	//			Enumeration<JarEntry> entries = jar.entries();
+	//			while (entries.hasMoreElements()) {
+	//				JarEntry e = entries.nextElement();
+	//				switch (pass_number) {
+	//				case PASS_ANALYZE:
+	//					if (e.getName().endsWith(".class")) {
+	//						analyzeClass(new ClassReader(jar.getInputStream(e)), instrumentedClasses);
+	//					}
+	//					break;
+	//				case PASS_OUTPUT:
+	//					if (e.getName().endsWith(".class") && !e.getName().startsWith("java") && !e.getName().startsWith("org/objenesis")
+	//							&& !e.getName().startsWith("com/thoughtworks/xstream/") && !e.getName().startsWith("com/rits/cloning")
+	//							&& !e.getName().startsWith("com/apple/java/Application")) {
+	//						{
+	//							JarEntry outEntry = new JarEntry(e.getName());
+	//							jos.putNextEntry(outEntry);
+	//							byte[] clazz = instrumentClass(jar.getInputStream(e));
+	//							if (clazz == null) {
+	//								InputStream is = jar.getInputStream(e);
+	//								byte[] buffer = new byte[1024];
+	//								while (true) {
+	//									int count = is.read(buffer);
+	//									if (count == -1)
+	//										break;
+	//									jos.write(buffer, 0, count);
+	//								}
+	//							} else
+	//								jos.write(clazz);
+	//							jos.closeEntry();
+	//						}
+	//
+	//					} else {
+	//						JarEntry outEntry = new JarEntry(e.getName());
+	//						if (e.isDirectory()) {
+	//							jos.putNextEntry(outEntry);
+	//							jos.closeEntry();
+	//						} else if (e.getName().startsWith("META-INF") && (e.getName().endsWith(".SF") || e.getName().endsWith(".RSA"))) {
+	//							// don't copy this
+	//						} else if (e.getName().equals("META-INF/MANIFEST.MF")) {
+	//							Scanner s = new Scanner(jar.getInputStream(e));
+	//							jos.putNextEntry(outEntry);
+	//
+	//							String curPair = "";
+	//							while (s.hasNextLine()) {
+	//								String line = s.nextLine();
+	//								if (line.equals("")) {
+	//									curPair += "\n";
+	//									if (!curPair.contains("SHA1-Digest:"))
+	//										jos.write(curPair.getBytes());
+	//									curPair = "";
+	//								} else {
+	//									curPair += line + "\n";
+	//								}
+	//							}
+	//							s.close();
+	//							jos.write("\n".getBytes());
+	//							jos.closeEntry();
+	//						} else {
+	//							jos.putNextEntry(outEntry);
+	//							InputStream is = jar.getInputStream(e);
+	//							byte[] buffer = new byte[1024];
+	//							while (true) {
+	//								int count = is.read(buffer);
+	//								if (count == -1)
+	//									break;
+	//								jos.write(buffer, 0, count);
+	//							}
+	//							jos.closeEntry();
+	//						}
+	//					}
+	//				}
+	//
+	//			}
+	//			//			if (pass_number == PASS_OUTPUT) {
+	//			//				jos.close();
+	//			//			}
+	//			jar.close();
+	//		} catch (Exception e) {
+	//			// TODO Auto-generated catch block
+	//			logger.error("Unable to process jar", e);
+	//			System.exit(-1);
+	//		}
+	//
+	//	}
+	//
+	//	private static void processZip(File f, File outputDir) {
+	//		try {
+	//			ZipFile jar = new ZipFile(f);
+	//			ZipOutputStream jos = null;
+	//			if (pass_number == PASS_OUTPUT)
+	//				jos = new ZipOutputStream(new FileOutputStream(outputDir.getPath() + File.separator + f.getName()));
+	//			Enumeration<? extends ZipEntry> entries = jar.entries();
+	//			while (entries.hasMoreElements()) {
+	//				ZipEntry e = entries.nextElement();
+	//				switch (pass_number) {
+	//				case PASS_ANALYZE:
+	//					if (e.getName().endsWith(".class")) {
+	//						analyzeClass(new ClassReader(jar.getInputStream(e)), instrumentedClasses);
+	//					}
+	//					break;
+	//				case PASS_OUTPUT:
+	//					if (e.getName().endsWith(".class") && !e.getName().startsWith("java") && !e.getName().startsWith("org/objenesis")
+	//							&& !e.getName().startsWith("com/thoughtworks/xstream/") && !e.getName().startsWith("com/rits/cloning")
+	//							&& !e.getName().startsWith("com/apple/java/Application")) {
+	//						{
+	//							JarEntry outEntry = new JarEntry(e.getName());
+	//							jos.putNextEntry(outEntry);
+	//							byte[] clazz = instrumentClass(jar.getInputStream(e));
+	//							if (clazz == null) {
+	//								InputStream is = jar.getInputStream(e);
+	//								byte[] buffer = new byte[1024];
+	//								while (true) {
+	//									int count = is.read(buffer);
+	//									if (count == -1)
+	//										break;
+	//									jos.write(buffer, 0, count);
+	//								}
+	//							} else
+	//								jos.write(clazz);
+	//							jos.closeEntry();
+	//						}
+	//
+	//					} else if (e.getName().endsWith(".jar")) {
+	//						ZipEntry outEntry = new ZipEntry(e.getName());
+	//						jos.putNextEntry(outEntry);
+	//						try {
+	//							processJar(jar.getInputStream(e), jos);
+	//							jos.flush();
+	//							jos.closeEntry();
+	//						} catch (FileNotFoundException e1) {
+	//							// TODO Auto-generated catch block
+	//							e1.printStackTrace();
+	//						}
+	//					} else {
+	//						ZipEntry outEntry = new ZipEntry(e.getName());
+	//						if (e.isDirectory()) {
+	//							jos.putNextEntry(outEntry);
+	//							jos.closeEntry();
+	//						} else if (e.getName().startsWith("META-INF") && (e.getName().endsWith(".SF") || e.getName().endsWith(".RSA"))) {
+	//							// don't copy this
+	//						} else if (e.getName().equals("META-INF/MANIFEST.MF")) {
+	//							Scanner s = new Scanner(jar.getInputStream(e));
+	//							jos.putNextEntry(outEntry);
+	//
+	//							String curPair = "";
+	//							while (s.hasNextLine()) {
+	//								String line = s.nextLine();
+	//								if (line.equals("")) {
+	//									curPair += "\n";
+	//									if (!curPair.contains("SHA1-Digest:"))
+	//										jos.write(curPair.getBytes());
+	//									curPair = "";
+	//								} else {
+	//									curPair += line + "\n";
+	//								}
+	//							}
+	//							s.close();
+	//							jos.write("\n".getBytes());
+	//							jos.closeEntry();
+	//						} else {
+	//							jos.putNextEntry(outEntry);
+	//							InputStream is = jar.getInputStream(e);
+	//							byte[] buffer = new byte[1024];
+	//							while (true) {
+	//								int count = is.read(buffer);
+	//								if (count == -1)
+	//									break;
+	//								jos.write(buffer, 0, count);
+	//							}
+	//							jos.closeEntry();
+	//						}
+	//					}
+	//				}
+	//
+	//			}
+	//			if (pass_number == PASS_OUTPUT) {
+	//				jos.close();
+	//			}
+	//			jar.close();
+	//		} catch (Exception e) {
+	//			// TODO Auto-generated catch block
+	//			logger.error("Unable to process zip" + f, e);
+	//			System.exit(-1);
+	//		}
+	//
+	//	}
+	public static void processJar(File f, File outputDir) {
 		try {
-			@SuppressWarnings("resource")
+			//			@SuppressWarnings("resource")
+			//			System.out.println("File: " + f.getName());
 			JarFile jar = new JarFile(f);
 			JarOutputStream jos = null;
 			if (pass_number == PASS_OUTPUT)
+				//				jos = new JarOutputStream(os);
 				jos = new JarOutputStream(new FileOutputStream(outputDir.getPath() + File.separator + f.getName()));
 			Enumeration<JarEntry> entries = jar.entries();
 			while (entries.hasMoreElements()) {
@@ -245,19 +1286,21 @@ public static void main(String[] args) {
 				switch (pass_number) {
 				case PASS_ANALYZE:
 					if (e.getName().endsWith(".class")) {
-						analyzeClass(jar.getInputStream(e));
+						classesInstrumented++;
+						if(MAX_CLASSES > 0 && classesInstrumented >= MAX_CLASSES)
+							return;
+						analyzeClass(f.getAbsolutePath(),new ClassReader(jar.getInputStream(e)), instrumentedClasses);
 					}
 					break;
 				case PASS_OUTPUT:
-					if (e.getName().endsWith(".class") && !e.getName().startsWith("java") && !e.getName().startsWith("org/objenesis")
-							&& !e.getName().startsWith("com/thoughtworks/xstream/") && !e.getName().startsWith("com/rits/cloning")
-							&& !e.getName().startsWith("com/apple/java/Application")) {
+					if (e.getName().endsWith(".class") && !e.getName().startsWith("org/xml/sax")) {
 						{
+							try{
 							JarEntry outEntry = new JarEntry(e.getName());
 							jos.putNextEntry(outEntry);
-							byte[] clazz = instrumentClass(jar.getInputStream(e));
-							if(clazz == null)
-							{
+							InstrumentResult clazz = instrumentClass(f.getAbsolutePath(),jar.getInputStream(e), true);
+							if (clazz == null || clazz.clazz == null) {
+								System.out.println("Failed to instrument " + e.getName() + " in " + f.getName());
 								InputStream is = jar.getInputStream(e);
 								byte[] buffer = new byte[1024];
 								while (true) {
@@ -265,13 +1308,33 @@ public static void main(String[] args) {
 									if (count == -1)
 										break;
 									jos.write(buffer, 0, count);
-								}
+								}
+							} else
+							{
+								jos.write(clazz.clazz);
 							}
-							else
-									jos.write(clazz);
 							jos.closeEntry();
-						}
+							if(clazz != null && clazz.intfcReseter != null)
+							{
+								outEntry = new JarEntry(getReseterName(e.getName()));
+								jos.putNextEntry(outEntry);
+								jos.write(clazz.intfcReseter);
+								jos.closeEntry();
+							}
+							if (clazz != null && clazz.intfc != null) {
+								outEntry = new JarEntry(getInstrumentedInterfaceName(e.getName()));
+								jos.putNextEntry(outEntry);
+								jos.write(clazz.intfc);
+								jos.closeEntry();
+							}
+							}
+							catch(ZipException ex)
+							{
+								ex.printStackTrace();
+								continue;
+							}

+						}

 					} else {
 						JarEntry outEntry = new JarEntry(e.getName());
@@ -315,14 +1378,331 @@ public static void main(String[] args) {
 				}

 			}
-			if (pass_number == PASS_OUTPUT) {
+			if (jos != null) {
 				jos.close();
+
+			}
+			jar.close();
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			logger.log(Level.SEVERE, "Unable to process jar" + f.getAbsolutePath(), e);
+			File dest = new File(outputDir.getPath() + File.separator + f.getName());
+			FileChannel source = null;
+			FileChannel destination = null;
+
+			try {
+				source = new FileInputStream(f).getChannel();
+				destination = new FileOutputStream(dest).getChannel();
+				destination.transferFrom(source, 0, source.size());
+			} catch (Exception ex) {
+				logger.log(Level.SEVERE, "Unable to copy file " + f, ex);
+//				System.exit(-1);
+			} finally {
+				if (source != null) {
+					try {
+						source.close();
+					} catch (IOException e2) {
+						// TODO Auto-generated catch block
+						e2.printStackTrace();
+					}
+				}
+				if (destination != null) {
+					try {
+						destination.close();
+					} catch (IOException e2) {
+						// TODO Auto-generated catch block
+						e2.printStackTrace();
+					}
+				}
+			}
+//			System.exit(-1);
+		}
+
+	}
+
+	private static void processZip(File f, File outputDir) {
+		try {
+			//			@SuppressWarnings("resource")
+			ZipFile zip = new ZipFile(f);
+			ZipOutputStream zos = null;
+			if (pass_number == PASS_OUTPUT)
+				zos = new ZipOutputStream(new FileOutputStream(outputDir.getPath() + File.separator + f.getName()));
+			Enumeration<? extends ZipEntry> entries = zip.entries();
+			while (entries.hasMoreElements()) {
+				ZipEntry e = entries.nextElement();
+				switch (pass_number) {
+				case PASS_ANALYZE:
+					if (e.getName().endsWith(".class")) {
+						analyzeClass(f.getAbsolutePath(),new ClassReader(zip.getInputStream(e)), instrumentedClasses);
+					} else if (e.getName().endsWith(".jar")) {
+						File tmp = new File("/tmp/classfile");
+						if (tmp.exists())
+							tmp.delete();
+						FileOutputStream fos = new FileOutputStream(tmp);
+						byte buf[] = new byte[1024];
+						int len;
+						InputStream is = zip.getInputStream(e);
+						while ((len = is.read(buf)) > 0) {
+							fos.write(buf, 0, len);
+						}
+						is.close();
+						fos.close();
+
+						processJar(tmp, new File("/tmp"));
+						//						processJar(jar.getInputStream(e), jos);
+					}
+					break;
+				case PASS_OUTPUT:
+					if (e.getName().endsWith(".class")) {
+						{
+							ZipEntry outEntry = new ZipEntry(e.getName());
+							zos.putNextEntry(outEntry);
+
+							InstrumentResult clazz = instrumentClass(f.getAbsolutePath(),zip.getInputStream(e), true);
+							if (clazz == null || clazz.clazz != null) {
+								InputStream is = zip.getInputStream(e);
+								byte[] buffer = new byte[1024];
+								while (true) {
+									int count = is.read(buffer);
+									if (count == -1)
+										break;
+									zos.write(buffer, 0, count);
+								}
+							} else
+								zos.write(clazz.clazz);
+							zos.closeEntry();
+
+							if (clazz != null && clazz.intfc != null) {
+								outEntry = new ZipEntry(getInstrumentedInterfaceName(e.getName()));
+								zos.putNextEntry(outEntry);
+								zos.write(clazz.intfc);
+								zos.closeEntry();
+							}
+							if(clazz != null && clazz.intfcReseter != null)
+							{
+								outEntry = new ZipEntry(getReseterName(e.getName()));
+								zos.putNextEntry(outEntry);
+								zos.write(clazz.intfcReseter);
+								zos.closeEntry();
+							}
+						}
+
+					} else if (e.getName().endsWith(".jar")) {
+						ZipEntry outEntry = new ZipEntry(e.getName());
+						//						jos.putNextEntry(outEntry);
+						//						try {
+						//							processJar(jar.getInputStream(e), jos);
+						//							jos.closeEntry();
+						//						} catch (FileNotFoundException e1) {
+						//							// TODO Auto-generated catch block
+						//							e1.printStackTrace();
+						//						}
+
+						File tmp = new File("/tmp/classfile");
+						if (tmp.exists())
+							tmp.delete();
+						FileOutputStream fos = new FileOutputStream(tmp);
+						byte buf[] = new byte[1024];
+						int len;
+						InputStream is = zip.getInputStream(e);
+						while ((len = is.read(buf)) > 0) {
+							fos.write(buf, 0, len);
+						}
+						is.close();
+						fos.close();
+						//						System.out.println("Done reading");
+						processJar(tmp, new File("tmp2"));
+
+						zos.putNextEntry(outEntry);
+						is = new FileInputStream("tmp2/classfile");
+						byte[] buffer = new byte[1024];
+						while (true) {
+							int count = is.read(buffer);
+							if (count == -1)
+								break;
+							zos.write(buffer, 0, count);
+						}
+						is.close();
+						zos.closeEntry();
+						//						jos.closeEntry();
+					} else {
+						ZipEntry outEntry = new ZipEntry(e.getName());
+						if (e.isDirectory()) {
+							zos.putNextEntry(outEntry);
+							zos.closeEntry();
+						} else if (e.getName().startsWith("META-INF") && (e.getName().endsWith(".SF") || e.getName().endsWith(".RSA"))) {
+							// don't copy this
+						} else if (e.getName().equals("META-INF/MANIFEST.MF")) {
+							Scanner s = new Scanner(zip.getInputStream(e));
+							zos.putNextEntry(outEntry);
+
+							String curPair = "";
+							while (s.hasNextLine()) {
+								String line = s.nextLine();
+								if (line.equals("")) {
+									curPair += "\n";
+									if (!curPair.contains("SHA1-Digest:"))
+										zos.write(curPair.getBytes());
+									curPair = "";
+								} else {
+									curPair += line + "\n";
+								}
+							}
+							s.close();
+							zos.write("\n".getBytes());
+							zos.closeEntry();
+						} else {
+							zos.putNextEntry(outEntry);
+							InputStream is = zip.getInputStream(e);
+							byte[] buffer = new byte[1024];
+							while (true) {
+								int count = is.read(buffer);
+								if (count == -1)
+									break;
+								zos.write(buffer, 0, count);
+							}
+							zos.closeEntry();
+						}
+					}
+				}
+
+			}
+			if (pass_number == PASS_OUTPUT) {
+				zos.close();
+				zip.close();
 			}
 		} catch (Exception e) {
 			// TODO Auto-generated catch block
-			logger.error("Unable to process jar" + f, e);
-			System.exit(-1);
+			logger.log(Level.SEVERE, "Unable to process zip" + f, e);
+			File dest = new File(outputDir.getPath() + File.separator + f.getName());
+			FileChannel source = null;
+			FileChannel destination = null;
+
+			try {
+				source = new FileInputStream(f).getChannel();
+				destination = new FileOutputStream(dest).getChannel();
+				destination.transferFrom(source, 0, source.size());
+			} catch (Exception ex) {
+				logger.log(Level.SEVERE, "Unable to copy file " + f, ex);
+//				System.exit(-1);
+			} finally {
+				if (source != null) {
+					try {
+						source.close();
+					} catch (IOException e2) {
+						// TODO Auto-generated catch block
+						e2.printStackTrace();
+					}
+				}
+				if (destination != null) {
+					try {
+						destination.close();
+					} catch (IOException e2) {
+						// TODO Auto-generated catch block
+						e2.printStackTrace();
+					}
+				}
+			}
+		}
+
+	}
+	public static MethodListClassNode getClassNodeWithMethod(String owner, String name, String desc) {
+		MethodListClassNode cn = instrumentedClasses.get(owner);
+		if(cn != null)
+		{
+			for(Object o : cn.methods)
+			{
+				MethodNode fn = (MethodNode) o;
+				if(fn.name.equals(name) && fn.desc.equals(desc))
+					return cn;
+			}
+			if(cn.interfaces != null)
+			{
+				for(Object o : cn.interfaces)
+				{
+					MethodListClassNode r = getClassNodeWithMethod((String) o, name,desc);
+					if(r != null)
+						return r;
+				}
+			}
+			if(cn.superName != null)
+				return getClassNodeWithMethod(cn.superName, name,desc);
 		}
+		return null;
+	}

+	public static MethodListClassNode getClassNodeWithField(String owner, String name) {
+		MethodListClassNode cn = instrumentedClasses.get(owner);
+		if(cn != null)
+		{
+			for(Object o : cn.fields)
+			{
+				FieldNode fn = (FieldNode) o;
+				if(fn.name.equals(name))
+					return cn;
+			}
+			if(cn.interfaces != null)
+			{
+				for(Object o : cn.interfaces)
+				{
+					MethodListClassNode r = getClassNodeWithField((String) o, name);
+					if(r != null)
+						return r;
+				}
+			}
+			if(cn.superName != null)
+				return getClassNodeWithField(cn.superName, name);
+		}
+		return null;
 	}
+	public static FieldNode getFieldNode(String owner, String name) {
+		ClassNode cn = getClassNode(owner);
+		if(cn != null)
+		{
+			for(Object o : cn.fields)
+			{
+				FieldNode fn = (FieldNode) o;
+				if(fn.name.equals(name))
+					return fn;
+			}
+			if(cn.interfaces != null)
+			{
+				for(Object o : cn.interfaces)
+				{
+					FieldNode r = getFieldNode((String) o, name);
+					if(r != null)
+						return r;
+				}
+			}
+			if(cn.superName != null)
+				return getFieldNode(cn.superName, name);
+		}
+		return null;
+	}
+
+}
+interface ClassVisitorFactory
+{
+	VMVMClassVisitor getVisitor(ClassVisitor cv, ClassNode thisClassInfo, boolean generateVMVMInterface);
 }
+class DebugVisitorFactory implements ClassVisitorFactory
+{
+	@Override
+	public VMVMClassVisitor getVisitor(ClassVisitor cv, ClassNode thisClassInfo, boolean generateVMVMInterface) {
+		return new ClinitPrintingCV(Opcodes.ASM4, cv, generateVMVMInterface);
+	}
+}
+class JUnitVisitorFactory implements ClassVisitorFactory
+{
+	@Override
+	public VMVMClassVisitor getVisitor(ClassVisitor cv, ClassNode thisClassInfo, boolean generateVMVMInterface) {
+		return new JUnitResettingClassVisitor(cv, thisClassInfo, generateVMVMInterface);
+	}
+}
+class VMVMVisitorFactory implements ClassVisitorFactory
+{
+	@Override
+	public VMVMClassVisitor getVisitor(ClassVisitor cv, ClassNode thisClassInfo, boolean generateVMVMInterface) {
+		return new InterceptingClassVisitor(cv, thisClassInfo, generateVMVMInterface);
+	}
+}
\ No newline at end of file
diff --git a/src/edu/columbia/cs/psl/vmvm/InstrumenterClassWriter.java b/src/edu/columbia/cs/psl/vmvm/InstrumenterClassWriter.java
index a358e15..04e2b8c 100644
--- a/src/edu/columbia/cs/psl/vmvm/InstrumenterClassWriter.java
+++ b/src/edu/columbia/cs/psl/vmvm/InstrumenterClassWriter.java
@@ -1,13 +1,13 @@
 package edu.columbia.cs.psl.vmvm;

 import java.net.URLClassLoader;
+import java.util.logging.Logger;

-import org.apache.log4j.Logger;
 import org.objectweb.asm.ClassReader;
 import org.objectweb.asm.ClassWriter;

 public class InstrumenterClassWriter extends ClassWriter {
-	private static Logger logger = Logger.getLogger(InstrumenterClassWriter.class);
+	private static Logger logger = Logger.getLogger("edu.columbia.cs.psl.vmvm.InstrumenterClassWriter");
 	private ClassLoader loader;
 	public InstrumenterClassWriter(ClassReader classReader, int flags, ClassLoader loader) {
 		super(classReader, flags);
@@ -26,7 +26,7 @@ public class InstrumenterClassWriter extends ClassWriter {
             c = Class.forName(type1.replace('/', '.'), false, loader);
             d = Class.forName(type2.replace('/', '.'), false, loader);
         } catch (ClassNotFoundException e) {
-        	logger.debug("Error while finding common super class for " + type1 +"; " + type2,e);
+//        	logger.debug("Error while finding common super class for " + type1 +"; " + type2,e);
         	return "java/lang/Object";
 //        	throw new RuntimeException(e);
         }
diff --git a/src/edu/columbia/cs/psl/vmvm/ReflectionWrapper.java b/src/edu/columbia/cs/psl/vmvm/ReflectionWrapper.java
new file mode 100644
index 0000000..04d2df7
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/ReflectionWrapper.java
@@ -0,0 +1,92 @@
+package edu.columbia.cs.psl.vmvm;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.HashSet;
+
+public class ReflectionWrapper {
+	public static Method[] getDeclaredMethods(Class<?> clazz)
+	{
+		Method[] r = clazz.getDeclaredMethods();
+		return r;
+	}
+	public static Method[] getMethods(Class<?> clazz)
+	{
+		Method[] r = clazz.getMethods();
+		return r;
+	}
+	public static Field[] getDeclaredFields(Class<?> clazz)
+	{
+		Field[] r = clazz.getDeclaredFields();
+		ArrayList<Field> ret = new ArrayList<>(r.length);
+ 		for(Field f : r)
+		{
+			if(!f.getName().startsWith("_vmvm") && !f.getName().endsWith("_vmvm_acc_logged") && !f.getName().endsWith("_vmvm_") && !f.getName().equals("vmvm_needs_reset"))
+				ret.add(f);
+		}
+ 		r = new Field[ret.size()];
+ 		r = ret.toArray(r);
+ 		return r;
+	}
+	public static Field[] getFields(Class<?> clazz)
+	{
+		Field[] r = clazz.getFields();
+		ArrayList<Field> ret = new ArrayList<>(r.length);
+ 		for(Field f : r)
+		{
+			if(!f.getName().startsWith("_vmvm") && !f.getName().endsWith("_vmvm_acc_logged") && !f.getName().endsWith("_vmvm_") && !f.getName().equals("vmvm_needs_reset"))
+				ret.add(f);
+		}
+ 		r = new Field[ret.size()];
+ 		r = ret.toArray(r);
+ 		return r;
+	}
+	public static Class<?> forName(String name, ClassLoader loader) throws ClassNotFoundException {
+		Class<?> ret = Class.forName(name, true, loader);
+		tryToInit(ret);
+		return ret;
+	}
+
+	public static Class<?> preNewInstance(Class<?> clazz) throws InstantiationException, IllegalAccessException {
+		tryToInit(clazz);
+		return clazz;
+	}
+
+	public static Class<?> forName(String name, boolean initialize, ClassLoader loader) throws ClassNotFoundException {
+		Class<?> ret = Class.forName(name, initialize, loader);
+		if (initialize) {
+			tryToInit(ret);
+		}
+		return ret;
+	}
+
+	public static Object invoke(Method m, Object owner, Object... args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
+		if (Modifier.isStatic(m.getModifiers()))
+			tryToInit(m.getDeclaringClass());
+		if(!m.isAccessible())
+			m.setAccessible(true);
+		return m.invoke(owner, args);
+	}
+
+	public static void tryToInit(Class<?> clazz) {
+
+		//			if(inited.contains(clazz))
+		//				return;
+		//			inited.add(clazz);
+		//			synchronized (clazz) {
+		try {
+			boolean val = clazz.getField(Constants.VMVM_NEEDS_RESET).getBoolean(null);
+			if (val) {
+				clazz.getMethod(Constants.VMVM_STATIC_RESET_METHOD).invoke(null);
+			}
+		} catch (Exception ex) {
+//								if (!(ex instanceof NoSuchMethodException))
+//									ex.printStackTrace();
+
+		}
+		//		}
+	}
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/VMState.java b/src/edu/columbia/cs/psl/vmvm/VMState.java
new file mode 100644
index 0000000..9243837
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/VMState.java
@@ -0,0 +1,21 @@
+package edu.columbia.cs.psl.vmvm;
+
+public class VMState {
+
+		int vmID;
+		int originalVMID;
+		public VMState(int state, int originalState) {
+			this.vmID = state;
+			this.originalVMID = originalState;
+		}
+		void setState(int state) {
+			this.vmID = state;
+		}
+		public void deVM()
+		{
+			vmID = originalVMID;
+		}
+		public int getState() {
+			return vmID;
+		}
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/VMVMInstrumented.java b/src/edu/columbia/cs/psl/vmvm/VMVMInstrumented.java
new file mode 100644
index 0000000..1895e90
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/VMVMInstrumented.java
@@ -0,0 +1,9 @@
+package edu.columbia.cs.psl.vmvm;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.CLASS)
+public @interface VMVMInstrumented {
+
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/VirtualRuntime.java b/src/edu/columbia/cs/psl/vmvm/VirtualRuntime.java
new file mode 100644
index 0000000..ef49e5e
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/VirtualRuntime.java
@@ -0,0 +1,894 @@
+package edu.columbia.cs.psl.vmvm;
+
+import java.io.IOException;
+import java.lang.management.ManagementFactory;
+import java.lang.ref.WeakReference;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.rmi.activation.ActivationException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.Properties;
+import java.util.Queue;
+import java.util.Scanner;
+import java.util.Set;
+import java.util.Stack;
+
+import javax.management.InstanceNotFoundException;
+import javax.management.MBeanRegistrationException;
+import javax.management.MBeanServer;
+import javax.management.MBeanServerFactory;
+import javax.management.ObjectName;
+import javax.naming.NamingException;
+import javax.sql.rowset.spi.SyncFactoryException;
+import javax.swing.UnsupportedLookAndFeelException;
+
+@VMVMInstrumented
+public class VirtualRuntime {
+	private static Integer nextVM = 1;
+
+	private static HashMap<Long, VMState> threadVMStatus = new HashMap<>();
+	public static HashMap<String, String> properties = new HashMap<>();
+
+	private static HashSet<WeakReference<Class<?>>> classes = new HashSet<>();
+	private static Queue<WeakReference<Class<?>>> classesInOrder = new LinkedList<>();
+
+	public static Object[] loggedValues = new Object[74];
+	public static boolean[] logsUsed = new boolean[74];
+
+	public static void registerClInit(Class<?> c) {
+		if (c.getName().startsWith("org.eclipse.jdt.internal.compilerzz.lookup.Binding"))
+			return; //TODO do a divide and conquer on all of the classes to see which is causing the problem
+		synchronized (classes) {
+			if (!classes.contains(c)) {
+				WeakReference<Class<?>> cr = new WeakReference<Class<?>>(c);
+				classesInOrder.add(cr);
+				classes.add(cr);
+			}
+		}
+	}
+
+	public static HashMap<String, InternalStaticClass> internalStatics = new HashMap<>();
+	static {
+		int n = 0;
+		Scanner s = new Scanner(VirtualRuntime.class.getResourceAsStream("internal-statics"));
+		while (s.hasNextLine()) {
+			String l = s.nextLine();
+			String[] d = l.split("\t");
+			String name = d[0];
+			InternalStaticClass c = new InternalStaticClass();
+			for (String z : d[1].split(",")) {
+				if (z.length() > 0)
+					c.addMethods.put(z, ++n);
+			}
+			for (String z : d[2].split(","))
+				if (z.length() > 0)
+					c.removeMethods.put(z, ++n);
+			for (String z : d[3].split(","))
+				if (z.length() > 0)
+					c.setMethods.put(z, ++n);
+			for (String z : d[4].split(","))
+				if (z.length() > 0)
+					c.getMethods.put(z, -1);
+			internalStatics.put(name, c);
+		}
+	}
+
+	private static void resetInternalStatics() {
+		if (logsUsed[44]) {
+			try {
+				javax.security.auth.Policy.setPolicy((javax.security.auth.Policy) loggedValues[44]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[44] = false;
+			loggedValues[44] = null;
+		}
+		if (logsUsed[13]) {
+			try {
+				java.lang.Thread.setDefaultUncaughtExceptionHandler((java.lang.Thread.UncaughtExceptionHandler) loggedValues[13]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[13] = false;
+			loggedValues[13] = null;
+		}
+		if (logsUsed[17]) {
+			try {
+				java.net.URLConnection.setContentHandlerFactory((java.net.ContentHandlerFactory) loggedValues[17]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[17] = false;
+			loggedValues[17] = null;
+		}
+		if (logsUsed[18]) {
+			try {
+				java.net.URLConnection.setFileNameMap((java.net.FileNameMap) loggedValues[18]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[18] = false;
+			loggedValues[18] = null;
+		}
+		if (logsUsed[19]) {
+			try {
+				java.net.URLConnection.setDefaultAllowUserInteraction((boolean) loggedValues[19]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[19] = false;
+			loggedValues[19] = null;
+		}
+		if (logsUsed[20]) {//try{
+			//java.net.URLConnection.setDefaultRequestProperty(()loggedValues[20]);}catch(Exception ex){ex.printStackTrace();}
+			logsUsed[20] = false;
+			loggedValues[20] = null;
+		}
+		if (logsUsed[16]) {
+			try {
+				java.net.ResponseCache.setDefault((java.net.ResponseCache) loggedValues[16]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[16] = false;
+			loggedValues[16] = null;
+		}
+		if (logsUsed[37]) {
+			try {
+				javax.imageio.ImageIO.setUseCache((boolean) loggedValues[37]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[37] = false;
+			loggedValues[37] = null;
+		}
+		if (logsUsed[38]) {
+			try {
+				javax.imageio.ImageIO.setCacheDirectory((java.io.File) loggedValues[38]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[38] = false;
+			loggedValues[38] = null;
+		}
+		if (logsUsed[35]) {
+			try {
+				javax.activation.CommandMap.setDefaultCommandMap((javax.activation.CommandMap) loggedValues[35]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[35] = false;
+			loggedValues[35] = null;
+		}
+		if (logsUsed[63]) {
+			try {
+				javax.swing.plaf.synth.SynthLookAndFeel.setStyleFactory((javax.swing.plaf.synth.SynthStyleFactory) loggedValues[63]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[63] = false;
+			loggedValues[63] = null;
+		}
+		if (logsUsed[55]) {
+			try {
+				javax.swing.Timer.setLogTimers((boolean) loggedValues[55]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[55] = false;
+			loggedValues[55] = null;
+		}
+		if (logsUsed[43]) {
+			try {
+				javax.net.ssl.SSLContext.setDefault((javax.net.ssl.SSLContext) loggedValues[43]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[43] = false;
+			loggedValues[43] = null;
+		}
+		if (logsUsed[21]) {
+			try {
+				java.rmi.activation.ActivationGroup.setSystem((java.rmi.activation.ActivationSystem) loggedValues[21]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[21] = false;
+			loggedValues[21] = null;
+		}
+		if (logsUsed[41]) {
+			try {
+				javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory((javax.net.ssl.SSLSocketFactory) loggedValues[41]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[41] = false;
+			loggedValues[41] = null;
+		}
+		if (logsUsed[42]) {
+			try {
+				javax.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier((javax.net.ssl.HostnameVerifier) loggedValues[42]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[42] = false;
+			loggedValues[42] = null;
+		}
+		if (logsUsed[54]) {
+			try {
+				javax.swing.PopupFactory.setSharedInstance((javax.swing.PopupFactory) loggedValues[54]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[54] = false;
+			loggedValues[54] = null;
+		}
+		if (logsUsed[51]) {
+			try {
+				javax.swing.JPopupMenu.setDefaultLightWeightPopupEnabled((boolean) loggedValues[51]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[51] = false;
+			loggedValues[51] = null;
+		}
+		if (logsUsed[14]) {
+			try {
+				java.net.CookieHandler.setDefault((java.net.CookieHandler) loggedValues[14]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[14] = false;
+			loggedValues[14] = null;
+		}
+		if (logsUsed[46]) {
+			try {
+				javax.sql.rowset.spi.SyncFactory.setLogger((java.util.logging.Logger) loggedValues[46]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[46] = false;
+			loggedValues[46] = null;
+		}
+		if (logsUsed[47]) {
+			try {
+				javax.sql.rowset.spi.SyncFactory.setJNDIContext((javax.naming.Context) loggedValues[47]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[47] = false;
+			loggedValues[47] = null;
+		}
+		if (logsUsed[67]) {
+			try {
+				java.net.Authenticator.setDefault((java.net.Authenticator) loggedValues[67]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[67] = false;
+			loggedValues[67] = null;
+		}
+		if (logsUsed[53]) {
+			try {
+				javax.swing.LayoutStyle.setInstance((javax.swing.LayoutStyle) loggedValues[53]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[53] = false;
+			loggedValues[53] = null;
+		}
+		if (logsUsed[39]) {
+			try {
+				javax.naming.spi.NamingManager.setInitialContextFactoryBuilder((javax.naming.spi.InitialContextFactoryBuilder) loggedValues[39]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[39] = false;
+			loggedValues[39] = null;
+		}
+		if (logsUsed[40]) {
+			try {
+				javax.naming.spi.NamingManager.setObjectFactoryBuilder((javax.naming.spi.ObjectFactoryBuilder) loggedValues[40]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[40] = false;
+			loggedValues[40] = null;
+		}
+		if (logsUsed[45]) {
+			try {
+				javax.security.auth.login.Configuration.setConfiguration((javax.security.auth.login.Configuration) loggedValues[45]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[45] = false;
+			loggedValues[45] = null;
+		}
+		if (logsUsed[65]) {
+			try {
+				javax.swing.JDialog.setDefaultLookAndFeelDecorated((boolean) loggedValues[65]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[65] = false;
+			loggedValues[65] = null;
+		}
+		if (logsUsed[30]) {
+			try {
+				java.sql.DriverManager.setLoginTimeout((int) loggedValues[30]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[30] = false;
+			loggedValues[30] = null;
+		}
+		if (logsUsed[32]) {
+			try {
+				java.sql.DriverManager.setLogWriter((java.io.PrintWriter) loggedValues[32]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[32] = false;
+			loggedValues[32] = null;
+		}
+		if (logsUsed[31]) {
+			try {
+				java.sql.DriverManager.setLogStream((java.io.PrintStream) loggedValues[31]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[31] = false;
+			loggedValues[31] = null;
+		}
+		if (logsUsed[50]) {
+			try {
+				javax.swing.JOptionPane.setRootFrame((java.awt.Frame) loggedValues[50]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[50] = false;
+			loggedValues[50] = null;
+		}
+		if (logsUsed[49]) {
+			try {
+				javax.swing.JComponent.setDefaultLocale((java.util.Locale) loggedValues[49]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[49] = false;
+			loggedValues[49] = null;
+		}
+		if (logsUsed[3]) {//try{
+			//java.awt.AWTEventMulticaster..(()loggedValues[3]);}catch(Exception ex){ex.printStackTrace();}
+			logsUsed[3] = false;
+			loggedValues[3] = null;
+		}
+		if (logsUsed[15]) {
+			try {
+				java.net.ProxySelector.setDefault((java.net.ProxySelector) loggedValues[15]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[15] = false;
+			loggedValues[15] = null;
+		}
+		if (logsUsed[5]) {
+			try {
+				java.beans.Introspector.setBeanInfoSearchPath((java.lang.String[]) loggedValues[5]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[5] = false;
+			loggedValues[5] = null;
+		}
+		if (logsUsed[36]) {
+			try {
+				javax.activation.FileTypeMap.setDefaultFileTypeMap((javax.activation.FileTypeMap) loggedValues[36]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[36] = false;
+			loggedValues[36] = null;
+		}
+		if (logsUsed[29]) {//try{
+			//java.security.Security.setProperty(()loggedValues[29]);}catch(Exception ex){ex.printStackTrace();}
+			logsUsed[29] = false;
+			loggedValues[29] = null;
+		}
+		if (logsUsed[4]) {
+			try {
+				java.awt.KeyboardFocusManager.setCurrentKeyboardFocusManager((java.awt.KeyboardFocusManager) loggedValues[4]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[4] = false;
+			loggedValues[4] = null;
+		}
+		if (logsUsed[26]) {
+			try {
+				java.security.Policy.setPolicy((java.security.Policy) loggedValues[26]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[26] = false;
+			loggedValues[26] = null;
+		}
+		if (logsUsed[23]) {
+			try {
+				java.rmi.server.RMISocketFactory.setFailureHandler((java.rmi.server.RMIFailureHandler) loggedValues[23]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[23] = false;
+			loggedValues[23] = null;
+		}
+		if (logsUsed[24]) {
+			try {
+				java.rmi.server.RMISocketFactory.setSocketFactory((java.rmi.server.RMISocketFactory) loggedValues[24]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[24] = false;
+			loggedValues[24] = null;
+		}
+		if (logsUsed[64]) {
+			try {
+				javax.swing.text.LayoutQueue.setDefaultQueue((javax.swing.text.LayoutQueue) loggedValues[64]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[64] = false;
+			loggedValues[64] = null;
+		}
+		if (logsUsed[33]) {
+			try {
+				java.util.Locale.setDefault((java.util.Locale) loggedValues[33]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[33] = false;
+			loggedValues[33] = null;
+		}
+		if (logsUsed[66]) {
+			try {
+				javax.swing.JFrame.setDefaultLookAndFeelDecorated((boolean) loggedValues[66]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[66] = false;
+			loggedValues[66] = null;
+		}
+		if (logsUsed[7]) {
+			try {
+				java.lang.System.setOut((java.io.PrintStream) loggedValues[7]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[7] = false;
+			loggedValues[7] = null;
+		}
+		if (logsUsed[8]) {
+			try {
+				java.lang.System.setIn((java.io.InputStream) loggedValues[8]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[8] = false;
+			loggedValues[8] = null;
+		}
+		if (logsUsed[9]) {
+			try {
+				java.lang.System.setProperties((java.util.Properties) loggedValues[9]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[9] = false;
+			loggedValues[9] = null;
+		}
+		if (logsUsed[10]) {
+			try {
+				java.lang.System.setSecurityManager((java.lang.SecurityManager) loggedValues[10]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[10] = false;
+			loggedValues[10] = null;
+		}
+		if (logsUsed[11]) {//try{
+			//java.lang.System.setProperty(()loggedValues[11]);}catch(Exception ex){ex.printStackTrace();}
+			logsUsed[11] = false;
+			loggedValues[11] = null;
+		}
+		if (logsUsed[12]) {
+			try {
+				java.lang.System.setErr((java.io.PrintStream) loggedValues[12]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[12] = false;
+			loggedValues[12] = null;
+		}
+		if (logsUsed[6]) {
+			try {
+				java.beans.PropertyEditorManager.setEditorSearchPath((java.lang.String[]) loggedValues[6]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[6] = false;
+			loggedValues[6] = null;
+		}
+		if (logsUsed[62]) {//try{
+			//javax.swing.plaf.nimbus.EffectUtils.setPixels(()loggedValues[62]);}catch(Exception ex){ex.printStackTrace();}
+			logsUsed[62] = false;
+			loggedValues[62] = null;
+		}
+		if (logsUsed[34]) {
+			try {
+				java.util.TimeZone.setDefault((java.util.TimeZone) loggedValues[34]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[34] = false;
+			loggedValues[34] = null;
+		}
+		if (logsUsed[61]) {
+			try {
+				javax.swing.UIManager.setInstalledLookAndFeels((javax.swing.UIManager.LookAndFeelInfo[]) loggedValues[61]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[61] = false;
+			loggedValues[61] = null;
+		}
+		if (logsUsed[60]) {
+			try {
+				javax.swing.UIManager.setLookAndFeel((java.lang.String) loggedValues[60]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[60] = false;
+			loggedValues[60] = null;
+		}
+		if (logsUsed[52]) {//try{
+			//javax.swing.KeyboardManager.setCurrentManager((javax.swing.KeyboardManager)loggedValues[52]);}catch(Exception ex){ex.printStackTrace();}
+			logsUsed[52] = false;
+			loggedValues[52] = null;
+		}
+		if (logsUsed[48]) {
+			try {
+				javax.swing.FocusManager.setCurrentManager((javax.swing.FocusManager) loggedValues[48]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[48] = false;
+			loggedValues[48] = null;
+		}
+		if (logsUsed[22]) {
+			try {
+				java.rmi.server.LogStream.setDefaultStream((java.io.PrintStream) loggedValues[22]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[22] = false;
+			loggedValues[22] = null;
+		}
+		if (logsUsed[25]) {
+			try {
+				java.rmi.server.RemoteServer.setLog((java.io.OutputStream) loggedValues[25]);
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+			logsUsed[25] = false;
+			loggedValues[25] = null;
+		}
+
+		if (logsUsed[1]) {
+			loggedValues[1] = null;
+			logsUsed[1] = false;
+		}
+		if (logsUsed[2]) {
+			loggedValues[2] = null;
+			logsUsed[2] = false;
+		}
+		if (logsUsed[27]) {
+			loggedValues[27] = null;
+			logsUsed[27] = false;
+		}
+		if (logsUsed[28]) {
+			loggedValues[28] = null;
+			logsUsed[28] = false;
+		}
+		if (logsUsed[56]) {
+			for (WeakReference<Object> o : (LinkedList<WeakReference<Object>>) loggedValues[56])
+				if (!o.isEnqueued())
+					javax.swing.UIManager.removePropertyChangeListener((java.beans.PropertyChangeListener) o.get());
+			loggedValues[56] = null;
+			logsUsed[56] = false;
+		}
+		if (logsUsed[57]) {
+			for (WeakReference<Object> o : (LinkedList<WeakReference<Object>>) loggedValues[57])
+				if (!o.isEnqueued())
+					javax.swing.UIManager.removeAuxiliaryLookAndFeel((javax.swing.LookAndFeel) o.get());
+			loggedValues[57] = null;
+			logsUsed[57] = false;
+		}
+		if (logsUsed[58]) {
+			for (Object o : (LinkedList<Object>) loggedValues[58])
+				javax.swing.UIManager.addPropertyChangeListener((java.beans.PropertyChangeListener) o);
+			loggedValues[58] = null;
+			logsUsed[58] = false;
+		}
+		if (logsUsed[59]) {
+			for (Object o : (LinkedList<Object>) loggedValues[59])
+				javax.swing.UIManager.addAuxiliaryLookAndFeel((javax.swing.LookAndFeel) o);
+			loggedValues[59] = null;
+			logsUsed[59] = false;
+		}
+
+	}
+
+	public static void logStaticInternal(Object o, int i) {
+		if (logsUsed[i])
+			return;
+		logsUsed[i] = true;
+		loggedValues[i] = o;
+	}
+
+	@SuppressWarnings("unchecked")
+	public static void logStaticInternalAdd(Object o, int i) {
+		if (!logsUsed[i])
+			loggedValues[i] = new LinkedList<WeakReference<Object>>();
+		logsUsed[i] = true;
+		((LinkedList<WeakReference<Object>>) loggedValues[i]).add(new WeakReference<Object>(o));
+	}
+
+	public static void logStaticInternalRemove(Object o, int i) {
+		if (!logsUsed[i])
+			loggedValues[i] = new LinkedList<Object>();
+		logsUsed[i] = true;
+		((LinkedList<Object>) loggedValues[i]).add(o);
+	}
+
+	public static String logAndSetProperty(String key, String value) {
+		if (!properties.containsKey(key))
+			properties.put(key, System.getProperty(key));
+		return System.setProperty(key, value);
+	}
+
+	public static void logAndSetProperty(Properties values) {
+		for (Object key : values.keySet()) {
+			if (!properties.containsKey(key))
+				properties.put((String) key, System.getProperty((String) key));
+		}
+		System.setProperties(values);
+	}
+
+	public static <T> Constructor<T>[] hideVMVMConstructors(Constructor<T>[] in) {
+		int n = 0;
+		for (Constructor<T> o : in) {
+			boolean hasVMVM = false;
+			for (Class<?> c : o.getParameterTypes()) {
+				if (c.equals(VMState.class))
+					hasVMVM = true;
+			}
+			if (!hasVMVM)
+				n++;
+		}
+		Constructor<T>[] ret = new Constructor[n];
+		n = 0;
+		for (Constructor<T> o : in) {
+			boolean hasVMVM = false;
+			for (Class<?> c : o.getParameterTypes())
+				if (c.equals(VMState.class))
+					hasVMVM = true;
+			if (!hasVMVM) {
+				ret[n] = o;
+				n++;
+			}
+		}
+		return ret;
+	}
+
+	public static int getVMId() {
+		Long id = Thread.currentThread().getId();
+		if (!threadVMStatus.containsKey(id))
+			threadVMStatus.put(id, new VMState(0, 0));
+		return threadVMStatus.get(id).getState();
+	}
+
+	public static VMState getVMState() {
+		Long id = Thread.currentThread().getId();
+		if (!threadVMStatus.containsKey(id))
+			threadVMStatus.put(id, new VMState(0, 0));
+		return new VMState(threadVMStatus.get(id).getState(), threadVMStatus.get(id).getState());
+	}
+
+	public static void setVMId(long thread, int id) {
+		if (threadVMStatus.get(Thread.currentThread().getId()).getState() == id || threadVMStatus.get(Thread.currentThread().getId()).getState() == 0)
+			threadVMStatus.put(thread, new VMState(id, 0));
+	}
+
+	public static void setVMed(long thread) {
+		int vmId = threadVMStatus.get(Thread.currentThread().getId()).getState();
+
+		VMState state = threadVMStatus.get(thread);
+		if (state == null) {
+			threadVMStatus.put(thread, new VMState(vmId, vmId));
+		} else {
+			state.originalVMID = state.vmID;
+			state.setState(vmId);
+		}
+	}
+
+	public static VMState setVMed() {
+		int vmId = 0;
+		synchronized (nextVM) {
+			vmId = nextVM;
+			nextVM++;
+		}
+		VMState state = threadVMStatus.get(Thread.currentThread().getId());
+		if (state == null) {
+			threadVMStatus.put(Thread.currentThread().getId(), new VMState(vmId, 0));
+			return threadVMStatus.get(Thread.currentThread().getId());
+		} else {
+			state.originalVMID = state.vmID;
+			state.setState(vmId);
+			return state;
+		}
+	}
+
+	public static VMState setVMed(int n) {
+
+		VMState state = threadVMStatus.get(Thread.currentThread().getId());
+		if (state.getState() == 0) {
+			state.originalVMID = state.vmID;
+			state.setState(n);
+			return state;
+		}
+		//TODO
+		//		System.out.println("OMG returning null we'll just be insecure and let it work");
+		//		return null;
+		state.originalVMID = state.vmID;
+		state.setState(n);
+		return state;
+	}
+
+	public static void resetStatics() {
+		System.err.println("\n\n>>>>>>>>>>>Resetting statics (" + classes.size() + ") <<<<<<<<<<\n\n");
+		resetInternalStatics();
+		//		new Exception().printStackTrace();
+		synchronized (classes) {
+			for (String s : properties.keySet()) {
+				//				System.out.println("Reseting " + s + " from <" + System.getProperty(s) + "> to <" + properties.get(s) + ">");
+				if (properties.get(s) != null)
+					System.setProperty(s, properties.get(s));
+				else
+					System.clearProperty(s);
+			}
+			properties.clear();
+
+			ArrayList<MBeanServer> mbeanServers = MBeanServerFactory.findMBeanServer(null);
+			if (mbeanServers != null && mbeanServers.size() > 0) {
+				for (MBeanServer server : mbeanServers) {
+					System.out.println("Releasing server " + server);
+					MBeanServerFactory.releaseMBeanServer(server);
+				}
+			}
+			mbeanServers = null;
+			MBeanServer server = ManagementFactory.getPlatformMBeanServer();
+			if (server.getMBeanCount() > 0) {
+				Set<ObjectName> onames = server.queryNames(null, null);
+				for (ObjectName name : onames)
+					try {
+						server.unregisterMBean(name);
+					} catch (Throwable e) {
+					}
+			}
+			server = null;
+			while (!classesInOrder.isEmpty()) {
+				WeakReference<Class<?>> cr = classesInOrder.poll();
+				Class<?> c = cr.get();
+				classes.remove(cr);
+				if (c == null) {
+					System.err.println("Skipping something null in reset!");
+					continue;
+				}
+				//					System.err.println("Calling reset on z " + c.getName());
+				//				if(!c.getName().contains("tomcat") && ! c.getName().contains("catalina") )
+				try {
+					//					Method m = c.getMethod(Constants.VMVM_STATIC_RESET_METHOD);
+					//					if(!m.isAccessible())
+					//						m.setAccessible(true);
+					//					m.invoke(null);
+					Field f = c.getField(Constants.VMVM_NEEDS_RESET);
+					if (!f.isAccessible())
+						f.setAccessible(true);
+					f.set(null, true);
+				} catch (IllegalAccessException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				} catch (IllegalArgumentException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+					//				} catch (InvocationTargetException e) {
+					//					// TODO Auto-generated catch block
+					//					e.printStackTrace();
+					//				} catch (NoSuchMethodException e) {
+					//					// TODO Auto-generated catch block
+					//					e.printStackTrace();
+				} catch (SecurityException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				} catch (NoSuchFieldException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				} catch (NoClassDefFoundError e) {
+					e.printStackTrace();
+				}
+
+			}
+		}
+		Thread.currentThread().setContextClassLoader(ClassLoader.getSystemClassLoader());
+		//		ChrootUtils.reset();
+		//		ThreadGroup thisThreadGroup = Thread.currentThread().getThreadGroup();
+		////		while(thisThreadGroup.getParent() != null)
+		////			thisThreadGroup = thisThreadGroup.getParent();
+		//		Thread[] tt= new Thread[thisThreadGroup.activeCount() + 20];
+		//		thisThreadGroup.enumerate(tt, true);
+		//		for(Thread t : tt)
+		//		{
+		//			if(t!= null && t.isAlive() && t != Thread.currentThread())
+		//			{
+		//				System.err.println("Running thread to kill: " + t + "; cl: " + t.getContextClassLoader());
+		//				while(t.isAlive())
+		//					t.stop();
+		//			}
+		//		}
+		//		tt= new Thread[thisThreadGroup.activeCount() + 20];
+		//		thisThreadGroup.enumerate(tt, true);
+		//		for(Thread t : tt)
+		//		{
+		//			if(t!= null && t.isAlive() && t != Thread.currentThread())
+		//			{
+		//				System.err.println("Running thread still up: " + t + "; cl: " + t.getContextClassLoader());
+		//				while(t.isAlive())
+		//					t.stop();
+		//			}
+		//			else if(t != null)
+		//			{
+		//				System.err.println("Other thread: " + t);
+		//			}
+		//		}
+		//
+		//		tt= new Thread[thisThreadGroup.activeCount() + 20];
+		//		while(thisThreadGroup.getParent() != null)
+		//		thisThreadGroup = thisThreadGroup.getParent();
+		//		thisThreadGroup.enumerate(tt, true);
+		//		for(Thread t : tt)
+		//		{
+		//			if(t!= null && t.isAlive())
+		//			{
+		//				System.err.println("Running thread still up: " + t + "; cl: " + t.getContextClassLoader());
+		//			}
+		//		}
+		System.err.println("VR Classloader: " + Thread.currentThread().getContextClassLoader());
+	}
+
+	public static class InternalStaticClass {
+		HashMap<String, Integer> getMethods = new HashMap<>();
+		public HashMap<String, Integer> setMethods = new HashMap<>();
+		public HashMap<String, Integer> addMethods = new HashMap<>();
+		public HashMap<String, Integer> removeMethods = new HashMap<>();
+
+		@Override
+		public String toString() {
+			return "InternalStaticClass [getMethods=" + getMethods + ", setMethods=" + setMethods + ", addMethods=" + addMethods + ", removeMethods=" + removeMethods + "]";
+		}
+
+	}
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/Virtualizer.java b/src/edu/columbia/cs/psl/vmvm/Virtualizer.java
new file mode 100644
index 0000000..b5b5e81
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/Virtualizer.java
@@ -0,0 +1,19 @@
+package edu.columbia.cs.psl.vmvm;
+
+
+public class Virtualizer {
+
+	public static void execInVM(){
+		throw new RuntimeException("execInVM was called, but the VMVM instrumenter was never run on this code");
+	}
+	public static void execInVM(int n)
+	{
+		throw new RuntimeException("execInVM was called, but the VMVM instrumenter was never run on this code");
+	}
+	public static void exitVM()
+	{
+		throw new RuntimeException("exitVM was called, but the VMVM instrumenter was never run on this code");
+	}
+
+
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/agent/ClassLoaderBasedTransformer.java b/src/edu/columbia/cs/psl/vmvm/agent/ClassLoaderBasedTransformer.java
new file mode 100644
index 0000000..51b69b7
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/agent/ClassLoaderBasedTransformer.java
@@ -0,0 +1,40 @@
+package edu.columbia.cs.psl.vmvm.agent;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.instrument.ClassFileTransformer;
+import java.lang.instrument.IllegalClassFormatException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.security.ProtectionDomain;
+
+public class ClassLoaderBasedTransformer implements ClassFileTransformer{
+	public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
+
+		if(className.startsWith("java") || className.startsWith("sun") || className.startsWith("com/sun"))
+			return null;
+		try {
+			URLClassLoader ldr = new URLClassLoader(new URL[]{ new File(System.getProperty("VMVMLib")).toURL()}, loader);
+			ClassFileTransformer t = (ClassFileTransformer) ldr.loadClass("edu.columbia.cs.psl.vmvm.agent.VMVMClassFileTransformer").newInstance();
+			ldr.close();
+			return t.transform(loader, className, classBeingRedefined, protectionDomain, classfileBuffer);
+		} catch (ClassNotFoundException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (InstantiationException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IllegalAccessException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (MalformedURLException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return null;
+	}
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/agent/Premain.java b/src/edu/columbia/cs/psl/vmvm/agent/Premain.java
new file mode 100644
index 0000000..29ed8e0
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/agent/Premain.java
@@ -0,0 +1,21 @@
+package edu.columbia.cs.psl.vmvm.agent;
+
+import java.lang.instrument.Instrumentation;
+
+public class Premain {
+	private static Instrumentation instrumentation;
+	 /**
+     * JVM hook to statically load the javaagent at startup.
+     *
+     * After the Java Virtual Machine (JVM) has initialized, the premain method
+     * will be called. Then the real application main method will be called.
+     *
+     * @param args
+     * @param inst
+     * @throws Exception
+     */
+    public static void premain(String args, Instrumentation inst) throws Exception {
+        instrumentation = inst;
+        instrumentation.addTransformer(new ClassLoaderBasedTransformer(),true);
+    }
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/agent/VMVMClassFileTransformer.java b/src/edu/columbia/cs/psl/vmvm/agent/VMVMClassFileTransformer.java
new file mode 100644
index 0000000..7ce871f
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/agent/VMVMClassFileTransformer.java
@@ -0,0 +1,182 @@
+package edu.columbia.cs.psl.vmvm.agent;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.ObjectInputStream;
+import java.lang.instrument.ClassFileTransformer;
+import java.lang.instrument.IllegalClassFormatException;
+import java.lang.reflect.Method;
+import java.nio.ByteBuffer;
+import java.security.CodeSource;
+import java.security.ProtectionDomain;
+import java.security.SecureClassLoader;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.tree.AnnotationNode;
+import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.FieldNode;
+
+import edu.columbia.cs.psl.vmvm.Constants;
+import edu.columbia.cs.psl.vmvm.Instrumenter;
+import edu.columbia.cs.psl.vmvm.VMVMInstrumented;
+import edu.columbia.cs.psl.vmvm.asm.InterceptingClassVisitor;
+import edu.columbia.cs.psl.vmvm.asm.JUnitResettingClassVisitor;
+import edu.columbia.cs.psl.vmvm.asm.struct.MethodListClassNode;
+
+@SuppressWarnings("unchecked")
+public class VMVMClassFileTransformer extends SecureClassLoader implements ClassFileTransformer, Opcodes{
+//	private static final Logger logger = Logger.getLogger(VMVMClassFileTransformer.class);
+	public static final boolean NO_RUNTIME_INST= true;
+	static{
+		try
+		{
+			ClassNode cn = new ClassNode();
+			ObjectInputStream ois = new ObjectInputStream(new FileInputStream("vmvm-runtimecheat"));
+			Instrumenter.instrumentedClasses = (HashMap<String, MethodListClassNode>) ois.readObject();
+			Instrumenter.remappedInterfaces = (HashSet<String>) ois.readObject();
+//			if(Instrumenter.instrumentedClasses.containsKey("os$py"))
+//			{
+////				Instrumenter.instrumentedClasses.remove("os$py");
+////				System.out.println(Instrumenter.instrumentedClasses.get("os$py"));
+//				System.exit(-1);
+//			}
+			ois.close();
+		}
+		catch(Exception ex)
+		{
+			ex.printStackTrace();
+		}
+	}
+	@Override
+	public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
+		return handleTransform(classfileBuffer);
+	}
+	private static byte[] handleTransform(byte[] classfileBuffer)
+	{
+//		if(NO_RUNTIME_INST)
+		return classfileBuffer;
+//
+//		if(classfileBuffer == null)
+//			return null;
+//
+//		ClassReader cr = new ClassReader(classfileBuffer);
+//		ClassNode cn = new ClassNode();
+//		cr.accept(cn, 0);
+//
+//		if(JUnitResettingClassVisitor.shouldIgnoreClass(cn.name) || (cn.access & Opcodes.ACC_ANNOTATION) != 0)
+//		{
+////			System.out.println("Ignoring " + cn.name);
+//			return classfileBuffer;
+//		}
+//
+//		if(cn.fields != null)
+//			for(Object o : cn.fields)
+//			{
+//				FieldNode an = (FieldNode) o;
+//				if(an.name.equals(Constants.VMVM_NEEDS_RESET))
+//				{
+//					return classfileBuffer;
+//				}
+//			}
+////		if(Instrumenter.instrumentedClasses.containsKey(cn.name))
+//			System.out.println("Runtime inst: " + cn.name);
+//
+//		Instrumenter.analyzeClass(new ClassReader(classfileBuffer), Instrumenter.instrumentedClasses);
+//		LinkedList<byte[]> out = Instrumenter.instrumentClass(new ByteArrayInputStream(classfileBuffer),false);
+//		try{
+//			File debugFolder =new File("debug");
+//			debugFolder.mkdir();
+//			FileOutputStream fos = new FileOutputStream("debug/"+cn.name.replace("/", ".")+".class");
+//			fos.write(out.getFirst());
+//			fos.close();
+//		}
+//		catch(Exception ex)
+//		{
+//			ex.printStackTrace();
+//		}
+//		if(out == null)
+//		{
+//			return null;
+//		}
+//		return out.getFirst(); //Don't support lazy interface duplication here
+	}
+	public VMVMClassFileTransformer()
+	{
+
+	}
+	public VMVMClassFileTransformer(ClassLoader parent)
+	{
+		super(parent);
+	}
+	private static HashMap<ClassLoader, VMVMClassFileTransformer> instances =  new HashMap<>();
+	public static Class<?> defineClass(ClassLoader l, byte[] b, int off, int len)
+	{
+		if(!instances.containsKey(l))
+			instances.put(l, new VMVMClassFileTransformer(l));
+		return instances.get(l).defineClass(b, off, len,true);
+	}
+	private Class<?> defineClass(byte[] b, int off, int len, boolean fake)
+	{
+		return super.defineClass(b, off, len);
+	}
+
+	public static Class<?> defineClass(ClassLoader l, String name, byte[] b, int off, int len)
+	{
+		if(!instances.containsKey(l))
+			instances.put(l, new VMVMClassFileTransformer(l));
+		return instances.get(l).defineClass( name, b, off, len,true);
+	}
+	private Class<?> defineClass(String name, byte[] b, int off, int len, boolean fake)
+	{
+		return super.defineClass(name, b, off, len);
+	}
+	public static Class<?> defineClass(ClassLoader l, String name, byte[] b, int off, int len, ProtectionDomain domain)
+	{
+		if(!instances.containsKey(l))
+			instances.put(l, new VMVMClassFileTransformer(l));
+
+		return instances.get(l).defineClass( name, b, off, len,domain, true);
+	}
+	private Class<?> defineClass(String name, byte[] b, int off, int len, ProtectionDomain domain, boolean fake)
+	{
+//		System.out.println("Got the fake load");
+		if(len != b.length)
+		{
+			byte[] c = new byte[len];
+			System.arraycopy(b, off, c, 0, len);
+			b = handleTransform(c);
+		}
+		else
+			b = handleTransform(b);
+		return super.defineClass(name, b, off, b.length, domain);
+
+	}
+	public static Class<?> defineClass(ClassLoader l,String name, ByteBuffer b, ProtectionDomain domain)
+	{
+		if(!instances.containsKey(l))
+			instances.put(l, new VMVMClassFileTransformer(l));
+		return instances.get(l).defineClass( name, b,domain, true);
+	}
+	private Class<?> defineClass(String name, ByteBuffer b, ProtectionDomain domain, boolean fake)
+	{
+		return super.defineClass(name, b, domain);
+	}
+
+	//(Ljava/lang/ClassLoader;Ljava/lang/String;[BIILjava/security/CodeSource;)Ljava/lang/Class;
+	public static Class<?> defineClass(ClassLoader l, String name, byte[] b, int off, int len, CodeSource codesource)
+	{
+		if(!instances.containsKey(l))
+			instances.put(l, new VMVMClassFileTransformer(l));
+		return instances.get(l).defineClass( name, b, off, len,codesource, true);
+	}
+	private Class<?> defineClass(String name, byte[] b, int off, int len, CodeSource codesource, boolean fake) {
+		return super.defineClass(name, b, off, len, codesource);
+	}
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/ChrootMethodVisitor.java b/src/edu/columbia/cs/psl/vmvm/asm/ChrootMethodVisitor.java
deleted file mode 100644
index 6992d28..0000000
--- a/src/edu/columbia/cs/psl/vmvm/asm/ChrootMethodVisitor.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package edu.columbia.cs.psl.vmvm.asm;
-
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.commons.AdviceAdapter;
-import org.objectweb.asm.commons.InstructionAdapter;
-
-public class ChrootMethodVisitor extends InstructionAdapter {
-
-	protected ChrootMethodVisitor(int api, MethodVisitor mv, int access, String name, String desc, String className) {
-//		super(api, mv, access, name, desc, className);
-		super(mv);
-
-	}
-
-}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/ClinitPrintingCV.java b/src/edu/columbia/cs/psl/vmvm/asm/ClinitPrintingCV.java
new file mode 100644
index 0000000..df8e060
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/asm/ClinitPrintingCV.java
@@ -0,0 +1,58 @@
+package edu.columbia.cs.psl.vmvm.asm;
+
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+import edu.columbia.cs.psl.vmvm.Constants;
+
+public class ClinitPrintingCV extends VMVMClassVisitor {
+
+	public ClinitPrintingCV(int api, ClassVisitor cv, boolean useVMState) {
+		super(api, cv, useVMState);
+	}
+
+	private String className;
+	@Override
+	public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
+		super.visit(version, access, name, signature, superName, interfaces);
+		this.className = name;
+	}
+	@Override
+	public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
+		MethodVisitor smv = super.visitMethod(access, name, desc, signature, exceptions);
+		if(name.equals("<clinit>"))
+		{
+			return new MethodVisitor(Opcodes.ASM4,smv) {
+				@Override
+				public void visitCode() {
+					super.visitFieldInsn(GETSTATIC, "java/lang/System", "err", "Ljava/io/PrintStream;");
+					super.visitLdcInsn("clinit  rerunning>" + className);
+					super.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
+					super.visitCode();
+				}
+				@Override
+				public void visitInsn(int opcode) {
+					if (opcode == Opcodes.RETURN) {
+						super.visitFieldInsn(GETSTATIC, "java/lang/System", "err", "Ljava/io/PrintStream;");
+						super.visitLdcInsn("clinit finished rerunning>" + className);
+						super.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
+					}
+					super.visitInsn(opcode);
+				}
+			};
+		}
+		else
+			return smv;
+	}
+	@Override
+	public boolean hasExtraInterface() {
+		return false;
+	}
+
+	@Override
+	public byte[] getExtraInterface() {
+		return null;
+	}
+
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/InterceptingClassVisitor.java b/src/edu/columbia/cs/psl/vmvm/asm/InterceptingClassVisitor.java
index 2b96ecd..b2bbf6c 100644
--- a/src/edu/columbia/cs/psl/vmvm/asm/InterceptingClassVisitor.java
+++ b/src/edu/columbia/cs/psl/vmvm/asm/InterceptingClassVisitor.java
@@ -1,119 +1,284 @@
 package edu.columbia.cs.psl.vmvm.asm;

+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
 import java.util.List;
-import java.util.Map.Entry;

 import org.objectweb.asm.AnnotationVisitor;
 import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
 import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Label;
 import org.objectweb.asm.MethodVisitor;
 import org.objectweb.asm.Opcodes;
 import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.GeneratorAdapter;
+import org.objectweb.asm.commons.JSRInlinerAdapter;
 import org.objectweb.asm.commons.LocalVariablesSorter;
-import org.objectweb.asm.tree.FieldNode;
+import org.objectweb.asm.tree.AnnotationNode;
+import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.FieldInsnNode;
+import org.objectweb.asm.tree.MethodNode;

 import edu.columbia.cs.psl.vmvm.Constants;
 import edu.columbia.cs.psl.vmvm.Instrumenter;
-public class InterceptingClassVisitor extends ClassVisitor implements Opcodes, Constants {
-
-	private String className;
+import edu.columbia.cs.psl.vmvm.VMState;
+import edu.columbia.cs.psl.vmvm.VMVMInstrumented;
+import edu.columbia.cs.psl.vmvm.VirtualRuntime;
+import edu.columbia.cs.psl.vmvm.asm.mvs.ChrootMethodVisitor;
+import edu.columbia.cs.psl.vmvm.asm.mvs.ClassDefineInterceptMethodVisitor;
+import edu.columbia.cs.psl.vmvm.asm.mvs.InvivoAdapter;
+import edu.columbia.cs.psl.vmvm.asm.mvs.ReflectionHackMV;
+import edu.columbia.cs.psl.vmvm.asm.mvs.SandboxPropogatingMV;
+import edu.columbia.cs.psl.vmvm.asm.mvs.StaticFieldIsolatorMV;
+import edu.columbia.cs.psl.vmvm.asm.mvs.TypeRememberingLocalVariableSorter;
+import edu.columbia.cs.psl.vmvm.asm.struct.EqMethodNode;
+import edu.columbia.cs.psl.vmvm.chroot.ChrootUtils;
+
+public class InterceptingClassVisitor extends VMVMClassVisitor {
+
+	//	private static Logger logger = Logger.getLogger(InterceptingClassVisitor.class);

 	private boolean isAClass = true;
-
+
 	private boolean runIMV = true;
-
+
 	private boolean willRewrite = false;
-
-
-	public InterceptingClassVisitor(ClassVisitor cv) {
-		super(Opcodes.ASM4, cv);
+	private ClassNode thisClassInfo;
+	private boolean generateVMVMInterface = false;
+
+	public InterceptingClassVisitor(ClassVisitor cv, ClassNode thisClassInfo, boolean generateVMVMInterface) {
+		super(Opcodes.ASM4, cv,true);
+		this.thisClassInfo = thisClassInfo;
+		this.generateVMVMInterface = generateVMVMInterface;
+		if (generateVMVMInterface && (thisClassInfo.access & Opcodes.ACC_INTERFACE) != 0) {
+			intfcCw = new ClassWriter(0);
+			intfcCV = new InterceptingClassVisitor(intfcCw, null, false);
+		}
 	}
-
-
+
+	private ClassWriter intfcCw;
+	private InterceptingClassVisitor intfcCV;
+	private boolean skipClass = false;
+
 	@Override
 	public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
+		if (generateVMVMInterface) {
+			for (int i = 0; i < interfaces.length; i++) {
+				interfaces[i] = Instrumenter.remapInterface(interfaces[i]);
+			}
+		}
 		super.visit(version, access, name, signature, superName, interfaces);
+
+		//		if(signature != null && signature.startsWith("Ljava/lang/Enum"))
+		//		{
+		//			addAllClassMethodsToCoverList("java/lang/Enum");
+		//		}
+		//		if(!Instrumenter.instrumentedClasses.containsKey(superName))
+		//		{
+		//			addAllClassMethodsToCoverList(superName);
+		//		}
+		//		for(String s : interfaces)
+		//		{
+		//			if(!Instrumenter.instrumentedClasses.containsKey(s))
+		//				addAllClassMethodsToCoverList(s);
+		//		}
 		this.className = name;
-		if((access & Opcodes.ACC_INTERFACE) != 0)
+		skipClass = shouldIgnoreClass(name);
+		if ((access & Opcodes.ACC_INTERFACE) != 0)
 			isAClass = false;
+
+		if (!skipClass && !isAClass && generateVMVMInterface) {
+			super.visitInnerClass(Instrumenter.getInstrumentedInterfaceName(name), name, "vmvm", ACC_PUBLIC + ACC_STATIC + ACC_ABSTRACT + ACC_INTERFACE);
+			intfcCV.visit(version, ACC_PUBLIC + ACC_STATIC + ACC_ABSTRACT + ACC_INTERFACE, Instrumenter.getInstrumentedInterfaceName(name), signature, "java/lang/Object", new String[] { name });
+			intfcCV.visitInnerClass(Instrumenter.getInstrumentedInterfaceName(name), name, "vmvm", ACC_PUBLIC + ACC_STATIC + ACC_ABSTRACT + ACC_INTERFACE);
+			intfcCV.visitOuterClass(name, null, null);
+		}
+
+		if (!skipClass)
+			this.visitAnnotation(Type.getDescriptor(VMVMInstrumented.class), false);
+	}
+
+	public static boolean shouldIgnoreClass(String name) {
+		return name.startsWith("$Proxy") || name.startsWith("java/") || name.startsWith("net/sf/cglib") //|| name.startsWith("com/sun") || name.contains("$$EnhancerByCGLIB$$") //
+				|| name.startsWith("edu/columbia/cs/psl/vmvm") || name.startsWith("org/objenesis") || name.startsWith("sun/") || name.startsWith("com/rits/cloning")
+				|| name.startsWith("org/objectweb/asm") || name.startsWith("org/jruby/ext/posix") || name.startsWith("org/w3c/dom") || name.contains("org/xml/sax")
+				|| name.equals("sun/org/mozilla/javascript/internal/Arguments");
 	}
-
+
 	@Override
 	public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
-		if(desc.length() > 1)
-			super.visitField(Opcodes.ACC_PUBLIC, name+BEEN_CLONED_FIELD, Type.BOOLEAN_TYPE.getDescriptor(), null, false);
-
-		if((access & Opcodes.ACC_STATIC) != 0) //Static field
+		//		if(desc.length() > 1)
+		//			super.visitField(Opcodes.ACC_PUBLIC, name+BEEN_CLONED_FIELD, Type.BOOLEAN_TYPE.getDescriptor(), null, false);
+
+		if ((access & Opcodes.ACC_STATIC) != 0) //Static field
 		{
-			for(int i = 1; i <= Instrumenter.MAX_SANDBOXES; i++)
-				super.visitField(access, name+SANDBOX_SUFFIX+i, desc,signature, value);
+			for (int i = 1; i <= Instrumenter.MAX_SANDBOXES; i++)
+				super.visitField(access, name + SANDBOX_SUFFIX + i, desc, signature, value);

 		}
 		return super.visitField(access, name, desc, signature, value);
 	}
-
+
 	@Override
 	public AnnotationVisitor visitAnnotation(String desc, boolean visible) {

 		return super.visitAnnotation(desc, visible);
 	}
-
+
+
+	private boolean needToGenerateCLInit;
+
 	@Override
-	public MethodVisitor visitMethod(int acc, String name, String desc,
-			String signature, String[] exceptions) {
-		if(name.equals("<init>") || (((acc & Opcodes.ACC_STATIC) != 0) && !name.equals("<clinit>") && !(name.equals("main")  && desc.equals("([Ljava/lang/String;)V"))))
-		{
+	public MethodVisitor visitMethod(int acc, String name, String desc, String signature, String[] exceptions) {
+		MethodNode newM = null;
+		boolean ignore = (name.startsWith("_") && desc.contains(Type.getDescriptor(VMState.class))) || (acc & Opcodes.ACC_NATIVE) == Opcodes.ACC_NATIVE;
+
+		if (name.equals("<clinit>")) {
+			acc = Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC;
+			name = "_clinit$$vmvmoriginal";
+			desc = "("+Type.getDescriptor(VMState.class)+")V";
+			ignore = false;
+			needToGenerateCLInit = true;
+		}
+		else if (!name.equals("<clinit>") && !skipClass && !ignore) {
+			EqMethodNode original = new EqMethodNode(acc, name, desc,this.className, signature, exceptions);
 			//Need to call the modified method - which takes a short arg; the current sandbox state
 			Type[] args = Type.getArgumentTypes(desc);
 			Type[] descTypes = new Type[args.length + 1];
-			System.arraycopy(args, 0,descTypes, 0, args.length);
-			descTypes[args.length] = Type.INT_TYPE;
-			desc = Type.getMethodDescriptor(Type.getReturnType(desc), descTypes);
+			System.arraycopy(args, 0, descTypes, 0, args.length);
+			descTypes[args.length] = Type.getType(VMState.class);
+			String desc2 = Type.getMethodDescriptor(Type.getReturnType(desc), descTypes);
+			newM = new MethodNode(acc, name, desc2, signature, exceptions);
+			newM.invisibleAnnotations = new LinkedList<>();
+			newM.visibleAnnotations = new LinkedList<>();
+			String name2 = name;
+			if (!"<init>".equals(name) && !"<clinit>".equals(name))
+				name2 = "_" + name;
+			if (Instrumenter.getMethodNode(thisClassInfo, name2, desc2) == null) {
+				renamedMethodsToCover.put(original, newM);
+				if (!isAClass && generateVMVMInterface && !name.equals("_clinit$$vmvmoriginal")) {
+					MethodVisitor m = intfcCV.visitMethod(acc, name2, desc2, signature, exceptions);
+					Instrumenter.getClassNode(Instrumenter.getInstrumentedInterfaceName(this.className)).methodsHashSet.add(new EqMethodNode(acc, name2, desc2, this.className, signature, exceptions));
+					EqMethodNode orig = Instrumenter.getMethodNode(this.className, name, desc);
+					if (orig.invisibleAnnotations != null) {
+						for (Object o : orig.invisibleAnnotations) {
+							AnnotationNode an = (AnnotationNode) o;
+							AnnotationVisitor av = m.visitAnnotation(an.desc, false);
+							an.accept(av);
+						}
+					}
+					if (orig.visibleAnnotations != null) {
+						for (Object o : orig.visibleAnnotations) {
+							AnnotationNode an = (AnnotationNode) o;
+							AnnotationVisitor av = m.visitAnnotation(an.desc, true);
+							an.accept(av);
+						}
+					}
+				} else {
+					desc = desc2;
+					name = name2;
+				}
+				thisClassInfo.methods.add(new MethodNode(acc, name2, desc2, signature, exceptions));
+			} else {
+				ignore = true;
+			}
 		}
-
-		if(isAClass)//runIMV &&
+
+		if ((isAClass || name.equals("_clinit$$vmvmoriginal")) && !skipClass && !ignore)//runIMV &&
 		{
-			MethodVisitor mv = cv.visitMethod(acc, name, desc, signature,
-					exceptions);
-			LocalVariablesSorter lvs = new LocalVariablesSorter(acc, desc, mv);
-			InvivoAdapter invivoAdapter = new InvivoAdapter(Opcodes.ASM4, lvs, acc, name, desc, className,lvs);
-			SandboxPropogatingMV sandboxer = new SandboxPropogatingMV(Opcodes.ASM4, invivoAdapter, acc, name, desc, className,invivoAdapter);
-			StaticFieldIsolatorMV staticIsolator  = new StaticFieldIsolatorMV(Opcodes.ASM4, sandboxer, acc, name, desc, invivoAdapter);
-//			LazyCloneInterceptingMethodVisitor cloningIMV = new LazyCloneInterceptingMethodVisitor(Opcodes.ASM4, mv, acc, name, desc);
-//			InterceptingMethodVisitor imv = new InterceptingMethodVisitor(Opcodes.ASM4, cloningIMV, acc, name, desc);
-//			imv.setClassName(className);
-//			imv.setClassVisitor(this);
-
-			return staticIsolator;
-		}
-		else
-			return 	cv.visitMethod(acc, name, desc, signature,
-					exceptions);
+			//			System.out.println(name+desc);
+
+			boolean generateReverseStub = false;
+			if ((Opcodes.ACC_ABSTRACT & acc) != 0) {
+				acc = acc & ~Opcodes.ACC_ABSTRACT;
+				generateReverseStub = true;
+			}
+
+			MethodVisitor fmv = cv.visitMethod(acc, name, desc, signature, exceptions);
+			JSRInlinerAdapter mv = new JSRInlinerAdapter(fmv, acc, name, desc, signature, exceptions);
+			ClassDefineInterceptMethodVisitor dynMV = new ClassDefineInterceptMethodVisitor(mv, className, name, desc);
+			InvivoAdapter invivoAdapter = new InvivoAdapter(Opcodes.ASM4, dynMV, acc, name, desc, className, generateReverseStub);
+			SandboxPropogatingMV sandboxer = new SandboxPropogatingMV(Opcodes.ASM4, invivoAdapter, acc, name, desc, className, invivoAdapter, this, newM);
+			StaticFieldIsolatorMV staticIsolator = new StaticFieldIsolatorMV(sandboxer, acc, name, desc, this,Instrumenter.getMethodNode(this.className, name, desc));
+			ChrootMethodVisitor chrooter = new ChrootMethodVisitor(Opcodes.ASM4, staticIsolator, acc, name, desc, className, invivoAdapter, this);
+			ReflectionHackMV reflectionHack = new ReflectionHackMV(Opcodes.ASM4, chrooter,this);
+			//			LazyCloneInterceptingMethodVisitor cloningIMV = new LazyCloneInterceptingMethodVisitor(Opcodes.ASM4, mv, acc, name, desc);
+			//			InterceptingMethodVisitor imv = new InterceptingMethodVisitor(Opcodes.ASM4, cloningIMV, acc, name, desc);
+			//			imv.setClassName(className);
+			//			imv.setClassVisitor(this);
+			TypeRememberingLocalVariableSorter lvs2 = new TypeRememberingLocalVariableSorter(acc, desc, reflectionHack);
+			invivoAdapter.setLocalVariableSorter(lvs2);
+			dynMV.setLocalVariableSorter(lvs2);
+			//			return staticIsolator;
+
+			return lvs2;
+		} else
+			return cv.visitMethod(acc, name, desc, signature, exceptions);
 	}

-
 	//Default to true to make it work for all classes
-	public void setShouldRewrite()
-	{
+	public void setShouldRewrite() {
 		willRewrite = true;
 	}
-
+
 	@Override
 	public void visitEnd() {
 		super.visitEnd();
+		if (isAClass)
+			generateCoverMethods();
+		try {
+			generateChrootMethods();
+		} catch (Exception ex) {
+			System.err.println("Unable to generate sandbox method in " + this.className);
+			ex.printStackTrace();
+		}
+		generateStaticCloneMethods();

-		if(isAClass)
-		{
-			FieldNode fn2 = new FieldNode(Opcodes.ASM4, Opcodes.ACC_PRIVATE + Opcodes.ACC_FINAL,
-					CHILD_FIELD,
-					Type.INT_TYPE.getDescriptor(), null, null);
-			fn2.accept(cv);
+		if (needToGenerateCLInit) {
+			MethodVisitor mv = super.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "<clinit>", "()V", null, null);
+			GeneratorAdapter gmv = new GeneratorAdapter(mv, Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "<clinit>", "()V");
+			InvivoAdapter ia = new InvivoAdapter(Opcodes.ASM4, gmv, Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "<clinit>", "()V", this.className, false);
+//			SandboxPropogatingMV smv = new SandboxPropogatingMV(Opcodes.ASM4, ia, Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "<clinit>", "()V", className, ia, this, new MethodNode());
+
+			TypeRememberingLocalVariableSorter lvs2 = new TypeRememberingLocalVariableSorter(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "()V", ia);
+			ia.setLocalVariableSorter(lvs2);
+
+			ia.visitCode();
+
+			for (int i = 0; i <= Instrumenter.MAX_SANDBOXES; i++) {
+//				VirtualRuntime.setVMed(i);
+				ia.println(className + " clinit " + i);
+				gmv.visitIntInsn(Opcodes.SIPUSH, i);
+				gmv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(VirtualRuntime.class), "setVMed", "(I)"+Type.getDescriptor(VMState.class));
+				ia.visitMethodInsn(INVOKESTATIC, className, "_clinit$$vmvmoriginal", "("+Type.getDescriptor(VMState.class)+")V");
+			}
+			ia.visitInsn(Opcodes.RETURN);
+			ia.visitMaxs(0, 0);
+			ia.visitEnd();
 		}
 	}

-
 	public String getClassName() {
 		return this.className;
 	}

+	private byte[] extraInterfaceBytes = null;
+
+	public boolean hasExtraInterface() {
+		if (intfcCw != null)
+			extraInterfaceBytes = intfcCw.toByteArray();
+		return extraInterfaceBytes != null && extraInterfaceBytes.length > 0;
+	}
+
+	public byte[] getExtraInterface() {
+		if (extraInterfaceBytes == null)
+			if (intfcCw != null)
+				extraInterfaceBytes = intfcCw.toByteArray();
+			else
+				return null;
+		return extraInterfaceBytes;
+	}
+
 }
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/InterceptingMethodVisitor.java b/src/edu/columbia/cs/psl/vmvm/asm/InterceptingMethodVisitor.java
deleted file mode 100644
index a4d5aa9..0000000
--- a/src/edu/columbia/cs/psl/vmvm/asm/InterceptingMethodVisitor.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package edu.columbia.cs.psl.vmvm.asm;
-
-import java.util.List;
-import java.util.Map.Entry;
-
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.commons.AdviceAdapter;
-import org.objectweb.asm.commons.Method;
-
-import edu.columbia.cs.psl.vmvm.Constants;
-
-
-public class InterceptingMethodVisitor extends AdviceAdapter implements Constants {
-	private String name;
-
-
-	private Type[] argumentTypes;
-
-	private int access;
-
-	protected InterceptingMethodVisitor(int api, MethodVisitor mv, int access,
-			String name, String desc) {
-		super(api, mv, access, name, desc);
-		this.name = name;
-		this.access = access;
-		this.argumentTypes = Type.getArgumentTypes(desc);
-	}
-
-	boolean rewrite = false;
-
-	@Override
-	public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
-//		if (desc.equals(InvivoPreMain.config.getAnnotationDescriptor())) {
-			classVisitor.setShouldRewrite();
-			rewrite = true;
-//		}
-		return super.visitAnnotation(desc, visible);
-	}
-
-	@Override
-	public void visitFieldInsn(int opcode, String owner, String name,
-			String desc) {
-		if (!rewrite) {
-			super.visitFieldInsn(opcode, owner, name, desc);
-			return;
-		}
-		if (opcode == GETSTATIC
-				&& !(owner.startsWith("java") || owner.startsWith("sun"))) {
-			visitLdcInsn(owner);
-			visitLdcInsn(name);
-			super.visitFieldInsn(opcode, owner, name, desc);
-			visitLdcInsn(false);
-			visitMethodInsn(INVOKESTATIC,
-					"edu/columbia/cs/psl/invivo/runtime/StaticWrapper",
-					"getValue",
-					"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;Z)Ljava/lang/Object;");
-			if (Type.getType(desc).getSort() != Type.OBJECT)
-				unbox(Type.getType(desc));
-			else
-				checkCast(Type.getType(desc));
-		} else if (opcode == PUTSTATIC) {
-			// here should be the value we want to set to
-			if (Type.getType(desc).getSort() != Type.OBJECT)
-				box(Type.getType(desc));
-			visitLdcInsn(owner);
-			visitLdcInsn(name);
-			visitLdcInsn(desc);
-			visitMethodInsn(INVOKESTATIC,
-					"edu/columbia/cs/psl/invivo/runtime/StaticWrapper",
-					"setValue",
-					"(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
-		}
-		// else do the standard dynamic lookup
-		else
-			super.visitFieldInsn(opcode, owner, name, desc);
-	}
-
-	int refIdForInterceptor;
-
-
-	@Override
-	public void visitMaxs(int maxStack, int maxLocals) {
-		super.visitMaxs(maxStack, maxLocals);
-	}
-
-
-	private String className;
-
-	public void setClassName(String className) {
-		this.className = className;
-	}
-
-	private InterceptingClassVisitor classVisitor;
-
-	public void setClassVisitor(
-			InterceptingClassVisitor interceptingClassVisitor) {
-		classVisitor = interceptingClassVisitor;
-	}
-
-
-}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/IntializedTypeAnalyzer.java b/src/edu/columbia/cs/psl/vmvm/asm/IntializedTypeAnalyzer.java
new file mode 100644
index 0000000..810cbce
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/asm/IntializedTypeAnalyzer.java
@@ -0,0 +1,156 @@
+package edu.columbia.cs.psl.vmvm.asm;
+
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.Set;
+
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.FieldInsnNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.TypeInsnNode;
+import org.objectweb.asm.tree.analysis.Analyzer;
+import org.objectweb.asm.tree.analysis.AnalyzerException;
+import org.objectweb.asm.tree.analysis.BasicInterpreter;
+import org.objectweb.asm.tree.analysis.Frame;
+import org.objectweb.asm.tree.analysis.Interpreter;
+
+public class IntializedTypeAnalyzer extends Analyzer {
+
+	public HashSet<String> getTypesDefinitelyInitedStartingWith(Frame f) {
+		return getTypesDefinitelyInitedStartingWith((Node) f);
+	}
+
+
+	private HashSet<String> getTypesDefinitelyInitedStartingWith(Node start) {
+		if(start == null)
+			throw new IllegalArgumentException("Starting frame must not be null");
+		HashSet<Node> visited = new HashSet<>();
+		LinkedList<Node> toVisit = new LinkedList<>();
+		toVisit.add(start);
+		Node n = null;
+		while(!toVisit.isEmpty())
+		{
+			n = toVisit.pop();
+			if(visited.contains(n))
+				continue;
+			visited.add(n);
+//			toVisit.addAll(n.successors);
+			switch(n.predecessors.size())
+			{
+			case 0:
+				break;
+			case 1:
+				n.typesInstantiatedUpstream.addAll(n.predecessors.iterator().next().typesInstantiatedUpstream);
+				break;
+			default:
+				HashSet<String>[] eachBranch = new HashSet[n.predecessors.size()];
+				int i = 0;
+				for (Node predecessor : n.predecessors) {
+						eachBranch[i] = predecessor.typesInstantiatedUpstream;
+					i++;
+				}
+				HashSet<String> tmp = eachBranch[0];
+				for (i = 1; i < eachBranch.length; i++) {
+					tmp.retainAll(eachBranch[i]);
+				}
+				n.typesInstantiatedUpstream.addAll(tmp);
+
+				break;
+			}
+			if(n.typeInstantiated != null && n.typesInstantiatedUpstream.contains(n.typeInstantiated))
+				n.isUnnecessary = true;
+			if(n.typeInstantiated != null)
+			n.typesInstantiatedUpstream.add(n.typeInstantiated);
+			toVisit.addAll(n.successors);
+		}
+		return n.typesInstantiatedUpstream;
+	}
+
+
+
+	public IntializedTypeAnalyzer() {
+		super(new TypeAnalyzerInterpreter());
+	}
+
+	@Override
+	protected Frame newFrame(int nLocals, int nStack) {
+		return new Node(nLocals, nStack);
+	}
+
+	@Override
+	protected Frame newFrame(Frame src) {
+		return new Node(src);
+	}
+
+	@Override
+	protected void newControlFlowEdge(int insn, int successor) {
+		Node from = (Node) getFrames()[insn];
+		Node to = ((Node) getFrames()[successor]);
+		from.successors.add(to);
+		to.predecessors.add(from);
+	}
+
+	public static class Node extends Frame {
+		Set<Node> successors;
+		Set<Node> predecessors;
+		String typeInstantiated;
+		HashSet<String> typesInstantiatedUpstream = new HashSet<>();
+		public boolean isUnnecessary;
+		public Node(int nLocals, int nStack) {
+			super(nLocals, nStack);
+			successors = new HashSet<>();
+			predecessors = new HashSet<>();
+			typeInstantiated = null;
+
+		}
+
+		public Node(Frame src) {
+			super(src);
+			Node n = (Node) src;
+
+			this.typeInstantiated = n.typeInstantiated;
+
+		}
+
+		public Frame init(Frame src) {
+			super.init(src);
+			successors = new HashSet<>();
+			predecessors = new HashSet<>();
+			typeInstantiated = null;
+			return this;
+		};
+
+		@Override
+		public void execute(AbstractInsnNode insn, Interpreter interpreter) throws AnalyzerException {
+			switch (insn.getType()) {
+			case AbstractInsnNode.FIELD_INSN:
+				FieldInsnNode fin = (FieldInsnNode) insn;
+				if (fin.getOpcode() == Opcodes.GETSTATIC || fin.getOpcode() == Opcodes.PUTSTATIC)
+					typeInstantiated = fin.owner;
+				break;
+			case AbstractInsnNode.TYPE_INSN:
+				TypeInsnNode tin = (TypeInsnNode) insn;
+				if (tin.getOpcode() == Opcodes.NEW) {
+					typeInstantiated = tin.desc;
+				}
+				break;
+			case AbstractInsnNode.METHOD_INSN:
+				MethodInsnNode min = (MethodInsnNode) insn;
+				if (min.getOpcode() == Opcodes.INVOKESTATIC)
+					typeInstantiated = min.owner;
+				break;
+			}
+			super.execute(insn, interpreter);
+		}
+
+		@Override
+		public String toString() {
+			return "Frame [typesInstantiated=" + typeInstantiated + ", typesInstantiatedUpstream="+typesInstantiatedUpstream+", successors=" + successors.size() + "]";
+		}
+	}
+
+	static class TypeAnalyzerInterpreter extends BasicInterpreter{
+
+	}
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/InvivoAdapter.java b/src/edu/columbia/cs/psl/vmvm/asm/InvivoAdapter.java
deleted file mode 100644
index 30caee6..0000000
--- a/src/edu/columbia/cs/psl/vmvm/asm/InvivoAdapter.java
+++ /dev/null
@@ -1,186 +0,0 @@
-package edu.columbia.cs.psl.vmvm.asm;
-
-import java.util.HashSet;
-
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.commons.AdviceAdapter;
-import org.objectweb.asm.commons.LocalVariablesSorter;
-import org.objectweb.asm.commons.Method;
-
-import edu.columbia.cs.psl.vmvm.CloningUtils;
-import edu.columbia.cs.psl.vmvm.Constants;
-
-public class InvivoAdapter extends AdviceAdapter {
-	protected int access;
-	protected String name;
-	protected String desc;
-	protected String className;
-	private LocalVariablesSorter lvs;
-
-	protected InvivoAdapter(int api, MethodVisitor mv, int access, String name, String desc, String className, LocalVariablesSorter lvs) {
-		super(api, mv, access, name, desc);
-		this.access = access;
-		this.name = name;
-		this.desc = desc;
-		this.className = className;
-		this.lvs = lvs;
-	}
-	public boolean isMain() {
-		return name.equals("main") && desc.equals("([Ljava/lang/String;)V");
-	}
-	public boolean needToGenerateSandboxVar()
-	{
-		return isStaticMethod() && (isMain() || name.equals("<clinit>"));
-	}
-	public boolean isStaticMethod() {
-		return (access & Opcodes.ACC_STATIC) != 0;
-	}
-
-	public int getFirstLocal() {
-		return firstLocal;
-	}
-
-	@Override
-	public int newLocal(Type type) {
-		return lvs.newLocal(type);
-	}
-	public void branchIfSandboxed(Label lblForSandboxed) {
-		getSandboxFlag();
-		visitJumpInsn(IFGT, lblForSandboxed);
-	}
-
-	public void getSandboxFlag() {
-		if (!isStaticMethod()) {
-			loadThis();
-			visitFieldInsn(GETFIELD, className, Constants.CHILD_FIELD, Type.INT_TYPE.getDescriptor());
-		} else
-			visitVarInsn(ILOAD, getFirstLocal() - (isMain() || isClinit() ? 0 : 1));
-	}
-	private boolean isClinit() {
-		return name.equals("<clinit>");
-	}
-	public void setSandboxFlag() {
-		if (!isStaticMethod())
-		{
-			loadThis();
-			swap();
-			visitFieldInsn(PUTFIELD, className, Constants.CHILD_FIELD, Type.INT_TYPE.getDescriptor());
-		}
-		else
-			visitVarInsn(ISTORE, getFirstLocal() - (isMain() || isClinit() ? 0 : 1));
-	}
-	private static final HashSet<String> immutableClasses = new HashSet<String>();
-	static {
-		immutableClasses.add("Ljava/lang/Integer;");
-		immutableClasses.add("Ljava/lang/Long;");
-		immutableClasses.add("Ljava/lang/Short;");
-		immutableClasses.add("Ljava/lang/Float;");
-		immutableClasses.add("Ljava/lang/String;");
-		immutableClasses.add("Ljava/lang/Char;");
-		immutableClasses.add("Ljava/lang/Byte;");
-		immutableClasses.add("Ljava/lang/Integer;");
-		immutableClasses.add("Ljava/lang/Long;");
-		immutableClasses.add("Ljava/lang/Short;");
-		immutableClasses.add("Ljava/lang/Float;");
-		immutableClasses.add("Ljava/lang/String;");
-		immutableClasses.add("Ljava/lang/Char;");
-		immutableClasses.add("Ljava/lang/Byte;");
-		immutableClasses.add("Ljava/sql/ResultSet;");
-		immutableClasses.add("Ljava/lang/Class;");
-		immutableClasses.add("Z");
-		immutableClasses.add("B");
-		immutableClasses.add("C");
-		immutableClasses.add("S");
-		immutableClasses.add("I");
-		immutableClasses.add("J");
-		immutableClasses.add("F");
-		immutableClasses.add("L");
-
-	}
-	protected void cloneValAtTopOfStack(String typeOfField) {
-		_generateClone(typeOfField, "", false);
-	}
-
-	protected void cloneValAtTopOfStack(String typeOfField, String debug, boolean secondElHasArrayLen) {
-		_generateClone(typeOfField, debug, secondElHasArrayLen);
-	}
-
-
-	public void println(String toPrint) {
-		visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
-		visitLdcInsn(toPrint + " : ");
-		super.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "print", "(Ljava/lang/String;)V");
-
-		visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
-		super.visitMethodInsn(INVOKESTATIC, "java/lang/Thread", "currentThread", "()Ljava/lang/Thread;");
-		super.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Thread", "getName", "()Ljava/lang/String;");
-		super.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
-	}
-	private void _generateClone(String typeOfField, String debug, boolean secondElHasArrayLen) {
-		Type fieldType = Type.getType(typeOfField);
-
-		if (
-		// fieldType.getSort() == Type.ARRAY &&
-		// fieldType.getElementType().getSort()
-		// ||
-		fieldType.getSort() == Type.VOID || (fieldType.getSort() != Type.ARRAY && (fieldType.getSort() != Type.OBJECT || immutableClasses.contains(typeOfField)))) {
-//			 println("reference> " + debug);
-			return;
-		}
-		if (fieldType.getSort() == Type.ARRAY) {
-			if (fieldType.getElementType().getSort() != Type.OBJECT || immutableClasses.contains(fieldType.getElementType().getDescriptor())) {
-//				 println("array> " + debug);
-
-				// Just need to duplicate the array
-				dup();
-				Label nullContinue = new Label();
-				ifNull(nullContinue);
-				if (secondElHasArrayLen) {
-					swap();
-				} else {
-					dup();
-					visitInsn(ARRAYLENGTH);
-				}
-				dup();
-				newArray(Type.getType(fieldType.getDescriptor().substring(1)));
-				dupX2();
-				swap();
-				push(0);
-				dupX2();
-				swap();
-				super.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/System", "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V");
-				Label noNeedToPop = new Label();
-				if (secondElHasArrayLen) {
-					visitJumpInsn(GOTO, noNeedToPop);
-					visitLabel(nullContinue);
-					swap();
-					pop();
-				} else {
-					visitLabel(nullContinue);
-				}
-
-				visitLabel(noNeedToPop);
-
-			} else {
-				// println("heavy> " + debug);
-				// Just use the reflective cloner
-				visitLdcInsn(debug);
-				getSandboxFlag();
-				invokeStatic(Type.getType(CloningUtils.class), Method.getMethod("Object clone(Object, String, int)"));
-				checkCast(fieldType);
-			}
-		} else if (fieldType.getClassName().contains("InputStream") || fieldType.getClassName().contains("OutputStream") || fieldType.getClassName().contains("Socket")) {
-			// Do nothing
-		} else {
-			// println("heavy> " + debug);
-			visitLdcInsn(debug);
-			getSandboxFlag();
-			invokeStatic(Type.getType(CloningUtils.class), Method.getMethod("Object clone(Object, String, int)"));
-			checkCast(fieldType);
-
-		}
-	}
-}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/JUnitResettingClassVisitor.java b/src/edu/columbia/cs/psl/vmvm/asm/JUnitResettingClassVisitor.java
new file mode 100644
index 0000000..8bcae8c
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/asm/JUnitResettingClassVisitor.java
@@ -0,0 +1,253 @@
+package edu.columbia.cs.psl.vmvm.asm;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.GeneratorAdapter;
+import org.objectweb.asm.commons.JSRInlinerAdapter;
+import org.objectweb.asm.commons.LocalVariablesSorter;
+import org.objectweb.asm.tree.AnnotationNode;
+import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.FieldInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+
+import edu.columbia.cs.psl.vmvm.Constants;
+import edu.columbia.cs.psl.vmvm.Instrumenter;
+import edu.columbia.cs.psl.vmvm.VMState;
+import edu.columbia.cs.psl.vmvm.VMVMInstrumented;
+import edu.columbia.cs.psl.vmvm.VirtualRuntime;
+import edu.columbia.cs.psl.vmvm.asm.mvs.ChrootMethodVisitor;
+import edu.columbia.cs.psl.vmvm.asm.mvs.ClassDefineInterceptMethodVisitor;
+import edu.columbia.cs.psl.vmvm.asm.mvs.InsnCountingMV;
+import edu.columbia.cs.psl.vmvm.asm.mvs.InvivoAdapter;
+import edu.columbia.cs.psl.vmvm.asm.mvs.JUnitRunnerMV;
+import edu.columbia.cs.psl.vmvm.asm.mvs.ReflectionHackMV;
+import edu.columbia.cs.psl.vmvm.asm.mvs.SandboxPropogatingMV;
+import edu.columbia.cs.psl.vmvm.asm.mvs.StaticFieldIsolatorMV;
+import edu.columbia.cs.psl.vmvm.asm.mvs.StaticFinalMutibleizer;
+import edu.columbia.cs.psl.vmvm.asm.mvs.SystemPropertyLogger;
+import edu.columbia.cs.psl.vmvm.asm.mvs.TypeRememberingLocalVariableSorter;
+import edu.columbia.cs.psl.vmvm.asm.mvs.UnconditionalChrootMethodVisitor;
+import edu.columbia.cs.psl.vmvm.asm.struct.EqFieldInsnNode;
+import edu.columbia.cs.psl.vmvm.asm.struct.EqMethodInsnNode;
+import edu.columbia.cs.psl.vmvm.asm.struct.EqMethodNode;
+import edu.columbia.cs.psl.vmvm.chroot.ChrootUtils;
+import edu.columbia.cs.psl.vmvm.struct.MutableInstance;
+
+public class JUnitResettingClassVisitor extends VMVMClassVisitor {
+
+	//	private static Logger logger = Logger.getLogger(InterceptingClassVisitor.class);
+
+	private boolean isAClass = true;
+
+	private boolean runIMV = true;
+
+	private boolean willRewrite = false;
+	private ClassNode thisClassInfo;
+	private boolean generateVMVMInterface = false;
+
+	public JUnitResettingClassVisitor(ClassVisitor cv, ClassNode thisClassInfo, boolean generateVMVMInterface) {
+		super(Opcodes.ASM4, cv,false);
+		this.thisClassInfo = thisClassInfo;
+	}
+
+	private boolean skipClass = false;
+
+	@Override
+	public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
+		if (generateVMVMInterface) {
+			for (int i = 0; i < interfaces.length; i++) {
+				interfaces[i] = Instrumenter.remapInterface(interfaces[i]);
+			}
+		}
+		if((access & Opcodes.ACC_PUBLIC) == 0)
+		{
+			access = access & ~Opcodes.ACC_PROTECTED;
+			access = access & ~Opcodes.ACC_PRIVATE;
+			access = access | Opcodes.ACC_PUBLIC;
+		}
+		super.visit(version, access, name, signature, superName, interfaces);
+
+		this.className = name;
+		skipClass = shouldIgnoreClass(name);
+		if ((access & Opcodes.ACC_INTERFACE) != 0)
+			isAClass = false;
+		if((access & Opcodes.ACC_ANNOTATION) !=0)
+		{
+			isAClass = false;
+			skipClass = true;
+		}
+//		if (!skipClass)
+//			this.visitAnnotation(Type.getDescriptor(VMVMInstrumented.class), false);
+	}
+
+	public static boolean shouldIgnoreClass(String name) {
+		return name.startsWith("java/") || name.startsWith("net/sf/cglib") //|| name.startsWith("com/sun") || name.contains("$$EnhancerByCGLIB$$") //
+				|| name.startsWith("edu/columbia/cs/psl/vmvm") || name.startsWith("org/objenesis") || name.startsWith("sun/") || name.startsWith("com/rits/cloning")
+				|| name.startsWith("org/objectweb/asm")
+				|| name.startsWith("org/jruby/ext/posix") || name.startsWith("org/w3c/dom") || name.contains("org/xml/sax")
+//				|| name.startsWith("org/apache/tomcat/buildutil")
+				|| name.startsWith("org/mockito/cglib")
+				|| name.startsWith("org/mockito/asm")
+				|| name.startsWith("org/apache/ant")
+				|| name.startsWith("org/apache/tools/ant")
+				|| name.startsWith("net/sf/antcontrib")
+				|| name.startsWith("org/apache/tomcat/util/buf/B2CConverter")
+				|| name.startsWith("org/apache/ivy/plugins/lock/DeleteOnExitHook")
+				;
+	}
+
+	@Override
+	public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
+		if(skipClass)
+			return super.visitField(access, name, desc, signature, value);
+//		access = access & ~Opcodes.ACC_FINAL;
+		if ((access & Opcodes.ACC_STATIC) != 0 && isAClass) //Static field
+		{
+//			if((access & Opcodes.ACC_PUBLIC) != 0) //pub
+			if((access & Opcodes.ACC_ENUM) != 0)
+			{
+				access = Opcodes.ACC_PUBLIC + Opcodes.ACC_STATIC;
+			}
+//			else if((access & Opcodes.ACC_PROTECTED) != 0) //pub
+//				sAccess = Opcodes.ACC_PROTECTED + Opcodes.ACC_STATIC;
+//			else if((access & Opcodes.ACC_PRIVATE) != 0) //pub
+//				sAccess = Opcodes.ACC_PRIVATE + Opcodes.ACC_STATIC;
+			super.visitField(access, name + SANDBOX_SUFFIX, desc, signature, value);
+			super.visitField(access, name + BEEN_CLONED_FIELD, "Z", null, false);
+		}
+		else if((access & Opcodes.ACC_STATIC) != 0 && value ==null) //static field on an interface - is final!!!
+		{
+			Instrumenter.mutablizedFields.put(this.className+"."+name,desc);
+			desc = Type.getDescriptor(MutableInstance.class);
+			value = null;
+		}
+		return super.visitField(access, name, desc, signature, value);
+	}
+
+	@Override
+	public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
+
+		return super.visitAnnotation(desc, visible);
+	}
+
+	private HashSet<EqMethodInsnNode> sandboxMethodsToGen = new HashSet<>();
+
+	public void addSandboxMethodToGen(EqMethodInsnNode m) {
+		sandboxMethodsToGen.add(m);
+	}
+
+	private boolean hasClinit;
+	@Override
+	public MethodVisitor visitMethod(int acc, String name, String desc, String signature, String[] exceptions) {
+		boolean ignore = (acc & Opcodes.ACC_NATIVE) == Opcodes.ACC_NATIVE;
+
+		if (!skipClass && !ignore)//runIMV &&
+		{
+			if(isAClass && name.equals("<clinit>"))
+			{
+				acc = Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC;
+				name = Constants.VMVM_STATIC_RESET_METHOD;
+				hasClinit = true;
+			}
+			else if(!isAClass && name.equals("<clinit>"))
+			{
+				hasClinit = true;
+				return null;
+			}
+			MethodVisitor fmv = cv.visitMethod(acc, name, desc, signature, exceptions);
+			fmv = new JSRInlinerAdapter(fmv, acc, name, desc, signature, exceptions);
+
+			ClassDefineInterceptMethodVisitor dynMV = new ClassDefineInterceptMethodVisitor(fmv, className, name, desc);
+//			UnconditionalChrootMethodVisitor chrooter = new UnconditionalChrootMethodVisitor(Opcodes.ASM4, dynMV, acc, name, desc, className , this);
+			SystemPropertyLogger propLogger = new SystemPropertyLogger(Opcodes.ASM4,dynMV,acc,name,desc);
+			StaticFinalMutibleizer mutableizer = new StaticFinalMutibleizer(propLogger, acc, className, name, desc);
+			StaticFieldIsolatorMV staticMV = new StaticFieldIsolatorMV(mutableizer, acc, name, desc, this, Instrumenter.getMethodNode(this.className, name, desc));
+			ReflectionHackMV reflectionHack = new ReflectionHackMV(Opcodes.ASM4, staticMV,this);
+
+			JUnitRunnerMV jumv = new JUnitRunnerMV(reflectionHack, acc, name, desc, this.className);
+			//			LazyCloneInterceptingMethodVisitor cloningIMV = new LazyCloneInterceptingMethodVisitor(Opcodes.ASM4, mv, acc, name, desc);
+			//			InterceptingMethodVisitor imv = new InterceptingMethodVisitor(Opcodes.ASM4, cloningIMV, acc, name, desc);
+			//			imv.setClassName(className);
+			//			imv.setClassVisitor(this);
+			TypeRememberingLocalVariableSorter lvs2 = new TypeRememberingLocalVariableSorter(acc, desc, jumv);
+			staticMV.setLvs(lvs2);
+			dynMV.setLocalVariableSorter(lvs2);
+			InsnCountingMV counter = new InsnCountingMV(Opcodes.ASM4, lvs2);
+			staticMV.setCounter(counter);
+			return counter;
+		} else
+			return cv.visitMethod(acc, name, desc, signature, exceptions);
+	}
+
+	//Default to true to make it work for all classes
+	public void setShouldRewrite() {
+		willRewrite = true;
+	}
+
+	@Override
+	public void visitEnd() {
+		if(skipClass)
+			return;
+		if(isAClass)
+		{
+			visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, Constants.VMVM_NEEDS_RESET, "Z", null, true);
+			visitField(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, Constants.VMVM_RESET_IN_PROGRESS, "Ljava/lang/Thread;", null, null);
+
+		}
+		super.visitEnd();
+		generateClinit(hasClinit);
+		if (isAClass)
+			generateCoverMethods();
+		if(isAClass)
+			generateReInitCheckMethod();
+		try {
+			generateChrootMethods();
+		} catch (Exception ex) {
+			System.err.println("Unable to generate sandbox method in " + this.className);
+			ex.printStackTrace();
+		}
+		generateStaticCloneMethods();
+		if(isAClass)
+		{
+//			generateStaticFieldCloneMethods(hasClinit);
+//			generateFinalHackMethod();
+		}
+
+	}
+
+	private void generateReInitCheckMethod() {
+		MethodVisitor mv = super.visitMethod(Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, Constants.VMVM_STATIC_RESET_METHOD_WITH_CHECK, "()V", null, null);
+		StaticFieldIsolatorMV smv = new StaticFieldIsolatorMV(mv, Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, Constants.VMVM_STATIC_RESET_METHOD_WITH_CHECK, "()V", this, new EqMethodNode(Opcodes.ASM4, Constants.VMVM_STATIC_RESET_METHOD_WITH_CHECK, "()V", this.className, null, null));
+		smv.visitCode();
+		smv.checkAndReinit(this.className);
+		smv.visitInsn(RETURN);
+		smv.visitMaxs(0, 0);
+		smv.visitEnd();
+
+	}
+
+	public String getClassName() {
+		return this.className;
+	}
+
+
+	public boolean hasExtraInterface() {
+		return false;
+	}
+
+	public byte[] getExtraInterface() {
+		return null;
+	}
+
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/LazyCloneInterceptingMethodVisitor.java b/src/edu/columbia/cs/psl/vmvm/asm/LazyCloneInterceptingMethodVisitor.java
deleted file mode 100644
index 4c98dc3..0000000
--- a/src/edu/columbia/cs/psl/vmvm/asm/LazyCloneInterceptingMethodVisitor.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package edu.columbia.cs.psl.vmvm.asm;
-
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.commons.AdviceAdapter;
-
-import edu.columbia.cs.psl.vmvm.Constants;
-
-
-public class LazyCloneInterceptingMethodVisitor extends AdviceAdapter implements Constants {
-
-
-	protected LazyCloneInterceptingMethodVisitor(int api, MethodVisitor mv, int access,
-			String name, String desc) {
-		super(api, mv, access, name, desc);
-	}
-	boolean rewrite = false;
-
-	@Override
-	public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
-		return super.visitAnnotation(desc, visible);
-	}
-
-	@Override
-	public void visitFieldInsn(int opcode, String owner, String name,
-			String desc) {
-		if(!rewrite)
-		{
-			super.visitFieldInsn(opcode, owner, name, desc);
-			return;
-		}
-		if(opcode == GETFIELD && desc.length() > 1)
-		{
-			Label lblbForReadThrough = new Label();
-			Label lblForNextInsn = new Label();
-			dup();
-			super.visitFieldInsn(GETFIELD, owner, name+BEEN_CLONED_FIELD, Type.BOOLEAN_TYPE.getDescriptor());
-			super.visitJumpInsn(IFNE, lblbForReadThrough);
-			dup();
-			super.visitFieldInsn(GETFIELD, owner, CHILD_FIELD, Type.INT_TYPE.getDescriptor());
-			super.visitJumpInsn(IFEQ, lblbForReadThrough);
-
-			dup();
-			super.visitFieldInsn(opcode, owner, name, desc);
-			loadThis();
-			visitMethodInsn(INVOKESTATIC, "edu/columbia/cs/psl/invivo/runtime/COWAInterceptor", "readAndCOAIfNecessary",
-					"(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
-			checkCast(Type.getType(desc));
-			visitJumpInsn(GOTO, lblForNextInsn);
-
-			super.visitLabel(lblbForReadThrough);
-
-			super.visitFieldInsn(opcode, owner, name, desc);
-			super.visitLabel(lblForNextInsn);
-		}
-		else super.visitFieldInsn(opcode, owner, name, desc);
-	}
-
-	@Override
-	public void visitMaxs(int maxStack, int maxLocals) {
-		super.visitMaxs(maxStack, maxLocals);
-	}
-
-
-
-}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/SandboxPropogatingMV.java b/src/edu/columbia/cs/psl/vmvm/asm/SandboxPropogatingMV.java
deleted file mode 100644
index 790c44c..0000000
--- a/src/edu/columbia/cs/psl/vmvm/asm/SandboxPropogatingMV.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package edu.columbia.cs.psl.vmvm.asm;
-
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.commons.AdviceAdapter;
-import org.objectweb.asm.commons.InstructionAdapter;
-
-import edu.columbia.cs.psl.vmvm.Constants;
-import edu.columbia.cs.psl.vmvm.Instrumenter;
-
-/**
- * This method visitor will make sure that all sandbox flags are propogated
- *
- * @author jon
- *
- */
-public class SandboxPropogatingMV extends InstructionAdapter implements Opcodes {
-
-	private InvivoAdapter invivoAdapter;
-	private String className;
-	private String name;
-	private String desc;
-
-	protected SandboxPropogatingMV(int api, MethodVisitor mv, int access, String name, String desc, String className, InvivoAdapter lvs) {
-		//		super(api,mv,access,name,desc);
-		super(mv);
-		this.invivoAdapter = lvs;
-		this.className = className;
-		this.name = name;
-		this.desc = desc;
-	}
-
-	@Override
-	public void visitEnd() {
-		visitLabel(end);
-		if (sandboxVar >= 0)
-			super.visitLocalVariable("vmvmSandboxIndx", "I", null, start, end, sandboxVar);
-		super.visitEnd();
-	}
-
-	private int sandboxVar = -1;
-	private Label start = new Label();
-	private Label end = new Label();
-
-	@Override
-	public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) {
-		if (index >= invivoAdapter.getFirstLocal() - 1 && invivoAdapter.isStaticMethod() && !invivoAdapter.isMain() && !name.equals("<clinit>"))
-			super.visitLocalVariable(name, desc, signature, start, end, index + 1);
-		else
-			super.visitLocalVariable(name, desc, signature, start, end, index);
-	}
-
-	@Override
-	public void visitVarInsn(int opcode, int var) {
-		System.out.println("ZZZ" + name + var);
-		if (var >= invivoAdapter.getFirstLocal() - 1 && invivoAdapter.isStaticMethod() && !invivoAdapter.isMain() && !name.equals("<clinit>"))
-			super.visitVarInsn(opcode, var + 1);
-		else
-			super.visitVarInsn(opcode, var);
-	}
-
-	@Override
-	public void visitCode() {
-		super.visitCode();
-		if (!name.equals("<init>"))
-			onMethodEnter();
-	}
-
-	protected void onMethodEnter() {
-		visitLabel(start);
-		if (invivoAdapter.isStaticMethod()) {
-			if (invivoAdapter.isMain() || name.equals("<clinit>")) {
-				sandboxVar = invivoAdapter.newLocal(Type.INT_TYPE);
-				visitIntInsn(BIPUSH, 0);
-				invivoAdapter.setSandboxFlag();
-			}
-		} else {
-			if (name.equals("<init>")) {
-				visitVarInsn(ILOAD, invivoAdapter.getFirstLocal() - 1);
-				invivoAdapter.setSandboxFlag();
-			}
-		}
-	}
-
-	private boolean superInit = false;
-
-	@Override
-	public void visitMethodInsn(int opcode, String owner, String name, String desc) {
-		if (Instrumenter.instrumentedClasses.containsKey(owner)) {
-			if (name.equals("<init>") || opcode == INVOKESTATIC) {
-				//Need to call the modified method - which takes a short arg; the current sandbox state
-				Type[] args = Type.getArgumentTypes(desc);
-				Type[] descTypes = new Type[args.length + 1];
-				System.arraycopy(args, 0, descTypes, 0, args.length);
-				descTypes[args.length] = Type.INT_TYPE;
-				desc = Type.getMethodDescriptor(Type.getReturnType(desc), descTypes);
-				invivoAdapter.getSandboxFlag();
-			}
-		}
-		super.visitMethodInsn(opcode, owner, name, desc);
-
-		if (this.name.equals("<init>") && !superInit && opcode == INVOKESPECIAL)
-			onMethodEnter();
-	}
-}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/StaticFieldIsolatorMV.java b/src/edu/columbia/cs/psl/vmvm/asm/StaticFieldIsolatorMV.java
deleted file mode 100644
index fbca29c..0000000
--- a/src/edu/columbia/cs/psl/vmvm/asm/StaticFieldIsolatorMV.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package edu.columbia.cs.psl.vmvm.asm;
-
-import java.util.HashMap;
-import java.util.HashSet;
-
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.commons.AdviceAdapter;
-import org.objectweb.asm.commons.InstructionAdapter;
-
-import edu.columbia.cs.psl.vmvm.Constants;
-import edu.columbia.cs.psl.vmvm.Instrumenter;
-
-public class StaticFieldIsolatorMV extends InstructionAdapter implements Opcodes{
-
-	private InvivoAdapter invAdaptor;
-	private String name;
-
-	public StaticFieldIsolatorMV(int api, MethodVisitor mv, int access, String name, String desc, InvivoAdapter invAdaptor) {
-//		super(api, mv, access, name, desc);
-		super(mv);
-		this.invAdaptor = invAdaptor;
-		this.name = name;
-	}
-
-	@Override
-	public void visitInsn(int opcode) {
-		if (opcode == RETURN && name.equals("<clinit>"))
-			doneWithCLInit();
-		super.visitInsn(opcode);
-	}
-
-	private void doneWithCLInit() {
-		if (staticFieldsToClone.size() > 0) {
-			for (int i = 1; i <= Instrumenter.MAX_SANDBOXES; i++) {
-				visitIntInsn(BIPUSH, i);
-				invAdaptor.setSandboxFlag();
-				for (String s : staticFieldsToClone.keySet()) {
-					super.visitFieldInsn(GETSTATIC, invAdaptor.className, s, staticFieldsToClone.get(s));
-					invAdaptor.cloneValAtTopOfStack(staticFieldsToClone.get(s));
-					super.visitFieldInsn(PUTSTATIC, invAdaptor.className, s + Constants.SANDBOX_SUFFIX + i, staticFieldsToClone.get(s));
-				}
-			}
-		}
-	}
-
-	private HashMap<String, String> staticFieldsToClone = new HashMap<>();
-
-	@Override
-	public void visitFieldInsn(int opcode, String owner, String name, String desc) {
-		if (this.name.equals("<clinit>") && opcode == PUTSTATIC) {
-			if (owner.equals(invAdaptor.className))
-				staticFieldsToClone.put(name, desc);
-		} else {
-			if (opcode == Opcodes.GETSTATIC || opcode == Opcodes.PUTSTATIC) {
-
-			}
-		}
-		super.visitFieldInsn(opcode, owner, name, desc);
-	}
-}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/VMVMClassVisitor.java b/src/edu/columbia/cs/psl/vmvm/asm/VMVMClassVisitor.java
new file mode 100644
index 0000000..894cd00
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/asm/VMVMClassVisitor.java
@@ -0,0 +1,557 @@
+package edu.columbia.cs.psl.vmvm.asm;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.GeneratorAdapter;
+import org.objectweb.asm.tree.AnnotationNode;
+import org.objectweb.asm.tree.FieldInsnNode;
+import org.objectweb.asm.tree.FieldNode;
+import org.objectweb.asm.tree.MethodNode;
+
+import edu.columbia.cs.psl.vmvm.Constants;
+import edu.columbia.cs.psl.vmvm.Instrumenter;
+import edu.columbia.cs.psl.vmvm.VMState;
+import edu.columbia.cs.psl.vmvm.VirtualRuntime;
+import edu.columbia.cs.psl.vmvm.asm.mvs.ChrootMethodVisitor;
+import edu.columbia.cs.psl.vmvm.asm.mvs.StaticFieldIsolatorMV;
+import edu.columbia.cs.psl.vmvm.asm.mvs.StaticFinalMutibleizer;
+import edu.columbia.cs.psl.vmvm.asm.mvs.UnconditionalChrootMethodVisitor;
+import edu.columbia.cs.psl.vmvm.asm.struct.EqFieldInsnNode;
+import edu.columbia.cs.psl.vmvm.asm.struct.EqMethodInsnNode;
+import edu.columbia.cs.psl.vmvm.asm.struct.EqMethodNode;
+import edu.columbia.cs.psl.vmvm.chroot.ChrootUtils;
+import edu.columbia.cs.psl.vmvm.struct.MutableInstance;
+
+public abstract class VMVMClassVisitor extends ClassVisitor implements Opcodes, Constants  {
+	protected String className;
+	private boolean useVMState;
+	public VMVMClassVisitor(int api, ClassVisitor cv, boolean useVMState) {
+		super(api, cv);
+		this.useVMState = useVMState;
+	}
+
+	private boolean isClass;
+	private int version;
+	@Override
+	public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
+		if((access & Opcodes.ACC_PRIVATE) != 0)
+		{
+//			System.out.println(access);
+//			System.out.println(name);
+			access = access & ~Opcodes.ACC_PRIVATE;
+			access = access + Opcodes.ACC_PUBLIC;
+//			System.out.println(access);
+		}
+		super.visit(version, access, name, signature, superName, interfaces);
+		this.version = version;
+		isClass = (access & Opcodes.ACC_INTERFACE) == 0;
+		isEnum = (access & Opcodes.ACC_ENUM) != 0;
+
+	}
+	@Override
+	public void visitInnerClass(String name, String outerName, String innerName, int access) {
+		if((access & Opcodes.ACC_PRIVATE) != 0)
+		{
+//			System.out.println(access);
+//			System.out.println(name);
+			access = access & ~Opcodes.ACC_PRIVATE;
+			access = access + Opcodes.ACC_PUBLIC;
+//			System.out.println(access);
+		}
+		super.visitInnerClass(name, outerName, innerName, access);
+	}
+	public int getVersion() {
+		return version;
+	}
+	protected HashMap<EqMethodNode, MethodNode> renamedMethodsToCover = new HashMap<>();
+
+	private HashSet<EqMethodInsnNode> chrootMethodsToGen = new HashSet<>();
+
+	public void addChrootMethodToGen(EqMethodInsnNode mi) {
+		chrootMethodsToGen.add(mi);
+	}
+
+	public void addStaticCloneWrapper(String cloneMethodName, HashSet<EqFieldInsnNode> fieldsToClone) {
+		staticCloneMethodsToGen.put(cloneMethodName, fieldsToClone);
+	}
+	private HashMap<String, HashSet<EqFieldInsnNode>> staticCloneMethodsToGen = new HashMap<>();
+
+//	protected void generateFinalHackMethod()
+//	{
+//		MethodVisitor mv = super.visitMethod(Opcodes.ACC_PUBLIC, Constants.VMVM_STATIC_RESET_METHOD, "(L"+className+";)V", null,null);
+//		GeneratorAdapter gmv = new GeneratorAdapter(mv, Opcodes.ACC_PUBLIC, Constants.VMVM_STATIC_RESET_METHOD, "(L"+className+";)V");
+//
+//		for(Object o : Instrumenter.getClassNode(className).fields)
+//		{
+//			FieldNode fn = (FieldNode) o;
+//			if((fn.access &  Opcodes.ACC_STATIC) == 0)
+//			{
+//				if((fn.access &  Opcodes.ACC_FINAL) == 0)
+//				{
+//					gmv.loadThis();
+//					gmv.loadArg(0);
+//					gmv.visitFieldInsn(GETFIELD, className, fn.name, fn.desc);
+//					gmv.visitFieldInsn(PUTFIELD, className, fn.name, fn.desc);
+//				}
+//				else if(fn.desc.length() > 2 && Instrumenter.instrumentedClasses.containsKey(Type.getType(fn.desc).getInternalName()))
+//				{
+//					gmv.loadThis();
+//					gmv.visitFieldInsn(Opcodes.GETFIELD, className, fn.name, fn.desc);
+//					gmv.loadArg(0);
+//					gmv.visitFieldInsn(Opcodes.GETFIELD, className, fn.name, fn.desc);
+//					gmv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, Type.getType(fn.desc).getInternalName(), Constants.VMVM_STATIC_RESET_METHOD, "("+fn.desc+")V");
+//				}
+//				else if(fn.desc.startsWith("["))
+//				{
+//					gmv.loadArg(0);
+//					gmv.visitFieldInsn(Opcodes.GETFIELD, className, fn.name, fn.desc);
+//					gmv.push(0);
+//					gmv.loadThis();
+//					gmv.visitFieldInsn(Opcodes.GETFIELD, className, fn.name, fn.desc);
+//					gmv.push(0);
+//					gmv.loadArg(0);
+//					gmv.visitFieldInsn(Opcodes.GETFIELD, className, fn.name, fn.desc);
+//					gmv.visitInsn(ARRAYLENGTH);
+////					System.arraycopy(src, srcPos, dest, destPos, length)
+//
+//					gmv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/System", "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V");
+//				} else if (fn.desc.length() > 1) {
+//					try {
+//						Class<?> c = Class.forName(Type.getType(fn.desc)
+//								.getClassName());
+//						if (Collection.class.isAssignableFrom(c)) {
+//							gmv.loadThis();
+//							gmv.visitFieldInsn(Opcodes.GETFIELD, className, fn.name, fn.desc);
+//							gmv.visitInsn(DUP);
+//							String fieldType = Type.getType(fn.desc).getInternalName();
+//							gmv.visitMethodInsn(INVOKEVIRTUAL, fieldType, "clear", "()V");
+//							gmv.loadArg(0);
+//							gmv.visitFieldInsn(Opcodes.GETFIELD, className, fn.name, fn.desc);
+//							gmv.visitMethodInsn(INVOKEVIRTUAL, fieldType, "addAll", "("+Type.getDescriptor(Collection.class)+")Z");
+//							gmv.visitInsn(POP);
+//						}
+//						else if(Map.class.isAssignableFrom(c))
+//						{
+//							gmv.loadThis();
+//							gmv.visitFieldInsn(Opcodes.GETFIELD, className, fn.name, fn.desc);
+//							gmv.visitInsn(DUP);
+//							String fieldType = Type.getType(fn.desc).getInternalName();
+//							gmv.visitMethodInsn(INVOKEVIRTUAL, fieldType, "clear", "()V");
+//							gmv.loadArg(0);
+//							gmv.visitFieldInsn(Opcodes.GETFIELD, className, fn.name, fn.desc);
+//							gmv.visitMethodInsn(INVOKEVIRTUAL, fieldType, "putAll", "("+Type.getDescriptor(Map.class)+")V");
+//						}
+//						else if(fn.desc.equals("Ljava/lang/ThreadLocal;"))
+//						{
+//							gmv.loadThis();
+//							gmv.visitFieldInsn(Opcodes.GETFIELD, className, fn.name, fn.desc);
+//							gmv.loadArg(0);
+//							gmv.visitFieldInsn(Opcodes.GETFIELD, className, fn.name, fn.desc);
+//							gmv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/ThreadLocal", "get", "()Ljava/lang/Object;");
+//							gmv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/ThreadLocal", "set", "(Ljava/lang/Object;)V");
+//						}
+//					} catch (Exception ex)
+//					{
+//						ex.printStackTrace();
+//					}
+//				}
+//			}
+//		}
+//		gmv.returnValue();
+//		gmv.visitMaxs(0, 0);
+//		gmv.visitEnd();
+//
+//	}
+	protected void generateClinit(boolean callClinit)
+	{
+		MethodVisitor mv = super.visitMethod( Opcodes.ACC_STATIC, "<clinit>", "()V", null,null);
+		GeneratorAdapter gmv = new GeneratorAdapter(mv,  Opcodes.ACC_STATIC, "<clinit>", "()V");
+		StaticFinalMutibleizer fmv = new StaticFinalMutibleizer(gmv,  Opcodes.ACC_STATIC, className, "<clinit>", "()V");
+		if(!isAClass())
+			for(Object o : Instrumenter.getClassNode(className).fields)
+			{
+				FieldNode fn = (FieldNode) o;
+				if(fn.value != null)
+				{
+					fmv.visitLdcInsn(fn.value);
+					fmv.visitFieldInsn(PUTSTATIC, className, fn.name, fn.desc);
+				}
+				else
+				{
+					gmv.visitTypeInsn(NEW, Type.getInternalName(MutableInstance.class));
+					gmv.visitInsn(DUP);
+					gmv.visitMethodInsn(INVOKESPECIAL, Type.getInternalName(MutableInstance.class), "<init>", "()V");
+					gmv.visitFieldInsn(PUTSTATIC, className, fn.name, Type.getDescriptor(MutableInstance.class));
+				}
+			}
+		String classWithResetMethod = className;
+		if(!isAClass())
+			classWithResetMethod += "$vmvmReseter";
+		if(callClinit)
+		{
+//			if(StaticFieldIsolatorMV.CLINIT_ORDER_DEBUG)
+//			{
+//				Label l0 = new Label();
+//				Label l1 = new Label();
+//				Label l2 = new Label();
+//				Label l3 = new Label();
+//				gmv.visitTryCatchBlock(l0, l1, l2, "java/lang/Throwable");
+//				gmv.visitLabel(l0);
+//				gmv.visitFieldInsn(GETSTATIC, "java/lang/System", "err", "Ljava/io/PrintStream;");
+//				gmv.visitLdcInsn("called real, actual clinit in " + className);
+//				gmv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
+//				gmv.visitLabel(l1);
+//				gmv.visitJumpInsn(GOTO, l3);
+//				gmv.visitLabel(l2);
+//				mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Exception", "printStackTrace", "()V");
+//				gmv.visitLabel(l3);
+//			}
+			gmv.visitMethodInsn(INVOKESTATIC, classWithResetMethod, Constants.VMVM_STATIC_RESET_METHOD, "()V");
+		}
+		gmv.returnValue();
+		gmv.visitMaxs(0, 0);
+		gmv.visitEnd();
+
+		if(!callClinit && isAClass())
+		{
+			mv = super.visitMethod( Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, Constants.VMVM_STATIC_RESET_METHOD, "()V", null,null);
+			gmv = new GeneratorAdapter(mv,  Opcodes.ACC_STATIC | Opcodes.ACC_PUBLIC, Constants.VMVM_STATIC_RESET_METHOD, "()V");
+			gmv.returnValue();
+			gmv.visitMaxs(0, 0);
+			gmv.visitEnd();
+
+		}
+
+	}
+//	protected void generateStaticFieldCloneMethods(boolean callClinit)
+//	{
+//		MethodVisitor mv = super.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, Constants.VMVM_STATIC_RESET_METHOD, "()V", null,null);
+//		GeneratorAdapter gmv = new GeneratorAdapter(mv, Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, Constants.VMVM_STATIC_RESET_METHOD, "()V");
+//		if(callClinit)
+//		gmv.visitMethodInsn(INVOKESTATIC, className, "_clinit", "()V");
+//		for(EqFieldInsnNode fn : staticFieldsToClone)
+//		{
+//			if(fn.name.equals("$assertionsDisabled"))
+//				continue;
+//			gmv.visitFieldInsn(Opcodes.GETSTATIC, fn.owner, fn.name + Constants.BEEN_CLONED_FIELD, "Z");
+//			Label continu = new Label();
+//			gmv.visitJumpInsn(IFEQ, continu);
+//			if(fn.isFinal())
+//			{
+//				if(fn.desc.startsWith("["))
+//				{
+//					gmv.visitFieldInsn(Opcodes.GETSTATIC, fn.owner, fn.name+Constants.SANDBOX_SUFFIX, fn.desc);
+//					gmv.push(0);
+//					gmv.visitFieldInsn(Opcodes.GETSTATIC, fn.owner, fn.name, fn.desc);
+//					gmv.push(0);
+//					gmv.visitFieldInsn(Opcodes.GETSTATIC, fn.owner, fn.name, fn.desc);
+//					gmv.visitInsn(ARRAYLENGTH);
+////					System.arraycopy(src, srcPos, dest, destPos, length)
+//
+//					gmv.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/System", "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V");
+//				}
+//				else if(fn.desc.length() > 2 && Instrumenter.instrumentedClasses.containsKey(Type.getType(fn.desc).getInternalName()))
+//				{
+//					gmv.visitFieldInsn(Opcodes.GETSTATIC, fn.owner, fn.name, fn.desc);
+//					gmv.visitFieldInsn(Opcodes.GETSTATIC, fn.owner, fn.name+Constants.SANDBOX_SUFFIX, fn.desc);
+//					gmv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, Type.getType(fn.desc).getInternalName(), Constants.VMVM_STATIC_RESET_METHOD, "("+fn.desc+")V");
+//				}
+//				else if(fn.desc.length() > 2){
+//					try {
+//						Class<?> c = Class.forName(Type.getType(fn.desc)
+//								.getClassName());
+//						if (Collection.class.isAssignableFrom(c)) {
+//							gmv.visitFieldInsn(Opcodes.GETSTATIC, className, fn.name, fn.desc);
+//							gmv.visitInsn(DUP);
+//							String fieldType = Type.getType(fn.desc).getInternalName();
+//							gmv.visitMethodInsn(INVOKEVIRTUAL, fieldType, "clear", "()V");
+//							gmv.visitFieldInsn(Opcodes.GETSTATIC, className, fn.name+Constants.SANDBOX_SUFFIX, fn.desc);
+//							gmv.visitMethodInsn(INVOKEVIRTUAL, fieldType, "addAll", "("+Type.getDescriptor(Collection.class)+")Z");
+//							gmv.visitInsn(POP);
+//						}
+//						else if(Map.class.isAssignableFrom(c))
+//						{
+//							gmv.visitFieldInsn(Opcodes.GETSTATIC, className, fn.name, fn.desc);
+//							gmv.visitInsn(DUP);
+//							String fieldType = Type.getType(fn.desc).getInternalName();
+//							gmv.visitMethodInsn(INVOKEVIRTUAL, fieldType, "clear", "()V");
+//							gmv.visitFieldInsn(Opcodes.GETSTATIC, className, fn.name+Constants.SANDBOX_SUFFIX, fn.desc);
+//							gmv.visitMethodInsn(INVOKEVIRTUAL, fieldType, "putAll", "("+Type.getDescriptor(Map.class)+")V");
+//						}
+//						else if(fn.desc.equals("Ljava/lang/ThreadLocal;"))
+//						{
+//							gmv.visitFieldInsn(Opcodes.GETSTATIC, className, fn.name, fn.desc);
+//							gmv.visitFieldInsn(Opcodes.GETSTATIC, className, fn.name+Constants.SANDBOX_SUFFIX, fn.desc);
+//							gmv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/ThreadLocal", "get", "()Ljava/lang/Object;");
+//							gmv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/ThreadLocal", "set", "(Ljava/lang/Object;)V");
+//						}
+//					} catch (Exception ex)
+//					{
+//						ex.printStackTrace();
+//					}
+//				}
+//			}
+//			else
+//			{
+//				gmv.visitFieldInsn(Opcodes.GETSTATIC, fn.owner, fn.name+Constants.SANDBOX_SUFFIX, fn.desc);
+//				gmv.visitFieldInsn(Opcodes.PUTSTATIC, fn.owner, fn.name, fn.desc);
+//			}
+//			gmv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+//			gmv.visitLdcInsn("reseting>"+fn.owner+ "."+fn.name+" "+fn.desc);
+//			gmv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
+////			gmv.visitInsn(ICONST_0);
+////			gmv.visitFieldInsn(Opcodes.PUTSTATIC, fn.owner, fn.name + Constants.BEEN_CLONED_FIELD, "Z");
+//			gmv.visitLabel(continu);
+//		}
+//		gmv.returnValue();
+//		gmv.visitMaxs(0, 0);
+//		gmv.visitEnd();
+//	}
+
+	protected void generateStaticCloneMethods()
+	{
+		for (String methodName : staticCloneMethodsToGen.keySet()) {
+			MethodVisitor mv = super.visitMethod(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC, methodName, "(I)V", null, null);
+			GeneratorAdapter gmv = new GeneratorAdapter(mv, Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC, methodName, "(I)V");
+			//			InvivoAdapter iv = new InvivoAdapter(Opcodes.ASM4, gmv, Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC, mName, captureDesc, this.className);
+			gmv.visitCode();
+			if(staticCloneMethodsToGen != null && methodName != null && staticCloneMethodsToGen.get(methodName) != null)
+			for (FieldInsnNode fn : staticCloneMethodsToGen.get(methodName)) {
+				gmv.visitFieldInsn(Opcodes.GETSTATIC, fn.owner, fn.name, fn.desc);
+				gmv.loadArg(0);
+				Label[] lbls = new Label[Instrumenter.MAX_SANDBOXES + 1];
+				for (int i = 0; i < lbls.length; i++)
+					lbls[i] = new Label();
+				Label endOfTbl = new Label();
+				gmv.visitTableSwitchInsn(0, Instrumenter.MAX_SANDBOXES, lbls[0], lbls);
+				for (int i = 0; i < lbls.length; i++) {
+					gmv.visitLabel(lbls[i]);
+					gmv.visitFieldInsn(Opcodes.PUTSTATIC, fn.owner, fn.name + "_vmvm_" + i, fn.desc);
+					gmv.visitJumpInsn(GOTO, endOfTbl);
+				}
+				gmv.visitLabel(endOfTbl);
+			}
+			gmv.returnValue();
+			gmv.visitMaxs(0, 0);
+			gmv.visitEnd();
+		}
+	}
+
+	protected void generateChrootMethods()
+	{
+		Object[] o = new Object[4];
+		o[1] = null;
+		generateRegularChrootMethods();
+		generateParentConstructorChrootMethods();
+	}
+	private void generateParentConstructorChrootMethods() {
+		for (EqMethodInsnNode m : chrootMethodsToGen) {
+			if(m.flag != EqMethodInsnNode.FLAG_SUPER_INVOKE_CHROOT)
+				continue;
+			String mName = ChrootUtils.getCaptureInitParentMethodName(m);
+			String captureDesc = "(";
+
+			for (Type t : Type.getArgumentTypes(m.desc))
+				captureDesc += t.getDescriptor();
+
+			if(useVMState)
+				captureDesc += Type.getDescriptor(VMState.class);
+
+			captureDesc += ")[Ljava/lang/Object;";
+
+			MethodVisitor mv = super.visitMethod(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC, mName, captureDesc, null, null);
+			GeneratorAdapter gmv = new GeneratorAdapter(mv, Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC, mName, captureDesc);
+			gmv.visitCode();
+
+			String data = ChrootMethodVisitor.fsMethods.get(m.owner + "." + m.name + m.desc);
+
+			if (data.length() == 1) {
+				gmv.visitIntInsn(BIPUSH, Type.getArgumentTypes(m.desc).length);
+				gmv.visitTypeInsn(ANEWARRAY, "java/lang/Object");
+				int n = Integer.parseInt(data);
+				Type[] args = Type.getArgumentTypes(captureDesc);
+				for (int i = 0; i < args.length - (useVMState ? 1 : 0); i++) {
+					gmv.visitInsn(DUP);
+					gmv.visitIntInsn(BIPUSH, i);
+					gmv.loadArg(i);
+					if (i == n) {
+						if(useVMState)
+							gmv.loadArg(args.length - 1);
+						gmv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(ChrootUtils.class), "ensureSafePath", "(Ljava/lang/String;" + (useVMState ? Type.getDescriptor(VMState.class) :"")
+								+ ")Ljava/lang/String;");
+					}
+					gmv.visitInsn(AASTORE);
+				}
+				gmv.returnValue();
+
+			} else if (data.equals("URI")) {
+				Type[] args = Type.getArgumentTypes(captureDesc);
+				for (int i = 0; i < args.length; i++)
+					gmv.loadArg(i);
+
+				gmv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(ChrootUtils.class), "ensureSafeURIArrayReturn", captureDesc);
+			} else if (data.equals("URL")) {
+				Type[] args = Type.getArgumentTypes(captureDesc);
+				for (int i = 0; i < args.length; i++)
+					gmv.loadArg(i);
+
+				gmv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(ChrootUtils.class), "ensureSafeURLArrayReturn", captureDesc);
+
+			} else if (data.equals("FS")) {
+				System.out.println("Warn: app uses " + m.owner+"."+m.name + m.desc);
+			}
+			gmv.returnValue();
+			gmv.visitMaxs(0, 0);
+			gmv.visitEnd();
+		}
+	}
+
+	private void generateRegularChrootMethods() {
+		for (EqMethodInsnNode m : chrootMethodsToGen) {
+			if(m.flag == EqMethodInsnNode.FLAG_SUPER_INVOKE_CHROOT)
+				continue;
+			String mName = ChrootUtils.getCaptureMethodName(m);
+			String captureDesc = "(";
+
+			for (Type t : Type.getArgumentTypes(m.desc))
+				captureDesc += t.getDescriptor();
+
+			if(useVMState)
+				captureDesc += Type.getDescriptor(VMState.class);
+			if (m.name.equals("<init>"))
+				captureDesc += ")" + Type.getReturnType("L" + m.owner + ";").getDescriptor();
+			else
+				captureDesc += ")" + Type.getReturnType(m.desc).getDescriptor();
+
+			MethodVisitor mv = super.visitMethod(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC, mName, captureDesc, null, null);
+			GeneratorAdapter gmv = new GeneratorAdapter(mv, Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC, mName, captureDesc);
+			gmv.visitCode();
+
+			String originalDesc = m.desc;
+			if (m.name.equals("<init>")) {
+				if (!m.owner.contains("URL") && !m.owner.contains("URI")) {
+					gmv.visitTypeInsn(NEW, Type.getReturnType(m.owner).getInternalName());
+					gmv.visitInsn(DUP);
+				}
+				m.desc = Type.getMethodDescriptor(Type.VOID_TYPE, Type.getArgumentTypes(m.desc));
+			}
+			String data = ChrootMethodVisitor.fsMethods.get(m.owner + "." + m.name + m.desc);
+
+			if (data.length() == 1) {
+				int n = Integer.parseInt(data);
+				Type[] args = Type.getArgumentTypes(captureDesc);
+
+				for (int i = 0; i < args.length - (useVMState ? 1 : 0); i++) {
+					gmv.loadArg(i);
+					if (i == n) {
+						if(useVMState)
+							gmv.loadArg(args.length - 1);
+						gmv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(ChrootUtils.class), "ensureSafePath", "(Ljava/lang/String;" + (useVMState ? Type.getDescriptor(VMState.class) :"")
+								+ ")Ljava/lang/String;");
+					}
+
+				}
+				if(UnconditionalChrootMethodVisitor.fsOutputMethods.contains(m.owner + "." + m.name + m.desc))
+				{
+					UnconditionalChrootMethodVisitor.sandboxCallToFSOutputMethod(gmv, m.getOpcode(), m.owner, m.name, m.desc);
+				}
+				else
+					gmv.visitMethodInsn(m.getOpcode(), m.owner, m.name, m.desc);
+
+			} else if (data.equals("URI")) {
+				Type[] args = Type.getArgumentTypes(captureDesc);
+				for (int i = 0; i < args.length; i++)
+					gmv.loadArg(i);
+
+				gmv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(ChrootUtils.class), "ensureSafeURI", captureDesc);
+			} else if (data.equals("URL")) {
+				Type[] args = Type.getArgumentTypes(captureDesc);
+				for (int i = 0; i < args.length; i++)
+					gmv.loadArg(i);
+
+				gmv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(ChrootUtils.class), "ensureSafeURL", captureDesc);
+
+			} else if (data.equals("FS")) {
+
+			}
+			gmv.returnValue();
+			gmv.visitMaxs(0, 0);
+			gmv.visitEnd();
+		}
+	}
+
+	protected void generateCoverMethods()
+	{
+		for (MethodNode m : renamedMethodsToCover.keySet()) {
+			//			if(Instrumenter.getMethodNode(thisClassInfo, m.name, m.desc) != null)
+			//			{
+			//				continue;
+			//			}
+			List<String> list = (List<String>) m.exceptions;
+			String[] exceptions = new String[list.size()];
+			exceptions = list.toArray(exceptions);
+			MethodVisitor mv = super.visitMethod(m.access, m.name, m.desc, m.signature, exceptions);
+			GeneratorAdapter gmv = new GeneratorAdapter(mv, m.access, m.name, m.desc);
+			MethodNode mOrig = renamedMethodsToCover.get(m);
+			for (Object o : mOrig.visibleAnnotations) {
+				AnnotationNode an = (AnnotationNode) o;
+				an.accept(gmv.visitAnnotation(an.desc, true));
+			}
+			for (Object o : mOrig.invisibleAnnotations) {
+				AnnotationNode an = (AnnotationNode) o;
+				an.accept(gmv.visitAnnotation(an.desc, false));
+			}
+			gmv.visitCode();
+			if ((m.access & Opcodes.ACC_ABSTRACT) == 0) {
+				if ((m.access & Opcodes.ACC_STATIC) == 0) //not-static
+				{
+					gmv.loadThis();
+				}
+				Type[] args = Type.getArgumentTypes(m.desc);
+				for (int i = 0; i < args.length; i++) {
+					gmv.loadArg(i);
+				}
+				gmv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(VirtualRuntime.class), "getVMState", "()" + Type.getDescriptor(VMState.class));
+				gmv.visitMethodInsn((m.access & Opcodes.ACC_STATIC) != 0 ? Opcodes.INVOKESTATIC : m.name.equals("<init>") ? Opcodes.INVOKESPECIAL : Opcodes.INVOKEVIRTUAL, className,
+						(!"<init>".equals(renamedMethodsToCover.get(m).name) && !"<clinit>".equals(renamedMethodsToCover.get(m).name) ? "_" : "") + renamedMethodsToCover.get(m).name, renamedMethodsToCover.get(m).desc);
+
+				gmv.returnValue();
+			}
+			gmv.visitMaxs(0, 0);
+			gmv.visitEnd();
+		}
+	}
+
+
+	public String getClassName() {
+		return className;
+	}
+
+	public abstract boolean hasExtraInterface();
+
+	public abstract byte[] getExtraInterface();
+
+	private HashSet<EqFieldInsnNode> staticFieldsToClone = new HashSet<>();
+	public void addStaticFieldsToClone(
+			HashSet<EqFieldInsnNode> staticFieldsToClone) {
+		this.staticFieldsToClone.addAll(staticFieldsToClone);
+	}
+	public boolean isAClass() {
+		return isClass;
+	}
+	private boolean isEnum;
+	public boolean isEnum() {
+		return isEnum;
+	}
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/mvs/ChrootMethodVisitor.java b/src/edu/columbia/cs/psl/vmvm/asm/mvs/ChrootMethodVisitor.java
new file mode 100644
index 0000000..642a97b
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/asm/mvs/ChrootMethodVisitor.java
@@ -0,0 +1,96 @@
+package edu.columbia.cs.psl.vmvm.asm.mvs;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Scanner;
+
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.AdviceAdapter;
+import org.objectweb.asm.commons.InstructionAdapter;
+import org.objectweb.asm.tree.MethodInsnNode;
+
+import com.sun.org.apache.bcel.internal.generic.INVOKESPECIAL;
+
+import edu.columbia.cs.psl.vmvm.Instrumenter;
+import edu.columbia.cs.psl.vmvm.VMState;
+import edu.columbia.cs.psl.vmvm.asm.VMVMClassVisitor;
+import edu.columbia.cs.psl.vmvm.asm.struct.EqMethodInsnNode;
+import edu.columbia.cs.psl.vmvm.chroot.ChrootUtils;
+
+public class ChrootMethodVisitor extends InstructionAdapter {
+	public static HashMap<String, String> fsMethods = new HashMap<>();
+	static {
+		try {
+			Scanner s = new Scanner(new File("fs-methods.txt"));
+			while (s.hasNextLine()) {
+				String[] d = s.nextLine().split("\t");
+				fsMethods.put(d[0], d[1]);
+			}
+			s.close();
+		} catch (Exception ex) {
+			ex.printStackTrace();
+		}
+	}
+	private String className;
+	private VMVMClassVisitor icv;
+	private InvivoAdapter invivoAdapter;
+	public ChrootMethodVisitor(int api, MethodVisitor mv, int access, String name, String desc, String className, InvivoAdapter invivoAdapter, VMVMClassVisitor icv) {
+		super(mv);
+		this.className = className;
+		this.icv = icv;
+		this.invivoAdapter = invivoAdapter;
+	}
+
+	@Override
+	public void visitMethodInsn(int opcode, String owner, String name, String desc) {
+		if (fsMethods.containsKey(owner + "." + name + desc) && opcode != Opcodes.INVOKESPECIAL) {
+//			System.out.println("Chroot over " + owner + " " + name + " " + desc);
+			Label sandboxed = new Label();
+			Label end = new Label();
+			EqMethodInsnNode mi = new EqMethodInsnNode(opcode, owner, name, desc);
+			Type[] args = Type.getArgumentTypes(desc);
+
+			if (opcode != Opcodes.INVOKESTATIC && !name.equals("<init>")) {
+				Type[] descTypes2 = new Type[args.length + 1];
+				System.arraycopy(args, 0, descTypes2, 1, args.length);
+				descTypes2[0] = Type.getType("L" + owner + ";");
+				desc = Type.getMethodDescriptor(Type.getReturnType(desc), descTypes2);
+			}
+			else if(name.equals("<init>") && opcode != Opcodes.INVOKESPECIAL)
+			{
+				desc = Type.getMethodDescriptor(Type.getType("L"+owner+";"), args);
+			}
+			args = Type.getArgumentTypes(desc);
+			Type[] descTypes2 = new Type[args.length + 1];
+			System.arraycopy(args, 0, descTypes2, 0, args.length);
+			descTypes2[args.length] = Type.getType(VMState.class);
+			desc = Type.getMethodDescriptor(Type.getReturnType(desc), descTypes2);
+
+			invivoAdapter.branchIfSandboxed(sandboxed);
+
+			super.visitMethodInsn(mi.getOpcode(), mi.owner, mi.name, mi.desc);
+			super.visitJumpInsn(Opcodes.GOTO, end);
+
+			super.visitLabel(sandboxed);
+			invivoAdapter.getSandboxFlagState();
+
+			super.visitMethodInsn(Opcodes.INVOKESTATIC, className,ChrootUtils.getCaptureMethodName(mi), desc);
+//			mi.desc= desc;
+			icv.addChrootMethodToGen(mi);
+
+			if(name.equals("<init>") && opcode != Opcodes.INVOKESPECIAL)
+			{
+				super.visitInsn(Opcodes.SWAP);
+				super.visitInsn(Opcodes.POP);
+				super.visitInsn(Opcodes.SWAP);
+				super.visitInsn(Opcodes.POP);
+			}
+			super.visitLabel(end);
+
+		} else
+			super.visitMethodInsn(opcode, owner, name, desc);
+	}
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/mvs/ClassDefineInterceptMethodVisitor.java b/src/edu/columbia/cs/psl/vmvm/asm/mvs/ClassDefineInterceptMethodVisitor.java
new file mode 100644
index 0000000..74920d6
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/asm/mvs/ClassDefineInterceptMethodVisitor.java
@@ -0,0 +1,140 @@
+package edu.columbia.cs.psl.vmvm.asm.mvs;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.InstructionAdapter;
+import org.objectweb.asm.commons.LocalVariablesSorter;
+import org.objectweb.asm.tree.ClassNode;
+
+import edu.columbia.cs.psl.vmvm.Instrumenter;
+
+public class ClassDefineInterceptMethodVisitor extends InstructionAdapter implements Opcodes{
+
+	private String name;
+	private String desc;
+	private String owner;
+	private LocalVariablesSorter lvs;
+	public ClassDefineInterceptMethodVisitor(MethodVisitor mv,String owner,String name,String desc) {
+		super(mv);
+		this.owner = owner;
+		this.name = name;
+		this.desc = desc;
+	}
+
+	@Override
+	public void visitCode() {
+		super.visitCode();
+	}
+	private void onMethodEnter()
+	{
+		if(this.name.equals("<init>") && this.owner.equals("org/apache/catalina/loader/WebappClassLoader")
+				|| Instrumenter.atLeastASuperEq(this.owner, "java/net/URLClassLoader", 0))
+		{
+			superInit = true;
+
+			/*
+			 * Label l0 = new Label();
+				Label l1 = new Label();
+				Label l2 = new Label();
+				mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception");
+				mv.visitLabel(l0);
+				mv.visitTypeInsn(NEW, "java/net/URL");
+				mv.visitLdcInsn("foo");
+				mv.visitMethodInsn(INVOKESPECIAL, "java/net/URL", "<init>", "(Ljava/lang/String;)V");
+				mv.visitLabel(l1);
+				Label l3 = new Label();
+				mv.visitJumpInsn(GOTO, l3);
+				mv.visitLabel(l2);
+				mv.visitFrame(Opcodes.F_SAME1, 0, null, 1, new Object[] {"java/lang/Exception"});
+				mv.visitVarInsn(ASTORE, 2);
+				mv.visitLabel(l3);
+				mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+				mv.visitInsn(ACONST_NULL);
+				mv.visitInsn(ARETURN);
+				mv.visitMaxs(2, 3);
+			 */
+//			Label l0 = new Label();
+//			Label l1 = new Label();
+//			Label l2 = new Label();
+//
+			Label l0 = new Label();
+			Label l1 = new Label();
+			Label l2 = new Label();
+			mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception");
+
+			mv.visitLabel(l0);
+			mv.visitVarInsn(ALOAD, 0);
+			mv.visitTypeInsn(NEW, "java/net/URL");
+			mv.visitInsn(DUP);
+			mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
+			mv.visitInsn(DUP);
+			mv.visitLdcInsn("file://");
+			mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V");
+			mv.visitLdcInsn("VMVMLib");
+			mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "getProperty", "(Ljava/lang/String;)Ljava/lang/String;");
+			mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;");
+			mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;");
+			mv.visitMethodInsn(INVOKESPECIAL, "java/net/URL", "<init>", "(Ljava/lang/String;)V");
+			mv.visitMethodInsn(INVOKEVIRTUAL, this.owner, "addURL", "(Ljava/net/URL;)V");
+
+
+			mv.visitVarInsn(ALOAD, 0);
+			mv.visitTypeInsn(NEW, "java/net/URL");
+			mv.visitInsn(DUP);
+			mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
+			mv.visitInsn(DUP);
+			mv.visitLdcInsn("file://");
+			mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V");
+			mv.visitLdcInsn("ASMLib");
+			mv.visitMethodInsn(INVOKESTATIC, "java/lang/System", "getProperty", "(Ljava/lang/String;)Ljava/lang/String;");
+			mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;");
+			mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;");
+			mv.visitMethodInsn(INVOKESPECIAL, "java/net/URL", "<init>", "(Ljava/lang/String;)V");
+			mv.visitMethodInsn(INVOKEVIRTUAL, this.owner, "addURL", "(Ljava/net/URL;)V");
+
+			mv.visitLabel(l1);
+			Label l3 = new Label();
+			mv.visitJumpInsn(GOTO, l3);
+			mv.visitLabel(l2);
+			mv.visitFrame(Opcodes.F_SAME1, 0,null, 1, new Object[] {"java/lang/Exception"});
+			int n = lvs.newLocal(Type.getType(Exception.class));
+			mv.visitVarInsn(ASTORE, n);
+			mv.visitVarInsn(ALOAD, n);
+			mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Exception", "printStackTrace", "()V");
+			mv.visitLabel(l3);
+			mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
+
+		}
+	}
+	private boolean superInit = false;
+	@Override
+	public void visitMethodInsn(int opcode, String owner, String name, String desc) {
+		//XXX todo this was buggy so now it's off. is that a problem?
+//		if(name.equals("defineClass") && !this.owner.equals("java/lang/ClassLoader") && Instrumenter.atLeastASuperEq(owner, "java/lang/ClassLoader",0))
+//		{
+////			System.out.println("cribbing on " + owner+"."+name+desc);
+////			Type[] newArgs = new Type
+//			Type[] oldArgs = Type.getArgumentTypes(desc);
+//			Type[] newArgs = new Type[oldArgs.length+1];
+//			System.arraycopy(oldArgs, 0, newArgs, 1, oldArgs.length);
+//			newArgs[0] = Type.getType(ClassLoader.class);
+//			desc = Type.getMethodDescriptor(Type.getReturnType(desc), newArgs);
+//			owner = "edu/columbia/cs/psl/vmvm/agent/VMVMClassFileTransformer";
+//			opcode = INVOKESTATIC;
+//		}
+//		else
+			super.visitMethodInsn(opcode, owner, name, desc);
+
+//		if (this.name.equals("<init>") && !superInit && opcode == INVOKESPECIAL)
+//			onMethodEnter();
+	}
+
+	public void setLocalVariableSorter(TypeRememberingLocalVariableSorter lvs2) {
+		this.lvs = lvs2;
+	}
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/mvs/CloningAdapter.java b/src/edu/columbia/cs/psl/vmvm/asm/mvs/CloningAdapter.java
new file mode 100644
index 0000000..fee4349
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/asm/mvs/CloningAdapter.java
@@ -0,0 +1,136 @@
+package edu.columbia.cs.psl.vmvm.asm.mvs;
+
+import java.util.HashSet;
+
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.InstructionAdapter;
+
+import edu.columbia.cs.psl.vmvm.CloningUtils;
+
+public class CloningAdapter extends InstructionAdapter implements Opcodes {
+
+	public CloningAdapter(MethodVisitor mv) {
+		super(mv);
+	}
+
+
+	private static final HashSet<String> immutableClasses = new HashSet<String>();
+	static {
+		immutableClasses.add("Ljava/lang/Integer;");
+		immutableClasses.add("Ljava/lang/Long;");
+		immutableClasses.add("Ljava/lang/Short;");
+		immutableClasses.add("Ljava/lang/Float;");
+		immutableClasses.add("Ljava/lang/String;");
+		immutableClasses.add("Ljava/lang/Char;");
+		immutableClasses.add("Ljava/lang/Byte;");
+		immutableClasses.add("Ljava/lang/Integer;");
+		immutableClasses.add("Ljava/lang/Long;");
+		immutableClasses.add("Ljava/lang/Short;");
+		immutableClasses.add("Ljava/lang/Float;");
+		immutableClasses.add("Ljava/lang/String;");
+		immutableClasses.add("Ljava/lang/Char;");
+		immutableClasses.add("Ljava/lang/Byte;");
+		immutableClasses.add("Ljava/sql/ResultSet;");
+		immutableClasses.add("Ljava/lang/Class;");
+		immutableClasses.add("Z");
+		immutableClasses.add("B");
+		immutableClasses.add("C");
+		immutableClasses.add("S");
+		immutableClasses.add("I");
+		immutableClasses.add("J");
+		immutableClasses.add("F");
+		immutableClasses.add("L");
+
+	}
+
+	protected void cloneValAtTopOfStack(String typeOfField) {
+		_generateClone(typeOfField, "", false);
+	}
+
+	protected void cloneValAtTopOfStack(String typeOfField, String debug, boolean secondElHasArrayLen) {
+		_generateClone(typeOfField, debug, secondElHasArrayLen);
+	}
+
+	public void println(String toPrint) {
+		visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+		visitLdcInsn(toPrint + " : ");
+		super.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "print", "(Ljava/lang/String;)V");
+
+		visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+		super.visitMethodInsn(INVOKESTATIC, "java/lang/Thread", "currentThread", "()Ljava/lang/Thread;");
+		super.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Thread", "getName", "()Ljava/lang/String;");
+		super.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
+	}
+
+	private void _generateClone(String typeOfField, String debug, boolean secondElHasArrayLen) {
+		Type fieldType = Type.getType(typeOfField);
+//		println("Generate clone: "+ debug);
+		if (
+		// fieldType.getSort() == Type.ARRAY &&
+		// fieldType.getElementType().getSort()
+		// ||
+		fieldType.getSort() == Type.VOID || (fieldType.getSort() != Type.ARRAY && (fieldType.getSort() != Type.OBJECT || immutableClasses.contains(typeOfField)))) {
+			//			 println("reference> " + debug);
+			return;
+		}
+		if (fieldType.getSort() == Type.ARRAY) {
+			if (fieldType.getElementType().getSort() != Type.OBJECT || immutableClasses.contains(fieldType.getElementType().getDescriptor())) {
+				//				 println("array> " + debug);
+
+				// Just need to duplicate the array
+				dup();
+				Label nullContinue = new Label();
+				visitJumpInsn(IFNULL, nullContinue);
+				if (secondElHasArrayLen) {
+					swap();
+				} else {
+					dup();
+					visitInsn(ARRAYLENGTH);
+				}
+				dup();
+				newarray(Type.getType(fieldType.getDescriptor().substring(1)));
+				dupX2();
+				swap();
+
+				iconst(0);
+				dupX2();
+				swap();
+				super.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/System", "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V");
+				Label noNeedToPop = new Label();
+				if (secondElHasArrayLen) {
+					visitJumpInsn(GOTO, noNeedToPop);
+					visitLabel(nullContinue);
+					swap();
+					pop();
+				} else {
+					visitLabel(nullContinue);
+				}
+
+				visitLabel(noNeedToPop);
+
+			} else {
+				// println("heavy> " + debug);
+				// Just use the reflective cloner
+				visitLdcInsn(debug);
+//				getSandboxFlag();
+				invokestatic(Type.getType(CloningUtils.class).getInternalName(), "clone", "(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;");
+				//				invokeStatic(Type.getType(CloningUtils.class), Method.getMethod("Object clone(Object, String, int)"));
+				checkcast(fieldType);
+			}
+		} else if (fieldType.getClassName().contains("InputStream") || fieldType.getClassName().contains("OutputStream") || fieldType.getClassName().contains("Socket")) {
+			// Do nothing
+		} else {
+			// println("heavy> " + debug);
+			visitLdcInsn(debug);
+//			getSandboxFlag();
+			visitMethodInsn(INVOKESTATIC,Type.getType(CloningUtils.class).getInternalName(), "clone", "(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;");
+			//			invokeStatic(Type.getType(CloningUtils.class), Method.getMethod("Object clone(Object, String, int)"));
+			checkcast(fieldType);
+
+		}
+//		println("Complete clone: " + debug);
+	}
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/mvs/InsnCountingMV.java b/src/edu/columbia/cs/psl/vmvm/asm/mvs/InsnCountingMV.java
new file mode 100644
index 0000000..d326722
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/asm/mvs/InsnCountingMV.java
@@ -0,0 +1,94 @@
+package edu.columbia.cs.psl.vmvm.asm.mvs;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.Handle;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.commons.InstructionAdapter;
+
+public class InsnCountingMV extends MethodVisitor {
+
+	int count;
+
+	public int getCount() {
+		return count-1;
+	}
+	public InsnCountingMV(int api, MethodVisitor mv) {
+		super(api, mv);
+	}
+	@Override
+	public void visitFieldInsn(int opcode, String owner, String name, String desc) {
+		count++;
+		super.visitFieldInsn(opcode, owner, name, desc);
+	}
+	@Override
+	public void visitInsn(int opcode) {
+		count++;
+		super.visitInsn(opcode);
+	}
+	@Override
+	public void visitIincInsn(int var, int increment) {
+		count++;
+		super.visitIincInsn(var, increment);
+	}
+	@Override
+	public void visitInvokeDynamicInsn(String name, String desc, Handle bsm, Object... bsmArgs) {
+		count++;
+		super.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs);
+	}
+	@Override
+	public void visitIntInsn(int opcode, int operand) {
+		count++;
+		super.visitIntInsn(opcode, operand);
+	}
+	@Override
+	public void visitJumpInsn(int opcode, Label label) {
+		count++;
+		super.visitJumpInsn(opcode, label);
+	}
+	@Override
+	public void visitLdcInsn(Object cst) {
+		count++;
+		super.visitLdcInsn(cst);
+	}
+	@Override
+	public void visitLookupSwitchInsn(Label dflt, int[] keys, Label[] labels) {
+		count++;
+		super.visitLookupSwitchInsn(dflt, keys, labels);
+	}
+	@Override
+	public void visitMethodInsn(int opcode, String owner, String name, String desc) {
+		count++;
+		super.visitMethodInsn(opcode, owner, name, desc);
+	}
+	@Override
+	public void visitMultiANewArrayInsn(String desc, int dims) {
+		count++;
+		super.visitMultiANewArrayInsn(desc, dims);
+	}
+	@Override
+	public void visitTypeInsn(int opcode, String type) {
+		count++;
+		super.visitTypeInsn(opcode, type);
+	}
+	@Override
+	public void visitVarInsn(int opcode, int var) {
+		count++;
+		super.visitVarInsn(opcode, var);
+	}
+	@Override
+	public void visitTableSwitchInsn(int min, int max, Label dflt, Label... labels) {
+		count++;
+		super.visitTableSwitchInsn(min, max, dflt, labels);
+	}
+	@Override
+	public void visitLabel(Label label) {
+		count++;
+		super.visitLabel(label);
+	}
+	@Override
+	public void visitLineNumber(int line, Label start) {
+		count++;
+		super.visitLineNumber(line, start);
+	}
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/mvs/InvivoAdapter.java b/src/edu/columbia/cs/psl/vmvm/asm/mvs/InvivoAdapter.java
new file mode 100644
index 0000000..deddf5f
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/asm/mvs/InvivoAdapter.java
@@ -0,0 +1,330 @@
+package edu.columbia.cs.psl.vmvm.asm.mvs;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.AdviceAdapter;
+import org.objectweb.asm.commons.GeneratorAdapter;
+import org.objectweb.asm.commons.InstructionAdapter;
+import org.objectweb.asm.commons.LocalVariablesSorter;
+import org.objectweb.asm.commons.Method;
+import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.LocalVariableNode;
+import org.objectweb.asm.tree.MethodNode;
+
+import sun.util.logging.resources.logging;
+
+import edu.columbia.cs.psl.vmvm.CloningUtils;
+import edu.columbia.cs.psl.vmvm.Constants;
+import edu.columbia.cs.psl.vmvm.Instrumenter;
+import edu.columbia.cs.psl.vmvm.VMState;
+import edu.columbia.cs.psl.vmvm.asm.struct.EqMethodNode;
+import edu.columbia.cs.psl.vmvm.asm.struct.MethodListClassNode;
+
+public class InvivoAdapter extends CloningAdapter implements Opcodes {
+	protected int access;
+	protected String name;
+	protected String desc;
+	protected String className;
+	private TypeRememberingLocalVariableSorter lvs;
+	private int firstLocal;
+	private int sandboxVar;
+//	private static Logger log = Logger.getLogger(InvivoAdapter.class);
+	public InvivoAdapter(int api, MethodVisitor mv, int access, String name, String desc, String className, boolean generateReverseStub) {
+		//		super(api, mv, access, name, desc);
+		super(mv);
+		this.access = access;
+		this.name = name;
+		this.desc = desc;
+		this.className = className;
+
+		Type[] args = Type.getArgumentTypes(desc);
+		firstLocal = (Opcodes.ACC_STATIC & access) == 0 ? 1 : 0;
+		for (int i = 0; i < args.length; i++) {
+			firstLocal += args[i].getSize();
+		}
+		sandboxVar = isMain() || isClinit() ? getFirstLocal() : getFirstLocal() - 1;
+
+		if(generateReverseStub)
+		{
+			GeneratorAdapter gv = new GeneratorAdapter(mv, access, name, desc);
+			gv.visitCode();
+			gv.loadThis();
+			for(int i = 0; i < args.length-1; i++)
+			{
+				gv.loadArg(i);
+			}
+			Type[] args2 = new Type[args.length-1];
+			System.arraycopy(args, 0, args2, 0, args.length-1);
+			gv.visitMethodInsn(INVOKEVIRTUAL, className, name.substring(1), Type.getMethodDescriptor(Type.getReturnType(desc), args2));
+//			switch(Type.getReturnType(desc).getSort())
+//			{
+//			case Type.ARRAY:
+//			case Type.OBJECT:
+//				gv.visitLdcInsn(null);
+//			break;
+//			case Type.VOID:
+//				break;
+//			default:
+//				gv.push(0);
+//			}
+			gv.returnValue();
+			gv.visitMaxs(0, 0);
+//			mv.visitEnd();
+		}
+	}
+
+	public boolean isMain() {
+		return name.equals("main") && desc.equals("([Ljava/lang/String;)V");
+	}
+
+	public boolean needToGenerateSandboxVar() {
+		return isStaticMethod() && (isMain() || name.equals("<clinit>"));
+	}
+
+	public boolean isStaticMethod() {
+		return (access & Opcodes.ACC_STATIC) != 0;
+	}
+
+	public int getFirstLocal() {
+		return firstLocal;
+	}
+
+	@Override
+	public void visitCode() {
+		visitLabel(start);
+		super.visitCode();
+	}
+
+	private Label start = new Label();
+	private Label end = new Label();
+	private boolean sandboxVarVisited = false;
+
+	public boolean isRegularClass()
+	{
+		return (ACC_ABSTRACT & this.access) == 0;
+	}
+	@Override
+	public void visitEnd() {
+		try{
+		super.visitEnd();
+		}
+		catch(Exception ex)
+		{
+//			log.error("Unable to calculate frame for method " + this.className+"."+this.name+this.desc,ex);
+		}
+    }
+
+	private void visitVMVMLocalVariable()
+	{
+        if (sandboxVar >= 0 && !sandboxVarVisited && isRegularClass()) {
+            try {
+                sandboxVarVisited = true;
+                super.visitLocalVariable("secretVMVMD4t4z", Type.getDescriptor(VMState.class),
+                        null, start, end, sandboxVar);
+            } catch (NullPointerException ex) {
+                System.err.println("Unable to visit local variable vmvmSandboxIndx (num "
+                        + sandboxVar + ") [labels=" + start + "; " + end + "]" + "[method = "
+                        + this.className + "." + this.name + this.desc);
+                ex.printStackTrace();
+            }
+        }
+	}
+
+	@Override
+	public void visitMaxs(int maxStack, int maxLocals) {
+        visitLabel(end);
+
+        if(sandboxVar == 0)
+            visitVMVMLocalVariable();
+        while (newLVs.size() > 0) {
+            LocalVariableNode lv = newLVs.pop();
+            if (lvDescs.get(lv.index) != null)
+                lv.desc = lvDescs.get(lv.index);
+            try {
+                super.visitLocalVariable(lv.name, lv.desc, lv.signature, this.start, this.end,
+                        lv.index);
+                if(lv.index == sandboxVar - 1)
+                    visitVMVMLocalVariable();
+            } catch (NullPointerException ex) {
+                System.err.println("Unable to visit local variable " + lv.name + " " + lv.desc
+                        + " (num " + lv.index + ")");
+                ex.printStackTrace();
+            }
+        }
+
+	    super.visitMaxs(maxStack, maxLocals);
+	}
+	@Override
+	public void visitIincInsn(int var, int increment) {
+		if (var >= firstLocal - 1 && !isMain() && !name.equals("<clinit>")) {
+			super.visitIincInsn(var + 1, increment);
+		} else {
+			super.visitIincInsn(var, increment);
+		}
+
+	}
+
+	@Override
+	public void visitVarInsn(int opcode, int var) {
+		if (var >= firstLocal - 1 && !isMain() && !name.equals("<clinit>")) {
+			super.visitVarInsn(opcode, var + 1);
+		} else {
+			super.visitVarInsn(opcode, var);
+		}
+	}
+
+	private HashMap<Integer, String> lvDescs = new HashMap<>();
+
+	@Override
+	public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) {
+		if (oldLVtoSandboxLV != null && oldLVtoSandboxLV.containsKey(index))
+			lvDescs.put(getSboxLVMap(index), desc);
+		//		if (sandboxVar == index && !sandboxVarVisited) {
+		//			sandboxVarVisited = true;
+		//			visitLabel(end);
+		//			super.visitLocalVariable("vmvmSandboxIndx", Type.getDescriptor(VMState.class), null, this.start, this.end, sandboxVar);
+		//		}
+		while (newLVs.size() > 0 && newLVs.peek().index < index) {
+			LocalVariableNode lv = newLVs.pop();
+			if (lvDescs.get(lv.index) != null)
+				lv.desc = lvDescs.get(lv.index);
+			super.visitLocalVariable(lv.name, lv.desc, lv.signature, this.start, this.end, lv.index);
+		}
+		if (index >= firstLocal - 1 && !isMain() && !name.equals("<clinit>")) {
+
+			super.visitLocalVariable(name, desc, signature, start, end, index + 1);
+		} else
+		{
+			super.visitLocalVariable(name, desc, signature, start, end, index);
+            if(index == sandboxVar - 1)
+                visitVMVMLocalVariable();
+
+		}
+	}
+
+	public int newLocal(Type type) {
+		return lvs.newLocal(type);
+	}
+
+	public void branchIfSandboxed(Label lblForSandboxed) {
+		getSandboxFlag();
+
+		visitJumpInsn(IFGT, lblForSandboxed);
+	}
+
+	public void setSandboxVar(int sandboxVar) {
+		this.sandboxVar = sandboxVar;
+	}
+
+	public void getSandboxFlagState() {
+		super.visitVarInsn(ALOAD, sandboxVar);
+	}
+
+	public void getSandboxFlag() {
+		getSandboxFlagState();
+		super.visitMethodInsn(INVOKEVIRTUAL, Type.getInternalName(VMState.class), "getState", "()I");
+	}
+
+	private boolean isClinit() {
+		return name.equals("<clinit>");
+	}
+
+	public void setSandboxFlag() {
+		super.visitVarInsn(ASTORE, sandboxVar);
+	}
+
+
+
+	public void setLocalVariableSorter(TypeRememberingLocalVariableSorter lvs2) {
+		this.lvs = lvs2;
+	}
+
+	public int getSandboxVar() {
+		return sandboxVar;
+	}
+
+	public int getSboxLVMap(int oldLV) {
+		if (!oldLVtoSandboxLV.containsKey(oldLV))
+			throw new NoSuchElementException("Size: " + oldLVtoSandboxLV.size() + "; No element " + oldLV + " in LV map for " + className + "." + name + desc);
+		return oldLVtoSandboxLV.get(oldLV);
+	}
+
+	private LinkedList<LocalVariableNode> newLVs = new LinkedList<>();
+	private HashMap<Integer, Integer> oldLVtoSandboxLV;
+
+	private List<?> getLocals() {
+		MethodListClassNode cn = Instrumenter.instrumentedClasses.get(className);
+		for (EqMethodNode mn : cn.methodsHashSet) {
+			System.out.println(this.name.substring(1));
+			if ((mn.name.equals(this.name)  || mn.name.equals(this.name.substring(1)) ) && methodDescsCloseEnough(this.desc, mn.desc)) {
+				return mn.localVariables;
+			}
+		}
+
+		return null;
+	}
+	public static boolean methodDescsCloseEnough(String mightHaveVMState, String desc)
+	{
+		Type[] d1 = Type.getArgumentTypes(mightHaveVMState);
+		Type[] d2 = Type.getArgumentTypes(desc);
+		if(Arrays.deepEquals(d1, d2))
+			return true;
+		if(d1[d1.length-1].getInternalName().equals(Type.getInternalName(VMState.class)))
+		{
+
+			if(d1.length -1 != d2.length)
+				return false;
+			for(int i = 0; i < d1.length -1;i++)
+				if(!d1[i].equals(d2[i]))
+					return false;
+			return true;
+		}
+		return false;
+	}
+	public void cloneLocals(int whereToStop) {
+		oldLVtoSandboxLV = new HashMap<>();
+		List<?> oldLocals = getLocals();
+		for (int i = 0; i < whereToStop; i++) {
+			Type t = lvs.getLocalTypes().get(i);
+			if (i == 0 && t == null && (access & ACC_STATIC) == 0)
+				t = Type.getType("L" + className + ";");
+			if (i < firstLocal && t == null)
+			{
+				if((Opcodes.ACC_STATIC & access) == 0)
+					t = Type.getMethodType(this.desc).getArgumentTypes()[i-1];
+				else
+					t = Type.getMethodType(this.desc).getArgumentTypes()[i];
+			}
+			if (t.getSort() == Type.OBJECT && t.getInternalName().equals("java/lang/Object")) {
+				//Default to the type of what we cloened from
+				for (Object o : oldLocals) {
+					LocalVariableNode lv = (LocalVariableNode) o;
+					if (lv.index + 1 == i) {
+						t = Type.getType(lv.desc);
+						break;
+					}
+				}
+			}
+
+			int idx = lvs.newLocal(t);
+			oldLVtoSandboxLV.put(i, idx);
+			newLVs.add(new LocalVariableNode("clone_" + i, t.getDescriptor(), null, null, null, idx));
+
+			load(i, t);
+			if (t.getSort() == Type.ARRAY || t.getSort() == Type.OBJECT)
+				cloneValAtTopOfStack(t.getDescriptor());
+			store(idx, t);
+		}
+	}
+
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/mvs/JUnitRunnerMV.java b/src/edu/columbia/cs/psl/vmvm/asm/mvs/JUnitRunnerMV.java
new file mode 100644
index 0000000..8e4cfbf
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/asm/mvs/JUnitRunnerMV.java
@@ -0,0 +1,68 @@
+package edu.columbia.cs.psl.vmvm.asm.mvs;
+
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.commons.AdviceAdapter;
+
+import com.sun.xml.internal.ws.org.objectweb.asm.Type;
+
+import edu.columbia.cs.psl.vmvm.VirtualRuntime;
+
+public class JUnitRunnerMV extends AdviceAdapter {
+	private String name;
+	private String className;
+
+	public JUnitRunnerMV(MethodVisitor mv, int access, String name, String desc, String className) {
+		super(Opcodes.ASM4, mv, access, name, desc);
+		this.name = name;
+		this.className = className;
+		if (name.equals("<init>") && className.equals("org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner"))
+			shouldResetInConstructor = true;
+	}
+
+	@Override
+	public void visitMethodInsn(int opcode, String owner, String name, String desc) {
+//		if (owner.equals("org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner") && name.equals("launch"))
+//		{
+//			super.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(VirtualRuntime.class), "resetStatics", "()V");
+//		}
+		super.visitMethodInsn(opcode, owner, name, desc);
+	}
+	@Override
+	public void visitCode() {
+//		if (className.equals("org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner") && this.name.equals("launch"))
+////			super.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(VirtualRuntime.class), "resetStatics", "()V");
+//		if(
+////				(this.className.equals("org/junit/runners/ParentRunner") && this.name.equals("run"))||(this.className.equals("junit/framework/TestSuite") && this.name.equals("run"))
+//	(this.className.equals("org/junit/framework/Test") && this.name.equals("<init>"))
+//		|| (this.className.equals("org/junit/framework/TestSuite") && this.name.equals("<init>"))
+//		|| (this.className.equals("junit/framework/JUnit4TestAdapter") && this.name.equals("<init>"))
+//				)
+//		{
+//			super.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(VirtualRuntime.class), "resetStatics", "()V");
+//////			ICONST_M1
+//////		    INVOKESTATIC java/lang/System.exit(I)V
+//////			super.visitInsn(ICONST_M1);
+//////			super.visitMethodInsn(INVOKESTATIC, "java/lang/System", "exit", "(I)V");
+//		}
+		super.visitCode();
+
+	}
+
+	private boolean shouldResetInConstructor = false;
+
+	@Override
+	protected void onMethodExit(int opcode) {
+//		if (shouldResetInConstructor)
+//			super.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(VirtualRuntime.class), "resetStatics", "()V");
+//		if(this.className.equals("org/apache/tools/ant/taskdefs/optional/junit/JUnitTask") && this.name.equals("executeInVM"))
+//		{
+//			System.out.println(this.className + "."+this.name);
+//			super.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(VirtualRuntime.class), "resetStatics", "()V");
+////			ICONST_M1
+////		    INVOKESTATIC java/lang/System.exit(I)V
+//			super.visitInsn(ICONST_M1);
+//			super.visitMethodInsn(INVOKESTATIC, "java/lang/System", "exit", "(I)V");
+//		}
+	}
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/mvs/LazyCloneInterceptingMethodVisitor.java b/src/edu/columbia/cs/psl/vmvm/asm/mvs/LazyCloneInterceptingMethodVisitor.java
new file mode 100644
index 0000000..ea6de89
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/asm/mvs/LazyCloneInterceptingMethodVisitor.java
@@ -0,0 +1,68 @@
+package edu.columbia.cs.psl.vmvm.asm.mvs;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.AdviceAdapter;
+
+import edu.columbia.cs.psl.vmvm.Constants;
+
+
+public class LazyCloneInterceptingMethodVisitor extends AdviceAdapter implements Constants {
+
+
+	protected LazyCloneInterceptingMethodVisitor(int api, MethodVisitor mv, int access,
+			String name, String desc) {
+		super(api, mv, access, name, desc);
+	}
+	boolean rewrite = false;
+
+	@Override
+	public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
+		return super.visitAnnotation(desc, visible);
+	}
+
+	@Override
+	public void visitFieldInsn(int opcode, String owner, String name,
+			String desc) {
+		if(!rewrite)
+		{
+			super.visitFieldInsn(opcode, owner, name, desc);
+			return;
+		}
+		if(opcode == GETFIELD && desc.length() > 1)
+		{
+			Label lblbForReadThrough = new Label();
+			Label lblForNextInsn = new Label();
+			dup();
+			super.visitFieldInsn(GETFIELD, owner, name+BEEN_CLONED_FIELD, Type.BOOLEAN_TYPE.getDescriptor());
+			super.visitJumpInsn(IFNE, lblbForReadThrough);
+			dup();
+			super.visitFieldInsn(GETFIELD, owner, CHILD_FIELD, Type.INT_TYPE.getDescriptor());
+			super.visitJumpInsn(IFEQ, lblbForReadThrough);
+
+			dup();
+			super.visitFieldInsn(opcode, owner, name, desc);
+			loadThis();
+			visitMethodInsn(INVOKESTATIC, "edu/columbia/cs/psl/invivo/runtime/COWAInterceptor", "readAndCOAIfNecessary",
+					"(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
+			checkCast(Type.getType(desc));
+			visitJumpInsn(GOTO, lblForNextInsn);
+
+			super.visitLabel(lblbForReadThrough);
+
+			super.visitFieldInsn(opcode, owner, name, desc);
+			super.visitLabel(lblForNextInsn);
+		}
+		else super.visitFieldInsn(opcode, owner, name, desc);
+	}
+
+	@Override
+	public void visitMaxs(int maxStack, int maxLocals) {
+		super.visitMaxs(maxStack, maxLocals);
+	}
+
+
+
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/mvs/ReflectionHackMV.java b/src/edu/columbia/cs/psl/vmvm/asm/mvs/ReflectionHackMV.java
new file mode 100644
index 0000000..2943fff
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/asm/mvs/ReflectionHackMV.java
@@ -0,0 +1,134 @@
+package edu.columbia.cs.psl.vmvm.asm.mvs;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.InstructionAdapter;
+
+
+import edu.columbia.cs.psl.vmvm.Constants;
+import edu.columbia.cs.psl.vmvm.FieldReflectionWrapper;
+import edu.columbia.cs.psl.vmvm.ReflectionWrapper;
+import edu.columbia.cs.psl.vmvm.VirtualRuntime;
+import edu.columbia.cs.psl.vmvm.asm.VMVMClassVisitor;
+
+public class ReflectionHackMV extends InstructionAdapter implements Opcodes {
+
+	private VMVMClassVisitor cv;
+    public ReflectionHackMV(int api, MethodVisitor mv, VMVMClassVisitor cv) {
+        super(api, mv);
+        this.cv = cv;
+    }
+    @Override
+    public void visitMethodInsn(int opcode, String owner, String name, String desc) {
+
+        if(Type.getInternalName(Class.class).equals(owner) && name.equals("getConstructors"))
+        {
+            super.visitMethodInsn(opcode, owner, name, desc);
+            super.visitMethodInsn(INVOKESTATIC, Type.getInternalName(VirtualRuntime.class), "hideVMVMConstructors", "([Ljava/lang/reflect/Constructor;)[Ljava/lang/reflect/Constructor;");
+        }
+        else if(Type.getInternalName(Class.class).equals(owner) && name.equals("newInstance"))
+        {
+//        	owner = Type.getInternalName(ReflectionWrapper.class);
+//        	opcode = INVOKESTATIC;
+            super.visitMethodInsn(INVOKESTATIC, Type.getInternalName(ReflectionWrapper.class), "preNewInstance", "(Ljava/lang/Class;)Ljava/lang/Class;");
+            super.visitMethodInsn(opcode, owner, name, desc);
+        }
+        else if((Type.getInternalName(Class.class).equals(owner) && name.equals("forName")))
+        {
+        	owner = Type.getInternalName(ReflectionWrapper.class);
+        	if(desc.contains("ClassLoader"))
+        		super.visitMethodInsn(opcode, owner, name, desc);
+        	else
+        	{
+        		if (cv.getVersion() > 48 && cv.getVersion() < 1000)// java 5+
+        			super.visitLdcInsn(Type.getType("L" + cv.getClassName() + ";"));
+        		else {
+        			super.visitLdcInsn(cv.getClassName().replace("/", "."));
+        			super.visitMethodInsn(INVOKESTATIC, "java/lang/Class", "forName", "(Ljava/lang/String;)Ljava/lang/Class;");
+        		}
+        	    super.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getClassLoader", "()Ljava/lang/ClassLoader;");
+        		super.visitMethodInsn(opcode, owner, name, desc.substring(0,desc.indexOf(")")) + Type.getDescriptor(ClassLoader.class)+ desc.substring(desc.indexOf(")")));
+        	}
+        }
+        else if((Type.getInternalName(Class.class).equals(owner) && (name.equals("getDeclaredFields") || name.equals("getDeclaredMethods") || name.equals("getFields") || name.equals("getMethods"))))
+        {
+        	desc = "("+Type.getDescriptor(Class.class)+")"+Type.getReturnType(desc).getDescriptor();
+            super.visitMethodInsn(INVOKESTATIC, Type.getInternalName(ReflectionWrapper.class), name,desc);
+        }
+        else if((Type.getInternalName(Method.class).equals(owner) && name.equals("invoke")))
+        {
+        	owner = Type.getInternalName(ReflectionWrapper.class);
+        	opcode = INVOKESTATIC;
+
+            super.visitMethodInsn(opcode, owner, name, "(Ljava/lang/reflect/Method;"+desc.substring(1));
+        }
+
+        else if((Type.getInternalName(Field.class).equals(owner) && (
+        		name.equals("getBoolean") ||
+        		name.equals("getByte") ||
+        		name.equals("getChar") ||
+        		name.equals("getDouble") ||
+        		name.equals("getFloat") ||
+        		name.equals("getInt") ||
+        		name.equals("getLong") ||
+        		name.equals("get")
+        		)))
+        {
+        	super.visitInsn(DUP_X1);
+            super.visitMethodInsn(INVOKESTATIC, Type.getInternalName(FieldReflectionWrapper.class), "tryToInit", "(Ljava/lang/reflect/Field;Ljava/lang/Object;)Ljava/lang/reflect/Field;");
+            super.visitInsn(SWAP);
+            super.visitMethodInsn(opcode, owner, name, desc);
+        }
+        else if(Type.getInternalName(Field.class).equals(owner) && (
+        		name.equals("setBoolean") ||
+        		name.equals("setByte") ||
+        		name.equals("setChar") ||
+        		name.equals("setDouble") ||
+        		name.equals("setFloat") ||
+        		name.equals("setInt") ||
+        		name.equals("setLong") ||
+        		name.equals("set") ))
+        {
+        	Type[] args = Type.getArgumentTypes(desc);
+        	String d2 = "(";
+        	for(Type t : args)
+        	{
+        		if(t.getSize()<2)
+        			d2 +=t.getDescriptor();
+        	}
+        	if(args.length == 2 && args[1].getSize() ==2)
+        	{
+        		super.visitInsn(DUP2_X2);
+            	super.visitInsn(POP2);
+            	super.visitInsn(SWAP);
+                super.visitMethodInsn(INVOKESTATIC, Type.getInternalName(FieldReflectionWrapper.class), "tryToInit", "(Ljava/lang/reflect/Field;)Ljava/lang/reflect/Field;");
+                super.visitInsn(SWAP);
+                super.visitInsn(DUP2_X2);
+                super.visitInsn(POP2);
+                super.visitMethodInsn(opcode, owner, name, desc);
+        	}
+        	else
+        	{
+            	super.visitInsn(DUP2_X1);
+            	super.visitInsn(POP2);
+                super.visitMethodInsn(INVOKESTATIC, Type.getInternalName(FieldReflectionWrapper.class), "tryToInit", "(Ljava/lang/reflect/Field;)Ljava/lang/reflect/Field;");
+                super.visitInsn(DUP_X2);
+                super.visitInsn(POP);
+                super.visitMethodInsn(opcode, owner, name, desc);
+
+        	}
+        }
+        else
+        {
+            super.visitMethodInsn(opcode, owner, name, desc);
+        }
+        //XXX TODO also need to handle invokestatic, getstatic, putstatic
+    }
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/mvs/SandboxPropogatingMV.java b/src/edu/columbia/cs/psl/vmvm/asm/mvs/SandboxPropogatingMV.java
new file mode 100644
index 0000000..7058544
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/asm/mvs/SandboxPropogatingMV.java
@@ -0,0 +1,321 @@
+package edu.columbia.cs.psl.vmvm.asm.mvs;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.AdviceAdapter;
+import org.objectweb.asm.commons.InstructionAdapter;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.AnnotationNode;
+import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.FieldInsnNode;
+import org.objectweb.asm.tree.FieldNode;
+import org.objectweb.asm.tree.InsnList;
+import org.objectweb.asm.tree.LocalVariableNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+
+import com.sun.media.jai.rmi.HashSetState;
+
+import edu.columbia.cs.psl.vmvm.Constants;
+import edu.columbia.cs.psl.vmvm.Instrumenter;
+import edu.columbia.cs.psl.vmvm.VirtualRuntime;
+import edu.columbia.cs.psl.vmvm.asm.InterceptingClassVisitor;
+import edu.columbia.cs.psl.vmvm.asm.VMVMClassVisitor;
+import edu.columbia.cs.psl.vmvm.asm.struct.EqFieldInsnNode;
+import edu.columbia.cs.psl.vmvm.asm.struct.MethodListClassNode;
+import edu.columbia.cs.psl.vmvm.Virtualizer;
+import edu.columbia.cs.psl.vmvm.VMState;
+
+/**
+ * This method visitor will make sure that all sandbox flags are propogated
+ *
+ * @author jon
+ *
+ */
+public class SandboxPropogatingMV extends InstructionAdapter implements Opcodes {
+
+	private InvivoAdapter invivoAdapter;
+	private String className;
+	private String name;
+	private String desc;
+	private VMVMClassVisitor icv;
+	private boolean methodTracksVMState = false;
+	public static int concurrentVMs = 0;
+	private MethodNode coveringMN;
+//	private static Logger logger = Logger.getLogger(SandboxPropogatingMV.class);
+	public static HashMap<Integer, HashSet<EqFieldInsnNode>> staticFieldsToClone = new HashMap<>();
+	public SandboxPropogatingMV(int api, MethodVisitor mv, int access, String name, String desc, String className, InvivoAdapter lvs, VMVMClassVisitor interceptingClassVisitor, MethodNode newM) {
+		//		super(api,mv,access,name,desc);
+		super(mv);
+		this.invivoAdapter = lvs;
+		this.className = className;
+		this.name = name;
+		this.desc = desc;
+		this.icv = interceptingClassVisitor;
+		this.coveringMN = newM;
+		numVMsThisMethod = 0;
+		methodTracksVMState = name.startsWith("_") && desc.contains(Type.getDescriptor(VMState.class));
+	}
+
+	@Override
+	public void visitInsn(int opcode) {
+		if (opcode == RETURN || opcode == ARETURN || opcode == IRETURN || opcode == LRETURN || opcode == FRETURN) {
+			if (concurrentVMs > 0) {
+				exitVM();
+			}
+		}
+		super.visitInsn(opcode);
+	}
+
+	private int sandboxVar = -1;
+
+	//	@Override
+	//	public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) {
+	//		if (index >= invivoAdapter.getFirstLocal() - 1 && invivoAdapter.isStaticMethod() && !invivoAdapter.isMain() && !name.equals("<clinit>"))
+	//			super.visitLocalVariable(name, desc, signature, start, end, index + 1);
+	//		else
+	//			super.visitLocalVariable(name, desc, signature, start, end, index);
+	//	}
+
+	@Override
+	public void visitCode() {
+		super.visitCode();
+
+		if (!name.equals("<init>"))
+			onMethodEnter();
+	}
+
+	private int sandboxNumInThisMethod = 0;;
+	protected void onMethodEnter() {
+		if (invivoAdapter.isStaticMethod()) {
+			if (invivoAdapter.isMain() || name.equals("<clinit>")) {
+				sandboxVar = invivoAdapter.newLocal(Type.getType(VMState.class));
+				invivoAdapter.setSandboxVar(sandboxVar);
+				super.visitMethodInsn(INVOKESTATIC, Type.getInternalName(VirtualRuntime.class), "getVMState", "()" + Type.getDescriptor(VMState.class));
+				invivoAdapter.setSandboxFlag();
+			}
+		} else {
+			//			if (name.equals("<init>")) {
+			//				visitVarInsn(ILOAD, invivoAdapter.getFirstLocal() - 1);
+			//				invivoAdapter.setSandboxFlag();
+			//			}
+		}
+	}
+
+	private boolean superInit = false;
+	private int vmStateVar;
+	//	private int clonedLocalsStart;
+
+
+	private void exitVM() {
+		concurrentVMs--;
+		super.visitVarInsn(ALOAD, vmStateVar);
+		super.visitInsn(DUP);
+		super.invokevirtual(Type.getInternalName(VMState.class), "deVM", "()V");
+		invivoAdapter.setSandboxFlag();
+
+		int n = numVMsThisMethod - concurrentVMs;
+		icv.addStaticCloneWrapper("cloneStatics_"+getCaptureMethodName(this.name, this.desc)+"_"+n, staticFieldsToClone.get(n));
+	}
+
+	@Override
+	public void visitVarInsn(int opcode, int var) {
+		if (concurrentVMs > 0 && var < vmStateVar)
+			super.visitVarInsn(opcode, invivoAdapter.getSboxLVMap(var));
+		else
+			super.visitVarInsn(opcode, var);
+	}
+	public static int numVMsThisMethod = 0;
+	public static String getCaptureMethodName(String name, String desc) {
+		return "_" + name.replace("<", "_").replace(">", "_") + "_"+Arrays.toString(Type.getArgumentTypes(desc)).replace("[", "_").replace("]","").replace(";", "").replace("/", "_").replace(", ","");
+	}
+	HashMap<String, HashSet<EqFieldInsnNode>> staticsCache = new HashMap<>();
+	HashSet<String> staticsInProgress = new HashSet<>();
+	private HashSet<EqFieldInsnNode> collectStaticsForMethod(String owner, String name, String desc)
+	{
+		HashSet<EqFieldInsnNode> ret = staticsCache.get(owner+"."+name+desc);
+		if(ret != null)
+			return ret;
+//		logger.info(this.name+">>>"+owner + "" + name+desc);
+
+		if(staticsInProgress.contains(owner))
+			return new HashSet<>();
+		staticsInProgress.add(owner);
+		ret = new HashSet<>();
+
+		if(Instrumenter.superToSubClass.containsKey(owner))
+		{
+			for(String s : Instrumenter.superToSubClass.get(owner))
+			{
+				ret.addAll(collectStaticsForMethod(s, name, desc));
+			}
+		}
+		MethodNode mn = Instrumenter.getMethodNode(owner, name, desc);
+		if(mn != null)
+		{
+			Iterator<?> iter = mn.instructions.iterator();
+			while(iter.hasNext())
+			{
+				AbstractInsnNode in = (AbstractInsnNode) iter.next();
+				if(in.getType() == AbstractInsnNode.METHOD_INSN)
+				{
+					MethodInsnNode min = (MethodInsnNode) in;
+					ret.addAll(collectStaticsForMethod(min.owner,min.name,min.desc));
+				}
+				else
+				{
+					FieldInsnNode fin = (FieldInsnNode) in;
+					if(Instrumenter.instrumentedClasses.containsKey(fin.owner))
+						ret.add(new EqFieldInsnNode(Opcodes.GETSTATIC, fin.owner, fin.name, fin.desc));
+				}
+			}
+		}
+		staticsInProgress.remove(owner);
+		staticsCache.put(owner+"."+name+desc, ret);
+		return ret;
+	}
+	@Override
+	public void visitFieldInsn(int opcode, String owner, String name, String desc) {
+		owner = Instrumenter.remapInterface(owner);
+		super.visitFieldInsn(opcode, owner, name, desc);
+	}
+	@Override
+	public void visitMethodInsn(int opcode, String owner, String name, String desc) {
+		boolean ignore = name.startsWith("_") && desc.contains(Type.getDescriptor(VMState.class));
+
+		owner = Instrumenter.remapInterface(owner);
+		if (owner.equals(Type.getInternalName(Virtualizer.class)) && name.equals("execInVM")) {
+			concurrentVMs++;
+			numVMsThisMethod++;
+//			System.out.println("Seeing execinvm " + concurrentVMs);
+			staticFieldsToClone.put(concurrentVMs, new HashSet<EqFieldInsnNode>());
+			vmStateVar = invivoAdapter.newLocal(Type.getType(VirtualRuntime.class));
+			invivoAdapter.cloneLocals(vmStateVar);
+
+
+			super.invokestatic(Type.getInternalName(VirtualRuntime.class), "setVMed", "()" + Type.getDescriptor(VMState.class));
+			super.visitInsn(DUP);
+			super.visitVarInsn(ASTORE, vmStateVar);
+
+			invivoAdapter.setSandboxFlag();
+
+			invivoAdapter.getSandboxFlag();
+//			System.out.println("cloneStatics_"+this.name+getCaptureMethodName(this.name, this.desc)+"_"+numVMsThisMethod);
+			super.invokestatic(this.className, "cloneStatics_"+this.name.replace("<", "").replace(">", "")+getCaptureMethodName(this.name, this.desc)+"_"+numVMsThisMethod, "(I)V");
+			return;
+		} else if (owner.equals(Type.getInternalName(Virtualizer.class)) && name.equals("exitVM")) {
+			exitVM();
+			return;
+		} else if (opcode == INVOKESPECIAL && owner.equals(Type.getInternalName(Thread.class)) && name.equals("<init>")) {
+			super.visitMethodInsn(opcode, owner, name, desc);
+			if(Instrumenter.atLeastASuperEq(this.className, "java/lang/Thread",0) && this.name.equals("<init>")) //It's a super call
+			{
+				super.visitVarInsn(ALOAD, 0);
+			}
+			else
+			{
+				super.visitInsn(DUP);
+			}
+			super.visitMethodInsn(INVOKEVIRTUAL, Type.getInternalName(Thread.class), "getId", "()J");
+			super.visitMethodInsn(INVOKESTATIC, Type.getInternalName(VirtualRuntime.class), "setVMed", "(J)V");
+
+			return;
+		}
+		//TODO i removed this because i don't think it did anything.
+		if(concurrentVMs > 0)
+		{
+			//If we are currently sandboxed, then collect all of the statics that are accessed by the method we are about to call
+			HashSet<EqFieldInsnNode> staticsUsedThisMethod = collectStaticsForMethod(owner, name, desc);
+			if(owner.equals(Type.getInternalName(Thread.class)) && name.equals("start"))
+				staticsUsedThisMethod.addAll(collectStaticsForMethod(owner, "run", "()V"));
+			for(int i = (SandboxPropogatingMV.numVMsThisMethod - SandboxPropogatingMV.concurrentVMs) + 1; i <= SandboxPropogatingMV.numVMsThisMethod;i++)
+			{
+				SandboxPropogatingMV.staticFieldsToClone.get(i).addAll(staticsUsedThisMethod);
+			}
+		}
+		MethodListClassNode cn = Instrumenter.instrumentedClasses.get(owner);
+//		if(name.equals("startEntity"))
+//		{
+//			System.err.println(">>"+owner + "."+name +desc);
+//		}
+		if (cn != null && !ignore && !InterceptingClassVisitor.shouldIgnoreClass(owner) && cn.containsMethod(name, desc) &&
+					(cn.getMethod(name, desc).access & Opcodes.ACC_NATIVE) != Opcodes.ACC_NATIVE) {
+//			if(name.equals("startEntity"))
+//			{
+//				System.err.println("^^^^changing to _");
+//			}
+			//Need to call the modified method - which takes a short arg; the current sandbox state
+			Type[] args = Type.getArgumentTypes(desc);
+			Type[] descTypes = new Type[args.length + 1];
+			System.arraycopy(args, 0, descTypes, 0, args.length);
+			descTypes[args.length] = Type.getType(VMState.class);
+			desc = Type.getMethodDescriptor(Type.getReturnType(desc), descTypes);
+			invivoAdapter.getSandboxFlagState();
+			if(!"<init>".equals(name) && !"<clinit>".equals(name))
+				name = "_"+name;
+			//				if(sandboxNextMethodInsn)
+			//				{
+			//					if(opcode != Opcodes.INVOKESTATIC)
+			//					{
+			//						//Dup the top object, make sure that it has the correct sandbox id
+			//						icv.addSandboxMethodToGen(new EqMethodInsnNode(opcode, owner, name, desc));
+			//						name = "sandbox_"+owner.replace("/", "_")+"_"+name;
+			//						opcode = INVOKESTATIC;
+			//
+			//						Type[] descTypes2 = new Type[descTypes.length + 1];
+			//						System.arraycopy(descTypes, 0, descTypes2, 1, descTypes.length);
+			//						descTypes2[0] = Type.getType("L"+owner+";");
+			//						desc = Type.getMethodDescriptor(Type.getReturnType(desc), descTypes2);
+			//					}
+			//				}
+		}
+
+		super.visitMethodInsn(opcode, owner, name, desc);
+
+		if (this.name.equals("<init>") && !superInit && opcode == INVOKESPECIAL)
+			onMethodEnter();
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
+		final AnnotationNode an = new AnnotationNode(desc);
+		if(coveringMN != null)
+			if(visible)
+				coveringMN.visibleAnnotations.add(an);
+			else
+				coveringMN.invisibleAnnotations.add(an);
+		return new AnnotationVisitor(Opcodes.ASM4) {
+			@Override
+			public void visit(String name, Object value) {
+				an.visit(name, value);
+			}
+			@Override
+			public AnnotationVisitor visitAnnotation(String name, String desc) {
+				return an.visitAnnotation(name, desc);
+			}
+			@Override
+			public AnnotationVisitor visitArray(String name) {
+				return an.visitArray(name);
+			}
+			@Override
+			public void visitEnd() {
+				an.visitEnd();
+			}
+			@Override
+			public void visitEnum(String name, String desc, String value) {
+				an.visitEnum(name, desc, value);
+			}
+		};
+	}
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/mvs/StaticFieldIsolatorMV.java b/src/edu/columbia/cs/psl/vmvm/asm/mvs/StaticFieldIsolatorMV.java
new file mode 100644
index 0000000..a14b96c
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/asm/mvs/StaticFieldIsolatorMV.java
@@ -0,0 +1,353 @@
+package edu.columbia.cs.psl.vmvm.asm.mvs;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.InstructionAdapter;
+import org.objectweb.asm.commons.LocalVariablesSorter;
+import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.FieldInsnNode;
+import org.objectweb.asm.tree.FieldNode;
+
+import edu.columbia.cs.psl.vmvm.CloningUtils;
+import edu.columbia.cs.psl.vmvm.Constants;
+import edu.columbia.cs.psl.vmvm.Instrumenter;
+import edu.columbia.cs.psl.vmvm.VirtualRuntime;
+import edu.columbia.cs.psl.vmvm.VMState;
+import edu.columbia.cs.psl.vmvm.asm.JUnitResettingClassVisitor;
+import edu.columbia.cs.psl.vmvm.asm.VMVMClassVisitor;
+import edu.columbia.cs.psl.vmvm.asm.struct.EqFieldInsnNode;
+import edu.columbia.cs.psl.vmvm.asm.struct.EqMethodInsnNode;
+import edu.columbia.cs.psl.vmvm.asm.struct.EqMethodNode;
+import edu.columbia.cs.psl.vmvm.asm.struct.MethodListClassNode;
+
+public class StaticFieldIsolatorMV extends CloningAdapter implements Opcodes {
+
+	private String name;
+	private VMVMClassVisitor cv;
+	public static final boolean CLINIT_ORDER_DEBUG =false;
+	private EqMethodNode thisMN;
+	private LocalVariablesSorter lvs;
+	private boolean isStaticMethod;
+	public StaticFieldIsolatorMV(MethodVisitor mv, int access, String name, String desc, VMVMClassVisitor cv, EqMethodNode thisMN) {
+		super(mv);
+		this.name = name;
+		this.cv = cv;
+		this.thisMN = thisMN;
+		this.isStaticMethod = (access & Opcodes.ACC_STATIC) != 0;
+	}
+	public void setLvs(LocalVariablesSorter lvs) {
+		this.lvs = lvs;
+	}
+
+	Label l0 = new Label();
+	Label l1 = new Label();
+	Label l2 = new Label();
+	@Override
+	public void visitCode() {
+
+
+		if (this.name.equals("<clinit>") || this.name.equals(Constants.VMVM_STATIC_RESET_METHOD)) {
+			super.visitCode();
+
+//			super.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception");
+//			super.visitLabel(l0);
+			/*
+			 * LDC "edu.columbia.cs.psl.test.SerializeTest" INVOKESTATIC
+			 * java/lang/Class.forName(Ljava/lang/String;)Ljava/lang/Class;
+			 */
+			if(cv != null && Instrumenter.getClassNode(cv.getClassName()) != null)
+			{
+			String superz = Instrumenter.getClassNode(cv.getClassName()).superName;
+			if (!superz.equals("java/lang/Object")) {
+				MethodListClassNode superN = Instrumenter.instrumentedClasses.get(superz);
+				if (superN != null && superN.hasClinit) {
+					Label continu = new Label();
+					super.visitFieldInsn(GETSTATIC, superz, Constants.VMVM_NEEDS_RESET, "Z");
+					super.visitJumpInsn(IFEQ, continu);
+					super.visitMethodInsn(INVOKESTATIC, superz, Constants.VMVM_STATIC_RESET_METHOD, "()V");
+					super.visitLabel(continu);
+
+				}
+			}
+			}
+			String classToRegister = cv.getClassName();
+			if (!cv.isAClass())
+				classToRegister = classToRegister + "$vmvmReseter";
+			super.visitInsn(ICONST_0);
+			super.visitFieldInsn(PUTSTATIC, classToRegister, Constants.VMVM_NEEDS_RESET, "Z");
+
+			if (cv.getVersion() > 48 && cv.getVersion() < 1000)// java 5+
+				super.visitLdcInsn(Type.getType("L" + classToRegister + ";"));
+			else {
+				super.visitLdcInsn(classToRegister.replace("/", "."));
+				super.visitMethodInsn(INVOKESTATIC, "java/lang/Class", "forName", "(Ljava/lang/String;)Ljava/lang/Class;");
+			}
+			super.visitMethodInsn(INVOKESTATIC, Type.getInternalName(VirtualRuntime.class), "registerClInit", "(Ljava/lang/Class;)V");
+
+			if (CLINIT_ORDER_DEBUG) {
+				super.visitFieldInsn(GETSTATIC, "java/lang/System", "err", "Ljava/io/PrintStream;");
+				super.visitLdcInsn("clinit  rerunning>" + cv.getClassName());
+				super.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
+				if (cv.getClassName().endsWith("ivy/Ivy") || cv.getClassName().endsWith("ivy/util/FileUtil")) {
+					super.visitTypeInsn(NEW, "java/lang/Exception");
+					super.visitInsn(DUP);
+					super.visitMethodInsn(INVOKESPECIAL, "java/lang/Exception", "<init>", "()V");
+					super.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Exception", "printStackTrace", "()V");
+				}
+			}
+
+			String className = cv.getClassName();
+
+			for (Object o : Instrumenter.getClassNode(className).fields) {
+				FieldNode fn = (FieldNode) o;
+				if ((fn.access & Opcodes.ACC_STATIC) == 0 || ((fn.access & Opcodes.ACC_ENUM) != 0 && (fn.access & Opcodes.ACC_FINAL) != 0) || (fn.name.contains("$VALUES") && cv.isEnum()))
+					continue;
+				if(cv.getClassName().endsWith("DetectorFactoryCollection"))
+				{
+//					System.err.println(fn.access + (fn.access ));
+					System.err.println(fn.name + " is " + fn.access);
+
+				}
+				if(fn.name.equals("$VRc"))
+					continue;
+				if (fn.value != null) {
+					super.visitLdcInsn(fn.value);
+					super.visitFieldInsn(PUTSTATIC, className, fn.name, fn.desc);
+				} else {
+					switch (Type.getType(fn.desc).getSort()) {
+					case Type.OBJECT:
+					case Type.ARRAY:
+						super.visitInsn(ACONST_NULL);
+						break;
+					case Type.DOUBLE:
+						super.visitInsn(DCONST_0);
+						break;
+					case Type.LONG:
+						super.visitInsn(ICONST_0);
+						super.visitInsn(I2L);
+						break;
+					case Type.FLOAT:
+						super.visitInsn(FCONST_0);
+						break;
+					default:
+						super.visitInsn(ICONST_0);
+						break;
+					}
+					super.visitFieldInsn(PUTSTATIC, className, fn.name, fn.desc);
+				}
+			}
+
+		}
+	}
+
+	private HashSet<EqFieldInsnNode> staticFieldsToClone = new HashSet<EqFieldInsnNode>();
+
+	private int getFieldAcc(String name, String owner) {
+		ClassNode cn = Instrumenter.instrumentedClasses.get(owner);
+		if (cn == null) {
+			return -1;
+		}
+
+		int acc = -1;
+		for (Object o : cn.fields) {
+			FieldNode fn = (FieldNode) o;
+			if (fn.name.equals(name))
+				return fn.access;
+		}
+		acc = getFieldAcc(name, cn.superName);
+		if (acc == -1) {
+			for (Object o : cn.interfaces) {
+				String s = (String) o;
+				acc = getFieldAcc(name, s);
+				if (acc != -1) {
+					return acc;
+				}
+			}
+		} else {
+			return acc;
+		}
+		// System.out.println("Can't get field acc for " + owner+"."+name);
+		return -1;
+	}
+
+	@Override
+	public void visitTypeInsn(int opcode, String type) {
+		String _type = type.replace("[", "");
+		MethodListClassNode cn = Instrumenter.instrumentedClasses.get(_type);
+		if (cn != null && cn.hasClinit && opcode == NEW) {
+			String classToCheckReset = cn.name;
+			if ((cn.access & Opcodes.ACC_INTERFACE) != 0)
+				classToCheckReset += "$vmvmReseter";
+			checkAndReinit(classToCheckReset);
+		}
+		super.visitTypeInsn(opcode, type);
+	}
+
+	@Override
+	public void visitMethodInsn(int opcode, String owner, String name, String desc) {
+		MethodListClassNode cn = Instrumenter.getClassNodeWithMethod(owner, name, desc);
+		if (cn == null)
+			cn = Instrumenter.instrumentedClasses.get(owner);
+
+		if (cn != null && cn.hasClinit && opcode == INVOKESTATIC) {
+			String classToCheckReset = cn.name;
+			if ((cn.access & Opcodes.ACC_INTERFACE) != 0)
+				classToCheckReset += "$vmvmReseter";
+			checkAndReinit(classToCheckReset);
+		}
+		super.visitMethodInsn(opcode, owner, name, desc);
+	}
+
+	public void checkAndReinit(String clazz) {
+		if (clazz.equals(cv.getClassName()) && isStaticMethod) //no need to check to init if we are already executing code in this class!
+			return;
+		if (this.thisMN != null && this.thisMN.ignoredInitCalls != null && this.thisMN.ignoredInitCalls.contains(counter.getCount())) {
+//			System.out.println("Ignoring reinit of " + clazz + " in " + this.cv.getClassName() + "." + this.name + " (prev in this method) at " + counter.getCount());
+			return;
+		}
+		if (this.thisMN != null && this.thisMN.typesToIgnoreInit != null && this.thisMN.typesToIgnoreInit.contains(clazz)) {
+//			System.out.println("Ignoring reinit of " + clazz + " in " + this.cv.getClassName() + "." + this.name + "(from prev methods in CG) at " + counter.getCount());
+//			return;
+		}
+		if(JUnitResettingClassVisitor.shouldIgnoreClass(clazz))
+			return;
+		super.visitFieldInsn(GETSTATIC, clazz, Constants.VMVM_NEEDS_RESET, "Z"); //Need to force to make sure that this is initialized before we can get a lock on it.
+		super.visitInsn(POP);
+
+		Label continu = new Label();
+			if(CLINIT_ORDER_DEBUG)
+			{
+				super.visitFieldInsn(GETSTATIC, "java/lang/System", "err", "Ljava/io/PrintStream;");
+				super.visitLdcInsn("clinit going to check "+clazz+" > in " + cv.getClassName());
+			super.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
+			}
+		if (cv.getVersion() > 48 && cv.getVersion() < 1000)// java 5+
+			super.visitLdcInsn(Type.getType("L" + clazz + ";"));
+		else {
+			super.visitLdcInsn(clazz.replace("/", "."));
+			super.visitInsn(ICONST_0);
+			super.visitLdcInsn(cv.getClassName().replace("/", "."));
+			super.visitMethodInsn(INVOKESTATIC, "java/lang/Class", "forName", "(Ljava/lang/String;)Ljava/lang/Class;");
+			super.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getClassLoader", "()Ljava/lang/ClassLoader;");
+			super.visitMethodInsn(INVOKESTATIC, "java/lang/Class", "forName", "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;");
+		}
+		if(CLINIT_ORDER_DEBUG)
+		{
+			super.visitInsn(DUP);
+			super.visitMethodInsn(Opcodes.INVOKEVIRTUAL, Type.getInternalName(Class.class), "toString", "()Ljava/lang/String;");
+			super.visitFieldInsn(GETSTATIC, "java/lang/System", "err", "Ljava/io/PrintStream;");
+			super.visitInsn(SWAP);
+		super.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
+		}
+		super.visitInsn(DUP);
+		super.monitorenter();
+		super.visitFieldInsn(GETSTATIC, clazz, Constants.VMVM_NEEDS_RESET, "Z"); //must be on a class, not an interface b/c final bs
+		super.visitJumpInsn(IFEQ, continu);
+		super.visitInsn(ICONST_0);
+		super.visitFieldInsn(PUTSTATIC, clazz, Constants.VMVM_NEEDS_RESET, "Z"); //must be on a class, not an interface b/c final bs
+		super.monitorexit();
+		Label end = new Label();
+		super.visitMethodInsn(INVOKESTATIC, clazz, Constants.VMVM_STATIC_RESET_METHOD, "()V");
+		super.visitJumpInsn(GOTO, end);
+		super.visitLabel(continu);
+		super.monitorexit();
+		super.visitLabel(end);
+	}
+
+	@Override
+	public void visitFieldInsn(int opcode, String owner, String name, String desc) {
+		MethodListClassNode cn = Instrumenter.getClassNodeWithField(owner, name);
+		if (cn == null)
+			cn = Instrumenter.instrumentedClasses.get(owner);
+
+		if (cn != null && cn.hasClinit && (opcode == GETSTATIC || opcode == PUTSTATIC)) {
+			String classToCheckReset = cn.name;
+			if ((cn.access & Opcodes.ACC_INTERFACE) != 0)
+				classToCheckReset += "$vmvmReseter";
+			checkAndReinit(classToCheckReset);
+		}
+		if (opcode == PUTSTATIC) {
+			FieldNode fn = Instrumenter.getFieldNode(owner, name);
+			if (fn != null)
+				if (fn != null && cn != null && fn.name != null && (fn.access & Opcodes.ACC_ENUM) != 0
+						&& ((fn.access & Opcodes.ACC_FINAL) != 0 || (fn.name.endsWith("$VALUES") && (cn.access & Opcodes.ACC_ENUM) != 0))) {
+					super.visitFieldInsn(GETSTATIC, owner, name, desc);
+					Label continu = new Label();
+					Label doLoad = new Label();
+					super.visitJumpInsn(IFNULL, doLoad);
+					super.visitInsn(POP);
+					super.visitJumpInsn(GOTO, continu);
+					super.visitLabel(doLoad);
+					super.visitFieldInsn(opcode, owner, name, desc);
+					super.visitLabel(continu);
+					return;
+				}
+		}
+		super.visitFieldInsn(opcode, owner, name, desc);
+	}
+
+	@Override
+	public void visitInsn(int opcode) {
+		if (CLINIT_ORDER_DEBUG && opcode == Opcodes.RETURN && this.name.equals(Constants.VMVM_STATIC_RESET_METHOD) && this.cv.isAClass()) {
+			super.visitFieldInsn(GETSTATIC, "java/lang/System", "err", "Ljava/io/PrintStream;");
+			super.visitLdcInsn("clinit finished rerunning>" + cv.getClassName());
+			super.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
+		}
+		//		if (opcode == Opcodes.RETURN && this.name.equals("<clinit>") && this.cv.isAClass()) {
+		//			for (EqFieldInsnNode fin : Instrumenter.getFieldsEffectedBy(cv.getClassName(), "<clinit>", "()V")) {
+		//				ClassNode owner = Instrumenter.getClassNode(fin.owner);
+		//				if((owner.access & Opcodes.ACC_ENUM) != 0 || (owner.access & Opcodes.ACC_INTERFACE) != 0)
+		//					continue;
+		//				int acc = getFieldAcc(fin.name, fin.owner);
+		//				acc = acc & ~Opcodes.ACC_FINAL;
+		//				staticFieldsToClone.add(new EqFieldInsnNode(fin.getOpcode(), fin.owner, fin.name, fin.desc, (acc & Opcodes.ACC_FINAL) != 0));
+		////				super.visitFieldInsn(GETSTATIC, fin.owner, fin.name + Constants.BEEN_CLONED_FIELD, "Z");
+		////				Label continu = new Label();
+		////				super.visitJumpInsn(IFEQ, continu);
+		//
+		//				super.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;");
+		//				super.visitLdcInsn("static Cloning>" + fin.owner + "." + fin.name + " " + fin.desc);
+		//				super.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V");
+		//				super.visitFieldInsn(GETSTATIC, fin.owner, fin.name, fin.desc);
+		//				cloneValAtTopOfStack(fin.desc, fin.owner + "." + fin.name + fin.desc + " at " + cv.getClassName() + "." + this.name, false);
+		//				super.visitFieldInsn(PUTSTATIC, fin.owner, fin.name + Constants.SANDBOX_SUFFIX, fin.desc);
+		//				super.visitInsn(ICONST_1);
+		//				super.visitFieldInsn(PUTSTATIC, fin.owner, fin.name + Constants.BEEN_CLONED_FIELD, "Z");
+		////				super.visitLabel(continu);
+		//			}
+		//		}
+		super.visitInsn(opcode);
+	}
+
+	@Override
+	public void visitEnd() {
+//		if (this.name.equals("<clinit>") || this.name.equals(Constants.VMVM_STATIC_RESET_METHOD)) {
+//
+//		super.visitLabel(l1);
+//		Label l3 = new Label();
+//		super.visitJumpInsn(GOTO, l3);
+//		super.visitLabel(l2);
+//		super.visitFrame(Opcodes.F_SAME1, 0,null, 1, new Object[] {"java/lang/Exception"});
+//		int n = lvs.newLocal(Type.getType(Exception.class));
+//		super.visitVarInsn(ASTORE, n);
+//		super.visitVarInsn(ALOAD, n);
+//		super.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Exception", "printStackTrace", "()V");
+//		super.visitLabel(l3);
+//		}
+		super.visitEnd();
+		cv.addStaticFieldsToClone(staticFieldsToClone);
+	}
+
+	private InsnCountingMV counter;
+
+	public void setCounter(InsnCountingMV counter) {
+		this.counter = counter;
+	}
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/mvs/StaticFinalMutibleizer.java b/src/edu/columbia/cs/psl/vmvm/asm/mvs/StaticFinalMutibleizer.java
new file mode 100644
index 0000000..b77540e
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/asm/mvs/StaticFinalMutibleizer.java
@@ -0,0 +1,92 @@
+package edu.columbia.cs.psl.vmvm.asm.mvs;
+
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.GeneratorAdapter;
+import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.FieldNode;
+
+import edu.columbia.cs.psl.vmvm.Constants;
+import edu.columbia.cs.psl.vmvm.Instrumenter;
+import edu.columbia.cs.psl.vmvm.struct.MutableInstance;
+
+public class StaticFinalMutibleizer extends GeneratorAdapter implements Opcodes {
+	private String mName;
+	private String className;
+
+	public StaticFinalMutibleizer(MethodVisitor mv, int access, String className, String name, String desc) {
+		super(mv, access, name, desc);
+		this.mName = name;
+		this.className = className;
+	}
+	private boolean isFinalField(String owner, String name)
+	{
+		if(name.equals(Constants.VMVM_NEEDS_RESET))
+			return false;
+		if(Instrumenter.mutablizedFields.containsKey(owner + "." + name))
+			return true;
+		ClassNode owningNode = Instrumenter.getClassNodeWithField(owner,name);
+		if(owningNode == null)
+			return false;
+		else if((owningNode.access & Opcodes.ACC_INTERFACE) != 0){
+			FieldNode fn = Instrumenter.getFieldNode(owner, name);
+			if(fn.value == null)
+				return true;
+			return false;
+		}
+		return false;
+	}
+	@Override
+	public void visitFieldInsn(int opcode, String owner, String name, String desc) {
+		if ((opcode == GETSTATIC || opcode == PUTSTATIC) && isFinalField(owner,name)) {
+			Type originalType = Type.getType(desc);
+			if (opcode == GETSTATIC) {
+				super.visitFieldInsn(opcode, owner, name, Type.getDescriptor(MutableInstance.class));
+				super.visitMethodInsn(INVOKEVIRTUAL, Type.getInternalName(MutableInstance.class), "get", "()Ljava/lang/Object;");
+				if (originalType.getSort() == Type.OBJECT || originalType.getSort() == Type.ARRAY) {
+					super.visitTypeInsn(CHECKCAST, originalType.getInternalName());
+				} else//primitive needs to be cast to the boxed type then unboxed
+				{
+					String checkCastTo = null;
+					switch (originalType.getSort()) {
+					case Type.BYTE:
+						checkCastTo = Type.getInternalName(Byte.class);
+						break;
+					case Type.BOOLEAN:
+						checkCastTo = Type.getInternalName(Boolean.class);
+						break;
+					case Type.SHORT:
+						checkCastTo = Type.getInternalName(Short.class);
+						break;
+					case Type.CHAR:
+						checkCastTo = Type.getInternalName(Character.class);
+						break;
+					case Type.INT:
+						checkCastTo = Type.getInternalName(Integer.class);
+						break;
+					case Type.FLOAT:
+						checkCastTo = Type.getInternalName(Float.class);
+						break;
+					case Type.LONG:
+						checkCastTo = Type.getInternalName(Long.class);
+						break;
+					case Type.DOUBLE:
+						checkCastTo = Type.getInternalName(Double.class);
+						break;
+					}
+					super.visitTypeInsn(CHECKCAST, checkCastTo);
+					unbox(originalType);
+				}
+			} else {
+				if (!(originalType.getSort() == Type.OBJECT || originalType.getSort() == Type.ARRAY)) {
+					super.box(originalType);
+				}
+				super.visitFieldInsn(GETSTATIC, owner, name, Type.getDescriptor(MutableInstance.class));
+				super.visitInsn(SWAP);
+				super.visitMethodInsn(INVOKEVIRTUAL, Type.getInternalName(MutableInstance.class), "put", "(Ljava/lang/Object;)V");
+			}
+		} else
+			super.visitFieldInsn(opcode, owner, name, desc);
+	}
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/mvs/SystemPropertyLogger.java b/src/edu/columbia/cs/psl/vmvm/asm/mvs/SystemPropertyLogger.java
new file mode 100644
index 0000000..9a177e4
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/asm/mvs/SystemPropertyLogger.java
@@ -0,0 +1,152 @@
+package edu.columbia.cs.psl.vmvm.asm.mvs;
+
+import java.lang.ref.WeakReference;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.Scanner;
+
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.GeneratorAdapter;
+import org.objectweb.asm.commons.InstructionAdapter;
+
+import com.sun.org.apache.bcel.internal.generic.INVOKEVIRTUAL;
+import com.sun.xml.internal.ws.org.objectweb.asm.Opcodes;
+
+import edu.columbia.cs.psl.vmvm.VirtualRuntime;
+
+public class SystemPropertyLogger extends GeneratorAdapter {
+
+
+	public SystemPropertyLogger(final int api, final MethodVisitor mv,
+            final int access, final String name, final String desc) {
+		super(api,mv,access,name,desc);
+	}
+	public static void main(String[] args)
+	{
+		for(String clazz : VirtualRuntime.internalStatics.keySet())
+			{
+			VirtualRuntime.InternalStaticClass c = VirtualRuntime.internalStatics.get(clazz);
+				for(String s : c.setMethods.keySet())
+				{
+					String fullSetMethod = clazz.replace("/", ".")+"."+s;
+					String castType = "";
+					try {
+						Class cl = Class.forName(clazz.replace("/", "."));
+						for(Method m : cl.getMethods())
+						{
+							if(m.getName().equals(s) && m.getParameterTypes().length == 1)
+							{
+								castType = m.getParameterTypes()[0].getCanonicalName();
+							}
+						}
+					} catch (ClassNotFoundException e) {
+						// TODO Auto-generated catch block
+						e.printStackTrace();
+					}
+					System.out.println("if(logsUsed["+c.setMethods.get(s)+"]){try{");
+					System.out.println(fullSetMethod+"(("+castType+")loggedValues["+c.setMethods.get(s)+"]);}catch(Exception ex){ex.printStackTrace();}logsUsed["+c.setMethods.get(s)+"]=false;loggedValues["+c.setMethods.get(s)+"]=null;");
+					System.out.println("}");
+				}
+
+//				for(String s : c.addMethods.keySet())
+//				{
+//					String fullSetMethod = clazz.replace("/", ".")+"."+s.replace("add", "remove");
+//					String castType = "";
+//					try {
+//						Class cl = Class.forName(clazz.replace("/", "."));
+//						for(Method m : cl.getMethods())
+//						{
+//							if(m.getName().equals(s) && m.getParameterTypes().length == 1)
+//							{
+//								castType = m.getParameterTypes()[0].getCanonicalName();
+//							}
+//						}
+//					} catch (ClassNotFoundException e) {
+//						// TODO Auto-generated catch block
+//						e.printStackTrace();
+//					}
+//					System.out.println("if(logsUsed["+c.addMethods.get(s)+"]){");
+//					System.out.println("for(WeakReference<Object> o : (LinkedList<WeakReference<Object>>) loggedValues["+c.addMethods.get(s)+"])");
+//					System.out.println("if(!o.isEnqueued()) "+fullSetMethod+"(("+castType+")o.get());");
+//					System.out.println("loggedValues["+c.addMethods.get(s)+"]=null;logsUsed["+c.addMethods.get(s)+"]=false;}");
+//				}
+//
+//
+//				for(String s : c.removeMethods.keySet())
+//				{
+//					String fullSetMethod = clazz.replace("/", ".")+"."+s.replace("remove", "add");
+//					String castType = "";
+//					try {
+//						Class cl = Class.forName(clazz.replace("/", "."));
+//						for(Method m : cl.getMethods())
+//						{
+//							if(m.getName().equals(s) && m.getParameterTypes().length == 1)
+//							{
+//								castType = m.getParameterTypes()[0].getCanonicalName();
+//							}
+//						}
+//					} catch (ClassNotFoundException e) {
+//						// TODO Auto-generated catch block
+//						e.printStackTrace();
+//					}
+//					System.out.println("if(logsUsed["+c.removeMethods.get(s)+"]){");
+//					System.out.println("for(Object o : (LinkedList<Object>) loggedValues["+c.removeMethods.get(s)+"])");
+//					System.out.println(fullSetMethod+"(("+castType+")o);");
+//					System.out.println("loggedValues["+c.removeMethods.get(s)+"]=null;logsUsed["+c.removeMethods.get(s)+"]=false;}");
+//				}
+			}
+	}
+	@Override
+	public void visitMethodInsn(int opcode, String owner, String name,
+			String desc) {
+
+		if((owner.equals("java/lang/System") && name.equals("setProperty") && desc.equals("(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"))
+				|| (owner.equals("java/lang/System") && name.equals("setProperties") && desc.equals("(Ljava/util/Properties;)V")))
+		{
+			owner = Type.getInternalName(VirtualRuntime.class);
+			name = "logAndSetProperty";
+		}
+		else if(VirtualRuntime.internalStatics.containsKey(owner))
+		{
+			Type[] args =Type.getArgumentTypes(desc);
+			VirtualRuntime.InternalStaticClass clazz = VirtualRuntime.internalStatics.get(owner);
+			if(clazz.setMethods.keySet().contains(name) && args.length == 1)
+			{
+				//insert a fake get
+				String newName = name.replace("set", "get");
+				if(owner.equals("javax/swing/JDialog") || owner.equals("javax/swing/JFrame"))
+					newName = name.replace("set", "is");
+				super.visitMethodInsn(opcode, owner, newName, Type.getMethodDescriptor(args[0]));
+				//Do the log
+				super.visitIntInsn(Opcodes.BIPUSH, clazz.setMethods.get(name));
+				//box if necessary
+				box(args[0]);
+				super.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(VirtualRuntime.class), "logStaticInternal", "(Ljava/lang/Object;I)V");
+			}
+			else if(clazz.addMethods.containsKey(name))
+			{
+				super.visitInsn(Opcodes.DUP);
+				//Do the log
+				super.visitIntInsn(Opcodes.BIPUSH, clazz.addMethods.get(name));
+				//box if necessary
+				box(args[0]);
+				super.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(VirtualRuntime.class), "logStaticInternalAdd", "(Ljava/lang/Object;I)V");
+			}
+			else if(clazz.removeMethods.containsKey(name))
+			{
+				super.visitInsn(Opcodes.DUP);
+				//Do the log
+				super.visitIntInsn(Opcodes.BIPUSH, clazz.addMethods.get(name));
+				//box if necessary
+				box(args[0]);
+				super.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(VirtualRuntime.class), "logStaticInternalRemove", "(Ljava/lang/Object;I)V");
+			}
+		}
+		super.visitMethodInsn(opcode, owner, name, desc);
+	}
+
+
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/mvs/TypeRememberingLocalVariableSorter.java b/src/edu/columbia/cs/psl/vmvm/asm/mvs/TypeRememberingLocalVariableSorter.java
new file mode 100644
index 0000000..c3821c3
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/asm/mvs/TypeRememberingLocalVariableSorter.java
@@ -0,0 +1,26 @@
+package edu.columbia.cs.psl.vmvm.asm.mvs;
+
+import java.util.Arrays;
+import java.util.HashMap;
+
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.LocalVariablesSorter;
+
+public class TypeRememberingLocalVariableSorter extends LocalVariablesSorter{
+
+	public TypeRememberingLocalVariableSorter(int access, String desc, MethodVisitor mv) {
+		super(access, desc, mv);
+	}
+	HashMap<Integer, Type> localTypes = new HashMap<>();
+	@Override
+	protected void setLocalType(int local, Type type) {
+//		System.out.println(local + " -> " + type);
+		super.setLocalType(local, type);
+		localTypes.put(local, type);
+	}
+
+	public HashMap<Integer, Type> getLocalTypes() {
+		return localTypes;
+	}
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/mvs/UnconditionalChrootMethodVisitor.java b/src/edu/columbia/cs/psl/vmvm/asm/mvs/UnconditionalChrootMethodVisitor.java
new file mode 100644
index 0000000..0e3c9b9
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/asm/mvs/UnconditionalChrootMethodVisitor.java
@@ -0,0 +1,184 @@
+package edu.columbia.cs.psl.vmvm.asm.mvs;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Scanner;
+
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.AdviceAdapter;
+import org.objectweb.asm.commons.InstructionAdapter;
+import org.objectweb.asm.tree.MethodInsnNode;
+
+import com.sun.org.apache.bcel.internal.generic.INVOKESPECIAL;
+import com.sun.org.apache.xml.internal.utils.UnImplNode;
+
+import edu.columbia.cs.psl.vmvm.Instrumenter;
+import edu.columbia.cs.psl.vmvm.VMState;
+import edu.columbia.cs.psl.vmvm.asm.VMVMClassVisitor;
+import edu.columbia.cs.psl.vmvm.asm.struct.EqMethodInsnNode;
+import edu.columbia.cs.psl.vmvm.chroot.ChrootUtils;
+
+public class UnconditionalChrootMethodVisitor extends AdviceAdapter {
+	public static HashMap<String, String> fsInputMethods = new HashMap<>();
+	public static HashSet<String> fsOutputMethods = new HashSet<>();
+	static {
+		try {
+			Scanner s = new Scanner(new File("fs-input-methods.txt"));
+			while (s.hasNextLine()) {
+				String[] d = s.nextLine().split("\t");
+				fsInputMethods.put(d[0], d[1]);
+			}
+			s.close();
+
+			s = new Scanner(new File("fs-output-methods.txt"));
+			while (s.hasNextLine()) {
+				fsOutputMethods.add(s.nextLine());
+			}
+			s.close();
+		} catch (Exception ex) {
+			ex.printStackTrace();
+		}
+	}
+	private String className;
+	private VMVMClassVisitor icv;
+
+	public UnconditionalChrootMethodVisitor(int api, MethodVisitor mv, int access, String name, String desc, String className, VMVMClassVisitor icv) {
+		super(api, mv, access, name, desc);
+		this.className = className;
+		this.icv = icv;
+	}
+
+	private boolean superInit = false;
+
+	@Override
+	protected void onMethodEnter() {
+		superInit = true;
+	}
+
+	@Override
+	public void visitMethodInsn(int opcode, String owner, String name, String desc) {
+
+		if (fsInputMethods.containsKey(owner + "." + name + desc) || fsOutputMethods.contains(owner + "." + name + desc)) {
+			if (!superInit) {
+				/*
+				 * If we are calling the super init, and that super init method
+				 * is an fs method, we have this gorgeous hack that passes all
+				 * of the args to a capture method that returns the args back!
+				 */
+				//				EqMethodInsnNode mi = new EqMethodInsnNode(opcode, owner, name, desc, EqMethodInsnNode.FLAG_SUPER_INVOKE_CHROOT);
+				//				Type[] args = Type.getArgumentTypes(desc);
+				//				String captureDesc = Type.getMethodDescriptor(Type.getType("[Ljava/lang/Object;"), args);
+				//
+				//				super.visitMethodInsn(Opcodes.INVOKESTATIC, className, ChrootUtils.getCaptureInitParentMethodName(mi), captureDesc);
+				//				for (int i = 0; i < args.length; i++) {
+				//					visitInsn(DUP);
+				//					visitIntInsn(BIPUSH, i);
+				//					visitInsn(AALOAD);
+				//					checkCast(args[i]);
+				//					visitInsn(SWAP);
+				//				}
+				//				visitInsn(POP);
+				//
+				//				super.visitMethodInsn(opcode, owner, name, desc);
+				//				icv.addChrootMethodToGen(mi);
+				throw new UnsupportedOperationException("Not implemented yet");
+			} else {
+				String captureType = fsInputMethods.get(owner + "." + name + desc);
+//				EqMethodInsnNode mi = new EqMethodInsnNode(opcode, owner, name, desc);
+				Type[] args = Type.getArgumentTypes(desc);
+				boolean swapBack = false;
+				Type typeToVirtualize = null;
+				if(captureType == null)
+				{
+					if(args.length > 0)
+						captureType = "0";
+					else
+						captureType = "this";
+//					throw new IllegalArgumentException("Can't find capture type for "+owner+"."+name+desc);
+				}
+				if (captureType.startsWith("0")) {
+					typeToVirtualize = args[0];
+					if (args.length == 2) {
+						visitInsn(SWAP);
+						swapBack = true;
+					} else if (args.length > 2) {
+						throw new IllegalArgumentException("Not coded to process args where we need to swap more than once");
+					}
+				} else if (captureType.startsWith("this")) {
+					typeToVirtualize = Type.getType("L"+owner+";");
+					if (args.length == 1) {
+						visitInsn(SWAP);
+						swapBack = true;
+					} else if (args.length > 1) {
+						throw new IllegalArgumentException("Not coded to process args where we need to swap more than once");
+					}
+				}
+				else
+				{
+					throw new IllegalStateException("Can't parse capture type<"+captureType+">");
+				}
+				boolean isOutput = false;
+				if (fsOutputMethods.contains(owner + "." + name + desc)) {
+					isOutput = true;
+				}
+
+				if(isOutput)
+					super.visitInsn(ICONST_1);
+				else
+					super.visitInsn(ICONST_0);
+				super.visitMethodInsn(Opcodes.INVOKESTATIC, Type.getInternalName(ChrootUtils.class), "chrootCapture" + (captureType.endsWith("INV") ? "INV" : ""), "(" + typeToVirtualize.getDescriptor()
+						+ "Z)" + typeToVirtualize.getDescriptor());
+				if (swapBack)
+					visitInsn(SWAP);
+				//			mi.desc= desc;
+				//				icv.addChrootMethodToGen(mi);
+
+				//				if (name.equals("<init>")) {
+				//					if (superInit) {
+				//						super.visitInsn(Opcodes.SWAP);
+				//						super.visitInsn(Opcodes.POP);
+				//					}
+				//					super.visitInsn(Opcodes.SWAP);
+				//					super.visitInsn(Opcodes.POP);
+				//				}
+			}
+		}
+		super.visitMethodInsn(opcode, owner, name, desc);
+	}
+
+	public static void sandboxCallToFSOutputMethod(MethodVisitor mv, int opcode, String owner, String name, String desc) {
+		Type[] args = Type.getArgumentTypes(desc);
+		String captureArgType = null;
+		switch (args.length) {
+		case 0:
+			captureArgType = "L" + owner + ";";
+			mv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(ChrootUtils.class), "logFileWrite", "(" + captureArgType + ")"+captureArgType);
+//			mv.visitMethodInsn(opcode, owner, name, desc);
+			break;
+		case 1:
+			captureArgType = args[0].getDescriptor();
+			mv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(ChrootUtils.class), "logFileWrite", "(" + captureArgType + ")"+captureArgType);
+//			mv.visitMethodInsn(opcode, owner, name, desc);
+			break;
+		case 2:
+			captureArgType = args[0].getDescriptor();
+			mv.visitInsn(SWAP);
+			mv.visitMethodInsn(INVOKESTATIC, Type.getInternalName(ChrootUtils.class), "logFileWrite", "(" + captureArgType + ")"+captureArgType);
+//			mv.visitMethodInsn(opcode, owner, name, desc);
+			mv.visitInsn(SWAP);
+			break;
+		default:
+			break;
+		}
+		if (captureArgType == null) {
+			mv.visitMethodInsn(opcode, Type.getInternalName(ChrootUtils.class), name, desc);
+		} else {
+
+		}
+	}
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/struct/EqFieldInsnNode.java b/src/edu/columbia/cs/psl/vmvm/asm/struct/EqFieldInsnNode.java
new file mode 100644
index 0000000..7926f8f
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/asm/struct/EqFieldInsnNode.java
@@ -0,0 +1,66 @@
+package edu.columbia.cs.psl.vmvm.asm.struct;
+
+import org.objectweb.asm.tree.FieldInsnNode;
+
+public class EqFieldInsnNode extends FieldInsnNode {
+
+	private boolean isFinal;
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((desc == null) ? 0 : desc.hashCode());
+		result = prime * result + ((name == null) ? 0 : name.hashCode());
+		result = prime * result + ((owner == null) ? 0 : owner.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		EqFieldInsnNode other = (EqFieldInsnNode) obj;
+		if (desc == null) {
+			if (other.desc != null)
+				return false;
+		} else if (!desc.equals(other.desc))
+			return false;
+		if (name == null) {
+			if (other.name != null)
+				return false;
+		} else if (!name.equals(other.name))
+			return false;
+		if (owner == null) {
+			if (other.owner != null)
+				return false;
+		} else if (!owner.equals(other.owner))
+			return false;
+		return true;
+	}
+
+	public boolean isFinal() {
+		return isFinal;
+	}
+
+	public EqFieldInsnNode(int opcode, String owner, String name, String desc) {
+		super(opcode, owner, name, desc);
+	}
+
+	public EqFieldInsnNode(int opcode, String owner, String name, String desc,
+			boolean isFinal) {
+		super(opcode, owner, name, desc);
+		this.isFinal = isFinal;
+	}
+
+	@Override
+	public String toString() {
+		return "EqFieldInsnNode [name=" + name + ", owner=" + owner + ", desc="
+				+ desc + "]";
+	}
+
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/struct/EqMethodInsnNode.java b/src/edu/columbia/cs/psl/vmvm/asm/struct/EqMethodInsnNode.java
new file mode 100644
index 0000000..679cbcb
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/asm/struct/EqMethodInsnNode.java
@@ -0,0 +1,68 @@
+package edu.columbia.cs.psl.vmvm.asm.struct;
+
+import org.objectweb.asm.tree.MethodInsnNode;
+
+public class EqMethodInsnNode extends MethodInsnNode {
+	public EqMethodInsnNode(
+	        final int opcode,
+	        final String owner,
+	        final String name,
+	        final String desc)
+	    {
+	        super(opcode,owner,name,desc);
+	    }
+	public EqMethodInsnNode(
+	        final int opcode,
+	        final String owner,
+	        final String name,
+	        final String desc, int flag)
+	    {
+	        super(opcode,owner,name,desc);
+	        this.flag = flag;
+	    }
+	public static final int FLAG_SUPER_INVOKE_CHROOT = 1;
+	public int flag = 0;
+	@Override
+	public String toString() {
+		return "EqMethodInsnNode [owner=" + owner + ", name=" + name + ", desc=" + desc + ", opcode=" + opcode + "]";
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((desc == null) ? 0 : desc.hashCode());
+		result = prime * result + ((name == null) ? 0 : name.hashCode());
+		result = prime * result + ((owner == null) ? 0 : owner.hashCode());
+		return result;
+	}
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		EqMethodInsnNode other = (EqMethodInsnNode) obj;
+		if (desc == null) {
+			if (other.desc != null)
+				return false;
+		} else if (!desc.equals(other.desc))
+			return false;
+		if (name == null) {
+			if (other.name != null)
+				return false;
+		} else if (!name.equals(other.name))
+			return false;
+		if (owner == null) {
+			if (other.owner != null)
+				return false;
+		} else if (!owner.equals(other.owner))
+			return false;
+		if(flag != other.flag)
+			return false;
+		return true;
+	}
+
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/struct/EqMethodNode.java b/src/edu/columbia/cs/psl/vmvm/asm/struct/EqMethodNode.java
new file mode 100644
index 0000000..479b1c4
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/asm/struct/EqMethodNode.java
@@ -0,0 +1,124 @@
+package edu.columbia.cs.psl.vmvm.asm.struct;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.HashSet;
+
+import org.objectweb.asm.tree.MethodNode;
+
+public class EqMethodNode extends MethodNode implements Serializable {
+
+	public transient HashSet<EqMethodNode> methodsICall = new HashSet<>();
+	public transient HashSet<EqMethodNode> methodsThatCallMe = new HashSet<>();
+	public HashSet<String> typesThatIInit = new HashSet<>();
+	public HashSet<Integer> ignoredInitCalls = new HashSet<>();
+	public HashSet<String> typesToIgnoreInit;
+	public String owner;
+	public boolean hasSideEffects;
+	public boolean sideEffectsExplored;
+	/**
+	 *
+	 */
+	private static final long serialVersionUID = -3345910259321149535L;
+
+	public EqMethodNode(int access, String name, String desc, String owner, String signature, String[] exceptions) {
+		super(access, name, desc, signature, exceptions);
+		this.owner = owner;
+		// TODO Auto-generated constructor stub
+	}
+
+	private void writeObject(ObjectOutputStream oos) throws IOException {
+		// default serialization
+		oos.defaultWriteObject();
+		oos.writeObject(this.name);
+		oos.writeObject(this.desc);
+		oos.writeInt(this.access);
+		oos.writeObject(this.owner);
+		oos.writeBoolean(this.hasSideEffects);
+	}
+
+	private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {
+		// default deserialization
+		ois.defaultReadObject();
+		this.name = (String) ois.readObject();
+		this.desc = (String) ois.readObject();
+		this.access = ois.readInt();
+		this.owner = (String) ois.readObject();
+		this.hasSideEffects = ois.readBoolean();
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((desc == null) ? 0 : desc.hashCode());
+		result = prime * result + ((name == null) ? 0 : name.hashCode());
+		result = prime * result + ((owner == null) ? 0 : owner.hashCode());
+
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		EqMethodNode other = (EqMethodNode) obj;
+
+		if (desc == null) {
+			if (other.desc != null)
+				return false;
+		} else if (!desc.equals(other.desc))
+			return false;
+		if (name == null) {
+			if (other.name != null)
+				return false;
+		} else if (!name.equals(other.name))
+			return false;
+		if (owner == null) {
+			if (other.owner != null)
+				return false;
+		} else if (!owner.equals(other.owner))
+			return false;
+
+		return true;
+	}
+
+	@Override
+	public String toString() {
+		return "EqMethodNode [name=" + owner + "." + name + ", desc=" + desc + "]";
+	}
+
+	private int originatesOnlyFromClinit = -1;
+	private boolean exploreInProgress = false;
+
+	public boolean originatesOnlyFromClInit() {
+		if (originatesOnlyFromClinit > -1)
+			return originatesOnlyFromClinit == 1;
+		if (this.name.equals("<clinit>")) {
+			originatesOnlyFromClinit = 1;
+			return true;
+		} else {
+			boolean ok = true;
+			exploreInProgress = true;
+			for (EqMethodNode mn : methodsThatCallMe) {
+				if (mn.exploreInProgress)
+					return true;
+				ok = ok && mn.originatesOnlyFromClInit();
+				if (!ok)
+					break;
+			}
+			if (ok)
+				this.originatesOnlyFromClinit = 1;
+			else
+				this.originatesOnlyFromClinit = 0;
+		}
+		return this.originatesOnlyFromClinit == 1;
+	}
+
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/asm/struct/MethodListClassNode.java b/src/edu/columbia/cs/psl/vmvm/asm/struct/MethodListClassNode.java
new file mode 100644
index 0000000..09a43ac
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/asm/struct/MethodListClassNode.java
@@ -0,0 +1,81 @@
+package edu.columbia.cs.psl.vmvm.asm.struct;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.HashSet;
+
+import org.objectweb.asm.tree.ClassNode;
+import org.objectweb.asm.tree.InsnList;
+
+import com.sun.xml.internal.ws.org.objectweb.asm.Opcodes;
+
+import edu.columbia.cs.psl.vmvm.Instrumenter;
+import edu.columbia.cs.psl.vmvm.asm.InterceptingClassVisitor;
+
+public class MethodListClassNode extends ClassNode implements Serializable {
+	/**
+	 *
+	 */
+	private static final long serialVersionUID = 8364049116079289872L;
+	public transient InsnList clInitInsns;
+	public boolean hasClinit;
+
+	public boolean clInitCalculatedNecessary;
+	public HashSet<EqMethodNode> methodsHashSet = new HashSet<>();
+	public boolean isMutable;
+
+	private void writeObject(ObjectOutputStream oos) throws IOException {
+		// default serialization
+		oos.defaultWriteObject();
+		oos.writeObject(this.name);
+		oos.writeInt(this.access);
+		oos.writeObject(this.superName);
+	}
+
+	private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException {
+		// default deserialization
+		ois.defaultReadObject();
+		this.name = (String) ois.readObject();
+		this.access = ois.readInt();
+		this.superName = (String) ois.readObject();
+	}
+	public boolean containsMethod(String name, String desc)
+	{
+		return containsMethod(name, desc, 0);
+	}
+	public EqMethodNode getMethod(String name, String desc)
+	{
+		return getMethod(name, desc,0);
+	}
+	public EqMethodNode getMethod(String name, String desc, int n)
+	{
+		boolean ret = methodsHashSet.contains(new EqMethodNode(0, name, desc,this.name, null, null));
+		if(ret)
+		for(EqMethodNode e : methodsHashSet)
+		{
+			if(name.equals(e.name) && desc.equals(e.desc))
+				return e;
+		}
+		MethodListClassNode superNode=  Instrumenter.instrumentedClasses.get(superName);
+		if(superNode != null && n <= 20 && !InterceptingClassVisitor.shouldIgnoreClass(superName)){
+			return superNode.getMethod(name, desc,n+1);
+		}
+		return null;
+	}
+	public boolean containsMethod(String name, String desc, int n)
+	{
+		if(name.contains("foo"))
+			System.out.println(name+desc);
+//		boolean ret = methodsHashSet.contains(new EqMethodNode(0, name, desc, null, null));
+		EqMethodNode ret = getMethod(name, desc,n);
+		if(ret != null && ((ret.access & Opcodes.ACC_ABSTRACT) != Opcodes.ACC_ABSTRACT || (this.access & Opcodes.ACC_INTERFACE) == Opcodes.ACC_INTERFACE))
+			return true;
+		MethodListClassNode superNode=  Instrumenter.instrumentedClasses.get(superName);
+		if(superNode != null && n <= 20 && !InterceptingClassVisitor.shouldIgnoreClass(superName)){
+			return superNode.containsMethod(name, desc,n+1);
+		}
+		return false;
+	}
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/chroot/ChrootUtils.java b/src/edu/columbia/cs/psl/vmvm/chroot/ChrootUtils.java
new file mode 100644
index 0000000..7f05f74
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/chroot/ChrootUtils.java
@@ -0,0 +1,761 @@
+package edu.columbia.cs.psl.vmvm.chroot;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.net.URLConnection;
+import java.net.URLStreamHandler;
+import java.nio.charset.Charset;
+import java.nio.file.CopyOption;
+import java.nio.file.DirectoryNotEmptyException;
+import java.nio.file.DirectoryStream;
+import java.nio.file.FileSystemException;
+import java.nio.file.FileSystems;
+import java.nio.file.FileVisitResult;
+import java.nio.file.FileVisitor;
+import java.nio.file.Files;
+import java.nio.file.OpenOption;
+import java.nio.file.Path;
+import java.nio.file.StandardCopyOption;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.WeakHashMap;
+
+import org.objectweb.asm.tree.MethodInsnNode;
+
+import edu.columbia.cs.psl.vmvm.Constants;
+import edu.columbia.cs.psl.vmvm.VMState;
+
+public class ChrootUtils {
+
+	private static HashMap<String, String> accessedPaths = new HashMap<>();
+	private static final boolean CHROOT_ENABLED = true;
+	private static final boolean DEBUG_ALL_ACCESS = false;
+	private static final boolean DEBUG_WRITES =false;
+	private static final boolean FORCE_CHROOT = false;
+
+	public static HashSet<String> writtenPaths = new HashSet<>();
+	static
+	{
+		reset(true);
+	}
+	public static void debugContextCL(ClassLoader cl)
+	{
+		System.err.println("Chrootdebugcl:" +cl);
+		if(cl instanceof URLClassLoader)
+		{
+			System.err.println(Arrays.toString(((URLClassLoader)cl).getURLs()));
+		}
+		new Exception().printStackTrace();
+	}
+	static boolean isInAWrittenPath(String file)
+	{
+		if(file.equals("/"))
+			return false;
+		if(writtenPaths.contains(file))
+			return true;
+		else
+		{
+			return isInAWrittenPath(new File(file).getParent());
+		}
+	}
+	static WeakHashMap<File, File> fileToFile = new WeakHashMap<>();
+	public static String chrootCapture(String path, boolean isOutput)
+	{
+		if(isOutput || FORCE_CHROOT)
+		{
+			writtenPaths.add(new File(path).getAbsolutePath());
+			path = ensureSafePath(path);
+			if(DEBUG_WRITES)
+				System.out.println("Redirecting write to " + path);
+		}
+		else
+		{
+			if(isInAWrittenPath(new File(path).getAbsolutePath()))
+			{
+				if(DEBUG_WRITES)
+					System.out.println("Redirecting write to " + path);
+				return ensureSafePath(path);
+			}
+		}
+		return path;
+	}
+	public static URLConnection chrootCapture(URLConnection urlConnection, boolean isOutput)
+	{
+//		System.err.println("URL: "  + urlConnection.getURL());
+//		new Exception().printStackTrace();
+		if(urlConnection.getURL() != null && urlConnection.getURL().toString().startsWith("file://")){
+
+		if(isOutput || FORCE_CHROOT)
+		{
+
+			writtenPaths.add(new File(urlConnection.getURL().getFile()).getAbsolutePath());
+			URL url = ensureSafeURL(urlConnection.getURL());
+			if(DEBUG_WRITES)
+				System.out.println("Redirecting write to " + url);
+			try {
+				return url.openConnection();
+			} catch (IOException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+		}
+		else
+		{
+			if(isInAWrittenPath(new File(urlConnection.getURL().getFile()).getAbsolutePath()))
+			{
+				URL url = ensureSafeURL(urlConnection.getURL());
+				if(DEBUG_WRITES)
+					System.out.println("Redirecting write to " + url);
+				try {
+					return url.openConnection();
+				} catch (IOException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+			}
+		}
+		}
+		return urlConnection;
+	}
+
+	public static URL chrootCapture(URL url, boolean isOutput)
+	{
+//		System.err.println("URL: "  + urlConnection.getURL());
+//		new Exception().printStackTrace();
+		if(url.toString().startsWith("file://")){
+
+		if(isOutput || FORCE_CHROOT)
+		{
+
+			writtenPaths.add(new File(url.getFile()).getAbsolutePath());
+			url = ensureSafeURL(url);
+			if(DEBUG_WRITES)
+				System.out.println("Redirecting write to " + url);
+			return url;
+		}
+		else
+		{
+			if(isInAWrittenPath(new File(url.getFile()).getAbsolutePath()))
+			{
+				url = ensureSafeURL(url);
+				if(DEBUG_WRITES)
+					System.out.println("Redirecting write to " + url);
+					return url;
+			}
+		}
+		}
+		return url;
+	}
+	public static File chrootCapture(File file, boolean isOutput)
+	{
+		if(isOutput || FORCE_CHROOT)
+		{
+			writtenPaths.add(file.getAbsolutePath());
+			File _file = ensureSafeFile(file);
+			fileToFile.put(file, _file);
+			if(DEBUG_WRITES)
+				System.out.println("Redirecting write to " + _file);
+			return _file;
+		}
+		else
+		{
+			if(isInAWrittenPath(file.getAbsolutePath()))
+			{
+				File _file = ensureSafeFile(file);
+				fileToFile.put(file, _file);
+				if(DEBUG_WRITES)
+					System.out.println("Redirecting write to " + _file);
+				return _file;
+			}
+		}
+		return file;
+	}
+	public static File chrootCaptureINV(File file, boolean isOutput)
+	{
+		if(fileToFile.containsKey(file))
+			return fileToFile.get(file);
+		return file;
+	}
+	public static Path chrootCapture(Path path, boolean isOutput)
+	{
+		if(isOutput || FORCE_CHROOT)
+		{
+			writtenPaths.add(path.toAbsolutePath().toString());
+			Path ret = ensureSafeFolder(path);
+			if(DEBUG_WRITES)
+				System.out.println("Redirecting write to " + ret);
+			return ret;
+		}
+		else if(isInAWrittenPath(path.toAbsolutePath().toString()))
+			return ensureSafeFolder(path);
+		return path;
+	}
+
+
+	public static Path write(Path path, byte[] bytes, OpenOption... options) throws IOException {
+		return Files.write(path, bytes, options);
+	}
+
+	public static Path write(Path path, Iterable<? extends CharSequence> lines, Charset cs, OpenOption... options) throws IOException {
+		return Files.write(path, lines, cs, options);
+	}
+	public static void reset()
+	{
+		reset(false);
+	}
+	private static void reset(final boolean isInit) {
+		Path chRootDir = FileSystems.getDefault().getPath(Constants.CHROOT_DIR);
+		if (Files.exists(chRootDir) && !isInit) {
+			try {
+				final HashSet<Path> dirsToDelete = new HashSet<>();
+				Files.walkFileTree(chRootDir, new FileVisitor<Path>() {
+					@Override
+					public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
+						return FileVisitResult.CONTINUE;
+					}
+
+					@Override
+					public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+						if(writtenPaths.contains(file) || isInit)
+						{
+							dirsToDelete.add(file.getParent());
+							Files.delete(file);
+						}
+//						else
+//							System.out.println("SKipping deleting " + file);
+						return FileVisitResult.CONTINUE;
+					}
+
+					@Override
+					public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
+						// try to delete the file anyway, even if its attributes
+						// could not be read, since delete-only access is
+						// theoretically possible
+						Files.delete(file);
+						return FileVisitResult.CONTINUE;
+					}
+
+					@Override
+					public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+						if (exc == null) {
+							if(dirsToDelete.contains(dir) || isInit)
+							{
+								try{
+								dirsToDelete.add(dir.getParent());
+								Files.delete(dir);
+								}
+								catch(DirectoryNotEmptyException ex)
+								{
+									//XXX nop
+								}
+							}
+							return FileVisitResult.CONTINUE;
+						} else {
+							// directory iteration failed; propagate exception
+							throw exc;
+						}
+					}
+				});
+				accessedPaths.clear();
+				writtenPaths.clear();
+				try{
+				Files.createDirectory(chRootDir);
+				}
+				catch(Exception ex)
+				{
+
+				}
+			} catch (IOException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+
+		}
+		else if(!Files.exists(chRootDir))
+		{
+			try {
+				Files.createDirectory(chRootDir);
+			} catch (IOException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+		}
+
+//		//Create a symlink to emulate cwd
+//		Path cwd = new File(".").getAb.toPath();
+//		try {
+//			Files.createLink(chRootDir.resolve(cwd), chRootDir.resolve(cwd.toAbsolutePath()));
+//		} catch (IOException e) {
+//			// TODO Auto-generated catch block
+//			e.printStackTrace();
+//		}
+	}
+
+
+	private static synchronized void registerPathAccess(String path) {
+		//		new Exception().printStackTrace();
+		//					System.out.println("ChrootUtils accessing: " + path);
+//System.out.println("Catalina.base: " + System.getProperty("catalina.base"));
+//if(System.getProperty("catalina.base") == null)
+//	new Exception().printStackTrace();
+		if (!accessedPaths.containsKey(path)) {
+//						System.out.println("ChrootUtils accessing: " + path);
+
+			String chrootPath = path;
+			if (!path.startsWith(Constants.CHROOT_DIR + "/")) {
+				chrootPath = Constants.CHROOT_DIR + (path.startsWith("/") ? path : "/" + path);
+			} else {
+				path = chrootPath.substring(Constants.CHROOT_DIR.length() + 1);
+			}
+			accessedPaths.put(path, chrootPath);
+			final Path existing = FileSystems.getDefault().getPath(path);
+			final Path dest = FileSystems.getDefault().getPath(chrootPath);
+			final Path chRootDirBase = FileSystems.getDefault().getPath(Constants.CHROOT_DIR);
+			if (Files.exists(existing) && !Files.exists(dest)) {
+				try {
+					Files.createDirectories(dest.getParent());
+					if(DEBUG_WRITES)
+						System.out.println("Copying " + path + " to " + chrootPath);
+					Files.walkFileTree(existing, new FileVisitor<Path>() {
+
+						@Override
+						public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
+							Path targetPath = dest.resolve(existing.relativize(dir));
+							if (!Files.exists(targetPath)) {
+								Files.createDirectory(targetPath);
+							}
+							return FileVisitResult.CONTINUE;
+						}
+
+						@Override
+						public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+							try {
+								Files.copy(file, dest.resolve(existing.relativize(file)), StandardCopyOption.COPY_ATTRIBUTES);
+							} catch (FileSystemException ex) {
+								Files.createSymbolicLink(dest.resolve(existing.relativize(file)), file);
+							}
+							return FileVisitResult.CONTINUE;
+						}
+
+						@Override
+						public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
+							return null;
+						}
+
+						@Override
+						public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+							return FileVisitResult.CONTINUE;
+						}
+
+					});
+				} catch (IOException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+			}
+			else if (Files.isDirectory(dest) && Files.exists(existing) && Files.exists(dest)) {
+				try {
+					if(DEBUG_WRITES)
+					System.out.println("Copying " + path + " to " + chrootPath);
+					Files.walkFileTree(existing, new FileVisitor<Path>() {
+
+						@Override
+						public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
+							Path targetPath = dest.resolve(existing.relativize(dir));
+							if (!Files.exists(targetPath)) {
+								Files.createDirectory(targetPath);
+							}
+							return FileVisitResult.CONTINUE;
+						}
+
+						@Override
+						public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+							try {
+								Path targetPath = dest.resolve(existing.relativize(file));
+								if(!Files.exists(targetPath))
+									Files.copy(file, targetPath, StandardCopyOption.COPY_ATTRIBUTES);
+							} catch (FileSystemException ex) {
+								Files.createSymbolicLink(dest.resolve(existing.relativize(file)), file);
+							}
+							return FileVisitResult.CONTINUE;
+						}
+
+						@Override
+						public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {
+							return null;
+						}
+
+						@Override
+						public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+							return FileVisitResult.CONTINUE;
+						}
+
+					});
+				} catch (IOException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+			}
+		}
+	}
+
+	public static String getCaptureMethodName(MethodInsnNode mi) {
+		return "_" + mi.owner.replace("/", "_") + "_" + mi.name.replace("<", "_").replace(">", "_");
+	}
+
+	public static String getCaptureInitParentMethodName(MethodInsnNode mi) {
+		return "_parent_" + mi.owner.replace("/", "_") + "_" + mi.name.replace("<", "_").replace(">", "_");
+	}
+
+	public static String ensureSafePath(String s, VMState state) {
+		String path = new File(s).getAbsolutePath();
+		registerPathAccess(path);
+		if (!path.startsWith(Constants.CHROOT_DIR + "/")) {
+			path = Constants.CHROOT_DIR + (s.startsWith("/") ? s : "/" + s);
+		}
+		//		System.out.println(path);
+		return path;
+	}
+
+	public static String ensureSafePath(String s) {
+		if(!CHROOT_ENABLED)
+			return s;
+		if(DEBUG_ALL_ACCESS)
+			System.out.println("Accessing string-based file: " + s);
+		if(s.contains("output/build/logs"))
+			return s;
+		String path = new File(s).getAbsolutePath();
+		registerPathAccess(path);
+		if (!path.startsWith(Constants.CHROOT_DIR + "/")) {
+			path = Constants.CHROOT_DIR + (path.startsWith("/") ? path : "/" + path);
+			//			System.out.println("I chrooted" + path);
+		}
+//		System.out.println("chrootutils returning " + path);
+		return path;
+	}
+
+	public static Path ensureSafeFolder(Path f) {
+		if(!CHROOT_ENABLED)
+			return f;
+		if(DEBUG_ALL_ACCESS)
+			System.out.println("Accessing path: " + f);
+		String path = f.toFile().getAbsolutePath();
+		registerPathAccess(path);
+
+		if (!path.startsWith(Constants.CHROOT_DIR + "/")) {
+			path = Constants.CHROOT_DIR + path;
+			//			System.out.println("Fudging temp folder" + path);
+			Path r = FileSystems.getDefault().getPath(path);
+			try {
+				r = Files.createDirectories(r);
+			} catch (IOException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+			return r;
+		}
+		return f;
+	}
+
+	public static File ensureSafeFile(File f) {
+		if(!CHROOT_ENABLED)
+			return f;
+		if(DEBUG_ALL_ACCESS)
+			System.out.println("Acessing: " + f);
+		String path = f.getAbsolutePath();
+		if(path.contains("output/build/logs"))
+			return f;
+		registerPathAccess(path);
+		if (!path.startsWith(Constants.CHROOT_DIR + "/")) {
+			path = Constants.CHROOT_DIR + f.getAbsolutePath();
+			//			System.out.println("Fudging temp file" + path);
+			File r = new File(path);
+//			try {
+//				f.delete();
+//				r.createNewFile();
+				return r;
+//			} catch (IOException e) {
+//				// TODO Auto-generated catch block
+//				e.printStackTrace();
+//			}
+		}
+		return f;
+	}
+
+	public static Object[] ensureSafeURLArrayReturn(String spec) throws MalformedURLException {
+		if (spec != null && spec.startsWith("file://")) {
+			URL ret = new URL(spec);
+			registerPathAccess(ret.getPath());
+			if (!ret.getPath().startsWith(Constants.CHROOT_DIR + "/")) {
+				return new Object[] { "file://" + Constants.CHROOT_DIR + "/" + ret.getPath() };
+			}
+		}
+		return new Object[] { (spec) };
+	}
+
+	public static Object[] ensureSafeURLArrayReturn(String protocol, String host, int port, String file) throws MalformedURLException {
+		if ("file".equals(protocol)) {
+			registerPathAccess(file);
+			if (!file.startsWith(Constants.CHROOT_DIR + "/")) {
+				return new Object[] { protocol, host, port, Constants.CHROOT_DIR + "/" + file };
+			}
+		}
+		return new Object[] { protocol, host, port, file };
+	}
+
+	public static Object[] ensureSafeURLArrayReturn(String protocol, String host, int port, String file, URLStreamHandler handler) throws MalformedURLException {
+		if ("file".equals(protocol)) {
+			registerPathAccess(file);
+			if (!file.startsWith(Constants.CHROOT_DIR + "/")) {
+				return new Object[] { protocol, host, port, Constants.CHROOT_DIR + "/" + file, handler };
+			}
+		}
+		return new Object[] { protocol, host, port, file, handler };
+	}
+
+	public static Object[] ensureSafeURLArrayReturn(String protocol, String host, String file) throws MalformedURLException {
+		if ("file".equals(protocol)) {
+			registerPathAccess(file);
+
+			if (!file.startsWith(Constants.CHROOT_DIR + "/")) {
+				return new Object[] { protocol, host, Constants.CHROOT_DIR + "/" + file };
+			}
+		}
+		return new Object[] { protocol, host, file };
+	}
+
+	public static Object[] ensureSafeURIArrayReturn(String spec) throws URISyntaxException {
+		if (spec != null && spec.startsWith("file://")) {
+			URI ret = new URI(spec);
+			registerPathAccess(ret.getPath());
+
+			if (!ret.getPath().startsWith(Constants.CHROOT_DIR + "/")) {
+				return new Object[] { "file://" + Constants.CHROOT_DIR + "/" + ret.getPath() };
+			}
+		}
+		return new Object[] { (spec) };
+	}
+
+	public static Object[] ensureSafeURIArrayReturn(String scheme, String ssp, String fragment) throws URISyntaxException {
+		if (scheme != null && scheme.startsWith("file://")) {
+			URI ret = new URI(scheme, ssp, fragment);
+			registerPathAccess(ret.getPath());
+			if (!ret.getPath().startsWith(Constants.CHROOT_DIR + "/")) {
+				return new Object[] { scheme, Constants.CHROOT_DIR + ret.getRawSchemeSpecificPart(), fragment };
+			}
+		}
+		return new Object[] { scheme, ssp, fragment };
+	}
+
+	public static Object[] ensureSafeURIArrayReturn(String scheme, String userInfo, String host, int port, String path, String query, String fragment) throws URISyntaxException {
+		if (scheme != null && scheme.startsWith("file://")) {
+			URI ret = new URI(scheme, userInfo, host, port, path, query, fragment);
+			registerPathAccess(ret.getPath());
+			if (!ret.getPath().startsWith(Constants.CHROOT_DIR + "/")) {
+				return new Object[] { scheme, userInfo, host, port, Constants.CHROOT_DIR + ret.getRawSchemeSpecificPart(), query, fragment };
+			}
+		}
+		return new Object[] { scheme, userInfo, host, port, path, query, fragment };
+	}
+
+	public static Object[] ensureSafeURIArrayReturn(String scheme, String host, String path, String fragment) throws URISyntaxException {
+		if (scheme != null && scheme.startsWith("file://")) {
+			URI ret = new URI(scheme, host, path, fragment);
+			registerPathAccess(ret.getPath());
+			if (!ret.getPath().startsWith(Constants.CHROOT_DIR + "/")) {
+				return new Object[] { scheme, host, Constants.CHROOT_DIR + "/" + path, fragment };
+			}
+		}
+		return new Object[] { scheme, host, path, fragment };
+	}
+
+	public static Object[] ensureSafeURIArrayReturn(String scheme, String authority, String path, String query, String fragment) throws URISyntaxException {
+		if (scheme != null && scheme.startsWith("file://")) {
+			URI ret = new URI(scheme, authority, path, query, fragment);
+			registerPathAccess(ret.getPath());
+			if (!ret.getPath().startsWith(Constants.CHROOT_DIR + "/")) {
+				return new Object[] { scheme, authority, Constants.CHROOT_DIR + "/" + path, query, fragment };
+			}
+		}
+		return new Object[] { scheme, authority, path, query, fragment };
+	}
+
+	public static URL ensureSafeURL(String spec) throws MalformedURLException {
+		if (spec != null && spec.startsWith("file://")) {
+			URL ret = new URL(spec);
+			registerPathAccess(ret.getPath());
+			if (!ret.getPath().startsWith(Constants.CHROOT_DIR + "/")) {
+				return new URL("file://" + Constants.CHROOT_DIR + "/" + ret.getPath());
+			}
+		}
+		return new URL(spec);
+	}
+
+	public static URL ensureSafeURL(String protocol, String host, int port, String file) throws MalformedURLException {
+		if ("file".equals(protocol)) {
+			registerPathAccess(file);
+			if (!file.startsWith(Constants.CHROOT_DIR + "/")) {
+				return new URL(protocol, host, port, "/" + Constants.CHROOT_DIR + "/" + file);
+			}
+		}
+		return new URL(protocol, host, port, file);
+	}
+
+	public static URL ensureSafeURL(String protocol, String host, int port, String file, URLStreamHandler handler) throws MalformedURLException {
+		if ("file".equals(protocol)) {
+			registerPathAccess(file);
+
+			if (!file.startsWith(Constants.CHROOT_DIR + "/")) {
+				return new URL(protocol, host, port, "/" + Constants.CHROOT_DIR + "/" + file, handler);
+			}
+		}
+		return new URL(protocol, host, port, file, handler);
+	}
+
+	public static URL ensureSafeURL(String protocol, String host, String file) throws MalformedURLException {
+		if ("file".equals(protocol)) {
+			registerPathAccess(file);
+
+			if (!file.startsWith(Constants.CHROOT_DIR + "/")) {
+				return new URL(protocol, host, "/" + Constants.CHROOT_DIR + "/" + file);
+			}
+		}
+		return new URL(protocol, host, file);
+	}
+
+	public static URI ensureSafeURI(String str) throws URISyntaxException {
+		return ensureSafeURI(new URI(str));
+	}
+
+	public static URI ensureSafeURI(String scheme, String ssp, String fragment) throws URISyntaxException {
+		return ensureSafeURI(new URI(scheme, ssp, fragment));
+	}
+
+	public static URI ensureSafeURI(String scheme, String userInfo, String host, int port, String path, String query, String fragment) throws URISyntaxException {
+		return ensureSafeURI(new URI(scheme, userInfo, host, port, path, query, fragment));
+	}
+
+	public static URI ensureSafeURI(String scheme, String host, String path, String fragment) throws URISyntaxException {
+		return ensureSafeURI(new URI(scheme, host, path, fragment));
+	}
+
+	public static URI ensureSafeURI(String scheme, String authority, String path, String query, String fragment) throws URISyntaxException {
+		return ensureSafeURI(new URI(scheme, authority, path, query, fragment));
+	}
+
+	public static URL ensureSafeURL(String spec, VMState state) throws MalformedURLException {
+		if (spec != null && spec.startsWith("file://")) {
+			URL ret = new URL(spec);
+			registerPathAccess(ret.getPath());
+			if (!ret.getPath().startsWith(Constants.CHROOT_DIR + "/")) {
+				return new URL("file://" + Constants.CHROOT_DIR + "/" + ret.getPath());
+			}
+		}
+		return new URL(spec);
+	}
+
+	public static URL ensureSafeURL(String protocol, String host, int port, String file, VMState state) throws MalformedURLException {
+		if ("file".equals(protocol)) {
+			registerPathAccess(file);
+			if (!file.startsWith(Constants.CHROOT_DIR + "/")) {
+				return new URL(protocol, host, port, "/" + Constants.CHROOT_DIR + "/" + file);
+			}
+		}
+		return new URL(protocol, host, port, file);
+	}
+
+	public static URL ensureSafeURL(String protocol, String host, int port, String file, URLStreamHandler handler, VMState state) throws MalformedURLException {
+		if ("file".equals(protocol)) {
+			registerPathAccess(file);
+
+			if (!file.startsWith(Constants.CHROOT_DIR + "/")) {
+				return new URL(protocol, host, port, "/" + Constants.CHROOT_DIR + "/" + file, handler);
+			}
+		}
+		return new URL(protocol, host, port, file, handler);
+	}
+
+	public static URL ensureSafeURL(String protocol, String host, String file, VMState state) throws MalformedURLException {
+		if ("file".equals(protocol)) {
+			registerPathAccess(file);
+
+			if (!file.startsWith(Constants.CHROOT_DIR + "/")) {
+				return new URL(protocol, host, "/" + Constants.CHROOT_DIR + "/" + file);
+			}
+		}
+		return new URL(protocol, host, file);
+	}
+
+	public static URI ensureSafeURI(String str, VMState state) throws URISyntaxException {
+		return ensureSafeURI(new URI(str), state);
+	}
+
+	public static URI ensureSafeURI(String scheme, String ssp, String fragment, VMState state) throws URISyntaxException {
+		return ensureSafeURI(new URI(scheme, ssp, fragment), state);
+	}
+
+	public static URI ensureSafeURI(String scheme, String userInfo, String host, int port, String path, String query, String fragment, VMState state) throws URISyntaxException {
+		return ensureSafeURI(new URI(scheme, userInfo, host, port, path, query, fragment), state);
+	}
+
+	public static URI ensureSafeURI(String scheme, String host, String path, String fragment, VMState state) throws URISyntaxException {
+		return ensureSafeURI(new URI(scheme, host, path, fragment), state);
+	}
+
+	public static URI ensureSafeURI(String scheme, String authority, String path, String query, String fragment, VMState state) throws URISyntaxException {
+		return ensureSafeURI(new URI(scheme, authority, path, query, fragment), state);
+	}
+
+	public static URI ensureSafeURI(URI uri, VMState state) {
+		if (uri != null && uri.getScheme() != null && uri.getScheme().startsWith("file")) {
+			File f = new File(uri);
+			registerPathAccess(f.getAbsolutePath());
+
+			if (!f.getAbsolutePath().startsWith(Constants.CHROOT_DIR + "/")) {
+				String path = Constants.CHROOT_DIR + f.getAbsolutePath();
+				return new File(path).toURI();
+			}
+		}
+		return uri;
+	}
+
+	public static URI ensureSafeURI(URI uri) {
+		if (uri != null && uri.getScheme() != null && uri.getScheme().startsWith("file")) {
+			File f = new File(uri);
+			registerPathAccess(f.getAbsolutePath());
+
+			if (!f.getAbsolutePath().startsWith(Constants.CHROOT_DIR + "/")) {
+				String path = Constants.CHROOT_DIR + f.getAbsolutePath();
+				return new File(path).toURI();
+			}
+		}
+		return uri;
+	}
+	public static URL ensureSafeURL(URL url) {
+		try {
+			return ensureSafeURI(url.toURI()).toURL();
+		} catch (MalformedURLException e) {
+			e.printStackTrace();
+		} catch (URISyntaxException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+	public static URL ensureSafeURL(URL url, VMState state) {
+		try {
+			return ensureSafeURI(url.toURI(), state).toURL();
+		} catch (MalformedURLException e) {
+			e.printStackTrace();
+		} catch (URISyntaxException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+}
diff --git a/src/edu/columbia/cs/psl/vmvm/chroot/FSDetector.java b/src/edu/columbia/cs/psl/vmvm/chroot/FSDetector.java
index 925252b..ae8ea91 100644
--- a/src/edu/columbia/cs/psl/vmvm/chroot/FSDetector.java
+++ b/src/edu/columbia/cs/psl/vmvm/chroot/FSDetector.java
@@ -13,8 +13,9 @@ import java.util.HashSet;
 import java.util.Scanner;
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
+import java.util.logging.Level;
+import java.util.logging.Logger;

-import org.apache.log4j.Logger;
 import org.objectweb.asm.ClassReader;
 import org.objectweb.asm.ClassWriter;
 import org.objectweb.asm.Opcodes;
@@ -22,7 +23,7 @@ import org.objectweb.asm.tree.ClassNode;


 public class FSDetector {
-	private static Logger			logger						= Logger.getLogger(FSDetector.class);
+	private static Logger			logger						= Logger.getLogger("edu.columbia.cs.psl.vmvm");

 	public static HashSet<String> fsMethods = new HashSet<String>();
 	public static HashMap<String, ClassNode> classInfo = new HashMap<String, ClassNode>();
@@ -203,12 +204,12 @@ public class FSDetector {
 			r += "--";
 		if (mi == null) {
 			r += ("NULL!!!!!!!!!->" + fallback);
-			logger.error(r);
+			logger.log(Level.SEVERE,r);
 			return;

 		}

-		logger.error(r + mi.getFullName() + " [" + (mi.isFSTaint() ? "NA" : "") + (mi.isFSTaint() ? "ND" : "") + "]");
+		logger.log(Level.SEVERE,r + mi.getFullName() + " [" + (mi.isFSTaint() ? "NA" : "") + (mi.isFSTaint() ? "ND" : "") + "]");
 		if (!alreadyPrinted.contains(mi.getFullName())) {
 			alreadyPrinted.add(mi.getFullName());
 			for (String s : mi.functionsThatICall)
diff --git a/src/edu/columbia/cs/psl/vmvm/eval/DacapoPatchCallback.java b/src/edu/columbia/cs/psl/vmvm/eval/DacapoPatchCallback.java
new file mode 100644
index 0000000..234c1e2
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/eval/DacapoPatchCallback.java
@@ -0,0 +1,32 @@
+package edu.columbia.cs.psl.vmvm.eval;
+
+import org.dacapo.harness.Callback;
+import org.dacapo.harness.CommandLineArgs;
+
+public class DacapoPatchCallback extends Callback {
+
+	  public DacapoPatchCallback(CommandLineArgs args) {
+	    super(args);
+	  }
+
+	  /* Immediately prior to start of the benchmark */
+	  public void start(String benchmark) {
+	    System.err.println("my hook starting " + (isWarmup() ? "warmup " : "") + benchmark);
+	    System.exit(-1);
+	    super.start(benchmark);
+	  };
+
+	  /* Immediately after the end of the benchmark */
+	  public void stop() {
+	    super.stop();
+	    System.err.println("my hook stopped " + (isWarmup() ? "warmup" : ""));
+	    System.err.flush();
+	  };
+
+	  public void complete(String benchmark, boolean valid) {
+	    super.complete(benchmark, valid);
+	    System.err.println("my hook " + (valid ? "PASSED " : "FAILED ") + (isWarmup() ? "warmup " : "") + benchmark);
+	    System.err.flush();
+	  };
+	}
+
diff --git a/src/edu/columbia/cs/psl/vmvm/struct/MutableInstance.java b/src/edu/columbia/cs/psl/vmvm/struct/MutableInstance.java
new file mode 100644
index 0000000..fdb6ace
--- /dev/null
+++ b/src/edu/columbia/cs/psl/vmvm/struct/MutableInstance.java
@@ -0,0 +1,13 @@
+package edu.columbia.cs.psl.vmvm.struct;
+
+public class MutableInstance {
+	private Object inst;
+	public Object get()
+	{
+		return inst;
+	}
+	public void put(Object o)
+	{
+		inst = o;
+	}
+}
diff --git a/src/log4j.properties b/src/log4j.properties
index 1cea7b9..6ba99e5 100755
--- a/src/log4j.properties
+++ b/src/log4j.properties
@@ -15,6 +15,6 @@ log4j.appender.file.layout=org.apache.log4j.PatternLayout
 log4j.appender.file.layout.ConversionPattern=[vmvm - %t (%d)] %p %C.%M(%L) | %m%n

 #core packages
-#log4j.logger.org.geworkbench.engine.config.UILauncher=INFO
-#log4j.logger.org.geworkbench.engine.management.ComponentRegistry=INFO
+log4j.logger.edu.columbia.cs.psl.vmvm.agent=INFO
+log4j.logger.edu.columbia.cs.psl.vmvm.asm.SandboxPropogatingMV=WARN
 log4j.logger.edu.columbia.cs.psl.invivo.record.analysis.MutabilityAnalyzer=INFO
\ No newline at end of file
diff --git a/tomcatRunner/.classpath b/tomcatRunner/.classpath
new file mode 100644
index 0000000..879c0dd
--- /dev/null
+++ b/tomcatRunner/.classpath
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/VMVM">
+		<accessrules>
+			<accessrule kind="nonaccessible" pattern="org/junit"/>
+		</accessrules>
+	</classpathentry>
+	<classpathentry kind="lib" path="/Users/jon/Documents/PSL/Projects/in-vivo/vmvm/lib/asm-all-4.1.jar"/>
+	<classpathentry kind="lib" path="/Users/jon/Documents/PSL/Projects/in-vivo/vmvm/lib/objenesis-1.2.jar"/>
+	<classpathentry kind="lib" path="/VMVM/samples/commons-lang/target/classes"/>
+	<classpathentry kind="lib" path="/VMVM/samples/commons-lang/target/test-classes"/>
+	<classpathentry kind="lib" path="/VMVM/samples/commons-lang/target/tests"/>
+	<classpathentry kind="lib" path="junit.jar" sourcepath="/Users/jon/.m2/repository/junit/junit/4.10/junit-4.10-sources.jar"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/Tomcat 7.0"/>
+	<classpathentry kind="lib" path="/VMVM/samples/ivy/build/classes/all" sourcepath="/VMVM/samples/ivy/src/java"/>
+	<classpathentry kind="lib" path="/VMVM/samples/ivy/build/classes/ant"/>
+	<classpathentry kind="lib" path="/VMVM/samples/ivy/build/classes/bootstrap"/>
+	<classpathentry kind="lib" path="/VMVM/samples/ivy/build/classes/core" sourcepath="/VMVM/samples/ivy/src/java"/>
+	<classpathentry kind="lib" path="/VMVM/samples/ivy/build/classes/optional"/>
+	<classpathentry kind="lib" path="/VMVM/samples/ivy/build/test" sourcepath="/VMVM/samples/ivy/test"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/mockito"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/nutch"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
+
diff --git a/tomcatRunner/.project b/tomcatRunner/.project
new file mode 100644
index 0000000..929ab23
--- /dev/null
+++ b/tomcatRunner/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>Tomcat 7.0 Test runner</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/tomcatRunner/junit.jar b/tomcatRunner/junit.jar
new file mode 100644
index 0000000..954851e
Binary files /dev/null and b/tomcatRunner/junit.jar differ
diff --git a/tomcatRunner/src/edu/columbia/cs/psl/vmvm/junit/driver/CopyOfDriver.java b/tomcatRunner/src/edu/columbia/cs/psl/vmvm/junit/driver/CopyOfDriver.java
new file mode 100644
index 0000000..455ebf6
--- /dev/null
+++ b/tomcatRunner/src/edu/columbia/cs/psl/vmvm/junit/driver/CopyOfDriver.java
@@ -0,0 +1,243 @@
+package edu.columbia.cs.psl.vmvm.junit.driver;
+
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Scanner;
+
+import org.apache.jorphan.test.UnitTestManager;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestResult;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+
+
+
+import edu.columbia.cs.psl.vmvm.CloningUtils;
+import edu.columbia.cs.psl.vmvm.ReflectionWrapper;
+import edu.columbia.cs.psl.vmvm.VirtualRuntime;
+import edu.columbia.cs.psl.vmvm.sirRunner.SuiteWrapper;
+
+public class CopyOfDriver {
+    public static void main(String[] args) {
+//    	runTest(TestOutputBuffer.class);
+//    	runTest(TestAsyncContextImpl.class);
+//    	runTest(TestStandardContext.class);
+//    	runTest(TestRemoteIpFilter.class);
+//    	runTest(TestVirtualContext.class);
+//    	runTest(TestCookiesAllowEquals.class);
+//    	runTest(TestCookiesAllowNameOnly.class);
+//    	runTest(TestCookiesAllowHttpSeps.class);
+//    	runTest(TestAbstractHttp11Processor.class);
+//    	runTest(TestAbstractHttp11Processor.class);
+//    	runTest(TestFormAuthenticator.class);
+//    	runTest(TestNonLoginAndBasicAuthenticator.class);
+//    	runTest(TestSSOnonLoginAndBasicAuthenticator.class);
+//    	runTest(TestSSOnonLoginAndDigestAuthenticator.class);
+//    	runTest(TestCometProcessor.class);
+//    	runTest(TestConnector.class);
+//    	runTest(TestCoyoteAdapter.class);
+//    	runTest(TestInputBuffer.class);
+//    	runTest(TestKeepAliveCount.class);
+//    	runTest(TestMaxConnections.class);
+//    	runTest(TestOutputBuffer.class);
+//    	runTest(AnnotationUtilsTest.class);
+//    	runTest(ObjectUtilsTest.class);
+//    	runTest(SystemUtilsTest.class);
+//    	runTest(RandomStringUtilsTest.class);
+//    	runTest(ToStringBuilderTest.class);
+//    	runTest(ConstructorUtilsTest.class);
+//    	runTest(ClassUtilsTest.class);
+//    	runTest(MethodUtilsTest.class);
+//    	runTest(TestCompositeELResolver.class);
+//    	runTest(TestCompositeELResolver.class);
+    	ArrayList<String> tests = new ArrayList<>();
+
+//        tests.add("org.apache.xml.security.test.c14n.helper.C14nHelperTest");
+//        tests.add("org.apache.xml.security.test.c14n.implementations.Canonicalizer20010315Test");
+//        tests.add("org.apache.xml.security.test.c14n.implementations.Canonicalizer20010315ExclusiveTest");
+//        tests.add("org.apache.xml.security.test.external.org.apache.xalan.XPathAPI.XalanBug1425Test");
+//        tests.add("org.apache.xml.security.test.external.org.apache.xalan.XPathAPI.AttributeAncestorOrSelf");
+//        tests.add("org.apache.xml.security.test.signature.XMLSignatureInputTest");
+//        tests.add("org.apache.xml.security.test.transforms.implementations.TransformBase64DecodeTest");
+//        tests.add("org.apache.xml.security.test.utils.resolver.ResourceResolverSpiTest");
+//        tests.add("org.apache.xml.security.test.utils.Base64Test");
+//
+//        tests.add("org.apache.xml.security.test.interop.BaltimoreTest");
+//        tests.add("org.apache.xml.security.test.interop.IAIKTest");
+//        tests.add("org.apache.xml.security.test.interop.RSASecurityTest");
+//
+//        tests.add("org.apache.xml.security.test.interop.RSASecurityTest");
+
+//        tests.add("org.apache.xml.security.test.c14n.implementations.ExclusiveC14NInterop");
+//        tests.add("org.apache.xml.security.test.c14n.implementations.ExclusiveC14NInterop");
+//    	tests.add("org.apache.jmeter.gui.action.Load$Test");
+//		tests.add("org.apache.jmeter.gui.action.Save$Test");
+//		tests.add("org.apache.jmeter.engine.TreeCloner$Test");
+//		tests.add("org.apache.jmeter.threads.TestCompiler$Test");
+//		tests.add("org.apache.jmeter.junit.JMeterTest");
+//		tests.add("org.apache.jmeter.save.SaveService$Test");
+//		tests.add("org.apache.jmeter.util.StringUtilities$Test");
+//		tests.add("org.apache.jmeter.config.gui.ArgumentsPanel$Test");
+//		tests.add("org.apache.jmeter.control.OnceOnlyController$Test");
+//		tests.add("org.apache.jmeter.control.GenericController$Test");
+//		tests.add("org.apache.jmeter.control.InterleaveControl$Test");
+//		tests.add("org.apache.jmeter.control.LoopController$Test");
+//		tests.add("org.apache.jmeter.junit.protocol.http.config.UrlConfigTest");
+//		tests.add("org.apache.jmeter.junit.protocol.http.parser.HtmlParserTester");
+//		tests.add("org.apache.jmeter.protocol.http.sampler.HTTPSampler$Test");
+//		tests.add("org.apache.jmeter.protocol.http.sampler.HTTPSamplerFull$Test");
+//		tests.add("org.apache.jmeter.protocol.http.modifier.URLRewritingModifier$Test");
+//		tests.add("org.apache.jmeter.protocol.http.parser.HtmlParser$Test");
+//		tests.add("org.apache.jmeter.protocol.http.proxy.ProxyControl$Test");
+//		tests.add("org.apache.jmeter.protocol.http.util.HTTPArgument$Test");
+//		tests.add("org.apache.jmeter.protocol.http.proxy.HttpRequestHdr$Test");
+//		tests.add("org.apache.jmeter.visualizers.StatVisualizerModel$Test");
+//		tests.add("org.apache.jmeter.engine.util.ValueReplacer$Test");
+//		tests.add("org.apache.jmeter.testelement.property.CollectionProperty$Test");
+//		tests.add("org.apache.jmeter.extractor.RegexExtractor$Test");
+//		tests.add("org.apache.jmeter.protocol.http.control.CookieManager$Test");
+//		tests.add("org.apache.jmeter.protocol.http.control.gui.HttpTestSampleGui$Test");
+//		tests.add("org.apache.jmeter.protocol.http.modifier.AnchorModifier$Test");
+    	tests.add("com.continuent.bristlecone.benchmark.test.BenchmarkTest");
+//
+//		tests.add("org.apache.jmeter.gui.action.Load$Test");
+//		tests.add("org.apache.jmeter.gui.action.Save$Test");
+//		tests.add("org.apache.jmeter.save.SaveService$Test");
+//		tests.add("org.apache.jmeter.engine.TreeCloner$Test");
+//		tests.add("org.apache.jmeter.functions.CompoundFunction$Test");
+//		tests.add("org.apache.jmeter.threads.TestCompiler$Test");
+//		tests.add("org.apache.jmeter.junit.JMeterTest");
+//		tests.add("org.apache.jmeter.save.SaveService$Test");
+//		tests.add("org.apache.jmeter.config.gui.ArgumentsPanel$Test");
+//		tests.add("org.apache.jmeter.control.OnceOnlyController$Test");
+//		tests.add("org.apache.jmeter.control.GenericController$Test");
+//		tests.add("org.apache.jmeter.control.InterleaveControl$Test");
+//		tests.add("org.apache.jmeter.control.LoopController$Test");
+//		tests.add("org.apache.jmeter.functions.RegexFunction$Test");
+//		tests.add("org.apache.jmeter.junit.protocol.http.config.UrlConfigTest");
+//		tests.add("org.apache.jmeter.junit.protocol.http.parser.HtmlParserTester");
+//		tests.add("org.apache.jmeter.protocol.http.sampler.HTTPSampler$Test");
+//		tests.add("org.apache.jmeter.protocol.http.sampler.HTTPSamplerFull$Test");
+//		tests.add("org.apache.jmeter.protocol.http.modifier.URLRewritingModifier$Test");
+//		tests.add("org.apache.jmeter.protocol.http.parser.HtmlParser$Test");
+//		tests.add("org.apache.jmeter.protocol.http.proxy.ProxyControl$Test");
+//		tests.add("org.apache.jmeter.protocol.http.util.HTTPArgument$Test");
+
+//		tests.add("org.apache.jmeter.gui.action.Load$Test");
+//		tests.add("org.apache.jmeter.gui.action.Save$Test");
+//		tests.add("org.apache.jmeter.engine.TreeCloner$Test");
+//		tests.add("org.apache.jmeter.functions.CompoundFunction$Test");
+//		tests.add("org.apache.jmeter.threads.TestCompiler$Test");
+//		tests.add("org.apache.jmeter.junit.JMeterTest");
+//		initializeManager(new String[]{"","./jmeter.properties","org.apache.jmeter.util.JMeterUtils"});
+//
+//        for(String t : tests)
+//        	runTest(t);
+
+		SuiteWrapper.runSuite(tests, "jmeter v5", "vmvm", false, "./jmeter.properties org.apache.jmeter.util.JMeterUtils");
+//    	runTest(org.apache.xml.security.test.c14n.helper.C14nHelperTest.suite());
+//    	runTest(org.apache.xml.security.test.c14n.implementations.Canonicalizer20010315Test.suite());
+//    	runTest(org.apache.xml.security.test.c14n.implementations.Canonicalizer20010315ExclusiveTest.suite());
+//    	runTest(org.apache.xml.security.test.external.org.apache.xalan.XPathAPI.XalanBug1425Test.suite());
+//    	runTest(org.apache.xml.security.test.external.org.apache.xalan.XPathAPI.AttributeAncestorOrSelf.suite());
+//    	runTest(org.apache.xml.security.test.signature.XMLSignatureInputTest.suite());
+//    	runTest(org.apache.xml.security.test.transforms.implementations.TransformBase64DecodeTest.suite());
+//    	TestSuite suite = new TestSuite();
+//		TestSuite s1 = (TestSuite) org.apache.xml.security.test.ModuleTest.suite();
+//		TestSuite s2 = (TestSuite) org.apache.xml.security.test.InteropTest.suite();
+//		Enumeration<Test> e = s1.tests();
+//		while(e.hasMoreElements())
+//		{
+//			Test t = e.nextElement();
+//			suite.addTest(t);
+//		}
+//		e = s2.tests();
+//		while(e.hasMoreElements())
+//		{
+//			Test t = e.nextElement();
+//			suite.addTest(t);
+//		}
+//		e=suite.tests();
+//		while(e.hasMoreElements())
+//		{
+//			Test t = e.nextElement();
+//			runTest(t);
+//		}
+
+    }
+
+    static void runTest(String clazz)
+    {
+
+    	 try{
+    		 Class<?> testClass = ReflectionWrapper.forName(clazz,CopyOfDriver.class.getClassLoader());
+    	    	System.err.println(">>>>>Running testclass: " + testClass.getName());
+//    	        ClassLoader ctxLdr = Thread.currentThread().getContextClassLoader();
+    	        System.setProperty(
+    	        		"tomcat.test.protocol", "org.apache.coyote.http11.Http11Protocol");
+//    	        TestSuite theSuite = (TestSuite) testClass.getMethod("suite").invoke(null);
+//    	        theSuite.run(new TestResult());
+
+    	        Class<?> c= ReflectionWrapper.forName(clazz,TestRunner.class.getClassLoader());
+    	        ReflectionWrapper.forName("org.apache.jmeter.config.Arguments", TestRunner.class.getClassLoader());
+				initializeManager(new String[]{"","./jmeter.properties","org.apache.jmeter.util.JMeterUtils"});
+//				ReflectionWrapper.forName(org.apache.jmeter.config.Arguments.class.getName(), TestRunner.class.getClassLoader());
+
+				System.err.println(org.apache.jmeter.config.Arguments.class);
+//				nCases = new TestSuite(c).countTestCases();
+				junit.textui.TestRunner.run((Class<? extends TestCase>) c);
+//    			Class<?> c= ReflectionWrapper.forName(clazz,TestRunner.class.getClassLoader());
+
+//    		 TestRunner.run((TestSuite) testClass.getMethod("suite").invoke(null));
+//             Thread.currentThread().setContextClassLoader(ctxLdr);
+
+ 	         System.err.println("---Done: " + testClass.getName());
+
+         }
+         catch(Exception ex)
+         {
+         	ex.printStackTrace();
+         }
+	        VirtualRuntime.resetStatics();
+//         Thread.currentThread().setContextClassLoader(ctxLdr);
+    }
+    public static void initializeManager(String[] args) {
+		System.err.println("JMR: " + args.length);
+		if (args.length >= 3) {
+			try {
+				UnitTestManager um = (UnitTestManager) Class.forName(args[2]).newInstance();
+				um.initializeProperties(args[1]);
+			} catch (Exception e) {
+				System.out.println("Couldn't create: " + args[2]);
+				e.printStackTrace();
+			}
+		}
+	}
+    static void runTest(Test test)
+    {
+
+    	 try{
+    		 Class<?> testClass = ReflectionWrapper.forName(((TestSuite) test).testAt(0).getClass().getName(),CopyOfDriver.class.getClassLoader());
+    	    	System.err.println(">>>>>Running testclass: " + testClass.getName());
+//    	        ClassLoader ctxLdr = Thread.currentThread().getContextClassLoader();
+    	        System.setProperty(
+    	        		"tomcat.test.protocol", "org.apache.coyote.http11.Http11Protocol");
+//    		 TestRunner.run(testClass);
+//             Thread.currentThread().setContextClassLoader(ctxLdr);
+
+ 	         System.err.println("---Done: " + testClass.getName());
+
+         }
+         catch(Exception ex)
+         {
+         	ex.printStackTrace();
+         }
+	        VirtualRuntime.resetStatics();
+//         Thread.currentThread().setContextClassLoader(ctxLdr);
+    }
+}
diff --git a/tomcatRunner/src/edu/columbia/cs/psl/vmvm/junit/driver/Driver.java b/tomcatRunner/src/edu/columbia/cs/psl/vmvm/junit/driver/Driver.java
new file mode 100644
index 0000000..efa6a2f
--- /dev/null
+++ b/tomcatRunner/src/edu/columbia/cs/psl/vmvm/junit/driver/Driver.java
@@ -0,0 +1,127 @@
+package edu.columbia.cs.psl.vmvm.junit.driver;
+
+
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.util.Scanner;
+
+
+import org.apache.catalina.loader.TestVirtualContext;
+import org.apache.tomcat.util.http.TestCookiesAllowEquals;
+import org.apache.tomcat.util.http.TestCookiesAllowHttpSeps;
+import org.apache.tomcat.util.http.TestCookiesAllowNameOnly;
+import org.junit.Test;
+import org.junit.runner.Description;
+import org.junit.runner.JUnitCore;
+import org.junit.runner.Request;
+import org.junit.runner.Runner;
+import org.junit.runner.notification.Failure;
+import org.junit.runner.notification.RunListener;
+import org.junit.runners.BlockJUnit4ClassRunner;
+
+import edu.columbia.cs.psl.vmvm.CloningUtils;
+import edu.columbia.cs.psl.vmvm.ReflectionWrapper;
+import edu.columbia.cs.psl.vmvm.VirtualRuntime;
+
+public class Driver {
+    @Test
+    public static void main(String[] args) {
+//    	runTest(TestOutputBuffer.class);
+//    	runTest(TestAsyncContextImpl.class);
+//    	runTest(TestStandardContext.class);
+//    	runTest(TestRemoteIpFilter.class);
+//    	runTest(TestVirtualContext.class);
+//    	runTest(TestCookiesAllowEquals.class);
+//    	runTest(TestCookiesAllowNameOnly.class);
+//    	runTest(TestCookiesAllowHttpSeps.class);
+//    	runTest(TestAbstractHttp11Processor.class);
+//    	runTest(TestAbstractHttp11Processor.class);
+//    	runTest(TestFormAuthenticator.class);
+//    	runTest(TestNonLoginAndBasicAuthenticator.class);
+//    	runTest(TestSSOnonLoginAndBasicAuthenticator.class);
+//    	runTest(TestSSOnonLoginAndDigestAuthenticator.class);
+//    	runTest(TestCometProcessor.class);
+//    	runTest(TestConnector.class);
+//    	runTest(TestCoyoteAdapter.class);
+//    	runTest(TestInputBuffer.class);
+//    	runTest(TestKeepAliveCount.class);
+//    	runTest(TestMaxConnections.class);
+//    	runTest(TestOutputBuffer.class);
+//    	runTest(AnnotationUtilsTest.class);
+//    	runTest(ObjectUtilsTest.class);
+//    	runTest(SystemUtilsTest.class);
+//    	runTest(RandomStringUtilsTest.class);
+//    	runTest(ToStringBuilderTest.class);
+//    	runTest(ConstructorUtilsTest.class);
+//    	runTest(ClassUtilsTest.class);
+//    	runTest(MethodUtilsTest.class);
+//    	runTest(TestCompositeELResolver.class);
+//    	runTest(TestCompositeELResolver.class);
+//    	runTest(org.apache.xml.security.test.c14n.helper.C14nHelperTest.class);
+//    	runTest(org.apache.xml.security.test.c14n.implementations.Canonicalizer20010315Test.class);
+//    	runTest(org.apache.xml.security.test.c14n.implementations.Canonicalizer20010315ExclusiveTest.class);
+//    	runTest(org.apache.catalina.core.TestStandardWrapper.class);
+//    	runTest(org.apache.catalina.core.TestSwallowAbortedUploads.class);
+//    	runTest(org.apache.catalina.core.TestStandardWrapper.class);
+//    	runTest(org.apache.catalina.loader.TestWebappClassLoaderThreadLocalMemoryLeak.class); //still not fixed
+//    	runTest(org.apache.catalina.startup.TestTomcatClassLoader.class);
+    	runTest(org.apache.catalina.tribes.group.TestGroupChannelSenderConnections.class);
+    	runTest(org.apache.catalina.tribes.group.interceptors.TestNonBlockingCoordinator.class);
+    	runTest(org.apache.catalina.tribes.group.interceptors.TestOrderInterceptor.class);
+    	runTest(org.apache.catalina.tribes.group.interceptors.TestTcpFailureDetector.class);
+//    	runTest(org.apache.catalina.core.TestStandardWrapper.class);
+//    	runTest(org.apache.catalina.core.TestStandardWrapper.class);
+//    	runTest(org.apache.catalina.core.TestSwallowAbortedUploads.class);
+//    	runTest(org.apache.catalina.core.TestStandardWrapper.class);
+//    	runTest(org.apache.catalina.loader.TestWebappClassLoaderThreadLocalMemoryLeak.class); //still not fixed
+//    	runTest(org.apache.catalina.startup.TestTomcatClassLoader.class);
+    	runTest(org.apache.catalina.tribes.group.TestGroupChannelSenderConnections.class);
+    	runTest(org.apache.catalina.tribes.group.interceptors.TestNonBlockingCoordinator.class);
+    	runTest(org.apache.catalina.tribes.group.interceptors.TestOrderInterceptor.class);
+    	runTest(org.apache.catalina.tribes.group.interceptors.TestTcpFailureDetector.class);
+    	runTest(org.apache.catalina.core.TestStandardWrapper.class);
+    }
+    static void runTest(Class<?> testClass)
+    {
+    	System.out.println("Running testclass: " + testClass.getName());
+        ClassLoader ctxLdr = Thread.currentThread().getContextClassLoader();
+        System.setProperty(
+        		"tomcat.test.protocol", "org.apache.coyote.http11.Http11Protocol");
+    	 try{
+
+    		 ReflectionWrapper.forName(testClass.getName(), true, testClass.getClassLoader());
+    		 Runner r = new BlockJUnit4ClassRunner(testClass);
+         	JUnitCore c = new JUnitCore();
+
+         	c.addListener(new RunListener(){
+         		@Override
+         		public void testFailure(Failure failure) throws Exception {
+         		System.out.println("FAIL: " + failure.getMessage());
+         		failure.getException().printStackTrace();
+         		}
+         		@Override
+         		public void testFinished(Description description) throws Exception {
+         			System.out.println("DONE: " + description.getDisplayName());
+//         	        VirtualRuntime.resetStatics();
+
+         		}
+         		@Override
+         		public void testStarted(Description description) throws Exception {
+         			System.out.println("Starting: " + description.getDisplayName());
+         		}
+         	});
+
+         	c.run(Request.runner(r));
+
+             Thread.currentThread().setContextClassLoader(ctxLdr);
+
+ 	        VirtualRuntime.resetStatics();
+         }
+         catch(Exception ex)
+         {
+         	ex.printStackTrace();
+         }
+         System.out.println("---Done: " + testClass.getName());
+//         Thread.currentThread().setContextClassLoader(ctxLdr);
+    }
+}
diff --git a/tomcatRunner/src/edu/columbia/cs/psl/vmvm/junit/driver/IvyDriver.java b/tomcatRunner/src/edu/columbia/cs/psl/vmvm/junit/driver/IvyDriver.java
new file mode 100644
index 0000000..e5fbb91
--- /dev/null
+++ b/tomcatRunner/src/edu/columbia/cs/psl/vmvm/junit/driver/IvyDriver.java
@@ -0,0 +1,352 @@
+package edu.columbia.cs.psl.vmvm.junit.driver;
+
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+
+import junit.framework.TestResult;
+import junit.framework.TestSuite;
+
+
+import edu.columbia.cs.psl.vmvm.VirtualRuntime;
+
+public class IvyDriver {
+
+
+    public static void main(String[] args) {
+//    	runTest(TestOutputBuffer.class);
+//    	runTest(TestAsyncContextImpl.class);
+//    	runTest(TestStandardContext.class);
+//    	runTest(TestRemoteIpFilter.class);
+//    	runTest(TestVirtualContext.class);
+//    	runTest(TestCookiesAllowEquals.class);
+//    	runTest(TestCookiesAllowNameOnly.class);
+//    	runTest(TestCookiesAllowHttpSeps.class);
+//    	runTest(TestAbstractHttp11Processor.class);
+//    	runTest(TestAbstractHttp11Processor.class);
+//    	runTest(TestFormAuthenticator.class);
+//    	runTest(TestNonLoginAndBasicAuthenticator.class);
+//    	runTest(TestSSOnonLoginAndBasicAuthenticator.class);
+//    	runTest(TestSSOnonLoginAndDigestAuthenticator.class);
+//    	runTest(TestCometProcessor.class);
+//    	runTest(TestConnector.class);
+//    	runTest(TestCoyoteAdapter.class);
+//    	runTest(TestInputBuffer.class);
+//    	runTest(TestKeepAliveCount.class);
+//    	runTest(TestMaxConnections.class);
+//    	runTest(TestOutputBuffer.class);
+//    	runTest(AnnotationUtilsTest.class);
+//    	runTest(ObjectUtilsTest.class);
+//    	runTest(SystemUtilsTest.class);
+//    	runTest(RandomStringUtilsTest.class);
+//    	runTest(ToStringBuilderTest.class);
+//    	runTest(ConstructorUtilsTest.class);
+//    	runTest(ClassUtilsTest.class);
+//    	runTest(MethodUtilsTest.class);
+//    	runTest(TestCompositeELResolver.class);
+//    	runTest(TestCompositeELResolver.class);
+    	ArrayList<Class> tests = new ArrayList<>();
+
+//    	tests.add(com.continuent.bristlecone.benchmark.test.BenchmarkTest.class);
+//    	tests.add(org.apache.ivy.IvyTest.class);
+//    	tests.add(org.apache.ivy.MainTest.class);
+//
+//    	tests.add(org.apache.ivy.ant.AntBuildTriggerTest.class);
+//    	tests.add(org.apache.ivy.ant.AntCallTriggerTest.class);
+//    	tests.add(org.apache.ivy.ant.FixDepsTaskTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyAntSettingsBuildFileTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyConfigureTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyRetrieveBuildFileTest.class);
+//    	tests.add(org.apache.ivy.osgi.repo.BundleRepoTest.class);
+//
+//
+//    	tests.add(org.apache.ivy.osgi.updatesite.UpdateSiteLoaderTest.class);
+    	tests.add(org.apache.ivy.IvyTest.class);
+    	tests.add(org.apache.ivy.MainTest.class);
+////
+//    	tests.add(org.apache.ivy.ant.AntBuildTriggerTest.class);
+//    	tests.add(org.apache.ivy.ant.AntCallTriggerTest.class);
+//    	tests.add(org.apache.ivy.ant.FixDepsTaskTest.class);
+    	tests.add(org.apache.ivy.ant.IvyAntSettingsBuildFileTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyArtifactPropertyTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyArtifactReportTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyBuildListTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyBuildNumberTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyCacheFilesetTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyCachePathTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyCleanCacheTest.class);
+//
+//    	tests.add(org.apache.ivy.ant.IvyConfigureTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyRetrieveBuildFileTest.class);
+//    	tests.add(org.apache.ivy.core.resolve.ResolveTest.class);
+//    	tests.add(org.apache.ivy.osgi.repo.BundleRepoTest.class);
+////
+
+//    	tests.add(org.apache.ivy.plugins.conflict.LatestCompatibleConflictManagerTest.class);
+//    	tests.add(org.apache.ivy.plugins.conflict.RegexpConflictManagerTest.class);
+//    	tests.add(org.apache.ivy.plugins.conflict.StrictConflictManagerTest.class);
+//    	tests.add(org.apache.ivy.plugins.trigger.LogTriggerTest.class);
+//    	tests.add(org.apache.ivy.plugins.resolver.ChainResolverTest.class);
+//
+//    	tests.add(org.apache.ivy.plugins.report.XmlReportWriterTest.class);
+//
+//    	tests.add(org.apache.ivy.plugins.lock.ArtifactLockStrategyTest.class);
+//    	tests.add(org.apache.ivy.IvyTest.class);
+//    	tests.add(org.apache.ivy.MainTest.class);
+//    	tests.add(org.apache.ivy.ant.AntBuildTriggerTest.class);
+//    	tests.add(org.apache.ivy.ant.AntCallTriggerTest.class);
+//    	tests.add(org.apache.ivy.ant.FixDepsTaskTest.class);
+
+
+//    	tests.add(org.apache.ivy.ant.IvyConvertPomTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyDeliverTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyDependencyTreeTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyDependencyUpdateCheckerTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyFindRevisionTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyInfoRepositoryTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyInfoTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyInstallTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyListModulesTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyPostResolveTaskTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyPublishTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyReportTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyRepositoryReportTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyResolveTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyResourcesTest.class);
+
+//    	tests.add(org.apache.ivy.ant.IvyRetrieveTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyTaskTest.class);
+//    	tests.add(org.apache.ivy.ant.IvyVarTest.class);
+//    	tests.add(org.apache.ivy.core.NormalRelativeUrlResolverTest.class);
+//    	tests.add(org.apache.ivy.core.cache.DefaultRepositoryCacheManagerTest.class);
+//    	tests.add(org.apache.ivy.core.cache.ModuleDescriptorMemoryCacheTest.class);
+//    	tests.add(org.apache.ivy.core.deliver.DeliverTest.class);
+//    	tests.add(org.apache.ivy.core.event.IvyEventFilterTest.class);
+//    	tests.add(org.apache.ivy.core.install.InstallTest.class);
+//    	tests.add(org.apache.ivy.core.module.descriptor.DefaultDependencyDescriptorTest.class);
+//    	tests.add(org.apache.ivy.core.module.id.ModuleIdTest.class);
+//    	tests.add(org.apache.ivy.core.module.id.ModuleRevisionIdTest.class);
+//    	tests.add(org.apache.ivy.core.module.id.ModuleRulesTest.class);
+//    	tests.add(org.apache.ivy.core.publish.PublishEngineTest.class);
+//    	tests.add(org.apache.ivy.core.publish.PublishEventsTest.class);
+//    	tests.add(org.apache.ivy.core.report.ResolveReportTest.class);
+//    	tests.add(org.apache.ivy.core.repository.RepositoryManagementEngineTest.class);
+//    	tests.add(org.apache.ivy.core.resolve.ResolveEngineTest.class);
+//    	tests.add(org.apache.ivy.core.resolve.ResolveTest.class);
+//    	tests.add(org.apache.ivy.core.retrieve.RetrieveTest.class);
+//    	tests.add(org.apache.ivy.core.search.SearchTest.class);
+//    	tests.add(org.apache.ivy.core.settings.ConfigureTest.class);
+//    	tests.add(org.apache.ivy.core.settings.IvySettingsTest.class);
+//    	tests.add(org.apache.ivy.core.settings.OnlineXmlSettingsParserTest.class);
+//    	tests.add(org.apache.ivy.core.settings.XmlSettingsParserTest.class);
+//    	tests.add(org.apache.ivy.core.sort.SortTest.class);
+//    	tests.add(org.apache.ivy.osgi.core.ExecutionEnvironmentProfileLoaderTest.class);
+//    	tests.add(org.apache.ivy.osgi.core.ManifestHeaderTest.class);
+//    	tests.add(org.apache.ivy.osgi.core.ManifestParserTest.class);
+//    	tests.add(org.apache.ivy.osgi.core.OSGiManifestParserTest.class);
+//    	tests.add(org.apache.ivy.osgi.core.OsgiLatestStrategyTest.class);
+//    	tests.add(org.apache.ivy.osgi.obr.OBRParserTest.class);
+//    	tests.add(org.apache.ivy.osgi.obr.OBRResolverTest.class);
+//    	tests.add(org.apache.ivy.osgi.obr.RequirementFilterTest.class);
+//    	tests.add(org.apache.ivy.osgi.p2.P2DescriptorTest.class);
+
+//    	tests.add(org.apache.ivy.osgi.updatesite.UpdateSiteAndIbiblioResolverTest.class);
+//    	tests.add(org.apache.ivy.osgi.updatesite.UpdateSiteLoaderTest.class);
+//    	tests.add(org.apache.ivy.osgi.updatesite.UpdateSiteResolverTest.class);
+//    	tests.add(org.apache.ivy.osgi.util.ParseUtilTest.class);
+//    	tests.add(org.apache.ivy.osgi.util.VersionRangeTest.class);
+//    	tests.add(org.apache.ivy.osgi.util.VersionTest.class);
+//    	tests.add(org.apache.ivy.plugins.circular.IgnoreCircularDependencyStrategyTest.class);
+    	tests.add(org.apache.ivy.plugins.circular.WarnCircularDependencyStrategyTest.class);
+
+    	//    	tests.add(org.apache.ivy.plugins.conflict.LatestConflictManagerTest.class);
+
+//    	tests.add(org.apache.ivy.plugins.latest.LatestRevisionStrategyTest.class);
+
+    	//    	tests.add(org.apache.ivy.plugins.matcher.ExactOrRegexpPatternMatcherTest.class);
+//    	tests.add(org.apache.ivy.plugins.matcher.ExactPatternMatcherTest.class);
+//    	tests.add(org.apache.ivy.plugins.matcher.GlobPatternMatcherTest.class);
+//    	tests.add(org.apache.ivy.plugins.matcher.RegexpPatternMatcherTest.class);
+//    	tests.add(org.apache.ivy.plugins.namespace.MRIDTransformationRuleTest.class);
+//    	tests.add(org.apache.ivy.plugins.namespace.NameSpaceHelperTest.class);
+//    	tests.add(org.apache.ivy.plugins.parser.ModuleDescriptorParserRegistryTest.class);
+//    	tests.add(org.apache.ivy.plugins.parser.m2.PomModuleDescriptorParserTest.class);
+//    	tests.add(org.apache.ivy.plugins.parser.m2.PomModuleDescriptorWriterTest.class);
+//    	tests.add(org.apache.ivy.plugins.parser.xml.XmlModuleDescriptorParserTest.class);
+//    	tests.add(org.apache.ivy.plugins.parser.xml.XmlModuleDescriptorWriterTest.class);
+//    	tests.add(org.apache.ivy.plugins.parser.xml.XmlModuleUpdaterTest.class);
+//    	tests.add(org.apache.ivy.plugins.report.XmlReportParserTest.class);
+//    	tests.add(org.apache.ivy.plugins.repository.vfs.VfsRepositoryTest.class);
+//    	tests.add(org.apache.ivy.plugins.repository.vfs.VfsResourceTest.class);
+//    	tests.add(org.apache.ivy.plugins.resolver.DualResolverTest.class);
+//    	tests.add(org.apache.ivy.plugins.resolver.FileSystemResolverTest.class);
+//    	tests.add(org.apache.ivy.plugins.resolver.IBiblioResolverTest.class);
+//    	tests.add(org.apache.ivy.plugins.resolver.IvyRepResolverTest.class);
+//    	tests.add(org.apache.ivy.plugins.resolver.JarResolverTest.class);
+//    	tests.add(org.apache.ivy.plugins.resolver.Maven2LocalTest.class);
+//    	tests.add(org.apache.ivy.plugins.resolver.MirroredURLResolverTest.class);
+//    	tests.add(org.apache.ivy.plugins.resolver.PackagerResolverTest.class);
+//    	tests.add(org.apache.ivy.plugins.resolver.URLResolverTest.class);
+//    	tests.add(org.apache.ivy.plugins.resolver.VfsResolverTest.class);
+//    	tests.add(org.apache.ivy.plugins.resolver.util.ResolverHelperTest.class);
+//    	tests.add(org.apache.ivy.plugins.trigger.LogTriggerTest.class);
+    	tests.add(org.apache.ivy.plugins.version.LatestVersionMatcherTest.class);
+//    	tests.add(org.apache.ivy.plugins.version.PatternVersionMatcherTest.class);
+//    	tests.add(org.apache.ivy.plugins.version.VersionRangeMatcherTest.class);
+//    	tests.add(org.apache.ivy.util.ConfiguratorTest.class);
+//    	tests.add(org.apache.ivy.util.IvyPatternHelperTest.class);
+    	tests.add(org.apache.ivy.util.StringUtilsTest.class);
+    	tests.add(org.apache.ivy.osgi.repo.BundleRepoTest.class);
+    	tests.add(org.apache.ivy.plugins.circular.WarnCircularDependencyStrategyTest.class);
+//    	tests.add(org.apache.ivy.util.url.ApacheURLListerTest.class);
+//    	tests.add(org.apache.ivy.util.url.ArtifactoryListingTest.class);
+//    	tests.add(org.apache.ivy.util.url.BasicURLHandlerTest.class);
+//    	tests.add(org.apache.ivy.util.url.HttpclientURLHandlerTest.class);
+    	for(Class c : tests)
+    	{
+    		runTest(c);
+    	}
+//		SuiteWrapper.runSuite(tests, "ivy DEBUG", "vmvm", false,"");
+//    	runTest(org.apache.xml.security.test.c14n.helper.C14nHelperTest.suite());
+//    	runTest(org.apache.xml.security.test.c14n.implementations.Canonicalizer20010315Test.suite());
+//    	runTest(org.apache.xml.security.test.c14n.implementations.Canonicalizer20010315ExclusiveTest.suite());
+//    	runTest(org.apache.xml.security.test.external.org.apache.xalan.XPathAPI.XalanBug1425Test.suite());
+//    	runTest(org.apache.xml.security.test.external.org.apache.xalan.XPathAPI.AttributeAncestorOrSelf.suite());
+//    	runTest(org.apache.xml.security.test.signature.XMLSignatureInputTest.suite());
+//    	runTest(org.apache.xml.security.test.transforms.implementations.TransformBase64DecodeTest.suite());
+//    	TestSuite suite = new TestSuite();
+//		TestSuite s1 = (TestSuite) org.apache.xml.security.test.ModuleTest.suite();
+//		TestSuite s2 = (TestSuite) org.apache.xml.security.test.InteropTest.suite();
+//		Enumeration<Test> e = s1.tests();
+//		while(e.hasMoreElements())
+//		{
+//			Test t = e.nextElement();
+//			suite.addTest(t);
+//		}
+//		e = s2.tests();
+//		while(e.hasMoreElements())
+//		{
+//			Test t = e.nextElement();
+//			suite.addTest(t);
+//		}
+//		e=suite.tests();
+//		while(e.hasMoreElements())
+//		{
+//			Test t = e.nextElement();
+//			runTest(t);
+//		}
+
+    }
+
+//    static void runTest(String clazz)
+//    {
+//
+//    	 try{
+//    		 Class<?> testClass = ReflectionWrapper.forName(clazz,IvyDriver.class.getClassLoader());
+//    	    	System.err.println(">>>>>Running testclass: " + testClass.getName());
+////    	        ClassLoader ctxLdr = Thread.currentThread().getContextClassLoader();
+//    	        System.setProperty(
+//    	        		"tomcat.test.protocol", "org.apache.coyote.http11.Http11Protocol");
+////    	        TestSuite theSuite = (TestSuite) testClass.getMethod("suite").invoke(null);
+////    	        theSuite.run(new TestResult());
+//
+//    	        Class<?> c= ReflectionWrapper.forName(clazz,TestRunner.class.getClassLoader());
+//    	        ReflectionWrapper.forName("org.apache.jmeter.config.Arguments", TestRunner.class.getClassLoader());
+//				initializeManager(new String[]{"","./jmeter.properties","org.apache.jmeter.util.JMeterUtils"});
+////				ReflectionWrapper.forName(org.apache.jmeter.config.Arguments.class.getName(), TestRunner.class.getClassLoader());
+//
+//				System.err.println(org.apache.jmeter.config.Arguments.class);
+////				nCases = new TestSuite(c).countTestCases();
+//				junit.textui.TestRunner.run((Class<? extends TestCase>) c);
+////    			Class<?> c= ReflectionWrapper.forName(clazz,TestRunner.class.getClassLoader());
+//
+////    		 TestRunner.run((TestSuite) testClass.getMethod("suite").invoke(null));
+////             Thread.currentThread().setContextClassLoader(ctxLdr);
+//
+// 	         System.err.println("---Done: " + testClass.getName());
+//
+//         }
+//         catch(Exception ex)
+//         {
+//         	ex.printStackTrace();
+//         }
+//	        VirtualRuntime.resetStatics();
+////         Thread.currentThread().setContextClassLoader(ctxLdr);
+//    }
+//    public static void initializeManager(String[] args) {
+//		System.err.println("JMR: " + args.length);
+//		if (args.length >= 3) {
+//			try {
+//				UnitTestManager um = (UnitTestManager) Class.forName(args[2]).newInstance();
+//				um.initializeProperties(args[1]);
+//			} catch (Exception e) {
+//				System.out.println("Couldn't create: " + args[2]);
+//				e.printStackTrace();
+//			}
+//		}
+//	}
+//    static void runTest(Test test)
+//    {
+//
+//    	 try{
+//    		 Class<?> testClass = ReflectionWrapper.forName(((TestSuite) test).testAt(0).getClass().getName(),IvyDriver.class.getClassLoader());
+//    	    	System.err.println(">>>>>Running testclass: " + testClass.getName());
+////    	        ClassLoader ctxLdr = Thread.currentThread().getContextClassLoader();
+//    	        System.setProperty(
+//    	        		"tomcat.test.protocol", "org.apache.coyote.http11.Http11Protocol");
+////    		 TestRunner.run(testClass);
+////             Thread.currentThread().setContextClassLoader(ctxLdr);
+//
+// 	         System.err.println("---Done: " + testClass.getName());
+//
+//         }
+//         catch(Exception ex)
+//         {
+//         	ex.printStackTrace();
+//         }
+//	        VirtualRuntime.resetStatics();
+////         Thread.currentThread().setContextClassLoader(ctxLdr);
+//    }
+    static void runTest(Class<?> testClass)
+    {
+    	System.out.println("Running testclass: " + testClass.getName());
+//        ClassLoader ctxLdr = Thread.currentThread().getContextClassLoader();
+    	 try{
+    		 TestResult r = new junit.textui.TestRunner().doRun(new TestSuite(testClass));
+    		 System.out.println("Finished: " + r.errorCount() + "err "  + r.failureCount() + "fail " + r.runCount() + "tot ");
+//         	junit.textui.TestRunner.run(testClass);
+//         	JUnitCore c = new JUnitCore();
+//
+//         	c.addListener(new RunListener(){
+//         		@Override
+//         		public void testFailure(Failure failure) throws Exception {
+//         		System.out.println("FAIL: " + failure.getMessage());
+//         		failure.getException().printStackTrace();
+//         		}
+//         		@Override
+//         		public void testFinished(Description description) throws Exception {
+//         			System.out.println("DONE: " + description.getDisplayName());
+////         	        VirtualRuntime.resetStatics();
+//
+//         		}
+//         		@Override
+//         		public void testStarted(Description description) throws Exception {
+//         			System.out.println("Starting: " + description.getDisplayName());
+//         		}
+//         	});
+//
+//         	c.run(Request.runner(r));
+
+//             Thread.currentThread().setContextClassLoader(ctxLdr);
+
+ 	        VirtualRuntime.resetStatics();
+         }
+         catch(Exception ex)
+         {
+         	ex.printStackTrace();
+         }
+         System.out.println("---Done: " + testClass.getName());
+//         Thread.currentThread().setContextClassLoader(ctxLdr);
+    }
+
+}
diff --git a/tomcatRunner/src/log4j.properties b/tomcatRunner/src/log4j.properties
new file mode 100644
index 0000000..e69de29
diff --git a/vmvm.log b/vmvm.log
deleted file mode 100644
index 2c3184d..0000000
--- a/vmvm.log
+++ /dev/null
@@ -1,764 +0,0 @@
-[vmvm - main (2012-09-05 11:41:18,184)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(56) | Building links
-[vmvm - main (2012-09-05 11:41:19,001)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(111) | 5000 classes processed
-[vmvm - main (2012-09-05 11:41:19,287)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(60) | Initialized.. now writing to disk
-[vmvm - main (2012-09-05 11:41:19,308)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(70) | Done
-[vmvm - main (2012-09-05 11:41:32,056)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(56) | Building links
-[vmvm - main (2012-09-05 11:41:33,559)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(111) | 5000 classes processed
-[vmvm - main (2012-09-05 11:41:34,095)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(60) | Initialized.. now writing to disk
-[vmvm - main (2012-09-05 11:41:34,132)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(70) | Done
-[vmvm - main (2012-09-05 11:41:50,927)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(56) | Building links
-[vmvm - main (2012-09-05 11:42:12,520)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(56) | Building links
-[vmvm - main (2012-09-05 11:42:26,487)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(56) | Building links
-[vmvm - main (2012-09-05 11:42:54,020)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(56) | Building links
-[vmvm - main (2012-09-05 11:43:41,915)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(56) | Building links
-[vmvm - main (2012-09-05 11:43:48,221)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(56) | Building links
-[vmvm - main (2012-09-05 11:44:01,221)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(56) | Building links
-[vmvm - main (2012-09-05 11:44:19,420)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(56) | Building links
-[vmvm - main (2012-09-05 11:44:31,440)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(56) | Building links
-[vmvm - main (2012-09-05 11:44:31,624)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 100 classes processed
-[vmvm - main (2012-09-05 11:44:31,714)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 200 classes processed
-[vmvm - main (2012-09-05 11:44:31,810)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 300 classes processed
-[vmvm - main (2012-09-05 11:44:31,875)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 400 classes processed
-[vmvm - main (2012-09-05 11:44:31,922)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 500 classes processed
-[vmvm - main (2012-09-05 11:44:31,990)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 600 classes processed
-[vmvm - main (2012-09-05 11:44:32,127)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 700 classes processed
-[vmvm - main (2012-09-05 11:44:32,208)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 800 classes processed
-[vmvm - main (2012-09-05 11:44:32,264)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 900 classes processed
-[vmvm - main (2012-09-05 11:44:32,305)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 1000 classes processed
-[vmvm - main (2012-09-05 11:44:32,335)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 1100 classes processed
-[vmvm - main (2012-09-05 11:44:32,366)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 1200 classes processed
-[vmvm - main (2012-09-05 11:44:32,397)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 1300 classes processed
-[vmvm - main (2012-09-05 11:44:32,447)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 1400 classes processed
-[vmvm - main (2012-09-05 11:44:32,488)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 1500 classes processed
-[vmvm - main (2012-09-05 11:44:32,549)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 1600 classes processed
-[vmvm - main (2012-09-05 11:44:32,595)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 1700 classes processed
-[vmvm - main (2012-09-05 11:44:32,640)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 1800 classes processed
-[vmvm - main (2012-09-05 11:44:32,682)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 1900 classes processed
-[vmvm - main (2012-09-05 11:44:32,708)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 2000 classes processed
-[vmvm - main (2012-09-05 11:44:32,741)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 2100 classes processed
-[vmvm - main (2012-09-05 11:44:32,765)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 2200 classes processed
-[vmvm - main (2012-09-05 11:44:32,809)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 2300 classes processed
-[vmvm - main (2012-09-05 11:44:32,851)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 2400 classes processed
-[vmvm - main (2012-09-05 11:44:32,895)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 2500 classes processed
-[vmvm - main (2012-09-05 11:44:32,923)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 2600 classes processed
-[vmvm - main (2012-09-05 11:44:32,970)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 2700 classes processed
-[vmvm - main (2012-09-05 11:44:32,993)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 2800 classes processed
-[vmvm - main (2012-09-05 11:44:33,017)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 2900 classes processed
-[vmvm - main (2012-09-05 11:44:33,043)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 3000 classes processed
-[vmvm - main (2012-09-05 11:44:33,079)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 3100 classes processed
-[vmvm - main (2012-09-05 11:44:33,115)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 3200 classes processed
-[vmvm - main (2012-09-05 11:44:33,147)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 3300 classes processed
-[vmvm - main (2012-09-05 11:44:33,174)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 3400 classes processed
-[vmvm - main (2012-09-05 11:44:33,208)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 3500 classes processed
-[vmvm - main (2012-09-05 11:44:33,236)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 3600 classes processed
-[vmvm - main (2012-09-05 11:44:33,265)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 3700 classes processed
-[vmvm - main (2012-09-05 11:44:33,324)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 3800 classes processed
-[vmvm - main (2012-09-05 11:44:33,404)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 3900 classes processed
-[vmvm - main (2012-09-05 11:44:33,440)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 4000 classes processed
-[vmvm - main (2012-09-05 11:44:33,474)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 4100 classes processed
-[vmvm - main (2012-09-05 11:44:33,509)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 4200 classes processed
-[vmvm - main (2012-09-05 11:44:33,548)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 4300 classes processed
-[vmvm - main (2012-09-05 11:44:33,572)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 4400 classes processed
-[vmvm - main (2012-09-05 11:44:33,593)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 4500 classes processed
-[vmvm - main (2012-09-05 11:44:33,616)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 4600 classes processed
-[vmvm - main (2012-09-05 11:44:33,636)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 4700 classes processed
-[vmvm - main (2012-09-05 11:44:33,669)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 4800 classes processed
-[vmvm - main (2012-09-05 11:44:33,725)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 4900 classes processed
-[vmvm - main (2012-09-05 11:44:33,778)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 5000 classes processed
-[vmvm - main (2012-09-05 11:44:33,854)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 5100 classes processed
-[vmvm - main (2012-09-05 11:44:33,903)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 5200 classes processed
-[vmvm - main (2012-09-05 11:44:38,104)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(56) | Building links
-[vmvm - main (2012-09-05 11:44:38,269)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 100 classes processed
-[vmvm - main (2012-09-05 11:44:38,346)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 200 classes processed
-[vmvm - main (2012-09-05 11:44:38,419)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 300 classes processed
-[vmvm - main (2012-09-05 11:44:38,472)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 400 classes processed
-[vmvm - main (2012-09-05 11:44:38,507)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 500 classes processed
-[vmvm - main (2012-09-05 11:44:38,550)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 600 classes processed
-[vmvm - main (2012-09-05 11:44:38,606)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 700 classes processed
-[vmvm - main (2012-09-05 11:44:38,662)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 800 classes processed
-[vmvm - main (2012-09-05 11:44:38,705)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 900 classes processed
-[vmvm - main (2012-09-05 11:44:38,736)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 1000 classes processed
-[vmvm - main (2012-09-05 11:44:38,762)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 1100 classes processed
-[vmvm - main (2012-09-05 11:44:38,788)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 1200 classes processed
-[vmvm - main (2012-09-05 11:44:38,816)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 1300 classes processed
-[vmvm - main (2012-09-05 11:44:38,851)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 1400 classes processed
-[vmvm - main (2012-09-05 11:44:38,883)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 1500 classes processed
-[vmvm - main (2012-09-05 11:44:38,934)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 1600 classes processed
-[vmvm - main (2012-09-05 11:44:38,969)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 1700 classes processed
-[vmvm - main (2012-09-05 11:44:39,004)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 1800 classes processed
-[vmvm - main (2012-09-05 11:44:39,030)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 1900 classes processed
-[vmvm - main (2012-09-05 11:44:39,054)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 2000 classes processed
-[vmvm - main (2012-09-05 11:44:39,082)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 2100 classes processed
-[vmvm - main (2012-09-05 11:44:39,106)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 2200 classes processed
-[vmvm - main (2012-09-05 11:44:39,144)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 2300 classes processed
-[vmvm - main (2012-09-05 11:44:39,181)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 2400 classes processed
-[vmvm - main (2012-09-05 11:44:39,215)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 2500 classes processed
-[vmvm - main (2012-09-05 11:44:39,231)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 2600 classes processed
-[vmvm - main (2012-09-05 11:44:39,246)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 2700 classes processed
-[vmvm - main (2012-09-05 11:44:39,277)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 2800 classes processed
-[vmvm - main (2012-09-05 11:44:39,290)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 2900 classes processed
-[vmvm - main (2012-09-05 11:44:39,305)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 3000 classes processed
-[vmvm - main (2012-09-05 11:44:39,321)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 3100 classes processed
-[vmvm - main (2012-09-05 11:44:39,335)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 3200 classes processed
-[vmvm - main (2012-09-05 11:44:39,348)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 3300 classes processed
-[vmvm - main (2012-09-05 11:44:39,362)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 3400 classes processed
-[vmvm - main (2012-09-05 11:44:39,377)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 3500 classes processed
-[vmvm - main (2012-09-05 11:44:39,391)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 3600 classes processed
-[vmvm - main (2012-09-05 11:44:39,404)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 3700 classes processed
-[vmvm - main (2012-09-05 11:44:39,427)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 3800 classes processed
-[vmvm - main (2012-09-05 11:44:39,477)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 3900 classes processed
-[vmvm - main (2012-09-05 11:44:39,496)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 4000 classes processed
-[vmvm - main (2012-09-05 11:44:39,512)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 4100 classes processed
-[vmvm - main (2012-09-05 11:44:39,531)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 4200 classes processed
-[vmvm - main (2012-09-05 11:44:39,550)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 4300 classes processed
-[vmvm - main (2012-09-05 11:44:39,568)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 4400 classes processed
-[vmvm - main (2012-09-05 11:44:39,586)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 4500 classes processed
-[vmvm - main (2012-09-05 11:44:39,605)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 4600 classes processed
-[vmvm - main (2012-09-05 11:44:39,623)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 4700 classes processed
-[vmvm - main (2012-09-05 11:44:39,653)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 4800 classes processed
-[vmvm - main (2012-09-05 11:44:39,695)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 4900 classes processed
-[vmvm - main (2012-09-05 11:44:39,739)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 5000 classes processed
-[vmvm - main (2012-09-05 11:44:39,795)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 5100 classes processed
-[vmvm - main (2012-09-05 11:44:39,835)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 5200 classes processed
-[vmvm - main (2012-09-05 11:44:39,875)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 5300 classes processed
-[vmvm - main (2012-09-05 11:44:39,913)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 5400 classes processed
-[vmvm - main (2012-09-05 11:44:39,952)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 5500 classes processed
-[vmvm - main (2012-09-05 11:44:40,065)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 5600 classes processed
-[vmvm - main (2012-09-05 11:44:40,115)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 5700 classes processed
-[vmvm - main (2012-09-05 11:44:40,164)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 5800 classes processed
-[vmvm - main (2012-09-05 11:44:40,208)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 5900 classes processed
-[vmvm - main (2012-09-05 11:44:40,239)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 6000 classes processed
-[vmvm - main (2012-09-05 11:44:40,279)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 6100 classes processed
-[vmvm - main (2012-09-05 11:44:40,318)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 6200 classes processed
-[vmvm - main (2012-09-05 11:44:40,343)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(112) | 6300 classes processed
-[vmvm - main (2012-09-05 11:44:40,344)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(60) | Initialized.. now writing to disk
-[vmvm - main (2012-09-05 11:44:40,375)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(70) | Done
-[vmvm - main (2012-09-05 11:45:00,066)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(56) | Building links
-[vmvm - main (2012-09-05 11:45:00,677)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(110) | 1000 classes processed
-[vmvm - main (2012-09-05 11:45:00,993)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(110) | 2000 classes processed
-[vmvm - main (2012-09-05 11:45:01,234)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(110) | 3000 classes processed
-[vmvm - main (2012-09-05 11:45:01,423)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(110) | 4000 classes processed
-[vmvm - main (2012-09-05 11:45:01,643)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(110) | 5000 classes processed
-[vmvm - main (2012-09-05 11:45:02,114)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(110) | 6000 classes processed
-[vmvm - main (2012-09-05 11:45:02,227)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(60) | Initialized.. now writing to disk
-[vmvm - main (2012-09-05 11:45:02,264)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(70) | Done
-[vmvm - main (2012-09-05 11:51:18,621)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(56) | Building links
-[vmvm - main (2012-09-05 11:51:19,351)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(110) | 1000 classes processed
-[vmvm - main (2012-09-05 11:51:19,748)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(110) | 2000 classes processed
-[vmvm - main (2012-09-05 11:51:20,114)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(110) | 3000 classes processed
-[vmvm - main (2012-09-05 11:51:20,582)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(110) | 4000 classes processed
-[vmvm - main (2012-09-05 11:51:20,910)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(110) | 5000 classes processed
-[vmvm - main (2012-09-05 11:51:21,484)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(110) | 6000 classes processed
-[vmvm - main (2012-09-05 11:51:21,665)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(60) | Initialized.. now writing to disk
-[vmvm - main (2012-09-05 11:51:21,757)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(70) | Done
-[vmvm - main (2012-09-05 11:54:20,845)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(56) | Building links
-[vmvm - main (2012-09-05 11:54:21,544)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(110) | 1000 classes processed
-[vmvm - main (2012-09-05 11:54:21,954)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(110) | 2000 classes processed
-[vmvm - main (2012-09-05 11:54:22,174)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(110) | 3000 classes processed
-[vmvm - main (2012-09-05 11:54:22,360)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(110) | 4000 classes processed
-[vmvm - main (2012-09-05 11:54:22,694)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(110) | 5000 classes processed
-[vmvm - main (2012-09-05 11:54:23,158)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.<init>(110) | 6000 classes processed
-[vmvm - main (2012-09-05 11:54:23,249)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(60) | Initialized.. now writing to disk
-[vmvm - main (2012-09-05 11:54:23,273)] INFO edu.columbia.cs.psl.vmvm.chroot.FSDetector.main(70) | Done
-[vmvm - main (2012-09-05 13:58:11,993)] ERROR edu.columbia.cs.psl.vmvm.Instrumenter.instrumentClass(73) | Exception processing class: /Users/jon/Documents/PSL/Projects/in-vivo/vmvm/instrumented-test/bin/edu/columbia/cs/psl/vmvm/test/SimpleClass.class
-java.lang.ArrayIndexOutOfBoundsException: 1
-	at edu.columbia.cs.psl.vmvm.asm.InterceptingClassVisitor.visitMethod(InterceptingClassVisitor.java:61)
-	at org.objectweb.asm.ClassReader.accept(Unknown Source)
-	at org.objectweb.asm.ClassReader.accept(Unknown Source)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.instrumentClass(Instrumenter.java:58)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processClass(Instrumenter.java:163)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:190)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter._main(Instrumenter.java:116)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.main(Instrumenter.java:79)
-[vmvm - main (2012-09-05 13:58:27,385)] ERROR edu.columbia.cs.psl.vmvm.Instrumenter.instrumentClass(73) | Exception processing class: /Users/jon/Documents/PSL/Projects/in-vivo/vmvm/instrumented-test/bin/edu/columbia/cs/psl/vmvm/test/SimpleClass.class
-java.lang.NullPointerException
-	at org.objectweb.asm.Item.a(Unknown Source)
-	at org.objectweb.asm.ClassWriter.a(Unknown Source)
-	at org.objectweb.asm.MethodWriter.visitFieldInsn(Unknown Source)
-	at org.objectweb.asm.commons.AdviceAdapter.visitFieldInsn(Unknown Source)
-	at edu.columbia.cs.psl.vmvm.asm.SandboxPropogatingMV.setSandboxFlag(SandboxPropogatingMV.java:23)
-	at edu.columbia.cs.psl.vmvm.asm.SandboxPropogatingMV.visitCode(SandboxPropogatingMV.java:46)
-	at org.objectweb.asm.ClassReader.accept(Unknown Source)
-	at org.objectweb.asm.ClassReader.accept(Unknown Source)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.instrumentClass(Instrumenter.java:58)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processClass(Instrumenter.java:163)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:190)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter._main(Instrumenter.java:116)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.main(Instrumenter.java:79)
-[vmvm - main (2012-09-05 13:59:15,269)] ERROR edu.columbia.cs.psl.vmvm.Instrumenter.instrumentClass(73) | Exception processing class: /Users/jon/Documents/PSL/Projects/in-vivo/vmvm/instrumented-test/bin/edu/columbia/cs/psl/vmvm/test/SimpleClass.class
-java.lang.NullPointerException
-	at org.objectweb.asm.Item.a(Unknown Source)
-	at org.objectweb.asm.ClassWriter.a(Unknown Source)
-	at org.objectweb.asm.MethodWriter.visitFieldInsn(Unknown Source)
-	at org.objectweb.asm.commons.AdviceAdapter.visitFieldInsn(Unknown Source)
-	at edu.columbia.cs.psl.vmvm.asm.SandboxPropogatingMV.setSandboxFlag(SandboxPropogatingMV.java:24)
-	at edu.columbia.cs.psl.vmvm.asm.SandboxPropogatingMV.visitCode(SandboxPropogatingMV.java:47)
-	at org.objectweb.asm.ClassReader.accept(Unknown Source)
-	at org.objectweb.asm.ClassReader.accept(Unknown Source)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.instrumentClass(Instrumenter.java:58)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processClass(Instrumenter.java:163)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:190)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter._main(Instrumenter.java:116)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.main(Instrumenter.java:79)
-[vmvm - main (2012-09-05 13:59:39,226)] ERROR edu.columbia.cs.psl.vmvm.Instrumenter.instrumentClass(73) | Exception processing class: /Users/jon/Documents/PSL/Projects/in-vivo/vmvm/instrumented-test/bin/edu/columbia/cs/psl/vmvm/test/SimpleClass.class
-java.lang.ArrayIndexOutOfBoundsException: 1
-	at edu.columbia.cs.psl.vmvm.asm.SandboxPropogatingMV.visitMethodInsn(SandboxPropogatingMV.java:68)
-	at org.objectweb.asm.ClassReader.accept(Unknown Source)
-	at org.objectweb.asm.ClassReader.accept(Unknown Source)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.instrumentClass(Instrumenter.java:58)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processClass(Instrumenter.java:163)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:190)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:187)
-	at edu.columbia.cs.psl.vmvm.Instrumenter._main(Instrumenter.java:116)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.main(Instrumenter.java:79)
-[vmvm - main (2012-09-05 14:55:32,545)] ERROR edu.columbia.cs.psl.vmvm.Instrumenter.instrumentClass(75) | Exception processing class: /Users/jon/Documents/PSL/Projects/in-vivo/vmvm/instrumented-test/bin/edu/columbia/cs/psl/vmvm/test/SimpleClass.class
-java.lang.IllegalArgumentException: value null
-	at org.objectweb.asm.ClassWriter.a(Unknown Source)
-	at org.objectweb.asm.MethodWriter.visitLdcInsn(Unknown Source)
-	at org.objectweb.asm.commons.AdviceAdapter.visitLdcInsn(Unknown Source)
-	at edu.columbia.cs.psl.vmvm.asm.InvivoAdapter._generateClone(InvivoAdapter.java:154)
-	at edu.columbia.cs.psl.vmvm.asm.InvivoAdapter.cloneValAtTopOfStack(InvivoAdapter.java:80)
-	at edu.columbia.cs.psl.vmvm.asm.StaticFieldIsolatorMV.visitEnd(StaticFieldIsolatorMV.java:30)
-	at org.objectweb.asm.ClassReader.accept(Unknown Source)
-	at org.objectweb.asm.ClassReader.accept(Unknown Source)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.instrumentClass(Instrumenter.java:60)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processClass(Instrumenter.java:165)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:192)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter._main(Instrumenter.java:118)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.main(Instrumenter.java:81)
-[vmvm - main (2012-09-05 15:36:24,227)] ERROR edu.columbia.cs.psl.vmvm.Instrumenter.instrumentClass(75) | Exception processing class: /Users/jon/Documents/PSL/Projects/in-vivo/vmvm/instrumented-test/bin/edu/columbia/cs/psl/vmvm/test/SimpleClass.class
-java.lang.NullPointerException
-	at org.objectweb.asm.MethodWriter.visitLocalVariable(Unknown Source)
-	at org.objectweb.asm.commons.LocalVariablesSorter.visitLocalVariable(Unknown Source)
-	at org.objectweb.asm.commons.LocalVariablesSorter.visitLocalVariable(Unknown Source)
-	at org.objectweb.asm.commons.LocalVariablesSorter.visitLocalVariable(Unknown Source)
-	at edu.columbia.cs.psl.vmvm.asm.SandboxPropogatingMV.visitLocalVariable(SandboxPropogatingMV.java:45)
-	at edu.columbia.cs.psl.vmvm.asm.SandboxPropogatingMV.visitEnd(SandboxPropogatingMV.java:37)
-	at org.objectweb.asm.MethodVisitor.visitEnd(Unknown Source)
-	at org.objectweb.asm.ClassReader.accept(Unknown Source)
-	at org.objectweb.asm.ClassReader.accept(Unknown Source)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.instrumentClass(Instrumenter.java:60)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processClass(Instrumenter.java:165)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:192)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter._main(Instrumenter.java:118)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.main(Instrumenter.java:81)
-[vmvm - main (2012-09-05 15:41:29,850)] ERROR edu.columbia.cs.psl.vmvm.Instrumenter.instrumentClass(75) | Exception processing class: /Users/jon/Documents/PSL/Projects/in-vivo/vmvm/instrumented-test/bin/edu/columbia/cs/psl/vmvm/test/SimpleClass.class
-java.lang.ArrayIndexOutOfBoundsException: -1
-	at org.objectweb.asm.Frame.a(Unknown Source)
-	at org.objectweb.asm.Frame.a(Unknown Source)
-	at org.objectweb.asm.MethodWriter.visitVarInsn(Unknown Source)
-	at org.objectweb.asm.commons.LocalVariablesSorter.visitVarInsn(Unknown Source)
-	at org.objectweb.asm.commons.LocalVariablesSorter.visitVarInsn(Unknown Source)
-	at org.objectweb.asm.commons.AdviceAdapter.visitVarInsn(Unknown Source)
-	at edu.columbia.cs.psl.vmvm.asm.InvivoAdapter.setSandboxFlag(InvivoAdapter.java:70)
-	at edu.columbia.cs.psl.vmvm.asm.SandboxPropogatingMV.onMethodEnter(SandboxPropogatingMV.java:65)
-	at org.objectweb.asm.commons.AdviceAdapter.visitCode(Unknown Source)
-	at org.objectweb.asm.commons.AdviceAdapter.visitCode(Unknown Source)
-	at org.objectweb.asm.ClassReader.accept(Unknown Source)
-	at org.objectweb.asm.ClassReader.accept(Unknown Source)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.instrumentClass(Instrumenter.java:60)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processClass(Instrumenter.java:165)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:192)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter._main(Instrumenter.java:118)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.main(Instrumenter.java:81)
-[vmvm - main (2012-09-05 15:41:56,141)] ERROR edu.columbia.cs.psl.vmvm.Instrumenter.instrumentClass(75) | Exception processing class: /Users/jon/Documents/PSL/Projects/in-vivo/vmvm/instrumented-test/bin/edu/columbia/cs/psl/vmvm/test/SimpleClass.class
-java.lang.ArrayIndexOutOfBoundsException: -1
-	at org.objectweb.asm.Frame.a(Unknown Source)
-	at org.objectweb.asm.Frame.a(Unknown Source)
-	at org.objectweb.asm.MethodWriter.visitVarInsn(Unknown Source)
-	at org.objectweb.asm.commons.LocalVariablesSorter.visitVarInsn(Unknown Source)
-	at org.objectweb.asm.commons.LocalVariablesSorter.visitVarInsn(Unknown Source)
-	at org.objectweb.asm.commons.AdviceAdapter.visitVarInsn(Unknown Source)
-	at edu.columbia.cs.psl.vmvm.asm.InvivoAdapter.setSandboxFlag(InvivoAdapter.java:71)
-	at edu.columbia.cs.psl.vmvm.asm.SandboxPropogatingMV.onMethodEnter(SandboxPropogatingMV.java:65)
-	at org.objectweb.asm.commons.AdviceAdapter.visitCode(Unknown Source)
-	at org.objectweb.asm.commons.AdviceAdapter.visitCode(Unknown Source)
-	at org.objectweb.asm.ClassReader.accept(Unknown Source)
-	at org.objectweb.asm.ClassReader.accept(Unknown Source)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.instrumentClass(Instrumenter.java:60)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processClass(Instrumenter.java:165)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:192)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter._main(Instrumenter.java:118)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.main(Instrumenter.java:81)
-[vmvm - main (2012-09-05 15:42:05,873)] ERROR edu.columbia.cs.psl.vmvm.Instrumenter.instrumentClass(75) | Exception processing class: /Users/jon/Documents/PSL/Projects/in-vivo/vmvm/instrumented-test/bin/edu/columbia/cs/psl/vmvm/test/SimpleClass.class
-java.lang.ArrayIndexOutOfBoundsException: -1
-	at org.objectweb.asm.Frame.a(Unknown Source)
-	at org.objectweb.asm.Frame.a(Unknown Source)
-	at org.objectweb.asm.MethodWriter.visitVarInsn(Unknown Source)
-	at org.objectweb.asm.commons.LocalVariablesSorter.visitVarInsn(Unknown Source)
-	at org.objectweb.asm.commons.LocalVariablesSorter.visitVarInsn(Unknown Source)
-	at org.objectweb.asm.commons.AdviceAdapter.visitVarInsn(Unknown Source)
-	at edu.columbia.cs.psl.vmvm.asm.InvivoAdapter.setSandboxFlag(InvivoAdapter.java:72)
-	at edu.columbia.cs.psl.vmvm.asm.SandboxPropogatingMV.onMethodEnter(SandboxPropogatingMV.java:65)
-	at org.objectweb.asm.commons.AdviceAdapter.visitCode(Unknown Source)
-	at org.objectweb.asm.commons.AdviceAdapter.visitCode(Unknown Source)
-	at org.objectweb.asm.ClassReader.accept(Unknown Source)
-	at org.objectweb.asm.ClassReader.accept(Unknown Source)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.instrumentClass(Instrumenter.java:60)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processClass(Instrumenter.java:165)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:192)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter._main(Instrumenter.java:118)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.main(Instrumenter.java:81)
-[vmvm - main (2012-09-05 15:53:20,696)] ERROR edu.columbia.cs.psl.vmvm.Instrumenter.instrumentClass(75) | Exception processing class: /Users/jon/Documents/PSL/Projects/in-vivo/vmvm/instrumented-test/bin/edu/columbia/cs/psl/vmvm/test/SimpleClass.class
-java.lang.NullPointerException
-	at org.objectweb.asm.commons.AdviceAdapter.pushValue(Unknown Source)
-	at org.objectweb.asm.commons.AdviceAdapter.visitVarInsn(Unknown Source)
-	at org.objectweb.asm.commons.InstructionAdapter.load(Unknown Source)
-	at org.objectweb.asm.commons.InstructionAdapter.visitVarInsn(Unknown Source)
-	at edu.columbia.cs.psl.vmvm.asm.SandboxPropogatingMV.visitVarInsn(SandboxPropogatingMV.java:58)
-	at org.objectweb.asm.commons.LocalVariablesSorter.visitVarInsn(Unknown Source)
-	at org.objectweb.asm.commons.AdviceAdapter.visitVarInsn(Unknown Source)
-	at org.objectweb.asm.ClassReader.accept(Unknown Source)
-	at org.objectweb.asm.ClassReader.accept(Unknown Source)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.instrumentClass(Instrumenter.java:60)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processClass(Instrumenter.java:165)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:192)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.processDirectory(Instrumenter.java:189)
-	at edu.columbia.cs.psl.vmvm.Instrumenter._main(Instrumenter.java:118)
-	at edu.columbia.cs.psl.vmvm.Instrumenter.main(Instrumenter.java:81)
-[vmvm - main (2012-09-05 15:59:51,102)] ERROR edu.columbia.cs.psl.vmvm.Instrumenter.instrumentClass(75) | Exception processing class: /Users/jon/Documents/PSL/Projects/in-vivo/vmvm/instrumented-test/bin/edu/columbia/cs/psl/vmvm/test/SimpleClass.class
-java.lang.NullPointerException
-	at org.objectweb.asm.commons.AdviceAdapter.pushValue(Unknown Source)
-	at org.objectweb.asm.commons.AdviceAdapter.visitVarInsn(Unknown Source)
-	at org.objectweb.asm.commons.InstructionAdapter.load(Unknown Source)
-	at org.objectweb.asm.commons.InstructionAdapter.visitVarInsn(Unknown Source)
-	at edu.columbia.cs.psl.vmvm.asm.SandboxPropogatingMV.visitVarInsn(SandboxPropogatingMV.java:58)
-	at org.objectweb.asm.commons.LocalVariablesSorter.visitVarInsn(Unknown Source)
-	at org.objectweb.asm.commons.AdviceAdapter.visitVarInsn(Unknown Source)
-	at org.objectweb.asm.Clas