Merge "Revert "Reduce locking in JLookup"" into ub-jack
diff --git a/build.xml b/build.xml
index 9c6ec23..b798d0d 100644
--- a/build.xml
+++ b/build.xml
@@ -999,7 +999,9 @@
       <exclude name="com/android/jack/jarjar/test006/dontcompile/"/>
       <exclude name="com/android/jack/jarjar/test006/dontcompile/"/>
       <exclude name="com/android/jack/java8/gwt/test019/jack/Java8Test.java"/>
-      <exclude name="com/android/jack/java8/intersectiontype/"/>
+      <exclude name="com/android/jack/java8/intersectiontype/test004/"/>
+      <exclude name="com/android/jack/java8/intersectiontype/test005/"/>
+      <exclude name="com/android/jack/java8/intersectiontype/test006/"/>
       <exclude name="com/android/jack/java8/lambda/test019/"/>
       <exclude name="com/android/jack/java8/methodref/test014/jack/Tests.java"/>
       <exclude name="com/android/jack/java8/variable/test001/"/>
@@ -1008,6 +1010,7 @@
       <exclude name="com/android/jack/jill/test002/**"/>
       <exclude name="com/android/jack/jill/test003/**"/>
       <exclude name="com/android/jack/jill/test004/**"/>
+      <exclude name="com/android/jack/jill/test005/**"/>
       <exclude name="com/android/jack/lookup/test001/liboverride/"/>
       <exclude name="com/android/jack/sourcepath/test002/jack/Sourcepath002.java"/>
       <classpath>
diff --git a/jack-coverage/Android.mk b/jack-coverage/Android.mk
index b23622d..b798d87 100644
--- a/jack-coverage/Android.mk
+++ b/jack-coverage/Android.mk
@@ -1,4 +1,4 @@
-# Copyright (C) 2016 The Android Open Source Project
+# Copyright (C) 2017 The Android Open Source Project
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -12,24 +12,4 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-LOCAL_PATH:= $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := jack-coverage-plugin
-LOCAL_MODULE_TAGS := optional
-LOCAL_MODULE_CLASS := JAVA_LIBRARIES
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_JAVA_RESOURCE_DIRS  := rsc
-LOCAL_JAVACFLAGS := -processor com.android.sched.build.SchedAnnotationProcessor
-LOCAL_JAVA_LANGUAGE_VERSION := 1.7
-
-LOCAL_JAVA_LIBRARIES := \
-  jsr305lib-jack \
-  schedlib \
-  jack \
-  sched-build
-
-include $(BUILD_HOST_JAVA_LIBRARY)
+include $(call all-subdir-makefiles)
diff --git a/jack-coverage/build.xml b/jack-coverage/build.xml
index 2b51696..27e9134 100644
--- a/jack-coverage/build.xml
+++ b/jack-coverage/build.xml
@@ -19,6 +19,7 @@
 
   <dirname property="jack-coverage-project.dir" file="${ant.file.jack-coverage}" />
   <property name="jack-coverage-dist.dir" value="${jack-coverage-project.dir}/dist" />
+  <property name="jack-coverage-rsc.dir" value="${jack-coverage-project.dir}/rsc" />
   <property name="jack-coverage-doc.dir" value="${jack-coverage-dist.dir}/doc" />
   <property name="jack-coverage-tests.output.dir"
             value="${jack-coverage-project.dir}/testResults" />
@@ -108,6 +109,10 @@
       <fileset dir="${plugin.rsc.dir}" />
     </copy>
 
+    <!-- Copy the version.properties -->
+    <copy file="${jack-coverage-rsc.dir}/jack-coverage-plugin-version.properties"
+          todir="${plugin.build.src.classes.dir}"/>
+
     <mkdir dir="${jack-coverage-dist.dir}" />
     <jar basedir="${plugin.build.src.classes.dir}"
          destfile="${jack-coverage-dist.dir}/${plugin.execname}" />
@@ -303,7 +308,7 @@
     </unzip>
 
     <!-- Reuse the same version.properties than the plugin. -->
-    <copy file="${plugin.rsc.dir}/jack-coverage-plugin-version.properties"
+    <copy file="${jack-coverage-rsc.dir}/jack-coverage-plugin-version.properties"
           tofile="${reporter.build.src.classes.dir}/jack-jacoco-reporter-version.properties"/>
 
     <jar destfile="${jack-coverage-dist.dir}/${reporter.execname}"
diff --git a/jack-coverage/plugin/Android.mk b/jack-coverage/plugin/Android.mk
new file mode 100644
index 0000000..1eb21e7
--- /dev/null
+++ b/jack-coverage/plugin/Android.mk
@@ -0,0 +1,35 @@
+# Copyright (C) 2016 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := jack-coverage-plugin
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_CLASS := JAVA_LIBRARIES
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src)
+
+LOCAL_JAVA_RESOURCE_DIRS := rsc ../rsc
+LOCAL_JAVACFLAGS := -processor com.android.sched.build.SchedAnnotationProcessor
+LOCAL_JAVA_LANGUAGE_VERSION := 1.7
+
+LOCAL_JAVA_LIBRARIES := \
+  jsr305lib-jack \
+  schedlib \
+  jack \
+  sched-build
+
+include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/jack-coverage/plugin/rsc/jack-coverage-plugin-version.properties b/jack-coverage/rsc/jack-coverage-plugin-version.properties
similarity index 100%
rename from jack-coverage/plugin/rsc/jack-coverage-plugin-version.properties
rename to jack-coverage/rsc/jack-coverage-plugin-version.properties
diff --git a/jack-tests/.classpath b/jack-tests/.classpath
index 664ee69..49d610b 100644
--- a/jack-tests/.classpath
+++ b/jack-tests/.classpath
@@ -2,7 +2,7 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
-	<classpathentry excluding="com/android/jack/annotation/processor/sample2/src/|com/android/jack/annotation/processor/sample2/src/|com/android/jack/annotation/test015/jack/|com/android/jack/annotation/test017/jack/|com/android/jack/assign/test002/|com/android/jack/classpath/test002/lib1override/**|com/android/jack/encoding/tests/**|com/android/jack/enums/test003/link/Other.java|com/android/jack/enums/test003/link/Values.java|com/android/jack/error/test001/jack/A.java|com/android/jack/error/test002/jack/A.java|com/android/jack/frontend/generic/test002/jack/|com/android/jack/frontend/test002/jack/PackageName/ClassInConflictingPackage.java|com/android/jack/frontend/test005/jack/**|com/android/jack/frontend/test006/jack/**|com/android/jack/frontend/test007/jack/|com/android/jack/frontend/test007/jackduplicate/|com/android/jack/frontend/test008/jack/NoOuterContext.java|com/android/jack/frontend/test010/jack/UnusedLocalVar.java|com/android/jack/frontend/test013/jack/ExtendingInnerOnly.java|com/android/jack/frontend/test014/jack/ExtendingInnerInStaticContext.java|com/android/jack/frontend/test015/jack/WithOuterContextButStatic.java|com/android/jack/frontend/test016/jack/WithDuplicated.java|com/android/jack/frontend/test017/jack/InvalidQualification.java|com/android/jack/frontend/test019/jack/TooBig.java|com/android/jack/jarjar/test003/dontcompile/|com/android/jack/jarjar/test006/dontcompile/|com/android/jack/jarjar/test006/dontcompile/|com/android/jack/java8/annotation/|com/android/jack/java8/bridges/|com/android/jack/java8/gwt/test019/jack/Java8Test.java|com/android/jack/java8/intersectiontype/|com/android/jack/java8/lambda/test019/|com/android/jack/java8/lambda/test039/|com/android/jack/java8/lambda/test040/|com/android/jack/java8/lambda/test041/|com/android/jack/java8/methodref/test014/jack/Tests.java|com/android/jack/java8/variable/test001/|com/android/jack/java8/variable/test003/|com/android/jack/jill/test001/**|com/android/jack/jill/test002/**|com/android/jack/jill/test003/**|com/android/jack/jill/test004/**|com/android/jack/lookup/test001/liboverride/|com/android/jack/nopackage/test*/**|com/android/jack/sourcepath/test002/jack/Sourcepath002.java" kind="src" path="tests"/>
+	<classpathentry excluding="com/android/jack/annotation/processor/sample2/src/|com/android/jack/annotation/processor/sample2/src/|com/android/jack/annotation/test015/jack/|com/android/jack/annotation/test017/jack/|com/android/jack/assign/test002/|com/android/jack/classpath/test002/lib1override/**|com/android/jack/encoding/tests/**|com/android/jack/enums/test003/link/Other.java|com/android/jack/enums/test003/link/Values.java|com/android/jack/error/test001/jack/A.java|com/android/jack/error/test002/jack/A.java|com/android/jack/frontend/generic/test002/jack/|com/android/jack/frontend/test002/jack/PackageName/ClassInConflictingPackage.java|com/android/jack/frontend/test005/jack/**|com/android/jack/frontend/test006/jack/**|com/android/jack/frontend/test007/jack/|com/android/jack/frontend/test007/jackduplicate/|com/android/jack/frontend/test008/jack/NoOuterContext.java|com/android/jack/frontend/test010/jack/UnusedLocalVar.java|com/android/jack/frontend/test013/jack/ExtendingInnerOnly.java|com/android/jack/frontend/test014/jack/ExtendingInnerInStaticContext.java|com/android/jack/frontend/test015/jack/WithOuterContextButStatic.java|com/android/jack/frontend/test016/jack/WithDuplicated.java|com/android/jack/frontend/test017/jack/InvalidQualification.java|com/android/jack/frontend/test019/jack/TooBig.java|com/android/jack/jarjar/test003/dontcompile/|com/android/jack/jarjar/test006/dontcompile/|com/android/jack/jarjar/test006/dontcompile/|com/android/jack/java8/annotation/test004/|com/android/jack/java8/bridges/test007/|com/android/jack/java8/intersectiontype/test004/|com/android/jack/java8/intersectiontype/test005/|com/android/jack/java8/intersectiontype/test006/|com/android/jack/java8/lambda/test039/|com/android/jack/java8/lambda/test040/|com/android/jack/java8/lambda/test041/|com/android/jack/java8/variable/test001/|com/android/jack/java8/variable/test003/|com/android/jack/jill/test001/**|com/android/jack/jill/test002/**|com/android/jack/jill/test003/**|com/android/jack/jill/test004/**|com/android/jack/jill/test005/**|com/android/jack/lookup/test001/liboverride/|com/android/jack/nopackage/test*/**|com/android/jack/sourcepath/test002/jack/Sourcepath002.java" kind="src" path="tests"/>
 	<classpathentry kind="lib" path="libs/junit4.jar"/>
 	<classpathentry kind="lib" path="libs/antlr-runtime-lib.jar"/>
 	<classpathentry kind="lib" path="libs/dx-ref.jar"/>
diff --git a/jack-tests/README.android b/jack-tests/README.android
index 047e3b5..6660415 100644
--- a/jack-tests/README.android
+++ b/jack-tests/README.android
@@ -29,5 +29,10 @@
 Original sources can be downloaded from:
 http://archive.apache.org/dist/ant/source/apache-ant-1.9.6-src.zip
 
+* Proguard 5.3.2, as a prebuilt jar for jack-tests
+https://sourceforge.net/projects/proguard/files/proguard/5.3/proguard5.3.2.zip/download
 
+* Desugar, as a prebuilt jar for jack-tests
+Build from Bazel open source project (commit 5dbb23ba44ec0037cf0944b17716ea3f08a69c27)
+https://github.com/bazelbuild/bazel.git
 
diff --git a/jack-tests/build.gradle b/jack-tests/build.gradle
index 506f960..5c84b4c 100644
--- a/jack-tests/build.gradle
+++ b/jack-tests/build.gradle
@@ -36,10 +36,8 @@
       main {
           java {
               srcDirs = ['src', 'tests']
-              exclude "com/android/jack/annotation/processor/sample2/src/**"
-              exclude "com/android/jack/annotation/test015/jack/**"
-              exclude "com/android/jack/annotation/test017/jack/**"
-              exclude "com/android/jack/annotation/test019/jack/**"
+              exclude "com/android/jack/annotation/processor/sample2/src/"
+              exclude "com/android/jack/annotation/processor/sample2/src/"
               exclude "com/android/jack/classpath/test002/lib1override/**"
               exclude "com/android/jack/encoding/tests/**"
               exclude "com/android/jack/enums/test003/link/Other.java"
@@ -47,6 +45,9 @@
               exclude "com/android/jack/error/test001/jack/A.java"
               exclude "com/android/jack/error/test002/jack/A.java"
               exclude "com/android/jack/frontend/test002/jack/PackageName/ClassInConflictingPackage.java"
+              exclude "com/android/jack/frontend/test005/jack/**"
+              exclude "com/android/jack/frontend/test006/jack/**"
+              exclude "com/android/jack/frontend/test007/jackduplicate/"
               exclude "com/android/jack/frontend/test008/jack/NoOuterContext.java"
               exclude "com/android/jack/frontend/test010/jack/UnusedLocalVar.java"
               exclude "com/android/jack/frontend/test013/jack/ExtendingInnerOnly.java"
@@ -55,48 +56,24 @@
               exclude "com/android/jack/frontend/test016/jack/WithDuplicated.java"
               exclude "com/android/jack/frontend/test017/jack/InvalidQualification.java"
               exclude "com/android/jack/frontend/test019/jack/TooBig.java"
-              exclude "com/android/jack/frontend/test018/jack/**"
-              exclude "com/android/jack/nopackage/jack/**"
-              exclude "com/android/jack/java8/lambda/**"
-              exclude "com/android/jack/java8/defaultmethod/**"
-              exclude "com/android/jack/java8/staticmethod/**"
-              exclude "com/android/jack/java8/methodref/**"
-              exclude "com/android/jack/java8/inference/**"
-              exclude "com/android/jack/java8/gwt/**"
-              exclude "com/android/jack/java8/retrolambda/**"
-              exclude "com/android/jack/java8/intersectiontype/**"
-              exclude "com/android/jack/java8/annotation/**"
-              exclude "com/android/jack/java8/variable/**"
-              exclude "com/android/jack/java8/bridges/**"
-              exclude "com/android/jack/java8/parameter/**"
-              exclude "com/android/jack/jarjar/test003/dontcompile/**"
-              exclude "com/android/jack/jarjar/test004/dontcompile/**"
-              exclude "com/android/jack/jarjar/test006/dontcompile/**"
-              exclude "com/android/jack/lookup/test001/liboverride/**"
-              exclude "com/android/jack/frontend/generic/test002/jack/**"
-              exclude "com/android/jack/frontend/generic/test003/jack/**"
-              exclude "com/android/jack/frontend/test005/jack/**"
-              exclude "com/android/jack/frontend/test006/jack/**"
-              exclude "com/android/jack/frontend/test007/**"
+              exclude "com/android/jack/jarjar/test003/dontcompile/"
+              exclude "com/android/jack/jarjar/test006/dontcompile/"
+              exclude "com/android/jack/jarjar/test006/dontcompile/"
+              exclude "com/android/jack/java8/gwt/test019/jack/Java8Test.java"
+              exclude "com/android/jack/java8/intersectiontype/test004/"
+              exclude "com/android/jack/java8/intersectiontype/test005/"
+              exclude "com/android/jack/java8/intersectiontype/test006/"
+              exclude "com/android/jack/java8/lambda/test019/"
+              exclude "com/android/jack/java8/methodref/test014/jack/Tests.java"
+              exclude "com/android/jack/java8/variable/test001/"
+              exclude "com/android/jack/java8/variable/test003/"
               exclude "com/android/jack/jill/test001/**"
               exclude "com/android/jack/jill/test002/**"
               exclude "com/android/jack/jill/test003/**"
               exclude "com/android/jack/jill/test004/**"
-              exclude "com/android/jack/multidex/test004/**"
-              exclude "com/android/jack/nopackage/test*/**"
-              exclude "com/android/jack/optimizations/lambdas/test001/**"
-              exclude "com/android/jack/optimizations/lambdas/test002/**"
-              exclude "com/android/jack/optimizations/lambdas/test003/**"
-              exclude "com/android/jack/optimizations/lambdas/test004/**"
-              exclude "com/android/jack/optimizations/lambdas/test005/**"
-              exclude "com/android/jack/optimizations/lambdas/test006/**"
-              exclude "com/android/jack/optimizations/lambdas/test007/**"
-              exclude "com/android/jack/optimizations/lambdas/test008/**"
+              exclude "com/android/jack/jill/test005/**"
+              exclude "com/android/jack/lookup/test001/liboverride/"
               exclude "com/android/jack/sourcepath/test002/jack/Sourcepath002.java"
-              exclude "com/android/jack/shrob/test062/jack/**"
-              exclude "com/android/jack/shrob/test066/jack/**"
-              exclude "com/android/jack/shrob/test067/jack/**"
-              exclude "com/android/jack/shrob/test068/jack/**"
           }
       }
 
diff --git a/jack-tests/prebuilts/desugar.jar b/jack-tests/prebuilts/desugar.jar
new file mode 100755
index 0000000..8ade1f6
--- /dev/null
+++ b/jack-tests/prebuilts/desugar.jar
Binary files differ
diff --git a/jack-tests/prebuilts/proguard.jar b/jack-tests/prebuilts/proguard.jar
index 56d68ba..bf92108 100644
--- a/jack-tests/prebuilts/proguard.jar
+++ b/jack-tests/prebuilts/proguard.jar
Binary files differ
diff --git a/jack-tests/src/com/android/jack/test/helper/CheckDexStructureTestHelper.java b/jack-tests/src/com/android/jack/test/helper/CheckDexStructureTestHelper.java
index 8672f56..a252975 100644
--- a/jack-tests/src/com/android/jack/test/helper/CheckDexStructureTestHelper.java
+++ b/jack-tests/src/com/android/jack/test/helper/CheckDexStructureTestHelper.java
@@ -77,7 +77,7 @@
   }
 
   public void compare() throws Exception {
-    runTest(createDexFileComparator().setWithDebugInfo(withDebugInfos));
+    runTest(createDexFileComparatorWithAnnotations());
   }
 
 }
diff --git a/jack-tests/src/com/android/jack/test/helper/IncrementalTestHelper.java b/jack-tests/src/com/android/jack/test/helper/IncrementalTestHelper.java
index 5be494c..6265f65 100644
--- a/jack-tests/src/com/android/jack/test/helper/IncrementalTestHelper.java
+++ b/jack-tests/src/com/android/jack/test/helper/IncrementalTestHelper.java
@@ -244,7 +244,7 @@
 
   @Nonnull
   public void run(@Nonnull String mainClass, @Nonnull String expected) throws Exception {
-    List<RuntimeRunner> runnerList = AbstractTestTools.listRuntimeTestRunners(null);
+    List<RuntimeRunner> runnerList = AbstractTestTools.listRuntimeTestRunners();
     for (RuntimeRunner runner : runnerList) {
       ByteArrayOutputStream out = new ByteArrayOutputStream();
       ((AbstractRuntimeRunner) runner).setOutputStream(out);
diff --git a/jack-tests/src/com/android/jack/test/helper/RuntimeTestHelper.java b/jack-tests/src/com/android/jack/test/helper/RuntimeTestHelper.java
index be2c84a..21c166f 100644
--- a/jack-tests/src/com/android/jack/test/helper/RuntimeTestHelper.java
+++ b/jack-tests/src/com/android/jack/test/helper/RuntimeTestHelper.java
@@ -31,6 +31,8 @@
 
 import junit.framework.Assert;
 
+import org.junit.Assume;
+
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
@@ -65,6 +67,9 @@
 
   private SourceLevel level = SourceLevel.JAVA_6;
 
+  @CheckForNull
+  private String minApiLevel = null;
+
   @Nonnull
   private List<FileChecker> fileCheckers = new ArrayList<FileChecker>(0);
 
@@ -102,6 +107,12 @@
   }
 
   @Nonnull
+  public RuntimeTestHelper setAndroidMinApiLevel(@Nonnull String minApiLevel) {
+    this.minApiLevel = minApiLevel;
+    return this;
+  }
+
+  @Nonnull
   public RuntimeTestHelper addProperty(@Nonnull String key, @Nonnull String value) {
     String oldValue = runtimeProperties.get(key);
     if (oldValue != null && !oldValue.equals(value)) {
@@ -308,12 +319,16 @@
   }
 
   @Nonnull
-  private AndroidToolchain createCandidateToolchain() {
+  private AndroidToolchain createCandidateToolchain() throws Exception {
     AndroidToolchain candidateTestTools =
         AbstractTestTools.getCandidateToolchain(AndroidToolchain.class, ignoredCandidateToolchains);
     candidateTestTools.setSourceLevel(level);
+    if (minApiLevel != null) {
+      candidateTestTools.setAndroidMinApiLevel(minApiLevel);
+    }
     candidateTestTools.setWithDebugInfos(withDebugInfos);
-    if (!runtimeProperties.isEmpty() && candidateTestTools instanceof JackBasedToolchain) {
+    if (!runtimeProperties.isEmpty()) {
+      Assume.assumeTrue(candidateTestTools instanceof JackBasedToolchain);
       // if the tool chain is type of JackBasedToolchain and the customized properties are set,
       // configure the runtime testing properties
       JackBasedToolchain jackBasedToolchain = (JackBasedToolchain) candidateTestTools;
@@ -325,10 +340,13 @@
   }
 
   @Nonnull
-  private AndroidToolchain createReferenceToolchain() {
+  private AndroidToolchain createReferenceToolchain() throws Exception {
     AndroidToolchain referenceTestTools =
         AbstractTestTools.getReferenceToolchain(AndroidToolchain.class);
     referenceTestTools.setSourceLevel(level);
+    if (minApiLevel != null) {
+      referenceTestTools.setAndroidMinApiLevel(minApiLevel);
+    }
     referenceTestTools.setWithDebugInfos(withDebugInfos);
     if (!runtimeProperties.isEmpty() && referenceTestTools instanceof JackBasedToolchain) {
       // if the tool chain is type of JackBasedToolchain and the customized properties are set,
diff --git a/jack-tests/src/com/android/jack/test/helper/SourceToDexComparisonTestHelper.java b/jack-tests/src/com/android/jack/test/helper/SourceToDexComparisonTestHelper.java
index e8d7f7e..3ec1c64 100644
--- a/jack-tests/src/com/android/jack/test/helper/SourceToDexComparisonTestHelper.java
+++ b/jack-tests/src/com/android/jack/test/helper/SourceToDexComparisonTestHelper.java
@@ -16,7 +16,10 @@
 
 package com.android.jack.test.helper;
 
+import com.android.jack.test.comparator.Comparator;
+import com.android.jack.test.comparator.ComparatorComposite;
 import com.android.jack.test.comparator.ComparatorDex;
+import com.android.jack.test.comparator.ComparatorDexAnnotations;
 import com.android.jack.test.toolchain.AbstractTestTools;
 import com.android.jack.test.toolchain.AndroidToolchain;
 import com.android.jack.test.toolchain.Toolchain.SourceLevel;
@@ -156,6 +159,12 @@
   }
 
   @Nonnull
+  public Comparator createDexFileComparatorWithAnnotations() {
+    return new ComparatorComposite(createDexFileComparator(),
+        new ComparatorDexAnnotations(refDex, candidateDex));
+  }
+
+  @Nonnull
   public SourceToDexComparisonTestHelper setJarjarRulesFile(@Nonnull File jarjarRulesFile) {
     this.jarjarRulesFile = jarjarRulesFile;
     return this;
diff --git a/jack-tests/src/com/android/jack/test/runner/DeviceRunner.java b/jack-tests/src/com/android/jack/test/runner/DeviceRunner.java
index 7a087bb..ba7955c 100644
--- a/jack-tests/src/com/android/jack/test/runner/DeviceRunner.java
+++ b/jack-tests/src/com/android/jack/test/runner/DeviceRunner.java
@@ -188,176 +188,186 @@
     }
 
     int exitStatus = -1;
+    List<String> failingDevices = new ArrayList<>(0);
     for (IDevice device : connectedDevices) {
 
-      checkDeviceRuntime(device);
-
-      if (isVerbose) {
-        System.out.println("Running on device: " + device.getName());
-      }
-
-      ensureAdbRoot(device);
-
-      //Remove trailing '\n' returned by emulator
-      File testsRootDirFile =
-          new File(device.getMountPoint(IDevice.MNT_DATA).replace("\n", ""), "jack-tests");
-      String testsRootDir = convertToTargetPath(testsRootDirFile);
-
-      String testScriptPathOnTarget =
-          convertToTargetPath(new File(testsRootDirFile, "TEST_SCRIPT_NAME"));
-
-      String[] desFilePaths = new String[classpathFiles.length];
       try {
-        if (isVerbose) {
-          System.out.println("adb shell -s " + device.getSerialNumber() + " mkdir "
-              + testsRootDir);
-        }
-        device.executeShellCommand("mkdir " + testsRootDir, hostOutput);
+
+        checkDeviceRuntime(device);
 
         if (isVerbose) {
-          System.out.println("adb shell -s " + device.getSerialNumber() + " rm "
-              + testsRootDir + FileListingService.FILE_SEPARATOR + "*");
+          System.out.println("Running on device: " + device.getName());
         }
-        device.executeShellCommand("rm " + testsRootDir + FileListingService.FILE_SEPARATOR + "*",
-            hostOutput);
 
-        if (isVerbose) {
-          System.out.println("adb -s " + device.getSerialNumber() + " push  "
-              + TEST_SCRIPT_FILE.getAbsolutePath() + " "
-              + testScriptPathOnTarget);
-        }
-        device.pushFile(TEST_SCRIPT_FILE.getAbsolutePath(),
-            testScriptPathOnTarget);
+        ensureAdbRoot(device);
 
-        if (isVerbose) {
-          System.out.println("adb -s " + device.getSerialNumber() + " shell chmod 777 "
-              + testScriptPathOnTarget);
-        }
-        device.executeShellCommand(
-            "chmod 777 " + testScriptPathOnTarget, hostOutput);
+        //Remove trailing '\n' returned by emulator
+        File testsRootDirFile =
+            new File(device.getMountPoint(IDevice.MNT_DATA).replace("\n", ""), "jack-tests");
+        String testsRootDir = convertToTargetPath(testsRootDirFile);
 
-        int i = 0;
-        for (File f : classpathFiles) {
-          desFilePaths[i] =
-              convertToTargetPath(new File(testsRootDirFile,  "f" + i + "_" + f.getName()));
+        String testScriptPathOnTarget =
+            convertToTargetPath(new File(testsRootDirFile, "TEST_SCRIPT_NAME"));
+
+        String[] desFilePaths = new String[classpathFiles.length];
+        try {
+          if (isVerbose) {
+            System.out.println("adb shell -s " + device.getSerialNumber() + " mkdir "
+                + testsRootDir);
+          }
+          device.executeShellCommand("mkdir " + testsRootDir, hostOutput);
 
           if (isVerbose) {
-            System.out.println("adb -s " + device.getSerialNumber() + " push "
-                + f.getAbsolutePath() + " " + desFilePaths[i]);
+            System.out.println("adb shell -s " + device.getSerialNumber() + " rm "
+                + testsRootDir + FileListingService.FILE_SEPARATOR + "*");
           }
-          device.pushFile(f.getAbsolutePath(), desFilePaths[i]);
-          i++;
-        }
-      } catch (TimeoutException e) {
-        throw new RuntimeRunnerException(e);
-      } catch (AdbCommandRejectedException e) {
-        throw new RuntimeRunnerException(e);
-      } catch (ShellCommandUnresponsiveException e) {
-        throw new RuntimeRunnerException(e);
-      } catch (IOException e) {
-        throw new RuntimeRunnerException(e);
-      } catch (SyncException e) {
-        throw new RuntimeRunnerException(e);
-      }
+          device.executeShellCommand("rm " + testsRootDir + FileListingService.FILE_SEPARATOR + "*",
+              hostOutput);
 
-      // Split command line to have at most MAX_NB_CLASSES jUnit classes per invocation
-      List<List<String>> splittedMainClasses = new ArrayList<List<String>>();
-      int currentChunk = 0;
-      for (String classToRun : classes) {
-        if (splittedMainClasses.size() == currentChunk) {
-          splittedMainClasses.add(new ArrayList<String>(MAX_NB_CLASSES));
-          if (jUnitRunnerName != null) {
-            splittedMainClasses.get(currentChunk).add(jUnitRunnerName);
-          }
-        }
-
-        splittedMainClasses.get(currentChunk).add(classToRun);
-
-        if (splittedMainClasses.get(currentChunk).size() == MAX_NB_CLASSES) {
-          currentChunk++;
-        }
-      }
-      List<String> cmdLines = new ArrayList<String>(splittedMainClasses.size());
-      File rootDir = new File(device.getMountPoint(IDevice.MNT_ROOT).replace("\n", ""));
-      for (List<String> classList : splittedMainClasses) {
-        cmdLines.add(Joiner.on(' ').join(buildCommandLine(rootDir, options,
-            classList.toArray(new String[classList.size()]), desFilePaths)));
-      }
-
-      try {
-        // Bug : exit code return by adb shell is wrong (always 0)
-        // https://code.google.com/p/android/issues/detail?id=3254
-        // Use go team hack to work this around
-        // https://code.google.com/p/go/source/browse/misc/arm/a
-
-        for (String args : cmdLines) {
           if (isVerbose) {
-            System.out.println("adb -s " + device.getSerialNumber() + " shell "
-                + testScriptPathOnTarget + ' ' + args);
+            System.out.println("adb -s " + device.getSerialNumber() + " push  "
+                + TEST_SCRIPT_FILE.getAbsolutePath() + " "
+                + testScriptPathOnTarget);
+          }
+          device.pushFile(TEST_SCRIPT_FILE.getAbsolutePath(),
+              testScriptPathOnTarget);
+
+          if (isVerbose) {
+            System.out.println("adb -s " + device.getSerialNumber() + " shell chmod 777 "
+                + testScriptPathOnTarget);
           }
           device.executeShellCommand(
-              testScriptPathOnTarget + ' ' + args,
-              new MyShellOuputReceiver(outRedirectStream, errRedirectStream),
-              /* maxTimeToOutputResponse = */ 10000);
+              "chmod 777 " + testScriptPathOnTarget, hostOutput);
 
-          File exitStatusFile = AbstractTestTools.createTempFile("exitStatus", "");
-          if (isVerbose) {
-            System.out.println("adb -s " + device.getSerialNumber() + " pull "
-                + testsRootDir + "/exitStatus "
-                + exitStatusFile.getAbsolutePath());
-          }
-          device.pullFile(testsRootDir + "/exitStatus",
-              exitStatusFile.getAbsolutePath());
+          int i = 0;
+          for (File f : classpathFiles) {
+            desFilePaths[i] =
+                convertToTargetPath(new File(testsRootDirFile,  "f" + i + "_" + f.getName()));
 
-          BufferedReader br = new BufferedReader(new FileReader(exitStatusFile));
-          try {
-            String readLine = br.readLine();
-            if (readLine == null) {
-              throw new RuntimeRunnerException("Exit status not found");
-            }
-            exitStatus = Integer.parseInt(readLine);
-          } finally {
-            br.close();
-          }
-
-          if (isVerbose) {
-            System.out.println("Exit status: " + exitStatus);
-          }
-
-          if (exitStatus != 0) {
-            System.err.println("Execution failed on device '" + device.getName() + "'");
-            break;
-          }
-        }
-      } catch (TimeoutException e) {
-        throw new RuntimeRunnerException(e);
-      } catch (AdbCommandRejectedException e) {
-        throw new RuntimeRunnerException(e);
-      } catch (ShellCommandUnresponsiveException e) {
-        throw new RuntimeRunnerException(e);
-      } catch (CannotChangePermissionException | CannotCreateFileException | IOException e) {
-        throw new RuntimeRunnerException(e);
-      } catch (SyncException e) {
-        throw new RuntimeRunnerException(e);
-      } finally {
-        try {
-          for (String pushedFile : desFilePaths) {
             if (isVerbose) {
-              System.out.println(
-                  "adb -s " + device.getSerialNumber() + " rm " + pushedFile);
+              System.out.println("adb -s " + device.getSerialNumber() + " push "
+                  + f.getAbsolutePath() + " " + desFilePaths[i]);
             }
-            device.executeShellCommand("rm " + pushedFile, hostOutput);
+            device.pushFile(f.getAbsolutePath(), desFilePaths[i]);
+            i++;
           }
-        } catch (IOException e) {
-          throw new RuntimeRunnerException(e);
-        } catch (TimeoutException e) {
-          throw new RuntimeRunnerException(e);
-        } catch (AdbCommandRejectedException e) {
-          throw new RuntimeRunnerException(e);
-        } catch (ShellCommandUnresponsiveException e) {
+        } catch (TimeoutException
+            | AdbCommandRejectedException
+            | ShellCommandUnresponsiveException
+            | IOException
+            | SyncException e) {
           throw new RuntimeRunnerException(e);
         }
+
+        // Split command line to have at most MAX_NB_CLASSES jUnit classes per invocation
+        List<List<String>> splittedMainClasses = new ArrayList<List<String>>();
+        int currentChunk = 0;
+        for (String classToRun : classes) {
+          if (splittedMainClasses.size() == currentChunk) {
+            splittedMainClasses.add(new ArrayList<String>(MAX_NB_CLASSES));
+            if (jUnitRunnerName != null) {
+              splittedMainClasses.get(currentChunk).add(jUnitRunnerName);
+            }
+          }
+
+          splittedMainClasses.get(currentChunk).add(classToRun);
+
+          if (splittedMainClasses.get(currentChunk).size() == MAX_NB_CLASSES) {
+            currentChunk++;
+          }
+        }
+        List<String> cmdLines = new ArrayList<String>(splittedMainClasses.size());
+        File rootDir = new File(device.getMountPoint(IDevice.MNT_ROOT).replace("\n", ""));
+        for (List<String> classList : splittedMainClasses) {
+          cmdLines.add(Joiner.on(' ').join(buildCommandLine(rootDir, options,
+              classList.toArray(new String[classList.size()]), desFilePaths)));
+        }
+
+        try {
+          // Bug : exit code return by adb shell is wrong (always 0)
+          // https://code.google.com/p/android/issues/detail?id=3254
+          // Use go team hack to work this around
+          // https://code.google.com/p/go/source/browse/misc/arm/a
+
+          for (String args : cmdLines) {
+            if (isVerbose) {
+              System.out.println("adb -s " + device.getSerialNumber() + " shell "
+                  + testScriptPathOnTarget + ' ' + args);
+            }
+            device.executeShellCommand(
+                testScriptPathOnTarget + ' ' + args,
+                new MyShellOuputReceiver(outRedirectStream, errRedirectStream),
+                /* maxTimeToOutputResponse = */ 10000);
+
+            File exitStatusFile = AbstractTestTools.createTempFile("exitStatus", "");
+            if (isVerbose) {
+              System.out.println("adb -s " + device.getSerialNumber() + " pull "
+                  + testsRootDir + "/exitStatus "
+                  + exitStatusFile.getAbsolutePath());
+            }
+            device.pullFile(testsRootDir + "/exitStatus",
+                exitStatusFile.getAbsolutePath());
+
+            BufferedReader br = new BufferedReader(new FileReader(exitStatusFile));
+            try {
+              String readLine = br.readLine();
+              if (readLine == null) {
+                throw new RuntimeRunnerException("Exit status not found");
+              }
+              exitStatus = Integer.parseInt(readLine);
+            } finally {
+              br.close();
+            }
+
+            if (isVerbose) {
+              System.out.println("Exit status: " + exitStatus);
+            }
+
+            if (exitStatus != 0) {
+              System.err.println("Execution failed on device '" + device.getName() + "'");
+              break;
+            }
+          }
+        } catch (TimeoutException
+            | AdbCommandRejectedException
+            | ShellCommandUnresponsiveException
+            | CannotChangePermissionException
+            | CannotCreateFileException
+            | IOException
+            | SyncException e) {
+          throw new RuntimeRunnerException(e);
+        } finally {
+          try {
+            for (String pushedFile : desFilePaths) {
+              if (isVerbose) {
+                System.out.println(
+                    "adb -s " + device.getSerialNumber() + " rm " + pushedFile);
+              }
+              device.executeShellCommand("rm " + pushedFile, hostOutput);
+            }
+          } catch (IOException
+              | TimeoutException
+              | AdbCommandRejectedException
+              | ShellCommandUnresponsiveException e) {
+            throw new RuntimeRunnerException(e);
+          }
+        }
+
+      } catch (RuntimeRunnerException e) {
+        System.err.println("Error with device '" + device.getName() + "': " + e.getMessage());
+        failingDevices.add(device.getName());
       }
+
+    }
+
+    if (failingDevices.size() > 0) {
+      String device = failingDevices.size() == 1 ? "device" : "devices";
+      throw new RuntimeRunnerException(
+          "Error with "
+              + device
+              + ": "
+              + Joiner.on(',').join(failingDevices)
+              + ". See log for details");
     }
 
     return exitStatus;
diff --git a/jack-tests/src/com/android/jack/test/toolchain/AbstractTestTools.java b/jack-tests/src/com/android/jack/test/toolchain/AbstractTestTools.java
index b781ece..4a8e7ad 100644
--- a/jack-tests/src/com/android/jack/test/toolchain/AbstractTestTools.java
+++ b/jack-tests/src/com/android/jack/test/toolchain/AbstractTestTools.java
@@ -17,6 +17,7 @@
 package com.android.jack.test.toolchain;
 
 import com.google.common.base.Splitter;
+import com.google.common.collect.Lists;
 
 import com.android.jack.Sourcelist;
 import com.android.jack.library.InputJackLibrary;
@@ -141,8 +142,9 @@
     @Override
     @Nonnull
     public LegacyToolchain build() {
-      return new LegacyToolchain(getPrebuilt("legacy-java-compiler"), getPrebuilt("jarjar"),
-          getPrebuilt("proguard"));
+      return new LegacyToolchain(getPrebuilt("legacy-java-compiler"),
+          getPrebuiltsAsClasspath("legacy-java-compiler.bootclasspath"), getPrebuilt("jarjar"),
+          getPrebuilt("proguard"), getPrebuilt("dx"));
     }
   }
 
@@ -312,6 +314,39 @@
     return result;
   }
 
+  @Nonnull
+  public static List<File> getPrebuiltsAsClasspath(@Nonnull String prebuiltClasspathName) {
+    String keyName = TOOLCHAIN_PREBUILT_PREFIX + prebuiltClasspathName;
+    String value = TestsProperties.getProperty(keyName).trim();
+
+    if (value.equals("")) {
+      throw new AssertionError("Property '" + prebuiltClasspathName + "' is not set");
+    }
+
+    List<File> result = new ArrayList<>();
+    for (String prebuiltPath : getClasspathsAsList(value)) {
+
+      File file = new File(prebuiltPath);
+      if (!file.isAbsolute()) {
+        file = new File(TestsProperties.getJackRootDir(), prebuiltPath);
+      }
+
+      if (!file.exists()) {
+        throw new TestConfigurationException(
+            "Can not find prebuilt at '"
+                + file.getPath()
+                + "' for prebuilt classpath '"
+                + prebuiltClasspathName
+                + "'");
+      }
+
+
+      result.add(file);
+    }
+
+    return result;
+  }
+
 
   @Nonnull
   private static final File getTestsRootDir() {
@@ -538,6 +573,11 @@
   }
 
   @Nonnull
+  public static List<String> getClasspathsAsList(@Nonnull String classpath) {
+    return Lists.newArrayList(Splitter.on(File.pathSeparatorChar).split(classpath));
+  }
+
+  @Nonnull
   private static String concatClasspathStrings(
       @Nonnull String bootclasspath, @Nonnull String classpath) {
     if (bootclasspath.isEmpty()) {
@@ -839,6 +879,12 @@
   }
 
   @Nonnull
+  public static List<RuntimeRunner> listRuntimeTestRunners()
+      throws SecurityException, IllegalArgumentException, RuntimeRunnerException {
+    return listRuntimeTestRunners(/*properties = */ null);
+  }
+
+  @Nonnull
   public static List<RuntimeRunner> listRuntimeTestRunners(@CheckForNull Properties properties)
       throws SecurityException, IllegalArgumentException, RuntimeRunnerException {
 
@@ -856,8 +902,6 @@
       }
     }
 
-    assert runtimes != null;
-
     if (properties != null) {
       String rtAsString = properties.getProperty(RUNTIME_LIST_KEY);
       if (rtAsString != null) {
@@ -865,6 +909,7 @@
       }
     }
 
+    assert runtimes != null; // Make FindBugs happy
     if (runtimes.size() == 0) {
       if (Boolean.parseBoolean(System.getProperty(RUNTIME_TOLERANT, "false"))) {
         if (!hasRuntimeWarningBeenEmitted) {
@@ -878,6 +923,7 @@
       }
     }
 
+    assert runtimes != null; // Make FindBugs happy
     return runtimes;
   }
 
diff --git a/jack-tests/src/com/android/jack/test/toolchain/AndroidToolchain.java b/jack-tests/src/com/android/jack/test/toolchain/AndroidToolchain.java
index bf7ece7..9ff4f92 100644
--- a/jack-tests/src/com/android/jack/test/toolchain/AndroidToolchain.java
+++ b/jack-tests/src/com/android/jack/test/toolchain/AndroidToolchain.java
@@ -40,4 +40,7 @@
   @Nonnull
   public abstract AndroidToolchain enableDxOptimizations();
 
+  @Nonnull
+  public abstract AndroidToolchain setAndroidMinApiLevel(@Nonnull String minApiLevel)
+      throws Exception;
 }
diff --git a/jack-tests/src/com/android/jack/test/toolchain/DummyToolchain.java b/jack-tests/src/com/android/jack/test/toolchain/DummyToolchain.java
index 27c3135..6b20d35 100644
--- a/jack-tests/src/com/android/jack/test/toolchain/DummyToolchain.java
+++ b/jack-tests/src/com/android/jack/test/toolchain/DummyToolchain.java
@@ -77,4 +77,11 @@
   public String getLibraryElementsExtension() {
     return ".dummy";
   }
+
+  @Override
+  @Nonnull
+  public AndroidToolchain setAndroidMinApiLevel(@Nonnull String minApiLevel) {
+    // Do nothing
+    return this;
+  }
 }
diff --git a/jack-tests/src/com/android/jack/test/toolchain/IncrementalToolchainUtils.java b/jack-tests/src/com/android/jack/test/toolchain/IncrementalToolchainUtils.java
new file mode 100644
index 0000000..76aa0db
--- /dev/null
+++ b/jack-tests/src/com/android/jack/test/toolchain/IncrementalToolchainUtils.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.test.toolchain;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.attribute.FileTime;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+
+/**
+ * Utilities methods for incremental toolchains
+ */
+class IncrementalToolchainUtils {
+
+  @CheckForNull
+  private static File getFileToTouch(@Nonnull File... sources) throws Exception  {
+    List<File> files = new ArrayList<File>();
+    for (File source : sources) {
+      AbstractTestTools.getJavaFiles(source, files, /* mustExist = */ false);
+    }
+    if (files.size() > 0) {
+      return files.get(files.size() / 2);
+    }
+    return null;
+  }
+
+  public static void touchSourceFile(@Nonnull File... sources) throws Exception {
+
+    File fileToTouch = getFileToTouch(sources);
+
+    if (fileToTouch != null) {
+
+      FileTime fileTime = Files.getLastModifiedTime(fileToTouch.toPath());
+
+      Files.setLastModifiedTime(
+          fileToTouch.toPath(), FileTime.fromMillis(System.currentTimeMillis()));
+
+      if (Files.getLastModifiedTime(fileToTouch.toPath()).equals(fileTime)) {
+        Thread.sleep(1000);
+        Files.setLastModifiedTime(
+            fileToTouch.toPath(), FileTime.fromMillis(System.currentTimeMillis()));
+      }
+
+      assert !fileTime.equals(Files.getLastModifiedTime(fileToTouch.toPath()));
+    }
+  }
+
+}
diff --git a/jack-tests/src/com/android/jack/test/toolchain/JackApiV01Toolchain.java b/jack-tests/src/com/android/jack/test/toolchain/JackApiV01Toolchain.java
index 8b7ccb6..3a4d688 100644
--- a/jack-tests/src/com/android/jack/test/toolchain/JackApiV01Toolchain.java
+++ b/jack-tests/src/com/android/jack/test/toolchain/JackApiV01Toolchain.java
@@ -274,4 +274,10 @@
     }
   }
 
+  @Override
+  @Nonnull
+  public AndroidToolchain setAndroidMinApiLevel(@Nonnull String minApiLevel) throws Exception {
+    apiV01Config.setProperty(Options.ANDROID_MIN_API_LEVEL.getName(), minApiLevel);
+    return this;
+  }
 }
diff --git a/jack-tests/src/com/android/jack/test/toolchain/JackApiV02IncrementalToolchain.java b/jack-tests/src/com/android/jack/test/toolchain/JackApiV02IncrementalToolchain.java
index 044599b..52f4578 100644
--- a/jack-tests/src/com/android/jack/test/toolchain/JackApiV02IncrementalToolchain.java
+++ b/jack-tests/src/com/android/jack/test/toolchain/JackApiV02IncrementalToolchain.java
@@ -17,8 +17,6 @@
 package com.android.jack.test.toolchain;
 
 import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
@@ -40,8 +38,7 @@
       throws Exception {
     setIncrementalFolder(AbstractTestTools.createTempDir());
     super.srcToExe(out, zipFile, sources);
-    Thread.sleep(1000);
-    touchSourceFile(sources);
+    IncrementalToolchainUtils.touchSourceFile(sources);
     super.srcToExe(out, zipFile, sources);
   }
 
@@ -50,22 +47,8 @@
       throws Exception {
     setIncrementalFolder(AbstractTestTools.createTempDir());
     super.srcToLib(out, zipFiles, sources);
-    Thread.sleep(1000);
-    touchSourceFile(sources);
+    IncrementalToolchainUtils.touchSourceFile(sources);
     super.srcToLib(out, zipFiles, sources);
   }
 
-  private void touchSourceFile(@Nonnull File... sources) throws Exception {
-    List<File> files = new ArrayList<File>();
-    for (File source : sources) {
-      AbstractTestTools.getJavaFiles(source, files, /* mustExist = */ false);
-    }
-    if (files.size() > 0) {
-      File fileToTouch = files.get(files.size() / 2);
-      if (!fileToTouch.setLastModified(System.currentTimeMillis())) {
-        throw new AssertionError("Could not touch file '" + fileToTouch.getPath() + "'");
-      }
-    }
-  }
-
 }
diff --git a/jack-tests/src/com/android/jack/test/toolchain/JackApiV02Toolchain.java b/jack-tests/src/com/android/jack/test/toolchain/JackApiV02Toolchain.java
index 51fab1c..b41a308 100644
--- a/jack-tests/src/com/android/jack/test/toolchain/JackApiV02Toolchain.java
+++ b/jack-tests/src/com/android/jack/test/toolchain/JackApiV02Toolchain.java
@@ -287,4 +287,10 @@
     }
   }
 
+  @Override
+  @Nonnull
+  public AndroidToolchain setAndroidMinApiLevel(@Nonnull String minApiLevel) throws Exception {
+    apiV02Config.setProperty(Options.ANDROID_MIN_API_LEVEL.getName(), minApiLevel);
+    return this;
+  }
 }
diff --git a/jack-tests/src/com/android/jack/test/toolchain/JackApiV03IncrementalToolchain.java b/jack-tests/src/com/android/jack/test/toolchain/JackApiV03IncrementalToolchain.java
index c67499c..58cad90 100644
--- a/jack-tests/src/com/android/jack/test/toolchain/JackApiV03IncrementalToolchain.java
+++ b/jack-tests/src/com/android/jack/test/toolchain/JackApiV03IncrementalToolchain.java
@@ -17,8 +17,6 @@
 package com.android.jack.test.toolchain;
 
 import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
@@ -40,8 +38,7 @@
       throws Exception {
     setIncrementalFolder(AbstractTestTools.createTempDir());
     super.srcToExe(out, zipFile, sources);
-    Thread.sleep(1000);
-    touchSourceFile(sources);
+    IncrementalToolchainUtils.touchSourceFile(sources);
     super.srcToExe(out, zipFile, sources);
   }
 
@@ -50,22 +47,9 @@
       throws Exception {
     setIncrementalFolder(AbstractTestTools.createTempDir());
     super.srcToLib(out, zipFiles, sources);
-    Thread.sleep(1000);
-    touchSourceFile(sources);
+    IncrementalToolchainUtils.touchSourceFile(sources);
     super.srcToLib(out, zipFiles, sources);
   }
 
-  private void touchSourceFile(@Nonnull File... sources) throws Exception {
-    List<File> files = new ArrayList<File>();
-    for (File source : sources) {
-      AbstractTestTools.getJavaFiles(source, files, /* mustExist = */ false);
-    }
-    if (files.size() > 0) {
-      File fileToTouch = files.get(files.size() / 2);
-      if (!fileToTouch.setLastModified(System.currentTimeMillis())) {
-        throw new AssertionError("Could not touch file '" + fileToTouch.getPath() + "'");
-      }
-    }
-  }
 
 }
diff --git a/jack-tests/src/com/android/jack/test/toolchain/JackApiV03Toolchain.java b/jack-tests/src/com/android/jack/test/toolchain/JackApiV03Toolchain.java
index 765c108..7a754f1 100644
--- a/jack-tests/src/com/android/jack/test/toolchain/JackApiV03Toolchain.java
+++ b/jack-tests/src/com/android/jack/test/toolchain/JackApiV03Toolchain.java
@@ -308,4 +308,10 @@
     return this;
   }
 
+  @Override
+  @Nonnull
+  public AndroidToolchain setAndroidMinApiLevel(@Nonnull String minApiLevel) throws Exception {
+    apiV03Config.setProperty(Options.ANDROID_MIN_API_LEVEL.getName(), minApiLevel);
+    return this;
+  }
 }
diff --git a/jack-tests/src/com/android/jack/test/toolchain/JackApiV04IncrementalToolchain.java b/jack-tests/src/com/android/jack/test/toolchain/JackApiV04IncrementalToolchain.java
index 6327293..c74b2f8 100644
--- a/jack-tests/src/com/android/jack/test/toolchain/JackApiV04IncrementalToolchain.java
+++ b/jack-tests/src/com/android/jack/test/toolchain/JackApiV04IncrementalToolchain.java
@@ -17,8 +17,6 @@
 package com.android.jack.test.toolchain;
 
 import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
 
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
@@ -40,8 +38,7 @@
       throws Exception {
     setIncrementalFolder(AbstractTestTools.createTempDir());
     super.srcToExe(out, zipFile, sources);
-    Thread.sleep(1000);
-    touchSourceFile(sources);
+    IncrementalToolchainUtils.touchSourceFile(sources);
     super.srcToExe(out, zipFile, sources);
   }
 
@@ -50,22 +47,8 @@
       throws Exception {
     setIncrementalFolder(AbstractTestTools.createTempDir());
     super.srcToLib(out, zipFiles, sources);
-    Thread.sleep(1000);
-    touchSourceFile(sources);
+    IncrementalToolchainUtils.touchSourceFile(sources);
     super.srcToLib(out, zipFiles, sources);
   }
 
-  private void touchSourceFile(@Nonnull File... sources) throws Exception {
-    List<File> files = new ArrayList<File>();
-    for (File source : sources) {
-      AbstractTestTools.getJavaFiles(source, files, /* mustExist = */ false);
-    }
-    if (files.size() > 0) {
-      File fileToTouch = files.get(files.size() / 2);
-      if (!fileToTouch.setLastModified(System.currentTimeMillis())) {
-        throw new AssertionError("Could not touch file '" + fileToTouch.getPath() + "'");
-      }
-    }
-  }
-
 }
diff --git a/jack-tests/src/com/android/jack/test/toolchain/JackApiV04Toolchain.java b/jack-tests/src/com/android/jack/test/toolchain/JackApiV04Toolchain.java
index ee1cb29..7e6ac02 100644
--- a/jack-tests/src/com/android/jack/test/toolchain/JackApiV04Toolchain.java
+++ b/jack-tests/src/com/android/jack/test/toolchain/JackApiV04Toolchain.java
@@ -318,4 +318,11 @@
     }
     return this;
   }
+
+  @Override
+  @Nonnull
+  public AndroidToolchain setAndroidMinApiLevel(@Nonnull String minApiLevel) throws Exception {
+    apiV04Config.setProperty(Options.ANDROID_MIN_API_LEVEL.getName(), minApiLevel);
+    return this;
+  }
 }
diff --git a/jack-tests/src/com/android/jack/test/toolchain/JackCliToolchain.java b/jack-tests/src/com/android/jack/test/toolchain/JackCliToolchain.java
index 731340d..36e28bb 100644
--- a/jack-tests/src/com/android/jack/test/toolchain/JackCliToolchain.java
+++ b/jack-tests/src/com/android/jack/test/toolchain/JackCliToolchain.java
@@ -467,4 +467,11 @@
     writer.close();
     commandLine.add('@' + sourceList.getAbsolutePath());
   }
+
+  @Override
+  @Nonnull
+  public AndroidToolchain setAndroidMinApiLevel(@Nonnull String minApiLevel) throws Exception {
+    properties.put(Options.ANDROID_MIN_API_LEVEL.getName(), minApiLevel);
+    return this;
+  }
 }
diff --git a/jack-tests/src/com/android/jack/test/toolchain/LegacyToolchain.java b/jack-tests/src/com/android/jack/test/toolchain/LegacyToolchain.java
index 5fc1a78..8ccd601 100644
--- a/jack-tests/src/com/android/jack/test/toolchain/LegacyToolchain.java
+++ b/jack-tests/src/com/android/jack/test/toolchain/LegacyToolchain.java
@@ -18,10 +18,11 @@
 
 import com.google.common.base.Joiner;
 
-import com.android.dx.command.dexer.Main.Arguments;
+import com.android.jack.Options;
 import com.android.jack.test.TestsProperties;
 import com.android.jack.test.util.ExecFileException;
 import com.android.jack.test.util.ExecuteFile;
+import com.android.sched.util.codec.CodecContext;
 
 import java.io.BufferedWriter;
 import java.io.File;
@@ -41,17 +42,28 @@
   @Nonnull
   private final File legacyCompilerPrebuilt;
   @Nonnull
+  private final List<File> legacyCompilerBootclasspath;
+  @Nonnull
   private final File jarjarPrebuilt;
   @Nonnull
   private final File proguardPrebuilt;
+  @Nonnull
+  private final File dxPrebuilt;
 
   private boolean useDxOptimization = true;
 
-  LegacyToolchain(@Nonnull File legacyCompilerPrebuilt, @Nonnull File jarjarPrebuilt,
-      @Nonnull File proguardPrebuilt) {
+  @Nonnull
+  private String minApiLevel = "1";
+
+  LegacyToolchain(@Nonnull File legacyCompilerPrebuilt,
+      @Nonnull List<File> legacyCompilerBootclasspath,
+      @Nonnull File jarjarPrebuilt,
+      @Nonnull File proguardPrebuilt,   @Nonnull File dxPrebuilt) {
     this.legacyCompilerPrebuilt = legacyCompilerPrebuilt;
+    this.legacyCompilerBootclasspath = legacyCompilerBootclasspath;
     this.jarjarPrebuilt         = jarjarPrebuilt;
     this.proguardPrebuilt       = proguardPrebuilt;
+    this.dxPrebuilt             = dxPrebuilt;
   }
 
   @Override
@@ -123,15 +135,11 @@
   @Override
   public void libToExe(@Nonnull File[] in, @Nonnull File out, boolean zipFile) throws Exception {
 
-    try {
-      if (in.length > 1) {
-        throw new AssertionError("Not yet supported");
-      }
-      for (File lib : in) {
-        compileWithDx(in[0], out, zipFile);
-      }
-    } catch (IOException e) {
-      throw new RuntimeException("Legacy toolchain exited with an error", e);
+    if (in.length > 1) {
+      throw new AssertionError("Not yet supported");
+    }
+    for (File lib : in) {
+      compileWithDx(in[0], out, zipFile);
     }
   }
 
@@ -143,10 +151,9 @@
   @Override
   @Nonnull
   public File[] getDefaultBootClasspath() {
-    return new File[] {
-        new File(TestsProperties.getJackRootDir(), "jack-tests/prebuilts/core-stubs-mini.jar"),
-        new File(TestsProperties.getJackRootDir(), "jack-tests/libs/junit4.jar")
-    };
+    List<File> result = new ArrayList<>(legacyCompilerBootclasspath);
+    result.add(new File(TestsProperties.getJackRootDir(), "jack-tests/libs/junit4.jar"));
+    return result.toArray(new File[result.size()]);
   }
 
   @Override
@@ -227,6 +234,74 @@
     }
   }
 
+  private void processWithDesugar(@Nonnull File input, @Nonnull File output) throws Exception {
+    boolean assertEnable = false;
+    assert true == (assertEnable = true);
+
+    List<String> commandLine = new ArrayList<String>();
+    commandLine.add("java");
+    commandLine.add(assertEnable ? "-ea" : "-da");
+    commandLine.add("-jar");
+    commandLine.add(AbstractTestTools.getPrebuilt("desugar").getAbsolutePath());
+
+    if (isVerbose) {
+      commandLine.add("--verbose");
+    }
+
+    List<File> tmpClasspath = ensureOnlyFilesOnClasspath(classpath);
+
+    if (tmpClasspath != null) {
+      for (File cpEntry : tmpClasspath) {
+        commandLine.add("--classpath_entry");
+        commandLine.add(cpEntry.getAbsolutePath());
+      }
+    }
+
+    if (Options.ANDROID_MIN_API_LEVEL.getCodec().parseString(new CodecContext(), minApiLevel)
+        .getReleasedLevel() >= 24) {
+      commandLine.add("--min_sdk_version");
+      commandLine.add(minApiLevel);
+    }
+
+    commandLine.add("--input");
+    commandLine.add(input.getAbsolutePath());
+    commandLine.add("--output");
+    commandLine.add(output.getAbsolutePath());
+
+
+    ExecuteFile execFile = new ExecuteFile(commandLine.toArray(new String[commandLine.size()]));
+    execFile.inheritEnvironment();
+    execFile.setOut(outRedirectStream);
+    execFile.setErr(errRedirectStream);
+    execFile.setVerbose(isVerbose);
+
+    try {
+      if (execFile.run() != 0) {
+        throw new RuntimeException("Desugar exited with an error");
+      }
+    } catch (ExecFileException e) {
+      throw new RuntimeException("An error occurred while running Desugar", e);
+    }
+
+  }
+
+
+  @Nonnull
+  private List<File> ensureOnlyFilesOnClasspath(@Nonnull List<File> classpath) throws Exception {
+    List<File> result = new ArrayList<>(classpath.size());
+    for (File item : classpath) {
+      File fileToAdd;
+      if (item.isDirectory()) {
+        fileToAdd = AbstractTestTools.createTempFile("zipped-cp-entry", ".jar");
+        AbstractTestTools.createjar(fileToAdd, item, isVerbose);
+      } else {
+        fileToAdd = item;
+      }
+      result.add(fileToAdd);
+    }
+    return result;
+  }
+
   private void compileWithEcj(@Nonnull File[] sources, @CheckForNull String classpath,
       @Nonnull File out) throws Exception {
     List<String> commandLine = new ArrayList<String>(4 + sources.length);
@@ -245,7 +320,9 @@
     if (isVerbose) {
       commandLine.add("-verbose");
     }
+
     addSourceLevel(sourceLevel, commandLine);
+    addTargetLevel(sourceLevel, commandLine);
 
     if (annotationProcessorClasses != null) {
       commandLine.add("-processor");
@@ -257,11 +334,30 @@
 
     commandLine.add("-noExit");
     commandLine.add("-preserveAllLocals");
+
+    File outputClassesDir = AbstractTestTools.createTempDir();
+
+    if (sourceLevel.compareTo(SourceLevel.JAVA_8) >= 0) {
+      outputClassesDir = AbstractTestTools.createTempDir();
+    } else {
+      outputClassesDir = out;
+    }
+
     commandLine.add("-d");
-    commandLine.add(out.getAbsolutePath());
+    commandLine.add(outputClassesDir.getAbsolutePath());
+
     addSourceList(commandLine, sources);
     org.eclipse.jdt.internal.compiler.batch.Main.main(
         commandLine.toArray(new String[commandLine.size()]));
+
+    if (sourceLevel.compareTo(SourceLevel.JAVA_8) >= 0) {
+      File tmpOutFile = AbstractTestTools.createTempFile("jack-test", "no-desugar.jar");
+      File tmpOutFileDesugared = AbstractTestTools.createTempFile("jack-test", "desugar.jar");
+      AbstractTestTools.zip(outputClassesDir, tmpOutFile, isVerbose);
+      processWithDesugar(tmpOutFile, tmpOutFileDesugared);
+      AbstractTestTools.unzip(tmpOutFileDesugared, out, isVerbose);
+    }
+
   }
 
   @Override
@@ -296,9 +392,26 @@
     }
   }
 
+  private static void addTargetLevel(
+      @Nonnull SourceLevel level, @Nonnull List<String> commandLine) {
+    commandLine.add("-target");
+    switch (level) {
+      case JAVA_6:
+        commandLine.add("1.6");
+        break;
+      case JAVA_7:
+        commandLine.add("1.7");
+        break;
+      case JAVA_8:
+        commandLine.add("1.8");
+        break;
+      default:
+        throw new AssertionError("Unkown level: '" + level.toString() + "'");
+    }
+  }
+
   private void compileWithExternalRefCompiler(@Nonnull File[] sources,
       @CheckForNull String classpath, @Nonnull File out) throws Exception {
-
     List<String> commandLine = new ArrayList<String>();
 
     commandLine.add(legacyCompilerPrebuilt.getAbsolutePath());
@@ -308,9 +421,7 @@
     }
 
     addSourceLevel(sourceLevel, commandLine);
-
-    commandLine.add("-target");
-    commandLine.add("1.7");
+    addTargetLevel(sourceLevel, commandLine);
 
     commandLine.add("-encoding");
     commandLine.add("utf8");
@@ -330,8 +441,16 @@
 
     addSourceList(commandLine, sources);
 
+    File outputClassesDir = AbstractTestTools.createTempDir();
+
+    if (sourceLevel.compareTo(SourceLevel.JAVA_8) >= 0) {
+      outputClassesDir = AbstractTestTools.createTempDir();
+    } else {
+      outputClassesDir = out;
+    }
+
     commandLine.add("-d");
-    commandLine.add(out.getAbsolutePath());
+    commandLine.add(outputClassesDir.getAbsolutePath());
 
     ExecuteFile execFile = new ExecuteFile(commandLine.toArray(new String[commandLine.size()]));
     execFile.inheritEnvironment();
@@ -345,36 +464,56 @@
     } catch (ExecFileException e) {
       throw new RuntimeException("An error occurred while running reference compiler", e);
     }
-  }
 
-  private void compileWithDx(@Nonnull File in, @Nonnull File out, boolean zipFile)
-      throws IOException {
-
-    try {
-      System.setOut(outRedirectStream);
-      System.setErr(errRedirectStream);
-
-      Arguments arguments = new Arguments();
-
-      arguments.jarOutput = zipFile;
-      arguments.outName = new File(out, getBinaryFileName()).getAbsolutePath();
-
-      arguments.optimize = useDxOptimization;
-      // this only means we deactivate the check that no core classes are included
-      arguments.coreLibrary = true;
-      arguments.verbose = isVerbose;
-      arguments.parse(new String[] {in.getAbsolutePath()});
-
-      int retValue = com.android.dx.command.dexer.Main.run(arguments);
-      if (retValue != 0) {
-        throw new RuntimeException("Dx failed and returned " + retValue);
-      }
-    } finally {
-      System.setOut(stdOut);
-      System.setErr(stdErr);
+    if (sourceLevel.compareTo(SourceLevel.JAVA_8) >= 0) {
+      File tmpOutFile = AbstractTestTools.createTempFile("jack-test", "no-desugar.jar");
+      File tmpOutFileDesugared = AbstractTestTools.createTempFile("jack-test", "desugar.jar");
+      AbstractTestTools.zip(outputClassesDir, tmpOutFile, isVerbose);
+      processWithDesugar(tmpOutFile, tmpOutFileDesugared);
+      AbstractTestTools.unzip(tmpOutFileDesugared, out, isVerbose);
     }
   }
 
+  private void compileWithDx(@Nonnull File in, @Nonnull File out, boolean zipFile) {
+    List<String> commandLine = new ArrayList<String>();
+
+    if (dxPrebuilt.getAbsolutePath().endsWith(".jar")) {
+      commandLine.add("java");
+      commandLine.add("-jar");
+    }
+
+    commandLine.add(dxPrebuilt.getAbsolutePath());
+
+    commandLine.add("--dex");
+
+    if (!useDxOptimization) {
+      commandLine.add("--no-optimize");
+    }
+
+    // commandLine.add("--core-library");
+
+    if (isVerbose) {
+      commandLine.add("--verbose");
+    }
+
+    commandLine.add("--output=" + out.getAbsolutePath());
+
+    commandLine.add(in.getAbsolutePath());
+
+    ExecuteFile execFile = new ExecuteFile(commandLine.toArray(new String[commandLine.size()]));
+    execFile.inheritEnvironment();
+    execFile.setOut(outRedirectStream);
+    execFile.setErr(errRedirectStream);
+    execFile.setVerbose(isVerbose);
+
+    try {
+      if (execFile.run() != 0) {
+        throw new RuntimeException("Dx exited with an error");
+      }
+    } catch (ExecFileException e) {
+      throw new RuntimeException("An error occurred while running dx", e);
+    }
+  }
 
   protected void addSourceList(@Nonnull List<String> commandLine, @Nonnull File... sources)
       throws Exception {
@@ -389,4 +528,11 @@
     writer.close();
     commandLine.add('@' + sourceList.getAbsolutePath());
   }
+
+  @Override
+  @Nonnull
+  public AndroidToolchain setAndroidMinApiLevel(@Nonnull String minApiLevel) throws Exception {
+    this.minApiLevel = minApiLevel;
+    return this;
+  }
 }
diff --git a/jack-tests/tests.properties.template b/jack-tests/tests.properties.template
index fbdb1a4..c96d248 100644
--- a/jack-tests/tests.properties.template
+++ b/jack-tests/tests.properties.template
@@ -16,4 +16,5 @@
 runtime.location.art-host=
 
 toolchain.prebuilt.legacy-java-compiler=
+toolchain.prebuilt.legacy-java-compiler.bootclasspath=
 
diff --git a/jack-tests/tests/com/android/jack/RegressionTests.java b/jack-tests/tests/com/android/jack/RegressionTests.java
index 325bfcb..273648c 100644
--- a/jack-tests/tests/com/android/jack/RegressionTests.java
+++ b/jack-tests/tests/com/android/jack/RegressionTests.java
@@ -40,9 +40,11 @@
 import com.android.jack.invoke.InvokeTests;
 import com.android.jack.newarray.NewarrayTests;
 import com.android.jack.opcodes.OpcodesTests;
+import com.android.jack.optimizations.defuse.DefUseTests;
 import com.android.jack.optimizations.exprsimplifier.ExprsimplifierTests;
 import com.android.jack.optimizations.ifwithconstantsimplifier.IfWithConstantSimplifierTests;
 import com.android.jack.optimizations.notsimplifier.NotsimplifierTests;
+import com.android.jack.optimizations.sideeffect.SideEffectTests;
 import com.android.jack.optimizations.tailrecursion.TailRecursionTests;
 import com.android.jack.optimizations.usedef.UseDefTests;
 import com.android.jack.order.OrderTests;
@@ -58,6 +60,7 @@
 import com.android.jack.test.runtime.RuntimeTestInfo;
 import com.android.jack.threeaddress.ThreeaddressTests;
 import com.android.jack.throwstatement.ThrowstatementTests;
+import com.android.jack.transformations.boostlockregionpriority.BoostLockedRegionPriorityTests;
 import com.android.jack.trycatch.TrycatchTests;
 import com.android.jack.tryfinally.TryfinallyTests;
 import com.android.jack.unary.UnaryTests;
@@ -76,6 +79,7 @@
       new ArrayTests(),
       new AssertionTests(),
       new AssignTests(),
+      new BoostLockedRegionPriorityTests(),
       new BoxTests(),
       new BridgeTests(),
       new BridgeAnnotationsTests(),
@@ -83,6 +87,7 @@
       new ComparisonTests(),
       new ConditionalTests(),
       new ConstantTests(),
+      new DefUseTests(),
       new DxTests(),
       new EnumsTests(),
       new ExprsimplifierTests(),
@@ -102,6 +107,7 @@
       new ReflectTests(),
       new ReturnstatementTests(),
       new ShrobRuntimeTests(),
+      new SideEffectTests(),
       new StringTests(),
       new SwitchstatementTests(),
       new SynchronizeTests(),
diff --git a/jack-tests/tests/com/android/jack/annotation/processor/AnnotationProcessorTests.java b/jack-tests/tests/com/android/jack/annotation/processor/AnnotationProcessorTests.java
index 354e2b4..942ed8a 100644
--- a/jack-tests/tests/com/android/jack/annotation/processor/AnnotationProcessorTests.java
+++ b/jack-tests/tests/com/android/jack/annotation/processor/AnnotationProcessorTests.java
@@ -23,8 +23,10 @@
 import com.android.jack.library.FileTypeDoesNotExistException;
 import com.android.jack.library.InputJackLibrary;
 import com.android.jack.test.TestsProperties;
+import com.android.jack.test.junit.KnownIssue;
 import com.android.jack.test.toolchain.AbstractTestTools;
 import com.android.jack.test.toolchain.IToolchain;
+import com.android.jack.test.toolchain.IncrementalToolchain;
 import com.android.jack.test.toolchain.JackBasedToolchain;
 import com.android.jack.test.toolchain.JillBasedToolchain;
 import com.android.jack.test.util.ExecFileException;
@@ -118,6 +120,7 @@
   }
 
   @Test
+  @KnownIssue(candidate=IncrementalToolchain.class)
   public void compileWithAnnotationProcessorAuto_classpath() throws Exception {
     List<Class<? extends IToolchain>> exclude = new ArrayList<Class<? extends IToolchain>>();
     exclude.add(JillBasedToolchain.class);
@@ -137,6 +140,7 @@
   }
 
   @Test
+  @KnownIssue(candidate=IncrementalToolchain.class)
   public void compileWithAnnotationProcessorAuto_processorPath() throws Exception {
     List<Class<? extends IToolchain>> exclude = new ArrayList<Class<? extends IToolchain>>();
     exclude.add(JillBasedToolchain.class);
@@ -157,6 +161,7 @@
   }
 
   @Test
+  @KnownIssue(candidate=IncrementalToolchain.class)
   public void compileWithAnnotationProcessorNoAuto_processorPath() throws Exception {
     List<Class<? extends IToolchain>> exclude = new ArrayList<Class<? extends IToolchain>>();
     exclude.add(JillBasedToolchain.class);
diff --git a/jack-tests/tests/com/android/jack/bridge/BridgeTests.java b/jack-tests/tests/com/android/jack/bridge/BridgeTests.java
index 3db60ab..5d02b23 100644
--- a/jack-tests/tests/com/android/jack/bridge/BridgeTests.java
+++ b/jack-tests/tests/com/android/jack/bridge/BridgeTests.java
@@ -24,6 +24,7 @@
 import com.android.jack.test.toolchain.AbstractTestTools;
 import com.android.jack.test.toolchain.IToolchain;
 import com.android.jack.test.toolchain.JillBasedToolchain;
+import com.android.jack.test.toolchain.LegacyToolchain;
 
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
@@ -151,6 +152,7 @@
   public void test009() throws Exception {
     new RuntimeTestHelper(TEST009)
     .addIgnoredCandidateToolchain(JillBasedToolchain.class)
+    .addIgnoredCandidateToolchain(LegacyToolchain.class)
     .compileAndRunTest();
   }
 
diff --git a/jack-tests/tests/com/android/jack/classpath/ClasspathTests.java b/jack-tests/tests/com/android/jack/classpath/ClasspathTests.java
index e7682ab..55cc123 100644
--- a/jack-tests/tests/com/android/jack/classpath/ClasspathTests.java
+++ b/jack-tests/tests/com/android/jack/classpath/ClasspathTests.java
@@ -29,6 +29,7 @@
 import com.android.jack.test.toolchain.JackBasedToolchain;
 import com.android.jack.test.toolchain.JillApiToolchainBase;
 import com.android.jack.test.toolchain.JillBasedToolchain;
+import com.android.jack.test.toolchain.LegacyToolchain;
 import com.android.sched.vfs.VPath;
 
 import junit.framework.Assert;
@@ -64,6 +65,7 @@
   public void test002() throws Exception {
     List<Class<? extends IToolchain>> exclude = new ArrayList<Class<? extends IToolchain>>(1);
     exclude.add(JillApiToolchainBase.class);
+    exclude.add(LegacyToolchain.class);
 
     AndroidToolchain toolchain = AbstractTestTools.getCandidateToolchain(AndroidToolchain.class, exclude);
 
diff --git a/jack-tests/tests/com/android/jack/clinit/ClinitTests.java b/jack-tests/tests/com/android/jack/clinit/ClinitTests.java
index 01262e1..ed3e6f6 100644
--- a/jack-tests/tests/com/android/jack/clinit/ClinitTests.java
+++ b/jack-tests/tests/com/android/jack/clinit/ClinitTests.java
@@ -24,7 +24,7 @@
 public class ClinitTests {
 
   public static final String CLASS_WITH_VARIABLE_INIT_BINARY_NAME
-    = "com/android/jack/clinit/jack/ClInitWithVariableInit";
+    = "com/android/jack/clinit/test001/jack/ClInitWithVariableInit";
 
   @Test
   public void testCompileWithClinit() throws Exception {
@@ -33,7 +33,17 @@
     .srcToExe(
         AbstractTestTools.createTempDir(),
         /* zipFile = */ false,
-        AbstractTestTools.getTestRootDir("com.android.jack.clinit.jack"));
+        AbstractTestTools.getTestRootDir("com.android.jack.clinit.test001.jack"));
+  }
+
+  @Test
+  public void testCompileAnnotationWithClinit() throws Exception {
+    IToolchain toolchain = AbstractTestTools.getCandidateToolchain();
+    toolchain.addToClasspath(toolchain.getDefaultBootClasspath())
+    .srcToExe(
+        AbstractTestTools.createTempDir(),
+        /* zipFile = */ false,
+        AbstractTestTools.getTestRootDir("com.android.jack.clinit.test002.jack"));
   }
 
 }
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java b/jack-tests/tests/com/android/jack/clinit/test001/jack/ClInit.java
similarity index 93%
rename from jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
rename to jack-tests/tests/com/android/jack/clinit/test001/jack/ClInit.java
index 680f9cf..d4fbee3 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
+++ b/jack-tests/tests/com/android/jack/clinit/test001/jack/ClInit.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.clinit.test001.jack;
 
 public class ClInit {
 
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInitWithVariableInit.java b/jack-tests/tests/com/android/jack/clinit/test001/jack/ClInitWithVariableInit.java
similarity index 93%
rename from jack-tests/tests/com/android/jack/clinit/jack/ClInitWithVariableInit.java
rename to jack-tests/tests/com/android/jack/clinit/test001/jack/ClInitWithVariableInit.java
index 8c344dd..f39d1c8 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInitWithVariableInit.java
+++ b/jack-tests/tests/com/android/jack/clinit/test001/jack/ClInitWithVariableInit.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.clinit.test001.jack;
 
 public class ClInitWithVariableInit {
 
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java b/jack-tests/tests/com/android/jack/clinit/test002/jack/Application.java
similarity index 78%
copy from jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
copy to jack-tests/tests/com/android/jack/clinit/test002/jack/Application.java
index 680f9cf..0cc416e 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
+++ b/jack-tests/tests/com/android/jack/clinit/test002/jack/Application.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2017 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.clinit.test002.jack;
 
-public class ClInit {
-
+class Application {
+  protected Application() { }
 }
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java b/jack-tests/tests/com/android/jack/clinit/test002/jack/Config.java
similarity index 71%
copy from jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
copy to jack-tests/tests/com/android/jack/clinit/test002/jack/Config.java
index 680f9cf..83ed1e6 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
+++ b/jack-tests/tests/com/android/jack/clinit/test002/jack/Config.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2017 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,10 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.clinit.test002.jack;
 
-public class ClInit {
-
+public @interface Config {
+  String s = "A String";
+  int i = 123;
+  Class<Application> DEFAULT_APPLICATION = Application.class;
 }
diff --git a/jack-tests/tests/com/android/jack/dx/DxTests.java b/jack-tests/tests/com/android/jack/dx/DxTests.java
index b9293ac..80e530e 100644
--- a/jack-tests/tests/com/android/jack/dx/DxTests.java
+++ b/jack-tests/tests/com/android/jack/dx/DxTests.java
@@ -22,11 +22,13 @@
 import com.android.jack.test.category.RuntimeRegressionTest;
 import com.android.jack.test.helper.FileChecker;
 import com.android.jack.test.helper.RuntimeTestHelper;
+import com.android.jack.test.junit.KnownIssue;
 import com.android.jack.test.junit.Runtime;
 import com.android.jack.test.runtime.RuntimeTest;
 import com.android.jack.test.runtime.RuntimeTestInfo;
 import com.android.jack.test.toolchain.AbstractTestTools;
 import com.android.jack.test.toolchain.IToolchain;
+import com.android.jack.test.toolchain.IncrementalToolchain;
 import com.android.jack.test.toolchain.JackApiToolchainBase;
 import com.android.jack.test.toolchain.JackApiV02;
 import com.android.jack.test.toolchain.JillBasedToolchain;
@@ -209,6 +211,7 @@
   }
 
   @Test
+  @KnownIssue(candidate=IncrementalToolchain.class)
   public void testCarnacBinaryOr() throws Exception {
     File srcDir = AbstractTestTools.getTestRootDir("com.android.jack.dx.jacklibs");
     File carnacLib = new File(srcDir, "carnac-binary-or.jack");
diff --git a/jack-tests/tests/com/android/jack/encoding/CompileEncodingTests.java b/jack-tests/tests/com/android/jack/encoding/CompileEncodingTests.java
index 936f0bb..781cba5 100644
--- a/jack-tests/tests/com/android/jack/encoding/CompileEncodingTests.java
+++ b/jack-tests/tests/com/android/jack/encoding/CompileEncodingTests.java
@@ -210,7 +210,7 @@
   private void run(@Nonnull String clazz, @Nonnull File binDirectory,
       int expected)
           throws SecurityException, IllegalArgumentException, RuntimeRunnerException {
-    for (RuntimeRunner runner : AbstractTestTools.listRuntimeTestRunners(null)) {
+    for (RuntimeRunner runner : AbstractTestTools.listRuntimeTestRunners()) {
       if (runner.runJUnit(
               new String[0],
               AbstractTestTools.JUNIT_RUNNER_NAME,
diff --git a/jack-tests/tests/com/android/jack/error/AnnotationProcessorErrorTest.java b/jack-tests/tests/com/android/jack/error/AnnotationProcessorErrorTest.java
index eb0c93f..eafe041 100644
--- a/jack-tests/tests/com/android/jack/error/AnnotationProcessorErrorTest.java
+++ b/jack-tests/tests/com/android/jack/error/AnnotationProcessorErrorTest.java
@@ -30,7 +30,9 @@
 import com.android.jack.resource.ResourceReadingException;
 import com.android.jack.test.TestsProperties;
 import com.android.jack.test.helper.ErrorTestHelper;
+import com.android.jack.test.junit.KnownIssue;
 import com.android.jack.test.toolchain.AbstractTestTools;
+import com.android.jack.test.toolchain.IncrementalToolchain;
 import com.android.jack.test.toolchain.JackApiToolchainBase;
 
 import junit.framework.Assert;
@@ -58,6 +60,7 @@
    * Checks that compilation succeed when running annotation processor to generate resource file.
    */
   @Test
+  @KnownIssue(candidate=IncrementalToolchain.class)
   public void testAnnotationProcessorError002() throws Exception {
     runAnnotProcBuildingResource(new ErrorTestHelper());
   }
@@ -67,6 +70,7 @@
    * exist.
    */
   @Test
+  @KnownIssue(candidate=IncrementalToolchain.class)
   public void testAnnotationProcessorError003() throws Exception {
     ErrorTestHelper te = new ErrorTestHelper();
 
diff --git a/jack-tests/tests/com/android/jack/error/FileAccessErrorTest.java b/jack-tests/tests/com/android/jack/error/FileAccessErrorTest.java
index 0b0aae8..16d45f1 100644
--- a/jack-tests/tests/com/android/jack/error/FileAccessErrorTest.java
+++ b/jack-tests/tests/com/android/jack/error/FileAccessErrorTest.java
@@ -24,7 +24,9 @@
 import com.android.jack.library.LibraryIOException;
 import com.android.jack.library.LibraryReadingException;
 import com.android.jack.test.helper.ErrorTestHelper;
+import com.android.jack.test.junit.KnownIssue;
 import com.android.jack.test.toolchain.AbstractTestTools;
+import com.android.jack.test.toolchain.IncrementalToolchain;
 import com.android.jack.test.toolchain.JackApiToolchainBase;
 import com.android.sched.util.config.PropertyIdException;
 import com.android.sched.util.file.WrongPermissionException;
@@ -79,6 +81,7 @@
   /**
    * Checks that compilation fails correctly when a jack library folder is not readable.
    */
+  @KnownIssue(candidate=IncrementalToolchain.class)
   @Test
   public void testFileAccessError002() throws Exception {
     ErrorTestHelper helper = new ErrorTestHelper();
diff --git a/jack-tests/tests/com/android/jack/fileconflict/FileConflictTests.java b/jack-tests/tests/com/android/jack/fileconflict/FileConflictTests.java
index 8d7ba4f..45fe0e8 100644
--- a/jack-tests/tests/com/android/jack/fileconflict/FileConflictTests.java
+++ b/jack-tests/tests/com/android/jack/fileconflict/FileConflictTests.java
@@ -205,7 +205,6 @@
    * @throws Exception
    */
   @Test
-  @KnownIssue(candidate=IncrementalToolchain.class)
   public void test002a() throws Exception {
     File jackOutput;
     ByteArrayOutputStream errOut = new ByteArrayOutputStream();
@@ -228,7 +227,6 @@
    * @throws Exception
    */
   @Test
-  @KnownIssue(candidate=IncrementalToolchain.class)
   public void test002b() throws Exception {
     File jackOutput;
     ByteArrayOutputStream errOut = new ByteArrayOutputStream();
@@ -252,7 +250,6 @@
    * @throws Exception
    */
   @Test
-  @KnownIssue(candidate=IncrementalToolchain.class)
   public void test002c() throws Exception {
     File jackOutput;
     ByteArrayOutputStream errOut = new ByteArrayOutputStream();
@@ -278,7 +275,6 @@
    * @throws Exception
    */
   @Test
-  @KnownIssue(candidate=IncrementalToolchain.class)
   public void test002d() throws Exception {
     File jackOutput;
     ByteArrayOutputStream errOut = new ByteArrayOutputStream();
@@ -301,7 +297,6 @@
    * @throws Exception
    */
   @Test
-  @KnownIssue(candidate=IncrementalToolchain.class)
   public void test002e() throws Exception {
     File jackOutput;
     ByteArrayOutputStream errOut = new ByteArrayOutputStream();
diff --git a/jack-tests/tests/com/android/jack/frontend/FrontEndTests.java b/jack-tests/tests/com/android/jack/frontend/FrontEndTests.java
index 0b72964..0a41640 100644
--- a/jack-tests/tests/com/android/jack/frontend/FrontEndTests.java
+++ b/jack-tests/tests/com/android/jack/frontend/FrontEndTests.java
@@ -160,6 +160,7 @@
 
     List<Class<? extends IToolchain>> excludeList = new ArrayList<Class<? extends IToolchain>>(1);
     excludeList.add(JillBasedToolchain.class);
+    // because test check exact number of output "WARNING" messages
     excludeList.add(IncrementalToolchain.class);
     IToolchain toolchain =  AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, excludeList);
     ByteArrayOutputStream out = new ByteArrayOutputStream();
diff --git a/jack-tests/tests/com/android/jack/imports/ImportTests.java b/jack-tests/tests/com/android/jack/imports/ImportTests.java
index 88134fc..f8fcd28 100644
--- a/jack-tests/tests/com/android/jack/imports/ImportTests.java
+++ b/jack-tests/tests/com/android/jack/imports/ImportTests.java
@@ -27,6 +27,7 @@
 import com.android.jack.test.toolchain.JackBasedToolchain;
 import com.android.jack.test.toolchain.JillApiToolchainBase;
 import com.android.jack.test.toolchain.JillBasedToolchain;
+import com.android.jack.test.toolchain.LegacyToolchain;
 
 import junit.framework.Assert;
 
@@ -48,6 +49,7 @@
     File jackOut = AbstractTestTools.createTempDir();
     List<Class<? extends IToolchain>> exclude = new ArrayList<Class<? extends IToolchain>>();
     exclude.add(JillApiToolchainBase.class);
+    exclude.add(LegacyToolchain.class);
     IToolchain toolchain = AbstractTestTools.getCandidateToolchain(IToolchain.class, exclude);
     toolchain.addToClasspath(toolchain.getDefaultBootClasspath())
     .srcToLib(
diff --git a/jack-tests/tests/com/android/jack/jarjar/JarjarTests.java b/jack-tests/tests/com/android/jack/jarjar/JarjarTests.java
index d63c60a..80c321c 100644
--- a/jack-tests/tests/com/android/jack/jarjar/JarjarTests.java
+++ b/jack-tests/tests/com/android/jack/jarjar/JarjarTests.java
@@ -26,9 +26,11 @@
 import com.android.jack.test.runner.RuntimeRunner;
 import com.android.jack.test.runtime.RuntimeTestInfo;
 import com.android.jack.test.toolchain.AbstractTestTools;
+import com.android.jack.test.toolchain.AndroidToolchain;
 import com.android.jack.test.toolchain.IToolchain;
 import com.android.jack.test.toolchain.JackBasedToolchain;
 import com.android.jack.test.toolchain.JillBasedToolchain;
+import com.android.jack.test.toolchain.LegacyToolchain;
 import com.android.sched.util.RunnableHooks;
 import com.android.sched.util.config.ThreadConfig;
 import com.android.sched.util.file.InputZipFile;
@@ -87,7 +89,9 @@
 
   @Test
   public void jarjar003_1() throws Exception {
-    IToolchain toolchain = AbstractTestTools.getCandidateToolchain();
+    List<Class<? extends IToolchain>> exclude = new ArrayList<Class<? extends IToolchain>>();
+    exclude.add(LegacyToolchain.class);
+    IToolchain toolchain = AbstractTestTools.getCandidateToolchain(AndroidToolchain.class, exclude);
     toolchain.setJarjarRules(
         Collections.singletonList(new File(JARJAR003.directory, "jarjar-rules.txt")));
     File lib = AbstractTestTools.createTempFile("jarjarTest003Jack", toolchain.getLibraryExtension());
@@ -108,8 +112,9 @@
   @Test
   @Runtime
   public void jarjar004() throws Exception {
-
-    IToolchain toolchain = AbstractTestTools.getCandidateToolchain();
+    List<Class<? extends IToolchain>> exclude = new ArrayList<Class<? extends IToolchain>>();
+    exclude.add(LegacyToolchain.class);
+    IToolchain toolchain = AbstractTestTools.getCandidateToolchain(AndroidToolchain.class, exclude);
     File libToBeRenamed =
         AbstractTestTools.createTempFile("jarjarTest004Lib", toolchain.getLibraryExtension());
     toolchain.addToClasspath(toolchain.getDefaultBootClasspath())
@@ -175,7 +180,7 @@
         /* zipFiles = */ true,
         new File(JARJAR004.directory, "lib"));
 
-    List<RuntimeRunner> runnerList = AbstractTestTools.listRuntimeTestRunners(null);
+    List<RuntimeRunner> runnerList = AbstractTestTools.listRuntimeTestRunners();
     String[] names = {"com.android.jack.jarjar.test004.dontcompile.TestWithRelocatedReference"};
     for (RuntimeRunner runner : runnerList) {
       Assert.assertEquals(
@@ -196,6 +201,7 @@
   public void jarjar005() throws Exception {
     List<Class<? extends IToolchain>> exclude = new ArrayList<Class<? extends IToolchain>>();
     exclude.add(JillBasedToolchain.class);
+    exclude.add(LegacyToolchain.class);
     IToolchain toolchain = AbstractTestTools.getCandidateToolchain(IToolchain.class, exclude);
     File outLib =
         AbstractTestTools.createTempFile("jarjarTest005Lib", toolchain.getLibraryExtension());
diff --git a/jack-tests/tests/com/android/jack/java7/EcjMethodHandleTest.java b/jack-tests/tests/com/android/jack/java7/EcjMethodHandleTest.java
index 6407303..029ab2e 100644
--- a/jack-tests/tests/com/android/jack/java7/EcjMethodHandleTest.java
+++ b/jack-tests/tests/com/android/jack/java7/EcjMethodHandleTest.java
@@ -106,7 +106,7 @@
 
       File dexFile = new File(dexOutDir, "classes.dex");
 
-      List<RuntimeRunner> runnerList = AbstractTestTools.listRuntimeTestRunners(null);
+      List<RuntimeRunner> runnerList = AbstractTestTools.listRuntimeTestRunners();
       for (RuntimeRunner runner : runnerList) {
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         ((AbstractRuntimeRunner) runner).setOutputStream(out);
diff --git a/jack-tests/tests/com/android/jack/java7/EcjPolymorphicSignatureTest.java b/jack-tests/tests/com/android/jack/java7/EcjPolymorphicSignatureTest.java
index 58348fc..aee81d0 100644
--- a/jack-tests/tests/com/android/jack/java7/EcjPolymorphicSignatureTest.java
+++ b/jack-tests/tests/com/android/jack/java7/EcjPolymorphicSignatureTest.java
@@ -99,7 +99,7 @@
 
       File dexFile = new File(dexOutDir, "classes.dex");
 
-      List<RuntimeRunner> runnerList = AbstractTestTools.listRuntimeTestRunners(null);
+      List<RuntimeRunner> runnerList = AbstractTestTools.listRuntimeTestRunners();
       for (RuntimeRunner runner : runnerList) {
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         ((AbstractRuntimeRunner) runner).setOutputStream(out);
diff --git a/jack-tests/tests/com/android/jack/java7/InvokePolymorphicTests.java b/jack-tests/tests/com/android/jack/java7/InvokePolymorphicTests.java
index 349cddf..a4b3f9b 100644
--- a/jack-tests/tests/com/android/jack/java7/InvokePolymorphicTests.java
+++ b/jack-tests/tests/com/android/jack/java7/InvokePolymorphicTests.java
@@ -30,6 +30,7 @@
 import com.android.jack.test.helper.RuntimeTestHelper;
 import com.android.jack.test.junit.KnownIssue;
 import com.android.jack.test.junit.Runtime;
+import com.android.jack.test.junit.RuntimeVersion;
 import com.android.jack.test.runtime.RuntimeTestInfo;
 import com.android.jack.test.toolchain.AbstractTestTools;
 import com.android.jack.test.toolchain.JackApiToolchainBase;
@@ -107,42 +108,42 @@
           });
 
   @Test
-  @Runtime
+  @Runtime(from=RuntimeVersion.O)
   @KnownIssue
   public void testInvokePolymorphic001() throws Exception {
     run(INVOKE_POLYMORPHIC_001);
   }
 
   @Test
-  @Runtime
+  @Runtime(from=RuntimeVersion.O)
   @KnownIssue
   public void testInvokePolymorphic002() throws Exception {
     run(INVOKE_POLYMORPHIC_002);
   }
 
   @Test
-  @Runtime
+  @Runtime(from=RuntimeVersion.O)
   @KnownIssue
   public void testInvokePolymorphic003() throws Exception {
     run(INVOKE_POLYMORPHIC_003);
   }
 
   @Test
-  @Runtime
+  @Runtime(from=RuntimeVersion.O)
   @KnownIssue
   public void testInvokePolymorphic004() throws Exception {
     run(INVOKE_POLYMORPHIC_004);
   }
 
   @Test
-  @Runtime
+  @Runtime(from=RuntimeVersion.O)
   @KnownIssue
   public void testInvokePolymorphic005() throws Exception {
     run(INVOKE_POLYMORPHIC_005);
   }
 
   @Test
-  @Runtime
+  @Runtime(from=RuntimeVersion.O)
   @KnownIssue
   public void testInvokePolymorphic006() throws Exception {
     run(INVOKE_POLYMORPHIC_006);
@@ -198,7 +199,7 @@
   }
 
   @Test
-  @Runtime
+  @Runtime(from=RuntimeVersion.O)
   @KnownIssue
   public void testInvokePolymorphic007() throws Exception {
     run(INVOKE_POLYMORPHIC_007);
diff --git a/jack-tests/tests/com/android/jack/java7/invokepolymorphic/test001/test.properties b/jack-tests/tests/com/android/jack/java7/invokepolymorphic/test001/test.properties
deleted file mode 100644
index f2a3478..0000000
--- a/jack-tests/tests/com/android/jack/java7/invokepolymorphic/test001/test.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-rt.args.ArtRunnerHost=-Xexperimental:method-handles
-rt.args.ArtRunnerDevice=-Xexperimental:method-handles
diff --git a/jack-tests/tests/com/android/jack/java7/invokepolymorphic/test002/test.properties b/jack-tests/tests/com/android/jack/java7/invokepolymorphic/test002/test.properties
deleted file mode 100644
index f2a3478..0000000
--- a/jack-tests/tests/com/android/jack/java7/invokepolymorphic/test002/test.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-rt.args.ArtRunnerHost=-Xexperimental:method-handles
-rt.args.ArtRunnerDevice=-Xexperimental:method-handles
diff --git a/jack-tests/tests/com/android/jack/java7/invokepolymorphic/test003/test.properties b/jack-tests/tests/com/android/jack/java7/invokepolymorphic/test003/test.properties
deleted file mode 100644
index f2a3478..0000000
--- a/jack-tests/tests/com/android/jack/java7/invokepolymorphic/test003/test.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-rt.args.ArtRunnerHost=-Xexperimental:method-handles
-rt.args.ArtRunnerDevice=-Xexperimental:method-handles
diff --git a/jack-tests/tests/com/android/jack/java7/invokepolymorphic/test004/test.properties b/jack-tests/tests/com/android/jack/java7/invokepolymorphic/test004/test.properties
deleted file mode 100644
index f2a3478..0000000
--- a/jack-tests/tests/com/android/jack/java7/invokepolymorphic/test004/test.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-rt.args.ArtRunnerHost=-Xexperimental:method-handles
-rt.args.ArtRunnerDevice=-Xexperimental:method-handles
diff --git a/jack-tests/tests/com/android/jack/java7/invokepolymorphic/test005/test.properties b/jack-tests/tests/com/android/jack/java7/invokepolymorphic/test005/test.properties
deleted file mode 100644
index f2a3478..0000000
--- a/jack-tests/tests/com/android/jack/java7/invokepolymorphic/test005/test.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-rt.args.ArtRunnerHost=-Xexperimental:method-handles
-rt.args.ArtRunnerDevice=-Xexperimental:method-handles
diff --git a/jack-tests/tests/com/android/jack/java7/invokepolymorphic/test006/test.properties b/jack-tests/tests/com/android/jack/java7/invokepolymorphic/test006/test.properties
deleted file mode 100644
index f2a3478..0000000
--- a/jack-tests/tests/com/android/jack/java7/invokepolymorphic/test006/test.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-rt.args.ArtRunnerHost=-Xexperimental:method-handles
-rt.args.ArtRunnerDevice=-Xexperimental:method-handles
diff --git a/jack-tests/tests/com/android/jack/java8/AnnotationTest.java b/jack-tests/tests/com/android/jack/java8/AnnotationTest.java
index ee84d6d..f479aae 100644
--- a/jack-tests/tests/com/android/jack/java8/AnnotationTest.java
+++ b/jack-tests/tests/com/android/jack/java8/AnnotationTest.java
@@ -175,7 +175,7 @@
 
   @Nonnull
   private void run(@Nonnull String mainClass, @Nonnull File[] dexFiles) throws Exception {
-    List<RuntimeRunner> runnerList = AbstractTestTools.listRuntimeTestRunners(null);
+    List<RuntimeRunner> runnerList = AbstractTestTools.listRuntimeTestRunners();
     for (RuntimeRunner runner : runnerList) {
       Assert.assertEquals(0, runner.runJUnit(new String[0], AbstractTestTools.JUNIT_RUNNER_NAME,
           new String[] {mainClass}, dexFiles));
diff --git a/jack-tests/tests/com/android/jack/java8/BridgeTestPostM.java b/jack-tests/tests/com/android/jack/java8/BridgeTestPostM.java
index 085c7ed..2676061 100644
--- a/jack-tests/tests/com/android/jack/java8/BridgeTestPostM.java
+++ b/jack-tests/tests/com/android/jack/java8/BridgeTestPostM.java
@@ -56,8 +56,7 @@
   public void testBridge002() throws Exception {
     new RuntimeTestHelper(BRIDGE002)
         .setSourceLevel(SourceLevel.JAVA_8)
-        .addProperty(Options.ANDROID_MIN_API_LEVEL.getName(),
-            String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
+        .setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
         .addIgnoredCandidateToolchain(JackApiV01.class).compileAndRunTest();
   }
 
@@ -93,12 +92,11 @@
                      toolchain instanceof JackApiV03Toolchain);
     File lib23 =
         AbstractTestTools.createTempFile("lib23", toolchain.getLibraryExtension());
-    toolchain.addProperty(
-        Options.ANDROID_MIN_API_LEVEL.getName(),
-        String.valueOf(23))
-    .addProperty(Options.GENERATE_DEX_IN_LIBRARY.getName(), Boolean.toString(enablePredexing))
-    .setSourceLevel(SourceLevel.JAVA_8)
-    .addToClasspath(toolchain.getDefaultBootClasspath());
+    toolchain.setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.M.getLevel()));
+    toolchain
+        .addProperty(Options.GENERATE_DEX_IN_LIBRARY.getName(), Boolean.toString(enablePredexing))
+        .setSourceLevel(SourceLevel.JAVA_8)
+        .addToClasspath(toolchain.getDefaultBootClasspath());
 
     if (!pre04 && enablePredexing) {
       ByteArrayOutputStream errOut = new ByteArrayOutputStream();
@@ -117,9 +115,7 @@
 
       File dex24 = AbstractTestTools.createTempDir();
       toolchain = AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, excludeClazz);
-      toolchain.addProperty(
-          Options.ANDROID_MIN_API_LEVEL.getName(),
-          String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
+      toolchain.setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
       .libToExe(lib23, dex24, /* zipFiles = */ false);
 
       // Run to check everything went as expected
@@ -143,9 +139,7 @@
         AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, excludeClazz);
     File lib23 =
         AbstractTestTools.createTempFile("lib23", toolchain.getLibraryExtension());
-    toolchain.addProperty(
-        Options.ANDROID_MIN_API_LEVEL.getName(),
-        String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
+    toolchain.setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
     .setSourceLevel(SourceLevel.JAVA_8)
     .addToClasspath(toolchain.getDefaultBootClasspath())
     .srcToLib(lib23,
@@ -153,9 +147,7 @@
 
     File dex24 = AbstractTestTools.createTempDir();
     toolchain = AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, excludeClazz);
-    toolchain.addProperty(
-        Options.ANDROID_MIN_API_LEVEL.getName(),
-        String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
+    toolchain.setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
     .libToExe(lib23, dex24, /* zipFiles = */ false);
 
     // Run to check everything went as expected
@@ -196,10 +188,9 @@
                      toolchain instanceof JackApiV03Toolchain);
     File lib23 =
         AbstractTestTools.createTempFile("lib23", toolchain.getLibraryExtension());
-    toolchain.addProperty(
-        Options.ANDROID_MIN_API_LEVEL.getName(),
-        String.valueOf(23))
-    .addProperty(Options.GENERATE_DEX_IN_LIBRARY.getName(), Boolean.toString(enablePredexing))
+    toolchain.setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.M.getLevel()));
+    toolchain
+        .addProperty(Options.GENERATE_DEX_IN_LIBRARY.getName(), Boolean.toString(enablePredexing))
     .setSourceLevel(SourceLevel.JAVA_8)
     .addToClasspath(toolchain.getDefaultBootClasspath());
 
@@ -221,9 +212,7 @@
       ByteArrayOutputStream errOut = new ByteArrayOutputStream();
       File dex23 = AbstractTestTools.createTempDir();
       toolchain = AbstractTestTools.getCandidateToolchain(JackApiToolchainBase.class, excludeClazz);
-      toolchain.addProperty(
-          Options.ANDROID_MIN_API_LEVEL.getName(),
-          String.valueOf(23))
+      toolchain.setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.M.getLevel()))
       .setErrorStream(errOut);
       try {
         toolchain.libToExe(lib23, dex23, /* zipFiles = */ false);
@@ -248,9 +237,7 @@
         AbstractTestTools.getCandidateToolchain(JackApiToolchainBase.class, excludeClazz);
     File lib24 =
         AbstractTestTools.createTempFile("lib24", toolchain.getLibraryExtension());
-    toolchain.addProperty(
-        Options.ANDROID_MIN_API_LEVEL.getName(),
-        String.valueOf(24))
+    toolchain.setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
     .setSourceLevel(SourceLevel.JAVA_8)
     .addToClasspath(toolchain.getDefaultBootClasspath())
     .srcToLib(lib24,
@@ -259,9 +246,7 @@
     ByteArrayOutputStream errOut = new ByteArrayOutputStream();
     File dex23 = AbstractTestTools.createTempDir();
     toolchain = AbstractTestTools.getCandidateToolchain(JackApiToolchainBase.class, excludeClazz);
-    toolchain.addProperty(
-        Options.ANDROID_MIN_API_LEVEL.getName(),
-        String.valueOf(23))
+    toolchain.setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.M.getLevel()))
     .setErrorStream(errOut);
     try {
       toolchain.libToExe(lib24, dex23, /* zipFiles = */ false);
diff --git a/jack-tests/tests/com/android/jack/java8/DefaultMethodTest.java b/jack-tests/tests/com/android/jack/java8/DefaultMethodTest.java
index a9866a5..0d87df1 100644
--- a/jack-tests/tests/com/android/jack/java8/DefaultMethodTest.java
+++ b/jack-tests/tests/com/android/jack/java8/DefaultMethodTest.java
@@ -202,9 +202,7 @@
 
     File lib24 =
         AbstractTestTools.createTempFile("lib24", toolchain.getLibraryExtension());
-    toolchain.addProperty(
-        Options.ANDROID_MIN_API_LEVEL.getName(),
-        String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
+    toolchain.setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
     .setSourceLevel(SourceLevel.JAVA_8)
     .addToClasspath(toolchain.getDefaultBootClasspath())
     .srcToLib(lib24,
@@ -213,9 +211,7 @@
     ByteArrayOutputStream errOut = new ByteArrayOutputStream();
     File dex23 = AbstractTestTools.createTempDir();
     toolchain = AbstractTestTools.getCandidateToolchain(JackApiToolchainBase.class, excludeClazz);
-    toolchain.addProperty(
-        Options.ANDROID_MIN_API_LEVEL.getName(),
-        String.valueOf(23))
+    toolchain.setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.M.getLevel()))
     .setErrorStream(errOut);
     try {
       toolchain.libToExe(lib24, dex23, /* zipFiles = */ false);
@@ -258,12 +254,11 @@
                      toolchain instanceof JackApiV03);
     File lib23 =
         AbstractTestTools.createTempFile("lib23", toolchain.getLibraryExtension());
-    toolchain.addProperty(
-        Options.ANDROID_MIN_API_LEVEL.getName(),
-        String.valueOf(23))
-    .addProperty(Options.GENERATE_DEX_IN_LIBRARY.getName(), Boolean.toString(enablePredexing))
-    .setSourceLevel(SourceLevel.JAVA_8)
-    .addToClasspath(toolchain.getDefaultBootClasspath());
+    toolchain.setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.M.getLevel()));
+    toolchain
+        .addProperty(Options.GENERATE_DEX_IN_LIBRARY.getName(), Boolean.toString(enablePredexing))
+        .setSourceLevel(SourceLevel.JAVA_8)
+        .addToClasspath(toolchain.getDefaultBootClasspath());
 
     if (enablePredexing) {
       // When enabling predexing, we should have run the checker and fail due to the presence
@@ -293,9 +288,7 @@
       ByteArrayOutputStream errOut = new ByteArrayOutputStream();
       File dex23 = AbstractTestTools.createTempDir();
       toolchain = AbstractTestTools.getCandidateToolchain(JackApiToolchainBase.class, excludeClazz);
-      toolchain.addProperty(
-          Options.ANDROID_MIN_API_LEVEL.getName(),
-          String.valueOf(23))
+      toolchain.setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.M.getLevel()))
       .setErrorStream(errOut);
       try {
         toolchain.libToExe(lib23, dex23, /* zipFiles = */ false);
@@ -334,12 +327,11 @@
         AbstractTestTools.getCandidateToolchain(JackApiToolchainBase.class, excludeClazz);
     File lib23 =
         AbstractTestTools.createTempFile("lib23", toolchain.getLibraryExtension());
-    toolchain.addProperty(
-        Options.ANDROID_MIN_API_LEVEL.getName(),
-        String.valueOf(23))
-    .addProperty(Options.GENERATE_DEX_IN_LIBRARY.getName(), Boolean.toString(enablePredexing))
-    .setSourceLevel(SourceLevel.JAVA_8)
-    .addToClasspath(toolchain.getDefaultBootClasspath());
+    toolchain.setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.M.getLevel()));
+    toolchain
+        .addProperty(Options.GENERATE_DEX_IN_LIBRARY.getName(), Boolean.toString(enablePredexing))
+        .setSourceLevel(SourceLevel.JAVA_8)
+        .addToClasspath(toolchain.getDefaultBootClasspath());
 
     if (enablePredexing) {
       boolean pre04 = (toolchain instanceof JackApiV01 ||
@@ -368,9 +360,7 @@
 
       File dex24 = AbstractTestTools.createTempDir();
       toolchain = AbstractTestTools.getCandidateToolchain(JackApiToolchainBase.class, excludeClazz);
-      toolchain.addProperty(
-          Options.ANDROID_MIN_API_LEVEL.getName(),
-          String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
+      toolchain.setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
       .libToExe(lib23, dex24, /* zipFiles = */ false);
 
       // Run to check everything went as expected
@@ -395,9 +385,7 @@
         AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, excludeClazz);
     File lib24 =
         AbstractTestTools.createTempFile("lib24", toolchain.getLibraryExtension());
-    toolchain.addProperty(
-        Options.ANDROID_MIN_API_LEVEL.getName(),
-        String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
+    toolchain.setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
     .setSourceLevel(SourceLevel.JAVA_8)
     .addToClasspath(toolchain.getDefaultBootClasspath())
     .srcToLib(lib24,
@@ -405,9 +393,7 @@
 
     File dex24 = AbstractTestTools.createTempDir();
     toolchain = AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, excludeClazz);
-    toolchain.addProperty(
-        Options.ANDROID_MIN_API_LEVEL.getName(),
-        String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
+    toolchain.setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
     .libToExe(lib24, dex24, /* zipFiles = */ false);
 
     // Run to check everything went as expected
@@ -527,11 +513,9 @@
 
   private void run(@Nonnull RuntimeTestInfo rti) throws Exception {
     new RuntimeTestHelper(rti)
-        .addProperty(
-            Options.ANDROID_MIN_API_LEVEL.getName(),
-            String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
         .setSourceLevel(SourceLevel.JAVA_8)
         .addIgnoredCandidateToolchain(JackApiV01.class)
+        .setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
         .compileAndRunTest();
   }
 }
diff --git a/jack-tests/tests/com/android/jack/java8/EcjInterfaceMethodsTest.java b/jack-tests/tests/com/android/jack/java8/EcjInterfaceMethodsTest.java
index d0727e0..e788f52 100644
--- a/jack-tests/tests/com/android/jack/java8/EcjInterfaceMethodsTest.java
+++ b/jack-tests/tests/com/android/jack/java8/EcjInterfaceMethodsTest.java
@@ -16,7 +16,6 @@
 
 package com.android.jack.java8;
 
-import com.android.jack.Options;
 import com.android.jack.test.eclipse.jdt.core.tests.compiler.regression.InterfaceMethodsTest;
 import com.android.jack.test.runner.AbstractRuntimeRunner;
 import com.android.jack.test.runner.RuntimeRunner;
@@ -156,9 +155,8 @@
       // Build dex file
       jackToolchain.addToClasspath(jackToolchain.getDefaultBootClasspath());
       jackToolchain.setSourceLevel(SourceLevel.JAVA_8);
-      jackToolchain.addProperty(
-          Options.ANDROID_MIN_API_LEVEL.getName(),
-          String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()));
+      jackToolchain
+          .setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()));
       jackToolchain.srcToExe(dexOutDir, /* zipFile = */ false, sourceFolder);
     } catch (Exception e) {
       e.printStackTrace();
@@ -170,27 +168,27 @@
   @Override
   public void runConformTest(String[] srcDescription, String expectedResult) {
 
-      // Build dex file
-      List<Class<? extends IToolchain>> excludeList = new ArrayList<Class<? extends IToolchain>>(1);
-      excludeList.add(JackApiV01.class);
+    // Build dex file
+    List<Class<? extends IToolchain>> excludeList = new ArrayList<Class<? extends IToolchain>>(1);
+    excludeList.add(JackApiV01.class);
 
-      JackBasedToolchain jackToolchain = null;
-      try {
-        jackToolchain =
-            AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, excludeList);
-      } catch (AssumptionViolatedException e) {
-        // Handle JUnit4 feature in JUnit3 tests.
-        return;
-      }
+    JackBasedToolchain jackToolchain = null;
+    try {
+      jackToolchain =
+          AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, excludeList);
+    } catch (AssumptionViolatedException e) {
+      // Handle JUnit4 feature in JUnit3 tests.
+      return;
+    }
 
 
-      jackToolchain.addToClasspath(jackToolchain.getDefaultBootClasspath());
-      jackToolchain.setSourceLevel(SourceLevel.JAVA_8);
-      jackToolchain.addProperty(
-          Options.ANDROID_MIN_API_LEVEL.getName(),
-          String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()));
+    jackToolchain.addToClasspath(jackToolchain.getDefaultBootClasspath());
+    jackToolchain.setSourceLevel(SourceLevel.JAVA_8);
 
     try {
+      jackToolchain
+          .setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()));
+
       File dexOutDir = AbstractTestTools.createTempDir();
       File sourceFolder = buildSourceFolder(srcDescription);
 
@@ -199,7 +197,7 @@
       File dexFile = new File(dexOutDir, "classes.dex");
 
       List<RuntimeRunner> runnerList =
-          AbstractTestTools.listRuntimeTestRunners(/* properties = */ null);
+          AbstractTestTools.listRuntimeTestRunners();
       for (RuntimeRunner runner : runnerList) {
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         ((AbstractRuntimeRunner) runner).setOutputStream(out);
diff --git a/jack-tests/tests/com/android/jack/java8/EcjLambdaTest.java b/jack-tests/tests/com/android/jack/java8/EcjLambdaTest.java
index c9ee4b8..e262210 100644
--- a/jack-tests/tests/com/android/jack/java8/EcjLambdaTest.java
+++ b/jack-tests/tests/com/android/jack/java8/EcjLambdaTest.java
@@ -20,10 +20,11 @@
 import com.android.jack.test.runner.AbstractRuntimeRunner;
 import com.android.jack.test.runner.RuntimeRunner;
 import com.android.jack.test.toolchain.AbstractTestTools;
+import com.android.jack.test.toolchain.AndroidToolchain;
 import com.android.jack.test.toolchain.IToolchain;
 import com.android.jack.test.toolchain.JackApiV01;
-import com.android.jack.test.toolchain.JackBasedToolchain;
 import com.android.jack.test.toolchain.JillBasedToolchain;
+import com.android.jack.test.toolchain.LegacyToolchain;
 import com.android.jack.test.toolchain.Toolchain.SourceLevel;
 import com.android.sched.util.file.CannotChangePermissionException;
 import com.android.sched.util.file.CannotCreateFileException;
@@ -82,8 +83,11 @@
   }
 
   @Nonnull
-  private static final List<String> testBugECJ =
-      Arrays.asList("test055");
+  private static final List<String> testBugJavac = Arrays.asList("test430035d",
+      "test430035e", "test428261a", "test044", "test051", "testReferenceExpressionInference3a");
+
+  @Nonnull
+  private static final List<String> testBugECJ = Arrays.asList("test055");
 
   @Nonnull
   private static final List<String> testWithOtherErrorMsg =
@@ -134,6 +138,7 @@
     // These tests must be exclude from the Jill tool-chain because they do not compile with it
     if (getName().equals("testReferenceExpressionInference3a")) {
       excludeList.add(JillBasedToolchain.class);
+      excludeList.add(LegacyToolchain.class);
     }
     excludeList.add(JackApiV01.class);
 
@@ -142,7 +147,7 @@
       File dexOutDir = AbstractTestTools.createTempDir();
 
       // Build dex file
-      JackBasedToolchain jackToolchain = createToolchain(excludeList);
+      AndroidToolchain jackToolchain = createToolchain(excludeList);
       jackToolchain.srcToExe(dexOutDir, /* zipFile = */ false, sourceFolder);
     } catch (AssumptionViolatedException e) {
       // Handle JUnit4 feature in JUnit3 tests.
@@ -169,6 +174,10 @@
     if (getName().equals("test051")) {
       excludeList.add(JillBasedToolchain.class);
     }
+    if (testBugJavac.contains(getName())) {
+      // This tests does not compile with Javac exclude them
+      excludeList.add(LegacyToolchain.class);
+    }
     excludeList.add(JackApiV01.class);
 
     try {
@@ -176,12 +185,12 @@
       File sourceFolder = buildSourceFolder(srcDescription);
 
       // Build dex file
-      JackBasedToolchain jackToolchain = createToolchain(excludeList);
+      AndroidToolchain jackToolchain = createToolchain(excludeList);
       jackToolchain.srcToExe(dexOutDir, /* zipFile = */ false, sourceFolder);
 
       File dexFile = new File(dexOutDir, "classes.dex");
 
-      List<RuntimeRunner> runnerList = AbstractTestTools.listRuntimeTestRunners(null);
+      List<RuntimeRunner> runnerList = AbstractTestTools.listRuntimeTestRunners();
       for (RuntimeRunner runner : runnerList) {
         ByteArrayOutputStream out = new ByteArrayOutputStream();
         ((AbstractRuntimeRunner) runner).setOutputStream(out);
@@ -226,12 +235,12 @@
     return sourceFolder;
   }
 
-  protected JackBasedToolchain createToolchain(
-      @Nonnull List<Class<? extends IToolchain>> excludeList) throws AssumptionViolatedException {
+  protected AndroidToolchain createToolchain(
+      @Nonnull List<Class<? extends IToolchain>> excludeList) throws Exception {
 
-    JackBasedToolchain jackToolchain = null;
+    AndroidToolchain jackToolchain = null;
     jackToolchain =
-          AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, excludeList);
+          AbstractTestTools.getCandidateToolchain(AndroidToolchain.class, excludeList);
 
     File[] bootclasspath = jackToolchain.getDefaultBootClasspath();
     jackToolchain.addToClasspath(bootclasspath);
diff --git a/jack-tests/tests/com/android/jack/java8/EcjLambdaTestPostM.java b/jack-tests/tests/com/android/jack/java8/EcjLambdaTestPostM.java
index 519f072..efa50df 100644
--- a/jack-tests/tests/com/android/jack/java8/EcjLambdaTestPostM.java
+++ b/jack-tests/tests/com/android/jack/java8/EcjLambdaTestPostM.java
@@ -16,16 +16,14 @@
 
 package com.android.jack.java8;
 
-import com.android.jack.Options;
+import com.android.jack.test.toolchain.AndroidToolchain;
 import com.android.jack.test.toolchain.IToolchain;
-import com.android.jack.test.toolchain.JackBasedToolchain;
 import com.android.jack.util.AndroidApiLevel;
 
 import junit.framework.Assert;
 import junit.framework.JUnit4TestAdapter;
 import junit.framework.Test;
 
-import org.junit.internal.AssumptionViolatedException;
 import org.junit.runner.Description;
 import org.junit.runner.manipulation.Filter;
 import org.junit.runner.manipulation.NoTestsRemainException;
@@ -80,13 +78,11 @@
    }
 
   @Override
-  protected JackBasedToolchain createToolchain(
-      @Nonnull List<Class<? extends IToolchain>> excludeList) throws AssumptionViolatedException {
-    JackBasedToolchain jackToolchain = super.createToolchain(excludeList);
-    jackToolchain.addProperty(
-        Options.ANDROID_MIN_API_LEVEL.getName(),
-        String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()));
-    return jackToolchain;
+  protected AndroidToolchain createToolchain(
+      @Nonnull List<Class<? extends IToolchain>> excludeList) throws Exception {
+    AndroidToolchain toolchain = super.createToolchain(excludeList);
+    toolchain.setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()));
+    return toolchain;
   }
 
 }
diff --git a/jack-tests/tests/com/android/jack/java8/ExplicitReceiverTest.java b/jack-tests/tests/com/android/jack/java8/ExplicitReceiverTest.java
new file mode 100644
index 0000000..8f0f162
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/java8/ExplicitReceiverTest.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.java8;
+
+import com.android.jack.test.helper.RuntimeTestHelper;
+import com.android.jack.test.junit.Runtime;
+import com.android.jack.test.runtime.RuntimeTestInfo;
+import com.android.jack.test.toolchain.AbstractTestTools;
+import com.android.jack.test.toolchain.JackApiV01;
+import com.android.jack.test.toolchain.Toolchain.SourceLevel;
+
+import org.junit.Test;
+
+import javax.annotation.Nonnull;
+
+
+/**
+ * JUnit test for compilation of explicit receiver usage.
+ */
+public class ExplicitReceiverTest {
+
+  private final RuntimeTestInfo EXPLICIT_RECEIVER_001 = new RuntimeTestInfo(
+      AbstractTestTools.getTestRootDir("com.android.jack.java8.explicitreceiver.test001"),
+      "com.android.jack.java8.explicitreceiver.test001.Tests").setSrcDirName("");
+
+  private final RuntimeTestInfo EXPLICIT_RECEIVER_002 = new RuntimeTestInfo(
+      AbstractTestTools.getTestRootDir("com.android.jack.java8.explicitreceiver.test002"),
+      "com.android.jack.java8.explicitreceiver.test002.Tests").setSrcDirName("");
+
+  @Test
+  @Runtime
+  public void testExplicitReceiver001() throws Exception {
+    run(EXPLICIT_RECEIVER_001);
+  }
+
+  @Test
+  @Runtime
+  public void testExplicitReceiver002() throws Exception {
+    run(EXPLICIT_RECEIVER_002);
+  }
+
+
+  private void run(@Nonnull RuntimeTestInfo rti) throws Exception {
+    new RuntimeTestHelper(rti)
+      .setSourceLevel(SourceLevel.JAVA_8)
+      .addIgnoredCandidateToolchain(JackApiV01.class)
+      .compileAndRunTest();
+  }
+}
diff --git a/jack-tests/tests/com/android/jack/java8/GwtTest.java b/jack-tests/tests/com/android/jack/java8/GwtTest.java
index 1bc2b9c..4a0209c 100644
--- a/jack-tests/tests/com/android/jack/java8/GwtTest.java
+++ b/jack-tests/tests/com/android/jack/java8/GwtTest.java
@@ -26,6 +26,7 @@
 import com.android.jack.test.toolchain.AbstractTestTools;
 import com.android.jack.test.toolchain.JackApiV01;
 import com.android.jack.test.toolchain.JillBasedToolchain;
+import com.android.jack.test.toolchain.LegacyToolchain;
 import com.android.jack.test.toolchain.Toolchain.SourceLevel;
 
 
@@ -279,6 +280,7 @@
     .addIgnoredCandidateToolchain(JackApiV01.class)
     // This test must be exclude from the Jill tool-chain because it does not compile with it
     .addIgnoredCandidateToolchain(JillBasedToolchain.class)
+    .addIgnoredCandidateToolchain(LegacyToolchain.class)
     .compileAndRunTest();
   }
 
diff --git a/jack-tests/tests/com/android/jack/java8/GwtTestPostM.java b/jack-tests/tests/com/android/jack/java8/GwtTestPostM.java
index 6d5ca0e..339c05c 100644
--- a/jack-tests/tests/com/android/jack/java8/GwtTestPostM.java
+++ b/jack-tests/tests/com/android/jack/java8/GwtTestPostM.java
@@ -16,7 +16,6 @@
 
 package com.android.jack.java8;
 
-import com.android.jack.Options;
 import com.android.jack.test.helper.RuntimeTestHelper;
 import com.android.jack.test.junit.KnownIssue;
 import com.android.jack.test.junit.Runtime;
@@ -230,8 +229,7 @@
 
   private void run(@Nonnull RuntimeTestInfo rti) throws Exception {
     new RuntimeTestHelper(rti).setSourceLevel(SourceLevel.JAVA_8)
-        .addProperty(Options.ANDROID_MIN_API_LEVEL.getName(),
-            String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
+        .setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
         .compileAndRunTest();
   }
 
diff --git a/jack-tests/tests/com/android/jack/java8/IntersectionTypeTest.java b/jack-tests/tests/com/android/jack/java8/IntersectionTypeTest.java
index 48c087d..449c2a7 100644
--- a/jack-tests/tests/com/android/jack/java8/IntersectionTypeTest.java
+++ b/jack-tests/tests/com/android/jack/java8/IntersectionTypeTest.java
@@ -27,6 +27,8 @@
 import com.android.jack.test.toolchain.JackApiV01;
 import com.android.jack.test.toolchain.JackCliToolchain;
 import com.android.jack.test.toolchain.JillBasedToolchain;
+import com.android.jack.test.toolchain.LegacyJillToolchain;
+import com.android.jack.test.toolchain.LegacyToolchain;
 import com.android.jack.test.toolchain.Toolchain.SourceLevel;
 
 import junit.framework.Assert;
@@ -100,6 +102,7 @@
           .addProperty(Options.LAMBDA_TO_ANONYMOUS_CONVERTER.getName(), Boolean.TRUE.toString())
           .addIgnoredCandidateToolchain(JackCliToolchain.class)
           .addIgnoredCandidateToolchain(JackApiV01.class)
+          .addIgnoredCandidateToolchain(LegacyToolchain.class)
           .compileAndRunTest();
       Assert.fail();
     } catch (FrontendCompilationException e) {
@@ -115,6 +118,7 @@
           .addProperty(Options.LAMBDA_TO_ANONYMOUS_CONVERTER.getName(), Boolean.TRUE.toString())
           .addIgnoredCandidateToolchain(JackCliToolchain.class)
           .addIgnoredCandidateToolchain(JackApiV01.class)
+          .addIgnoredCandidateToolchain(LegacyToolchain.class)
           .compileAndRunTest();
       Assert.fail();
     } catch (FrontendCompilationException e) {
diff --git a/jack-tests/tests/com/android/jack/java8/Java8AllTest.java b/jack-tests/tests/com/android/jack/java8/Java8AllTest.java
index dcf4ca7..c4756b3 100644
--- a/jack-tests/tests/com/android/jack/java8/Java8AllTest.java
+++ b/jack-tests/tests/com/android/jack/java8/Java8AllTest.java
@@ -41,8 +41,12 @@
     AnnotationTest.class,
     BridgeTestPreN.class,
     EcjLambdaTest.class,
+    ExplicitReceiverTest.class,
     GwtTest.class,
     IntersectionTypeTest.class,
+    LambdaGroupByPackageShrinkTests.class,
+    LambdaGroupByTypeShrinkTests.class,
+    LambdaNoGroupingShrinkTests.class,
     LambdaTest.class,
     MethodRefTest.class,
     TypeInferenceTest.class,
diff --git a/jack-tests/tests/com/android/jack/java8/LambdaGroupByPackageShrinkTests.java b/jack-tests/tests/com/android/jack/java8/LambdaGroupByPackageShrinkTests.java
new file mode 100644
index 0000000..81ae6af
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/java8/LambdaGroupByPackageShrinkTests.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.java8;
+
+import com.android.jack.Options;
+import com.android.jack.test.toolchain.JackBasedToolchain;
+
+import javax.annotation.Nonnull;
+
+public class LambdaGroupByPackageShrinkTests extends LambdaNoGroupingShrinkTests {
+
+
+  @Override
+  @Nonnull
+  protected JackBasedToolchain getToolchain() {
+    return super.getToolchain().addProperty(Options.LAMBDA_GROUPING_SCOPE.getName(), "package");
+  }
+}
diff --git a/jack-tests/tests/com/android/jack/java8/LambdaGroupByTypeShrinkTests.java b/jack-tests/tests/com/android/jack/java8/LambdaGroupByTypeShrinkTests.java
new file mode 100644
index 0000000..747f049
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/java8/LambdaGroupByTypeShrinkTests.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.java8;
+
+import com.android.jack.Options;
+import com.android.jack.test.toolchain.JackBasedToolchain;
+
+import javax.annotation.Nonnull;
+
+public class LambdaGroupByTypeShrinkTests extends LambdaNoGroupingShrinkTests {
+
+
+  @Override
+  @Nonnull
+  protected JackBasedToolchain getToolchain() {
+    return super.getToolchain().addProperty(Options.LAMBDA_GROUPING_SCOPE.getName(), "type");
+  }
+}
diff --git a/jack-tests/tests/com/android/jack/java8/LambdaNoGroupingShrinkTests.java b/jack-tests/tests/com/android/jack/java8/LambdaNoGroupingShrinkTests.java
new file mode 100644
index 0000000..8ce06b5
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/java8/LambdaNoGroupingShrinkTests.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.java8;
+
+import com.android.jack.Options;
+import com.android.jack.test.helper.RuntimeTestHelper;
+import com.android.jack.test.junit.Runtime;
+import com.android.jack.test.runtime.RuntimeTestInfo;
+import com.android.jack.test.toolchain.AbstractTestTools;
+import com.android.jack.test.toolchain.IToolchain;
+import com.android.jack.test.toolchain.JackBasedToolchain;
+import com.android.jack.test.toolchain.JillBasedToolchain;
+import com.android.jack.test.toolchain.Toolchain.SourceLevel;
+
+import org.junit.Test;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+
+public class LambdaNoGroupingShrinkTests {
+
+  @Nonnull
+  private File PROGUARD_SHRINK_NOTHING = new File(
+      AbstractTestTools.getTestRootDir("com.android.jack.java8.lambda.test044"),
+      "shrink-nothing.flags");
+
+  @Nonnull
+  private RuntimeTestInfo TEST001 = new RuntimeTestInfo(
+      AbstractTestTools.getTestRootDir("com.android.jack.java8.lambda.test044"),
+      "com.android.jack.java8.lambda.test044.jack.Tests");
+
+  @Test
+  @Runtime
+  public void testLamba044_whole() throws Exception {
+
+    File lib = makeLibrary(new File[]{}, TEST001.directory);
+
+    test(TEST001.jUnit, lib);
+  }
+
+  @Test
+  @Runtime
+  public void testLamba044_ByLib() throws Exception {
+
+    File lib2 = makeLibrary(new File[]{}, new File(TEST001.directory, "lib2"));
+    File lib1 = makeLibrary(new File[]{lib2}, new File(TEST001.directory, "lib1"));
+    File libJack = makeLibrary(new File[]{lib2, lib1}, new File(TEST001.directory, "jack"));
+
+    test(TEST001.jUnit, lib2, lib1, libJack);
+
+  }
+
+  @Test
+  @Runtime
+  public void testLamba044_ByTestClass() throws Exception {
+
+    File libs = makeLibrary(new File[]{},
+            new File(TEST001.directory, "lib1"), new File(TEST001.directory, "lib2"));
+    File b2 = makeLibrary(new File[]{libs}, new File(TEST001.directory, "jack/B2.java"));
+    File b3 = makeLibrary(new File[]{libs}, new File(TEST001.directory, "jack/B3.java"));
+    File test = makeLibrary(new File[]{libs, b2, b3},
+        new File(TEST001.directory, "jack/Tests.java"));
+
+    test(TEST001.jUnit, libs, b2, b3, test);
+
+  }
+
+  @Test
+  @Runtime
+  public void testLamba044_ClassConflict() throws Exception {
+
+    File libs = makeLibrary(new File[]{},
+        new File(TEST001.directory, "lib1"), new File(TEST001.directory, "lib2"));
+    File lib2A3 = makeLibrary(new File[]{libs}, new File(TEST001.directory, "lib2/A3.java"));
+    File b2 = makeLibrary(new File[]{libs}, new File(TEST001.directory, "jack/B2.java"));
+    File b3 = makeLibrary(new File[]{libs}, new File(TEST001.directory, "jack/B3.java"));
+    File test = makeLibrary(new File[]{libs, lib2A3, b2, b3},
+        new File(TEST001.directory, "jack/Tests.java"));
+
+    test(TEST001.jUnit, libs, b2, b3, test);
+
+  }
+
+  @Test
+  @Runtime
+  public void testLamba044_PackageConflict() throws Exception {
+
+    File libs = makeLibrary(new File[]{},
+        new File(TEST001.directory, "lib1"), new File(TEST001.directory, "lib2"));
+    File lib2 = makeLibrary(new File[]{}, new File(TEST001.directory, "lib2/"));
+    File b2 = makeLibrary(new File[]{libs}, new File(TEST001.directory, "jack/B2.java"));
+    File b3 = makeLibrary(new File[]{libs}, new File(TEST001.directory, "jack/B3.java"));
+    File test = makeLibrary(new File[]{libs, lib2, b2, b3},
+        new File(TEST001.directory, "jack/Tests.java"));
+
+    test(TEST001.jUnit, libs, b2, b3, test);
+
+  }
+
+  @Nonnull
+  protected File makeLibrary(@Nonnull File[] classpath, @Nonnull File... src) throws Exception {
+    JackBasedToolchain toolchain = getToolchain();
+
+    File lib = AbstractTestTools.createTempFile("lib", ".jack");
+    toolchain
+        .addToClasspath(toolchain.getDefaultBootClasspath())
+        .addToClasspath(classpath)
+        .setSourceLevel(SourceLevel.JAVA_8)
+        .addProguardFlags(PROGUARD_SHRINK_NOTHING)
+        .srcToLib(lib, /* zipFiles = */ true, src);
+
+    return lib;
+  }
+
+  @Nonnull
+  protected void test(@Nonnull String test, @Nonnull File... libs) throws Exception {
+    JackBasedToolchain toolchain = getToolchain();
+
+    File dex = AbstractTestTools.createTempFile("dex", ".jar");
+    toolchain
+        .setSourceLevel(SourceLevel.JAVA_8)
+        .addProguardFlags(PROGUARD_SHRINK_NOTHING)
+        .libToExe(libs, dex, /* zipFiles = */ true);
+
+    RuntimeTestHelper.runOnRuntimeEnvironments(
+        Collections.singletonList(test),
+        RuntimeTestHelper.getJunitDex(), dex);
+
+  }
+
+  @Nonnull
+  protected JackBasedToolchain getToolchain() {
+    List<Class<? extends IToolchain>> excludedToolchains =
+        new ArrayList<Class<? extends IToolchain>>();
+    excludedToolchains.add(JillBasedToolchain.class);
+    JackBasedToolchain toolchain =
+        AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, excludedToolchains);
+    return toolchain.addProperty(Options.LAMBDA_GROUPING_SCOPE.getName(), "none");
+  }
+
+}
diff --git a/jack-tests/tests/com/android/jack/java8/LambdaTest.java b/jack-tests/tests/com/android/jack/java8/LambdaTest.java
index 1a38df4..f380328 100644
--- a/jack-tests/tests/com/android/jack/java8/LambdaTest.java
+++ b/jack-tests/tests/com/android/jack/java8/LambdaTest.java
@@ -34,6 +34,7 @@
 import com.android.jack.test.toolchain.JackApiV03;
 import com.android.jack.test.toolchain.JackBasedToolchain;
 import com.android.jack.test.toolchain.JillBasedToolchain;
+import com.android.jack.test.toolchain.LegacyToolchain;
 import com.android.jack.test.toolchain.Toolchain.SourceLevel;
 
 import junit.framework.Assert;
@@ -335,6 +336,7 @@
     .setSourceLevel(SourceLevel.JAVA_8)
     // This test must be exclude from the Jill tool-chain because it does not compile with it
     .addIgnoredCandidateToolchain(JillBasedToolchain.class)
+    .addIgnoredCandidateToolchain(LegacyToolchain.class)
     .addIgnoredCandidateToolchain(JackApiV01.class)
     .setWithDebugInfos(true)
     .compileAndRunTest();
@@ -866,7 +868,7 @@
   }
 
   private void run(@Nonnull String mainClass, @Nonnull File[] dexFiles) throws Exception {
-    List<RuntimeRunner> runnerList = AbstractTestTools.listRuntimeTestRunners(null);
+    List<RuntimeRunner> runnerList = AbstractTestTools.listRuntimeTestRunners();
     for (RuntimeRunner runner : runnerList) {
       Assert.assertEquals(0, runner.runJUnit(new String[0], AbstractTestTools.JUNIT_RUNNER_NAME,
           new String[] {mainClass}, dexFiles));
diff --git a/jack-tests/tests/com/android/jack/java8/LambdaTestPostM.java b/jack-tests/tests/com/android/jack/java8/LambdaTestPostM.java
index 5095ac6..a58b1da 100644
--- a/jack-tests/tests/com/android/jack/java8/LambdaTestPostM.java
+++ b/jack-tests/tests/com/android/jack/java8/LambdaTestPostM.java
@@ -16,7 +16,6 @@
 
 package com.android.jack.java8;
 
-import com.android.jack.Options;
 import com.android.jack.backend.dex.DexFileWriter;
 import com.android.jack.test.TestsProperties;
 import com.android.jack.test.junit.KnownIssue;
@@ -76,8 +75,7 @@
     toolchain =
         AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, excludedToolchains);
     File libDexFolder = AbstractTestTools.createTempDir();
-    toolchain.addProperty(Options.ANDROID_MIN_API_LEVEL.getName(),
-        String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()));
+    toolchain.setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()));
     toolchain.addToClasspath(defaultClasspath).setSourceLevel(SourceLevel.JAVA_8).libToExe(lib,
         libDexFolder, /* zipFiles = */ false);
 
@@ -97,7 +95,7 @@
   }
 
   private void run(@Nonnull String mainClass, @Nonnull File[] dexFiles) throws Exception {
-    List<RuntimeRunner> runnerList = AbstractTestTools.listRuntimeTestRunners(null);
+    List<RuntimeRunner> runnerList = AbstractTestTools.listRuntimeTestRunners();
     for (RuntimeRunner runner : runnerList) {
       Assert.assertEquals(0, runner.runJUnit(new String[0], AbstractTestTools.JUNIT_RUNNER_NAME,
           new String[] {mainClass}, dexFiles));
diff --git a/jack-tests/tests/com/android/jack/java8/MethodRefTest.java b/jack-tests/tests/com/android/jack/java8/MethodRefTest.java
index 81cbddf..14be799 100644
--- a/jack-tests/tests/com/android/jack/java8/MethodRefTest.java
+++ b/jack-tests/tests/com/android/jack/java8/MethodRefTest.java
@@ -22,6 +22,7 @@
 import com.android.jack.test.toolchain.AbstractTestTools;
 import com.android.jack.test.toolchain.JackApiV01;
 import com.android.jack.test.toolchain.JillBasedToolchain;
+import com.android.jack.test.toolchain.LegacyToolchain;
 import com.android.jack.test.toolchain.Toolchain.SourceLevel;
 
 import org.junit.Test;
@@ -180,6 +181,7 @@
         // This test must be exclude from the Jill tool-chain because it does not compile with it
         .addIgnoredCandidateToolchain(JillBasedToolchain.class)
         .addIgnoredCandidateToolchain(JackApiV01.class)
+        .addIgnoredCandidateToolchain(LegacyToolchain.class)
         .compileAndRunTest();
   }
 
diff --git a/jack-tests/tests/com/android/jack/java8/ParameterNameTest.java b/jack-tests/tests/com/android/jack/java8/ParameterNameTest.java
index be751f7..af45caa 100644
--- a/jack-tests/tests/com/android/jack/java8/ParameterNameTest.java
+++ b/jack-tests/tests/com/android/jack/java8/ParameterNameTest.java
@@ -26,13 +26,14 @@
 import com.android.jack.test.toolchain.AbstractTestTools;
 import com.android.jack.test.toolchain.JackApiV01;
 import com.android.jack.test.toolchain.JillBasedToolchain;
+import com.android.jack.test.toolchain.LegacyToolchain;
 import com.android.jack.test.toolchain.Toolchain.SourceLevel;
 
 import junit.framework.Assert;
 
+import org.jf.dexlib.ClassDataItem.EncodedMethod;
 import org.jf.dexlib.DexFile;
 import org.jf.dexlib.StringIdItem;
-import org.jf.dexlib.ClassDataItem.EncodedMethod;
 import org.junit.Test;
 
 import java.io.File;
@@ -45,45 +46,59 @@
  */
 public class ParameterNameTest {
 
+  private File extraJavaFile =
+      new File(AbstractTestTools.getTestRootDir("com.android.jack.java8.parameter.common"),
+          "ParameterTestModifier.java");
+
   private RuntimeTestInfo PARAMETER001 = new RuntimeTestInfo(
       AbstractTestTools.getTestRootDir("com.android.jack.java8.parameter.test001"),
-      "com.android.jack.java8.parameter.test001.Tests").setSrcDirName("");
+      "com.android.jack.java8.parameter.test001.Tests").setSrcDirName("")
+          .addCandidateExtraSources(extraJavaFile);
 
   private RuntimeTestInfo PARAMETER002 = new RuntimeTestInfo(
       AbstractTestTools.getTestRootDir("com.android.jack.java8.parameter.test002"),
-      "com.android.jack.java8.parameter.test002.Tests").setSrcDirName("");
+      "com.android.jack.java8.parameter.test002.Tests").setSrcDirName("")
+          .addCandidateExtraSources(extraJavaFile);
 
   private RuntimeTestInfo PARAMETER003 = new RuntimeTestInfo(
       AbstractTestTools.getTestRootDir("com.android.jack.java8.parameter.test003"),
-      "com.android.jack.java8.parameter.test003.Tests").setSrcDirName("");
+      "com.android.jack.java8.parameter.test003.Tests").setSrcDirName("")
+          .addCandidateExtraSources(extraJavaFile);
 
   private RuntimeTestInfo PARAMETER004 = new RuntimeTestInfo(
       AbstractTestTools.getTestRootDir("com.android.jack.java8.parameter.test004"),
-      "com.android.jack.java8.parameter.test004.Tests").setSrcDirName("");
+      "com.android.jack.java8.parameter.test004.Tests").setSrcDirName("")
+          .addCandidateExtraSources(extraJavaFile);
 
   private RuntimeTestInfo PARAMETER005 = new RuntimeTestInfo(
       AbstractTestTools.getTestRootDir("com.android.jack.java8.parameter.test005"),
-      "com.android.jack.java8.parameter.test005.Tests").setSrcDirName("");
+      "com.android.jack.java8.parameter.test005.Tests").setSrcDirName("")
+          .addCandidateExtraSources(extraJavaFile);
 
   private RuntimeTestInfo PARAMETER006 = new RuntimeTestInfo(
       AbstractTestTools.getTestRootDir("com.android.jack.java8.parameter.test006"),
-      "com.android.jack.java8.parameter.test006.Tests").setSrcDirName("");
+      "com.android.jack.java8.parameter.test006.Tests").setSrcDirName("")
+          .addCandidateExtraSources(extraJavaFile);
 
   private RuntimeTestInfo PARAMETER007 = new RuntimeTestInfo(
       AbstractTestTools.getTestRootDir("com.android.jack.java8.parameter.test007"),
-      "com.android.jack.java8.parameter.test007.Tests").setSrcDirName("");
+      "com.android.jack.java8.parameter.test007.Tests").setSrcDirName("")
+          .addCandidateExtraSources(extraJavaFile);
 
   private RuntimeTestInfo PARAMETER008 = new RuntimeTestInfo(
       AbstractTestTools.getTestRootDir("com.android.jack.java8.parameter.test008"),
-      "com.android.jack.java8.parameter.test008.Tests").setSrcDirName("");
+      "com.android.jack.java8.parameter.test008.Tests").setSrcDirName("")
+          .addCandidateExtraSources(extraJavaFile);
 
   private RuntimeTestInfo PARAMETER009 = new RuntimeTestInfo(
       AbstractTestTools.getTestRootDir("com.android.jack.java8.parameter.test009"),
-      "com.android.jack.java8.parameter.test009.Tests").setSrcDirName("");
+      "com.android.jack.java8.parameter.test009.Tests").setSrcDirName("")
+          .addCandidateExtraSources(extraJavaFile);
 
   private RuntimeTestInfo PARAMETER010 = new RuntimeTestInfo(
       AbstractTestTools.getTestRootDir("com.android.jack.java8.parameter.test010"),
-      "com.android.jack.java8.parameter.test010.Tests").setSrcDirName("");
+      "com.android.jack.java8.parameter.test010.Tests").setSrcDirName("")
+          .addCandidateExtraSources(extraJavaFile);
 
   @Test
   @Runtime(from=RuntimeVersion.O)
@@ -98,6 +113,7 @@
         .setSourceLevel(SourceLevel.JAVA_8)
         .addIgnoredCandidateToolchain(JackApiV01.class)
         .addIgnoredCandidateToolchain(JillBasedToolchain.class)
+        .addIgnoredCandidateToolchain(LegacyToolchain.class)
         .addProperty(ParameterMetadataAnnotationsAdder.PARAMETER_ANNOTATION.getName(), "true")
         .setWithDebugInfos(true).compileAndRunTest();
   }
@@ -115,6 +131,7 @@
         .setSourceLevel(SourceLevel.JAVA_8)
         .addIgnoredCandidateToolchain(JackApiV01.class)
         .addIgnoredCandidateToolchain(JillBasedToolchain.class)
+        .addIgnoredCandidateToolchain(LegacyToolchain.class)
         .addProperty(ParameterMetadataAnnotationsAdder.PARAMETER_ANNOTATION.getName(), "true")
         .setWithDebugInfos(true).compileAndRunTest();
   }
@@ -136,6 +153,7 @@
       }
     })).setSourceLevel(SourceLevel.JAVA_8)
        .addIgnoredCandidateToolchain(JackApiV01.class)
+       .addIgnoredCandidateToolchain(LegacyToolchain.class)
        .addProperty(ParameterMetadataAnnotationsAdder.PARAMETER_ANNOTATION.getName(), "true")
        .setWithDebugInfos(true)
        .compileAndRunTest();
@@ -158,6 +176,7 @@
       }
     })).setSourceLevel(SourceLevel.JAVA_8)
        .addIgnoredCandidateToolchain(JackApiV01.class)
+       .addIgnoredCandidateToolchain(LegacyToolchain.class)
        .addProperty(ParameterMetadataAnnotationsAdder.PARAMETER_ANNOTATION.getName(), "true")
        .setWithDebugInfos(false)
        .compileAndRunTest();
@@ -212,6 +231,7 @@
     new RuntimeTestHelper(rti)
         .setSourceLevel(SourceLevel.JAVA_8)
         .addIgnoredCandidateToolchain(JackApiV01.class)
+        .addIgnoredCandidateToolchain(LegacyToolchain.class)
         .addProperty(ParameterMetadataAnnotationsAdder.PARAMETER_ANNOTATION.getName(), "true")
         .setWithDebugInfos(true)
         .compileAndRunTest();
diff --git a/jack-tests/tests/com/android/jack/java8/RetroLambdaTests.java b/jack-tests/tests/com/android/jack/java8/RetroLambdaTests.java
index b53a741..62e41bb 100644
--- a/jack-tests/tests/com/android/jack/java8/RetroLambdaTests.java
+++ b/jack-tests/tests/com/android/jack/java8/RetroLambdaTests.java
@@ -16,7 +16,6 @@
 
 package com.android.jack.java8;
 
-import com.android.jack.Options;
 import com.android.jack.test.helper.RuntimeTestHelper;
 import com.android.jack.test.junit.Runtime;
 import com.android.jack.test.junit.RuntimeVersion;
@@ -409,9 +408,7 @@
   private void run(@Nonnull RuntimeTestInfo rti) throws Exception {
     new RuntimeTestHelper(rti)
         .setSourceLevel(SourceLevel.JAVA_8)
-        .addProperty(
-            Options.ANDROID_MIN_API_LEVEL.getName(),
-            String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
+        .setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
         .addIgnoredCandidateToolchain(JackApiV01.class)
         .compileAndRunTest();
   }
diff --git a/jack-tests/tests/com/android/jack/java8/StaticMethodTest.java b/jack-tests/tests/com/android/jack/java8/StaticMethodTest.java
index 9458556..d3b98dd 100644
--- a/jack-tests/tests/com/android/jack/java8/StaticMethodTest.java
+++ b/jack-tests/tests/com/android/jack/java8/StaticMethodTest.java
@@ -16,7 +16,6 @@
 
 package com.android.jack.java8;
 
-import com.android.jack.Options;
 import com.android.jack.test.helper.RuntimeTestHelper;
 import com.android.jack.test.junit.Runtime;
 import com.android.jack.test.junit.RuntimeVersion;
@@ -70,9 +69,7 @@
   private void run(@Nonnull RuntimeTestInfo rti) throws Exception {
     new RuntimeTestHelper(rti)
         .setSourceLevel(SourceLevel.JAVA_8)
-        .addProperty(
-            Options.ANDROID_MIN_API_LEVEL.getName(),
-            String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
+        .setAndroidMinApiLevel(String.valueOf(AndroidApiLevel.ReleasedLevel.N.getLevel()))
         .addIgnoredCandidateToolchain(JackApiV01.class)
         .compileAndRunTest();
   }
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInitWithVariableInit.java b/jack-tests/tests/com/android/jack/java8/explicitreceiver/test001/Tests.java
similarity index 61%
copy from jack-tests/tests/com/android/jack/clinit/jack/ClInitWithVariableInit.java
copy to jack-tests/tests/com/android/jack/java8/explicitreceiver/test001/Tests.java
index 8c344dd..b282fce 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInitWithVariableInit.java
+++ b/jack-tests/tests/com/android/jack/java8/explicitreceiver/test001/Tests.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2017 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,11 +14,21 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.java8.explicitreceiver.test001;
 
-public class ClInitWithVariableInit {
+import junit.framework.Assert;
 
-  static {
-    int lv = 5;
+import org.junit.Test;
+
+public class Tests {
+
+  public int add(Tests this,int i1, int i2) {
+    return i1 + i2;
+  }
+
+  @Test
+  public void test() {
+    Tests t = new Tests();
+    Assert.assertEquals(5, t.add(2, 3));
   }
 }
diff --git a/jack-tests/tests/com/android/jack/java8/explicitreceiver/test002/Tests.java b/jack-tests/tests/com/android/jack/java8/explicitreceiver/test002/Tests.java
new file mode 100644
index 0000000..c76f85e
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/java8/explicitreceiver/test002/Tests.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.java8.explicitreceiver.test002;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+
+public class Tests {
+
+  class Add {
+    int result;
+
+    Add(Tests Tests.this,int i1, int i2) {
+      result = i1 + i2;
+    }
+  }
+
+  @Test
+  public void test() {
+    Add t = new Add(2, 3);
+    Assert.assertEquals(5, t.result);
+  }
+}
diff --git a/jack-tests/tests/com/android/jack/java8/lambda/test010/proguard.flags b/jack-tests/tests/com/android/jack/java8/lambda/test010/proguard.flags
index 1a40ce3..514e99a 100644
--- a/jack-tests/tests/com/android/jack/java8/lambda/test010/proguard.flags
+++ b/jack-tests/tests/com/android/jack/java8/lambda/test010/proguard.flags
@@ -1,6 +1,6 @@
--applymapping mapping.flags
-
+-dontshrink
 -keepattributes
--keep class * {
+-applymapping mapping.flags
+-keep public class com.android.jack.java8.lambda.test010.jack.Tests {
   *;
-}
\ No newline at end of file
+}
diff --git a/jack-tests/tests/com/android/jack/java8/lambda/test025/proguard.flags b/jack-tests/tests/com/android/jack/java8/lambda/test025/proguard.flags
index 14f66c3..6b2d2bf 100644
--- a/jack-tests/tests/com/android/jack/java8/lambda/test025/proguard.flags
+++ b/jack-tests/tests/com/android/jack/java8/lambda/test025/proguard.flags
@@ -1,4 +1,5 @@
 -dontobfuscate
+-dontoptimize
 -keep public class com.android.jack.java8.lambda.test025.jack.Tests {
         public void test001();
 }
\ No newline at end of file
diff --git a/jack-tests/tests/com/android/jack/java8/lambda/test033/proguard.flags b/jack-tests/tests/com/android/jack/java8/lambda/test033/proguard.flags
index 1a40ce3..64dc490 100644
--- a/jack-tests/tests/com/android/jack/java8/lambda/test033/proguard.flags
+++ b/jack-tests/tests/com/android/jack/java8/lambda/test033/proguard.flags
@@ -1,6 +1,6 @@
 -applymapping mapping.flags
 
 -keepattributes
--keep class * {
+-keep class com.android.jack.java8.lambda.test033.jack.Tests {
   *;
 }
\ No newline at end of file
diff --git a/jack-tests/tests/com/android/jack/java8/lambda/test035/jack/Tests.java b/jack-tests/tests/com/android/jack/java8/lambda/test035/jack/Tests.java
index af2bb3d..7f8a826 100644
--- a/jack-tests/tests/com/android/jack/java8/lambda/test035/jack/Tests.java
+++ b/jack-tests/tests/com/android/jack/java8/lambda/test035/jack/Tests.java
@@ -196,7 +196,6 @@
     Assert.assertNull(lambdaClass.getDeclaringClass());
     Assert.assertNull(lambdaClass.getEnclosingClass());
     Assert.assertFalse(lambdaClass.isMemberClass());
-    Assert.assertEquals(1, lambdaClass.getConstructors().length);
 
     Assert.assertNotNull(lambdaClass.getSimpleName());
     Assert.assertNotNull(lambdaClass.getCanonicalName());
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java b/jack-tests/tests/com/android/jack/java8/lambda/test044/jack/B2.java
similarity index 62%
copy from jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
copy to jack-tests/tests/com/android/jack/java8/lambda/test044/jack/B2.java
index 680f9cf..4bc004a 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
+++ b/jack-tests/tests/com/android/jack/java8/lambda/test044/jack/B2.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2017 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,16 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.java8.lambda.test044.jack;
 
-public class ClInit {
+import com.android.jack.java8.lambda.test044.lib1.I2;
+import com.android.jack.java8.lambda.test044.lib1.subpkg.A2;
 
-}
+class B2 extends A2 {
+  class C {
+    int test() {
+      I2 i = () -> field;
+      return i.getCst() + field;
+    }
+  }
+}
\ No newline at end of file
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java b/jack-tests/tests/com/android/jack/java8/lambda/test044/jack/B3.java
similarity index 62%
copy from jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
copy to jack-tests/tests/com/android/jack/java8/lambda/test044/jack/B3.java
index 680f9cf..664ac01 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
+++ b/jack-tests/tests/com/android/jack/java8/lambda/test044/jack/B3.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2017 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,16 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.java8.lambda.test044.jack;
 
-public class ClInit {
+import com.android.jack.java8.lambda.test044.lib1.I2;
+import com.android.jack.java8.lambda.test044.lib1.subpkg.A2;
 
-}
+class B3 extends A2 {
+  class C {
+    int test() {
+      I2 i = () -> 2 * field;
+      return i.getCst() + field;
+    }
+  }
+}
\ No newline at end of file
diff --git a/jack-tests/tests/com/android/jack/java8/lambda/test044/jack/Tests.java b/jack-tests/tests/com/android/jack/java8/lambda/test044/jack/Tests.java
new file mode 100644
index 0000000..4eae343
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/java8/lambda/test044/jack/Tests.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.java8.lambda.test044.jack;
+
+import com.android.jack.java8.lambda.test044.lib1.B1;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+
+
+public class Tests {
+
+  @Test
+  public void test001() {
+    Assert.assertEquals(1, new B1().m1().getCst());
+  }
+
+  @Test
+  public void test002() {
+    Assert.assertEquals(20, new B2().new C().test());
+  }
+
+  @Test
+  public void test003() {
+    Assert.assertEquals(3, new B1().m3().getCst());
+  }
+
+  @Test
+  public void test004() {
+    Assert.assertEquals(30, new B3().new C().test());
+  }
+
+  @Test
+  public void test005() {
+    Assert.assertEquals(4, new B1().m4().getCst());
+  }
+
+  @Test
+  public void test006() {
+    Assert.assertEquals(5, new B1().m5().getCst());
+  }
+}
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java b/jack-tests/tests/com/android/jack/java8/lambda/test044/lib1/A4.java
similarity index 75%
copy from jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
copy to jack-tests/tests/com/android/jack/java8/lambda/test044/lib1/A4.java
index 680f9cf..02ab933 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
+++ b/jack-tests/tests/com/android/jack/java8/lambda/test044/lib1/A4.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2016 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,13 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.java8.lambda.test044.lib1;
 
-public class ClInit {
 
+public class A4 {
+
+  public I2 m() {
+    I2 i = () -> 4;
+    return i;
+  }
 }
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java b/jack-tests/tests/com/android/jack/java8/lambda/test044/lib1/A5.java
similarity index 75%
copy from jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
copy to jack-tests/tests/com/android/jack/java8/lambda/test044/lib1/A5.java
index 680f9cf..37c6334 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
+++ b/jack-tests/tests/com/android/jack/java8/lambda/test044/lib1/A5.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2016 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,13 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.java8.lambda.test044.lib1;
 
-public class ClInit {
 
+public class A5 {
+
+  public I2 m() {
+    I2 i = () -> 5;
+    return i;
+  }
 }
diff --git a/jack-tests/tests/com/android/jack/java8/lambda/test044/lib1/B1.java b/jack-tests/tests/com/android/jack/java8/lambda/test044/lib1/B1.java
new file mode 100644
index 0000000..ab2c110
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/java8/lambda/test044/lib1/B1.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.java8.lambda.test044.lib1;
+
+import com.android.jack.java8.lambda.test044.lib2.A1;
+import com.android.jack.java8.lambda.test044.lib2.A3;
+import com.android.jack.java8.lambda.test044.lib2.I1;
+
+public class B1 {
+
+  public I1 m1() {
+    return new A1().m();
+  }
+
+  public I1 m3() {
+    return new A3().m();
+  }
+
+  public I2 m4() {
+    return new A4().m();
+  }
+
+  public I2 m5() {
+    return new A5().m();
+  }
+}
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java b/jack-tests/tests/com/android/jack/java8/lambda/test044/lib1/I2.java
similarity index 79%
copy from jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
copy to jack-tests/tests/com/android/jack/java8/lambda/test044/lib1/I2.java
index 680f9cf..ca4ed7b 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
+++ b/jack-tests/tests/com/android/jack/java8/lambda/test044/lib1/I2.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2016 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.java8.lambda.test044.lib1;
 
-public class ClInit {
-
+public interface I2 {
+  int getCst();
 }
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java b/jack-tests/tests/com/android/jack/java8/lambda/test044/lib1/subpkg/A2.java
similarity index 77%
copy from jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
copy to jack-tests/tests/com/android/jack/java8/lambda/test044/lib1/subpkg/A2.java
index 680f9cf..3a801e3 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
+++ b/jack-tests/tests/com/android/jack/java8/lambda/test044/lib1/subpkg/A2.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2016 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.java8.lambda.test044.lib1.subpkg;
 
-public class ClInit {
-
+public class A2 {
+  protected int field = 10;
 }
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java b/jack-tests/tests/com/android/jack/java8/lambda/test044/lib2/A1.java
similarity index 75%
copy from jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
copy to jack-tests/tests/com/android/jack/java8/lambda/test044/lib2/A1.java
index 680f9cf..d7ac151 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
+++ b/jack-tests/tests/com/android/jack/java8/lambda/test044/lib2/A1.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2016 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,13 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.java8.lambda.test044.lib2;
 
-public class ClInit {
 
+public class A1 {
+
+  public I1 m() {
+    I1 i = () -> 1;
+    return i;
+  }
 }
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java b/jack-tests/tests/com/android/jack/java8/lambda/test044/lib2/A3.java
similarity index 75%
copy from jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
copy to jack-tests/tests/com/android/jack/java8/lambda/test044/lib2/A3.java
index 680f9cf..2bff856 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
+++ b/jack-tests/tests/com/android/jack/java8/lambda/test044/lib2/A3.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2016 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,13 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.java8.lambda.test044.lib2;
 
-public class ClInit {
 
+public class A3 {
+
+  public I1 m() {
+    I1 i = () -> 3;
+    return i;
+  }
 }
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java b/jack-tests/tests/com/android/jack/java8/lambda/test044/lib2/I1.java
similarity index 79%
copy from jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
copy to jack-tests/tests/com/android/jack/java8/lambda/test044/lib2/I1.java
index 680f9cf..7c82dbc 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
+++ b/jack-tests/tests/com/android/jack/java8/lambda/test044/lib2/I1.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2016 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,8 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.java8.lambda.test044.lib2;
 
-public class ClInit {
-
+public interface I1 {
+  int getCst();
 }
diff --git a/jack-tests/tests/com/android/jack/java8/lambda/test044/shrink-nothing.flags b/jack-tests/tests/com/android/jack/java8/lambda/test044/shrink-nothing.flags
new file mode 100644
index 0000000..40047b9
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/java8/lambda/test044/shrink-nothing.flags
@@ -0,0 +1,4 @@
+-dontobfuscate
+-keep class * {
+  *;
+}
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java b/jack-tests/tests/com/android/jack/java8/parameter/common/ParameterTestModifier.java
similarity index 62%
copy from jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
copy to jack-tests/tests/com/android/jack/java8/parameter/common/ParameterTestModifier.java
index 680f9cf..89763b4 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
+++ b/jack-tests/tests/com/android/jack/java8/parameter/common/ParameterTestModifier.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2017 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,11 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.java8.parameter.common;
 
-public class ClInit {
-
+public class ParameterTestModifier {
+  public static final int MODIFIER_NONE = 0;
+  public static final int MODIFIER_FINAL = 0X10;
+  public static final int MODIFIER_SYNTHETIC = 0X1000;
+  public static final int MODIFIER_IMPLICIT = 0X8000;
 }
diff --git a/jack-tests/tests/com/android/jack/java8/parameter/test001/Tests.java b/jack-tests/tests/com/android/jack/java8/parameter/test001/Tests.java
index 4e93558..ab5b7ed 100644
--- a/jack-tests/tests/com/android/jack/java8/parameter/test001/Tests.java
+++ b/jack-tests/tests/com/android/jack/java8/parameter/test001/Tests.java
@@ -16,8 +16,8 @@
 
 package com.android.jack.java8.parameter.test001;
 
+import com.android.jack.java8.parameter.common.ParameterTestModifier;
 import com.android.jack.java8.parameter.test001.Tests.Context.InnerWithParam;
-
 import junit.framework.Assert;
 
 import org.junit.Test;
@@ -28,11 +28,6 @@
 
 public class Tests {
 
-  public static final int MODIFIER_NONE = 0;
-  public static final int MODIFIER_FINAL = 16;
-  public static final int MODIFIER_SYNTHETIC = 4096;
-  public static final int MODIFIER_IMPLICIT = 32768;
-
   public static void m1(final int p1, int b2, Object... a) {}
 
   public class InnerClass {
@@ -48,13 +43,13 @@
     Assert.assertEquals(3, method.getParameters().length);
 
     check(method.getParameters()[0], "p1", /* isNamePresent= */ true, /* isImplicit= */ false,
-        /* isSynthetic= */ false, MODIFIER_FINAL);
+        /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_FINAL);
 
     check(method.getParameters()[1], "b2", /* isNamePresent= */ true, /* isImplicit= */ false,
-        /* isSynthetic= */ false, MODIFIER_NONE);
+        /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_NONE);
 
     check(method.getParameters()[2], "a", /* isNamePresent= */ true, /* isImplicit= */ false,
-        /* isSynthetic= */ false, MODIFIER_NONE);
+        /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_NONE);
   }
 
   @Test
@@ -62,8 +57,9 @@
     Constructor<?> constructor = InnerClass.class.getDeclaredConstructor(Tests.class);
     Assert.assertEquals(1, constructor.getParameters().length);
 
-    check(constructor.getParameters()[0], "this$0", /* isNamePresent= */ true, /* isImplicit= */ true,
-        /* isSynthetic= */ false, MODIFIER_FINAL | MODIFIER_IMPLICIT);
+    check(constructor.getParameters()[0], "this$0", /* isNamePresent= */ true,
+        /* isImplicit= */ true, /* isSynthetic= */ false,
+        ParameterTestModifier.MODIFIER_FINAL | ParameterTestModifier.MODIFIER_IMPLICIT);
   }
 
   @Test
@@ -72,11 +68,12 @@
         InnerClass.InnerInnerClass.class.getDeclaredConstructor(InnerClass.class, float.class);
     Assert.assertEquals(2, constructor.getParameters().length);
 
-    check(constructor.getParameters()[0], "this$1", /* isNamePresent= */ true, /* isImplicit= */ true,
-        /* isSynthetic= */ false, MODIFIER_FINAL | MODIFIER_IMPLICIT);
+    check(constructor.getParameters()[0], "this$1", /* isNamePresent= */ true,
+        /* isImplicit= */ true, /* isSynthetic= */ false,
+        ParameterTestModifier.MODIFIER_FINAL | ParameterTestModifier.MODIFIER_IMPLICIT);
 
     check(constructor.getParameters()[1], "f", /* isNamePresent= */ true, /* isImplicit= */ false,
-        /* isSynthetic= */ false, MODIFIER_NONE);
+        /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_NONE);
   }
 
   @Test
@@ -86,8 +83,9 @@
     Constructor<?> constructor = Local.class.getDeclaredConstructor(Tests.class);
     Assert.assertEquals(1, constructor.getParameters().length);
 
-    check(constructor.getParameters()[0], "this$0", /* isNamePresent= */ true, /* isImplicit= */ true,
-        /* isSynthetic= */ false, MODIFIER_FINAL | MODIFIER_IMPLICIT);
+    check(constructor.getParameters()[0], "this$0", /* isNamePresent= */ true,
+        /* isImplicit= */ true, /* isSynthetic= */ false,
+        ParameterTestModifier.MODIFIER_FINAL | ParameterTestModifier.MODIFIER_IMPLICIT);
   }
 
   @Test
@@ -104,14 +102,16 @@
     Constructor<?> constructor = Local.class.getDeclaredConstructor(Tests.class, int.class, Object.class);
     Assert.assertEquals(3, constructor.getParameters().length);
 
-    check(constructor.getParameters()[0], "this$0", /* isNamePresent= */ true, /* isImplicit= */ true,
-        /* isSynthetic= */ false, MODIFIER_FINAL | MODIFIER_IMPLICIT);
+    check(constructor.getParameters()[0], "this$0", /* isNamePresent= */ true,
+        /* isImplicit= */ true, /* isSynthetic= */ false,
+        ParameterTestModifier.MODIFIER_FINAL | ParameterTestModifier.MODIFIER_IMPLICIT);
 
     check(constructor.getParameters()[1], "i", /* isNamePresent= */ true, /* isImplicit= */ false,
-        /* isSynthetic= */ false, MODIFIER_NONE);
+        /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_NONE);
 
-    check(constructor.getParameters()[2], "val$o", /* isNamePresent= */ true, /* isImplicit= */ false,
-        /* isSynthetic= */ true, MODIFIER_FINAL |  MODIFIER_SYNTHETIC);
+    check(constructor.getParameters()[2], "val$o", /* isNamePresent= */ true,
+        /* isImplicit= */ false, /* isSynthetic= */ true,
+        ParameterTestModifier.MODIFIER_FINAL | ParameterTestModifier.MODIFIER_SYNTHETIC);
   }
 
     abstract static class StaticAnonymous {
@@ -122,8 +122,9 @@
       StaticAnonymous a = new StaticAnonymous() {};
       Constructor<?> constructor = a.getClass().getDeclaredConstructor(Tests.class);
       Assert.assertEquals(1, constructor.getParameters().length);
-      check(constructor.getParameters()[0], "this$0", /* isNamePresent= */ true, /* isImplicit= */ true,
-        /* isSynthetic= */ false, MODIFIER_FINAL | MODIFIER_IMPLICIT);
+    check(constructor.getParameters()[0], "this$0", /* isNamePresent= */ true,
+        /* isImplicit= */ true, /* isSynthetic= */ false,
+        ParameterTestModifier.MODIFIER_FINAL | ParameterTestModifier.MODIFIER_IMPLICIT);
     }
 
 
@@ -142,10 +143,11 @@
     Assert.assertEquals(2, constructor.getParameters().length);
 
     check(constructor.getParameters()[0], "this$1", /* isNamePresent= */ true,
-        /* isImplicit= */ true, /* isSynthetic= */ false, MODIFIER_FINAL | MODIFIER_IMPLICIT);
+        /* isImplicit= */ true, /* isSynthetic= */ false,
+        ParameterTestModifier.MODIFIER_FINAL | ParameterTestModifier.MODIFIER_IMPLICIT);
 
     check(constructor.getParameters()[1], "i1", /* isNamePresent= */ true,
-        /* isImplicit= */ false, /* isSynthetic= */ false, MODIFIER_NONE);
+        /* isImplicit= */ false, /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_NONE);
   }
 
   private void check(Parameter parameter, String name, boolean isNamePresent, boolean isImplicit,
diff --git a/jack-tests/tests/com/android/jack/java8/parameter/test002/Tests.java b/jack-tests/tests/com/android/jack/java8/parameter/test002/Tests.java
index a78de84..7a5f253 100644
--- a/jack-tests/tests/com/android/jack/java8/parameter/test002/Tests.java
+++ b/jack-tests/tests/com/android/jack/java8/parameter/test002/Tests.java
@@ -16,6 +16,8 @@
 
 package com.android.jack.java8.parameter.test002;
 
+import com.android.jack.java8.parameter.common.ParameterTestModifier;
+
 import junit.framework.Assert;
 
 import org.junit.Test;
@@ -26,11 +28,6 @@
 
 public class Tests {
 
-  public static final int MODIFIER_NONE = 0;
-  public static final int MODIFIER_FINAL = 16;
-  public static final int MODIFIER_SYNTHETIC = 4096;
-  public static final int MODIFIER_IMPLICIT = 32768;
-
   enum Number {
     ONE, TWO;
   }
@@ -41,7 +38,7 @@
     Assert.assertEquals(1, method.getParameters().length);
 
     check(method.getParameters()[0], "name", /* isNamePresent= */ true, /* isImplicit= */ true,
-        /* isSynthetic= */ false, MODIFIER_IMPLICIT);
+        /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_IMPLICIT);
   }
 
   @Test
@@ -50,10 +47,10 @@
     Assert.assertEquals(2, constructor.getParameters().length);
 
     check(constructor.getParameters()[0], "enum$name", /* isNamePresent= */ true,
-        /* isImplicit= */ false, /* isSynthetic= */ true, MODIFIER_SYNTHETIC);
+        /* isImplicit= */ false, /* isSynthetic= */ true, ParameterTestModifier.MODIFIER_SYNTHETIC);
 
     check(constructor.getParameters()[1], "enum$ordinal", /* isNamePresent= */ true,
-        /* isImplicit= */ false, /* isSynthetic= */ true, MODIFIER_SYNTHETIC);
+        /* isImplicit= */ false, /* isSynthetic= */ true, ParameterTestModifier.MODIFIER_SYNTHETIC);
   }
 
   private void check(Parameter parameter, String name, boolean isNamePresent, boolean isImplicit,
diff --git a/jack-tests/tests/com/android/jack/java8/parameter/test003/Tests.java b/jack-tests/tests/com/android/jack/java8/parameter/test003/Tests.java
index ecbff01..57749ed 100644
--- a/jack-tests/tests/com/android/jack/java8/parameter/test003/Tests.java
+++ b/jack-tests/tests/com/android/jack/java8/parameter/test003/Tests.java
@@ -16,6 +16,8 @@
 
 package com.android.jack.java8.parameter.test003;
 
+import com.android.jack.java8.parameter.common.ParameterTestModifier;
+
 import junit.framework.Assert;
 
 import org.junit.Test;
@@ -35,17 +37,12 @@
 }
 public class Tests {
 
-  public static final int MODIFIER_NONE = 0;
-  public static final int MODIFIER_FINAL = 16;
-  public static final int MODIFIER_SYNTHETIC = 4096;
-  public static final int MODIFIER_IMPLICIT = 32768;
-
   @Test
   public void testBridge() throws NoSuchMethodException, SecurityException {
     Method method = A.class.getDeclaredMethod("get", Object.class);
 
     check(method.getParameters()[0], "t", /* isNamePresent= */ true, /* isImplicit= */ false,
-        /* isSynthetic= */ true, MODIFIER_SYNTHETIC);
+        /* isSynthetic= */ true, ParameterTestModifier.MODIFIER_SYNTHETIC);
   }
 
   @Test
@@ -53,7 +50,7 @@
     Method method = A.class.getDeclaredMethod("get", Integer.class);
 
     check(method.getParameters()[0], "t", /* isNamePresent= */ true, /* isImplicit= */ false,
-        /* isSynthetic= */ false, MODIFIER_NONE);
+        /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_NONE);
   }
 
   private void check(Parameter parameter, String name, boolean isNamePresent, boolean isImplicit,
diff --git a/jack-tests/tests/com/android/jack/java8/parameter/test004/Tests.java b/jack-tests/tests/com/android/jack/java8/parameter/test004/Tests.java
index 1e52d84..0b528bf 100644
--- a/jack-tests/tests/com/android/jack/java8/parameter/test004/Tests.java
+++ b/jack-tests/tests/com/android/jack/java8/parameter/test004/Tests.java
@@ -16,6 +16,7 @@
 
 package com.android.jack.java8.parameter.test004;
 
+import com.android.jack.java8.parameter.common.ParameterTestModifier;
 
 import junit.framework.Assert;
 
@@ -26,12 +27,6 @@
 
 public class Tests {
 
-  public static final int MODIFIER_NONE = 0;
-  public static final int MODIFIER_FINAL = 16;
-  public static final int MODIFIER_SYNTHETIC = 4096;
-  public static final int MODIFIER_IMPLICIT = 32768;
-
-
   abstract class InstanceAnonymous {
     public InstanceAnonymous(int value) {
     }
@@ -43,19 +38,22 @@
     };
 
     // Could be a constructor with Test.class, int.class
-    Constructor<?> constructor = ia.getClass().getDeclaredConstructor(Tests.class, Tests.class, int.class);
+    Constructor<?> constructor =
+        ia.getClass().getDeclaredConstructor(Tests.class, Tests.class, int.class);
     Assert.assertEquals(3, constructor.getParameters().length);
 
-    check(constructor.getParameters()[0], "this$0", /* isNamePresent= */ true, /* isImplicit= */ true,
-      /* isSynthetic= */ false, MODIFIER_FINAL | MODIFIER_IMPLICIT);
+    check(constructor.getParameters()[0], "this$0", /* isNamePresent= */ true,
+        /* isImplicit= */ true, /* isSynthetic= */ false,
+        ParameterTestModifier.MODIFIER_FINAL | ParameterTestModifier.MODIFIER_IMPLICIT);
 
     // Could be this$1 rather than this$0_1
-    check(constructor.getParameters()[1], "this$0_1", /* isNamePresent= */ true, /* isImplicit= */ true,
-        /* isSynthetic= */ false, MODIFIER_FINAL | MODIFIER_IMPLICIT);
+    check(constructor.getParameters()[1], "this$0_1", /* isNamePresent= */ true,
+        /* isImplicit= */ true, /* isSynthetic= */ false,
+        ParameterTestModifier.MODIFIER_FINAL | ParameterTestModifier.MODIFIER_IMPLICIT);
 
     // Could be value rather than $anonymous0
-    check(constructor.getParameters()[2], "$anonymous0", /* isNamePresent= */ true, /* isImplicit= */ false,
-        /* isSynthetic= */ false, MODIFIER_NONE);
+    check(constructor.getParameters()[2], "$anonymous0", /* isNamePresent= */ true,
+        /* isImplicit= */ false, /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_NONE);
   }
 
   @Test
@@ -69,19 +67,22 @@
     };
 
     // Could be a constructor with Test.class, int.class
-    Constructor<?> constructor = ia.getClass().getDeclaredConstructor(Tests.class, Tests.class, int.class);
+    Constructor<?> constructor =
+        ia.getClass().getDeclaredConstructor(Tests.class, Tests.class, int.class);
     Assert.assertEquals(3, constructor.getParameters().length);
 
-    check(constructor.getParameters()[0], "this$0", /* isNamePresent= */ true, /* isImplicit= */ false,
-      /* isSynthetic= */ true, MODIFIER_FINAL | MODIFIER_SYNTHETIC);
+    check(constructor.getParameters()[0], "this$0", /* isNamePresent= */ true,
+        /* isImplicit= */ false, /* isSynthetic= */ true,
+        ParameterTestModifier.MODIFIER_FINAL | ParameterTestModifier.MODIFIER_SYNTHETIC);
 
     // Could be this$1 rather than this$0_1
-    check(constructor.getParameters()[1], "this$0_1", /* isNamePresent= */ true, /* isImplicit= */ false,
-        /* isSynthetic= */ true, MODIFIER_FINAL | MODIFIER_SYNTHETIC);
+    check(constructor.getParameters()[1], "this$0_1", /* isNamePresent= */ true,
+        /* isImplicit= */ false, /* isSynthetic= */ true,
+        ParameterTestModifier.MODIFIER_FINAL | ParameterTestModifier.MODIFIER_SYNTHETIC);
 
     // Could be value rather than $anonymous0
-    check(constructor.getParameters()[2], "$anonymous0", /* isNamePresent= */ true, /* isImplicit= */ false,
-        /* isSynthetic= */ false, MODIFIER_NONE);
+    check(constructor.getParameters()[2], "$anonymous0", /* isNamePresent= */ true,
+        /* isImplicit= */ false, /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_NONE);
   }
 
   private void check(Parameter parameter, String name, boolean isNamePresent, boolean isImplicit,
diff --git a/jack-tests/tests/com/android/jack/java8/parameter/test005/Tests.java b/jack-tests/tests/com/android/jack/java8/parameter/test005/Tests.java
index 9044e52..48d38d3 100644
--- a/jack-tests/tests/com/android/jack/java8/parameter/test005/Tests.java
+++ b/jack-tests/tests/com/android/jack/java8/parameter/test005/Tests.java
@@ -16,6 +16,8 @@
 
 package com.android.jack.java8.parameter.test005;
 
+import com.android.jack.java8.parameter.common.ParameterTestModifier;
+
 import junit.framework.Assert;
 
 import org.junit.Test;
@@ -26,11 +28,6 @@
 
 public class Tests {
 
-  public static final int MODIFIER_NONE = 0;
-  public static final int MODIFIER_FINAL = 16;
-  public static final int MODIFIER_SYNTHETIC = 4096;
-  public static final int MODIFIER_IMPLICIT = 32768;
-
   public static int m1(int p1, int p2, int p3) {
     return p1 + p2 + p3;
   }
@@ -42,13 +39,13 @@
     Assert.assertEquals(3, method.getParameters().length);
 
     check(method.getParameters()[0], "p1", /* isNamePresent= */ true, /* isImplicit= */ false,
-        /* isSynthetic= */ false, MODIFIER_NONE);
+        /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_NONE);
 
     check(method.getParameters()[1], "p2", /* isNamePresent= */ true, /* isImplicit= */ false,
-        /* isSynthetic= */ false, MODIFIER_NONE);
+        /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_NONE);
 
     check(method.getParameters()[2], "p3", /* isNamePresent= */ true, /* isImplicit= */ false,
-        /* isSynthetic= */ false, MODIFIER_NONE);
+        /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_NONE);
   }
 
   private void check(Parameter parameter, String name, boolean isNamePresent, boolean isImplicit,
diff --git a/jack-tests/tests/com/android/jack/java8/parameter/test006/Tests.java b/jack-tests/tests/com/android/jack/java8/parameter/test006/Tests.java
index f73fc8b..7e4b5dc 100644
--- a/jack-tests/tests/com/android/jack/java8/parameter/test006/Tests.java
+++ b/jack-tests/tests/com/android/jack/java8/parameter/test006/Tests.java
@@ -16,6 +16,8 @@
 
 package com.android.jack.java8.parameter.test006;
 
+import com.android.jack.java8.parameter.common.ParameterTestModifier;
+
 import junit.framework.Assert;
 
 import org.junit.Test;
@@ -26,14 +28,9 @@
 
 public class Tests {
 
-  public static final int MODIFIER_NONE = 0;
-  public static final int MODIFIER_FINAL = 16;
-  public static final int MODIFIER_SYNTHETIC = 4096;
-  public static final int MODIFIER_IMPLICIT = 32768;
-
   private int field = 10;
 
-  public class InnerClass { 
+  public class InnerClass {
       public int getValue() {
           return field;
       }
@@ -47,7 +44,7 @@
             Parameter[] parameters = method.getParameters();
             Assert.assertEquals(1, parameters.length);
             check(parameters[0], "arg0", /* isNamePresent= */ false, /* isImplicit= */ false,
-                    /* isSynthetic= */ false, MODIFIER_NONE);
+                    /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_NONE);
         }
     }
   }
diff --git a/jack-tests/tests/com/android/jack/java8/parameter/test007/Tests.java b/jack-tests/tests/com/android/jack/java8/parameter/test007/Tests.java
index d302efc..0f7de69 100644
--- a/jack-tests/tests/com/android/jack/java8/parameter/test007/Tests.java
+++ b/jack-tests/tests/com/android/jack/java8/parameter/test007/Tests.java
@@ -16,6 +16,8 @@
 
 package com.android.jack.java8.parameter.test007;
 
+import com.android.jack.java8.parameter.common.ParameterTestModifier;
+
 import junit.framework.Assert;
 
 import org.junit.Test;
@@ -26,14 +28,9 @@
 
 public class Tests {
 
-  public static final int MODIFIER_NONE = 0;
-  public static final int MODIFIER_FINAL = 16;
-  public static final int MODIFIER_SYNTHETIC = 4096;
-  public static final int MODIFIER_IMPLICIT = 32768;
-
   private int field = 0;
 
-  public class InnerClass { 
+  public class InnerClass {
       public void setValue() {
           field = 10;
       }
@@ -43,14 +40,14 @@
   public void testStaticMethod() throws NoSuchMethodException, SecurityException {
     Method[] methods = Tests.class.getDeclaredMethods();
     for (Method method : methods) {
-        if (method.isSynthetic()) {
-            Parameter[] parameters = method.getParameters();
-            Assert.assertEquals(2, parameters.length);
-            check(parameters[0], "arg0", /* isNamePresent= */ false, /* isImplicit= */ false,
-                    /* isSynthetic= */ false, MODIFIER_NONE);
-            check(parameters[1], "arg1", /* isNamePresent= */ false, /* isImplicit= */ false,
-                /* isSynthetic= */ false, MODIFIER_NONE);
-        }
+      if (method.isSynthetic()) {
+        Parameter[] parameters = method.getParameters();
+        Assert.assertEquals(2, parameters.length);
+        check(parameters[0], "arg0", /* isNamePresent= */ false, /* isImplicit= */ false,
+            /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_NONE);
+        check(parameters[1], "arg1", /* isNamePresent= */ false, /* isImplicit= */ false,
+            /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_NONE);
+      }
     }
   }
 
diff --git a/jack-tests/tests/com/android/jack/java8/parameter/test008/Tests.java b/jack-tests/tests/com/android/jack/java8/parameter/test008/Tests.java
index 1e2a630..c60d42a 100644
--- a/jack-tests/tests/com/android/jack/java8/parameter/test008/Tests.java
+++ b/jack-tests/tests/com/android/jack/java8/parameter/test008/Tests.java
@@ -16,6 +16,8 @@
 
 package com.android.jack.java8.parameter.test008;
 
+import com.android.jack.java8.parameter.common.ParameterTestModifier;
+
 import junit.framework.Assert;
 
 import org.junit.Test;
@@ -26,11 +28,6 @@
 
 public class Tests {
 
-  public static final int MODIFIER_NONE = 0;
-  public static final int MODIFIER_FINAL = 16;
-  public static final int MODIFIER_SYNTHETIC = 4096;
-  public static final int MODIFIER_IMPLICIT = 32768;
-
   private int addValue(int i) {
     return 10 + i;
   };
@@ -45,14 +42,14 @@
   public void testStaticMethod() throws NoSuchMethodException, SecurityException {
     Method[] methods = Tests.class.getDeclaredMethods();
     for (Method method : methods) {
-        if (method.isSynthetic()) {
-            Parameter[] parameters = method.getParameters();
-            Assert.assertEquals(2, parameters.length);
-            check(parameters[0], "arg0", /* isNamePresent= */ false, /* isImplicit= */ false,
-                    /* isSynthetic= */ false, MODIFIER_NONE);
-            check(parameters[1], "arg1", /* isNamePresent= */ false, /* isImplicit= */ false,
-                /* isSynthetic= */ false, MODIFIER_NONE);            
-        }
+      if (method.isSynthetic()) {
+        Parameter[] parameters = method.getParameters();
+        Assert.assertEquals(2, parameters.length);
+        check(parameters[0], "arg0", /* isNamePresent= */ false, /* isImplicit= */ false,
+            /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_NONE);
+        check(parameters[1], "arg1", /* isNamePresent= */ false, /* isImplicit= */ false,
+            /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_NONE);
+      }
     }
   }
 
diff --git a/jack-tests/tests/com/android/jack/java8/parameter/test009/Tests.java b/jack-tests/tests/com/android/jack/java8/parameter/test009/Tests.java
index ad00e63..4327c00 100644
--- a/jack-tests/tests/com/android/jack/java8/parameter/test009/Tests.java
+++ b/jack-tests/tests/com/android/jack/java8/parameter/test009/Tests.java
@@ -16,6 +16,8 @@
 
 package com.android.jack.java8.parameter.test009;
 
+import com.android.jack.java8.parameter.common.ParameterTestModifier;
+
 import junit.framework.Assert;
 
 import org.junit.Test;
@@ -32,21 +34,16 @@
 }
 public class Tests extends MyBaseClass {
 
-  public static final int MODIFIER_NONE = 0;
-  public static final int MODIFIER_FINAL = 16;
-  public static final int MODIFIER_SYNTHETIC = 4096;
-  public static final int MODIFIER_IMPLICIT = 32768;
-
   @Test
   public void testStaticMethod() throws NoSuchMethodException, SecurityException {
     Method[] methods = Tests.class.getDeclaredMethods();
     for (Method method : methods) {
-        if (method.isSynthetic()) {
-            Parameter[] parameters = method.getParameters();
-            Assert.assertEquals(1, parameters.length);
-            check(parameters[0], "param1", /* isNamePresent= */ true, /* isImplicit= */ false,
-                    /* isSynthetic= */ true, MODIFIER_SYNTHETIC);
-        }
+      if (method.isSynthetic()) {
+        Parameter[] parameters = method.getParameters();
+        Assert.assertEquals(1, parameters.length);
+        check(parameters[0], "param1", /* isNamePresent= */ true, /* isImplicit= */ false,
+            /* isSynthetic= */ true, ParameterTestModifier.MODIFIER_SYNTHETIC);
+      }
     }
   }
 
diff --git a/jack-tests/tests/com/android/jack/java8/parameter/test010/Tests.java b/jack-tests/tests/com/android/jack/java8/parameter/test010/Tests.java
index 21636f2..050e157 100644
--- a/jack-tests/tests/com/android/jack/java8/parameter/test010/Tests.java
+++ b/jack-tests/tests/com/android/jack/java8/parameter/test010/Tests.java
@@ -16,6 +16,8 @@
 
 package com.android.jack.java8.parameter.test010;
 
+import com.android.jack.java8.parameter.common.ParameterTestModifier;
+
 import junit.framework.Assert;
 
 import org.junit.Test;
@@ -27,11 +29,6 @@
 
 public class Tests {
 
-  public static final int MODIFIER_NONE = 0;
-  public static final int MODIFIER_FINAL = 16;
-  public static final int MODIFIER_SYNTHETIC = 4096;
-  public static final int MODIFIER_IMPLICIT = 32768;
-
   public static void m1(int a, double d, final float f, final long l) {
   }
 
@@ -47,16 +44,16 @@
     Assert.assertEquals(4, parameters.length);
 
     check(parameters[0], "a", /* isNamePresent= */ true, /* isImplicit= */ false,
-        /* isSynthetic= */ false, MODIFIER_NONE);
+        /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_NONE);
 
     check(parameters[1], "d", /* isNamePresent= */ true, /* isImplicit= */ false,
-        /* isSynthetic= */ false, MODIFIER_NONE);
+        /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_NONE);
 
     check(parameters[2], "f", /* isNamePresent= */ true, /* isImplicit= */ false,
-        /* isSynthetic= */ false, MODIFIER_FINAL);
+        /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_FINAL);
 
     check(parameters[3], "l", /* isNamePresent= */ true, /* isImplicit= */ false,
-        /* isSynthetic= */ false, MODIFIER_FINAL);
+        /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_FINAL);
   }
 
   @Test
@@ -68,16 +65,16 @@
     Assert.assertEquals(4, parameters.length);
 
     check(parameters[0], "a", /* isNamePresent= */ true, /* isImplicit= */ false,
-        /* isSynthetic= */ false, MODIFIER_FINAL);
+        /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_FINAL);
 
     check(parameters[1], "d", /* isNamePresent= */ true, /* isImplicit= */ false,
-        /* isSynthetic= */ false, MODIFIER_NONE);
+        /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_NONE);
 
     check(parameters[2], "f", /* isNamePresent= */ true, /* isImplicit= */ false,
-        /* isSynthetic= */ false, MODIFIER_FINAL);
+        /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_FINAL);
 
     check(parameters[3], "l", /* isNamePresent= */ true, /* isImplicit= */ false,
-        /* isSynthetic= */ false, MODIFIER_NONE);
+        /* isSynthetic= */ false, ParameterTestModifier.MODIFIER_NONE);
   }
 
   private void check(Parameter parameter, String name, boolean isNamePresent, boolean isImplicit,
diff --git a/jack-tests/tests/com/android/jack/jill/JillTests.java b/jack-tests/tests/com/android/jack/jill/JillTests.java
index edbda2b..4bf05ff 100644
--- a/jack-tests/tests/com/android/jack/jill/JillTests.java
+++ b/jack-tests/tests/com/android/jack/jill/JillTests.java
@@ -17,9 +17,11 @@
 package com.android.jack.jill;
 
 import com.android.jack.test.TestsProperties;
+import com.android.jack.test.junit.KnownIssue;
 import com.android.jack.test.junit.Runtime;
 import com.android.jack.test.runner.RuntimeRunner;
 import com.android.jack.test.toolchain.AbstractTestTools;
+import com.android.jack.test.toolchain.IncrementalToolchain;
 import com.android.jack.test.toolchain.JackBasedToolchain;
 
 import junit.framework.Assert;
@@ -35,28 +37,39 @@
 
   @Test
   @Runtime
+  @KnownIssue(candidate=IncrementalToolchain.class)
   public void test001() throws Exception {
     runJillTest("001");
   }
 
   @Test
   @Runtime
+  @KnownIssue(candidate=IncrementalToolchain.class)
   public void test002() throws Exception {
     runJillTest("002");
   }
 
   @Test
   @Runtime
+  @KnownIssue(candidate=IncrementalToolchain.class)
   public void test003() throws Exception {
     runJillTest("003");
   }
 
   @Test
   @Runtime
+  @KnownIssue(candidate=IncrementalToolchain.class)
   public void test004() throws Exception {
     runJillTest("004");
   }
 
+  @Test
+  @Runtime
+  @KnownIssue(candidate=IncrementalToolchain.class)
+  public void test005() throws Exception {
+    runJillTest("005");
+  }
+
   private static void runJillTest(@Nonnull String testNumber) throws Exception {
     String jackFolder = getJackFolder(testNumber);
     String jasminFolder = getJasminFolder(testNumber);
@@ -77,7 +90,7 @@
     jackToolchain.addStaticLibs(jarInput);
     jackToolchain.srcToExe(dex, /* zipFile = */ true, testSourceDir);
 
-    List<RuntimeRunner> runnerList = AbstractTestTools.listRuntimeTestRunners(null);
+    List<RuntimeRunner> runnerList = AbstractTestTools.listRuntimeTestRunners();
     String[] names = { testClassName };
     for (RuntimeRunner runner : runnerList) {
       Assert.assertEquals(0,
diff --git a/jack-tests/tests/com/android/jack/jill/test005/jack/Test005.java b/jack-tests/tests/com/android/jack/jill/test005/jack/Test005.java
new file mode 100644
index 0000000..7dcd72a
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/jill/test005/jack/Test005.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.jill.test005.jack;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+
+public class Test005 {
+
+  @Test
+  public void test001() {
+    Assert.assertEquals(1, new External1().getValueInt1());
+    Assert.assertEquals(2, new External1().getValueInt2());
+    Assert.assertEquals(3, new External1().getValueInt3());
+    Assert.assertEquals(4, new External1().getValueInt4());
+    Assert.assertEquals(5, new External1().getValueInt5());
+    Assert.assertEquals(6, new External1().getValueInt6());
+    Assert.assertEquals(-2, new External1().getValueIntMinus2());
+    Assert.assertEquals(2L, new External1().getValueLong2());
+    Assert.assertEquals(1L, new External1().getValueLong1());
+    Assert.assertEquals(1L, new External1().getValueLong1Bis());
+    Assert.assertEquals(2L, new External1().getValueLong2());
+  }
+}
\ No newline at end of file
diff --git a/jack-tests/tests/com/android/jack/jill/test005/jasmin/External1.j b/jack-tests/tests/com/android/jack/jill/test005/jasmin/External1.j
new file mode 100644
index 0000000..40ffdf1
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/jill/test005/jasmin/External1.j
@@ -0,0 +1,142 @@
+; Copyright (C) 2017 The Android Open Source Project
+;
+; Licensed under the Apache License, Version 2.0 (the "License");
+; you may not use this file except in compliance with the License.
+; You may obtain a copy of the License at
+;
+;      http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing, software
+; distributed under the License is distributed on an "AS IS" BASIS,
+; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+; See the License for the specific language governing permissions and
+; limitations under the License.
+
+.class public com/android/jack/jill/test005/jack/External1
+.super java/lang/Object
+
+.method public <init>()V
+    aload_0
+    invokespecial java/lang/Object/<init>()V
+    return
+.end method
+
+.method public getValueInt1()I
+    .limit locals 1
+    .limit stack 2
+    iconst_1
+    dup
+    pop
+    ireturn
+.end method
+
+.method public getValueInt2()I
+    .limit locals 1
+    .limit stack 2
+    iconst_1
+    dup
+    iadd
+    ireturn
+.end method
+
+.method public getValueInt3()I
+    .limit locals 1
+    .limit stack 2
+    iconst_2
+    iconst_3
+    swap
+    pop
+    ireturn
+.end method
+
+.method public getValueIntMinus2()I
+    .limit locals 1
+    .limit stack 4
+    iconst_1
+    iconst_2
+    dup2
+    isub
+    isub
+    isub
+    ireturn
+.end method
+
+.method public getValueInt4()I
+    .limit locals 1
+    .limit stack 4
+    iconst_1
+    iconst_2
+    iconst_3
+    dup_x1
+    pop2
+    iadd
+    ireturn
+.end method
+
+.method public getValueInt5()I
+    .limit locals 1
+    .limit stack 5
+    iconst_1
+    iconst_2
+    iconst_3
+    dup2_x1
+    pop2
+    pop
+    iadd
+    ireturn
+.end method
+
+.method public getValueInt6()I
+    .limit locals 1
+    .limit stack 5
+    lconst_0
+    iconst_4
+    dup_x2
+    pop
+    pop2
+    iconst_2
+    iadd
+    ireturn
+.end method
+
+.method public getValueLong2()J
+    .limit locals 1
+    .limit stack 4
+    lconst_1
+    dup2
+    ladd
+    lreturn
+.end method
+
+.method public getValueLong1()J
+    .limit locals 1
+    .limit stack 4
+    lconst_1
+    dup2
+    pop2
+    lreturn
+.end method
+
+.method public getValueLong1Bis()J
+    .limit locals 1
+    .limit stack 5
+    iconst_2
+    lconst_1
+    dup2_x1
+    pop2
+    pop
+    lreturn
+.end method
+
+.method public getValueLong2()J
+    .limit locals 1
+    .limit stack 4
+    lconst_0
+    lconst_1
+    dup2_x2
+    pop2
+    pop2
+    lconst_1
+    ladd
+    lreturn
+.end method
\ No newline at end of file
diff --git a/jack-tests/tests/com/android/jack/jill/test005/jasmin/jarInput.jar b/jack-tests/tests/com/android/jack/jill/test005/jasmin/jarInput.jar
new file mode 100644
index 0000000..7916c73
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/jill/test005/jasmin/jarInput.jar
Binary files differ
diff --git a/jack-tests/tests/com/android/jack/library/LibraryTests.java b/jack-tests/tests/com/android/jack/library/LibraryTests.java
index 330c051..b16c21e 100644
--- a/jack-tests/tests/com/android/jack/library/LibraryTests.java
+++ b/jack-tests/tests/com/android/jack/library/LibraryTests.java
@@ -21,6 +21,7 @@
 import com.android.jack.test.toolchain.IToolchain;
 import com.android.jack.test.toolchain.JackBasedToolchain;
 import com.android.jack.test.toolchain.JillBasedToolchain;
+import com.android.jack.test.toolchain.LegacyToolchain;
 import com.android.sched.util.file.InputZipFile;
 import com.android.sched.vfs.ReadZipFS;
 import com.android.sched.vfs.VFS;
@@ -96,7 +97,10 @@
 
   @Nonnull
   private File createEmptyLibrary() throws IOException, Exception {
-    AndroidToolchain toolchain = AbstractTestTools.getCandidateToolchain(AndroidToolchain.class);
+    List<Class<? extends IToolchain>> excludeList = new ArrayList<Class<? extends IToolchain>>(1);
+    excludeList.add(LegacyToolchain.class);
+    AndroidToolchain toolchain =
+        AbstractTestTools.getCandidateToolchain(AndroidToolchain.class, excludeList);
     File emptyLib = AbstractTestTools.createTempFile("empty", toolchain.getLibraryExtension());
     toolchain.srcToLib(emptyLib, /* zipFiles = */ true);
 
diff --git a/jack-tests/tests/com/android/jack/lookup/LookupTests.java b/jack-tests/tests/com/android/jack/lookup/LookupTests.java
index adbc25a..ec49e7d 100644
--- a/jack-tests/tests/com/android/jack/lookup/LookupTests.java
+++ b/jack-tests/tests/com/android/jack/lookup/LookupTests.java
@@ -19,6 +19,7 @@
 import com.android.jack.test.toolchain.AbstractTestTools;
 import com.android.jack.test.toolchain.IToolchain;
 import com.android.jack.test.toolchain.JillApiToolchainBase;
+import com.android.jack.test.toolchain.LegacyToolchain;
 
 import org.junit.Test;
 
@@ -32,6 +33,7 @@
   public void test001() throws Exception {
     List<Class<? extends IToolchain>> exclude = new ArrayList<Class<? extends IToolchain>>();
     exclude.add(JillApiToolchainBase.class);
+    exclude.add(LegacyToolchain.class);
     IToolchain toolchain = AbstractTestTools.getCandidateToolchain(IToolchain.class, exclude);
     File lib = AbstractTestTools.createTempDir();
     toolchain.addToClasspath(toolchain.getDefaultBootClasspath())
diff --git a/jack-tests/tests/com/android/jack/optimizations/lambdas/LambdaTests.java b/jack-tests/tests/com/android/jack/optimizations/lambdas/LambdaTests.java
index 53b0461..19b2ec7 100644
--- a/jack-tests/tests/com/android/jack/optimizations/lambdas/LambdaTests.java
+++ b/jack-tests/tests/com/android/jack/optimizations/lambdas/LambdaTests.java
@@ -34,6 +34,7 @@
 import java.nio.charset.Charset;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.TreeMap;
 import javax.annotation.Nonnegative;
 import javax.annotation.Nonnull;
 
@@ -60,7 +61,7 @@
 
   @Nonnull
   private static String lambda(@Nonnull String pkg, @Nonnull String sha, @Nonnegative int i) {
-    return type(pkg, "-$Lambda$" + i + "$" + sha);
+    return type(pkg, "-$Lambda$" + sha + (i == 0 ? "" : ("$" + i)));
   }
 
   @Nonnull
@@ -71,11 +72,27 @@
     return names;
   }
 
+  @Nonnull
+  private static String orderedByTypeName(@Nonnull Class... classes) {
+    TreeMap<String, String> name2type = new TreeMap<>();
+    for (Class cls : classes) {
+      name2type.put(cls.name, cls.toString());
+    }
+    StringBuilder builder = new StringBuilder();
+    for (String str : name2type.values()) {
+      builder.append(str);
+    }
+    return builder.toString();
+  }
+
   private static class Class {
     @Nonnull
+    public final String name;
+    @Nonnull
     private final StringBuilder builder = new StringBuilder();
 
     Class(@Nonnull String name, @Nonnull String... interfaces) {
+      this.name = name;
       builder.append(name).append("\n");
       printImpl(interfaces, "  - implements:\n", false);
     }
@@ -119,110 +136,109 @@
   private static final String SHA_001 = "IKUiHr1YvEGLPsKj1XVCnvkJpxY";
 
   @Nonnull
-  private static final String TEST001_NONE = "" +
+  private static final String TEST001_NONE = orderedByTypeName(
       new Class(lambda(PKG_001, SHA_001, 0), types(PKG_001, "I0"))
-          .methods("<init>()V", "foo()V", "$m$0()V") +
+          .methods("<init>()V", "foo()V", "$m$0()V"),
       new Class(lambda(PKG_001, SHA_001, 1), types(PKG_001, "I0"))
-          .methods("<init>()V", "foo()V", "$m$0()V") +
+          .methods("<init>()V", "foo()V", "$m$0()V"),
       new Class(lambda(PKG_001, SHA_001, 10), types(PKG_001, "TestB"))
           .fields("-$f0:Ljava/lang/Object;", "-$f1:Ljava/lang/Object;")
           .methods("<init>(Ljava/lang/Object;Ljava/lang/Object;)V",
               "foo(Ljava/lang/String;)Ljava/lang/String;",
-              "$m$0(Ljava/lang/String;)Ljava/lang/String;") +
+              "$m$0(Ljava/lang/String;)Ljava/lang/String;"),
       new Class(lambda(PKG_001, SHA_001, 11), types(PKG_001, "TestB"))
           .fields("-$f0:Ljava/lang/Object;", "-$f1:Ljava/lang/Object;")
           .methods("<init>(Ljava/lang/Object;Ljava/lang/Object;)V",
               "foo(Ljava/lang/String;)Ljava/lang/String;",
-              "$m$0(Ljava/lang/String;)Ljava/lang/String;") +
+              "$m$0(Ljava/lang/String;)Ljava/lang/String;"),
       new Class(lambda(PKG_001, SHA_001, 12), types(PKG_001, "TestB"))
           .fields("-$f0:I", "-$f1:Ljava/lang/Object;")
           .methods("<init>(ILjava/lang/Object;)V",
               "foo(Ljava/lang/String;)Ljava/lang/String;",
-              "$m$0(Ljava/lang/String;)Ljava/lang/String;") +
+              "$m$0(Ljava/lang/String;)Ljava/lang/String;"),
       new Class(lambda(PKG_001, SHA_001, 13), types(PKG_001, "TestB"))
           .fields("-$f0:I", "-$f1:Ljava/lang/Object;")
           .methods("<init>(ILjava/lang/Object;)V",
               "foo(Ljava/lang/String;)Ljava/lang/String;",
-              "$m$0(Ljava/lang/String;)Ljava/lang/String;") +
+              "$m$0(Ljava/lang/String;)Ljava/lang/String;"),
       new Class(lambda(PKG_001, SHA_001, 14), types(PKG_001, "TestB"))
           .fields("-$f0:Z", "-$f1:B", "-$f2:C", "-$f3:D", "-$f4:F", "-$f5:I", "-$f6:J", "-$f7:S",
               "-$f8:Ljava/lang/Object;")
           .methods("<init>(ZBCDFIJSLjava/lang/Object;)V",
               "foo(Ljava/lang/String;)Ljava/lang/String;",
-              "$m$0(Ljava/lang/String;)Ljava/lang/String;") +
+              "$m$0(Ljava/lang/String;)Ljava/lang/String;"),
       new Class(lambda(PKG_001, SHA_001, 15), types(PKG_001, "TestB"))
           .fields("-$f0:Z", "-$f1:B", "-$f2:C", "-$f3:D", "-$f4:F", "-$f5:I", "-$f6:J", "-$f7:S",
               "-$f8:Ljava/lang/Object;")
           .methods("<init>(ZBCDFIJSLjava/lang/Object;)V",
               "foo(Ljava/lang/String;)Ljava/lang/String;",
-              "$m$0(Ljava/lang/String;)Ljava/lang/String;") +
+              "$m$0(Ljava/lang/String;)Ljava/lang/String;"),
       new Class(lambda(PKG_001, SHA_001, 16), types(PKG_001, "TestB"))
           .fields("-$f0:Z", "-$f1:B", "-$f2:C", "-$f3:D", "-$f4:F", "-$f5:I", "-$f6:J", "-$f7:S",
               "-$f8:Ljava/lang/Object;")
           .methods("<init>(ZBCDFIJSLjava/lang/Object;)V",
               "foo(Ljava/lang/String;)Ljava/lang/String;",
-              "$m$0(Ljava/lang/String;)Ljava/lang/String;") +
+              "$m$0(Ljava/lang/String;)Ljava/lang/String;"),
       new Class(lambda(PKG_001, SHA_001, 2), types(PKG_001, "I0"))
-          .methods("<init>()V", "foo()V", "$m$0()V") +
+          .methods("<init>()V", "foo()V", "$m$0()V"),
       new Class(lambda(PKG_001, SHA_001, 3), types(PKG_001, "I1"))
-          .methods("<init>()V", "bar(I)I", "$m$0(I)I") +
+          .methods("<init>()V", "bar(I)I", "$m$0(I)I"),
       new Class(lambda(PKG_001, SHA_001, 4), types(PKG_001, "IA"))
-          .methods("<init>()V", "foo()Ljava/lang/Object;", "$m$0()Ljava/lang/Object;") +
+          .methods("<init>()V", "foo()Ljava/lang/Object;", "$m$0()Ljava/lang/Object;"),
       new Class(lambda(PKG_001, SHA_001, 5), types(PKG_001, "IA"))
-          .methods("<init>()V", "foo()Ljava/lang/Object;", "$m$0()Ljava/lang/Object;") +
+          .methods("<init>()V", "foo()Ljava/lang/Object;", "$m$0()Ljava/lang/Object;"),
       new Class(lambda(PKG_001, SHA_001, 6), types(PKG_001, "IA"))
-          .methods("<init>()V", "foo()Ljava/lang/Object;", "$m$0()Ljava/lang/Object;") +
+          .methods("<init>()V", "foo()Ljava/lang/Object;", "$m$0()Ljava/lang/Object;"),
       new Class(lambda(PKG_001, SHA_001, 7), types(PKG_001, "IB"))
           .methods("<init>()V", "foo()Ljava/lang/Object;", "foo()Ljava/lang/Integer;",
-              "$m$0()Ljava/lang/Integer;", "$m$1()Ljava/lang/Object;") +
+              "$m$0()Ljava/lang/Integer;", "$m$1()Ljava/lang/Object;"),
       new Class(lambda(PKG_001, SHA_001, 8), types(PKG_001, "TestB"))
           .fields("-$f0:Ljava/lang/Object;")
           .methods("<init>(Ljava/lang/Object;)V", "foo(Ljava/lang/String;)Ljava/lang/String;",
-              "$m$0(Ljava/lang/String;)Ljava/lang/String;") +
+              "$m$0(Ljava/lang/String;)Ljava/lang/String;"),
       new Class(lambda(PKG_001, SHA_001, 9), types(PKG_001, "TestB"))
           .fields("-$f0:Ljava/lang/Object;")
           .methods("<init>(Ljava/lang/Object;)V", "foo(Ljava/lang/String;)Ljava/lang/String;",
-              "$m$0(Ljava/lang/String;)Ljava/lang/String;") +
-      "";
+              "$m$0(Ljava/lang/String;)Ljava/lang/String;"));
 
   @Nonnull
-  private static final String TEST001_PACKAGE = "" +
+  private static final String TEST001_PACKAGE = orderedByTypeName(
       new Class(lambda(PKG_001, SHA_001, 0), types(PKG_001, "I0"))
           .fields("$id:B")
-          .methods("<init>(B)V", "$m$0()V", "$m$1()V", "$m$2()V", "foo()V") +
+          .methods("<init>(B)V", "$m$0()V", "$m$1()V", "$m$2()V", "foo()V"),
       new Class(lambda(PKG_001, SHA_001, 1), types(PKG_001, "I1"))
-          .methods("<init>()V", "$m$0(I)I", "bar(I)I") +
+          .methods("<init>()V", "$m$0(I)I", "bar(I)I"),
       new Class(lambda(PKG_001, SHA_001, 2), types(PKG_001, "IA"))
           .fields("$id:B")
           .methods("<init>(B)V",
               "$m$0()Ljava/lang/Object;",
               "$m$1()Ljava/lang/Object;",
               "$m$2()Ljava/lang/Object;",
-              "foo()Ljava/lang/Object;") +
+              "foo()Ljava/lang/Object;"),
       new Class(lambda(PKG_001, SHA_001, 3), types(PKG_001, "IB"))
           .methods("<init>()V",
               "$m$0()Ljava/lang/Integer;",
               "$m$1()Ljava/lang/Object;",
               "foo()Ljava/lang/Integer;",
-              "foo()Ljava/lang/Object;") +
+              "foo()Ljava/lang/Object;"),
       new Class(lambda(PKG_001, SHA_001, 4), types(PKG_001, "TestB"))
           .fields("-$f0:Ljava/lang/Object;", "$id:B")
           .methods("<init>(BLjava/lang/Object;)V",
               "$m$0(Ljava/lang/String;)Ljava/lang/String;",
               "$m$1(Ljava/lang/String;)Ljava/lang/String;",
-              "foo(Ljava/lang/String;)Ljava/lang/String;") +
+              "foo(Ljava/lang/String;)Ljava/lang/String;"),
       new Class(lambda(PKG_001, SHA_001, 5), types(PKG_001, "TestB"))
           .fields("-$f0:Ljava/lang/Object;", "-$f1:Ljava/lang/Object;", "$id:B")
           .methods("<init>(BLjava/lang/Object;Ljava/lang/Object;)V",
               "$m$0(Ljava/lang/String;)Ljava/lang/String;",
               "$m$1(Ljava/lang/String;)Ljava/lang/String;",
-              "foo(Ljava/lang/String;)Ljava/lang/String;") +
+              "foo(Ljava/lang/String;)Ljava/lang/String;"),
       new Class(lambda(PKG_001, SHA_001, 6), types(PKG_001, "TestB"))
           .fields("-$f0:I", "-$f1:Ljava/lang/Object;", "$id:B")
           .methods("<init>(BILjava/lang/Object;)V",
               "$m$0(Ljava/lang/String;)Ljava/lang/String;",
               "$m$1(Ljava/lang/String;)Ljava/lang/String;",
-              "foo(Ljava/lang/String;)Ljava/lang/String;") +
+              "foo(Ljava/lang/String;)Ljava/lang/String;"),
       new Class(lambda(PKG_001, SHA_001, 7), types(PKG_001, "TestB"))
           .fields("-$f0:Z", "-$f1:B", "-$f2:C", "-$f3:D", "-$f4:F",
               "-$f5:I", "-$f6:J", "-$f7:S", "-$f8:Ljava/lang/Object;", "$id:B")
@@ -230,10 +246,10 @@
               "$m$0(Ljava/lang/String;)Ljava/lang/String;",
               "$m$1(Ljava/lang/String;)Ljava/lang/String;",
               "$m$2(Ljava/lang/String;)Ljava/lang/String;",
-              "foo(Ljava/lang/String;)Ljava/lang/String;");
+              "foo(Ljava/lang/String;)Ljava/lang/String;"));
 
   @Nonnull
-  private static final String TEST001_PACKAGE_INTERFACE = "" +
+  private static final String TEST001_PACKAGE_INTERFACE = orderedByTypeName(
       new Class(lambda(PKG_001, SHA_001, 0), types(PKG_001, "I0", "I1", "IA", "IB"))
           .fields("$id:B")
           .methods("<init>(B)V",
@@ -249,25 +265,25 @@
               "bar(I)I",
               "foo()Ljava/lang/Integer;",
               "foo()Ljava/lang/Object;",
-              "foo()V") +
+              "foo()V"),
       new Class(lambda(PKG_001, SHA_001, 1), types(PKG_001, "TestB"))
           .fields("$id:B", "-$f0:Ljava/lang/Object;")
           .methods("<init>(BLjava/lang/Object;)V",
               "$m$0(Ljava/lang/String;)Ljava/lang/String;",
               "$m$1(Ljava/lang/String;)Ljava/lang/String;",
-              "foo(Ljava/lang/String;)Ljava/lang/String;") +
+              "foo(Ljava/lang/String;)Ljava/lang/String;"),
       new Class(lambda(PKG_001, SHA_001, 2), types(PKG_001, "TestB"))
           .fields("$id:B", "-$f0:Ljava/lang/Object;", "-$f1:Ljava/lang/Object;")
           .methods("<init>(BLjava/lang/Object;Ljava/lang/Object;)V",
               "$m$0(Ljava/lang/String;)Ljava/lang/String;",
               "$m$1(Ljava/lang/String;)Ljava/lang/String;",
-              "foo(Ljava/lang/String;)Ljava/lang/String;") +
+              "foo(Ljava/lang/String;)Ljava/lang/String;"),
       new Class(lambda(PKG_001, SHA_001, 3), types(PKG_001, "TestB"))
           .fields("$id:B", "-$f0:I", "-$f1:Ljava/lang/Object;")
           .methods("<init>(BILjava/lang/Object;)V",
               "$m$0(Ljava/lang/String;)Ljava/lang/String;",
               "$m$1(Ljava/lang/String;)Ljava/lang/String;",
-              "foo(Ljava/lang/String;)Ljava/lang/String;") +
+              "foo(Ljava/lang/String;)Ljava/lang/String;"),
       new Class(lambda(PKG_001, SHA_001, 4), types(PKG_001, "TestB"))
           .fields("$id:B", "-$f0:Z", "-$f1:B", "-$f2:C", "-$f3:D",
               "-$f4:F", "-$f5:I", "-$f6:J", "-$f7:S", "-$f8:Ljava/lang/Object;")
@@ -275,7 +291,7 @@
               "$m$0(Ljava/lang/String;)Ljava/lang/String;",
               "$m$1(Ljava/lang/String;)Ljava/lang/String;",
               "$m$2(Ljava/lang/String;)Ljava/lang/String;",
-              "foo(Ljava/lang/String;)Ljava/lang/String;");
+              "foo(Ljava/lang/String;)Ljava/lang/String;"));
 
   @Test
   @Runtime
@@ -301,25 +317,24 @@
   private static final String SHA_002 = "rK0qQUOvfPrsTJWpyc2f5mlYYJ8";
 
   @Nonnull
-  private static final String TEST002_NONE = "" +
+  private static final String TEST002_NONE = orderedByTypeName(
       new Class(lambda(PKG_002, SHA_002, 0), types(PKG_002, "I0"))
-          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;") +
+          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;"),
       new Class(lambda(PKG_002, SHA_002, 1), types(PKG_002, "I1"))
-          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;") +
+          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;"),
       new Class(lambda(PKG_002, SHA_002, 2), types(PKG_002, "I2"))
-          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;") +
+          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;"),
       new Class(lambda(PKG_002, SHA_002, 3), types(PKG_002, "I3"))
-          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;") +
+          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;"),
       new Class(lambda(PKG_002, SHA_002, 4), types(PKG_002, "I4"))
-          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;") +
+          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;"),
       new Class(lambda(PKG_002, SHA_002, 5), types(PKG_002, "I5"))
-          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;") +
+          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;"),
       new Class(lambda(PKG_002, SHA_002, 6), types(PKG_002, "I6"))
-          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;") +
-      "";
+          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;"));
 
   @Nonnull
-  private static final String TEST002_PACKAGE_INTERFACE = "" +
+  private static final String TEST002_PACKAGE_INTERFACE = orderedByTypeName(
       new Class(lambda(PKG_002, SHA_002, 0),
           types(PKG_002, "I0", "I1", "I2", "I3", "I4", "I5", "I6"))
           .fields("$id:B")
@@ -331,7 +346,7 @@
               "$m$4()Ljava/lang/String;",
               "$m$5()Ljava/lang/String;",
               "$m$6()Ljava/lang/String;",
-              "foo()Ljava/lang/String;");
+              "foo()Ljava/lang/String;"));
 
   @Test
   @Runtime
@@ -363,24 +378,23 @@
   private static final String SHA_003 = "ONjwHPCPJTN6WB4tZ9kgaFMFflk";
 
   @Nonnull
-  private static final String TEST003_NONE = "" +
+  private static final String TEST003_NONE = orderedByTypeName(
       new Class(lambda(PKG_003, SHA_003, 0), types(PKG_003, "I0"))
-          .methods("<init>()V", "$m$0()Ljava/lang/Object;", "foo()Ljava/lang/Object;") +
+          .methods("<init>()V", "$m$0()Ljava/lang/Object;", "foo()Ljava/lang/Object;"),
       new Class(lambda(PKG_003, SHA_003, 1), types(PKG_003, "I1"))
-          .methods("<init>()V", "$m$0()Ljava/lang/Object;", "foo()Ljava/lang/Object;") +
+          .methods("<init>()V", "$m$0()Ljava/lang/Object;", "foo()Ljava/lang/Object;"),
       new Class(lambda(PKG_003, SHA_003, 2), types(PKG_003, "I3"))
-          .methods("<init>()V", "$m$0()Ljava/lang/Object;", "foo()Ljava/lang/Object;") +
-      "";
+          .methods("<init>()V", "$m$0()Ljava/lang/Object;", "foo()Ljava/lang/Object;"));
 
   @Nonnull
   private static final String TEST003_PACKAGE = TEST003_NONE;
 
   @Nonnull
-  private static final String TEST003_PACKAGE_INTERFACE = "" +
+  private static final String TEST003_PACKAGE_INTERFACE = orderedByTypeName(
       new Class(lambda(PKG_003, SHA_003, 0), types(PKG_003, "I0", "I1", "I3"))
           .fields("$id:B")
           .methods("<init>(B)V", "$m$0()Ljava/lang/Object;",
-              "$m$1()Ljava/lang/Object;", "$m$2()Ljava/lang/Object;", "foo()Ljava/lang/Object;");
+              "$m$1()Ljava/lang/Object;", "$m$2()Ljava/lang/Object;", "foo()Ljava/lang/Object;"));
 
   @Test
   @Runtime
@@ -406,20 +420,20 @@
   private static final String SHA_004 = "kE8tIAUzNtiGWJ6ulIU0a1IEtL4";
 
   @Nonnull
-  private static final String TEST004_PACKAGE = "" +
+  private static final String TEST004_PACKAGE = orderedByTypeName(
       new Class(lambda(PKG_004, SHA_004, 0), types(PKG_004, "I0"))
-          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;") +
+          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;"),
       new Class(lambda(PKG_004, SHA_004, 1), types(PKG_004, "I0", "MarkerA"))
-          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;") +
+          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;"),
       new Class(lambda(PKG_004, SHA_004, 2), types(PKG_004, "I0", "MarkerA", "MarkerB"))
-          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;") +
+          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;"),
       new Class(lambda(PKG_004, SHA_004, 3), types(PKG_004, "I0", "MarkerB"))
-          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;") +
+          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;"),
       new Class(lambda(PKG_004, SHA_004, 4), types(PKG_004, "I1", "MarkerA", "MarkerB"))
-          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;");
+          .methods("<init>()V", "$m$0()Ljava/lang/String;", "foo()Ljava/lang/String;"));
 
   @Nonnull
-  private static final String TEST004_LAMBDA_MERGE = "" +
+  private static final String TEST004_LAMBDA_MERGE = orderedByTypeName(
       new Class(lambda(PKG_004, SHA_004, 0), types(PKG_004, "I0", "I1", "MarkerA", "MarkerB"))
           .fields("$id:B")
           .methods("<init>(B)V",
@@ -428,10 +442,10 @@
               "$m$2()Ljava/lang/String;",
               "$m$3()Ljava/lang/String;",
               "$m$4()Ljava/lang/String;",
-              "foo()Ljava/lang/String;");
+              "foo()Ljava/lang/String;"));
 
   @Nonnull
-  private static final String TEST004_PACKAGE_INTERFACE_STATELESS = "" +
+  private static final String TEST004_PACKAGE_INTERFACE_STATELESS = orderedByTypeName(
       new Class(lambda(PKG_004, SHA_004, 0), types(PKG_004, "I0", "I1", "MarkerA", "MarkerB"))
           .fields("$id:B",
               "$INST$0:" + lambda(PKG_004, SHA_004, 0),
@@ -445,35 +459,35 @@
               "$m$2()Ljava/lang/String;",
               "$m$3()Ljava/lang/String;",
               "$m$4()Ljava/lang/String;",
-              "foo()Ljava/lang/String;");
+              "foo()Ljava/lang/String;"));
 
   @Nonnull
-  private static final String TEST004_PACKAGE_STATELESS = "" +
+  private static final String TEST004_PACKAGE_STATELESS = orderedByTypeName(
       new Class(lambda(PKG_004, SHA_004, 0), types(PKG_004, "I0"))
           .fields("$INST$0:" + lambda(PKG_004, SHA_004, 0))
           .methods("<clinit>()V", "<init>()V",
               "$m$0()Ljava/lang/String;",
-              "foo()Ljava/lang/String;") +
+              "foo()Ljava/lang/String;"),
       new Class(lambda(PKG_004, SHA_004, 1), types(PKG_004, "I0", "MarkerA"))
           .fields("$INST$0:" + lambda(PKG_004, SHA_004, 1))
           .methods("<clinit>()V", "<init>()V",
               "$m$0()Ljava/lang/String;",
-              "foo()Ljava/lang/String;") +
+              "foo()Ljava/lang/String;"),
       new Class(lambda(PKG_004, SHA_004, 2), types(PKG_004, "I0", "MarkerA", "MarkerB"))
           .fields("$INST$0:" + lambda(PKG_004, SHA_004, 2))
           .methods("<clinit>()V", "<init>()V",
               "$m$0()Ljava/lang/String;",
-              "foo()Ljava/lang/String;") +
+              "foo()Ljava/lang/String;"),
       new Class(lambda(PKG_004, SHA_004, 3), types(PKG_004, "I0", "MarkerB"))
           .fields("$INST$0:" + lambda(PKG_004, SHA_004, 3))
           .methods("<clinit>()V", "<init>()V",
               "$m$0()Ljava/lang/String;",
-              "foo()Ljava/lang/String;") +
+              "foo()Ljava/lang/String;"),
       new Class(lambda(PKG_004, SHA_004, 4), types(PKG_004, "I1", "MarkerA", "MarkerB"))
           .fields("$INST$0:" + lambda(PKG_004, SHA_004, 4))
           .methods("<clinit>()V", "<init>()V",
               "$m$0()Ljava/lang/String;",
-              "foo()Ljava/lang/String;");
+              "foo()Ljava/lang/String;"));
 
   @Test
   @Runtime
@@ -503,17 +517,17 @@
   private static final String SHA_005 = "mEUip-rZCi8VUKLKTaQF6NNk0aM";
 
   @Nonnull
-  private static final String TEST005_PACKAGE = "" +
+  private static final String TEST005_PACKAGE = orderedByTypeName(
       new Class(lambda(PKG_005, SHA_005, 0), types(PKG_005, "I0"))
           .fields("$id:B")
           .methods("<init>(B)V",
               "$m$0()Ljava/lang/String;",
               "$m$1()Ljava/lang/String;",
-              "foo()Ljava/lang/String;") +
+              "foo()Ljava/lang/String;"),
       new Class(lambda(PKG_005, SHA_005, 1), types(PKG_005, "I1"))
           .methods("<init>()V",
               "$m$0()Ljava/lang/String;",
-              "bar()Ljava/lang/String;") +
+              "bar()Ljava/lang/String;"),
       new Class(lambda(PKG_005, SHA_005, 2), types(PKG_005, "I0"))
           .fields("$id:B", "-$f0:Ljava/lang/Object;")
           .methods("<init>(BLjava/lang/Object;)V",
@@ -522,16 +536,16 @@
               "$m$2()Ljava/lang/String;",
               "$m$3()Ljava/lang/String;",
               "$m$4()Ljava/lang/String;",
-              "foo()Ljava/lang/String;") +
+              "foo()Ljava/lang/String;"),
       new Class(lambda(PKG_005, SHA_005, 3), types(PKG_005, "I1"))
           .fields("$id:B", "-$f0:Ljava/lang/Object;")
           .methods("<init>(BLjava/lang/Object;)V",
               "$m$0()Ljava/lang/String;",
               "$m$1()Ljava/lang/String;",
-              "bar()Ljava/lang/String;");
+              "bar()Ljava/lang/String;"));
 
   @Nonnull
-  private static final String TEST005_PACKAGE_INTERFACE = "" +
+  private static final String TEST005_PACKAGE_INTERFACE = orderedByTypeName(
       new Class(lambda(PKG_005, SHA_005, 0), types(PKG_005, "I0", "I1"))
           .fields("$id:B")
           .methods("<init>(B)V",
@@ -539,7 +553,7 @@
               "$m$1()Ljava/lang/String;",
               "$m$2()Ljava/lang/String;",
               "bar()Ljava/lang/String;",
-              "foo()Ljava/lang/String;") +
+              "foo()Ljava/lang/String;"),
       new Class(lambda(PKG_005, SHA_005, 1), types(PKG_005, "I0", "I1"))
           .fields("$id:B", "-$f0:Ljava/lang/Object;")
           .methods("<init>(BLjava/lang/Object;)V",
@@ -551,10 +565,10 @@
               "$m$5()Ljava/lang/String;",
               "$m$6()Ljava/lang/String;",
               "bar()Ljava/lang/String;",
-              "foo()Ljava/lang/String;");
+              "foo()Ljava/lang/String;"));
 
   @Nonnull
-  private static final String TEST005_PACKAGE_INTERFACE_STATELESS = "" +
+  private static final String TEST005_PACKAGE_INTERFACE_STATELESS = orderedByTypeName(
       new Class(lambda(PKG_005, SHA_005, 0), types(PKG_005, "I0", "I1"))
           .fields("$id:B",
               "$INST$0:" + lambda(PKG_005, SHA_005, 0),
@@ -565,7 +579,7 @@
               "$m$1()Ljava/lang/String;",
               "$m$2()Ljava/lang/String;",
               "bar()Ljava/lang/String;",
-              "foo()Ljava/lang/String;") +
+              "foo()Ljava/lang/String;"),
       new Class(lambda(PKG_005, SHA_005, 1), types(PKG_005, "I0", "I1"))
           .fields("$id:B", "-$f0:Ljava/lang/Object;")
           .methods("<init>(BLjava/lang/Object;)V",
@@ -577,7 +591,7 @@
               "$m$5()Ljava/lang/String;",
               "$m$6()Ljava/lang/String;",
               "bar()Ljava/lang/String;",
-              "foo()Ljava/lang/String;");
+              "foo()Ljava/lang/String;"));
 
   @Test
   @Runtime
@@ -605,47 +619,44 @@
   private static final String SHA_006_B = "N-kUn0qIgGhcb5JJeaFqgDggm3E";
 
   @Nonnull
-  private static final String TEST006_NONE = "" +
+  private static final String TEST006_NONE = orderedByTypeName(
       new Class(lambda(PKG_006, SHA_006_A, 0), types(PKG_006, "Producer"))
-          .methods("<init>()V", "$m$0()Ljava/lang/String;", "run()Ljava/lang/String;") +
+          .methods("<init>()V", "$m$0()Ljava/lang/String;", "run()Ljava/lang/String;"),
       new Class(lambda(PKG_006, SHA_006_A, 1), types(PKG_006, "Producer"))
-          .methods("<init>()V", "$m$0()Ljava/lang/String;", "run()Ljava/lang/String;") +
+          .methods("<init>()V", "$m$0()Ljava/lang/String;", "run()Ljava/lang/String;"),
       new Class(lambda(PKG_006, SHA_006_A, 2), types(PKG_006, "Producer"))
-          .methods("<init>()V", "$m$0()Ljava/lang/String;", "run()Ljava/lang/String;") +
+          .methods("<init>()V", "$m$0()Ljava/lang/String;", "run()Ljava/lang/String;"),
       new Class(lambda(PKG_006, SHA_006_A, 3), types(PKG_006, "Producer"))
-          .methods("<init>()V", "$m$0()Ljava/lang/String;", "run()Ljava/lang/String;") +
-      new Class(lambda(PKG_006, SHA_006_B, 4), types(PKG_006, "Producer"))
-          .methods("<init>()V", "$m$0()Ljava/lang/String;", "run()Ljava/lang/String;") +
-      new Class(lambda(PKG_006, SHA_006_B, 5), types(PKG_006, "Producer"))
-          .methods("<init>()V", "$m$0()Ljava/lang/String;", "run()Ljava/lang/String;") +
-      new Class(lambda(PKG_006, SHA_006_B, 6), types(PKG_006, "Producer"))
-          .methods("<init>()V", "$m$0()Ljava/lang/String;", "run()Ljava/lang/String;") +
-      "";
+          .methods("<init>()V", "$m$0()Ljava/lang/String;", "run()Ljava/lang/String;"),
+      new Class(lambda(PKG_006, SHA_006_B, 0), types(PKG_006, "Producer"))
+          .methods("<init>()V", "$m$0()Ljava/lang/String;", "run()Ljava/lang/String;"),
+      new Class(lambda(PKG_006, SHA_006_B, 1), types(PKG_006, "Producer"))
+          .methods("<init>()V", "$m$0()Ljava/lang/String;", "run()Ljava/lang/String;"),
+      new Class(lambda(PKG_006, SHA_006_B, 2), types(PKG_006, "Producer"))
+          .methods("<init>()V", "$m$0()Ljava/lang/String;", "run()Ljava/lang/String;"));
 
   @Nonnull
-  private static final String TEST006_TYPE = "" +
+  private static final String TEST006_TYPE = orderedByTypeName(
       new Class(lambda(PKG_006, SHA_006_A, 0), types(PKG_006, "Producer"))
           .fields("$id:B")
           .methods("<init>(B)V", "$m$0()Ljava/lang/String;", "$m$1()Ljava/lang/String;",
-              "$m$2()Ljava/lang/String;", "$m$3()Ljava/lang/String;", "run()Ljava/lang/String;") +
-      new Class(lambda(PKG_006, SHA_006_B, 1), types(PKG_006, "Producer"))
+              "$m$2()Ljava/lang/String;", "$m$3()Ljava/lang/String;", "run()Ljava/lang/String;"),
+      new Class(lambda(PKG_006, SHA_006_B, 0), types(PKG_006, "Producer"))
           .fields("$id:B")
           .methods("<init>(B)V", "$m$0()Ljava/lang/String;", "$m$1()Ljava/lang/String;",
-              "$m$2()Ljava/lang/String;", "run()Ljava/lang/String;") +
-      "";
+              "$m$2()Ljava/lang/String;", "run()Ljava/lang/String;"));
 
   @Nonnull
   private static final String SHA_006_ALL = "aRztprv3kbtT1k5EHkFo2yXbFfg";
 
   @Nonnull
-  private static final String TEST006_PACKAGE = "" +
+  private static final String TEST006_PACKAGE = orderedByTypeName(
       new Class(lambda(PKG_006, SHA_006_ALL, 0), types(PKG_006, "Producer"))
           .fields("$id:B")
           .methods("<init>(B)V", "$m$0()Ljava/lang/String;", "$m$1()Ljava/lang/String;",
               "$m$2()Ljava/lang/String;", "$m$3()Ljava/lang/String;",
               "$m$4()Ljava/lang/String;", "$m$5()Ljava/lang/String;",
-              "$m$6()Ljava/lang/String;", "run()Ljava/lang/String;") +
-      "";
+              "$m$6()Ljava/lang/String;", "run()Ljava/lang/String;"));
 
   @Test
   @Runtime
@@ -671,25 +682,23 @@
   private static final String SHA_007 = "VIf7bh4a9R2eWK07TARcQzoADH4";
 
   @Nonnull
-  private static final String TEST007_DEFAULT = "" +
+  private static final String TEST007_DEFAULT = orderedByTypeName(
       new Class(lambda(PKG_007, SHA_007, 0), types(PKG_007, "Ic", "Ia", "Ib"))
-          .methods("<init>()V", "$m$0()Ljava/lang/String;", "m()Ljava/lang/String;") +
+          .methods("<init>()V", "$m$0()Ljava/lang/String;", "m()Ljava/lang/String;"),
       new Class(lambda(PKG_007, SHA_007, 1), types(PKG_007, "Ic", "Iaa"))
-          .methods("<init>()V", "$m$0()Ljava/lang/String;", "m()Ljava/lang/String;") +
+          .methods("<init>()V", "$m$0()Ljava/lang/String;", "m()Ljava/lang/String;"),
       new Class(lambda(PKG_007, SHA_007, 2), types(PKG_007, "Ic", "Ib"))
-          .methods("<init>()V", "$m$0()Ljava/lang/String;", "m()Ljava/lang/String;") +
+          .methods("<init>()V", "$m$0()Ljava/lang/String;", "m()Ljava/lang/String;"),
       new Class(lambda(PKG_007, SHA_007, 3), types(PKG_007, "Ic", "Ib", "Ia"))
-          .methods("<init>()V", "$m$0()Ljava/lang/String;", "m()Ljava/lang/String;") +
-      "";
+          .methods("<init>()V", "$m$0()Ljava/lang/String;", "m()Ljava/lang/String;"));
 
   @Nonnull
-  private static final String TEST007_MERGE_INTERFACES = "" +
+  private static final String TEST007_MERGE_INTERFACES = orderedByTypeName(
       new Class(lambda(PKG_007, SHA_007, 0), types(PKG_007, "Ia", "Iaa", "Ib", "Ic"))
           .fields("$id:B")
           .methods("<init>(B)V", "m()Ljava/lang/String;",
               "$m$0()Ljava/lang/String;", "$m$1()Ljava/lang/String;",
-              "$m$2()Ljava/lang/String;", "$m$3()Ljava/lang/String;") +
-      "";
+              "$m$2()Ljava/lang/String;", "$m$3()Ljava/lang/String;"));
 
 
   @Test
diff --git a/jack-tests/tests/com/android/jack/optimizations/modifiers/ModifiersTighteningTests.java b/jack-tests/tests/com/android/jack/optimizations/modifiers/ModifiersTighteningTests.java
index a8aa298..bbe4531 100644
--- a/jack-tests/tests/com/android/jack/optimizations/modifiers/ModifiersTighteningTests.java
+++ b/jack-tests/tests/com/android/jack/optimizations/modifiers/ModifiersTighteningTests.java
@@ -26,6 +26,7 @@
 import com.android.jack.test.dex.DexTypeMethodsValidator;
 import com.android.jack.test.junit.KnownIssue;
 import com.android.jack.test.junit.Runtime;
+import com.android.jack.test.toolchain.IncrementalToolchain;
 import com.android.jack.test.toolchain.JillBasedToolchain;
 
 import org.junit.Test;
@@ -153,7 +154,7 @@
 
   @Test
   @Runtime
-  @KnownIssue(candidate = JillBasedToolchain.class)
+  @KnownIssue(candidate = {JillBasedToolchain.class, IncrementalToolchain.class})
   public void test003() throws Exception {
     String testPackage = "com.android.jack.optimizations.modifiers.test003";
 
diff --git a/jack-tests/tests/com/android/jack/optimizations/valuepropagation/ValuePropagationTests.java b/jack-tests/tests/com/android/jack/optimizations/valuepropagation/ValuePropagationTests.java
index 847c139..2ea4490 100644
--- a/jack-tests/tests/com/android/jack/optimizations/valuepropagation/ValuePropagationTests.java
+++ b/jack-tests/tests/com/android/jack/optimizations/valuepropagation/ValuePropagationTests.java
@@ -22,7 +22,9 @@
 import com.android.jack.test.dex.DexOutputBasedTest;
 import com.android.jack.test.dex.DexTypeMethodsValidator;
 import com.android.jack.test.dex.DexTypeMissingMethodValidator;
+import com.android.jack.test.junit.KnownIssue;
 import com.android.jack.test.junit.Runtime;
+import com.android.jack.test.toolchain.IncrementalToolchain;
 
 import org.junit.Test;
 
@@ -59,6 +61,7 @@
 
   @Test
   @Runtime
+  @KnownIssue(candidate=IncrementalToolchain.class)
   public void test001() throws Exception {
     String test = "com.android.jack.optimizations.valuepropagation.test001";
     String aType = "Lcom/android/jack/optimizations/valuepropagation/test001/jack/A;";
@@ -80,6 +83,7 @@
 
   @Test
   @Runtime
+  @KnownIssue(candidate=IncrementalToolchain.class)
   public void test002() throws Exception {
     String test = "com.android.jack.optimizations.valuepropagation.test002";
     String aType = "Lcom/android/jack/optimizations/valuepropagation/test002/jack/A;";
@@ -108,6 +112,7 @@
 
   @Test
   @Runtime
+  @KnownIssue(candidate=IncrementalToolchain.class)
   public void test003() throws Exception {
     String test = "com.android.jack.optimizations.valuepropagation.test003";
     String aType = "Lcom/android/jack/optimizations/valuepropagation/test003/jack/A;";
@@ -146,6 +151,7 @@
 
   @Test
   @Runtime
+  @KnownIssue(candidate=IncrementalToolchain.class)
   public void test004() throws Exception {
     String test = "com.android.jack.optimizations.valuepropagation.test004";
     String aType = "Lcom/android/jack/optimizations/valuepropagation/test004/jack/A;";
@@ -171,6 +177,7 @@
 
   @Test
   @Runtime
+  @KnownIssue(candidate=IncrementalToolchain.class)
   public void test005() throws Exception {
     String test = "com.android.jack.optimizations.valuepropagation.test005";
     String aType = "Lcom/android/jack/optimizations/valuepropagation/test005/jack/A;";
@@ -192,6 +199,7 @@
 
   @Test
   @Runtime
+  @KnownIssue(candidate=IncrementalToolchain.class)
   public void test101() throws Exception {
     String test = "com.android.jack.optimizations.valuepropagation.test101";
     String aType = "Lcom/android/jack/optimizations/valuepropagation/test101/jack/A;";
@@ -216,6 +224,7 @@
 
   @Test
   @Runtime
+  @KnownIssue(candidate=IncrementalToolchain.class)
   public void test102() throws Exception {
     String test = "com.android.jack.optimizations.valuepropagation.test102";
     String aType = "Lcom/android/jack/optimizations/valuepropagation/test102/jack/A;";
@@ -263,6 +272,7 @@
 
   @Test
   @Runtime
+  @KnownIssue(candidate=IncrementalToolchain.class)
   public void test103() throws Exception {
     String test = "com.android.jack.optimizations.valuepropagation.test103";
     String aType = "Lcom/android/jack/optimizations/valuepropagation/test103/jack/A;";
@@ -290,6 +300,7 @@
 
   @Test
   @Runtime
+  @KnownIssue(candidate=IncrementalToolchain.class)
   public void test104() throws Exception {
     String test = "com.android.jack.optimizations.valuepropagation.test104";
     String aType = "Lcom/android/jack/optimizations/valuepropagation/test104/jack/A;";
@@ -320,6 +331,7 @@
 
   @Test
   @Runtime
+  @KnownIssue(candidate=IncrementalToolchain.class)
   public void test105() throws Exception {
     String test = "com.android.jack.optimizations.valuepropagation.test105";
     String aType = "Lcom/android/jack/optimizations/valuepropagation/test105/jack/A;";
@@ -361,6 +373,7 @@
 
   @Test
   @Runtime
+  @KnownIssue(candidate=IncrementalToolchain.class)
   public void test106() throws Exception {
     String test = "com.android.jack.optimizations.valuepropagation.test106";
     String aType = "Lcom/android/jack/optimizations/valuepropagation/test106/jack/A;";
diff --git a/jack-tests/tests/com/android/jack/reflect/ReflectTests.java b/jack-tests/tests/com/android/jack/reflect/ReflectTests.java
index ca29e0d..6ebab40 100644
--- a/jack-tests/tests/com/android/jack/reflect/ReflectTests.java
+++ b/jack-tests/tests/com/android/jack/reflect/ReflectTests.java
@@ -22,6 +22,7 @@
 import com.android.jack.test.runtime.RuntimeTest;
 import com.android.jack.test.runtime.RuntimeTestInfo;
 import com.android.jack.test.toolchain.AbstractTestTools;
+import com.android.jack.test.toolchain.LegacyToolchain;
 import com.android.jack.unary.UnaryTests;
 
 import org.junit.BeforeClass;
@@ -55,7 +56,8 @@
   @Test
   @Runtime
   public void simpleName002() throws Exception {
-    new RuntimeTestHelper(TEST001_WITH_SHRINK_SCHEDULABLE).compileAndRunTest();
+    new RuntimeTestHelper(TEST001_WITH_SHRINK_SCHEDULABLE)
+        .addIgnoredCandidateToolchain(LegacyToolchain.class).compileAndRunTest();
   }
 
   @Override
diff --git a/jack-tests/tests/com/android/jack/resource/ResourceTests.java b/jack-tests/tests/com/android/jack/resource/ResourceTests.java
index e61ab6e..e740159 100644
--- a/jack-tests/tests/com/android/jack/resource/ResourceTests.java
+++ b/jack-tests/tests/com/android/jack/resource/ResourceTests.java
@@ -20,10 +20,8 @@
 import com.android.jack.library.FileTypeDoesNotExistException;
 import com.android.jack.library.InputJackLibrary;
 import com.android.jack.shrob.obfuscation.NameProviderFactory;
-import com.android.jack.test.junit.KnownIssue;
 import com.android.jack.test.toolchain.AbstractTestTools;
 import com.android.jack.test.toolchain.IToolchain;
-import com.android.jack.test.toolchain.IncrementalToolchain;
 import com.android.jack.test.toolchain.JackApiToolchainBase;
 import com.android.jack.test.toolchain.JackBasedToolchain;
 import com.android.jack.test.toolchain.JillApiToolchainBase;
@@ -206,7 +204,6 @@
   }
 
   @Test
-  @KnownIssue(candidate=IncrementalToolchain.class)
   public void testJackArchiveToJackDir() throws Exception {
     // compile source file to a Jack archive and add resources
     File jackAr = createJackArchiveWithResources();
@@ -234,7 +231,6 @@
   }
 
   @Test
-  @KnownIssue(candidate=IncrementalToolchain.class)
   public void testJackDirToJackDir() throws Exception {
     // compile source file to a Jack dir
     File jackFolder = AbstractTestTools.createTempDir();
diff --git a/jack-tests/tests/com/android/jack/shrob/ObfuscationWithoutMappingTests.java b/jack-tests/tests/com/android/jack/shrob/ObfuscationWithoutMappingTests.java
index a5dab7b..7f6d639 100644
--- a/jack-tests/tests/com/android/jack/shrob/ObfuscationWithoutMappingTests.java
+++ b/jack-tests/tests/com/android/jack/shrob/ObfuscationWithoutMappingTests.java
@@ -130,6 +130,38 @@
     super.test15_001();
   }
 
+  @Test
+  @Runtime
+  public void test49_001() throws Exception {
+    runTest("049", "001", "");
+  }
+
+  @Test
+  @Runtime
+  public void test51() throws Exception {
+    String testPackageName = "com.android.jack.shrob.test051";
+    File testFolder = AbstractTestTools.getTestRootDir(testPackageName);
+    File proguardFlagsFile = new File(testFolder, "proguard.flags001");
+    ByteArrayOutputStream errOut = new ByteArrayOutputStream();
+
+    try {
+      List<Class<? extends IToolchain>> excludeList = new ArrayList<Class<? extends IToolchain>>(1);
+      excludeList.add(JackCliToolchain.class);
+      IToolchain toolchain =
+          AbstractTestTools.getCandidateToolchain(JackBasedToolchain.class, excludeList);
+      toolchain.setErrorStream(errOut);
+      toolchain.addToClasspath(toolchain.getDefaultBootClasspath())
+          .addProguardFlags(proguardFlagsFile).srcToExe(AbstractTestTools.createTempDir(),
+              /* zipFile = */false, AbstractTestTools.getTestRootDir(testPackageName + ".jack"));
+      Assert.fail();
+    } catch (JackAbortException jae) {
+      Assert.assertTrue(jae.getCause() instanceof MappingContextException);
+      String errString = errOut.toString();
+      Assert.assertTrue(errString.contains("could not be renamed to " +
+      "'com.android.jack.shrob.test051.jack.C' since the name was already used"));
+    }
+  }
+
   /**
    * Test Obfuscation when a whole package is missing from the classpath.
    */
@@ -235,6 +267,11 @@
     runTest("056", "001", "");
   }
 
+  @Test
+  public void test58_001() throws Exception {
+    runTest("058", "001", "");
+  }
+
   @Nonnull
   private static File shrobTestsDir =
       AbstractTestTools.getTestRootDir("com.android.jack.shrob");
diff --git a/jack-tests/tests/com/android/jack/shrob/ShrinkMultiDexTests.java b/jack-tests/tests/com/android/jack/shrob/ShrinkMultiDexTests.java
index 6936e92..8ea98c4 100644
--- a/jack-tests/tests/com/android/jack/shrob/ShrinkMultiDexTests.java
+++ b/jack-tests/tests/com/android/jack/shrob/ShrinkMultiDexTests.java
@@ -25,9 +25,11 @@
 import com.android.jack.test.category.SlowTests;
 import com.android.jack.test.comparator.ComparatorMapping;
 import com.android.jack.test.helper.SourceToDexComparisonTestHelper;
+import com.android.jack.test.junit.KnownIssue;
 import com.android.jack.test.toolchain.AbstractTestTools;
 import com.android.jack.test.toolchain.DummyToolchain;
 import com.android.jack.test.toolchain.IToolchain;
+import com.android.jack.test.toolchain.IncrementalToolchain;
 import com.android.jack.test.toolchain.JackBasedToolchain;
 import com.android.jack.test.toolchain.TwoStepsToolchain;
 
@@ -151,6 +153,12 @@
     super.test1_016();
   }
 
+  @Override
+  @KnownIssue(candidate=IncrementalToolchain.class)
+  public void test5_005() throws Exception {
+    super.test5_005();
+  }
+
   @Test
   @Override
   public void test8_001() throws Exception {
@@ -166,6 +174,12 @@
     super.test11_002();
   }
 
+  @Override
+  @KnownIssue(candidate=IncrementalToolchain.class)
+  public void test16_001() throws Exception {
+    super.test16_001();
+  }
+
   @Test
   @Override
   public void test17_001() throws Exception {
diff --git a/jack-tests/tests/com/android/jack/shrob/ShrobRuntimeTests.java b/jack-tests/tests/com/android/jack/shrob/ShrobRuntimeTests.java
index 874ca17..dec6a2f 100644
--- a/jack-tests/tests/com/android/jack/shrob/ShrobRuntimeTests.java
+++ b/jack-tests/tests/com/android/jack/shrob/ShrobRuntimeTests.java
@@ -16,6 +16,7 @@
 
 package com.android.jack.shrob;
 
+import com.android.jack.shrob.shrink.MappingCollisionException;
 import com.android.jack.test.helper.RuntimeTestHelper;
 import com.android.jack.test.junit.KnownIssue;
 import com.android.jack.test.junit.Runtime;
@@ -23,6 +24,9 @@
 import com.android.jack.test.runtime.RuntimeTestInfo;
 import com.android.jack.test.toolchain.AbstractTestTools;
 import com.android.jack.test.toolchain.JillBasedToolchain;
+import com.android.jack.test.toolchain.LegacyToolchain;
+
+import junit.framework.Assert;
 
 import org.junit.Test;
 
@@ -42,6 +46,16 @@
       "com.android.jack.shrob.test016.dx.Tests").addProguardFlagsFileName("proguard.flags001")
       .addProguardFlagsFileName("applyMapping.flags");
 
+  private RuntimeTestInfo TEST016_003 = new RuntimeTestInfo(
+      AbstractTestTools.getTestRootDir("com.android.jack.shrob.test016"),
+      "com.android.jack.shrob.test016.dx.Tests").addProguardFlagsFileName("proguard.flags003")
+      .addProguardFlagsFileName("applyMapping.flags");
+
+  private RuntimeTestInfo TEST016_004 = new RuntimeTestInfo(
+      AbstractTestTools.getTestRootDir("com.android.jack.shrob.test016"),
+      "com.android.jack.shrob.test016.dx.Tests2").addProguardFlagsFileName("proguard.flags004")
+      .addProguardFlagsFileName("applyMapping.flags");
+
   private RuntimeTestInfo TEST025 = new RuntimeTestInfo(
       AbstractTestTools.getTestRootDir("com.android.jack.shrob.test025"),
       "com.android.jack.shrob.test025.dx.Tests").addProguardFlagsFileName("proguard.flags001");
@@ -87,6 +101,22 @@
   @Runtime
   public void test016() throws Exception {
     new RuntimeTestHelper(TEST016)
+    .addIgnoredCandidateToolchain(LegacyToolchain.class)
+    .compileAndRunTest();
+  }
+
+  @Test
+  @Runtime
+  public void test016_003() throws Exception {
+    new RuntimeTestHelper(TEST016_003)
+    .addIgnoredCandidateToolchain(LegacyToolchain.class)
+    .compileAndRunTest();
+  }
+
+  @Test
+  @Runtime
+  public void test016_004() throws Exception {
+    new RuntimeTestHelper(TEST016_004)
     .compileAndRunTest();
   }
 
diff --git a/jack-tests/tests/com/android/jack/shrob/test009/proguard.flags003 b/jack-tests/tests/com/android/jack/shrob/test009/proguard.flags003
index fc2359a..e6ff9df 100644
--- a/jack-tests/tests/com/android/jack/shrob/test009/proguard.flags003
+++ b/jack-tests/tests/com/android/jack/shrob/test009/proguard.flags003
@@ -1,3 +1,3 @@
 -keep class ** {
-  void m(int,...,long,...);
+  void m(int,...,long);
 }
\ No newline at end of file
diff --git a/jack-tests/tests/com/android/jack/shrob/test011/jack/A.java b/jack-tests/tests/com/android/jack/shrob/test011/jack/A.java
index c424112..f4d2521 100644
--- a/jack-tests/tests/com/android/jack/shrob/test011/jack/A.java
+++ b/jack-tests/tests/com/android/jack/shrob/test011/jack/A.java
@@ -26,7 +26,7 @@
     Object o = bClass.newInstance();
 
     try {
-      String cName = "com.android.jack.shrob.test011.jack.C";
+      final String cName = "com.android.jack.shrob.test011.jack.C";
       Class<?> cClass = Class.forName(cName);
       throw new RuntimeException();
     } catch (ClassNotFoundException e) {
diff --git a/jack-tests/tests/com/android/jack/shrob/test016/dx/Tests2.java b/jack-tests/tests/com/android/jack/shrob/test016/dx/Tests2.java
new file mode 100644
index 0000000..a705327
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/shrob/test016/dx/Tests2.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.shrob.test016.dx;
+
+import com.android.jack.shrob.test016.jack.KeepClass;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+
+public class Tests2 {
+
+  @Test
+  public void test() {
+    Assert.assertEquals("com.android.jack.shrob.test016.jack.A", KeepClass.value());
+    Assert.assertEquals("Lcom.android.jack.shrob.test016.jack.A;", KeepClass.value2());
+    Assert.assertEquals("com/android/jack/shrob/test016/jack/A", KeepClass.value3());
+    Assert.assertEquals("Lcom/android/jack/shrob/test016/jack/A;", KeepClass.value4());
+    Assert.assertEquals("A", KeepClass.value5());
+    Assert.assertEquals("[com.android.jack.shrob.test016.jack.A", KeepClass.value6());
+    Assert.assertEquals("com.android.jack.shrob.test016.jack.A[]", KeepClass.value7());
+    Assert.assertEquals("dfgdgcom.android.jack.shrob.test016.jack.A", KeepClass.value8());
+    Assert.assertEquals("com.android.jack.shrob.test016.jack.Afgdg", KeepClass.value9());
+  }
+}
diff --git a/jack-tests/tests/com/android/jack/shrob/test016/proguard.flags003 b/jack-tests/tests/com/android/jack/shrob/test016/proguard.flags003
new file mode 100644
index 0000000..c5b4503
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/shrob/test016/proguard.flags003
@@ -0,0 +1,8 @@
+-dontshrink
+-keepclassmembernames class ** {
+  <methods>;
+}
+-adaptclassstrings com.android.jack.shrob.test016.jack.KeepClass
+-keepattributes RuntimeVisibleAnnotations
+
+-keepnames class com.android.jack.shrob.test016.jack.KeepClass,**.KeepClass2,**.KeepClass3
diff --git a/jack-tests/tests/com/android/jack/shrob/test016/proguard.flags004 b/jack-tests/tests/com/android/jack/shrob/test016/proguard.flags004
new file mode 100644
index 0000000..e27433b
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/shrob/test016/proguard.flags004
@@ -0,0 +1,8 @@
+-dontshrink
+-keepclassmembernames class ** {
+  <methods>;
+}
+-adaptclassstrings !**.KeepClass
+-keepattributes RuntimeVisibleAnnotations
+
+-keepnames class com.android.jack.shrob.test016.jack.KeepClass,**.KeepClass2,**.KeepClass3
diff --git a/jack-tests/tests/com/android/jack/shrob/test048/proguard.flags001 b/jack-tests/tests/com/android/jack/shrob/test048/proguard.flags001
index 24f0192..507dc64 100644
--- a/jack-tests/tests/com/android/jack/shrob/test048/proguard.flags001
+++ b/jack-tests/tests/com/android/jack/shrob/test048/proguard.flags001
@@ -1,5 +1,6 @@
 -dontshrink
 -applymapping mapping.txt
+-adaptclassstrings
 
 -keepclasseswithmembers public class * {
     public static java.lang.String testMethod();
diff --git a/jack-tests/tests/com/android/jack/shrob/test049/info.txt b/jack-tests/tests/com/android/jack/shrob/test049/info.txt
new file mode 100644
index 0000000..3591acd
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/shrob/test049/info.txt
@@ -0,0 +1,2 @@
+This test contains a class which contains an inner class and members using this
+inner class.
\ No newline at end of file
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInitWithVariableInit.java b/jack-tests/tests/com/android/jack/shrob/test049/jack/MyClass.java
similarity index 72%
copy from jack-tests/tests/com/android/jack/clinit/jack/ClInitWithVariableInit.java
copy to jack-tests/tests/com/android/jack/shrob/test049/jack/MyClass.java
index 8c344dd..69a3cff 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInitWithVariableInit.java
+++ b/jack-tests/tests/com/android/jack/shrob/test049/jack/MyClass.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2016 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,11 +14,12 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.shrob.test049.jack;
 
-public class ClInitWithVariableInit {
+public class MyClass implements MyInterface {
+  public static Inner<Object> field;
 
-  static {
-    int lv = 5;
+  public static class Inner <T> {
+
   }
 }
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java b/jack-tests/tests/com/android/jack/shrob/test049/jack/MyInterface.java
similarity index 80%
copy from jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
copy to jack-tests/tests/com/android/jack/shrob/test049/jack/MyInterface.java
index 680f9cf..98bd095 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
+++ b/jack-tests/tests/com/android/jack/shrob/test049/jack/MyInterface.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2016 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.shrob.test049.jack;
 
-public class ClInit {
-
+public interface MyInterface {
 }
diff --git a/jack-tests/tests/com/android/jack/shrob/test049/proguard.flags001 b/jack-tests/tests/com/android/jack/shrob/test049/proguard.flags001
new file mode 100644
index 0000000..8d0683b
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/shrob/test049/proguard.flags001
@@ -0,0 +1,4 @@
+-dontshrink
+-keepclassmembernames class * implements **.MyInterface {
+  public static com.android.jack.shrob.test049.jack.MyClass$Inner field;
+}
diff --git a/jack-tests/tests/com/android/jack/shrob/test049/refsObfuscationWithoutMapping/expected-001.txt b/jack-tests/tests/com/android/jack/shrob/test049/refsObfuscationWithoutMapping/expected-001.txt
new file mode 100644
index 0000000..4e4ee9e
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/shrob/test049/refsObfuscationWithoutMapping/expected-001.txt
@@ -0,0 +1,6 @@
+com.android.jack.shrob.test049.jack.MyInterface -> pbz.naqebvq.wnpx.fuebo.grfg049.wnpx.ZlVagresnpr:
+com.android.jack.shrob.test049.jack.MyClass -> pbz.naqebvq.wnpx.fuebo.grfg049.wnpx.ZlPynff:
+    com.android.jack.shrob.test049.jack.MyClass$Inner field -> field
+    void <init>() -> <init>
+com.android.jack.shrob.test049.jack.MyClass$Inner -> pbz.naqebvq.wnpx.fuebo.grfg049.wnpx.ZlPynff$Vaare:
+    void <init>() -> <init>
\ No newline at end of file
diff --git a/jack-tests/tests/com/android/jack/shrob/test051/info.txt b/jack-tests/tests/com/android/jack/shrob/test051/info.txt
new file mode 100644
index 0000000..1069f85
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/shrob/test051/info.txt
@@ -0,0 +1 @@
+This test contains two classes obfuscated with the same name
\ No newline at end of file
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java b/jack-tests/tests/com/android/jack/shrob/test051/jack/A.java
similarity index 82%
copy from jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
copy to jack-tests/tests/com/android/jack/shrob/test051/jack/A.java
index 680f9cf..e059035 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
+++ b/jack-tests/tests/com/android/jack/shrob/test051/jack/A.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2015 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.shrob.test051.jack;
 
-public class ClInit {
-
+public class A {
 }
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java b/jack-tests/tests/com/android/jack/shrob/test051/jack/B.java
similarity index 82%
copy from jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
copy to jack-tests/tests/com/android/jack/shrob/test051/jack/B.java
index 680f9cf..a9c3f3b 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
+++ b/jack-tests/tests/com/android/jack/shrob/test051/jack/B.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2015 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.shrob.test051.jack;
 
-public class ClInit {
-
+public class B {
 }
diff --git a/jack-tests/tests/com/android/jack/shrob/test051/mapping.flags b/jack-tests/tests/com/android/jack/shrob/test051/mapping.flags
new file mode 100644
index 0000000..9c6ffe6
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/shrob/test051/mapping.flags
@@ -0,0 +1,2 @@
+com.android.jack.shrob.test051.jack.A -> com.android.jack.shrob.test051.jack.C:
+com.android.jack.shrob.test051.jack.B -> com.android.jack.shrob.test051.jack.C:
\ No newline at end of file
diff --git a/jack-tests/tests/com/android/jack/shrob/test051/proguard.flags001 b/jack-tests/tests/com/android/jack/shrob/test051/proguard.flags001
new file mode 100644
index 0000000..3ffecb5
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/shrob/test051/proguard.flags001
@@ -0,0 +1,2 @@
+-dontshrink
+-applymapping mapping.flags
\ No newline at end of file
diff --git a/jack-tests/tests/com/android/jack/shrob/test058/info.txt b/jack-tests/tests/com/android/jack/shrob/test058/info.txt
new file mode 100644
index 0000000..3591acd
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/shrob/test058/info.txt
@@ -0,0 +1,2 @@
+This test contains a class which contains an inner class and members using this
+inner class.
\ No newline at end of file
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java b/jack-tests/tests/com/android/jack/shrob/test058/jack/MyClass.java
similarity index 66%
copy from jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
copy to jack-tests/tests/com/android/jack/shrob/test058/jack/MyClass.java
index 680f9cf..d6d7ddc 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
+++ b/jack-tests/tests/com/android/jack/shrob/test058/jack/MyClass.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2016 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,16 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.shrob.test058.jack;
 
-public class ClInit {
+public class MyClass implements MyInterface {
+  public static final Inner<Object> field = null;
 
+  public Inner m(Inner t) {
+    return null;
+  }
+
+  public static class Inner <T> {
+
+  }
 }
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java b/jack-tests/tests/com/android/jack/shrob/test058/jack/MyInterface.java
similarity index 80%
copy from jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
copy to jack-tests/tests/com/android/jack/shrob/test058/jack/MyInterface.java
index 680f9cf..38bc8d9 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
+++ b/jack-tests/tests/com/android/jack/shrob/test058/jack/MyInterface.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2016 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.shrob.test058.jack;
 
-public class ClInit {
-
+public interface MyInterface {
 }
diff --git a/jack-tests/tests/com/android/jack/shrob/test058/proguard.flags001 b/jack-tests/tests/com/android/jack/shrob/test058/proguard.flags001
new file mode 100644
index 0000000..d3092c4
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/shrob/test058/proguard.flags001
@@ -0,0 +1,6 @@
+-keep, allowobfuscation class **.MyClass
+-keepclassmembers class * implements **.MyInterface {
+  public static final *.* field;
+  public *.* m(...);
+  public *** m(*.*);
+}
\ No newline at end of file
diff --git a/jack-tests/tests/com/android/jack/shrob/test058/refsObfuscationWithoutMapping/expected-001.txt b/jack-tests/tests/com/android/jack/shrob/test058/refsObfuscationWithoutMapping/expected-001.txt
new file mode 100644
index 0000000..8b4b00c
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/shrob/test058/refsObfuscationWithoutMapping/expected-001.txt
@@ -0,0 +1,2 @@
+com.android.jack.shrob.test058.jack.MyClass -> pbz.naqebvq.wnpx.fuebo.grfg058.wnpx.ZlPynff:
+    void <init>() -> <init>
\ No newline at end of file
diff --git a/jack-tests/tests/com/android/jack/string/StringTests.java b/jack-tests/tests/com/android/jack/string/StringTests.java
index 93ce8ed..b459542 100644
--- a/jack-tests/tests/com/android/jack/string/StringTests.java
+++ b/jack-tests/tests/com/android/jack/string/StringTests.java
@@ -41,7 +41,9 @@
     AbstractTestTools.getTestRootDir("com.android.jack.string.concat003"),
     "com.android.jack.string.concat003.dx.Tests");
 
-
+  private RuntimeTestInfo CONCAT004 = new RuntimeTestInfo(
+      AbstractTestTools.getTestRootDir("com.android.jack.string.concat004"),
+      "com.android.jack.string.concat004.jack.Tests").setSrcDirName("");
 
   @Test
   public void testCompileNewString() throws Exception {
@@ -74,10 +76,18 @@
     new RuntimeTestHelper(CONCAT003).compileAndRunTest();
   }
 
+  @Test
+  @Runtime
+  @Category(RuntimeRegressionTest.class)
+  public void concat004() throws Exception {
+    new RuntimeTestHelper(CONCAT004).compileAndRunTest();
+  }
+
   @Override
   protected void fillRtTestInfos() {
     rtTestInfos.add(CONCAT001);
     rtTestInfos.add(CONCAT002);
     rtTestInfos.add(CONCAT003);
+    rtTestInfos.add(CONCAT004);
   }
 }
diff --git a/jack-tests/tests/com/android/jack/string/concat004/jack/Tests.java b/jack-tests/tests/com/android/jack/string/concat004/jack/Tests.java
new file mode 100644
index 0000000..08d0113
--- /dev/null
+++ b/jack-tests/tests/com/android/jack/string/concat004/jack/Tests.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.string.concat004.jack;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+
+public class Tests {
+
+  public String field = "a" + "b";
+
+  @Test
+  public void test1() {
+    String str = "a" + "b";
+    Assert.assertTrue(str == "ab");
+  }
+
+  @Test
+  public void test2() {
+    String str = "ab";
+    Assert.assertTrue(str == field);
+  }
+
+
+  @Test
+  public void test3() {
+    String str = "a" + null;
+    Assert.assertFalse(str == "anull");
+  }
+
+  @Test
+  public void test4() {
+    String str = (String) null + null;
+    Assert.assertFalse(str == "nullnull");
+  }
+}
diff --git a/jack/build.gradle b/jack/build.gradle
index 937a75c..0751ff9 100644
--- a/jack/build.gradle
+++ b/jack/build.gradle
@@ -160,13 +160,22 @@
   commandLine 'java', '-jar', configurations.jarjar.singleFile, 'process', "jarjar-rules.txt", fullJackJar.archivePath, file("${buildDir}/libs/jack.jar")
 }
 
+task jackDevJar (type: Jar, dependsOn: jarjar){
+  baseName 'jack'
+  classifier 'dev'
+  from (zipTree("${buildDir}/libs/jack.jar")) {
+    // Manage exclusion of packages to be hidden from plugin developers
+  }
+}
+
 compileJava.dependsOn preprocessorParserTask
 compileJava.dependsOn proguardParserTask
 jar.dependsOn createJackVersionFile
-assemble.dependsOn jarjar
+assemble.dependsOn jarjar, jackDevJar
 
 task dist (type: Copy, dependsOn: assemble) {
   from file("${buildDir}/libs/jack.jar")
+  from jackDevJar.archivePath
   into file("${rootDir}/gradle-dist/")
 }
 
diff --git a/jack/src/com/android/jack/Jack.java b/jack/src/com/android/jack/Jack.java
index 3ee7a0e..ba06388 100644
--- a/jack/src/com/android/jack/Jack.java
+++ b/jack/src/com/android/jack/Jack.java
@@ -182,27 +182,29 @@
 import com.android.jack.shrob.obfuscation.annotation.AnnotationDefaultValueRemover;
 import com.android.jack.shrob.obfuscation.annotation.FieldAnnotationRemover;
 import com.android.jack.shrob.obfuscation.annotation.FieldGenericSignatureRemover;
-import com.android.jack.shrob.obfuscation.annotation.LineNumberRemover;
+import com.android.jack.shrob.obfuscation.annotation.LocalVariableAndThisLineNumberRemover;
 import com.android.jack.shrob.obfuscation.annotation.LocalVariableAndThisNameRemover;
-import com.android.jack.shrob.obfuscation.annotation.LocalVariableGenericSignatureRemover;
 import com.android.jack.shrob.obfuscation.annotation.MethodAnnotationRemover;
 import com.android.jack.shrob.obfuscation.annotation.MethodGenericSignatureRemover;
 import com.android.jack.shrob.obfuscation.annotation.ParameterAnnotationRemover;
+import com.android.jack.shrob.obfuscation.annotation.ParameterLineNumberRemover;
 import com.android.jack.shrob.obfuscation.annotation.ParameterNameRemover;
 import com.android.jack.shrob.obfuscation.annotation.RemoveAnnotationDefaultValue;
 import com.android.jack.shrob.obfuscation.annotation.RemoveEnclosingMethodFeature;
 import com.android.jack.shrob.obfuscation.annotation.RemoveEnclosingType;
 import com.android.jack.shrob.obfuscation.annotation.RemoveGenericSignature;
-import com.android.jack.shrob.obfuscation.annotation.RemoveLineNumber;
-import com.android.jack.shrob.obfuscation.annotation.RemoveLocalVariableGenericSignature;
+import com.android.jack.shrob.obfuscation.annotation.RemoveLocalLineNumber;
 import com.android.jack.shrob.obfuscation.annotation.RemoveLocalVariableName;
+import com.android.jack.shrob.obfuscation.annotation.RemoveParameterLineNumber;
 import com.android.jack.shrob.obfuscation.annotation.RemoveParameterName;
 import com.android.jack.shrob.obfuscation.annotation.RemoveThrownException;
+import com.android.jack.shrob.obfuscation.annotation.RemoveVariableGenericSignature;
 import com.android.jack.shrob.obfuscation.annotation.ThrownExceptionRemover;
 import com.android.jack.shrob.obfuscation.annotation.TypeAnnotationRemover;
 import com.android.jack.shrob.obfuscation.annotation.TypeEnclosingMethodRemover;
 import com.android.jack.shrob.obfuscation.annotation.TypeEnclosingTypeRemover;
 import com.android.jack.shrob.obfuscation.annotation.TypeGenericSignatureRemover;
+import com.android.jack.shrob.obfuscation.annotation.VariableGenericSignatureRemover;
 import com.android.jack.shrob.obfuscation.resource.AdaptResourceFileContent;
 import com.android.jack.shrob.obfuscation.resource.ResourceContentRefiner;
 import com.android.jack.shrob.obfuscation.resource.ResourceRefiner;
@@ -608,7 +610,7 @@
                 request.addFeature(RemoveAnnotationDefaultValue.class);
               }
               if (!options.flags.keepAttribute("LocalVariableTypeTable")) {
-                request.addFeature(RemoveLocalVariableGenericSignature.class);
+                request.addFeature(RemoveVariableGenericSignature.class);
               }
               if (!options.flags.keepAttribute("Exceptions")) {
                 request.addFeature(RemoveThrownException.class);
@@ -616,14 +618,18 @@
               if (!options.flags.keepAttribute("SourceFile")) {
                 request.addFeature(RemoveSourceFile.class);
               }
-              if (!options.flags.keepAttribute("LineNumberTable")) {
-                request.addFeature(RemoveLineNumber.class);
+              if (!config.get(RemoveLocalLineNumber.KEEP_LOCAL_LINE_NUMBER).booleanValue()) {
+                request.addFeature(RemoveLocalLineNumber.class);
               }
-              if (!options.flags.keepAttribute("LocalVariableTable")) {
+              if (!config.get(RemoveParameterLineNumber.KEEP_PARAMETER_LINE_NUMBER)
+                  .booleanValue()) {
+                request.addFeature(RemoveParameterLineNumber.class);
+              }
+              if (!config.get(RemoveLocalVariableName.KEEP_LOCAL_NAME).booleanValue()) {
                 request.addFeature(RemoveLocalVariableName.class);
-                if (!options.flags.getKeepParameterNames()) {
-                  request.addFeature(RemoveParameterName.class);
-                }
+              }
+              if (!config.get(RemoveParameterName.KEEP_PARAMETER_NAME).booleanValue()) {
+                request.addFeature(RemoveParameterName.class);
               }
             }
             if (options.flags.printSeeds()) {
@@ -834,7 +840,8 @@
             }
           } catch (UnsupportedOperationException e) {
             // ... but use a manual one if not supported
-            if (pluginManager.hasPlugins()) {
+            if (pluginManager.hasPlugins() ||
+                config.get(Options.FORCE_PLAN_AMENDER).booleanValue()) {
               // If there are some plugins, amend the handcrafted plan
 
               // Add features and productions according to plugins
@@ -1708,7 +1715,6 @@
             }
             methodPlan4.append(UselessIfRemover.class);
             methodPlan4.append(CfgMarkerRemover.class);
-            methodPlan4.append(CfgBuilder.class);
             methodPlan4.append(ContainerAnnotationAdder.MethodContainerAnnotationAdder.class);
           }
         }
@@ -1723,6 +1729,7 @@
         SubPlanBuilder<JDefinedClassOrInterface> typePlan =
             planBuilder.appendSubPlan(JDefinedClassOrInterfaceAdapter.class);
         SubPlanBuilder<JMethod> methodPlan = typePlan.appendSubPlan(JMethodAdapter.class);
+        methodPlan.append(CfgBuilder.class);
         if (enableFieldValuePropagation) {
           methodPlan.append(FvpPropagateFieldValues.class);
         }
@@ -1733,7 +1740,6 @@
           methodPlan.append(WofrRemoveFieldWrites.class);
         }
         methodPlan.append(CfgMarkerRemover.class);
-        methodPlan.append(CfgBuilder.class);
       }
 
       SubPlanBuilder<JDefinedClassOrInterface> typePlan1 =
@@ -1753,6 +1759,7 @@
 
         {
           SubPlanBuilder<JMethod> methodPlan5 = typePlan6.appendSubPlan(JMethodAdapter.class);
+          methodPlan5.append(CfgBuilder.class);
           methodPlan5.append(CodeItemBuilder.class);
           methodPlan5.append(CfgMarkerRemover.class);
           methodPlan5.append(EncodedMethodBuilder.class);
@@ -1827,9 +1834,6 @@
       if (features.contains(RemoveGenericSignature.class)) {
         typePlan.append(TypeGenericSignatureRemover.class);
       }
-      if (features.contains(RemoveLineNumber.class)) {
-        typePlan.append(LineNumberRemover.class);
-      }
       {
         SubPlanBuilder<JField> fieldPlan = typePlan.appendSubPlan(JFieldAdapter.class);
         fieldPlan.append(FieldAnnotationRemover.class);
@@ -1844,8 +1848,8 @@
         if (features.contains(RemoveGenericSignature.class)) {
           methodPlan.append(MethodGenericSignatureRemover.class);
         }
-        if (features.contains(RemoveLocalVariableGenericSignature.class)) {
-          methodPlan.append(LocalVariableGenericSignatureRemover.class);
+        if (features.contains(RemoveVariableGenericSignature.class)) {
+          methodPlan.append(VariableGenericSignatureRemover.class);
         }
         if (features.contains(RemoveAnnotationDefaultValue.class)) {
           methodPlan.append(AnnotationDefaultValueRemover.class);
@@ -1856,9 +1860,15 @@
         if (features.contains(RemoveParameterName.class)) {
           methodPlan.append(ParameterNameRemover.class);
         }
+        if (features.contains(RemoveParameterLineNumber.class)) {
+          methodPlan.append(ParameterLineNumberRemover.class);
+        }
         if (features.contains(RemoveLocalVariableName.class)) {
           methodPlan.append(LocalVariableAndThisNameRemover.class);
         }
+        if (features.contains(RemoveLocalLineNumber.class)) {
+          methodPlan.append(LocalVariableAndThisLineNumberRemover.class);
+        }
       }
     }
   }
diff --git a/jack/src/com/android/jack/Options.java b/jack/src/com/android/jack/Options.java
index b13ead8..274d745 100644
--- a/jack/src/com/android/jack/Options.java
+++ b/jack/src/com/android/jack/Options.java
@@ -45,6 +45,10 @@
 import com.android.jack.shrob.obfuscation.SourceFileRenamer;
 import com.android.jack.shrob.obfuscation.annotation.AnnotationRemover;
 import com.android.jack.shrob.obfuscation.annotation.ParameterAnnotationRemover;
+import com.android.jack.shrob.obfuscation.annotation.RemoveLocalLineNumber;
+import com.android.jack.shrob.obfuscation.annotation.RemoveLocalVariableName;
+import com.android.jack.shrob.obfuscation.annotation.RemoveParameterLineNumber;
+import com.android.jack.shrob.obfuscation.annotation.RemoveParameterName;
 import com.android.jack.shrob.seed.SeedPrinter;
 import com.android.jack.shrob.spec.Flags;
 import com.android.jack.transformations.enums.opt.OptimizedSwitchEnumSupport;
@@ -783,6 +787,12 @@
           .setSeparator(",")
           .ensureUnicity();
 
+  @Nonnull
+  public static final BooleanPropertyId FORCE_PLAN_AMENDER = BooleanPropertyId
+      .create("jack.plan-amender.force", "Force plan amender")
+      .addDefaultValue(false)
+      .addCategory(Private.class);
+
   public void ensurePluginManager()
       throws IllegalOptionsException {
     if (pluginManager == null) {
@@ -1038,8 +1048,22 @@
             ParameterAnnotationRemover.EMIT_RUNTIME_RETENTION_PARAMETER_ANNOTATION,
             flags.keepAttribute("RuntimeVisibleParameterAnnotations"));
 
-        configBuilder.set(EMIT_LINE_NUMBER_DEBUG_INFO, flags.keepAttribute("LineNumberTable"));
-        configBuilder.set(EMIT_LOCAL_DEBUG_INFO, flags.keepAttribute("LocalVariableTable"));
+        boolean keepLineNumbers = flags.keepAttribute("LineNumberTable");
+        configBuilder.set(RemoveLocalLineNumber.KEEP_LOCAL_LINE_NUMBER,
+            keepLineNumbers);
+        if (!keepLineNumbers) {
+          configBuilder.set(RemoveParameterLineNumber.KEEP_PARAMETER_LINE_NUMBER,
+              flags.getKeepParameterNames());
+        } else {
+          configBuilder.set(RemoveParameterLineNumber.KEEP_PARAMETER_LINE_NUMBER, true);
+        }
+        boolean keepNames = flags.keepAttribute("LocalVariableTable");
+        configBuilder.set(RemoveLocalVariableName.KEEP_LOCAL_NAME, keepNames);
+        if (!keepNames) {
+          configBuilder.set(RemoveParameterName.KEEP_PARAMETER_NAME, flags.getKeepParameterNames());
+        } else {
+          configBuilder.set(RemoveParameterName.KEEP_PARAMETER_NAME, true);
+        }
       }
 
       configBuilder.set(Options.FLAGS, flags);
diff --git a/jack/src/com/android/jack/analysis/tracer/Tracer.java b/jack/src/com/android/jack/analysis/tracer/Tracer.java
index 220a535..1f2edab 100644
--- a/jack/src/com/android/jack/analysis/tracer/Tracer.java
+++ b/jack/src/com/android/jack/analysis/tracer/Tracer.java
@@ -566,8 +566,11 @@
   @Override
   public void endVisit(@Nonnull JVariableRef x) {
     DebugVariableInfoMarker debugInfo = x.getMarker(DebugVariableInfoMarker.class);
-    if (debugInfo != null && debugInfo.getType() != null) {
-      trace(debugInfo.getType());
+    if (debugInfo != null) {
+      JType debugInfoType = debugInfo.getType();
+      if (debugInfoType != null) {
+        trace(debugInfoType);
+      }
     }
   }
 
diff --git a/jack/src/com/android/jack/backend/dex/ClassAnnotationBuilder.java b/jack/src/com/android/jack/backend/dex/ClassAnnotationBuilder.java
index 83c9629..8c3b6c7 100644
--- a/jack/src/com/android/jack/backend/dex/ClassAnnotationBuilder.java
+++ b/jack/src/com/android/jack/backend/dex/ClassAnnotationBuilder.java
@@ -38,7 +38,7 @@
 import javax.annotation.Nonnull;
 
 /**
- * Builds the {@link com.android.dx.rop.annotation.Annotations Annotations} of a class or interface.
+ * Builds the {@link Annotations} of a class or interface.
  */
 @Description("Builds the rop annotations of a JDeclaredType.")
 @Constraint(need = ClassDefItemMarker.class, no = AnnotationMethodDefaultValue.class)
diff --git a/jack/src/com/android/jack/backend/dex/DexWritingTool.java b/jack/src/com/android/jack/backend/dex/DexWritingTool.java
index d98bcba..408e512 100644
--- a/jack/src/com/android/jack/backend/dex/DexWritingTool.java
+++ b/jack/src/com/android/jack/backend/dex/DexWritingTool.java
@@ -38,8 +38,10 @@
 import com.android.jack.util.AndroidApiLevel;
 import com.android.sched.util.codec.VariableName;
 import com.android.sched.util.config.ThreadConfig;
+import com.android.sched.util.file.CannotCloseException;
 import com.android.sched.util.file.CannotCreateFileException;
 import com.android.sched.util.file.CannotReadException;
+import com.android.sched.util.file.CannotWriteException;
 import com.android.sched.util.file.WrongPermissionException;
 import com.android.sched.util.location.Location;
 import com.android.sched.util.log.Event;
@@ -63,7 +65,6 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
-import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import javax.annotation.CheckForNull;
@@ -136,17 +137,13 @@
   protected void finishMerge(@Nonnull JackMerger merger, @Nonnull OutputVFile out)
       throws DexWritingException {
     try (Event event = tracer.open(JackEventType.DEX_MERGER_FINISH)) {
-      OutputStream os = null;
       try {
-        try {
-          os = new BufferedOutputStream(out.getOutputStream());
-          merger.finish(os);
-        } finally {
-          if (os != null) {
-            os.close();
-          }
+        try (OutputStream os = new BufferedOutputStream(out.getOutputStream())) {
+          merger.finish(os, out);
+        } catch (IOException e) {
+          throw new CannotCloseException(out, e);
         }
-      } catch (IOException | WrongPermissionException e) {
+      } catch (CannotWriteException | CannotCloseException | WrongPermissionException e) {
         throw new DexWritingException(e);
       }
     }
@@ -154,21 +151,15 @@
 
   protected void mergeDex(@Nonnull JackMerger merger, InputVFile inputDex)
       throws MergingOverflowException, DexWritingException {
-    InputStream inputStream = null;
+
     try {
-      inputStream = inputDex.getInputStream();
-      merger.addDexFile(new DexBuffer(inputStream, inputDex.getLocation()));
-    } catch (CannotReadException | WrongPermissionException e) {
-      throw new DexWritingException(e);
-    } finally {
-      if (inputStream != null) {
-        try {
-          inputStream.close();
-        } catch (IOException e) {
-          logger.log(
-              Level.WARNING, "Failed to close ''{0}''", inputDex.getLocation().getDescription());
-        }
+      try (InputStream inputStream = inputDex.getInputStream()) {
+        merger.addDexFile(new DexBuffer(inputStream, inputDex.getLocation()));
+      } catch (IOException e) {
+        throw new CannotCloseException(inputDex, e);
       }
+    } catch (CannotCloseException | CannotReadException | WrongPermissionException e) {
+      throw new DexWritingException(e);
     }
   }
 
diff --git a/jack/src/com/android/jack/backend/dex/FieldAnnotationBuilder.java b/jack/src/com/android/jack/backend/dex/FieldAnnotationBuilder.java
index f5be1e9..20923ef 100644
--- a/jack/src/com/android/jack/backend/dex/FieldAnnotationBuilder.java
+++ b/jack/src/com/android/jack/backend/dex/FieldAnnotationBuilder.java
@@ -40,7 +40,7 @@
 import javax.annotation.Nonnull;
 
 /**
- * Builds the {@link com.android.dx.rop.annotation.Annotations Annotations} of a field.
+ * Builds the {@link Annotations} of a field.
  */
 @Description("Builds the rop annotations of a field")
 @Synchronized
diff --git a/jack/src/com/android/jack/backend/dex/FieldInitializerRemover.java b/jack/src/com/android/jack/backend/dex/FieldInitializerRemover.java
index aa05ab9..db05111 100644
--- a/jack/src/com/android/jack/backend/dex/FieldInitializerRemover.java
+++ b/jack/src/com/android/jack/backend/dex/FieldInitializerRemover.java
@@ -29,6 +29,7 @@
 import com.android.jack.ir.ast.JFieldInitializer;
 import com.android.jack.ir.ast.JIntLiteral;
 import com.android.jack.ir.ast.JLiteral;
+import com.android.jack.ir.ast.JNode;
 import com.android.jack.ir.ast.JPrimitiveType;
 import com.android.jack.ir.ast.JPrimitiveType.JPrimitiveTypeEnum;
 import com.android.jack.ir.ast.JReferenceType;
@@ -97,7 +98,9 @@
     JFieldInitializer declaration = field.getFieldInitializer();
     if (declaration != null) {
       JExpression initialValue = declaration.getInitializer();
-      TransformationRequest tr = new TransformationRequest(declaration.getParent());
+      final JNode declarationParent = declaration.getParent();
+      assert declarationParent != null;
+      TransformationRequest tr = new TransformationRequest(declarationParent);
       if (/* Field is static final and initialized by a literal */
           field.isStatic() && field.isFinal() && initialValue instanceof JLiteral
           /* Object field initialized by a String literal: don't remove unless allowed */
diff --git a/jack/src/com/android/jack/backend/dex/MethodAnnotationBuilder.java b/jack/src/com/android/jack/backend/dex/MethodAnnotationBuilder.java
index 5bb806b..765558e 100644
--- a/jack/src/com/android/jack/backend/dex/MethodAnnotationBuilder.java
+++ b/jack/src/com/android/jack/backend/dex/MethodAnnotationBuilder.java
@@ -46,7 +46,7 @@
 import javax.annotation.Nonnull;
 
 /**
- * Builds the {@link com.android.dx.rop.annotation.Annotations Annotations} of a method.
+ * Builds the {@link Annotations} of a method.
  */
 @Description("Builds the rop annotations of a method")
 @Synchronized
diff --git a/jack/src/com/android/jack/backend/dex/rop/RopBuilderVisitor.java b/jack/src/com/android/jack/backend/dex/rop/RopBuilderVisitor.java
index ef831b9..c7572e8 100644
--- a/jack/src/com/android/jack/backend/dex/rop/RopBuilderVisitor.java
+++ b/jack/src/com/android/jack/backend/dex/rop/RopBuilderVisitor.java
@@ -714,8 +714,10 @@
           throws AssertionError {
     if (value instanceof JExceptionRuntimeValue) {
       assert dest instanceof JVariableRef;
-      assert declaration.getParent() instanceof JCatchBlock
-          && ((JCatchBlock) declaration.getParent()).getStatements().get(0) == declaration;
+      final JNode declarationParent = declaration.getParent();
+      assert declarationParent != null;
+      assert declarationParent instanceof JCatchBlock
+          && ((JCatchBlock) declarationParent).getStatements().get(0) == declaration;
       RegisterSpec exceptionReg = ropReg.getOrCreateRegisterSpec((JVariableRef) dest);
       addInstruction(new PlainInsn(
           Rops.opMoveException(exceptionReg.getTypeBearer()), RopHelper.getSourcePosition(dest),
diff --git a/jack/src/com/android/jack/backend/jayce/JayceInLibraryWriter.java b/jack/src/com/android/jack/backend/jayce/JayceInLibraryWriter.java
index 5644d59..44d5d14 100644
--- a/jack/src/com/android/jack/backend/jayce/JayceInLibraryWriter.java
+++ b/jack/src/com/android/jack/backend/jayce/JayceInLibraryWriter.java
@@ -20,6 +20,7 @@
 import com.android.jack.JackAbortException;
 import com.android.jack.ir.ast.JDefinedClassOrInterface;
 import com.android.jack.ir.formatter.BinaryQualifiedNameFormatter;
+import com.android.jack.jayce.JayceInternalWriter;
 import com.android.jack.jayce.JayceWriterFactory;
 import com.android.jack.library.FileType;
 import com.android.jack.library.InputLibrary;
@@ -33,15 +34,13 @@
 import com.android.sched.schedulable.RunnableSchedulable;
 import com.android.sched.util.file.CannotCloseException;
 import com.android.sched.util.file.CannotCreateFileException;
-import com.android.sched.util.file.CannotReadException;
+import com.android.sched.util.file.CannotWriteException;
 import com.android.sched.util.file.WrongPermissionException;
 import com.android.sched.util.location.Location;
 import com.android.sched.vfs.OutputVFile;
 import com.android.sched.vfs.VPath;
 
 import java.io.BufferedOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
 
 import javax.annotation.Nonnull;
 
@@ -81,16 +80,12 @@
     try {
       OutputVFile vFile = outputJackLibrary.createFile(FileType.JAYCE,
           new VPath(BinaryQualifiedNameFormatter.getFormatter().getName(type), '/'));
-      try (OutputStream out = new BufferedOutputStream(vFile.getOutputStream())) {
-        try {
-          JayceWriterFactory.get(outputJackLibrary, out).write(type);
-        } catch (IOException e) {
-          throw new CannotReadException(vFile, e);
-        }
-      } catch (IOException e) {
-        throw new CannotCloseException(vFile, e);
+      try (JayceInternalWriter jayceWriter =
+          JayceWriterFactory.get(
+              outputJackLibrary, new BufferedOutputStream(vFile.getOutputStream()), vFile)) {
+        jayceWriter.write(type);
       }
-    } catch (CannotReadException | CannotCloseException | CannotCreateFileException
+    } catch (CannotWriteException | CannotCloseException | CannotCreateFileException
         | WrongPermissionException e) {
       LibraryWritingException reportable =
           new LibraryWritingException(new LibraryIOException(outputJackLibrary.getLocation(), e));
diff --git a/jack/src/com/android/jack/debug/DebugVariableInfoMarker.java b/jack/src/com/android/jack/debug/DebugVariableInfoMarker.java
index 5687bf0..3101a37 100644
--- a/jack/src/com/android/jack/debug/DebugVariableInfoMarker.java
+++ b/jack/src/com/android/jack/debug/DebugVariableInfoMarker.java
@@ -39,7 +39,7 @@
       new DebugVariableInfoMarker(null, null, null);
 
   @CheckForNull
-  private final String name;
+  private String name;
 
   @CheckForNull
   private final JType type;
@@ -59,6 +59,10 @@
     return name;
   }
 
+  public void setName(@CheckForNull String name) {
+    this.name = name;
+  }
+
   @CheckForNull
   public JType getType() {
     return type;
diff --git a/jack/src/com/android/jack/dx/rop/code/LocalItem.java b/jack/src/com/android/jack/dx/rop/code/LocalItem.java
index 3c68b65..bd9b83b 100644
--- a/jack/src/com/android/jack/dx/rop/code/LocalItem.java
+++ b/jack/src/com/android/jack/dx/rop/code/LocalItem.java
@@ -16,6 +16,7 @@
 
 package com.android.jack.dx.rop.code;
 
+import com.android.jack.dx.rop.cst.Constant;
 import com.android.jack.dx.rop.cst.CstString;
 import com.android.jack.dx.rop.type.Type;
 
diff --git a/jack/src/com/android/jack/incremental/CommonFilter.java b/jack/src/com/android/jack/incremental/CommonFilter.java
index d810517..3c12400 100644
--- a/jack/src/com/android/jack/incremental/CommonFilter.java
+++ b/jack/src/com/android/jack/incremental/CommonFilter.java
@@ -56,6 +56,7 @@
 import com.android.sched.util.file.CannotCreateFileException;
 import com.android.sched.util.file.Directory;
 import com.android.sched.util.file.FileOrDirectory;
+import com.android.sched.util.file.FileOrDirectory.Existence;
 import com.android.sched.util.file.FileOrDirectory.Permission;
 import com.android.sched.util.file.Files;
 import com.android.sched.util.file.InputZipFile;
@@ -71,6 +72,7 @@
 import com.android.sched.vfs.ReadZipFS;
 import com.android.sched.vfs.VFS;
 import com.android.sched.vfs.VPath;
+import com.android.sched.vfs.WrongVFSTypeException;
 import com.android.sched.vfs.ZipUtils;
 
 import java.io.File;
@@ -344,11 +346,11 @@
         File jackJar = new File(location.toURI().getPath());
         for (String prefix: JACK_DEFAULT_LIB_PATH) {
           VFS jackVfs = new PrefixedFS(new ReadZipFS(new InputZipFile(jackJar.getPath())),
-              new VPath(prefix, ZipUtils.ZIP_SEPARATOR));
+              new VPath(prefix, ZipUtils.ZIP_SEPARATOR), Existence.MUST_EXIST);
           libraries.add(JackLibraryFactory.getInputLibrary(jackVfs));
         }
         return libraries;
-      } catch (LibraryException e) {
+      } catch (LibraryException | WrongVFSTypeException e) {
         EmbeddedLibraryLoadingException reportable = new EmbeddedLibraryLoadingException(e);
         session.getReporter().report(Severity.FATAL, reportable);
         throw new JackAbortException(reportable);
diff --git a/jack/src/com/android/jack/ir/ast/JAbstractMethodCall.java b/jack/src/com/android/jack/ir/ast/JAbstractMethodCall.java
index bffde64..cdda0d6 100644
--- a/jack/src/com/android/jack/ir/ast/JAbstractMethodCall.java
+++ b/jack/src/com/android/jack/ir/ast/JAbstractMethodCall.java
@@ -191,9 +191,30 @@
 
     return receiverType != null
         && formatter.getName(methodId.getType()).equals("java.lang.Object")
-        && formatter.getName(receiverType).equals("java.lang.invoke.MethodHandle")
+        && isSubtypeOfOrMethodHandle(formatter, receiverType)
         && (calledMethodName.equals("invoke") || calledMethodName.equals("invokeExact"))
         && paramTypes.size() == 1
         && formatter.getName(paramTypes.get(0)).equals("java.lang.Object[]");
   }
+
+  private static boolean isSubtypeOfOrMethodHandle(@Nonnull UserFriendlyFormatter formatter,
+      @Nonnull JClassOrInterface type) {
+    if (type instanceof JPhantomClass) {
+      return isSubtypeOfOrMethodHandle(formatter, (JPhantomClass) type);
+    } else if (type instanceof JDefinedClass) {
+      return isSubtypeOfOrMethodHandle(formatter, (JDefinedClass) type);
+    }
+    return false;
+  }
+
+  private static boolean isSubtypeOfOrMethodHandle(@Nonnull UserFriendlyFormatter formatter,
+      @Nonnull JPhantomClass type) {
+    return formatter.getName(type).equals("java.lang.invoke.MethodHandle");
+  }
+
+  private static boolean isSubtypeOfOrMethodHandle(@Nonnull UserFriendlyFormatter formatter,
+      @Nonnull JDefinedClass type) {
+    return formatter.getName(type).equals("java.lang.invoke.MethodHandle")
+        || isSubtypeOfOrMethodHandle(formatter, type.getSuperClass());
+  }
 }
diff --git a/jack/src/com/android/jack/ir/ast/JNode.java b/jack/src/com/android/jack/ir/ast/JNode.java
index 4f2129e..368ddce 100644
--- a/jack/src/com/android/jack/ir/ast/JNode.java
+++ b/jack/src/com/android/jack/ir/ast/JNode.java
@@ -90,6 +90,7 @@
   @Nonnull
   protected SourceInfo info;
 
+  @CheckForNull
   protected JNode parent = null;
 
   protected JNode(@Nonnull SourceInfo info) {
@@ -100,6 +101,7 @@
   /**
    * @return the parent
    */
+  @CheckForNull
   public JNode getParent() {
     return parent;
   }
@@ -255,14 +257,14 @@
     return false;
   }
 
-  public void updateParents(JNode parent) {
+  public void updateParents(@Nonnull JNode parent) {
     new ParentSetterVisitor(parent).accept(this);
   }
 
   /**
    * @param parent the parent to set
    */
-  private void setParent(JNode parent) {
+  private void setParent(@Nonnull JNode parent) {
     assert parent != null;
     this.parent = parent;
   }
diff --git a/jack/src/com/android/jack/ir/formatter/BinarySignatureFormatter.java b/jack/src/com/android/jack/ir/formatter/BinarySignatureFormatter.java
index 94bf498..337b7fb 100644
--- a/jack/src/com/android/jack/ir/formatter/BinarySignatureFormatter.java
+++ b/jack/src/com/android/jack/ir/formatter/BinarySignatureFormatter.java
@@ -107,7 +107,7 @@
       sb.append(getNameInternal(enclosingPackage));
       sb.append(getPackageSeparator());
     }
-    sb.append(classOrInterfaceSimpleName).append(";");
+    sb.append(classOrInterfaceSimpleName).append(';');
     return sb.toString();
   }
 
diff --git a/jack/src/com/android/jack/ir/impl/BaseGenerationVisitor.java b/jack/src/com/android/jack/ir/impl/BaseGenerationVisitor.java
index baa91a6..52090e9 100644
--- a/jack/src/com/android/jack/ir/impl/BaseGenerationVisitor.java
+++ b/jack/src/com/android/jack/ir/impl/BaseGenerationVisitor.java
@@ -677,7 +677,8 @@
     accept(x.getThenStmt());
     nestedStatementPop(x.getThenStmt());
 
-    if (x.getElseStmt() != null) {
+    JStatement elseStmt = x.getElseStmt();
+    if (elseStmt != null) {
       if (needSemi) {
         semi();
         newline();
@@ -686,15 +687,15 @@
         needSemi = true;
       }
       print(CHARS_ELSE);
-      boolean elseIf = x.getElseStmt() instanceof JIfStatement;
+      boolean elseIf = elseStmt instanceof JIfStatement;
       if (!elseIf) {
-        nestedStatementPush(x.getElseStmt());
+        nestedStatementPush(elseStmt);
       } else {
         space();
       }
-      accept(x.getElseStmt());
+      accept(elseStmt);
       if (!elseIf) {
-        nestedStatementPop(x.getElseStmt());
+        nestedStatementPop(elseStmt);
       }
     }
 
diff --git a/jack/src/com/android/jack/ir/impl/JackIrBuilder.java b/jack/src/com/android/jack/ir/impl/JackIrBuilder.java
index f51b62d..705d780 100644
--- a/jack/src/com/android/jack/ir/impl/JackIrBuilder.java
+++ b/jack/src/com/android/jack/ir/impl/JackIrBuilder.java
@@ -3825,11 +3825,12 @@
 
           // Since the + operator is no-op, the inner and the outer constant should be exactly the
           // same. If not, the current version of ECJ has the mentioned bug.
+          @SuppressWarnings("unused")
           boolean hasEcjUnaryPosBug = !outer.equals(inner);
 
           // We are going to assume there is a bug in ECJ and work around it. If this fails,
           // we know that the bug has been fixed.
-          assert hasEcjUnaryPosBug;
+          // assert hasEcjUnaryPosBug; // STOPSHIP THIS IS REMOVE DUE TO BUG # 34758593
         }
       }
     }
diff --git a/jack/src/com/android/jack/jayce/JayceInternalWriter.java b/jack/src/com/android/jack/jayce/JayceInternalWriter.java
index b358891..dcf78a4 100644
--- a/jack/src/com/android/jack/jayce/JayceInternalWriter.java
+++ b/jack/src/com/android/jack/jayce/JayceInternalWriter.java
@@ -17,19 +17,20 @@
 package com.android.jack.jayce;
 
 import com.android.jack.ir.ast.JNode;
-
-import java.io.IOException;
+import com.android.sched.util.file.CannotCloseException;
+import com.android.sched.util.file.CannotWriteException;
 
 import javax.annotation.Nonnull;
 
 /**
  * Jayce internal writer.
  */
-public interface JayceInternalWriter {
+public interface JayceInternalWriter extends AutoCloseable {
 
-  public void write(@Nonnull JNode jNode) throws IOException;
+  public void write(@Nonnull JNode jNode) throws CannotWriteException;
 
   int getCurrentMinor();
 
-  public void close() throws IOException;
+  @Override
+  public void close() throws CannotCloseException;
 }
diff --git a/jack/src/com/android/jack/jayce/JayceWriterFactory.java b/jack/src/com/android/jack/jayce/JayceWriterFactory.java
index 9c34f95..3b76cee 100644
--- a/jack/src/com/android/jack/jayce/JayceWriterFactory.java
+++ b/jack/src/com/android/jack/jayce/JayceWriterFactory.java
@@ -19,6 +19,7 @@
 import com.android.jack.jayce.v0004.io.JayceInternalWriterImpl;
 import com.android.jack.library.FileType;
 import com.android.jack.library.OutputJackLibrary;
+import com.android.sched.util.location.HasLocation;
 
 import java.io.OutputStream;
 
@@ -33,8 +34,8 @@
 
   @Nonnull
   public static JayceInternalWriter get(@Nonnull OutputJackLibrary outputJackLibrary,
-      @Nonnull OutputStream out) {
-    JayceInternalWriterImpl jayceWriter = new JayceInternalWriterImpl(out);
+      @Nonnull OutputStream out, @Nonnull HasLocation locationProvider) {
+    JayceInternalWriterImpl jayceWriter = new JayceInternalWriterImpl(out, locationProvider);
 
     outputJackLibrary.putProperty(
         outputJackLibrary.buildPropertyName(FileType.JAYCE, null /* suffix */),
diff --git a/jack/src/com/android/jack/jayce/v0002/NNode.java b/jack/src/com/android/jack/jayce/v0002/NNode.java
index c43b982..95b4349 100644
--- a/jack/src/com/android/jack/jayce/v0002/NNode.java
+++ b/jack/src/com/android/jack/jayce/v0002/NNode.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -45,8 +44,6 @@
   public abstract Object exportAsJast(@Nonnull ExportSession exportSession)
       throws JTypeLookupException, JMethodLookupException;
 
-  public abstract void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException;
-
   public abstract void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException;
 
   @Nonnull
diff --git a/jack/src/com/android/jack/jayce/v0002/io/JayceInternalWriterImpl.java b/jack/src/com/android/jack/jayce/v0002/io/JayceInternalWriterImpl.java
deleted file mode 100644
index d961122..0000000
--- a/jack/src/com/android/jack/jayce/v0002/io/JayceInternalWriterImpl.java
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.jack.jayce.v0002.io;
-
-import com.android.jack.JackEventType;
-import com.android.jack.ir.ast.FieldKind;
-import com.android.jack.ir.ast.JMethodCall.DispatchKind;
-import com.android.jack.ir.ast.JNode;
-import com.android.jack.ir.ast.JRetentionPolicy;
-import com.android.jack.ir.ast.MethodKind;
-import com.android.jack.jayce.JayceInternalWriter;
-import com.android.jack.jayce.v0002.NNode;
-import com.android.jack.jayce.v0002.NodeFactory;
-import com.android.jack.jayce.v0002.Version;
-import com.android.jack.jayce.v0002.nodes.HasCatchBlockIds;
-import com.android.jack.jayce.v0002.nodes.HasSourceInfo;
-import com.android.jack.jayce.v0002.nodes.NMethod;
-import com.android.jack.jayce.v0002.nodes.NMethodCall.ReceiverKind;
-import com.android.jack.jayce.v0002.nodes.NSourceInfo;
-import com.android.jack.jayce.v0002.util.DispatchKindIdHelper;
-import com.android.jack.jayce.v0002.util.FieldRefKindIdHelper;
-import com.android.jack.jayce.v0002.util.MethodKindIdHelper;
-import com.android.jack.jayce.v0002.util.ReceiverKindIdHelper;
-import com.android.jack.jayce.v0002.util.RetentionPolicyIdHelper;
-import com.android.sched.util.log.Event;
-import com.android.sched.util.log.Tracer;
-import com.android.sched.util.log.TracerFactory;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.annotation.CheckForNull;
-import javax.annotation.Nonnegative;
-import javax.annotation.Nonnull;
-
-/**
- * Jayce internal writer implementation.
- */
-public class JayceInternalWriterImpl implements JayceInternalWriter {
-
-  @Nonnull
-  private final Tracer tracer = TracerFactory.getTracer();
-
-  @Nonnull
-  private final JayceOutputStream out;
-
-  @CheckForNull
-  private String currentFileName;
-
-  @Nonnegative
-  private int currentLineNumber;
-
-  @Nonnull
-  private final  List<String> currentCatchBlockList = new ArrayList<String>();
-
-  public JayceInternalWriterImpl(@Nonnull OutputStream out) {
-    this.out = new JayceOutputStream(out);
-  }
-
-  public void writeNode(@CheckForNull NNode node) throws IOException {
-    if (node == null) {
-      writeNull();
-    } else {
-      writeSourceInfoBegin(node);
-      writeCatchBlockIds(node);
-      writeToken(node.getToken());
-      writeOpen();
-      node.writeContent(this);
-      writeSourceInfoEnd(node);
-      assert !(node instanceof NMethod) || currentCatchBlockList.isEmpty();
-      writeClose();
-    }
-  }
-
-  private void writeSourceInfoBegin(@Nonnull NNode node) throws IOException {
-    if (node instanceof HasSourceInfo) {
-      NSourceInfo sourceInfo = ((HasSourceInfo) node).getSourceInfos();
-      writeFileNameIfDifferentFromCurrent(sourceInfo.fileName);
-      writeLineIfDifferentFromCurrent(sourceInfo.startLine);
-    }
-  }
-
-  private void writeSourceInfoEnd(@Nonnull NNode node) throws IOException {
-    if (node instanceof HasSourceInfo) {
-      writeLineIfDifferentFromCurrent(
-          ((HasSourceInfo) node).getSourceInfos().endLine);
-    }
-  }
-
-  public void writeIds(@Nonnull List<String> list) throws IOException {
-    writeOpen();
-
-    writeTrimmedInt(list.size());
-
-    for (String id : list) {
-      writeId(id);
-    }
-
-    writeClose();
-  }
-
-  public void writeCatchBlockIds(@CheckForNull NNode node) throws IOException {
-    if (node instanceof HasCatchBlockIds) {
-      List<String> list = ((HasCatchBlockIds) node).getCatchBlockIds();
-      List<String> removedIds = new ArrayList<String>(currentCatchBlockList.size());
-      List<String> addedIds = new ArrayList<String>(list.size());
-
-      for (String s : currentCatchBlockList) {
-        removedIds.add(s);
-      }
-      for (String s : list) {
-        addedIds.add(s);
-      }
-
-      // intersection(current, list)
-      currentCatchBlockList.retainAll(list);
-      // current \ intersection(current, list)
-      removedIds.removeAll(currentCatchBlockList);
-      // list \ intersection(current, list)
-      addedIds.removeAll(currentCatchBlockList);
-
-      int addedIdsSize = addedIds.size();
-      int removedIdsSize = removedIds.size();
-
-      if (addedIdsSize > 0) {
-        writeOpenAddCatchBlockIds();
-        writeInt(addedIdsSize);
-        for (int i = 0; i < addedIdsSize; i++) {
-          writeString(addedIds.get(i));
-        }
-        writeCloseCatchBlockIds();
-      }
-
-      if (removedIdsSize > 0) {
-        writeOpenRemoveCatchBlockIds();
-        writeInt(removedIdsSize);
-        for (int i = 0; i < removedIdsSize; i++) {
-          writeString(removedIds.get(i));
-        }
-        writeCloseCatchBlockIds();
-      }
-      currentCatchBlockList.addAll(addedIds);
-    }
-  }
-
-  public void writeNodes(@Nonnull Collection<? extends NNode> nodes) throws IOException {
-    writeOpen();
-
-    writeTrimmedInt(nodes.size());
-
-    for (Iterator<? extends NNode> iterator = nodes.iterator(); iterator.hasNext();) {
-      writeNode(iterator.next());
-    }
-
-    writeClose();
-  }
-
-  public void writeInt(int value) throws IOException {
-    writeTrimmedInt(value);
-    writeSpace();
-  }
-
-  private void writeTrimmedInt(int value) throws IOException {
-    out.writeInt(value);
-  }
-
-  public void writeBoolean(boolean value)  throws IOException {
-    out.writeBoolean(value);
-  }
-
-  public void writeLong(long value) throws IOException {
-    writeTrimmedLong(value);
-    writeSpace();
-  }
-
-  private void writeTrimmedLong(long value) throws IOException {
-    out.writeLong(value);
-  }
-
-  public void writeByte(byte value) throws IOException {
-    out.writeByte(value);
-    writeSpace();
-  }
-
-  public void writeShort(short value) throws IOException {
-    out.writeShort(value);
-    writeSpace();
-  }
-
-  public void writeChar(char value) throws IOException {
-    out.writeChar(value);
-    writeSpace();
-  }
-
-  public void writeFloat(float value) throws IOException {
-    writeTrimmedInt(Float.floatToRawIntBits(value));
-    writeSpace();
-  }
-
-  public void writeDouble(double value) throws IOException {
-    writeTrimmedLong(Double.doubleToRawLongBits(value));
-    writeSpace();
-  }
-
-  public void writeId(@CheckForNull String id)  throws IOException {
-    writeString(id);
-  }
-
-  public void writeRetentionPolicyEnum(@Nonnull JRetentionPolicy enumValue) throws IOException {
-    writeByte(RetentionPolicyIdHelper.getId(enumValue));
-  }
-
-  public void writeFieldRefKindEnum(@Nonnull FieldKind enumValue) throws IOException {
-    writeByte(FieldRefKindIdHelper.getId(enumValue));
-  }
-
-  public void writeMethodKindEnum(@Nonnull MethodKind enumValue) throws IOException {
-    writeByte(MethodKindIdHelper.getId(enumValue));
-  }
-
-  public void writeReceiverKindEnum(@Nonnull ReceiverKind enumValue) throws IOException {
-    writeByte(ReceiverKindIdHelper.getId(enumValue));
-  }
-
-  public void writeDispatchKindEnum(@Nonnull DispatchKind enumValue) throws IOException {
-    writeByte(DispatchKindIdHelper.getId(enumValue));
-  }
-
-  public void writeString(@CheckForNull String string)  throws IOException {
-    out.writeUTF(string);
-  }
-
-  public void writeFileNameIfDifferentFromCurrent(@CheckForNull String fileName)
-      throws IOException {
-   if (fileName != null && !fileName.equals(currentFileName)) {
-      writeCurrentFileName(fileName);
-    }
-    // Assume that elements with unknown debug infos are in same file.
-  }
-
-  public void writeCurrentFileName(@Nonnull String fileName)  throws IOException {
-    writeOpenFileName();
-    writeString(fileName);
-    writeCloseFileName();
-    currentFileName = fileName;
-  }
-
-  public void writeLineIfDifferentFromCurrent(@Nonnegative int lineNumber)
-      throws IOException {
-    if (lineNumber != currentLineNumber) {
-      writeCurrentLine(lineNumber);
-    }
-  }
-
-  public void writeCurrentLine(@Nonnegative int lineNumber)
-      throws IOException {
-    writeOpenLineInfo();
-    writeTrimmedInt(lineNumber);
-    writeCloseLineInfo();
-    currentLineNumber = lineNumber;
-  }
-
-  private void writeNull()  throws IOException {
-    writeToken(Token.NULL);
-    writeSpace();
-  }
-
-  @SuppressWarnings("unused")
-  private void writeSpace()  throws IOException{
-  }
-
-  private void writeToken(@Nonnull Token token) throws IOException {
-    out.writeByte(token.ordinal());
-  }
-
-  @SuppressWarnings("unused")
-  private void writeOpen()  throws IOException{
-  }
-
-  private void writeClose() throws IOException {
-    writeToken(Token.RPARENTHESIS);
-  }
-
-  private void writeOpenFileName() throws IOException {
-    writeToken(Token.SHARP);
-  }
-
-  @SuppressWarnings("unused")
-  private void writeCloseFileName()  throws IOException{
-  }
-
-  private void writeOpenLineInfo() throws IOException {
-    writeToken(Token.LBRACKET);
-  }
-
-  @SuppressWarnings("unused")
-  private void writeCloseLineInfo()  throws IOException{
-  }
-
-  private void writeOpenAddCatchBlockIds() throws IOException {
-    writeToken(Token.LCURLY_ADD);
-  }
-
-  private void writeOpenRemoveCatchBlockIds() throws IOException {
-    writeToken(Token.LCURLY_REMOVE);
-  }
-
-  @SuppressWarnings("unused")
-  private void writeCloseCatchBlockIds()  throws IOException{
-  }
-
-  @Override
-  public void write(@Nonnull JNode jNode) throws IOException {
-    try (Event eventWriting = tracer.open(JackEventType.NNODE_WRITING)) {
-      ImportHelper importHelper = new ImportHelper(new NodeFactory());
-      NNode nNode;
-      try (Event eventConvert = tracer.open(JackEventType.JNODE_TO_NNODE_CONVERSION)) {
-        nNode = importHelper.load(jNode);
-      }
-
-      writeNode(nNode);
-    }
-  }
-
-  @Override
-  public int getCurrentMinor() {
-    return Version.CURRENT_MINOR;
-  }
-
-  @Override
-  public void close() throws IOException {
-    out.close();
-  }
-}
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NAbsentArrayDimension.java b/jack/src/com/android/jack/jayce/v0002/nodes/NAbsentArrayDimension.java
index fc49090..5ba7a7d 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NAbsentArrayDimension.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NAbsentArrayDimension.java
@@ -20,7 +20,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -54,11 +53,6 @@
 
   @SuppressWarnings("unused")
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-  }
-
-  @SuppressWarnings("unused")
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
   }
 
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NAddOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NAddOperation.java
index 86c6632..f658ae7 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NAddOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NAddOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NAlloc.java b/jack/src/com/android/jack/jayce/v0002/nodes/NAlloc.java
index 450dddc..3d3aa57 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NAlloc.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NAlloc.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -63,11 +62,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(instanceType);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     instanceType = in.readId();
   }
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NAndOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NAndOperation.java
index 63376e9..0c52eb2 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NAndOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NAndOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NAnnotation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NAnnotation.java
index cb9cc4b..0307143 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NAnnotation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NAnnotation.java
@@ -24,7 +24,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -83,14 +82,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    assert retentionPolicy != null;
-    out.writeRetentionPolicyEnum(retentionPolicy);
-    out.writeId(annotationType);
-    out.writeNodes(elements);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     retentionPolicy = in.readRetentionPolicyEnum();
     annotationType = in.readId();
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NAnnotationMethod.java b/jack/src/com/android/jack/jayce/v0002/nodes/NAnnotationMethod.java
index 5df6e6a..2ea7623 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NAnnotationMethod.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NAnnotationMethod.java
@@ -30,7 +30,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -102,17 +101,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    assert annotations != null;
-    out.writeId(name);
-    out.writeId(returnType);
-    out.writeInt(modifier);
-    out.writeNodes(annotations);
-    out.writeNode(defaultValue);
-    out.writeNodes(markers);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     level = in.getNodeLevel();
     name = in.readId();
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NAnnotationType.java b/jack/src/com/android/jack/jayce/v0002/nodes/NAnnotationType.java
index 80b4ed5..0b95057 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NAnnotationType.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NAnnotationType.java
@@ -29,7 +29,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.util.NamingTools;
 
@@ -121,21 +120,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    assert retentionPolicy != null;
-    out.writeRetentionPolicyEnum(retentionPolicy);
-    out.writeInt(modifiers);
-    out.writeId(signature);
-    out.writeIds(superInterfaces);
-    out.writeId(enclosingType);
-    out.writeIds(inners);
-    out.writeNodes(getFields());
-    out.writeNodes(getMethods());
-    out.writeNodes(annotations);
-    out.writeNodes(markers);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     level = in.getNodeLevel();
     retentionPolicy = in.readRetentionPolicyEnum();
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NArrayLength.java b/jack/src/com/android/jack/jayce/v0002/nodes/NArrayLength.java
index 0986ea5..4b467e8 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NArrayLength.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NArrayLength.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -66,11 +65,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(instance);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     instance = in.readNode(NExpression.class);
   }
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NArrayLiteral.java b/jack/src/com/android/jack/jayce/v0002/nodes/NArrayLiteral.java
index a46fd01..c7ca67b 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NArrayLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NArrayLiteral.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -71,11 +70,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNodes(values);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     values = in.readNodes(NLiteral.class);
   }
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NArrayRef.java b/jack/src/com/android/jack/jayce/v0002/nodes/NArrayRef.java
index 5a887ef..29b4319 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NArrayRef.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NArrayRef.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -72,12 +71,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(instance);
-    out.writeNode(index);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     instance = in.readNode(NExpression.class);
     index = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgAddOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgAddOperation.java
index 3626421..712ffd9 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgAddOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgAddOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgBitAndOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgBitAndOperation.java
index 7b3f381..35da5f4 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgBitAndOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgBitAndOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgBitOrOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgBitOrOperation.java
index e3d82ef..209ff3b 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgBitOrOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgBitOrOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgBitXorOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgBitXorOperation.java
index ab2f788..19d265f 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgBitXorOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgBitXorOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgConcatOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgConcatOperation.java
index 11ff9d1..50264fe 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgConcatOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgConcatOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgDivOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgDivOperation.java
index 5826b3b..4b29df3 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgDivOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgDivOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgModOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgModOperation.java
index f34da1f..9107608 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgModOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgModOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgMulOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgMulOperation.java
index 7551140..8d8c22c 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgMulOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgMulOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgOperation.java
index 2371a40..3e0524c 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgShlOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgShlOperation.java
index c328902..4c35056 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgShlOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgShlOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgShrOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgShrOperation.java
index 82ee7d4..2d61062 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgShrOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgShrOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgShruOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgShruOperation.java
index 1768a4e..c2a168f 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgShruOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgShruOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgSubOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgSubOperation.java
index b3d5bf0..feae2ac 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NAsgSubOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NAsgSubOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NAssertStatement.java b/jack/src/com/android/jack/jayce/v0002/nodes/NAssertStatement.java
index 2c7a4a3..f04e1e8 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NAssertStatement.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NAssertStatement.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -84,12 +83,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(testExpression);
-    out.writeNode(arg);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     testExpression = in.readNode(NExpression.class);
     arg = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NBitAndOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NBitAndOperation.java
index d4dc894..41387b4 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NBitAndOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NBitAndOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NBitOrOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NBitOrOperation.java
index 531696e..f7ac85a 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NBitOrOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NBitOrOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NBitXorOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NBitXorOperation.java
index ad7b7dd..1007602 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NBitXorOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NBitXorOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NBlock.java b/jack/src/com/android/jack/jayce/v0002/nodes/NBlock.java
index 83c8de0..18e754d 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NBlock.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NBlock.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -74,11 +73,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNodes(statements);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     statements = in.readNodes(NStatement.class);
 
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NBooleanLiteral.java b/jack/src/com/android/jack/jayce/v0002/nodes/NBooleanLiteral.java
index ac272be..9722a24 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NBooleanLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NBooleanLiteral.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -59,14 +58,8 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeBoolean(value);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     value = in.readBoolean();
-    
   }
 
   @Override
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NBreakStatement.java b/jack/src/com/android/jack/jayce/v0002/nodes/NBreakStatement.java
index 4e15d9e..91ec822 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NBreakStatement.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NBreakStatement.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -71,11 +70,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeString(label);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     label = in.readString();
   }
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NByteLiteral.java b/jack/src/com/android/jack/jayce/v0002/nodes/NByteLiteral.java
index 3796a36..1377c19 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NByteLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NByteLiteral.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -59,14 +58,8 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeByte(value);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     value = in.readByte();
-    
   }
 
   @Override
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NCaseStatement.java b/jack/src/com/android/jack/jayce/v0002/nodes/NCaseStatement.java
index ab7333d..2b965e8 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NCaseStatement.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NCaseStatement.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -80,12 +79,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(id);
-    out.writeNode(expr);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     id = in.readId();
     expr = in.readNode(NLiteral.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NCatchBlock.java b/jack/src/com/android/jack/jayce/v0002/nodes/NCatchBlock.java
index 39e7ed8..b6cd636 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NCatchBlock.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NCatchBlock.java
@@ -24,7 +24,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -103,14 +102,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(id);
-    out.writeIds(catchTypes);
-    out.writeNode(catchVar);
-    out.writeNodes(statements);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     id = in.readId();
     catchTypes = in.readIds();
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NCharLiteral.java b/jack/src/com/android/jack/jayce/v0002/nodes/NCharLiteral.java
index 8c6e1ff..2c59cd2 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NCharLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NCharLiteral.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -59,14 +58,8 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeChar(value);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     value = in.readChar();
-    
   }
 
   @Override
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NClassLiteral.java b/jack/src/com/android/jack/jayce/v0002/nodes/NClassLiteral.java
index 6df0c8c..6fde647 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NClassLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NClassLiteral.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -64,11 +63,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(refType);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     refType = in.readId();
 
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NClassType.java b/jack/src/com/android/jack/jayce/v0002/nodes/NClassType.java
index 1ed2c94..e00f4f8 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NClassType.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NClassType.java
@@ -30,7 +30,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 import com.android.jack.util.NamingTools;
@@ -169,23 +168,6 @@
  }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeInt(modifiers);
-    out.writeId(signature);
-    out.writeId(superClass);
-    out.writeIds(superInterfaces);
-    out.writeId(enclosingType);
-    out.writeId(enclosingMethodClass);
-    out.writeId(enclosingMethod);
-    out.writeIds(inners);
-    out.writeNodes(getFields());
-    out.writeNodes(getMethods());
-    out.writeNodes(annotations);
-    out.writeNodes(markers);
-
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     level = in.getNodeLevel();
     modifiers = in.readInt();
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NConcatOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NConcatOperation.java
index ae0c812..cbce509 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NConcatOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NConcatOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -72,12 +71,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NConditionalExpression.java b/jack/src/com/android/jack/jayce/v0002/nodes/NConditionalExpression.java
index 56ffe67..947d6a3 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NConditionalExpression.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NConditionalExpression.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -79,13 +78,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(ifTest);
-    out.writeNode(thenExpr);
-    out.writeNode(elseExpr);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     ifTest = in.readNode(NExpression.class);
     thenExpr = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NConstructor.java b/jack/src/com/android/jack/jayce/v0002/nodes/NConstructor.java
index 199ce84..cb08009 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NConstructor.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NConstructor.java
@@ -28,7 +28,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -91,16 +90,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    assert annotations != null;
-    out.writeNodes(getParameters());
-    out.writeInt(modifier);
-    out.writeNodes(annotations);
-    out.writeNode(body);
-    out.writeNodes(markers);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     level = in.getNodeLevel();
     setParameters(in.readNodes(NParameter.class));
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NContinueStatement.java b/jack/src/com/android/jack/jayce/v0002/nodes/NContinueStatement.java
index 8102924..99239b0 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NContinueStatement.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NContinueStatement.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -73,11 +72,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeString(label);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     label = in.readString();
   }
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NDivOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NDivOperation.java
index 23a8438..ee5e7dc 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NDivOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NDivOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NDoStatement.java b/jack/src/com/android/jack/jayce/v0002/nodes/NDoStatement.java
index ae9997b..cde3fd5 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NDoStatement.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NDoStatement.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -79,12 +78,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(testExpression);
-    out.writeNode(body);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     testExpression = in.readNode(NExpression.class);
     body = in.readNode(NStatement.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NDoubleLiteral.java b/jack/src/com/android/jack/jayce/v0002/nodes/NDoubleLiteral.java
index b9292d5..8efb455 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NDoubleLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NDoubleLiteral.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -60,14 +59,8 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeDouble(value);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     value = in.readDouble();
-    
   }
 
   @Override
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NDynamicCastOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NDynamicCastOperation.java
index ae8010c..3797af4 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NDynamicCastOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NDynamicCastOperation.java
@@ -24,7 +24,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -70,12 +69,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(castType);
-    out.writeNode(expr);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     castType = in.readId();
     expr = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NEnumField.java b/jack/src/com/android/jack/jayce/v0002/nodes/NEnumField.java
index 034c45c..f7757b0 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NEnumField.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NEnumField.java
@@ -25,7 +25,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -92,17 +91,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeInt(modifiers);
-    out.writeId(type);
-    out.writeId(name);
-    out.writeNode(initialValue);
-    out.writeInt(ordinal);
-    out.writeNodes(annotations);
-    out.writeNodes(markers);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     modifiers = in.readInt();
     type = in.readId();
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NEnumLiteral.java b/jack/src/com/android/jack/jayce/v0002/nodes/NEnumLiteral.java
index e5a222b..3220cfa 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NEnumLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NEnumLiteral.java
@@ -25,7 +25,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JLookup;
 
@@ -76,12 +75,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(enumFieldDeclaringType);
-    out.writeId(enumFieldName);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     enumFieldDeclaringType = in.readId();
     enumFieldName = in.readId();
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NEnumType.java b/jack/src/com/android/jack/jayce/v0002/nodes/NEnumType.java
index e6ce97e..15ceeba 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NEnumType.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NEnumType.java
@@ -30,7 +30,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 import com.android.jack.util.NamingTools;
@@ -138,23 +137,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeInt(modifiers);
-    out.writeId(signature);
-    out.writeId(superClass);
-    out.writeIds(superInterfaces);
-    out.writeId(enclosingType);
-    out.writeId(enclosingMethodClass);
-    out.writeId(enclosingMethod);
-    out.writeIds(inners);
-    out.writeNodes(getFields());
-    out.writeNodes(getMethods());
-    out.writeNodes(annotations);
-    out.writeNodes(markers);
-
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     level = in.getNodeLevel();
     modifiers = in.readInt();
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NEqOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NEqOperation.java
index dfcd198..2e7e17c 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NEqOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NEqOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NExceptionRuntimeValue.java b/jack/src/com/android/jack/jayce/v0002/nodes/NExceptionRuntimeValue.java
index 6d45802..7624985 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NExceptionRuntimeValue.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NExceptionRuntimeValue.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -62,11 +61,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(catchedType);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     catchedType = in.readId();
   }
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NExpressionStatement.java b/jack/src/com/android/jack/jayce/v0002/nodes/NExpressionStatement.java
index b4197ce..f378e53 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NExpressionStatement.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NExpressionStatement.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -75,11 +74,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(expression);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     expression = in.readNode(NExpression.class);
   }
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NField.java b/jack/src/com/android/jack/jayce/v0002/nodes/NField.java
index 78bfc46..c7f0212 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NField.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NField.java
@@ -28,7 +28,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -121,16 +120,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeInt(modifiers);
-    out.writeId(type);
-    out.writeId(name);
-    out.writeNode(initialValue);
-    out.writeNodes(annotations);
-    out.writeNodes(markers);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     modifiers = in.readInt();
     type = in.readId();
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NFieldInitializer.java b/jack/src/com/android/jack/jayce/v0002/nodes/NFieldInitializer.java
index c0cebac..f0ea949 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NFieldInitializer.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NFieldInitializer.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -50,11 +49,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) {
     throw new UnsupportedOperationException();
   }
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NFieldRef.java b/jack/src/com/android/jack/jayce/v0002/nodes/NFieldRef.java
index 38c0ef7..eb215e7 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NFieldRef.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NFieldRef.java
@@ -26,7 +26,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -90,16 +89,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    assert kind != null;
-    out.writeId(field);
-    out.writeId(fieldType);
-    out.writeId(receiverType);
-    out.writeFieldRefKindEnum(kind);
-    out.writeNode(instance);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     field = in.readId();
     fieldType = in.readId();
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NFloatLiteral.java b/jack/src/com/android/jack/jayce/v0002/nodes/NFloatLiteral.java
index 742102b..a152053 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NFloatLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NFloatLiteral.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -60,14 +59,8 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeFloat(value);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     value = in.readFloat();
-    
   }
 
   @Override
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NForStatement.java b/jack/src/com/android/jack/jayce/v0002/nodes/NForStatement.java
index 5fc7c8c..a857fb3 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NForStatement.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NForStatement.java
@@ -25,7 +25,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -101,17 +100,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    assert initializers != null;
-    assert increments != null;
-
-    out.writeNodes(initializers);
-    out.writeNode(testExpression);
-    out.writeNodes(increments);
-    out.writeNode(body);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     initializers = in.readNodes(NStatement.class);
     testExpression = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NGenericSignature.java b/jack/src/com/android/jack/jayce/v0002/nodes/NGenericSignature.java
index 2a4780e..3e4e056 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NGenericSignature.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NGenericSignature.java
@@ -20,7 +20,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -53,11 +52,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeString(genericSignature);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     genericSignature = in.readString();
   }
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NGoto.java b/jack/src/com/android/jack/jayce/v0002/nodes/NGoto.java
index 23848b0..a1cf0cd 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NGoto.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NGoto.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -73,11 +72,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(target);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     target = in.readId();
   }
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NGtOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NGtOperation.java
index 15cce80..97c07cd 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NGtOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NGtOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NGteOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NGteOperation.java
index 043fc5d..916986d 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NGteOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NGteOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NIfStatement.java b/jack/src/com/android/jack/jayce/v0002/nodes/NIfStatement.java
index 7696473..0879b21 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NIfStatement.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NIfStatement.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -88,13 +87,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(ifExpression);
-    out.writeNode(thenStatement);
-    out.writeNode(elseStatement);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     ifExpression = in.readNode(NExpression.class);
     thenStatement = in.readNode(NStatement.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NInstanceOf.java b/jack/src/com/android/jack/jayce/v0002/nodes/NInstanceOf.java
index 57fbe54..273bb50 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NInstanceOf.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NInstanceOf.java
@@ -24,7 +24,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -72,12 +71,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(expr);
-    out.writeId(testType);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     expr = in.readNode(NExpression.class);
     testType = in.readId();
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NIntLiteral.java b/jack/src/com/android/jack/jayce/v0002/nodes/NIntLiteral.java
index e7868d6..15b91a8 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NIntLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NIntLiteral.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -59,14 +58,8 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeInt(value);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     value = in.readInt();
-    
   }
 
   @Override
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NInterfaceType.java b/jack/src/com/android/jack/jayce/v0002/nodes/NInterfaceType.java
index da2b0ad..813095f 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NInterfaceType.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NInterfaceType.java
@@ -28,7 +28,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.util.NamingTools;
 
@@ -137,20 +136,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeInt(modifiers);
-    out.writeId(signature);
-    out.writeIds(superInterfaces);
-    out.writeId(enclosingType);
-    out.writeIds(inners);
-    out.writeNodes(getFields());
-    out.writeNodes(getMethods());
-    out.writeNodes(annotations);
-    out.writeNodes(markers);
-
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     level = in.getNodeLevel();
     modifiers = in.readInt();
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NLabeledStatement.java b/jack/src/com/android/jack/jayce/v0002/nodes/NLabeledStatement.java
index 5c9ac36..1eef583 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NLabeledStatement.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NLabeledStatement.java
@@ -24,7 +24,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -88,13 +87,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeString(label);
-    out.writeId(id);
-    out.writeNode(body);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     label = in.readString();
     id = in.readId();
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NLocal.java b/jack/src/com/android/jack/jayce/v0002/nodes/NLocal.java
index 12a1b63..d85a059 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NLocal.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NLocal.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -100,16 +99,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(id);
-    out.writeInt(modifiers);
-    out.writeId(type);
-    out.writeId(name);
-    out.writeNodes(annotationSet);
-    out.writeNodes(markers);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     id = in.readId();
     modifiers = in.readInt();
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NLocalRef.java b/jack/src/com/android/jack/jayce/v0002/nodes/NLocalRef.java
index 0421ba0..22d8dd1 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NLocalRef.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NLocalRef.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -62,11 +61,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(localId);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     localId = in.readId();
 
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NLock.java b/jack/src/com/android/jack/jayce/v0002/nodes/NLock.java
index df9e049..ad7f1f1 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NLock.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NLock.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -75,11 +74,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lockExpr);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lockExpr = in.readNode(NExpression.class);
   }
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NLongLiteral.java b/jack/src/com/android/jack/jayce/v0002/nodes/NLongLiteral.java
index 617639c..d9fc62d 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NLongLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NLongLiteral.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -59,14 +58,8 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeLong(value);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     value = in.readLong();
-    
   }
 
   @Override
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NLtOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NLtOperation.java
index 74a55cc..d01e172 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NLtOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NLtOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NLteOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NLteOperation.java
index fcadb49..ebe14e2 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NLteOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NLteOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NMethod.java b/jack/src/com/android/jack/jayce/v0002/nodes/NMethod.java
index d12008f..6113ad5 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NMethod.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NMethod.java
@@ -36,7 +36,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -163,19 +162,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    assert methodKind != null;
-    out.writeId(name);
-    out.writeId(returnType);
-    out.writeNodes(getParameters());
-    out.writeMethodKindEnum(methodKind);
-    out.writeInt(modifier);
-    out.writeNodes(annotations);
-    out.writeNode(body);
-    out.writeNodes(markers);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     level = in.getNodeLevel();
     name = in.readId();
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NMethodBody.java b/jack/src/com/android/jack/jayce/v0002/nodes/NMethodBody.java
index 94d0887..38dfbea 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NMethodBody.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NMethodBody.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -74,12 +73,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNodes(locals);
-    out.writeNode(block);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     locals = in.readNodes(NLocal.class);
     block = in.readNode(NBlock.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NMethodCall.java b/jack/src/com/android/jack/jayce/v0002/nodes/NMethodCall.java
index fe48918..3fdb403 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NMethodCall.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NMethodCall.java
@@ -29,7 +29,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -137,26 +136,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    assert receiverType != null;
-    assert receiverKind != null;
-    assert methodName != null;
-    assert methodKind != null;
-    assert returnType != null;
-    assert dispatchKind != null;
-    assert sourceInfo != null;
-    out.writeNode(instance);
-    out.writeId(receiverType);
-    out.writeReceiverKindEnum(receiverKind);
-    out.writeId(methodName);
-    out.writeIds(methodArgsType);
-    out.writeMethodKindEnum(methodKind);
-    out.writeId(returnType);
-    out.writeNodes(args);
-    out.writeDispatchKindEnum(dispatchKind);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     instance = in.readNode(NExpression.class);
     receiverType = in.readId();
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NMethodLiteral.java b/jack/src/com/android/jack/jayce/v0002/nodes/NMethodLiteral.java
index 85cccd0..a40241a 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NMethodLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NMethodLiteral.java
@@ -24,7 +24,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -75,12 +74,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(method);
-    out.writeId(methodEnclosingType);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     method = in.readId();
     methodEnclosingType = in.readId();
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NModOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NModOperation.java
index d7309ae..77235dd 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NModOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NModOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NMulOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NMulOperation.java
index 4e2f3d4..4768d7d 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NMulOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NMulOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NMultiExpression.java b/jack/src/com/android/jack/jayce/v0002/nodes/NMultiExpression.java
index fc263a5..889ea0e 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NMultiExpression.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NMultiExpression.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -71,11 +70,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNodes(exprs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     exprs = in.readNodes(NExpression.class);
 
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NNameValuePair.java b/jack/src/com/android/jack/jayce/v0002/nodes/NNameValuePair.java
index 895f114..8e75e60 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NNameValuePair.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NNameValuePair.java
@@ -28,7 +28,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -87,12 +86,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeString(name);
-    out.writeNode(value);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     name = in.readString();
     value = in.readNode(NLiteral.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NNativeMethodBody.java b/jack/src/com/android/jack/jayce/v0002/nodes/NNativeMethodBody.java
index 3909d02..3495320 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NNativeMethodBody.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NNativeMethodBody.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -57,12 +56,6 @@
 
   @SuppressWarnings("unused")
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-
-  }
-
-  @SuppressWarnings("unused")
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
 
   }
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NNeqOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NNeqOperation.java
index 4b27f28..2b692fe 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NNeqOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NNeqOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NNewArray.java b/jack/src/com/android/jack/jayce/v0002/nodes/NNewArray.java
index f5ded7b..53dce14 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NNewArray.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NNewArray.java
@@ -24,7 +24,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -88,13 +87,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(type);
-    out.writeNodes(dims);
-    out.writeNodes(initializers);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     type = in.readId();
     dims = in.readNodes(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NNewInstance.java b/jack/src/com/android/jack/jayce/v0002/nodes/NNewInstance.java
index 322f939..d07d368 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NNewInstance.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NNewInstance.java
@@ -26,7 +26,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -80,15 +79,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    assert instance == null;
-    assert methodKind == null;
-    out.writeId(receiverType);
-    out.writeIds(methodArgsType);
-    out.writeNodes(args);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     receiverType = in.readId();
     methodArgsType = in.readIds();
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NNullLiteral.java b/jack/src/com/android/jack/jayce/v0002/nodes/NNullLiteral.java
index 428396f..9803ff0 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NNullLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NNullLiteral.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -57,11 +56,6 @@
 
   @SuppressWarnings("unused")
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-  }
-
-  @SuppressWarnings("unused")
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
   }
 
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NOrOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NOrOperation.java
index a8820db..4f6c9b9 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NOrOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NOrOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NParameter.java b/jack/src/com/android/jack/jayce/v0002/nodes/NParameter.java
index 677c3d8..c69a48a 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NParameter.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NParameter.java
@@ -26,7 +26,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -114,16 +113,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(id);
-    out.writeInt(modifiers);
-    out.writeId(type);
-    out.writeId(name);
-    out.writeNodes(annotations);
-    out.writeNodes(markers);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     id = in.readId();
     modifiers = in.readInt();
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NParameterRef.java b/jack/src/com/android/jack/jayce/v0002/nodes/NParameterRef.java
index 9c53533..d68d22c 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NParameterRef.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NParameterRef.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -63,11 +62,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(localId);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     localId = in.readId();
   }
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NPostfixDecOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NPostfixDecOperation.java
index d7cc927..d0761ce 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NPostfixDecOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NPostfixDecOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -62,11 +61,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(arg);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     arg = in.readNode(NExpression.class);
 
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NPostfixIncOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NPostfixIncOperation.java
index 59e6c69..9b750cd 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NPostfixIncOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NPostfixIncOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -62,11 +61,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(arg);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     arg = in.readNode(NExpression.class);
 
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NPrefixBitNotOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NPrefixBitNotOperation.java
index 15dd882..dff4e86 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NPrefixBitNotOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NPrefixBitNotOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -62,11 +61,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(arg);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     arg = in.readNode(NExpression.class);
 
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NPrefixDecOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NPrefixDecOperation.java
index 51d86c8..c7bbaa2 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NPrefixDecOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NPrefixDecOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -62,11 +61,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(arg);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     arg = in.readNode(NExpression.class);
 
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NPrefixIncOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NPrefixIncOperation.java
index 72f2cb5..0207af6 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NPrefixIncOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NPrefixIncOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -62,11 +61,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(arg);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     arg = in.readNode(NExpression.class);
 
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NPrefixNegOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NPrefixNegOperation.java
index 10633ec..0498b36 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NPrefixNegOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NPrefixNegOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -62,11 +61,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(arg);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     arg = in.readNode(NExpression.class);
 
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NPrefixNotOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NPrefixNotOperation.java
index 246fe4e..8ce086c 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NPrefixNotOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NPrefixNotOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -62,11 +61,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(arg);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     arg = in.readNode(NExpression.class);
 
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NReinterpretCastOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NReinterpretCastOperation.java
index a07f316..1201f79 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NReinterpretCastOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NReinterpretCastOperation.java
@@ -24,7 +24,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -74,12 +73,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(castType);
-    out.writeNode(expr);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     castType = in.readId();
     expr = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NReturnStatement.java b/jack/src/com/android/jack/jayce/v0002/nodes/NReturnStatement.java
index db316d8..19628a9 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NReturnStatement.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NReturnStatement.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -74,11 +73,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(expr);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     expr = in.readNode(NExpression.class);
   }
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NShlOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NShlOperation.java
index ea4522f..2fb3033 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NShlOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NShlOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NShortLiteral.java b/jack/src/com/android/jack/jayce/v0002/nodes/NShortLiteral.java
index b736662..7114f6e 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NShortLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NShortLiteral.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -59,14 +58,8 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeShort(value);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     value = in.readShort();
-    
   }
 
   @Override
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NShrOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NShrOperation.java
index bf652ad..dcdec80 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NShrOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NShrOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NShruOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NShruOperation.java
index bf8eb97..bced6d0 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NShruOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NShruOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NSimpleName.java b/jack/src/com/android/jack/jayce/v0002/nodes/NSimpleName.java
index e8e779c..9014619 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NSimpleName.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NSimpleName.java
@@ -20,7 +20,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -54,11 +53,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeString(simpleName);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     simpleName = in.readString();
   }
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NStringLiteral.java b/jack/src/com/android/jack/jayce/v0002/nodes/NStringLiteral.java
index a7464e0..e144787 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NStringLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NStringLiteral.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -61,11 +60,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeString(value);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     value = in.readString();
 
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NSubOperation.java b/jack/src/com/android/jack/jayce/v0002/nodes/NSubOperation.java
index 5266807..08ddc95 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NSubOperation.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NSubOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NSwitchStatement.java b/jack/src/com/android/jack/jayce/v0002/nodes/NSwitchStatement.java
index fb42b9a..4cb863d 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NSwitchStatement.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NSwitchStatement.java
@@ -24,7 +24,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -98,13 +97,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(expr);
-    out.writeIds(cases);
-    out.writeNode(body);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     expr = in.readNode(NExpression.class);
     cases = in.readIds();
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NSynchronizedBlock.java b/jack/src/com/android/jack/jayce/v0002/nodes/NSynchronizedBlock.java
index 88e3461..949ada0 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NSynchronizedBlock.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NSynchronizedBlock.java
@@ -25,7 +25,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -86,12 +85,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lockExpr);
-    out.writeNode(synchronizedBlock);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lockExpr = in.readNode(NExpression.class);
     synchronizedBlock = in.readNode(NBlock.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NThisRef.java b/jack/src/com/android/jack/jayce/v0002/nodes/NThisRef.java
index 9c780a5..31c5f9d 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NThisRef.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NThisRef.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -63,11 +62,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(type);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     type = in.readId();
 
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NThisRefTypeInfo.java b/jack/src/com/android/jack/jayce/v0002/nodes/NThisRefTypeInfo.java
index b8bc490..a4a00de 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NThisRefTypeInfo.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NThisRefTypeInfo.java
@@ -20,7 +20,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -56,11 +55,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeString(genericSignature);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     genericSignature = in.readString();
   }
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NThrowStatement.java b/jack/src/com/android/jack/jayce/v0002/nodes/NThrowStatement.java
index 921d034..bc2d10d 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NThrowStatement.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NThrowStatement.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -75,11 +74,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(expr);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     expr = in.readNode(NExpression.class);
   }
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NThrownExceptionMarker.java b/jack/src/com/android/jack/jayce/v0002/nodes/NThrownExceptionMarker.java
index 8786fee..87a1f55 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NThrownExceptionMarker.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NThrownExceptionMarker.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 
 import java.io.IOException;
@@ -61,11 +60,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeIds(thrownExceptions);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     thrownExceptions = in.readIds();
   }
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NTryStatement.java b/jack/src/com/android/jack/jayce/v0002/nodes/NTryStatement.java
index be93e4a..f52bd2e 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NTryStatement.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NTryStatement.java
@@ -24,7 +24,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -96,14 +95,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNodes(resourcesDeclaration);
-    out.writeNode(tryBlock);
-    out.writeNodes(catchBlocks);
-    out.writeNode(finallyBlock);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     resourcesDeclaration = in.readNodes(NStatement.class);
     tryBlock = in.readNode(NBlock.class);
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NUnlock.java b/jack/src/com/android/jack/jayce/v0002/nodes/NUnlock.java
index 2232e9c..c23b2b8 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NUnlock.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NUnlock.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -75,11 +74,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lockExpr);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lockExpr = in.readNode(NExpression.class);
   }
diff --git a/jack/src/com/android/jack/jayce/v0002/nodes/NWhileStatement.java b/jack/src/com/android/jack/jayce/v0002/nodes/NWhileStatement.java
index 3e92825..cce2f1f 100644
--- a/jack/src/com/android/jack/jayce/v0002/nodes/NWhileStatement.java
+++ b/jack/src/com/android/jack/jayce/v0002/nodes/NWhileStatement.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0002.io.ExportSession;
 import com.android.jack.jayce.v0002.io.ImportHelper;
 import com.android.jack.jayce.v0002.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0002.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0002.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -79,12 +78,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(testExpression);
-    out.writeNode(body);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     testExpression = in.readNode(NExpression.class);
     body = in.readNode(NStatement.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/NNode.java b/jack/src/com/android/jack/jayce/v0003/NNode.java
index 4a3a5dc..0077b15 100644
--- a/jack/src/com/android/jack/jayce/v0003/NNode.java
+++ b/jack/src/com/android/jack/jayce/v0003/NNode.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -45,8 +44,6 @@
   public abstract Object exportAsJast(@Nonnull ExportSession exportSession)
       throws JTypeLookupException, JMethodLookupException;
 
-  public abstract void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException;
-
   public abstract void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException;
 
   @Nonnull
diff --git a/jack/src/com/android/jack/jayce/v0003/io/JayceInternalWriterImpl.java b/jack/src/com/android/jack/jayce/v0003/io/JayceInternalWriterImpl.java
deleted file mode 100644
index 3760ec5..0000000
--- a/jack/src/com/android/jack/jayce/v0003/io/JayceInternalWriterImpl.java
+++ /dev/null
@@ -1,356 +0,0 @@
-/*
-* Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.jack.jayce.v0003.io;
-
-import com.android.jack.JackEventType;
-import com.android.jack.ir.ast.FieldKind;
-import com.android.jack.ir.ast.JMethodCall.DispatchKind;
-import com.android.jack.ir.ast.JNode;
-import com.android.jack.ir.ast.JRetentionPolicy;
-import com.android.jack.ir.ast.MethodKind;
-import com.android.jack.jayce.JayceInternalWriter;
-import com.android.jack.jayce.v0003.NNode;
-import com.android.jack.jayce.v0003.NodeFactory;
-import com.android.jack.jayce.v0003.Version;
-import com.android.jack.jayce.v0003.nodes.HasCatchBlockIds;
-import com.android.jack.jayce.v0003.nodes.HasSourceInfo;
-import com.android.jack.jayce.v0003.nodes.NMethod;
-import com.android.jack.jayce.v0003.nodes.NMethodCall.ReceiverKind;
-import com.android.jack.jayce.v0003.nodes.NSourceInfo;
-import com.android.jack.jayce.v0003.util.DispatchKindIdHelper;
-import com.android.jack.jayce.v0003.util.FieldRefKindIdHelper;
-import com.android.jack.jayce.v0003.util.MethodKindIdHelper;
-import com.android.jack.jayce.v0003.util.ReceiverKindIdHelper;
-import com.android.jack.jayce.v0003.util.RetentionPolicyIdHelper;
-import com.android.sched.util.log.Event;
-import com.android.sched.util.log.Tracer;
-import com.android.sched.util.log.TracerFactory;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.annotation.CheckForNull;
-import javax.annotation.Nonnegative;
-import javax.annotation.Nonnull;
-
-/**
- * Jayce internal writer implementation.
- */
-public class JayceInternalWriterImpl implements JayceInternalWriter {
-
-  @Nonnull
-  private final Tracer tracer = TracerFactory.getTracer();
-
-  @Nonnull
-  private final JayceOutputStream out;
-
-  @CheckForNull
-  private String currentFileName;
-
-  @Nonnegative
-  private int currentLineNumber;
-
-  @Nonnull
-  private final  List<String> currentCatchBlockList = new ArrayList<String>();
-
-  public JayceInternalWriterImpl(@Nonnull OutputStream out) {
-    this.out = new JayceOutputStream(out);
-  }
-
-  public void writeNode(@CheckForNull NNode node) throws IOException {
-    if (node == null) {
-      writeNull();
-    } else {
-      writeSourceInfoBegin(node);
-      writeCatchBlockIds(node);
-      writeToken(node.getToken());
-      writeOpen();
-      node.writeContent(this);
-      writeSourceInfoEnd(node);
-      assert !(node instanceof NMethod) || currentCatchBlockList.isEmpty();
-      writeClose();
-    }
-  }
-
-  private void writeSourceInfoBegin(@Nonnull NNode node) throws IOException {
-    if (node instanceof HasSourceInfo) {
-      NSourceInfo sourceInfo = ((HasSourceInfo) node).getSourceInfos();
-      writeFileNameIfDifferentFromCurrent(sourceInfo.fileName);
-      writeLineIfDifferentFromCurrent(sourceInfo.startLine);
-    }
-  }
-
-  private void writeSourceInfoEnd(@Nonnull NNode node) throws IOException {
-    if (node instanceof HasSourceInfo) {
-      writeLineIfDifferentFromCurrent(
-          ((HasSourceInfo) node).getSourceInfos().endLine);
-    }
-  }
-
-  public void writeIds(@Nonnull List<String> list) throws IOException {
-    writeOpen();
-
-    writeTrimmedInt(list.size());
-
-    for (String id : list) {
-      writeId(id);
-    }
-
-    writeClose();
-  }
-
-  public void writeCatchBlockIds(@CheckForNull NNode node) throws IOException {
-    if (node instanceof HasCatchBlockIds) {
-      List<String> list = ((HasCatchBlockIds) node).getCatchBlockIds();
-      List<String> removedIds = new ArrayList<String>(currentCatchBlockList.size());
-      List<String> addedIds = new ArrayList<String>(list.size());
-
-      for (String s : currentCatchBlockList) {
-        removedIds.add(s);
-      }
-      for (String s : list) {
-        addedIds.add(s);
-      }
-
-      // intersection(current, list)
-      currentCatchBlockList.retainAll(list);
-      // current \ intersection(current, list)
-      removedIds.removeAll(currentCatchBlockList);
-      // list \ intersection(current, list)
-      addedIds.removeAll(currentCatchBlockList);
-
-      int addedIdsSize = addedIds.size();
-      int removedIdsSize = removedIds.size();
-
-      if (addedIdsSize > 0) {
-        writeOpenAddCatchBlockIds();
-        writeInt(addedIdsSize);
-        for (int i = 0; i < addedIdsSize; i++) {
-          writeString(addedIds.get(i));
-        }
-        writeCloseCatchBlockIds();
-      }
-
-      if (removedIdsSize > 0) {
-        writeOpenRemoveCatchBlockIds();
-        writeInt(removedIdsSize);
-        for (int i = 0; i < removedIdsSize; i++) {
-          writeString(removedIds.get(i));
-        }
-        writeCloseCatchBlockIds();
-      }
-      currentCatchBlockList.addAll(addedIds);
-    }
-  }
-
-  public void writeNodes(@Nonnull Collection<? extends NNode> nodes) throws IOException {
-    writeOpen();
-
-    writeTrimmedInt(nodes.size());
-
-    for (Iterator<? extends NNode> iterator = nodes.iterator(); iterator.hasNext();) {
-      writeNode(iterator.next());
-    }
-
-    writeClose();
-  }
-
-  public void writeInt(int value) throws IOException {
-    writeTrimmedInt(value);
-    writeSpace();
-  }
-
-  private void writeTrimmedInt(int value) throws IOException {
-    out.writeInt(value);
-  }
-
-  public void writeBoolean(boolean value)  throws IOException {
-    out.writeBoolean(value);
-  }
-
-  public void writeLong(long value) throws IOException {
-    writeTrimmedLong(value);
-    writeSpace();
-  }
-
-  private void writeTrimmedLong(long value) throws IOException {
-    out.writeLong(value);
-  }
-
-  public void writeByte(byte value) throws IOException {
-    out.writeByte(value);
-    writeSpace();
-  }
-
-  public void writeShort(short value) throws IOException {
-    out.writeShort(value);
-    writeSpace();
-  }
-
-  public void writeChar(char value) throws IOException {
-    out.writeChar(value);
-    writeSpace();
-  }
-
-  public void writeFloat(float value) throws IOException {
-    writeTrimmedInt(Float.floatToRawIntBits(value));
-    writeSpace();
-  }
-
-  public void writeDouble(double value) throws IOException {
-    writeTrimmedLong(Double.doubleToRawLongBits(value));
-    writeSpace();
-  }
-
-  public void writeId(@CheckForNull String id)  throws IOException {
-    writeString(id);
-  }
-
-  public void writeRetentionPolicyEnum(@Nonnull JRetentionPolicy enumValue) throws IOException {
-    writeByte(RetentionPolicyIdHelper.getId(enumValue));
-  }
-
-  public void writeFieldRefKindEnum(@Nonnull FieldKind enumValue) throws IOException {
-    writeByte(FieldRefKindIdHelper.getId(enumValue));
-  }
-
-  public void writeMethodKindEnum(@Nonnull MethodKind enumValue) throws IOException {
-    writeByte(MethodKindIdHelper.getId(enumValue));
-  }
-
-  public void writeReceiverKindEnum(@Nonnull ReceiverKind enumValue) throws IOException {
-    writeByte(ReceiverKindIdHelper.getId(enumValue));
-  }
-
-  public void writeDispatchKindEnum(@Nonnull DispatchKind enumValue) throws IOException {
-    writeByte(DispatchKindIdHelper.getId(enumValue));
-  }
-
-  public void writeString(@CheckForNull String string)  throws IOException {
-    out.writeUTF(string);
-  }
-
-  public void writeBuffer(@CheckForNull byte[] b)  throws IOException {
-    out.writeBuffer(b);
-  }
-
-  public void writeFileNameIfDifferentFromCurrent(@CheckForNull String fileName)
-      throws IOException {
-   if (fileName != null && !fileName.equals(currentFileName)) {
-      writeCurrentFileName(fileName);
-    }
-    // Assume that elements with unknown debug infos are in same file.
-  }
-
-  public void writeCurrentFileName(@Nonnull String fileName)  throws IOException {
-    writeOpenFileName();
-    writeString(fileName);
-    writeCloseFileName();
-    currentFileName = fileName;
-  }
-
-  public void writeLineIfDifferentFromCurrent(@Nonnegative int lineNumber)
-      throws IOException {
-    if (lineNumber != currentLineNumber) {
-      writeCurrentLine(lineNumber);
-    }
-  }
-
-  public void writeCurrentLine(@Nonnegative int lineNumber)
-      throws IOException {
-    writeOpenLineInfo();
-    writeTrimmedInt(lineNumber);
-    writeCloseLineInfo();
-    currentLineNumber = lineNumber;
-  }
-
-  private void writeNull()  throws IOException {
-    writeToken(Token.NULL);
-    writeSpace();
-  }
-
-  @SuppressWarnings("unused")
-  private void writeSpace()  throws IOException{
-  }
-
-  private void writeToken(@Nonnull Token token) throws IOException {
-    out.writeByte(token.ordinal());
-  }
-
-  @SuppressWarnings("unused")
-  private void writeOpen()  throws IOException{
-  }
-
-  private void writeClose() throws IOException {
-    writeToken(Token.RPARENTHESIS);
-  }
-
-  private void writeOpenFileName() throws IOException {
-    writeToken(Token.SHARP);
-  }
-
-  @SuppressWarnings("unused")
-  private void writeCloseFileName()  throws IOException{
-  }
-
-  private void writeOpenLineInfo() throws IOException {
-    writeToken(Token.LBRACKET);
-  }
-
-  @SuppressWarnings("unused")
-  private void writeCloseLineInfo()  throws IOException{
-  }
-
-  private void writeOpenAddCatchBlockIds() throws IOException {
-    writeToken(Token.LCURLY_ADD);
-  }
-
-  private void writeOpenRemoveCatchBlockIds() throws IOException {
-    writeToken(Token.LCURLY_REMOVE);
-  }
-
-  @SuppressWarnings("unused")
-  private void writeCloseCatchBlockIds()  throws IOException{
-  }
-
-  @Override
-  public void write(@Nonnull JNode jNode) throws IOException {
-    try (Event eventWriting = tracer.open(JackEventType.NNODE_WRITING)) {
-      ImportHelper importHelper = new ImportHelper(new NodeFactory());
-      NNode nNode;
-      try (Event eventConvert = tracer.open(JackEventType.JNODE_TO_NNODE_CONVERSION)) {
-        nNode = importHelper.load(jNode);
-      }
-
-      writeNode(nNode);
-    }
-  }
-
-  @Override
-  public int getCurrentMinor() {
-    return Version.CURRENT_MINOR;
-  }
-
-  @Override
-  public void close() throws IOException {
-    out.close();
-  }
-}
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NAbsentArrayDimension.java b/jack/src/com/android/jack/jayce/v0003/nodes/NAbsentArrayDimension.java
index 30a76fa..3d3cf8d 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NAbsentArrayDimension.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NAbsentArrayDimension.java
@@ -20,7 +20,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -54,11 +53,6 @@
 
   @SuppressWarnings("unused")
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-  }
-
-  @SuppressWarnings("unused")
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
   }
 
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NAddOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NAddOperation.java
index 34639a1..91631c8 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NAddOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NAddOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NAlloc.java b/jack/src/com/android/jack/jayce/v0003/nodes/NAlloc.java
index 32e4686..2118f5b 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NAlloc.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NAlloc.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -63,11 +62,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(instanceType);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     instanceType = in.readId();
   }
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NAndOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NAndOperation.java
index 626a0b8..8d71ec8 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NAndOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NAndOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NAnnotation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NAnnotation.java
index 7d5a96b..f420d0d 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NAnnotation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NAnnotation.java
@@ -24,7 +24,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -90,15 +89,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    assert retentionPolicy != null;
-    out.writeRetentionPolicyEnum(retentionPolicy);
-    out.writeId(annotationType);
-    out.writeNodes(elements);
-    out.writeNodes(markers);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     retentionPolicy = in.readRetentionPolicyEnum();
     annotationType = in.readId();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NAnnotationMethod.java b/jack/src/com/android/jack/jayce/v0003/nodes/NAnnotationMethod.java
index a1a170f..877c5f3 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NAnnotationMethod.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NAnnotationMethod.java
@@ -30,7 +30,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -102,17 +101,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    assert annotations != null;
-    out.writeId(name);
-    out.writeId(returnType);
-    out.writeInt(modifier);
-    out.writeNodes(annotations);
-    out.writeNode(defaultValue);
-    out.writeNodes(markers);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     level = in.getNodeLevel();
     name = in.readId();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NAnnotationType.java b/jack/src/com/android/jack/jayce/v0003/nodes/NAnnotationType.java
index ffa52d7..4f4919c 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NAnnotationType.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NAnnotationType.java
@@ -29,7 +29,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.util.NamingTools;
 
@@ -121,21 +120,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    assert retentionPolicy != null;
-    out.writeRetentionPolicyEnum(retentionPolicy);
-    out.writeInt(modifiers);
-    out.writeId(signature);
-    out.writeIds(superInterfaces);
-    out.writeId(enclosingType);
-    out.writeIds(inners);
-    out.writeNodes(getFields());
-    out.writeNodes(getMethods());
-    out.writeNodes(annotations);
-    out.writeNodes(markers);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     level = in.getNodeLevel();
     retentionPolicy = in.readRetentionPolicyEnum();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NArrayLength.java b/jack/src/com/android/jack/jayce/v0003/nodes/NArrayLength.java
index 3556483..b0171fc 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NArrayLength.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NArrayLength.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -66,11 +65,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(instance);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     instance = in.readNode(NExpression.class);
   }
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NArrayLiteral.java b/jack/src/com/android/jack/jayce/v0003/nodes/NArrayLiteral.java
index 127dddf..a486622 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NArrayLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NArrayLiteral.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -71,11 +70,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNodes(values);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     values = in.readNodes(NLiteral.class);
   }
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NArrayRef.java b/jack/src/com/android/jack/jayce/v0003/nodes/NArrayRef.java
index a830dcc..7264d8a 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NArrayRef.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NArrayRef.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -72,12 +71,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(instance);
-    out.writeNode(index);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     instance = in.readNode(NExpression.class);
     index = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgAddOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgAddOperation.java
index 59f7de3..5a20b0b 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgAddOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgAddOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgBitAndOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgBitAndOperation.java
index a8f23c2..8b5be63 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgBitAndOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgBitAndOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgBitOrOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgBitOrOperation.java
index 61108e7..63c0acf 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgBitOrOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgBitOrOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgBitXorOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgBitXorOperation.java
index 957568a..fb49da9 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgBitXorOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgBitXorOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgConcatOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgConcatOperation.java
index 868cf01..2ad1cb3 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgConcatOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgConcatOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgDivOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgDivOperation.java
index 641a0dc..fbe8a0c 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgDivOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgDivOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgModOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgModOperation.java
index b97a6f0..5d4c6ad 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgModOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgModOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgMulOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgMulOperation.java
index 8deb270..a072139 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgMulOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgMulOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgOperation.java
index f3a32fe..cae23b5 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgShlOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgShlOperation.java
index b757941..17c2706 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgShlOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgShlOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgShrOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgShrOperation.java
index d79090d..189a8c3 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgShrOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgShrOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgShruOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgShruOperation.java
index b59be5c..79108f8 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgShruOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgShruOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgSubOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgSubOperation.java
index a3d2ee6..2e38410 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NAsgSubOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NAsgSubOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NAssertStatement.java b/jack/src/com/android/jack/jayce/v0003/nodes/NAssertStatement.java
index 9e12967..3e835d4 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NAssertStatement.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NAssertStatement.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -84,12 +83,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(testExpression);
-    out.writeNode(arg);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     testExpression = in.readNode(NExpression.class);
     arg = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NBitAndOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NBitAndOperation.java
index 8891729..cc9554a 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NBitAndOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NBitAndOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NBitOrOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NBitOrOperation.java
index 1a9246d..63c9b1b 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NBitOrOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NBitOrOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NBitXorOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NBitXorOperation.java
index 682f191..e996036 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NBitXorOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NBitXorOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NBlock.java b/jack/src/com/android/jack/jayce/v0003/nodes/NBlock.java
index c5b2788..e8c9aa0 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NBlock.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NBlock.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -74,11 +73,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNodes(statements);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     statements = in.readNodes(NStatement.class);
 
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NBooleanLiteral.java b/jack/src/com/android/jack/jayce/v0003/nodes/NBooleanLiteral.java
index d9a529b..f1c286c 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NBooleanLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NBooleanLiteral.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -59,14 +58,8 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeBoolean(value);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     value = in.readBoolean();
-    
   }
 
   @Override
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NBreakStatement.java b/jack/src/com/android/jack/jayce/v0003/nodes/NBreakStatement.java
index 7fadf5d..e7cbcbe 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NBreakStatement.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NBreakStatement.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -71,11 +70,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeString(label);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     label = in.readString();
   }
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NByteLiteral.java b/jack/src/com/android/jack/jayce/v0003/nodes/NByteLiteral.java
index 5102162..f0dfa0a 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NByteLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NByteLiteral.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -59,14 +58,8 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeByte(value);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     value = in.readByte();
-    
   }
 
   @Override
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NCaseStatement.java b/jack/src/com/android/jack/jayce/v0003/nodes/NCaseStatement.java
index 0327351..9c1bfae 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NCaseStatement.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NCaseStatement.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -80,12 +79,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(id);
-    out.writeNode(expr);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     id = in.readId();
     expr = in.readNode(NLiteral.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NCatchBlock.java b/jack/src/com/android/jack/jayce/v0003/nodes/NCatchBlock.java
index 71bc829..c306123 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NCatchBlock.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NCatchBlock.java
@@ -24,7 +24,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -103,14 +102,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(id);
-    out.writeIds(catchTypes);
-    out.writeNode(catchVar);
-    out.writeNodes(statements);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     id = in.readId();
     catchTypes = in.readIds();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NCharLiteral.java b/jack/src/com/android/jack/jayce/v0003/nodes/NCharLiteral.java
index c5d6532..b5fe707 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NCharLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NCharLiteral.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -59,14 +58,8 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeChar(value);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     value = in.readChar();
-    
   }
 
   @Override
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NClassLiteral.java b/jack/src/com/android/jack/jayce/v0003/nodes/NClassLiteral.java
index 203b28a..11b8fbb 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NClassLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NClassLiteral.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -64,11 +63,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(refType);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     refType = in.readId();
 
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NClassType.java b/jack/src/com/android/jack/jayce/v0003/nodes/NClassType.java
index 2780320..4f52654 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NClassType.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NClassType.java
@@ -30,7 +30,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 import com.android.jack.util.NamingTools;
@@ -169,23 +168,6 @@
  }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeInt(modifiers);
-    out.writeId(signature);
-    out.writeId(superClass);
-    out.writeIds(superInterfaces);
-    out.writeId(enclosingType);
-    out.writeId(enclosingMethodClass);
-    out.writeId(enclosingMethod);
-    out.writeIds(inners);
-    out.writeNodes(getFields());
-    out.writeNodes(getMethods());
-    out.writeNodes(annotations);
-    out.writeNodes(markers);
-
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     level = in.getNodeLevel();
     modifiers = in.readInt();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NConcatOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NConcatOperation.java
index db0952f..9d4f818 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NConcatOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NConcatOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -72,12 +71,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NConditionalExpression.java b/jack/src/com/android/jack/jayce/v0003/nodes/NConditionalExpression.java
index b22fb63..8460d2f 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NConditionalExpression.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NConditionalExpression.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -79,13 +78,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(ifTest);
-    out.writeNode(thenExpr);
-    out.writeNode(elseExpr);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     ifTest = in.readNode(NExpression.class);
     thenExpr = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NConstructor.java b/jack/src/com/android/jack/jayce/v0003/nodes/NConstructor.java
index 246159b..07cc4b4 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NConstructor.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NConstructor.java
@@ -28,7 +28,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -91,16 +90,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    assert annotations != null;
-    out.writeNodes(getParameters());
-    out.writeInt(modifier);
-    out.writeNodes(annotations);
-    out.writeNode(body);
-    out.writeNodes(markers);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     level = in.getNodeLevel();
     setParameters(in.readNodes(NParameter.class));
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NContainerAnnotation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NContainerAnnotation.java
index 2733c88..f20e416 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NContainerAnnotation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NContainerAnnotation.java
@@ -20,7 +20,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.transformations.annotation.ContainerAnnotationMarker;
 
@@ -60,13 +59,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    assert retentionPolicy != null;
-    out.writeRetentionPolicyEnum(retentionPolicy);
-    out.writeId(annotationTypeSig);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     retentionPolicy = in.readRetentionPolicyEnum();
     annotationTypeSig = in.readId();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NContinueStatement.java b/jack/src/com/android/jack/jayce/v0003/nodes/NContinueStatement.java
index 2341f7e..a55c83c 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NContinueStatement.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NContinueStatement.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -73,11 +72,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeString(label);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     label = in.readString();
   }
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NDivOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NDivOperation.java
index 8494864..c5e0413 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NDivOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NDivOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NDoStatement.java b/jack/src/com/android/jack/jayce/v0003/nodes/NDoStatement.java
index f884a1f..1908ce9 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NDoStatement.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NDoStatement.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -79,12 +78,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(testExpression);
-    out.writeNode(body);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     testExpression = in.readNode(NExpression.class);
     body = in.readNode(NStatement.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NDoubleLiteral.java b/jack/src/com/android/jack/jayce/v0003/nodes/NDoubleLiteral.java
index e623ed1..e7266bc 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NDoubleLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NDoubleLiteral.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -60,14 +59,8 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeDouble(value);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     value = in.readDouble();
-    
   }
 
   @Override
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NDynamicCastOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NDynamicCastOperation.java
index 3b6ccb4..e7abde8 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NDynamicCastOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NDynamicCastOperation.java
@@ -24,7 +24,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -78,13 +77,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    assert castTypes != null;
-    out.writeIds(castTypes);
-    out.writeNode(expr);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     castTypes = in.readIds();
     expr = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NEnumField.java b/jack/src/com/android/jack/jayce/v0003/nodes/NEnumField.java
index ab1a4ec..71772ae 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NEnumField.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NEnumField.java
@@ -25,7 +25,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -92,17 +91,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeInt(modifiers);
-    out.writeId(type);
-    out.writeId(name);
-    out.writeNode(initialValue);
-    out.writeInt(ordinal);
-    out.writeNodes(annotations);
-    out.writeNodes(markers);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     modifiers = in.readInt();
     type = in.readId();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NEnumLiteral.java b/jack/src/com/android/jack/jayce/v0003/nodes/NEnumLiteral.java
index 2ead7f8..25bfef3 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NEnumLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NEnumLiteral.java
@@ -25,7 +25,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JLookup;
 
@@ -76,12 +75,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(enumFieldDeclaringType);
-    out.writeId(enumFieldName);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     enumFieldDeclaringType = in.readId();
     enumFieldName = in.readId();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NEnumType.java b/jack/src/com/android/jack/jayce/v0003/nodes/NEnumType.java
index 24759b1..e531952 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NEnumType.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NEnumType.java
@@ -30,7 +30,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 import com.android.jack.util.NamingTools;
@@ -138,23 +137,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeInt(modifiers);
-    out.writeId(signature);
-    out.writeId(superClass);
-    out.writeIds(superInterfaces);
-    out.writeId(enclosingType);
-    out.writeId(enclosingMethodClass);
-    out.writeId(enclosingMethod);
-    out.writeIds(inners);
-    out.writeNodes(getFields());
-    out.writeNodes(getMethods());
-    out.writeNodes(annotations);
-    out.writeNodes(markers);
-
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     level = in.getNodeLevel();
     modifiers = in.readInt();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NEqOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NEqOperation.java
index bdf017c..1159db4 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NEqOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NEqOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NExceptionRuntimeValue.java b/jack/src/com/android/jack/jayce/v0003/nodes/NExceptionRuntimeValue.java
index abab103..d688b56 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NExceptionRuntimeValue.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NExceptionRuntimeValue.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -62,11 +61,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(catchedType);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     catchedType = in.readId();
   }
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NExpressionStatement.java b/jack/src/com/android/jack/jayce/v0003/nodes/NExpressionStatement.java
index 3e27c7a..959140f 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NExpressionStatement.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NExpressionStatement.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -75,11 +74,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(expression);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     expression = in.readNode(NExpression.class);
   }
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NField.java b/jack/src/com/android/jack/jayce/v0003/nodes/NField.java
index 807bebd..0264ffa 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NField.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NField.java
@@ -28,7 +28,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -121,16 +120,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeInt(modifiers);
-    out.writeId(type);
-    out.writeId(name);
-    out.writeNode(initialValue);
-    out.writeNodes(annotations);
-    out.writeNodes(markers);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     modifiers = in.readInt();
     type = in.readId();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NFieldInitializer.java b/jack/src/com/android/jack/jayce/v0003/nodes/NFieldInitializer.java
index e3b601b..b33a829 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NFieldInitializer.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NFieldInitializer.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -50,11 +49,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) {
-    throw new UnsupportedOperationException();
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) {
     throw new UnsupportedOperationException();
   }
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NFieldRef.java b/jack/src/com/android/jack/jayce/v0003/nodes/NFieldRef.java
index 3b79cf4..36b7f68 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NFieldRef.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NFieldRef.java
@@ -26,7 +26,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -90,16 +89,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    assert kind != null;
-    out.writeId(field);
-    out.writeId(fieldType);
-    out.writeId(receiverType);
-    out.writeFieldRefKindEnum(kind);
-    out.writeNode(instance);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     field = in.readId();
     fieldType = in.readId();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NFloatLiteral.java b/jack/src/com/android/jack/jayce/v0003/nodes/NFloatLiteral.java
index b7c162c..f448e92 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NFloatLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NFloatLiteral.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -60,14 +59,8 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeFloat(value);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     value = in.readFloat();
-    
   }
 
   @Override
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NForStatement.java b/jack/src/com/android/jack/jayce/v0003/nodes/NForStatement.java
index 4b73da0..438b79e 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NForStatement.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NForStatement.java
@@ -25,7 +25,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -101,17 +100,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    assert initializers != null;
-    assert increments != null;
-
-    out.writeNodes(initializers);
-    out.writeNode(testExpression);
-    out.writeNodes(increments);
-    out.writeNode(body);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     initializers = in.readNodes(NStatement.class);
     testExpression = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NGenericSignature.java b/jack/src/com/android/jack/jayce/v0003/nodes/NGenericSignature.java
index e088da7..a0df018 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NGenericSignature.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NGenericSignature.java
@@ -20,7 +20,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -53,11 +52,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeString(genericSignature);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     genericSignature = in.readString();
   }
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NGoto.java b/jack/src/com/android/jack/jayce/v0003/nodes/NGoto.java
index 2a28bdb..25b4813 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NGoto.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NGoto.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -73,11 +72,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(target);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     target = in.readId();
   }
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NGtOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NGtOperation.java
index 66b6173..c7094a5 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NGtOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NGtOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NGteOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NGteOperation.java
index f229891..4d775a5 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NGteOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NGteOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NIfStatement.java b/jack/src/com/android/jack/jayce/v0003/nodes/NIfStatement.java
index a0cd79d..26c4b69 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NIfStatement.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NIfStatement.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -88,13 +87,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(ifExpression);
-    out.writeNode(thenStatement);
-    out.writeNode(elseStatement);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     ifExpression = in.readNode(NExpression.class);
     thenStatement = in.readNode(NStatement.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NInstanceOf.java b/jack/src/com/android/jack/jayce/v0003/nodes/NInstanceOf.java
index a6ab819..95ccb09 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NInstanceOf.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NInstanceOf.java
@@ -24,7 +24,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -72,12 +71,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(expr);
-    out.writeId(testType);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     expr = in.readNode(NExpression.class);
     testType = in.readId();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NIntLiteral.java b/jack/src/com/android/jack/jayce/v0003/nodes/NIntLiteral.java
index 73942d0..83374ef 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NIntLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NIntLiteral.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -59,14 +58,8 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeInt(value);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     value = in.readInt();
-    
   }
 
   @Override
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NInterfaceType.java b/jack/src/com/android/jack/jayce/v0003/nodes/NInterfaceType.java
index 5324315..89e7f5c 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NInterfaceType.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NInterfaceType.java
@@ -28,7 +28,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.util.NamingTools;
 
@@ -137,20 +136,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeInt(modifiers);
-    out.writeId(signature);
-    out.writeIds(superInterfaces);
-    out.writeId(enclosingType);
-    out.writeIds(inners);
-    out.writeNodes(getFields());
-    out.writeNodes(getMethods());
-    out.writeNodes(annotations);
-    out.writeNodes(markers);
-
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     level = in.getNodeLevel();
     modifiers = in.readInt();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NLabeledStatement.java b/jack/src/com/android/jack/jayce/v0003/nodes/NLabeledStatement.java
index c6bc314..e3b8c3b 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NLabeledStatement.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NLabeledStatement.java
@@ -24,7 +24,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -88,13 +87,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeString(label);
-    out.writeId(id);
-    out.writeNode(body);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     label = in.readString();
     id = in.readId();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NLambda.java b/jack/src/com/android/jack/jayce/v0003/nodes/NLambda.java
index 9688feb..3a35b33 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NLambda.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NLambda.java
@@ -30,7 +30,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.jayce.v0003.nodes.NMethodCall.ReceiverKind;
 import com.android.jack.lookup.JMethodLookupException;
@@ -183,25 +182,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    assert methodRefKind != null;
-    assert receiverKind != null;
-    out.writeNodes(capturedVariables);
-    out.writeReceiverKindEnum(receiverKind);
-    out.writeId(enclosingType);
-    out.writeId(methodRefName);
-    out.writeIds(methodRefArgsType);
-    out.writeMethodKindEnum(methodRefKind);
-    out.writeId(methodRefType);
-    out.writeId(typeSig);
-    out.writeIds(boundsIds);
-    out.writeNode(mthIdWithErasure);
-    out.writeNode(mthIdWithoutErasure);
-    out.writeNodes(bridges);
-    out.writeNodes(markers);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     capturedVariables = in.readNodes(NExpression.class);
     receiverKind = in.readReceiverKindEnum();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NLambdaFromJill.java b/jack/src/com/android/jack/jayce/v0003/nodes/NLambdaFromJill.java
index f4ad8b8..49d43b3 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NLambdaFromJill.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NLambdaFromJill.java
@@ -19,7 +19,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.transformations.lambda.LambdaFromJillMarker;
 
@@ -46,10 +45,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) {
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) {
   }
 
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NLocal.java b/jack/src/com/android/jack/jayce/v0003/nodes/NLocal.java
index 5684211..f592e8f 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NLocal.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NLocal.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -100,16 +99,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(id);
-    out.writeInt(modifiers);
-    out.writeId(type);
-    out.writeId(name);
-    out.writeNodes(annotationSet);
-    out.writeNodes(markers);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     id = in.readId();
     modifiers = in.readInt();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NLocalRef.java b/jack/src/com/android/jack/jayce/v0003/nodes/NLocalRef.java
index d41f492..ad7de01 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NLocalRef.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NLocalRef.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -63,11 +62,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(localId);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     localId = in.readId();
   }
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NLock.java b/jack/src/com/android/jack/jayce/v0003/nodes/NLock.java
index ea5094f..0a3394a 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NLock.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NLock.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -75,11 +74,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lockExpr);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lockExpr = in.readNode(NExpression.class);
   }
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NLongLiteral.java b/jack/src/com/android/jack/jayce/v0003/nodes/NLongLiteral.java
index ed87e9c..2e8e345 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NLongLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NLongLiteral.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -59,14 +58,8 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeLong(value);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     value = in.readLong();
-    
   }
 
   @Override
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NLtOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NLtOperation.java
index 7cac52e..caeccf4 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NLtOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NLtOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NLteOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NLteOperation.java
index 9cc9e59..062a464 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NLteOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NLteOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NMethod.java b/jack/src/com/android/jack/jayce/v0003/nodes/NMethod.java
index dc6a112..172ca71 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NMethod.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NMethod.java
@@ -36,7 +36,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -170,19 +169,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    assert methodKind != null;
-    out.writeId(name);
-    out.writeId(returnType);
-    out.writeNodes(getParameters());
-    out.writeMethodKindEnum(methodKind);
-    out.writeInt(modifier);
-    out.writeNodes(annotations);
-    out.writeNode(body);
-    out.writeNodes(markers);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     level = in.getNodeLevel();
     name = in.readId();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NMethodBody.java b/jack/src/com/android/jack/jayce/v0003/nodes/NMethodBody.java
index 3c61873..bbb63f9 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NMethodBody.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NMethodBody.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -74,12 +73,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNodes(locals);
-    out.writeNode(block);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     locals = in.readNodes(NLocal.class);
     block = in.readNode(NBlock.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NMethodCall.java b/jack/src/com/android/jack/jayce/v0003/nodes/NMethodCall.java
index c35e077..93fa344 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NMethodCall.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NMethodCall.java
@@ -29,7 +29,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -137,26 +136,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    assert receiverType != null;
-    assert receiverKind != null;
-    assert methodName != null;
-    assert methodKind != null;
-    assert returnType != null;
-    assert dispatchKind != null;
-    assert sourceInfo != null;
-    out.writeNode(instance);
-    out.writeId(receiverType);
-    out.writeReceiverKindEnum(receiverKind);
-    out.writeId(methodName);
-    out.writeIds(methodArgsType);
-    out.writeMethodKindEnum(methodKind);
-    out.writeId(returnType);
-    out.writeNodes(args);
-    out.writeDispatchKindEnum(dispatchKind);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     instance = in.readNode(NExpression.class);
     receiverType = in.readId();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NMethodId.java b/jack/src/com/android/jack/jayce/v0003/nodes/NMethodId.java
index 92ef0ef..d11bce2 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NMethodId.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NMethodId.java
@@ -25,7 +25,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -79,15 +78,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    assert methodKind != null;
-    out.writeId(name);
-    out.writeMethodKindEnum(methodKind);
-    out.writeId(returnTypeSig);
-    out.writeIds(paramTypeSigs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     name = in.readId();
     methodKind = in.readMethodKindEnum();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NMethodLiteral.java b/jack/src/com/android/jack/jayce/v0003/nodes/NMethodLiteral.java
index afa8c9e..ebbd57d 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NMethodLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NMethodLiteral.java
@@ -24,7 +24,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -75,12 +74,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(method);
-    out.writeId(methodEnclosingType);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     method = in.readId();
     methodEnclosingType = in.readId();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NModOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NModOperation.java
index 8125414..000db8d 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NModOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NModOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NMulOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NMulOperation.java
index 4031a89..485b56d 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NMulOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NMulOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NMultiExpression.java b/jack/src/com/android/jack/jayce/v0003/nodes/NMultiExpression.java
index 798a593..410c826 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NMultiExpression.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NMultiExpression.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -71,11 +70,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNodes(exprs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     exprs = in.readNodes(NExpression.class);
 
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NNameValuePair.java b/jack/src/com/android/jack/jayce/v0003/nodes/NNameValuePair.java
index ed6a031..8a88b45 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NNameValuePair.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NNameValuePair.java
@@ -28,7 +28,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -87,12 +86,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeString(name);
-    out.writeNode(value);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     name = in.readString();
     value = in.readNode(NLiteral.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NNativeMethodBody.java b/jack/src/com/android/jack/jayce/v0003/nodes/NNativeMethodBody.java
index 53d45d5..dc626af 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NNativeMethodBody.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NNativeMethodBody.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -57,12 +56,6 @@
 
   @SuppressWarnings("unused")
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-
-  }
-
-  @SuppressWarnings("unused")
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
 
   }
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NNeqOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NNeqOperation.java
index e5f3e44..07ecfa3 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NNeqOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NNeqOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NNewArray.java b/jack/src/com/android/jack/jayce/v0003/nodes/NNewArray.java
index c9ee412..916cdb1 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NNewArray.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NNewArray.java
@@ -24,7 +24,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -88,13 +87,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(type);
-    out.writeNodes(dims);
-    out.writeNodes(initializers);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     type = in.readId();
     dims = in.readNodes(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NNewInstance.java b/jack/src/com/android/jack/jayce/v0003/nodes/NNewInstance.java
index b4c4597..3d0f822 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NNewInstance.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NNewInstance.java
@@ -26,7 +26,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -80,15 +79,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    assert instance == null;
-    assert methodKind == null;
-    out.writeId(receiverType);
-    out.writeIds(methodArgsType);
-    out.writeNodes(args);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     receiverType = in.readId();
     methodArgsType = in.readIds();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NNullLiteral.java b/jack/src/com/android/jack/jayce/v0003/nodes/NNullLiteral.java
index 19562c0..fe25d0a 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NNullLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NNullLiteral.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -57,11 +56,6 @@
 
   @SuppressWarnings("unused")
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-  }
-
-  @SuppressWarnings("unused")
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
   }
 
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NOrOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NOrOperation.java
index 4cf55d0..902731c 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NOrOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NOrOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NOriginDigest.java b/jack/src/com/android/jack/jayce/v0003/nodes/NOriginDigest.java
index b32a817..82fd49b 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NOriginDigest.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NOriginDigest.java
@@ -20,7 +20,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.jayce.v0003.util.OriginDigestDescriptorHelper;
 
@@ -70,18 +69,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    assert digest != null;
-
-    out.writeInt(descriptor);
-    out.writeString(algo);
-    out.writeBuffer(digest);
-    out.writeString(emitter);
-    out.writeInt(major);
-    out.writeInt(minor);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     descriptor = in.readInt();
     algo = in.readString();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NParameter.java b/jack/src/com/android/jack/jayce/v0003/nodes/NParameter.java
index 037cda4..d008056 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NParameter.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NParameter.java
@@ -26,7 +26,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -114,16 +113,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(id);
-    out.writeInt(modifiers);
-    out.writeId(type);
-    out.writeId(name);
-    out.writeNodes(annotations);
-    out.writeNodes(markers);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     id = in.readId();
     modifiers = in.readInt();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NParameterRef.java b/jack/src/com/android/jack/jayce/v0003/nodes/NParameterRef.java
index 6c6b302..42f795e 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NParameterRef.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NParameterRef.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -63,11 +62,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(localId);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     localId = in.readId();
 
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NPostfixDecOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NPostfixDecOperation.java
index a03de50..7dbd2d2 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NPostfixDecOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NPostfixDecOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -62,11 +61,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(arg);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     arg = in.readNode(NExpression.class);
 
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NPostfixIncOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NPostfixIncOperation.java
index 17b3507..96745f5 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NPostfixIncOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NPostfixIncOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -62,11 +61,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(arg);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     arg = in.readNode(NExpression.class);
 
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NPrefixBitNotOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NPrefixBitNotOperation.java
index c2d6f63..85fa6fa 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NPrefixBitNotOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NPrefixBitNotOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -62,11 +61,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(arg);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     arg = in.readNode(NExpression.class);
 
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NPrefixDecOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NPrefixDecOperation.java
index ee2fada..7e5c07f 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NPrefixDecOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NPrefixDecOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -62,11 +61,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(arg);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     arg = in.readNode(NExpression.class);
 
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NPrefixIncOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NPrefixIncOperation.java
index 4f96997..81360b2 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NPrefixIncOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NPrefixIncOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -62,11 +61,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(arg);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     arg = in.readNode(NExpression.class);
 
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NPrefixNegOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NPrefixNegOperation.java
index fc5cd67..607a973 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NPrefixNegOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NPrefixNegOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -62,11 +61,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(arg);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     arg = in.readNode(NExpression.class);
 
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NPrefixNotOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NPrefixNotOperation.java
index f7ee123..e191646 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NPrefixNotOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NPrefixNotOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -62,11 +61,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(arg);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     arg = in.readNode(NExpression.class);
 
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NReinterpretCastOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NReinterpretCastOperation.java
index ceb7afe..4d4dac7 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NReinterpretCastOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NReinterpretCastOperation.java
@@ -24,7 +24,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -74,12 +73,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(castType);
-    out.writeNode(expr);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     castType = in.readId();
     expr = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NReturnStatement.java b/jack/src/com/android/jack/jayce/v0003/nodes/NReturnStatement.java
index 4632077..afd7119 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NReturnStatement.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NReturnStatement.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -74,11 +73,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(expr);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     expr = in.readNode(NExpression.class);
   }
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NShlOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NShlOperation.java
index b4db2eb..1a210df 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NShlOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NShlOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NShortLiteral.java b/jack/src/com/android/jack/jayce/v0003/nodes/NShortLiteral.java
index abeb5bb..e54a20b 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NShortLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NShortLiteral.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -59,14 +58,8 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeShort(value);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     value = in.readShort();
-    
   }
 
   @Override
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NShrOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NShrOperation.java
index 80ac4f1..36fc08b 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NShrOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NShrOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NShruOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NShruOperation.java
index bceb64c..2c416a9 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NShruOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NShruOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NSimpleName.java b/jack/src/com/android/jack/jayce/v0003/nodes/NSimpleName.java
index 2936ecd..1940eab 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NSimpleName.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NSimpleName.java
@@ -20,7 +20,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -54,11 +53,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeString(simpleName);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     simpleName = in.readString();
   }
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NStringLiteral.java b/jack/src/com/android/jack/jayce/v0003/nodes/NStringLiteral.java
index dd12e7d..481c75f 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NStringLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NStringLiteral.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -61,11 +60,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeString(value);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     value = in.readString();
 
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NSubOperation.java b/jack/src/com/android/jack/jayce/v0003/nodes/NSubOperation.java
index 839fe5c..c3bb3f3 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NSubOperation.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NSubOperation.java
@@ -21,7 +21,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -68,12 +67,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lhs);
-    out.writeNode(rhs);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lhs = in.readNode(NExpression.class);
     rhs = in.readNode(NExpression.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NSwitchStatement.java b/jack/src/com/android/jack/jayce/v0003/nodes/NSwitchStatement.java
index 1b2b312..cdb7cb7 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NSwitchStatement.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NSwitchStatement.java
@@ -24,7 +24,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -98,13 +97,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(expr);
-    out.writeIds(cases);
-    out.writeNode(body);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     expr = in.readNode(NExpression.class);
     cases = in.readIds();
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NSynchronizedBlock.java b/jack/src/com/android/jack/jayce/v0003/nodes/NSynchronizedBlock.java
index 84cbc8f..abda178 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NSynchronizedBlock.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NSynchronizedBlock.java
@@ -25,7 +25,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -86,12 +85,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lockExpr);
-    out.writeNode(synchronizedBlock);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lockExpr = in.readNode(NExpression.class);
     synchronizedBlock = in.readNode(NBlock.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NThisRef.java b/jack/src/com/android/jack/jayce/v0003/nodes/NThisRef.java
index b7386c5..7a2334a 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NThisRef.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NThisRef.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -63,11 +62,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeId(type);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     type = in.readId();
 
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NThisRefTypeInfo.java b/jack/src/com/android/jack/jayce/v0003/nodes/NThisRefTypeInfo.java
index aa61ea5..77ab782 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NThisRefTypeInfo.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NThisRefTypeInfo.java
@@ -20,7 +20,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -56,11 +55,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeString(genericSignature);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     genericSignature = in.readString();
   }
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NThrowStatement.java b/jack/src/com/android/jack/jayce/v0003/nodes/NThrowStatement.java
index 5a8f7d1..23e4df9 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NThrowStatement.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NThrowStatement.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -75,11 +74,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(expr);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     expr = in.readNode(NExpression.class);
   }
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NThrownExceptionMarker.java b/jack/src/com/android/jack/jayce/v0003/nodes/NThrownExceptionMarker.java
index 8f6d8bd..43f519d 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NThrownExceptionMarker.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NThrownExceptionMarker.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 
 import java.io.IOException;
@@ -61,11 +60,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeIds(thrownExceptions);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     thrownExceptions = in.readIds();
   }
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NTryStatement.java b/jack/src/com/android/jack/jayce/v0003/nodes/NTryStatement.java
index a209a31..f047541 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NTryStatement.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NTryStatement.java
@@ -24,7 +24,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -96,14 +95,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNodes(resourcesDeclaration);
-    out.writeNode(tryBlock);
-    out.writeNodes(catchBlocks);
-    out.writeNode(finallyBlock);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     resourcesDeclaration = in.readNodes(NStatement.class);
     tryBlock = in.readNode(NBlock.class);
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NUnlock.java b/jack/src/com/android/jack/jayce/v0003/nodes/NUnlock.java
index 2a2e5e7..1368efe 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NUnlock.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NUnlock.java
@@ -22,7 +22,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -75,11 +74,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(lockExpr);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     lockExpr = in.readNode(NExpression.class);
   }
diff --git a/jack/src/com/android/jack/jayce/v0003/nodes/NWhileStatement.java b/jack/src/com/android/jack/jayce/v0003/nodes/NWhileStatement.java
index 30b7acf..764be05 100644
--- a/jack/src/com/android/jack/jayce/v0003/nodes/NWhileStatement.java
+++ b/jack/src/com/android/jack/jayce/v0003/nodes/NWhileStatement.java
@@ -23,7 +23,6 @@
 import com.android.jack.jayce.v0003.io.ExportSession;
 import com.android.jack.jayce.v0003.io.ImportHelper;
 import com.android.jack.jayce.v0003.io.JayceInternalReaderImpl;
-import com.android.jack.jayce.v0003.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0003.io.Token;
 import com.android.jack.lookup.JMethodLookupException;
 
@@ -79,12 +78,6 @@
   }
 
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
-    out.writeNode(testExpression);
-    out.writeNode(body);
-  }
-
-  @Override
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
     testExpression = in.readNode(NExpression.class);
     body = in.readNode(NStatement.class);
diff --git a/jack/src/com/android/jack/jayce/v0004/io/JayceInputStream.java b/jack/src/com/android/jack/jayce/v0004/io/JayceInputStream.java
index 5c9d909..325261e 100644
--- a/jack/src/com/android/jack/jayce/v0004/io/JayceInputStream.java
+++ b/jack/src/com/android/jack/jayce/v0004/io/JayceInputStream.java
@@ -16,6 +16,8 @@
 
 package com.android.jack.jayce.v0004.io;
 
+import com.google.common.io.ByteStreams;
+
 import com.android.jack.util.StringUtils;
 
 import java.io.DataInput;
@@ -57,31 +59,55 @@
     return in.readBoolean();
   }
 
+  public void skipBoolean() throws IOException {
+    ByteStreams.skipFully(in, 1);
+  }
+
   @Override
   public byte readByte() throws IOException {
     return in.readByte();
   }
 
+  public void skipByte() throws IOException {
+    ByteStreams.skipFully(in, 1);
+  }
+
   @Override
   public int readUnsignedByte() throws IOException {
     return in.readUnsignedByte();
   }
 
+  public void skipUnsignedByte() throws IOException {
+    ByteStreams.skipFully(in, 1);
+  }
+
   @Override
   public short readShort() throws IOException {
     return in.readShort();
   }
 
+  public void skipShort() throws IOException {
+    ByteStreams.skipFully(in, 2);
+  }
+
   @Override
   public int readUnsignedShort() throws IOException {
     return in.readUnsignedShort();
   }
 
+  public void skipUnsignedShort() throws IOException {
+    ByteStreams.skipFully(in, 2);
+  }
+
   @Override
   public char readChar() throws IOException {
     return in.readChar();
   }
 
+  public void skipChar() throws IOException {
+    ByteStreams.skipFully(in, 2);
+  }
+
   @Override
   public int readInt() throws IOException {
     int result = 0;
@@ -108,6 +134,10 @@
     return result;
   }
 
+  public void skipInt() throws IOException {
+    readInt();
+  }
+
   @Override
   public long readLong() throws IOException {
     long result = 0;
@@ -134,16 +164,28 @@
     return result;
   }
 
+  public void skipLong() throws IOException {
+    readLong();
+  }
+
   @Override
   public float readFloat() throws IOException {
     return in.readFloat();
   }
 
+  public void skipFloat() throws IOException {
+    ByteStreams.skipFully(in, 4);
+  }
+
   @Override
   public double readDouble() throws IOException {
     return in.readDouble();
   }
 
+  public void skipDouble() throws IOException {
+    ByteStreams.skipFully(in, 8);
+  }
+
   @Deprecated
   @Override
   public String readLine() throws IOException {
@@ -166,6 +208,14 @@
     }
   }
 
+  public void skipUTF() throws IOException {
+    int length = readInt();
+
+    if (length > 0) {
+      ByteStreams.skipFully(in, length);
+    }
+  }
+
   public byte[] readBuffer() throws IOException {
     int length = readInt();
 
@@ -177,4 +227,12 @@
 
     return b;
   }
+
+  public void skipBuffer() throws IOException {
+    int length = readInt();
+
+    if (length > 0) {
+      ByteStreams.skipFully(in, length);
+    }
+  }
 }
diff --git a/jack/src/com/android/jack/jayce/v0004/io/JayceInternalReaderImpl.java b/jack/src/com/android/jack/jayce/v0004/io/JayceInternalReaderImpl.java
index 69fd3d1..43601db 100644
--- a/jack/src/com/android/jack/jayce/v0004/io/JayceInternalReaderImpl.java
+++ b/jack/src/com/android/jack/jayce/v0004/io/JayceInternalReaderImpl.java
@@ -105,6 +105,10 @@
     return readString();
   }
 
+  public void skipId() throws IOException {
+    skipString();
+  }
+
   @CheckForNull
   public String readCurrentFileName() throws IOException {
     if (tokenizer.readOpenFileName()) {
@@ -119,6 +123,14 @@
     return currentFileName;
   }
 
+  public void skipCurrentFileName() throws IOException {
+    if (tokenizer.readOpenFileName()) {
+      skipString();
+      currentLine = SourceInfo.UNKNOWN_LINE_NUMBER;
+      tokenizer.readCloseFileName();
+    }
+  }
+
   @Nonnegative
   public int readCurrentLine() throws IOException {
     if (tokenizer.readOpenLineInfo()) {
@@ -128,41 +140,76 @@
     return currentLine;
   }
 
+  public void skipCurrentLine() throws IOException {
+    if (tokenizer.readOpenLineInfo()) {
+      skipInt();
+      tokenizer.readCloseLineInfo();
+    }
+  }
+
   @Nonnull
   public JRetentionPolicy readRetentionPolicyEnum() throws IOException {
     return RetentionPolicyIdHelper.getValue(readByte());
   }
 
+  public void skipRetentionPolicyEnum() throws IOException {
+    skipByte();
+  }
+
   @Nonnull
   public FieldKind readFieldRefKindEnum() throws IOException {
     return FieldRefKindIdHelper.getValue(readByte());
   }
 
+  public void skipFieldRefKindEnum() throws IOException {
+    skipByte();
+  }
+
   @Nonnull
   public MethodKind readMethodKindEnum() throws IOException {
     return MethodKindIdHelper.getValue(readByte());
   }
 
+  public void skipMethodKindEnum() throws IOException {
+    skipByte();
+  }
+
   @Nonnull
   public ReceiverKind readReceiverKindEnum() throws IOException {
     return ReceiverKindIdHelper.getValue(readByte());
   }
 
+  public void skipReceiverKindEnum() throws IOException {
+    skipByte();
+  }
+
   @Nonnull
   public DispatchKind readDispatchKindEnum() throws IOException {
     return DispatchKindIdHelper.getValue(readByte());
   }
 
+  public void skipDispatchKindEnum() throws IOException {
+    skipByte();
+  }
+
   @CheckForNull
   public String readString() throws IOException {
     return tokenizer.readString();
   }
 
+  public void skipString() throws IOException {
+    tokenizer.skipString();
+  }
+
   @CheckForNull
   public byte[] readBuffer() throws IOException {
     return tokenizer.readBuffer();
   }
 
+  public void skipBuffer() throws IOException {
+    tokenizer.skipBuffer();
+  }
+
   @Nonnull
   public List<String> readIds() throws IOException {
     tokenizer.readOpen();
@@ -175,6 +222,15 @@
     return ids;
   }
 
+  public void skipIds() throws IOException {
+    tokenizer.readOpen();
+    int length = readInt();
+    for (int i = 0; i < length; i++) {
+      skipId();
+    }
+    tokenizer.readClose();
+  }
+
   public void readCatchBlockIds() throws IOException {
     if (tokenizer.readOpenCatchBlockIdAdd()) {
       int length = tokenizer.readInt();
@@ -196,6 +252,63 @@
     }
   }
 
+  public void skipCatchBlockIds() throws IOException {
+    if (tokenizer.readOpenCatchBlockIdAdd()) {
+      int length = tokenizer.readInt();
+      for (int i = 0; i < length; i++) {
+        skipId();
+      }
+      tokenizer.readCloseCatchBlockId();
+    }
+    if (tokenizer.readOpenCatchBlockIdRemove()) {
+      int length = tokenizer.readInt();
+      for (int i = 0; i < length; i++) {
+        skipId();
+      }
+      tokenizer.readCloseCatchBlockId();
+    }
+  }
+
+  public <T extends NNode> void skipNode()
+      throws IOException, JayceFormatException {
+
+    skipCurrentFileName();
+    skipCurrentLine();
+
+    skipCatchBlockIds();
+
+    Token token = tokenizer.next();
+
+    if (token == Token.NULL) {
+      return;
+    }
+
+    tokenizer.readOpen();
+
+    skipNodeInternal(token);
+  }
+
+  private <T extends NNode> void skipNodeInternal(@Nonnull Token token)
+      throws IOException, JayceFormatException {
+
+    try {
+
+      token.skip(this);
+
+      if (nodeLevel != NodeLevel.TYPES) {
+        if (token.hasSourceInfo()) {
+          skipCurrentFileName();
+          skipCurrentLine();
+        }
+        tokenizer.readClose();
+      }
+
+    } catch (InvalidTokenException e) {
+      throw new ParseException(
+          "Unexpected token " + token.toString() + " while expecting node.", e);
+    }
+  }
+
   @SuppressWarnings("unchecked")
   @CheckForNull
   public <T extends NNode> T readNode(@Nonnull Class<T> nodeClass) throws IOException,
@@ -214,17 +327,39 @@
     tokenizer.readOpen();
     NNode node;
     try {
+
+      Percent statistic = null;
+      if (token == Token.METHOD_BODY) {
+        statistic = tracer.getStatistic(SKIPPED_BODY);
+      }
+
+      if (!nodeLevel.keep(token.getNodeLevel())) {
+
+        skipNodeInternal(token);
+
+        if (statistic != null) {
+          statistic.addTrue();
+        }
+        return null;
+      }
+
       node = token.newNode();
+
+      if (node instanceof NDeclaredType) {
+        tracer.getStatistic(SKIPPED_TYPE_STRUCTURE).add(nodeLevel == NodeLevel.TYPES);
+      }
+
+      if (statistic != null) {
+        statistic.addFalse();
+      }
+
+
     } catch (InvalidTokenException e) {
       throw new ParseException(
           "Unexpected token " + token.toString() + " while expecting node.", e);
     }
-    Percent statistic = null;
-    if (token == Token.METHOD_BODY) {
-      statistic = tracer.getStatistic(SKIPPED_BODY);
-    } else if (node instanceof NDeclaredType) {
-      tracer.getStatistic(SKIPPED_TYPE_STRUCTURE).add(nodeLevel == NodeLevel.TYPES);
-    }
+
+    assert node != null;
 
     if (!nodeClass.isAssignableFrom(node.getClass())) {
       throw new JayceFormatException("Unexpected node " + node.getClass().getSimpleName() + ", "
@@ -257,17 +392,7 @@
       tokenizer.readClose();
     }
 
-    if (nodeLevel.keep(token.getNodeLevel())) {
-      if (statistic != null) {
-        statistic.addFalse();
-      }
-      return (T) node;
-    } else {
-      if (statistic != null) {
-        statistic.addTrue();
-      }
-      return null;
-    }
+    return (T) node;
   }
 
   @Nonnull
@@ -287,38 +412,80 @@
 
   }
 
+  public <T extends NNode> void skipNodes() throws IOException,
+      JayceFormatException {
+    tokenizer.readOpen();
+    int length = readInt();
+    for (int i = 0; i < length; i++) {
+      skipNode();
+    }
+    tokenizer.readClose();
+  }
+
   public int readInt() throws IOException {
     return tokenizer.readInt();
   }
 
+  public void skipInt() throws IOException {
+    tokenizer.skipInt();
+  }
+
   public byte readByte() throws IOException {
     return tokenizer.readByte();
   }
 
+  public void skipByte() throws IOException {
+    tokenizer.skipByte();
+  }
+
   public boolean readBoolean() throws IOException {
     return tokenizer.readBoolean();
   }
 
+  public void skipBoolean() throws IOException {
+    tokenizer.skipBoolean();
+  }
+
   public long readLong() throws IOException {
     return tokenizer.readLong();
   }
 
+  public void skipLong() throws IOException {
+    tokenizer.skipLong();
+  }
+
   public short readShort() throws IOException {
     return tokenizer.readShort();
   }
 
+  public void skipShort() throws IOException {
+    tokenizer.skipShort();
+  }
+
   public char readChar() throws IOException {
     return tokenizer.readChar();
   }
 
+  public void skipChar() throws IOException {
+    tokenizer.skipChar();
+  }
+
   public float readFloat() throws IOException {
     return tokenizer.readFloat();
   }
 
+  public void skipFloat() throws IOException {
+    tokenizer.skipFloat();
+  }
+
   public double readDouble() throws IOException {
     return tokenizer.readDouble();
   }
 
+  public void skipDouble() throws IOException {
+    tokenizer.skipDouble();
+  }
+
   @Override
   @Nonnull
   public DeclaredTypeNode readType(@Nonnull NodeLevel nodeLevel) throws IOException,
diff --git a/jack/src/com/android/jack/jayce/v0004/io/JayceInternalWriterImpl.java b/jack/src/com/android/jack/jayce/v0004/io/JayceInternalWriterImpl.java
index 37df876..30291b2 100644
--- a/jack/src/com/android/jack/jayce/v0004/io/JayceInternalWriterImpl.java
+++ b/jack/src/com/android/jack/jayce/v0004/io/JayceInternalWriterImpl.java
@@ -36,6 +36,9 @@
 import com.android.jack.jayce.v0004.util.MethodKindIdHelper;
 import com.android.jack.jayce.v0004.util.ReceiverKindIdHelper;
 import com.android.jack.jayce.v0004.util.RetentionPolicyIdHelper;
+import com.android.sched.util.file.CannotCloseException;
+import com.android.sched.util.file.CannotWriteException;
+import com.android.sched.util.location.HasLocation;
 import com.android.sched.util.log.Event;
 import com.android.sched.util.log.Tracer;
 import com.android.sched.util.log.TracerFactory;
@@ -71,8 +74,12 @@
   @Nonnull
   private final  List<String> currentCatchBlockList = new ArrayList<String>();
 
-  public JayceInternalWriterImpl(@Nonnull OutputStream out) {
+  @Nonnull
+  private final HasLocation locationProvider;
+
+  public JayceInternalWriterImpl(@Nonnull OutputStream out, @Nonnull HasLocation locationProvider) {
     this.out = new JayceOutputStream(out);
+    this.locationProvider = locationProvider;
   }
 
   public void writeNode(@CheckForNull NNode node) throws IOException {
@@ -348,7 +355,7 @@
   }
 
   @Override
-  public void write(@Nonnull JNode jNode) throws IOException {
+  public void write(@Nonnull JNode jNode) throws CannotWriteException {
     try (Event eventWriting = tracer.open(JackEventType.NNODE_WRITING)) {
       ImportHelper importHelper = new ImportHelper(new NodeFactory());
       NNode nNode;
@@ -356,7 +363,11 @@
         nNode = importHelper.load(jNode);
       }
 
-      writeNode(nNode);
+      try {
+        writeNode(nNode);
+      } catch (IOException e) {
+        throw new CannotWriteException(locationProvider, e);
+      }
     }
   }
 
@@ -366,7 +377,11 @@
   }
 
   @Override
-  public void close() throws IOException {
-    out.close();
+  public void close() throws CannotCloseException {
+    try {
+      out.close();
+    } catch (IOException e) {
+      throw new CannotCloseException(locationProvider, e);
+    }
   }
 }
diff --git a/jack/src/com/android/jack/jayce/v0004/io/Token.java b/jack/src/com/android/jack/jayce/v0004/io/Token.java
index fe9e1ba..b24fc5a 100644
--- a/jack/src/com/android/jack/jayce/v0004/io/Token.java
+++ b/jack/src/com/android/jack/jayce/v0004/io/Token.java
@@ -16,9 +16,9 @@
 
 package com.android.jack.jayce.v0004.io;
 
-import com.android.jack.jayce.JayceFormatException;
 import com.android.jack.jayce.NodeLevel;
 import com.android.jack.jayce.v0004.NNode;
+import com.android.jack.jayce.v0004.nodes.HasSourceInfo;
 import com.android.jack.jayce.v0004.nodes.NAbsentArrayDimension;
 import com.android.jack.jayce.v0004.nodes.NAddOperation;
 import com.android.jack.jayce.v0004.nodes.NAlloc;
@@ -138,6 +138,8 @@
 import com.android.jack.jayce.v0004.nodes.NUnlock;
 import com.android.jack.jayce.v0004.nodes.NWhileStatement;
 
+import java.io.IOException;
+
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 
@@ -169,6 +171,17 @@
     public NNode newNode() {
       return new NAbsentArrayDimension();
     }
+
+    @Override
+    @Nonnull
+    public Class<NAbsentArrayDimension> getNNodeClass() {
+      return NAbsentArrayDimension.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NAbsentArrayDimension.skipContent(reader);
+    }
   },
   ADD_OPERATION("+") {
     @Override
@@ -176,6 +189,17 @@
     public NNode newNode() {
       return new NAddOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NAddOperation> getNNodeClass() {
+      return NAddOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NAddOperation.skipContent(reader);
+    }
   },
   ALLOC("alloc") {
     @Override
@@ -183,6 +207,17 @@
     public NNode newNode() {
       return new NAlloc();
     }
+
+    @Override
+    @Nonnull
+    public Class<NAlloc> getNNodeClass() {
+      return NAlloc.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NAlloc.skipContent(reader);
+    }
   },
   AND_OPERATION("&&") {
     @Override
@@ -190,6 +225,17 @@
     public NNode newNode() {
       return new NAndOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NAndOperation> getNNodeClass() {
+      return NAndOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NAndOperation.skipContent(reader);
+    }
   },
   ANNOTATION("annotation-literal", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -197,6 +243,17 @@
     public NNode newNode() {
       return new NAnnotation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NAnnotation> getNNodeClass() {
+      return NAnnotation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NAnnotation.skipContent(reader);
+    }
   },
   ANNOTATION_METHOD("annotation-method", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -204,6 +261,17 @@
     public NNode newNode() {
       return new NAnnotationMethod();
     }
+
+    @Override
+    @Nonnull
+    public Class<NAnnotationMethod> getNNodeClass() {
+      return NAnnotationMethod.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NAnnotationMethod.skipContent(reader);
+    }
   },
   ANNOTATION_TYPE("annotation", NodeLevel.TYPES) {
     @Override
@@ -211,6 +279,17 @@
     public NNode newNode() {
       return new NAnnotationType();
     }
+
+    @Override
+    @Nonnull
+    public Class<NAnnotationType> getNNodeClass() {
+      return NAnnotationType.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NAnnotationType.skipContent(reader);
+    }
   },
   ARRAY_LENGTH("array-length") {
     @Override
@@ -218,6 +297,17 @@
     public NNode newNode() {
       return new NArrayLength();
     }
+
+    @Override
+    @Nonnull
+    public Class<NArrayLength> getNNodeClass() {
+      return NArrayLength.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NArrayLength.skipContent(reader);
+    }
   },
   ARRAY_LITERAL("array-literal", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -225,6 +315,17 @@
     public NNode newNode() {
       return new NArrayLiteral();
     }
+
+    @Override
+    @Nonnull
+    public Class<NArrayLiteral> getNNodeClass() {
+      return NArrayLiteral.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NArrayLiteral.skipContent(reader);
+    }
   },
   ARRAY_REF("array-ref") {
     @Override
@@ -232,6 +333,17 @@
     public NNode newNode() {
       return new NArrayRef();
     }
+
+    @Override
+    @Nonnull
+    public Class<NArrayRef> getNNodeClass() {
+      return NArrayRef.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NArrayRef.skipContent(reader);
+    }
   },
   ASG_ADD_OPERATION("+=") {
     @Override
@@ -239,6 +351,17 @@
     public NNode newNode() {
       return new NAsgAddOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NAsgAddOperation> getNNodeClass() {
+      return NAsgAddOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NAsgAddOperation.skipContent(reader);
+    }
   },
   ASG_BIT_AND_OPERATION("&=") {
     @Override
@@ -246,6 +369,17 @@
     public NNode newNode() {
       return new NAsgBitAndOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NAsgBitAndOperation> getNNodeClass() {
+      return NAsgBitAndOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NAsgBitAndOperation.skipContent(reader);
+    }
   },
   ASG_BIT_OR_OPERATION("|=") {
     @Override
@@ -253,6 +387,17 @@
     public NNode newNode() {
       return new NAsgBitOrOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NAsgBitOrOperation> getNNodeClass() {
+      return NAsgBitOrOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NAsgBitOrOperation.skipContent(reader);
+    }
   },
   ASG_BIT_XOR_OPERATION("^=") {
     @Override
@@ -260,6 +405,17 @@
     public NNode newNode() {
       return new NAsgBitXorOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NAsgBitXorOperation> getNNodeClass() {
+      return NAsgBitXorOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NAsgBitXorOperation.skipContent(reader);
+    }
   },
   ASG_CONCAT_OPERATION("asg-concat") {
     @Override
@@ -267,6 +423,17 @@
     public NNode newNode() {
       return new NAsgConcatOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NAsgConcatOperation> getNNodeClass() {
+      return NAsgConcatOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NAsgConcatOperation.skipContent(reader);
+    }
   },
   ASG_DIV_OPERATION("/=") {
     @Override
@@ -274,6 +441,17 @@
     public NNode newNode() {
       return new NAsgDivOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NAsgDivOperation> getNNodeClass() {
+      return NAsgDivOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NAsgDivOperation.skipContent(reader);
+    }
   },
   ASG_MOD_OPERATION("%=") {
     @Override
@@ -281,6 +459,17 @@
     public NNode newNode() {
       return new NAsgModOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NAsgModOperation> getNNodeClass() {
+      return NAsgModOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NAsgModOperation.skipContent(reader);
+    }
   },
   ASG_MUL_OPERATION("*=") {
     @Override
@@ -288,6 +477,17 @@
     public NNode newNode() {
       return new NAsgMulOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NAsgMulOperation> getNNodeClass() {
+      return NAsgMulOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NAsgMulOperation.skipContent(reader);
+    }
   },
   ASG_OPERATION("=") {
     @Override
@@ -295,6 +495,17 @@
     public NNode newNode() {
       return new NAsgOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NAsgOperation> getNNodeClass() {
+      return NAsgOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NAsgOperation.skipContent(reader);
+    }
   },
   ASG_SHL_OPERATION("<<=") {
     @Override
@@ -302,6 +513,17 @@
     public NNode newNode() {
       return new NAsgShlOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NAsgShlOperation> getNNodeClass() {
+      return NAsgShlOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NAsgShlOperation.skipContent(reader);
+    }
   },
   ASG_SHR_OPERATION(">>=") {
     @Override
@@ -309,6 +531,17 @@
     public NNode newNode() {
       return new NAsgShrOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NAsgShrOperation> getNNodeClass() {
+      return NAsgShrOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NAsgShrOperation.skipContent(reader);
+    }
   },
   ASG_SHRU_OPERATION(">>>=") {
     @Override
@@ -316,6 +549,17 @@
     public NNode newNode() {
       return new NAsgShruOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NAsgShruOperation> getNNodeClass() {
+      return NAsgShruOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NAsgShruOperation.skipContent(reader);
+    }
   },
   ASG_SUB_OPERATION("-=") {
     @Override
@@ -323,6 +567,17 @@
     public NNode newNode() {
       return new NAsgSubOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NAsgSubOperation> getNNodeClass() {
+      return NAsgSubOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NAsgSubOperation.skipContent(reader);
+    }
   },
   ASSERT_STATEMENT("assert") {
     @Override
@@ -330,6 +585,17 @@
     public NNode newNode() {
       return new NAssertStatement();
     }
+
+    @Override
+    @Nonnull
+    public Class<NAssertStatement> getNNodeClass() {
+      return NAssertStatement.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NAssertStatement.skipContent(reader);
+    }
   },
   BIT_AND_OPERATION("&") {
     @Override
@@ -337,6 +603,17 @@
     public NNode newNode() {
       return new NBitAndOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NBitAndOperation> getNNodeClass() {
+      return NBitAndOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NBitAndOperation.skipContent(reader);
+    }
   },
   BIT_OR_OPERATION("|") {
     @Override
@@ -344,6 +621,17 @@
     public NNode newNode() {
       return new NBitOrOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NBitOrOperation> getNNodeClass() {
+      return NBitOrOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NBitOrOperation.skipContent(reader);
+    }
   },
   BIT_XOR_OPERATION("^") {
     @Override
@@ -351,6 +639,17 @@
     public NNode newNode() {
       return new NBitXorOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NBitXorOperation> getNNodeClass() {
+      return NBitXorOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NBitXorOperation.skipContent(reader);
+    }
   },
   BLOCK("block") {
     @Nonnull
@@ -358,6 +657,17 @@
     public NNode newNode() {
       return new NBlock();
     }
+
+    @Override
+    @Nonnull
+    public Class<NBlock> getNNodeClass() {
+      return NBlock.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NBlock.skipContent(reader);
+    }
   },
   BOOLEAN_LITERAL("boolean", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -365,6 +675,17 @@
     public NNode newNode() {
       return new NBooleanLiteral();
     }
+
+    @Override
+    @Nonnull
+    public Class<NBooleanLiteral> getNNodeClass() {
+      return NBooleanLiteral.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NBooleanLiteral.skipContent(reader);
+    }
   },
   BREAK_STATEMENT("break") {
     @Nonnull
@@ -372,6 +693,17 @@
     public NNode newNode() {
       return new NBreakStatement();
     }
+
+    @Override
+    @Nonnull
+    public Class<NBreakStatement> getNNodeClass() {
+      return NBreakStatement.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NBreakStatement.skipContent(reader);
+    }
   },
   BYTE_LITERAL("byte", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -379,6 +711,17 @@
     public NNode newNode() {
       return new NByteLiteral();
     }
+
+    @Override
+    @Nonnull
+    public Class<NByteLiteral> getNNodeClass() {
+      return NByteLiteral.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NByteLiteral.skipContent(reader);
+    }
   },
   CASE_STATEMENT("case") {
     @Override
@@ -386,6 +729,17 @@
     public NNode newNode() {
       return new NCaseStatement();
     }
+
+    @Override
+    @Nonnull
+    public Class<NCaseStatement> getNNodeClass() {
+      return NCaseStatement.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NCaseStatement.skipContent(reader);
+    }
   },
   CATCH_BLOCK("catch") {
     @Nonnull
@@ -393,6 +747,17 @@
     public NNode newNode() {
       return new NCatchBlock();
     }
+
+    @Override
+    @Nonnull
+    public Class<NCatchBlock> getNNodeClass() {
+      return NCatchBlock.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NCatchBlock.skipContent(reader);
+    }
   },
   CHAR_LITERAL("char", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -400,6 +765,17 @@
     public NNode newNode() {
       return new NCharLiteral();
     }
+
+    @Override
+    @Nonnull
+    public Class<NCharLiteral> getNNodeClass() {
+      return NCharLiteral.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NCharLiteral.skipContent(reader);
+    }
   },
   CLASS("class", NodeLevel.TYPES) {
     @Nonnull
@@ -407,6 +783,17 @@
     public NNode newNode() {
       return new NClassType();
     }
+
+    @Override
+    @Nonnull
+    public Class<NClassType> getNNodeClass() {
+      return NClassType.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NClassType.skipContent(reader);
+    }
   },
   CLASS_LITERAL("class-literal", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -414,6 +801,17 @@
     public NNode newNode() {
       return new NClassLiteral();
     }
+
+    @Override
+    @Nonnull
+    public Class<NClassLiteral> getNNodeClass() {
+      return NClassLiteral.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NClassLiteral.skipContent(reader);
+    }
   },
   CONCAT_OPERATION("concat") {
     @Override
@@ -421,6 +819,17 @@
     public NNode newNode() {
       return new NConcatOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NConcatOperation> getNNodeClass() {
+      return NConcatOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NConcatOperation.skipContent(reader);
+    }
   },
   CONDITIONAL_EXPRESSION ("?") {
     @Nonnull
@@ -428,6 +837,17 @@
     public NNode newNode() {
       return new NConditionalExpression();
     }
+
+    @Override
+    @Nonnull
+    public Class<NConditionalExpression> getNNodeClass() {
+      return NConditionalExpression.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NConditionalExpression.skipContent(reader);
+    }
   },
   CONSTRUCTOR ("constructor", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -435,6 +855,17 @@
     public NNode newNode() {
       return new NConstructor();
     }
+
+    @Override
+    @Nonnull
+    public Class<NConstructor> getNNodeClass() {
+      return NConstructor.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NConstructor.skipContent(reader);
+    }
   },
   CONTAINER_ANNOTATION("container-annotation", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -442,6 +873,17 @@
     public NNode newNode() {
       return new NContainerAnnotation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NContainerAnnotation> getNNodeClass() {
+      return NContainerAnnotation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NContainerAnnotation.skipContent(reader);
+    }
   },
   CONTINUE_STATEMENT("continue") {
     @Nonnull
@@ -449,6 +891,17 @@
     public NNode newNode() {
       return new NContinueStatement();
     }
+
+    @Override
+    @Nonnull
+    public Class<NContinueStatement> getNNodeClass() {
+      return NContinueStatement.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NContinueStatement.skipContent(reader);
+    }
   },
   DEBUG_VARIABLE_INFORMATION("debug-var", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -456,6 +909,17 @@
     public NNode newNode() {
       return new NDebugVariableInfo();
     }
+
+    @Override
+    @Nonnull
+    public Class<NDebugVariableInfo> getNNodeClass() {
+      return NDebugVariableInfo.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NDebugVariableInfo.skipContent(reader);
+    }
   },
   DIV_OPERATION("/") {
     @Nonnull
@@ -463,6 +927,17 @@
     public NNode newNode() {
       return new NDivOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NDivOperation> getNNodeClass() {
+      return NDivOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NDivOperation.skipContent(reader);
+    }
   },
   DO_STATEMENT("do") {
     @Nonnull
@@ -470,6 +945,17 @@
     public NNode newNode() {
       return new NDoStatement();
     }
+
+    @Override
+    @Nonnull
+    public Class<NDoStatement> getNNodeClass() {
+      return NDoStatement.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NDoStatement.skipContent(reader);
+    }
   },
   DOUBLE_LITERAL("double", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -477,6 +963,17 @@
     public NNode newNode() {
       return new NDoubleLiteral();
     }
+
+    @Override
+    @Nonnull
+    public Class<NDoubleLiteral> getNNodeClass() {
+      return NDoubleLiteral.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NDoubleLiteral.skipContent(reader);
+    }
   },
   DYNAMIC_CAST_OPERATION("cast") {
     @Override
@@ -484,6 +981,17 @@
     public NNode newNode() {
       return new NDynamicCastOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NDynamicCastOperation> getNNodeClass() {
+      return NDynamicCastOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NDynamicCastOperation.skipContent(reader);
+    }
   },
   ENUM("enum", NodeLevel.TYPES) {
     @Nonnull
@@ -491,6 +999,17 @@
     public NNode newNode() {
       return new NEnumType();
     }
+
+    @Override
+    @Nonnull
+    public Class<NEnumType> getNNodeClass() {
+      return NEnumType.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NEnumType.skipContent(reader);
+    }
   },
   ENUM_FIELD("enum-field", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -498,6 +1017,17 @@
     public NNode newNode() {
       return new NEnumField();
     }
+
+    @Override
+    @Nonnull
+    public Class<NEnumField> getNNodeClass() {
+      return NEnumField.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NEnumType.skipContent(reader);
+    }
   },
   ENUM_LITERAL("enum-literal", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -505,6 +1035,17 @@
     public NNode newNode() {
       return new NEnumLiteral();
     }
+
+    @Override
+    @Nonnull
+    public Class<NEnumLiteral> getNNodeClass() {
+      return NEnumLiteral.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NEnumLiteral.skipContent(reader);
+    }
   },
   EQ_OPERATION("==") {
     @Nonnull
@@ -512,6 +1053,17 @@
     public NNode newNode() {
       return new NEqOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NEqOperation> getNNodeClass() {
+      return NEqOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NEqOperation.skipContent(reader);
+    }
   },
   EXCEPTION_RUNTIME_VALUE("ex-runtime-value") {
     @Nonnull
@@ -519,6 +1071,17 @@
     public NNode newNode() {
       return new NExceptionRuntimeValue();
     }
+
+    @Override
+    @Nonnull
+    public Class<NExceptionRuntimeValue> getNNodeClass() {
+      return NExceptionRuntimeValue.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NExceptionRuntimeValue.skipContent(reader);
+    }
   },
   EXPRESSION_STATEMENT("expression-statement") {
     @Nonnull
@@ -526,6 +1089,17 @@
     public NNode newNode() {
       return new NExpressionStatement();
     }
+
+    @Override
+    @Nonnull
+    public Class<NExpressionStatement> getNNodeClass() {
+      return NExpressionStatement.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NExpressionStatement.skipContent(reader);
+    }
   },
   FIELD("field", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -533,6 +1107,17 @@
     public NNode newNode() {
       return new NField();
     }
+
+    @Override
+    @Nonnull
+    public Class<NField> getNNodeClass() {
+      return NField.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NField.skipContent(reader);
+    }
   },
   FIELD_INITIALIZER("field-intializer") {
     @Nonnull
@@ -540,6 +1125,17 @@
     public NNode newNode() {
       return new NFieldInitializer();
     }
+
+    @Override
+    @Nonnull
+    public Class<NFieldInitializer> getNNodeClass() {
+      return NFieldInitializer.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) {
+      NFieldInitializer.skipContent(reader);
+    }
   },
   FIELD_REF("field-ref") {
     @Nonnull
@@ -547,6 +1143,17 @@
     public NNode newNode() {
       return new NFieldRef();
     }
+
+    @Override
+    @Nonnull
+    public Class<NFieldRef> getNNodeClass() {
+      return NFieldRef.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NFieldRef.skipContent(reader);
+    }
   },
   FLOAT_LITERAL("float", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -554,6 +1161,17 @@
     public NNode newNode() {
       return new NFloatLiteral();
     }
+
+    @Override
+    @Nonnull
+    public Class<NFloatLiteral> getNNodeClass() {
+      return NFloatLiteral.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NFloatLiteral.skipContent(reader);
+    }
   },
   FOR_STATEMENT("for") {
     @Nonnull
@@ -561,6 +1179,17 @@
     public NNode newNode() {
       return new NForStatement();
     }
+
+    @Override
+    @Nonnull
+    public Class<NForStatement> getNNodeClass() {
+      return NForStatement.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NForStatement.skipContent(reader);
+    }
   },
   GENERIC_SIGNATURE("generic-signature", NodeLevel.TYPES) {
     @Override
@@ -568,6 +1197,17 @@
     public NNode newNode() {
       return new NGenericSignature();
     }
+
+    @Override
+    @Nonnull
+    public Class<NGenericSignature> getNNodeClass() {
+      return NGenericSignature.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NGenericSignature.skipContent(reader);
+    }
   },
   GOTO("goto") {
     @Nonnull
@@ -575,6 +1215,17 @@
     public NNode newNode() {
       return new NGoto();
     }
+
+    @Override
+    @Nonnull
+    public Class<NGoto> getNNodeClass() {
+      return NGoto.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NGoto.skipContent(reader);
+    }
   },
   GTE_OPERATION(">=") {
     @Nonnull
@@ -582,6 +1233,17 @@
     public NNode newNode() {
       return new NGteOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NGteOperation> getNNodeClass() {
+      return NGteOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NGteOperation.skipContent(reader);
+    }
   },
   GT_OPERATION(">") {
     @Nonnull
@@ -589,6 +1251,17 @@
     public NNode newNode() {
       return new NGtOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NGtOperation> getNNodeClass() {
+      return NGtOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NGtOperation.skipContent(reader);
+    }
   },
   IF_STATEMENT("if") {
     @Override
@@ -596,6 +1269,17 @@
     public NNode newNode() {
       return new NIfStatement();
     }
+
+    @Override
+    @Nonnull
+    public Class<NIfStatement> getNNodeClass() {
+      return NIfStatement.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NIfStatement.skipContent(reader);
+    }
   },
   INSTANCE_OF("instanceof") {
     @Override
@@ -603,6 +1287,17 @@
     public NNode newNode() {
       return new NInstanceOf();
     }
+
+    @Override
+    @Nonnull
+    public Class<NInstanceOf> getNNodeClass() {
+      return NInstanceOf.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NInstanceOf.skipContent(reader);
+    }
   },
   INT_LITERAL("int", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -610,6 +1305,17 @@
     public NNode newNode() {
       return new NIntLiteral();
     }
+
+    @Override
+    @Nonnull
+    public Class<NIntLiteral> getNNodeClass() {
+      return NIntLiteral.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NIntLiteral.skipContent(reader);
+    }
   },
   INTERFACE("interface", NodeLevel.TYPES) {
     @Nonnull
@@ -617,6 +1323,17 @@
     public NNode newNode() {
       return new NInterfaceType();
     }
+
+    @Override
+    @Nonnull
+    public Class<NInterfaceType> getNNodeClass() {
+      return NInterfaceType.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NInterfaceType.skipContent(reader);
+    }
   },
   LABELED_STATEMENT("label") {
     @Nonnull
@@ -624,6 +1341,17 @@
     public NNode newNode() {
       return new NLabeledStatement();
     }
+
+    @Override
+    @Nonnull
+    public Class<NLabeledStatement> getNNodeClass() {
+      return NLabeledStatement.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NLabeledStatement.skipContent(reader);
+    }
   },
   LAMBDA("lambda") {
     @Nonnull
@@ -631,6 +1359,17 @@
     public NNode newNode() {
       return new NLambda();
     }
+
+    @Override
+    @Nonnull
+    public Class<NLambda> getNNodeClass() {
+      return NLambda.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NLambda.skipContent(reader);
+    }
   },
   LAMBDA_FROM_JILL("lambda-from-jill") {
     @Nonnull
@@ -638,6 +1377,17 @@
     public NNode newNode() {
       return new NLambdaFromJill();
     }
+
+    @Override
+    @Nonnull
+    public Class<NLambdaFromJill> getNNodeClass() {
+      return NLambdaFromJill.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) {
+      NLambdaFromJill.skipContent(reader);
+    }
   },
   LOCAL("local") {
     @Nonnull
@@ -645,6 +1395,18 @@
     public NNode newNode() {
       return new NLocal();
     }
+
+    @Override
+    @Nonnull
+    public Class<NLocal> getNNodeClass() {
+      return NLocal.class;
+    }
+
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NLocal.skipContent(reader);
+    }
   },
   LOCAL_REF("local-ref") {
     @Nonnull
@@ -652,6 +1414,17 @@
     public NNode newNode() {
       return new NLocalRef();
     }
+
+    @Override
+    @Nonnull
+    public Class<NLocalRef> getNNodeClass() {
+      return NLocalRef.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NLocalRef.skipContent(reader);
+    }
   },
   LOCK("lock") {
     @Nonnull
@@ -659,6 +1432,17 @@
     public NNode newNode() {
       return new NLock();
     }
+
+    @Override
+    @Nonnull
+    public Class<NLock> getNNodeClass() {
+      return NLock.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NLock.skipContent(reader);
+    }
   },
   LONG_LITERAL("long", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -666,6 +1450,17 @@
     public NNode newNode() {
       return new NLongLiteral();
     }
+
+    @Override
+    @Nonnull
+    public Class<NLongLiteral> getNNodeClass() {
+      return NLongLiteral.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NLongLiteral.skipContent(reader);
+    }
   },
   LTE_OPERATION("<=") {
     @Nonnull
@@ -673,6 +1468,18 @@
     public NNode newNode() {
       return new NLteOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NLteOperation> getNNodeClass() {
+      return NLteOperation.class;
+    }
+
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NLteOperation.skipContent(reader);
+    }
   },
   LT_OPERATION("<") {
     @Nonnull
@@ -680,6 +1487,17 @@
     public NNode newNode() {
       return new NLtOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NLtOperation> getNNodeClass() {
+      return NLtOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NLtOperation.skipContent(reader);
+    }
   },
   METHOD("method", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -687,6 +1505,17 @@
     public NNode newNode() {
       return new NMethod();
     }
+
+    @Override
+    @Nonnull
+    public Class<NMethod> getNNodeClass() {
+      return NMethod.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NMethod.skipContent(reader);
+    }
   },
   METHOD_BODY("body") {
     @Nonnull
@@ -694,6 +1523,17 @@
     public NNode newNode() {
       return new NMethodBody();
     }
+
+    @Override
+    @Nonnull
+    public Class<NMethodBody> getNNodeClass() {
+      return NMethodBody.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NMethodBody.skipContent(reader);
+    }
   },
   METHOD_CALL("call") {
     @Nonnull
@@ -701,6 +1541,17 @@
     public NNode newNode() {
       return new NMethodCall();
     }
+
+    @Override
+    @Nonnull
+    public Class<NMethodCall> getNNodeClass() {
+      return NMethodCall.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NMethodCall.skipContent(reader);
+    }
   },
   METHODID_WITH_RETURN_TYPE("method-id-with-return-type", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -708,6 +1559,17 @@
     public NNode newNode() {
       return new NMethodId();
     }
+
+    @Override
+    @Nonnull
+    public Class<NMethodId> getNNodeClass() {
+      return NMethodId.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NMethodId.skipContent(reader);
+    }
   },
   METHOD_LITERAL("method-literal", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -715,6 +1577,17 @@
     public NNode newNode() {
       return new NMethodLiteral();
     }
+
+    @Override
+    @Nonnull
+    public Class<NMethodLiteral> getNNodeClass() {
+      return NMethodLiteral.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NMethodLiteral.skipContent(reader);
+    }
   },
   MOD_OPERATION("%") {
     @Nonnull
@@ -722,6 +1595,17 @@
     public NNode newNode() {
       return new NModOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NModOperation> getNNodeClass() {
+      return NModOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NModOperation.skipContent(reader);
+    }
   },
   MUL_OPERATION("*") {
     @Nonnull
@@ -729,6 +1613,17 @@
     public NNode newNode() {
       return new NMulOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NMulOperation> getNNodeClass() {
+      return NMulOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NMulOperation.skipContent(reader);
+    }
   },
   MULTI_EXPRESSION("multi-expression") {
     @Nonnull
@@ -736,6 +1631,17 @@
     public NNode newNode() {
       return new NMultiExpression();
     }
+
+    @Override
+    @Nonnull
+    public Class<NMultiExpression> getNNodeClass() {
+      return NMultiExpression.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NMultiExpression.skipContent(reader);
+    }
   },
   NAME_VALUE_PAIR("name-value-pair", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -743,6 +1649,17 @@
     public NNode newNode() {
       return new NNameValuePair();
     }
+
+    @Override
+    @Nonnull
+    public Class<NNameValuePair> getNNodeClass() {
+      return NNameValuePair.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NNameValuePair.skipContent(reader);
+    }
   },
   NEQ_OPERATION("!=") {
     @Nonnull
@@ -750,6 +1667,17 @@
     public NNode newNode() {
       return new NNeqOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NNeqOperation> getNNodeClass() {
+      return NNeqOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NNeqOperation.skipContent(reader);
+    }
   },
   NATIVE_METHOD_BODY("native-body") {
     @Nonnull
@@ -757,6 +1685,17 @@
     public NNode newNode() {
       return new NNativeMethodBody();
     }
+
+    @Override
+    @Nonnull
+    public Class<NNativeMethodBody> getNNodeClass() {
+      return NNativeMethodBody.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) {
+      NNativeMethodBody.skipContent(reader);
+    }
   },
   NEW_ARRAY("new-array") {
     @Nonnull
@@ -764,6 +1703,17 @@
     public NNode newNode() {
       return new NNewArray();
     }
+
+    @Override
+    @Nonnull
+    public Class<NNewArray> getNNodeClass() {
+      return NNewArray.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NNewArray.skipContent(reader);
+    }
   },
   NEW_INSTANCE("new") {
     @Nonnull
@@ -771,6 +1721,17 @@
     public NNode newNode() {
       return new NNewInstance();
     }
+
+    @Override
+    @Nonnull
+    public Class<NNewInstance> getNNodeClass() {
+      return NNewInstance.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NNewInstance.skipContent(reader);
+    }
   },
   NULL_LITERAL("null-literal", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -778,6 +1739,17 @@
     public NNode newNode() {
       return new NNullLiteral();
     }
+
+    @Override
+    @Nonnull
+    public Class<NNullLiteral> getNNodeClass() {
+      return NNullLiteral.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) {
+      NNullLiteral.skipContent(reader);
+    }
   },
   OR_OPERATION("||") {
     @Override
@@ -785,6 +1757,17 @@
     public NNode newNode() {
       return new NOrOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NOrOperation> getNNodeClass() {
+      return NOrOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NOrOperation.skipContent(reader);
+    }
   },
   ORIGIN_DIGEST("origin-digest", NodeLevel.STRUCTURE) {
     @Override
@@ -792,6 +1775,17 @@
     public NNode newNode() {
       return new NOriginDigest();
     }
+
+    @Override
+    @Nonnull
+    public Class<NOriginDigest> getNNodeClass() {
+      return NOriginDigest.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NOriginDigest.skipContent(reader);
+    }
   },
   PARAMETER("parameter", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -799,6 +1793,17 @@
     public NNode newNode() {
       return new NParameter();
     }
+
+    @Override
+    @Nonnull
+    public Class<NParameter> getNNodeClass() {
+      return NParameter.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NParameter.skipContent(reader);
+    }
   },
   PARAMETER_REF("parameter-ref") {
     @Nonnull
@@ -806,6 +1811,17 @@
     public NNode newNode() {
       return new NParameterRef();
     }
+
+    @Override
+    @Nonnull
+    public Class<NParameterRef> getNNodeClass() {
+      return NParameterRef.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NParameterRef.skipContent(reader);
+    }
   },
   POLYMORPHIC_CALL("polymorphic-call") {
     @Nonnull
@@ -813,6 +1829,17 @@
     public NNode newNode() {
       return new NPolymorphicCall();
     }
+
+    @Override
+    @Nonnull
+    public Class<NPolymorphicCall> getNNodeClass() {
+      return NPolymorphicCall.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NPolymorphicCall.skipContent(reader);
+    }
   },
   POSTFIX_DEC_OPERATION("postfix-dec") {
     @Nonnull
@@ -820,6 +1847,17 @@
     public NNode newNode() {
       return new NPostfixDecOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NPostfixDecOperation> getNNodeClass() {
+      return NPostfixDecOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NPostfixDecOperation.skipContent(reader);
+    }
   },
   POSTFIX_INC_OPERATION("postfix-inc") {
     @Nonnull
@@ -827,6 +1865,17 @@
     public NNode newNode() {
       return new NPostfixIncOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NPostfixIncOperation> getNNodeClass() {
+      return NPostfixIncOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NPostfixIncOperation.skipContent(reader);
+    }
   },
   PREFIX_BIT_NOT_OPERATION("~") {
     @Nonnull
@@ -834,6 +1883,17 @@
     public NNode newNode() {
       return new NPrefixBitNotOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NPrefixBitNotOperation> getNNodeClass() {
+      return NPrefixBitNotOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NPrefixBitNotOperation.skipContent(reader);
+    }
   },
   PREFIX_DEC_OPERATION("prefix-dec") {
     @Nonnull
@@ -841,6 +1901,17 @@
     public NNode newNode() {
       return new NPrefixDecOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NPrefixDecOperation> getNNodeClass() {
+      return NPrefixDecOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NPrefixDecOperation.skipContent(reader);
+    }
   },
   PREFIX_INC_OPERATION("prefix-inc") {
     @Nonnull
@@ -848,6 +1919,17 @@
     public NNode newNode() {
       return new NPrefixIncOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NPrefixIncOperation> getNNodeClass() {
+      return NPrefixIncOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NPrefixIncOperation.skipContent(reader);
+    }
   },
   PREFIX_NEG_OPERATION("neg") {
     @Nonnull
@@ -855,6 +1937,17 @@
     public NNode newNode() {
       return new NPrefixNegOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NPrefixNegOperation> getNNodeClass() {
+      return NPrefixNegOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NPrefixNegOperation.skipContent(reader);
+    }
   },
   PREFIX_NOT_OPERATION("not") {
     @Nonnull
@@ -862,20 +1955,36 @@
     public NNode newNode() {
       return new NPrefixNotOperation();
     }
-  },
-  RESERVED("reserved") {
-    @Nonnull
+
     @Override
-    public NNode newNode() {
-      throw new JayceFormatException("Unexpected node '" + toString() + "'");
+    @Nonnull
+    public Class<NPrefixNotOperation> getNNodeClass() {
+      return NPrefixNotOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NPrefixNotOperation.skipContent(reader);
     }
   },
+  RESERVED("reserved"),
   REINTERPRETCAST_OPERATION("reinterpret-cast") {
     @Override
     @Nonnull
     public NNode newNode() {
       return new NReinterpretCastOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NReinterpretCastOperation> getNNodeClass() {
+      return NReinterpretCastOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NReinterpretCastOperation.skipContent(reader);
+    }
   },
   RETURN_STATEMENT("return") {
     @Nonnull
@@ -883,6 +1992,17 @@
     public NNode newNode() {
       return new NReturnStatement();
     }
+
+    @Override
+    @Nonnull
+    public Class<NReturnStatement> getNNodeClass() {
+      return NReturnStatement.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NReturnStatement.skipContent(reader);
+    }
   },
   SHL_OPERATION("<<") {
     @Nonnull
@@ -890,6 +2010,17 @@
     public NNode newNode() {
       return new NShlOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NShlOperation> getNNodeClass() {
+      return NShlOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NShlOperation.skipContent(reader);
+    }
   },
   SHORT_LITERAL("short", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -897,6 +2028,17 @@
     public NNode newNode() {
       return new NShortLiteral();
     }
+
+    @Override
+    @Nonnull
+    public Class<NShortLiteral> getNNodeClass() {
+      return NShortLiteral.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NShortLiteral.skipContent(reader);
+    }
   },
   SHR_OPERATION(">>") {
     @Nonnull
@@ -904,6 +2046,17 @@
     public NNode newNode() {
       return new NShrOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NShrOperation> getNNodeClass() {
+      return NShrOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NShrOperation.skipContent(reader);
+    }
   },
   SHRU_OPERATION(">>>") {
     @Nonnull
@@ -911,6 +2064,17 @@
     public NNode newNode() {
       return new NShruOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NShruOperation> getNNodeClass() {
+      return NShruOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NShruOperation.skipContent(reader);
+    }
   },
   SIMPLE_NAME("simple-name", NodeLevel.TYPES) {
     @Override
@@ -918,6 +2082,17 @@
     public NNode newNode() {
       return new NSimpleName();
     }
+
+    @Override
+    @Nonnull
+    public Class<NSimpleName> getNNodeClass() {
+      return NSimpleName.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NSimpleName.skipContent(reader);
+    }
   },
   SUB_OPERATION("-") {
     @Nonnull
@@ -925,6 +2100,17 @@
     public NNode newNode() {
       return new NSubOperation();
     }
+
+    @Override
+    @Nonnull
+    public Class<NSubOperation> getNNodeClass() {
+      return NSubOperation.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NSubOperation.skipContent(reader);
+    }
   },
   STRING_LITERAL("string", NodeLevel.STRUCTURE) {
     @Nonnull
@@ -932,6 +2118,18 @@
     public NNode newNode() {
       return new NStringLiteral();
     }
+
+    @Override
+    @Nonnull
+    public Class<NStringLiteral> getNNodeClass() {
+      return NStringLiteral.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NStringLiteral.skipContent(reader);
+    }
+
   },
   SWITCH_STATEMENT("switch") {
     @Nonnull
@@ -939,6 +2137,17 @@
     public NNode newNode() {
       return new NSwitchStatement();
     }
+
+    @Override
+    @Nonnull
+    public Class<NSwitchStatement> getNNodeClass() {
+      return NSwitchStatement.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NSwitchStatement.skipContent(reader);
+    }
   },
   SYNCHRONIZED_BLOCK("synchronized-block") {
     @Nonnull
@@ -946,6 +2155,17 @@
     public NNode newNode() {
       return new NSynchronizedBlock();
     }
+
+    @Override
+    @Nonnull
+    public Class<NSynchronizedBlock> getNNodeClass() {
+      return NSynchronizedBlock.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NSynchronizedBlock.skipContent(reader);
+    }
   },
   THIS_REF("this") {
     @Nonnull
@@ -953,13 +2173,35 @@
     public NNode newNode() {
       return new NThisRef();
     }
+
+    @Override
+    @Nonnull
+    public Class<NThisRef> getNNodeClass() {
+      return NThisRef.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NThisRef.skipContent(reader);
+    }
   },
-  THIS_REF_TYPE_INFO("this-type-info") {
+  THIS_REF_TYPE_INFO("this-type-info", NodeLevel.STRUCTURE) {
     @Nonnull
     @Override
     public NNode newNode() {
       return new NThisRefTypeInfo();
     }
+
+    @Override
+    @Nonnull
+    public Class<NThisRefTypeInfo> getNNodeClass() {
+      return NThisRefTypeInfo.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NThisRefTypeInfo.skipContent(reader);
+    }
   },
   THROW_STATEMENT("throw") {
     @Nonnull
@@ -967,6 +2209,17 @@
     public NNode newNode() {
       return new NThrowStatement();
     }
+
+    @Override
+    @Nonnull
+    public Class<NThrowStatement> getNNodeClass() {
+      return NThrowStatement.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NThrowStatement.skipContent(reader);
+    }
   },
   THROWN_EXCEPTION("thrown-exception", NodeLevel.STRUCTURE) {
     @Override
@@ -974,6 +2227,17 @@
     public NNode newNode() {
       return new NThrownExceptionMarker();
     }
+
+    @Override
+    @Nonnull
+    public Class<NThrownExceptionMarker> getNNodeClass() {
+      return NThrownExceptionMarker.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NThrownExceptionMarker.skipContent(reader);
+    }
   },
   TRY_STATEMENT("try") {
     @Nonnull
@@ -981,6 +2245,17 @@
     public NNode newNode() {
       return new NTryStatement();
     }
+
+    @Override
+    @Nonnull
+    public Class<NTryStatement> getNNodeClass() {
+      return NTryStatement.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NTryStatement.skipContent(reader);
+    }
   },
   UNLOCK("unlock") {
     @Nonnull
@@ -988,6 +2263,17 @@
     public NNode newNode() {
       return new NUnlock();
     }
+
+    @Override
+    @Nonnull
+    public Class<NUnlock> getNNodeClass() {
+      return NUnlock.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NUnlock.skipContent(reader);
+    }
   },
   WHILE_STATEMENT("while") {
     @Nonnull
@@ -995,6 +2281,17 @@
     public NNode newNode() {
       return new NWhileStatement();
     }
+
+    @Override
+    @Nonnull
+    public Class<NWhileStatement> getNNodeClass() {
+      return NWhileStatement.class;
+    }
+
+    @Override
+    public void skip(@Nonnull JayceInternalReaderImpl reader) throws IOException {
+      NWhileStatement.skipContent(reader);
+    }
   },
   ;
 
@@ -1004,12 +2301,21 @@
   @CheckForNull
   private String label;
 
+  private final boolean hasSourceInfo;
+
   private Token(@CheckForNull String text) {
     this(text, NodeLevel.FULL);
   }
   private Token(@CheckForNull String text, NodeLevel nodeLevel) {
     this.label = text;
     this.nodeLevel = nodeLevel;
+    boolean tmpHasSourceInfo;
+    try {
+      tmpHasSourceInfo = HasSourceInfo.class.isAssignableFrom(getNNodeClass());
+    } catch (InvalidTokenException e) {
+      tmpHasSourceInfo = false;
+    }
+    hasSourceInfo = tmpHasSourceInfo;
   }
 
   public int getId() {
@@ -1023,6 +2329,21 @@
 
   @Nonnull
   public NNode newNode() throws InvalidTokenException {
+    throw new InvalidTokenException("No node corresponding to token " + this.toString());
+  }
+
+  @Nonnull
+  public Class<? extends NNode> getNNodeClass() throws InvalidTokenException  {
+    throw new InvalidTokenException("No node corresponding to token " + this.toString());
+  }
+
+  public final boolean hasSourceInfo() {
+    return hasSourceInfo;
+  }
+
+  @SuppressWarnings("unused")
+  public void skip(@Nonnull JayceInternalReaderImpl reader)
+      throws InvalidTokenException, IOException {
     throw new InvalidTokenException("No node coresponding to token " + this.toString());
   }
 
diff --git a/jack/src/com/android/jack/jayce/v0004/io/Tokenizer.java b/jack/src/com/android/jack/jayce/v0004/io/Tokenizer.java
index 05e170b..66a510b 100644
--- a/jack/src/com/android/jack/jayce/v0004/io/Tokenizer.java
+++ b/jack/src/com/android/jack/jayce/v0004/io/Tokenizer.java
@@ -72,50 +72,97 @@
     return in.readInt();
   }
 
+  public void skipInt() throws IOException {
+    currentTokenId = Token.NUMBER_VALUE;
+    in.skipInt();
+  }
+
   public byte readByte() throws IOException {
     currentTokenId = Token.NUMBER_VALUE;
     return in.readByte();
   }
 
+  public void skipByte() throws IOException {
+    currentTokenId = Token.NUMBER_VALUE;
+    in.skipByte();
+  }
+
   public boolean readBoolean() throws IOException {
     return in.readBoolean();
   }
 
+  public void skipBoolean() throws IOException {
+    in.skipBoolean();
+  }
+
   public long readLong() throws IOException {
     currentTokenId = Token.NUMBER_VALUE;
     return in.readLong();
   }
 
+  public void skipLong() throws IOException {
+    currentTokenId = Token.NUMBER_VALUE;
+    in.skipLong();
+  }
+
   public short readShort() throws IOException {
     currentTokenId = Token.NUMBER_VALUE;
     return in.readShort();
   }
 
+  public void skipShort() throws IOException {
+    currentTokenId = Token.NUMBER_VALUE;
+    in.skipShort();
+  }
+
   public char readChar() throws IOException {
     currentTokenId = Token.NUMBER_VALUE;
     return in.readChar();
   }
 
+  public void skipChar() throws IOException {
+    currentTokenId = Token.NUMBER_VALUE;
+    in.skipChar();
+  }
+
   public float readFloat() throws IOException {
     currentTokenId = Token.NUMBER_VALUE;
     return Float.intBitsToFloat(readInt());
   }
 
+  public void skipFloat() throws IOException {
+    currentTokenId = Token.NUMBER_VALUE;
+    in.skipInt();
+  }
+
   public double readDouble() throws IOException {
     currentTokenId = Token.NUMBER_VALUE;
     return Double.longBitsToDouble(readLong());
   }
 
+  public void skipDouble() throws IOException {
+    currentTokenId = Token.NUMBER_VALUE;
+    in.skipLong();
+  }
+
   @CheckForNull
   public String readString() throws IOException {
     return in.readUTF();
   }
 
+  public void skipString() throws IOException {
+    in.skipUTF();
+  }
+
   @CheckForNull
   public byte[] readBuffer() throws IOException {
     return in.readBuffer();
   }
 
+  public void skipBuffer() throws IOException {
+    in.skipBuffer();
+  }
+
   private void readToken(@Nonnull Token expected) throws IOException {
     next();
     if (currentTokenId != expected) {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NAbsentArrayDimension.java b/jack/src/com/android/jack/jayce/v0004/nodes/NAbsentArrayDimension.java
index 7db047c..d7694cb 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NAbsentArrayDimension.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NAbsentArrayDimension.java
@@ -58,6 +58,10 @@
   public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
   }
 
+  @SuppressWarnings("unused")
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NAddOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NAddOperation.java
index 425bba3..b030c0f 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NAddOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NAddOperation.java
@@ -76,6 +76,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NAlloc.java b/jack/src/com/android/jack/jayce/v0004/nodes/NAlloc.java
index 012aa0f..4c4edfd 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NAlloc.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NAlloc.java
@@ -67,6 +67,10 @@
     instanceType = in.readId();
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipId();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NAndOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NAndOperation.java
index ea30700..85bf84e 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NAndOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NAndOperation.java
@@ -76,6 +76,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NAnnotation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NAnnotation.java
index b1c6328..aef2425 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NAnnotation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NAnnotation.java
@@ -101,6 +101,13 @@
     markers = in.readNodes(NMarker.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipRetentionPolicyEnum();
+    in.skipId();
+    in.skipNodes();
+    in.skipNodes();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NAnnotationMethod.java b/jack/src/com/android/jack/jayce/v0004/nodes/NAnnotationMethod.java
index 1fd3113..1a033ef 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NAnnotationMethod.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NAnnotationMethod.java
@@ -123,6 +123,15 @@
     markers = in.readNodes(NMarker.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipId();
+    in.skipId();
+    in.skipInt();
+    in.skipNodes();
+    in.skipNode();
+    in.skipNodes();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NAnnotationType.java b/jack/src/com/android/jack/jayce/v0004/nodes/NAnnotationType.java
index 116bed3..bed6f8c 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NAnnotationType.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NAnnotationType.java
@@ -152,6 +152,22 @@
     }
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    NodeLevel level = in.getNodeLevel();
+    in.skipRetentionPolicyEnum();
+    in.skipInt();
+    in.skipId();
+    if (level != NodeLevel.TYPES) {
+      in.skipIds();
+      in.skipId();
+      in.skipIds();
+      in.skipNodes();
+      in.skipNodes();
+      in.skipNodes();
+      in.skipNodes();
+    }
+  }
+
   @Nonnull
   @Override
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NArrayLength.java b/jack/src/com/android/jack/jayce/v0004/nodes/NArrayLength.java
index dc54cb6..223b9c9 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NArrayLength.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NArrayLength.java
@@ -70,6 +70,10 @@
     instance = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NArrayLiteral.java b/jack/src/com/android/jack/jayce/v0004/nodes/NArrayLiteral.java
index f501add..3a72b9c 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NArrayLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NArrayLiteral.java
@@ -74,6 +74,10 @@
     values = in.readNodes(NLiteral.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNodes();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NArrayRef.java b/jack/src/com/android/jack/jayce/v0004/nodes/NArrayRef.java
index 31183f6..3388d63 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NArrayRef.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NArrayRef.java
@@ -78,6 +78,11 @@
     index = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgAddOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgAddOperation.java
index 09def26..23cc134 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgAddOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgAddOperation.java
@@ -76,6 +76,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgBitAndOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgBitAndOperation.java
index de764be..8859a8b 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgBitAndOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgBitAndOperation.java
@@ -76,6 +76,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgBitOrOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgBitOrOperation.java
index fc29f33..ae27f55 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgBitOrOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgBitOrOperation.java
@@ -76,6 +76,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgBitXorOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgBitXorOperation.java
index 696cee5..6af8985 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgBitXorOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgBitXorOperation.java
@@ -76,6 +76,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgConcatOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgConcatOperation.java
index d62176f..ebf8e24 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgConcatOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgConcatOperation.java
@@ -76,6 +76,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgDivOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgDivOperation.java
index b0bc219..22fbcaf 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgDivOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgDivOperation.java
@@ -76,6 +76,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgModOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgModOperation.java
index 14431fd..f980005 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgModOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgModOperation.java
@@ -75,6 +75,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgMulOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgMulOperation.java
index 5301fea..f6cbbb2 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgMulOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgMulOperation.java
@@ -75,6 +75,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgOperation.java
index af72b4b..e5f1b12 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgOperation.java
@@ -75,6 +75,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgShlOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgShlOperation.java
index 9ae3860..dee5fb8 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgShlOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgShlOperation.java
@@ -75,6 +75,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgShrOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgShrOperation.java
index 317ce2b..b3f7eaa 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgShrOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgShrOperation.java
@@ -75,6 +75,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgShruOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgShruOperation.java
index 7185899..bba5720 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgShruOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgShruOperation.java
@@ -75,6 +75,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgSubOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgSubOperation.java
index 29abd39..e309a62 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NAsgSubOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NAsgSubOperation.java
@@ -75,6 +75,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NAssertStatement.java b/jack/src/com/android/jack/jayce/v0004/nodes/NAssertStatement.java
index 6be2deb..156943d 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NAssertStatement.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NAssertStatement.java
@@ -92,6 +92,11 @@
     arg = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.readNode(NExpression.class);
+    in.readNode(NExpression.class);
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NBitAndOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NBitAndOperation.java
index f863a65..d440903 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NBitAndOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NBitAndOperation.java
@@ -76,6 +76,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NBitOrOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NBitOrOperation.java
index 705fb11..8aef5a1 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NBitOrOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NBitOrOperation.java
@@ -75,6 +75,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NBitXorOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NBitXorOperation.java
index 34e2d4e..91d1a9f 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NBitXorOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NBitXorOperation.java
@@ -75,6 +75,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NBlock.java b/jack/src/com/android/jack/jayce/v0004/nodes/NBlock.java
index 1346104..f338a47 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NBlock.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NBlock.java
@@ -80,6 +80,10 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNodes();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NBooleanLiteral.java b/jack/src/com/android/jack/jayce/v0004/nodes/NBooleanLiteral.java
index 75d9ac9..f9206da 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NBooleanLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NBooleanLiteral.java
@@ -63,6 +63,10 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipBoolean();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NBreakStatement.java b/jack/src/com/android/jack/jayce/v0004/nodes/NBreakStatement.java
index b46667c..527a955 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NBreakStatement.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NBreakStatement.java
@@ -75,6 +75,10 @@
     label = in.readString();
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipString();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NByteLiteral.java b/jack/src/com/android/jack/jayce/v0004/nodes/NByteLiteral.java
index 2e3ef7f..945e419 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NByteLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NByteLiteral.java
@@ -64,6 +64,10 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipByte();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NCaseStatement.java b/jack/src/com/android/jack/jayce/v0004/nodes/NCaseStatement.java
index 3af72a0..8556f83 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NCaseStatement.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NCaseStatement.java
@@ -88,6 +88,11 @@
     expr = in.readNode(NLiteral.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipId();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NCatchBlock.java b/jack/src/com/android/jack/jayce/v0004/nodes/NCatchBlock.java
index 3083355..688ebb4 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NCatchBlock.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NCatchBlock.java
@@ -114,6 +114,13 @@
     statements = in.readNodes(NStatement.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipId();
+    in.skipIds();
+    in.skipNode();
+    in.skipNodes();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NCharLiteral.java b/jack/src/com/android/jack/jayce/v0004/nodes/NCharLiteral.java
index f85b784..a859a57 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NCharLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NCharLiteral.java
@@ -63,6 +63,10 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipChar();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NClassLiteral.java b/jack/src/com/android/jack/jayce/v0004/nodes/NClassLiteral.java
index 22c545c..679c0ef 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NClassLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NClassLiteral.java
@@ -70,6 +70,10 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipId();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NClassType.java b/jack/src/com/android/jack/jayce/v0004/nodes/NClassType.java
index b52fdb7..4e962fa 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NClassType.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NClassType.java
@@ -216,6 +216,24 @@
     }
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    NodeLevel nodeLevel = in.getNodeLevel();
+    in.skipInt();
+    in.skipId();
+    if (nodeLevel != NodeLevel.TYPES) {
+      in.skipId();
+      in.skipIds();
+      in.skipId();
+      in.skipId();
+      in.skipId();
+      in.skipIds();
+      in.skipNodes();
+      in.skipNodes();
+      in.skipNodes();
+      in.skipNodes();
+    }
+  }
+
   @Nonnull
   @Override
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NConcatOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NConcatOperation.java
index 786fe03..7541a76 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NConcatOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NConcatOperation.java
@@ -78,6 +78,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NConditionalExpression.java b/jack/src/com/android/jack/jayce/v0004/nodes/NConditionalExpression.java
index ce33747..7faf691 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NConditionalExpression.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NConditionalExpression.java
@@ -88,6 +88,12 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NConstructor.java b/jack/src/com/android/jack/jayce/v0004/nodes/NConstructor.java
index 0580754..99e6f3b 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NConstructor.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NConstructor.java
@@ -107,6 +107,14 @@
     markers = in.readNodes(NMarker.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNodes();
+    in.skipInt();
+    in.skipNodes();
+    in.skipNode();
+    in.skipNodes();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NContainerAnnotation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NContainerAnnotation.java
index 9312b54..58f5db0 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NContainerAnnotation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NContainerAnnotation.java
@@ -72,6 +72,11 @@
     annotationTypeSig = in.readId();
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipRetentionPolicyEnum();
+    in.skipId();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NContinueStatement.java b/jack/src/com/android/jack/jayce/v0004/nodes/NContinueStatement.java
index 6bfcc87..a059e63 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NContinueStatement.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NContinueStatement.java
@@ -77,6 +77,10 @@
     label = in.readString();
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipString();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NDebugVariableInfo.java b/jack/src/com/android/jack/jayce/v0004/nodes/NDebugVariableInfo.java
index 6c9b205..e26dc30 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NDebugVariableInfo.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NDebugVariableInfo.java
@@ -81,6 +81,12 @@
     genericSignature = in.readString();
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipString();
+    in.skipId();
+    in.skipString();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NDivOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NDivOperation.java
index 0e0ae0c..7838b04 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NDivOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NDivOperation.java
@@ -75,6 +75,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NDoStatement.java b/jack/src/com/android/jack/jayce/v0004/nodes/NDoStatement.java
index c4bd69e..20b05fb 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NDoStatement.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NDoStatement.java
@@ -87,6 +87,11 @@
     body = in.readNode(NStatement.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NDoubleLiteral.java b/jack/src/com/android/jack/jayce/v0004/nodes/NDoubleLiteral.java
index 6bd87ab..41fdf72 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NDoubleLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NDoubleLiteral.java
@@ -64,6 +64,10 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipDouble();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NDynamicCastOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NDynamicCastOperation.java
index 30ea886..3f1b3eb 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NDynamicCastOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NDynamicCastOperation.java
@@ -85,6 +85,11 @@
     expr = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipIds();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NEnumField.java b/jack/src/com/android/jack/jayce/v0004/nodes/NEnumField.java
index e8a16ec..3083446 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NEnumField.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NEnumField.java
@@ -114,6 +114,16 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipInt();
+    in.skipId();
+    in.skipId();
+    in.skipNode();
+    in.skipInt();
+    in.skipNodes();
+    in.skipNodes();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NEnumLiteral.java b/jack/src/com/android/jack/jayce/v0004/nodes/NEnumLiteral.java
index bb57bf0..1af3fee 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NEnumLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NEnumLiteral.java
@@ -84,6 +84,11 @@
     enumFieldName = in.readId();
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipId();
+    in.skipId();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NEnumType.java b/jack/src/com/android/jack/jayce/v0004/nodes/NEnumType.java
index d2ff72c..149ccd2 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NEnumType.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NEnumType.java
@@ -174,6 +174,24 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    NodeLevel nodeLevel = in.getNodeLevel();
+    in.skipInt();
+    in.skipId();
+    if (nodeLevel != NodeLevel.TYPES) {
+      in.skipId();
+      in.skipIds();
+      in.skipId();
+      in.skipId();
+      in.skipId();
+      in.skipIds();
+      in.skipNodes();
+      in.skipNodes();
+      in.skipNodes();
+      in.skipNodes();
+    }
+  }
+
   @Nonnull
   @Override
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NEqOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NEqOperation.java
index b324435..bd38f9e 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NEqOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NEqOperation.java
@@ -75,6 +75,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NExceptionRuntimeValue.java b/jack/src/com/android/jack/jayce/v0004/nodes/NExceptionRuntimeValue.java
index 75c7ccc..5f8e340 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NExceptionRuntimeValue.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NExceptionRuntimeValue.java
@@ -67,6 +67,10 @@
     catchedType = in.readId();
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipId();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NExpressionStatement.java b/jack/src/com/android/jack/jayce/v0004/nodes/NExpressionStatement.java
index 01e3dac..bba18f3 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NExpressionStatement.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NExpressionStatement.java
@@ -81,6 +81,10 @@
     expression = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NField.java b/jack/src/com/android/jack/jayce/v0004/nodes/NField.java
index 174a6bb..dfb2f15 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NField.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NField.java
@@ -142,6 +142,15 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipInt();
+    in.skipId();
+    in.skipId();
+    in.skipNode();
+    in.skipNodes();
+    in.skipNodes();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NFieldInitializer.java b/jack/src/com/android/jack/jayce/v0004/nodes/NFieldInitializer.java
index 539f6d1..aedae4f 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NFieldInitializer.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NFieldInitializer.java
@@ -59,6 +59,11 @@
     throw new UnsupportedOperationException();
   }
 
+  @SuppressWarnings("unused")
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) {
+    throw new UnsupportedOperationException();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NFieldRef.java b/jack/src/com/android/jack/jayce/v0004/nodes/NFieldRef.java
index 9009afc..2f3f472 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NFieldRef.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NFieldRef.java
@@ -105,6 +105,14 @@
     instance = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipId();
+    in.skipId();
+    in.readId();
+    in.skipFieldRefKindEnum();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NFloatLiteral.java b/jack/src/com/android/jack/jayce/v0004/nodes/NFloatLiteral.java
index f2cb5a0..dc354d9 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NFloatLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NFloatLiteral.java
@@ -64,6 +64,10 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipFloat();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NForStatement.java b/jack/src/com/android/jack/jayce/v0004/nodes/NForStatement.java
index c746c7c..e0b8b65 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NForStatement.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NForStatement.java
@@ -116,6 +116,13 @@
     body = in.readNode(NStatement.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNodes();
+    in.skipNode();
+    in.skipNodes();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NGenericSignature.java b/jack/src/com/android/jack/jayce/v0004/nodes/NGenericSignature.java
index a352bd8..ebcfec6 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NGenericSignature.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NGenericSignature.java
@@ -62,6 +62,10 @@
     genericSignature = in.readString();
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipString();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NGoto.java b/jack/src/com/android/jack/jayce/v0004/nodes/NGoto.java
index 8845cf1..1854584 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NGoto.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NGoto.java
@@ -78,6 +78,10 @@
     target = in.readId();
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipId();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NGtOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NGtOperation.java
index 0baeb71..fb61d28 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NGtOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NGtOperation.java
@@ -75,6 +75,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NGteOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NGteOperation.java
index 45d1848..875dcb9 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NGteOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NGteOperation.java
@@ -76,6 +76,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NIfStatement.java b/jack/src/com/android/jack/jayce/v0004/nodes/NIfStatement.java
index 9e701c4..769fcef 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NIfStatement.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NIfStatement.java
@@ -98,6 +98,12 @@
     elseStatement = in.readNode(NStatement.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NInstanceOf.java b/jack/src/com/android/jack/jayce/v0004/nodes/NInstanceOf.java
index 07134d3..70b3824 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NInstanceOf.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NInstanceOf.java
@@ -79,6 +79,11 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipId();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NIntLiteral.java b/jack/src/com/android/jack/jayce/v0004/nodes/NIntLiteral.java
index a15f270..acbda0b 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NIntLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NIntLiteral.java
@@ -63,6 +63,10 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipInt();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NInterfaceType.java b/jack/src/com/android/jack/jayce/v0004/nodes/NInterfaceType.java
index 721e086..e779bd8 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NInterfaceType.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NInterfaceType.java
@@ -166,6 +166,21 @@
     }
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    NodeLevel nodeLevel = in.getNodeLevel();
+    in.skipInt();
+    in.skipId();
+    if (nodeLevel != NodeLevel.TYPES) {
+      in.skipIds();
+      in.skipId();
+      in.skipIds();
+      in.skipNodes();
+      in.skipNodes();
+      in.skipNodes();
+      in.skipNodes();
+    }
+  }
+
   @Nonnull
   @Override
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NLabeledStatement.java b/jack/src/com/android/jack/jayce/v0004/nodes/NLabeledStatement.java
index a462c24..c605aaf 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NLabeledStatement.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NLabeledStatement.java
@@ -97,6 +97,12 @@
     body = in.readNode(NStatement.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipString();
+    in.skipId();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NLambda.java b/jack/src/com/android/jack/jayce/v0004/nodes/NLambda.java
index 4684f08..818bbf7 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NLambda.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NLambda.java
@@ -213,6 +213,22 @@
     markers = in.readNodes(NMarker.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNodes();
+    in.skipReceiverKindEnum();
+    in.skipId();
+    in.skipId();
+    in.skipIds();
+    in.skipMethodKindEnum();
+    in.skipId();
+    in.skipId();
+    in.skipIds();
+    in.skipNode();
+    in.skipNode();
+    in.skipNodes();
+    in.skipNodes();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NLambdaFromJill.java b/jack/src/com/android/jack/jayce/v0004/nodes/NLambdaFromJill.java
index 00ad245..3cbf53f 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NLambdaFromJill.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NLambdaFromJill.java
@@ -53,6 +53,10 @@
   public void readContent(@Nonnull JayceInternalReaderImpl in) {
   }
 
+  @SuppressWarnings("unused")
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) {
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NLocal.java b/jack/src/com/android/jack/jayce/v0004/nodes/NLocal.java
index e435df2..bf7a9d8 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NLocal.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NLocal.java
@@ -113,6 +113,15 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipId();
+    in.skipInt();
+    in.skipId();
+    in.skipId();
+    in.skipNodes();
+    in.skipNodes();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NLocalRef.java b/jack/src/com/android/jack/jayce/v0004/nodes/NLocalRef.java
index 3dbbe6d..cd91aa7 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NLocalRef.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NLocalRef.java
@@ -86,6 +86,11 @@
     markers = in.readNodes(NMarker.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipId();
+    in.skipNodes();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NLock.java b/jack/src/com/android/jack/jayce/v0004/nodes/NLock.java
index 6a5bffe..78a35c9 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NLock.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NLock.java
@@ -80,6 +80,10 @@
     lockExpr = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NLongLiteral.java b/jack/src/com/android/jack/jayce/v0004/nodes/NLongLiteral.java
index 420b639..c102938 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NLongLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NLongLiteral.java
@@ -63,6 +63,10 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipLong();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NLtOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NLtOperation.java
index 2372e7b..e49d635 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NLtOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NLtOperation.java
@@ -75,6 +75,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NLteOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NLteOperation.java
index 3d0b362..36b29eb 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NLteOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NLteOperation.java
@@ -75,6 +75,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NMethod.java b/jack/src/com/android/jack/jayce/v0004/nodes/NMethod.java
index dccf59b..044052e 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NMethod.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NMethod.java
@@ -196,6 +196,17 @@
     markers = in.readNodes(NMarker.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipId();
+    in.skipId();
+    in.skipNodes();
+    in.skipMethodKindEnum();
+    in.skipInt();
+    in.skipNodes();
+    in.skipNode();
+    in.skipNodes();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NMethodBody.java b/jack/src/com/android/jack/jayce/v0004/nodes/NMethodBody.java
index 251efc5..f633bab 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NMethodBody.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NMethodBody.java
@@ -81,6 +81,11 @@
     block = in.readNode(NBlock.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNodes();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NMethodCall.java b/jack/src/com/android/jack/jayce/v0004/nodes/NMethodCall.java
index 88f5b5f..89696ce 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NMethodCall.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NMethodCall.java
@@ -164,6 +164,18 @@
     dispatchKind = in.readDispatchKindEnum();
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipId();
+    in.skipReceiverKindEnum();
+    in.skipId();
+    in.skipIds();
+    in.skipMethodKindEnum();
+    in.skipId();
+    in.skipNodes();
+    in.skipDispatchKindEnum();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NMethodId.java b/jack/src/com/android/jack/jayce/v0004/nodes/NMethodId.java
index 8bcfb3f..329390f 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NMethodId.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NMethodId.java
@@ -95,6 +95,13 @@
     paramTypeSigs = in.readIds();
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipId();
+    in.skipMethodKindEnum();
+    in.skipId();
+    in.skipIds();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NMethodLiteral.java b/jack/src/com/android/jack/jayce/v0004/nodes/NMethodLiteral.java
index ac4f67a..1455182 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NMethodLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NMethodLiteral.java
@@ -81,6 +81,11 @@
     methodEnclosingType = in.readId();
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipId();
+    in.skipId();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NModOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NModOperation.java
index 1a5acd2..0556021 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NModOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NModOperation.java
@@ -75,6 +75,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NMulOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NMulOperation.java
index 3875055..82dd870 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NMulOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NMulOperation.java
@@ -75,6 +75,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NMultiExpression.java b/jack/src/com/android/jack/jayce/v0004/nodes/NMultiExpression.java
index 316c3b6..d9bdf53 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NMultiExpression.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NMultiExpression.java
@@ -75,6 +75,10 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNodes();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NNameValuePair.java b/jack/src/com/android/jack/jayce/v0004/nodes/NNameValuePair.java
index ceac9cf..f41c5ae 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NNameValuePair.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NNameValuePair.java
@@ -98,6 +98,11 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipString();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NNativeMethodBody.java b/jack/src/com/android/jack/jayce/v0004/nodes/NNativeMethodBody.java
index 5f5a7bb..ce1a0f8 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NNativeMethodBody.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NNativeMethodBody.java
@@ -23,8 +23,6 @@
 import com.android.jack.jayce.v0004.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0004.io.Token;
 
-import java.io.IOException;
-
 import javax.annotation.Nonnull;
 
 /**
@@ -49,15 +47,18 @@
     return jNativeMethodBody;
   }
 
-  @SuppressWarnings("unused")
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
+  public void writeContent(@Nonnull JayceInternalWriterImpl out) {
+
+  }
+
+  @Override
+  public void readContent(@Nonnull JayceInternalReaderImpl in) {
 
   }
 
   @SuppressWarnings("unused")
-  @Override
-  public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) {
 
   }
 
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NNeqOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NNeqOperation.java
index 6b25e7d..2131cef 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NNeqOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NNeqOperation.java
@@ -75,6 +75,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NNewArray.java b/jack/src/com/android/jack/jayce/v0004/nodes/NNewArray.java
index 0db2fee..44e6105 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NNewArray.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NNewArray.java
@@ -97,6 +97,12 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipId();
+    in.skipNodes();
+    in.skipNodes();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NNewInstance.java b/jack/src/com/android/jack/jayce/v0004/nodes/NNewInstance.java
index 2117a3b..450ecb8 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NNewInstance.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NNewInstance.java
@@ -93,6 +93,12 @@
     args = in.readNodes(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipId();
+    in.skipIds();
+    in.skipNodes();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NNullLiteral.java b/jack/src/com/android/jack/jayce/v0004/nodes/NNullLiteral.java
index 769d0b7..e22cd0a 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NNullLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NNullLiteral.java
@@ -23,8 +23,6 @@
 import com.android.jack.jayce.v0004.io.JayceInternalWriterImpl;
 import com.android.jack.jayce.v0004.io.Token;
 
-import java.io.IOException;
-
 import javax.annotation.Nonnull;
 
 /**
@@ -49,14 +47,16 @@
     return jNullLiteral;
   }
 
-  @SuppressWarnings("unused")
   @Override
-  public void writeContent(@Nonnull JayceInternalWriterImpl out) throws IOException {
+  public void writeContent(@Nonnull JayceInternalWriterImpl out) {
+  }
+
+  @Override
+  public void readContent(@Nonnull JayceInternalReaderImpl in) {
   }
 
   @SuppressWarnings("unused")
-  @Override
-  public void readContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) {
   }
 
   @Override
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NOrOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NOrOperation.java
index 4bd4792..a45747b 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NOrOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NOrOperation.java
@@ -75,6 +75,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NOriginDigest.java b/jack/src/com/android/jack/jayce/v0004/nodes/NOriginDigest.java
index 1e12bdc..6e0a5d9 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NOriginDigest.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NOriginDigest.java
@@ -91,6 +91,15 @@
     minor = in.readInt();
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipInt();
+    in.skipString();
+    in.skipBuffer();
+    in.skipString();
+    in.skipInt();
+    in.skipInt();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NParameter.java b/jack/src/com/android/jack/jayce/v0004/nodes/NParameter.java
index 9ab6fbd..9f8ff0e 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NParameter.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NParameter.java
@@ -126,6 +126,15 @@
     markers = in.readNodes(NMarker.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipId();
+    in.skipInt();
+    in.skipId();
+    in.skipId();
+    in.skipNodes();
+    in.skipNodes();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NParameterRef.java b/jack/src/com/android/jack/jayce/v0004/nodes/NParameterRef.java
index 1650a31..84f1d13 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NParameterRef.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NParameterRef.java
@@ -79,6 +79,11 @@
     markers = in.readNodes(NMarker.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipId();
+    in.skipNodes();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NPolymorphicCall.java b/jack/src/com/android/jack/jayce/v0004/nodes/NPolymorphicCall.java
index beea2eb..344ab10 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NPolymorphicCall.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NPolymorphicCall.java
@@ -175,6 +175,19 @@
     callSiteParameterStrTypes = in.readIds();
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipId();
+    in.skipReceiverKindEnum();
+    in.skipId();
+    in.skipIds();
+    in.skipMethodKindEnum();
+    in.skipId();
+    in.skipNodes();
+    in.skipId();
+    in.skipIds();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NPostfixDecOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NPostfixDecOperation.java
index a0c89a7..e0b95b2 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NPostfixDecOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NPostfixDecOperation.java
@@ -68,6 +68,10 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NPostfixIncOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NPostfixIncOperation.java
index bcdfd51..25509fe 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NPostfixIncOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NPostfixIncOperation.java
@@ -68,6 +68,10 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NPrefixBitNotOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NPrefixBitNotOperation.java
index 7d3c334..02c0770 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NPrefixBitNotOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NPrefixBitNotOperation.java
@@ -68,6 +68,10 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NPrefixDecOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NPrefixDecOperation.java
index 832028d..6b1ab6d 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NPrefixDecOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NPrefixDecOperation.java
@@ -68,6 +68,10 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NPrefixIncOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NPrefixIncOperation.java
index 62703e0..29b030b 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NPrefixIncOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NPrefixIncOperation.java
@@ -68,6 +68,10 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NPrefixNegOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NPrefixNegOperation.java
index e79a7c3..be1f706 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NPrefixNegOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NPrefixNegOperation.java
@@ -68,6 +68,10 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NPrefixNotOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NPrefixNotOperation.java
index 04dc90d..c6fb7e9 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NPrefixNotOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NPrefixNotOperation.java
@@ -68,6 +68,10 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NReinterpretCastOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NReinterpretCastOperation.java
index 488bf0b..3a8ea08 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NReinterpretCastOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NReinterpretCastOperation.java
@@ -81,6 +81,11 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipId();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NReturnStatement.java b/jack/src/com/android/jack/jayce/v0004/nodes/NReturnStatement.java
index 1336e06..d94630a 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NReturnStatement.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NReturnStatement.java
@@ -79,6 +79,10 @@
     expr = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NShlOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NShlOperation.java
index c0d15d6..71be6ee 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NShlOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NShlOperation.java
@@ -75,6 +75,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NShortLiteral.java b/jack/src/com/android/jack/jayce/v0004/nodes/NShortLiteral.java
index b68e477..e7b93f5 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NShortLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NShortLiteral.java
@@ -63,6 +63,10 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipShort();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NShrOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NShrOperation.java
index 9c7786e..1ea6327 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NShrOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NShrOperation.java
@@ -75,6 +75,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NShruOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NShruOperation.java
index e52f0cb..efdc95e 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NShruOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NShruOperation.java
@@ -75,6 +75,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NSimpleName.java b/jack/src/com/android/jack/jayce/v0004/nodes/NSimpleName.java
index 011d736..12a40cb 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NSimpleName.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NSimpleName.java
@@ -63,6 +63,10 @@
     simpleName = in.readString();
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipString();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NStringLiteral.java b/jack/src/com/android/jack/jayce/v0004/nodes/NStringLiteral.java
index 83cb03d..ab6c513 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NStringLiteral.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NStringLiteral.java
@@ -67,6 +67,10 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipString();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NSubOperation.java b/jack/src/com/android/jack/jayce/v0004/nodes/NSubOperation.java
index 82cf998..716e043 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NSubOperation.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NSubOperation.java
@@ -75,6 +75,11 @@
     rhs = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NSwitchStatement.java b/jack/src/com/android/jack/jayce/v0004/nodes/NSwitchStatement.java
index bda2846..4e35d0e 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NSwitchStatement.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NSwitchStatement.java
@@ -108,6 +108,12 @@
     body = in.readNode(NBlock.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipIds();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NSynchronizedBlock.java b/jack/src/com/android/jack/jayce/v0004/nodes/NSynchronizedBlock.java
index 09ca751..24f2be5 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NSynchronizedBlock.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NSynchronizedBlock.java
@@ -92,6 +92,11 @@
     synchronizedBlock = in.readNode(NBlock.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.readNode(NExpression.class);
+    in.readNode(NBlock.class);
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NThisRef.java b/jack/src/com/android/jack/jayce/v0004/nodes/NThisRef.java
index faa5439..d41ede5 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NThisRef.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NThisRef.java
@@ -68,6 +68,10 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipId();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NThisRefTypeInfo.java b/jack/src/com/android/jack/jayce/v0004/nodes/NThisRefTypeInfo.java
index e35325e..9739baa 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NThisRefTypeInfo.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NThisRefTypeInfo.java
@@ -65,6 +65,10 @@
     genericSignature = in.readString();
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipString();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NThrowStatement.java b/jack/src/com/android/jack/jayce/v0004/nodes/NThrowStatement.java
index f28846f..f077a9f 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NThrowStatement.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NThrowStatement.java
@@ -80,6 +80,10 @@
     expr = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NThrownExceptionMarker.java b/jack/src/com/android/jack/jayce/v0004/nodes/NThrownExceptionMarker.java
index e6e26ad..6abc1a8 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NThrownExceptionMarker.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NThrownExceptionMarker.java
@@ -70,6 +70,10 @@
     thrownExceptions = in.readIds();
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipIds();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NTryStatement.java b/jack/src/com/android/jack/jayce/v0004/nodes/NTryStatement.java
index e86f0c9..3434822 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NTryStatement.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NTryStatement.java
@@ -109,6 +109,13 @@
 
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNodes();
+    in.skipNode();
+    in.skipNodes();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NUnlock.java b/jack/src/com/android/jack/jayce/v0004/nodes/NUnlock.java
index 335b958..cfbd394 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NUnlock.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NUnlock.java
@@ -80,6 +80,10 @@
     lockExpr = in.readNode(NExpression.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/jayce/v0004/nodes/NWhileStatement.java b/jack/src/com/android/jack/jayce/v0004/nodes/NWhileStatement.java
index 9503353..230c976 100644
--- a/jack/src/com/android/jack/jayce/v0004/nodes/NWhileStatement.java
+++ b/jack/src/com/android/jack/jayce/v0004/nodes/NWhileStatement.java
@@ -87,6 +87,11 @@
     body = in.readNode(NStatement.class);
   }
 
+  public static void skipContent(@Nonnull JayceInternalReaderImpl in) throws IOException {
+    in.skipNode();
+    in.skipNode();
+  }
+
   @Override
   @Nonnull
   public Token getToken() {
diff --git a/jack/src/com/android/jack/library/v0001/InputJackLibraryImpl.java b/jack/src/com/android/jack/library/v0001/InputJackLibraryImpl.java
index 9caec39..84f1c18 100644
--- a/jack/src/com/android/jack/library/v0001/InputJackLibraryImpl.java
+++ b/jack/src/com/android/jack/library/v0001/InputJackLibraryImpl.java
@@ -32,6 +32,7 @@
 import com.android.sched.util.file.CannotCloseException;
 import com.android.sched.util.file.CannotCreateFileException;
 import com.android.sched.util.file.CannotDeleteFileException;
+import com.android.sched.util.file.FileOrDirectory.Existence;
 import com.android.sched.util.file.NoSuchFileException;
 import com.android.sched.util.file.NotDirectoryException;
 import com.android.sched.util.file.NotFileOrDirectoryException;
@@ -44,6 +45,7 @@
 import com.android.sched.vfs.PrefixedFS;
 import com.android.sched.vfs.VFS;
 import com.android.sched.vfs.VPath;
+import com.android.sched.vfs.WrongVFSTypeException;
 
 import java.util.ArrayList;
 import java.util.EnumMap;
@@ -148,20 +150,23 @@
     } else {
       VFS prefixedInputVFS = null;
       try {
-        prefixedInputVFS = new PrefixedFS(vfs, getSectionPath(fileType));
+        prefixedInputVFS = new PrefixedFS(vfs, getSectionPath(fileType), Existence.MUST_EXIST);
+      } catch (WrongVFSTypeException e) {
+        // If library is well formed this exception cannot be triggered
+        throw new AssertionError(e);
       } catch (CannotCreateFileException e) {
-        // If library is well formed this exception can not be triggered
+        // If library is well formed this exception cannot be triggered
         throw new AssertionError(e);
       } catch (NotDirectoryException e) {
-        // If library is well formed this exception can not be triggered
+        // If library is well formed this exception cannot be triggered
         throw new AssertionError(e);
       }
       if (fileType == FileType.PREBUILT) {
         try {
           currentSectionVFS = new GenericInputVFS(new MessageDigestFS(prefixedInputVFS,
               ThreadConfig.get(JackLibraryFactory.MESSAGE_DIGEST_ALGO)));
-        } catch (BadVFSFormatException e) {
-          // If library is well formed this exception can not be triggered
+        } catch (BadVFSFormatException | WrongVFSTypeException e) {
+          // If library is well formed this exception cannot be triggered
           throw new AssertionError(e);
         }
       } else {
diff --git a/jack/src/com/android/jack/library/v0002/InputJackLibraryImpl.java b/jack/src/com/android/jack/library/v0002/InputJackLibraryImpl.java
index d77194b..52d231f 100644
--- a/jack/src/com/android/jack/library/v0002/InputJackLibraryImpl.java
+++ b/jack/src/com/android/jack/library/v0002/InputJackLibraryImpl.java
@@ -37,6 +37,7 @@
 import com.android.sched.util.file.CannotCloseException;
 import com.android.sched.util.file.CannotCreateFileException;
 import com.android.sched.util.file.CannotDeleteFileException;
+import com.android.sched.util.file.FileOrDirectory.Existence;
 import com.android.sched.util.file.NoSuchFileException;
 import com.android.sched.util.file.NotDirectoryException;
 import com.android.sched.util.file.NotFileOrDirectoryException;
@@ -49,6 +50,7 @@
 import com.android.sched.vfs.PrefixedFS;
 import com.android.sched.vfs.VFS;
 import com.android.sched.vfs.VPath;
+import com.android.sched.vfs.WrongVFSTypeException;
 
 import java.util.ArrayList;
 import java.util.EnumMap;
@@ -155,20 +157,23 @@
     } else {
       VFS prefixedInputVFS = null;
       try {
-        prefixedInputVFS = new PrefixedFS(vfs, getSectionPath(fileType));
+        prefixedInputVFS = new PrefixedFS(vfs, getSectionPath(fileType), Existence.MUST_EXIST);
+      } catch (WrongVFSTypeException e) {
+        // If library is well formed this exception cannot be triggered
+        throw new AssertionError(e);
       } catch (CannotCreateFileException e) {
-        // If library is well formed this exception can not be triggered
+        // If library is well formed this exception cannot be triggered
         throw new AssertionError(e);
       } catch (NotDirectoryException e) {
-        // If library is well formed this exception can not be triggered
+        // If library is well formed this exception cannot be triggered
         throw new AssertionError(e);
       }
       if (fileType == FileType.PREBUILT) {
         try {
           currentSectionVFS = new GenericInputVFS(new MessageDigestFS(prefixedInputVFS,
               ThreadConfig.get(JackLibraryFactory.MESSAGE_DIGEST_ALGO)));
-        } catch (BadVFSFormatException e) {
-          // If library is well formed this exception can not be triggered
+        } catch (BadVFSFormatException | WrongVFSTypeException e) {
+          // If library is well formed this exception cannot be triggered
           throw new AssertionError(e);
         }
       } else {
diff --git a/jack/src/com/android/jack/library/v0003/InputJackLibraryImpl.java b/jack/src/com/android/jack/library/v0003/InputJackLibraryImpl.java
index f0413c7..be416cc 100644
--- a/jack/src/com/android/jack/library/v0003/InputJackLibraryImpl.java
+++ b/jack/src/com/android/jack/library/v0003/InputJackLibraryImpl.java
@@ -37,6 +37,7 @@
 import com.android.sched.util.file.CannotCloseException;
 import com.android.sched.util.file.CannotCreateFileException;
 import com.android.sched.util.file.CannotDeleteFileException;
+import com.android.sched.util.file.FileOrDirectory.Existence;
 import com.android.sched.util.file.NoSuchFileException;
 import com.android.sched.util.file.NotDirectoryException;
 import com.android.sched.util.file.NotFileOrDirectoryException;
@@ -50,6 +51,7 @@
 import com.android.sched.vfs.PrefixedFS;
 import com.android.sched.vfs.VFS;
 import com.android.sched.vfs.VPath;
+import com.android.sched.vfs.WrongVFSTypeException;
 
 import java.util.ArrayList;
 import java.util.EnumMap;
@@ -172,12 +174,15 @@
     } else {
       VFS inputVFS = null;
       try {
-        inputVFS = new PrefixedFS(vfs, getSectionPath(fileType));
+        inputVFS = new PrefixedFS(vfs, getSectionPath(fileType), Existence.MUST_EXIST);
+      } catch (WrongVFSTypeException e) {
+        // If library is well formed this exception cannot be triggered
+        throw new AssertionError(e);
       } catch (CannotCreateFileException e) {
-        // If library is well formed this exception can not be triggered
+        // If library is well formed this exception cannot be triggered
         throw new AssertionError(e);
       } catch (NotDirectoryException e) {
-        // If library is well formed this exception can not be triggered
+        // If library is well formed this exception cannot be triggered
         throw new AssertionError(e);
       }
 
@@ -185,8 +190,8 @@
         try {
           inputVFS = new MessageDigestFS(inputVFS,
                   ThreadConfig.get(JackLibraryFactory.MESSAGE_DIGEST_ALGO));
-        } catch (BadVFSFormatException e) {
-          // If library is well formed this exception can not be triggered
+        } catch (BadVFSFormatException | WrongVFSTypeException e) {
+          // If library is well formed this exception cannot be triggered
           throw new AssertionError(e);
         }
       }
diff --git a/jack/src/com/android/jack/library/v0003/OutputJackLibraryImpl.java b/jack/src/com/android/jack/library/v0003/OutputJackLibraryImpl.java
index e4ea796..4bc401c 100644
--- a/jack/src/com/android/jack/library/v0003/OutputJackLibraryImpl.java
+++ b/jack/src/com/android/jack/library/v0003/OutputJackLibraryImpl.java
@@ -32,6 +32,7 @@
 import com.android.sched.util.file.CannotCloseException;
 import com.android.sched.util.file.CannotCreateFileException;
 import com.android.sched.util.file.CannotDeleteFileException;
+import com.android.sched.util.file.FileOrDirectory.Existence;
 import com.android.sched.util.file.NoSuchFileException;
 import com.android.sched.util.file.NotDirectoryException;
 import com.android.sched.util.file.NotFileOrDirectoryException;
@@ -51,6 +52,7 @@
 import com.android.sched.vfs.PrefixedFS;
 import com.android.sched.vfs.VFS;
 import com.android.sched.vfs.VPath;
+import com.android.sched.vfs.WrongVFSTypeException;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -143,18 +145,26 @@
       VPath prefixPath = InputJackLibraryImpl.getSectionPath(fileType);
       VFS outputVFS = null;
       try {
-        outputVFS = new PrefixedFS(vfs, prefixPath);
+        outputVFS = new PrefixedFS(vfs, prefixPath, Existence.MAY_EXIST);
 
         if (generateJacklibDigest && fileType == FileType.PREBUILT) {
 
-          outputVFS = new MessageDigestFS(outputVFS,
-              ThreadConfig.get(JackLibraryFactory.MESSAGE_DIGEST_ALGO));
+          try {
+            outputVFS = new MessageDigestFS(outputVFS,
+                ThreadConfig.get(JackLibraryFactory.MESSAGE_DIGEST_ALGO));
+          } catch (WrongVFSTypeException e) {
+            // we want the digest to be there;
+            throw new AssertionError(e);
+          }
         }
+      } catch (WrongVFSTypeException e) {
+        // prefix may not exist so this cannot happen
+        throw new AssertionError(e);
       } catch (BadVFSFormatException e) {
-        // if library is well formed and digest exists this exception can not be triggered
+        // if library is well formed this exception cannot be triggered
         throw new AssertionError(e);
       } catch (NotDirectoryException e) {
-        // if library is well formed this exception can not be triggered
+        // if library is well formed this exception cannot be triggered
         throw new AssertionError(e);
       }
 
diff --git a/jack/src/com/android/jack/optimizations/ConstantRefiner.java b/jack/src/com/android/jack/optimizations/ConstantRefiner.java
index e934085..4d59c95 100644
--- a/jack/src/com/android/jack/optimizations/ConstantRefiner.java
+++ b/jack/src/com/android/jack/optimizations/ConstantRefiner.java
@@ -157,6 +157,7 @@
 
           if (varRef.getParent() instanceof JCastOperation) {
             JCastOperation cast = (JCastOperation) varRef.getParent();
+            assert cast != null;
             if (cast.getType().isSameType(dm.getValue().getType())) {
               // Remove useless cast directly since it trigger new opportunities.
               tr.append(new Replace(cast, cloneExpr.cloneExpression(dm.getValue())));
diff --git a/jack/src/com/android/jack/optimizations/UnusedDefinitionRemover.java b/jack/src/com/android/jack/optimizations/UnusedDefinitionRemover.java
index 08ca778..723de0b 100644
--- a/jack/src/com/android/jack/optimizations/UnusedDefinitionRemover.java
+++ b/jack/src/com/android/jack/optimizations/UnusedDefinitionRemover.java
@@ -110,7 +110,9 @@
 
       tracer.getStatistic(UNUSED_DEFINITION_REMOVED).incValue();
 
-      tr.append(new Remove(binary.getParent()));
+      final JNode binaryParent = binary.getParent();
+      assert binaryParent != null;
+      tr.append(new Remove(binaryParent));
 
       if (binary.getRhs() instanceof JVariableRef) {
         UseDefsMarker udm = ((JVariableRef) binary.getRhs()).getMarker(UseDefsMarker.class);
diff --git a/jack/src/com/android/jack/optimizations/common/OptimizerUtils.java b/jack/src/com/android/jack/optimizations/common/OptimizerUtils.java
index 36e796f..65a8b46 100644
--- a/jack/src/com/android/jack/optimizations/common/OptimizerUtils.java
+++ b/jack/src/com/android/jack/optimizations/common/OptimizerUtils.java
@@ -44,6 +44,7 @@
 
 import java.util.List;
 import java.util.Set;
+
 import javax.annotation.CheckForNull;
 import javax.annotation.Nonnull;
 
@@ -65,7 +66,9 @@
   @Nonnull
   public static JExpression getAssignedValue(@Nonnull JExpression expr) {
     assert isAssigned(expr);
-    return ((JAsgOperation) expr.getParent()).getRhs();
+    JAsgOperation parent = (JAsgOperation) expr.getParent();
+    assert parent != null;
+    return parent.getRhs();
   }
 
   /**
diff --git a/jack/src/com/android/jack/optimizations/tailrecursion/TailRecursionOptimizer.java b/jack/src/com/android/jack/optimizations/tailrecursion/TailRecursionOptimizer.java
index 57d2e78..512205a 100644
--- a/jack/src/com/android/jack/optimizations/tailrecursion/TailRecursionOptimizer.java
+++ b/jack/src/com/android/jack/optimizations/tailrecursion/TailRecursionOptimizer.java
@@ -213,18 +213,18 @@
             argAssignments.add(tempToArgStmt);
           }
 
+          final JStatementList returnStmtParent = (JStatementList) returnStatement.getParent();
+          assert returnStmtParent != null;
           for (JStatement asgStmt : tmpAssignments) {
-            tr.append(
-                new AppendStatement((JStatementList) returnStatement.getParent(), asgStmt));
+            tr.append(new AppendStatement(returnStmtParent, asgStmt));
           }
           for (JStatement asgStmt : argAssignments) {
-            tr.append(
-                new AppendStatement((JStatementList) returnStatement.getParent(), asgStmt));
+            tr.append(new AppendStatement(returnStmtParent, asgStmt));
           }
 
           JGoto tailCall = new JGoto(returnStatement.getSourceInfo(), labeledFirstStatement);
           tailCall.setCatchBlocks(returnStatement.getJCatchBlocks());
-          tr.append(new AppendStatement((JStatementList) returnStatement.getParent(), tailCall));
+          tr.append(new AppendStatement(returnStmtParent, tailCall));
           tr.append(new Remove(returnStatement));
         }
       }
diff --git a/jack/src/com/android/jack/optimizations/wofr/WofrRemoveFieldWrites.java b/jack/src/com/android/jack/optimizations/wofr/WofrRemoveFieldWrites.java
index 186ef94..be878d8 100644
--- a/jack/src/com/android/jack/optimizations/wofr/WofrRemoveFieldWrites.java
+++ b/jack/src/com/android/jack/optimizations/wofr/WofrRemoveFieldWrites.java
@@ -28,6 +28,7 @@
 import com.android.jack.ir.ast.JLocal;
 import com.android.jack.ir.ast.JMethod;
 import com.android.jack.ir.ast.JMethodCall;
+import com.android.jack.ir.ast.JNode;
 import com.android.jack.ir.ast.JPrimitiveType;
 import com.android.jack.ir.ast.JStatement;
 import com.android.jack.ir.ast.JThisRef;
@@ -233,7 +234,9 @@
 
         JExpressionStatement stmt =
             new JExpressionStatement(asg.getSourceInfo(), receiver);
-        request.append(new AppendBefore(asg.getParent(), stmt));
+        final JNode parent = asg.getParent();
+        assert parent != null;
+        request.append(new AppendBefore(parent, stmt));
         return local;
       }
     }
diff --git a/jack/src/com/android/jack/shrob/obfuscation/MappingApplier.java b/jack/src/com/android/jack/shrob/obfuscation/MappingApplier.java
index 52a4073..db255bc 100644
--- a/jack/src/com/android/jack/shrob/obfuscation/MappingApplier.java
+++ b/jack/src/com/android/jack/shrob/obfuscation/MappingApplier.java
@@ -39,6 +39,7 @@
 import com.android.jack.reporting.Reporter.Severity;
 import com.android.jack.shrob.obfuscation.key.FieldKey;
 import com.android.jack.shrob.obfuscation.key.MethodKey;
+import com.android.jack.shrob.obfuscation.key.TypeKey;
 import com.android.jack.shrob.proguard.GrammarActions;
 import com.android.jack.shrob.shrink.MappingCollisionException;
 import com.android.jack.shrob.shrink.MappingCollisionPolicy;
@@ -131,10 +132,34 @@
     throw new JackIOException(mappingFile.getPath() + ":" + lineNumber + ":" + message);
   }
 
+  private boolean isExistingTypeName(@Nonnull String newSimpleName,
+      @Nonnull JPackage enclosingPackage) {
+    try {
+      try {
+        JClassOrInterface newType = enclosingPackage.getType(newSimpleName);
+        if (!Renamer.mustBeRenamed((MarkerManager) newType)) {
+          // A type was found that must not be renamed
+          return true;
+        }
+      } catch (JTypeLookupException e) {
+        // Ignored
+      }
+      NewTypeKeyMarker marker = enclosingPackage.getMarker(NewTypeKeyMarker.class);
+      if (marker != null) {
+        if (marker.getNewKeys().contains(new TypeKey(newSimpleName))) {
+          return true;
+        }
+      }
+    } catch (JLookupException exception) {
+      // No type was found
+    }
+    return false;
+  }
+
   @CheckForNull
   private JDefinedClassOrInterface createMappingForType(@Nonnull String oldName,
       @Nonnull String newName, @Nonnull JSession session, @Nonnull File mappingFile,
-      int lineNumber) {
+      int lineNumber) throws MappingCollisionException {
     JClassOrInterface type = null;
     JNodeLookup lookup = session.getLookup();
     try {
@@ -145,7 +170,6 @@
           new Object[] {mappingFile.getPath(), Integer.valueOf(lineNumber), oldName});
     }
     if (type instanceof JDefinedClassOrInterface) {
-      JDefinedClassOrInterface clOrI = (JDefinedClassOrInterface) type;
       int indexOfNewSimpleName = newName.lastIndexOf('.');
       String newSimpleName, newPackageName;
       if (indexOfNewSimpleName == -1) {
@@ -155,18 +179,36 @@
         newPackageName = newName.substring(0, indexOfNewSimpleName).replace('.', '/');
         newSimpleName = newName.substring(indexOfNewSimpleName + 1, newName.length());
       }
-      clOrI.addMarker(new OriginalPackageMarker(clOrI.getEnclosingPackage()));
       JPackage newEnclosingPackage = lookup.getOrCreatePackage(newPackageName);
-      request.append(new ChangeEnclosingPackage(clOrI, newEnclosingPackage));
-      while (newEnclosingPackage != null) {
-        if (!newEnclosingPackage.containsMarker(KeepNameMarker.class)) {
-          newEnclosingPackage.addMarker(KeepNameMarker.INSTANCE);
-        }
-        newEnclosingPackage = newEnclosingPackage.getEnclosingPackage();
-      }
 
-      rename(clOrI, newSimpleName);
-      return clOrI;
+      if (!oldName.equals(newName)
+          && isExistingTypeName(newSimpleName, newEnclosingPackage)) {
+        throw new MappingCollisionException(
+            new ColumnAndLineLocation(new FileLocation(mappingFile), lineNumber), type, newName);
+      } else {
+        JDefinedClassOrInterface clOrI = (JDefinedClassOrInterface) type;
+
+        clOrI.addMarker(new OriginalPackageMarker(clOrI.getEnclosingPackage()));
+
+        NewTypeKeyMarker marker = newEnclosingPackage.getMarker(NewTypeKeyMarker.class);
+        if (marker == null) {
+          marker = new NewTypeKeyMarker();
+          newEnclosingPackage.addMarker(marker);
+        }
+        assert marker != null;
+        marker.add(new TypeKey(newSimpleName));
+
+        request.append(new ChangeEnclosingPackage(clOrI, newEnclosingPackage));
+        while (newEnclosingPackage != null) {
+          if (!newEnclosingPackage.containsMarker(KeepNameMarker.class)) {
+            newEnclosingPackage.addMarker(KeepNameMarker.INSTANCE);
+          }
+          newEnclosingPackage = newEnclosingPackage.getEnclosingPackage();
+        }
+
+        rename(clOrI, newSimpleName);
+        return clOrI;
+      }
     }
     return null;
   }
@@ -252,10 +294,18 @@
       return createMappingForType(
           qualifiedOldClassName, newClassName, session, mappingFile, lineNumber);
     } catch (ArrayIndexOutOfBoundsException e) {
-      throwException(
-          mappingFile, lineNumber, "The mapping file is badly formatted (class mapping expected)");
-      return null;
+      throwException(mappingFile, lineNumber,
+          "The mapping file is badly formatted (class mapping expected)");
+    } catch (MappingCollisionException e) {
+      if (collisionPolicy.equals(MappingCollisionPolicy.FAIL)) {
+        MappingContextException mappingReportableExn = new MappingContextException(e);
+        Jack.getSession().getReporter().report(Severity.FATAL, mappingReportableExn);
+        throw new JackAbortException(mappingReportableExn);
+      } else {
+        Jack.getSession().getReporter().report(Severity.NON_FATAL, new MappingContextInfo(e));
+      }
     }
+    return null;
   }
 
   @CheckForNull
diff --git a/jack/src/com/android/jack/shrob/obfuscation/MappingPrinter.java b/jack/src/com/android/jack/shrob/obfuscation/MappingPrinter.java
index 5853d9f..2285a50 100644
--- a/jack/src/com/android/jack/shrob/obfuscation/MappingPrinter.java
+++ b/jack/src/com/android/jack/shrob/obfuscation/MappingPrinter.java
@@ -16,26 +16,17 @@
 
 package com.android.jack.shrob.obfuscation;
 
-import com.google.common.base.Strings;
-
 import com.android.jack.config.id.Arzon;
-import com.android.jack.ir.ast.HasName;
-import com.android.jack.ir.ast.JArrayType;
-import com.android.jack.ir.ast.JClassOrInterface;
 import com.android.jack.ir.ast.JDefinedClassOrInterface;
 import com.android.jack.ir.ast.JField;
 import com.android.jack.ir.ast.JMethod;
-import com.android.jack.ir.ast.JNode;
-import com.android.jack.ir.ast.JPackage;
 import com.android.jack.ir.ast.JParameter;
 import com.android.jack.ir.ast.JSession;
-import com.android.jack.ir.ast.JType;
 import com.android.jack.ir.ast.JVisitor;
 import com.android.jack.reporting.ReportableIOException;
 import com.android.jack.reporting.Reporter.Severity;
 import com.android.jack.shrob.proguard.GrammarActions;
 import com.android.sched.item.Description;
-import com.android.sched.marker.LocalMarkerManager;
 import com.android.sched.schedulable.Constraint;
 import com.android.sched.schedulable.Optional;
 import com.android.sched.schedulable.Produce;
@@ -84,8 +75,6 @@
 
   private static final String SEPARATOR = " -> ";
 
-  private static final char PACKAGE_SEPARATOR = '.';
-
   private static class Visitor extends JVisitor {
     @Nonnull
     private final PrintWriter writer;
@@ -94,67 +83,11 @@
       this.writer = writer;
     }
 
-    private void appendOriginalQualifiedName(
-        @Nonnull StringBuilder nameBuilder, @Nonnull JPackage pack) {
-      JPackage enclosingPackage;
-      OriginalPackageMarker marker = pack.getMarker(OriginalPackageMarker.class);
-      if (marker != null) {
-        enclosingPackage = marker.getOriginalEnclosingPackage();
-      } else {
-        enclosingPackage = pack.getEnclosingPackage();
-      }
-      if (enclosingPackage != null && !enclosingPackage.isTopLevelPackage()) {
-        appendOriginalQualifiedName(nameBuilder, enclosingPackage);
-        nameBuilder.append(PACKAGE_SEPARATOR);
-      }
-      appendOriginalName(nameBuilder, pack);
-    }
-
-    private void appendOriginalQualifiedName(
-        @Nonnull StringBuilder nameBuilder, @Nonnull JClassOrInterface type) {
-      JPackage enclosingPackage;
-      OriginalPackageMarker marker = ((JNode) type).getMarker(OriginalPackageMarker.class);
-      if (marker != null) {
-        enclosingPackage = marker.getOriginalEnclosingPackage();
-      } else {
-        enclosingPackage = type.getEnclosingPackage();
-      }
-      assert enclosingPackage != null;
-      appendOriginalQualifiedName(nameBuilder, enclosingPackage);
-      if (!enclosingPackage.isTopLevelPackage()) {
-        nameBuilder.append(PACKAGE_SEPARATOR);
-      }
-      appendOriginalName(nameBuilder, type);
-    }
-
-    private void appendOriginalName(@Nonnull StringBuilder nameBuilder, @Nonnull HasName node) {
-      OriginalNameMarker marker = ((LocalMarkerManager) node).getMarker(OriginalNameMarker.class);
-      if (marker != null) {
-        nameBuilder.append(marker.getOriginalName());
-      } else {
-        nameBuilder.append(node.getName());
-      }
-    }
-
-    private void appendOriginalQualifiedName(
-        @Nonnull StringBuilder nameBuilder, @Nonnull HasName node) {
-      if (node instanceof JArrayType) {
-        JArrayType arrayType = (JArrayType) node;
-        appendOriginalQualifiedName(nameBuilder, arrayType.getLeafType());
-        nameBuilder.append(Strings.repeat("[]", arrayType.getDims()));
-      } else if (node instanceof JDefinedClassOrInterface) {
-        appendOriginalQualifiedName(nameBuilder, (JClassOrInterface) node);
-      } else if (node instanceof JType) {
-        nameBuilder.append(node.getName());
-      } else {
-        appendOriginalName(nameBuilder, node);
-      }
-    }
 
     @Override
     public boolean visit(@Nonnull JDefinedClassOrInterface type) {
       StringBuilder info = new StringBuilder();
-      appendOriginalQualifiedName(info, type);
+      OriginalNameTools.appendOriginalQualifiedName(info, type);
       info.append(SEPARATOR);
       info.append(GrammarActions.getSourceFormatter().getName(type));
       info.append(':');
@@ -166,9 +99,9 @@
     @Override
     public boolean visit(@Nonnull JField field) {
       StringBuilder info = new StringBuilder().append("    ");
-      appendOriginalQualifiedName(info, field.getType());
+      OriginalNameTools.appendOriginalQualifiedName(info, field.getType());
       info.append(' ');
-      appendOriginalName(info, field.getId());
+      OriginalNameTools.appendOriginalName(info, field.getId());
       info.append(SEPARATOR);
       info.append(field.getName());
       writer.println(info);
@@ -179,14 +112,14 @@
     @Override
     public boolean visit(@Nonnull JMethod method) {
       StringBuilder info = new StringBuilder().append("    ");
-      appendOriginalQualifiedName(info, method.getType());
+      OriginalNameTools.appendOriginalQualifiedName(info, method.getType());
       info.append(' ');
-      appendOriginalName(info, method.getMethodIdWide());
+      OriginalNameTools.appendOriginalName(info, method.getMethodIdWide());
       info.append('(');
       Iterator<JParameter> iterator = method.getParams().iterator();
       while (iterator.hasNext()) {
         JParameter param = iterator.next();
-        appendOriginalQualifiedName(info, param.getType());
+        OriginalNameTools.appendOriginalQualifiedName(info, param.getType());
         if (iterator.hasNext()) {
           info.append(',');
         }
diff --git a/jack/src/com/android/jack/shrob/obfuscation/NewTypeKeyMarker.java b/jack/src/com/android/jack/shrob/obfuscation/NewTypeKeyMarker.java
new file mode 100644
index 0000000..10161ea
--- /dev/null
+++ b/jack/src/com/android/jack/shrob/obfuscation/NewTypeKeyMarker.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.shrob.obfuscation;
+
+import com.android.jack.ir.ast.JPackage;
+import com.android.jack.shrob.obfuscation.key.TypeKey;
+import com.android.sched.item.Description;
+import com.android.sched.marker.ValidOn;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.annotation.Nonnull;
+
+/**
+ * {@code Marker} that represents the new names of types in a package.
+ */
+@Description("Represents the new names of types in a package.")
+@ValidOn(JPackage.class)
+public class NewTypeKeyMarker extends NewKeyMarker {
+  @Nonnull
+  private final Set<TypeKey> newTypeKeys;
+
+  public NewTypeKeyMarker() {
+    newTypeKeys = new HashSet<TypeKey>();
+  }
+
+  public NewTypeKeyMarker(@Nonnull Set<TypeKey> existingKeys) {
+    this.newTypeKeys = existingKeys;
+  }
+
+  public void add(@Nonnull TypeKey key) {
+    newTypeKeys.add(key);
+  }
+
+  @Override
+  @Nonnull
+  public Collection<TypeKey> getNewKeys() {
+    return newTypeKeys;
+  }
+
+}
\ No newline at end of file
diff --git a/jack/src/com/android/jack/shrob/obfuscation/OriginalNameTools.java b/jack/src/com/android/jack/shrob/obfuscation/OriginalNameTools.java
new file mode 100644
index 0000000..5bf282d
--- /dev/null
+++ b/jack/src/com/android/jack/shrob/obfuscation/OriginalNameTools.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.shrob.obfuscation;
+
+import com.google.common.base.Strings;
+
+import com.android.jack.ir.ast.HasName;
+import com.android.jack.ir.ast.JArrayType;
+import com.android.jack.ir.ast.JClassOrInterface;
+import com.android.jack.ir.ast.JDefinedClassOrInterface;
+import com.android.jack.ir.ast.JNode;
+import com.android.jack.ir.ast.JPackage;
+import com.android.jack.ir.ast.JType;
+import com.android.sched.marker.LocalMarkerManager;
+
+import javax.annotation.Nonnull;
+
+/**
+ * A class regrouping all the tools used to retrieve original names.
+ */
+public class OriginalNameTools {
+
+  private static final char PACKAGE_SEPARATOR = '.';
+
+  public static void appendOriginalQualifiedName(
+      @Nonnull StringBuilder nameBuilder, @Nonnull JPackage pack) {
+    JPackage enclosingPackage;
+    OriginalPackageMarker marker = pack.getMarker(OriginalPackageMarker.class);
+    if (marker != null) {
+      enclosingPackage = marker.getOriginalEnclosingPackage();
+    } else {
+      enclosingPackage = pack.getEnclosingPackage();
+    }
+    if (enclosingPackage != null && !enclosingPackage.isTopLevelPackage()) {
+      appendOriginalQualifiedName(nameBuilder, enclosingPackage);
+      nameBuilder.append(PACKAGE_SEPARATOR);
+    }
+    appendOriginalName(nameBuilder, pack);
+  }
+
+  public static void appendOriginalQualifiedName(
+      @Nonnull StringBuilder nameBuilder, @Nonnull JClassOrInterface type) {
+    JPackage enclosingPackage;
+    OriginalPackageMarker marker = ((JNode) type).getMarker(OriginalPackageMarker.class);
+    if (marker != null) {
+      enclosingPackage = marker.getOriginalEnclosingPackage();
+    } else {
+      enclosingPackage = type.getEnclosingPackage();
+    }
+    assert enclosingPackage != null;
+    appendOriginalQualifiedName(nameBuilder, enclosingPackage);
+    if (!enclosingPackage.isTopLevelPackage()) {
+      nameBuilder.append(PACKAGE_SEPARATOR);
+    }
+    appendOriginalName(nameBuilder, type);
+  }
+
+  public static void appendOriginalName(@Nonnull StringBuilder nameBuilder, @Nonnull HasName node) {
+    OriginalNameMarker marker = ((LocalMarkerManager) node).getMarker(OriginalNameMarker.class);
+    if (marker != null) {
+      nameBuilder.append(marker.getOriginalName());
+    } else {
+      nameBuilder.append(node.getName());
+    }
+  }
+
+  public static void appendOriginalQualifiedName(
+      @Nonnull StringBuilder nameBuilder, @Nonnull HasName node) {
+    if (node instanceof JArrayType) {
+      JArrayType arrayType = (JArrayType) node;
+      appendOriginalQualifiedName(nameBuilder, arrayType.getLeafType());
+      nameBuilder.append(Strings.repeat("[]", arrayType.getDims()));
+    } else if (node instanceof JDefinedClassOrInterface) {
+      appendOriginalQualifiedName(nameBuilder, (JClassOrInterface) node);
+    } else if (node instanceof JType) {
+      nameBuilder.append(node.getName());
+    } else {
+      appendOriginalName(nameBuilder, node);
+    }
+  }
+
+}
+
diff --git a/jack/src/com/android/jack/shrob/obfuscation/Renamer.java b/jack/src/com/android/jack/shrob/obfuscation/Renamer.java
index 0b7d553..346e4a1 100644
--- a/jack/src/com/android/jack/shrob/obfuscation/Renamer.java
+++ b/jack/src/com/android/jack/shrob/obfuscation/Renamer.java
@@ -20,14 +20,17 @@
 import com.android.jack.Jack;
 import com.android.jack.frontend.MethodIdDuplicateRemover.UniqMethodIds;
 import com.android.jack.ir.ast.CanBeRenamed;
+import com.android.jack.ir.ast.HasName;
 import com.android.jack.ir.ast.JClassOrInterface;
 import com.android.jack.ir.ast.JDefinedClassOrInterface;
 import com.android.jack.ir.ast.JField;
 import com.android.jack.ir.ast.JFieldId;
 import com.android.jack.ir.ast.JMethod;
+import com.android.jack.ir.ast.JMethodId;
 import com.android.jack.ir.ast.JMethodIdWide;
 import com.android.jack.ir.ast.JPackage;
 import com.android.jack.ir.ast.JSession;
+import com.android.jack.ir.ast.JType;
 import com.android.jack.ir.ast.JVisitor;
 import com.android.jack.ir.sourceinfo.SourceInfo;
 import com.android.jack.library.DumpInLibrary;
@@ -59,6 +62,7 @@
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -162,6 +166,49 @@
     }
   }
 
+  @Nonnull
+  static String getFieldKey(@Nonnull JFieldId fieldId) {
+    assert !fieldId.containsMarker(OriginalNameMarker.class);
+    StringBuilder sb = new StringBuilder();
+    sb.append(fieldId.getName());
+    sb.append(':');
+    OriginalNameTools.appendOriginalQualifiedName(sb, fieldId.getType());
+    return sb.toString();
+  }
+
+  @Nonnull
+  static String getMethodKey(@Nonnull JMethodIdWide methodId) {
+    assert !methodId.containsMarker(OriginalNameMarker.class);
+    StringBuilder sb = new StringBuilder();
+    sb.append(methodId.getName());
+    sb.append('(');
+    Iterator<JType> iterator = methodId.getParamTypes().iterator();
+    while (iterator.hasNext()) {
+      JType paramType = iterator.next();
+      OriginalNameTools.appendOriginalQualifiedName(sb, paramType);
+      if (iterator.hasNext()) {
+        sb.append(',');
+      }
+    }
+    sb.append(')');
+
+    return sb.toString();
+  }
+
+  @Nonnull
+  static String getKey(@Nonnull HasName namedElement) {
+    if (namedElement instanceof JFieldId) {
+      return getFieldKey((JFieldId) namedElement);
+    } else if (namedElement instanceof JMethodIdWide) {
+      return getMethodKey((JMethodIdWide) namedElement);
+    } else {
+      assert !(namedElement instanceof JMethod
+          || namedElement instanceof JMethodId
+          || namedElement instanceof JField);
+      return namedElement.getName();
+    }
+  }
+
   private static void rename(
       @Nonnull CanBeRenamed node, @Nonnull String newName) {
     if (mustBeRenamed((MarkerManager) node)) {
diff --git a/jack/src/com/android/jack/shrob/obfuscation/annotation/LineNumberRemover.java b/jack/src/com/android/jack/shrob/obfuscation/annotation/LocalVariableAndThisLineNumberRemover.java
similarity index 66%
copy from jack/src/com/android/jack/shrob/obfuscation/annotation/LineNumberRemover.java
copy to jack/src/com/android/jack/shrob/obfuscation/annotation/LocalVariableAndThisLineNumberRemover.java
index acb20ba..fa01e22 100644
--- a/jack/src/com/android/jack/shrob/obfuscation/annotation/LineNumberRemover.java
+++ b/jack/src/com/android/jack/shrob/obfuscation/annotation/LocalVariableAndThisLineNumberRemover.java
@@ -17,8 +17,9 @@
 package com.android.jack.shrob.obfuscation.annotation;
 
 import com.android.jack.Jack;
-import com.android.jack.ir.ast.JDefinedClassOrInterface;
-import com.android.jack.ir.ast.JNode;
+import com.android.jack.ir.ast.JLocal;
+import com.android.jack.ir.ast.JMethod;
+import com.android.jack.ir.ast.JThis;
 import com.android.jack.ir.ast.JVisitor;
 import com.android.jack.ir.sourceinfo.SourceInfo;
 import com.android.jack.ir.sourceinfo.SourceInfoFactory;
@@ -29,11 +30,12 @@
 import javax.annotation.Nonnull;
 
 /**
- * A {@link RunnableSchedulable} that removes line numbers.
+ * A {@link RunnableSchedulable} that removes line numbers for local variables and 'this'.
  */
-@Description("Removes line numbers")
-@Support(RemoveLineNumber.class)
-public class LineNumberRemover implements RunnableSchedulable<JDefinedClassOrInterface> {
+@Description("Removes line numbers for local variable and 'this'")
+@Support(RemoveLocalLineNumber.class)
+public class LocalVariableAndThisLineNumberRemover
+    implements RunnableSchedulable<JMethod> {
 
   private static class Visitor extends JVisitor {
     @Nonnull
@@ -44,19 +46,28 @@
     }
 
     @Override
-    public boolean visit(@Nonnull JNode node) {
+    public boolean visit(@Nonnull JLocal node) {
       SourceInfo info = node.getSourceInfo();
       if (info != SourceInfo.UNKNOWN) {
         node.setSourceInfo(info.getFileSourceInfo());
       }
-      return false;
+      return true;
+    }
+
+    @Override
+    public boolean visit(@Nonnull JThis node) {
+      SourceInfo info = node.getSourceInfo();
+      if (info != SourceInfo.UNKNOWN) {
+        node.setSourceInfo(info.getFileSourceInfo());
+      }
+      return true;
     }
   }
 
   @Override
-  public void run(@Nonnull JDefinedClassOrInterface type) {
+  public void run(@Nonnull JMethod method) {
     Visitor visitor = new Visitor(Jack.getSession().getSourceInfoFactory());
-    visitor.accept(type);
+    visitor.accept(method);
   }
 
 }
diff --git a/jack/src/com/android/jack/shrob/obfuscation/annotation/LocalVariableAndThisNameRemover.java b/jack/src/com/android/jack/shrob/obfuscation/annotation/LocalVariableAndThisNameRemover.java
index d1f3682..28f0a53 100644
--- a/jack/src/com/android/jack/shrob/obfuscation/annotation/LocalVariableAndThisNameRemover.java
+++ b/jack/src/com/android/jack/shrob/obfuscation/annotation/LocalVariableAndThisNameRemover.java
@@ -16,11 +16,14 @@
 
 package com.android.jack.shrob.obfuscation.annotation;
 
+import com.android.jack.debug.DebugVariableInfoMarker;
 import com.android.jack.ir.ast.JLocal;
+import com.android.jack.ir.ast.JLocalRef;
 import com.android.jack.ir.ast.JMethod;
 import com.android.jack.ir.ast.JThis;
 import com.android.jack.ir.ast.JVisitor;
 import com.android.sched.item.Description;
+import com.android.sched.schedulable.Constraint;
 import com.android.sched.schedulable.RunnableSchedulable;
 import com.android.sched.schedulable.Transform;
 
@@ -31,6 +34,7 @@
  */
 @Description("Removes local variables and 'this' names")
 @Transform(modify = {JLocal.class, JThis.class})
+@Constraint(need = DebugVariableInfoMarker.class)
 public class LocalVariableAndThisNameRemover implements RunnableSchedulable<JMethod> {
 
   private static class Visitor extends JVisitor {
@@ -42,6 +46,15 @@
     }
 
     @Override
+    public boolean visit(@Nonnull JLocalRef localRef) {
+      DebugVariableInfoMarker marker = localRef.getMarker(DebugVariableInfoMarker.class);
+      if (marker != null) {
+        marker.setName(null);
+      }
+      return false;
+    }
+
+    @Override
     public boolean visit(@Nonnull JThis node) {
       node.setName(null);
       return false;
diff --git a/jack/src/com/android/jack/shrob/obfuscation/annotation/LineNumberRemover.java b/jack/src/com/android/jack/shrob/obfuscation/annotation/ParameterLineNumberRemover.java
similarity index 73%
rename from jack/src/com/android/jack/shrob/obfuscation/annotation/LineNumberRemover.java
rename to jack/src/com/android/jack/shrob/obfuscation/annotation/ParameterLineNumberRemover.java
index acb20ba..d274403 100644
--- a/jack/src/com/android/jack/shrob/obfuscation/annotation/LineNumberRemover.java
+++ b/jack/src/com/android/jack/shrob/obfuscation/annotation/ParameterLineNumberRemover.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2014 The Android Open Source Project
+ * Copyright (C) 2016 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,8 +17,8 @@
 package com.android.jack.shrob.obfuscation.annotation;
 
 import com.android.jack.Jack;
-import com.android.jack.ir.ast.JDefinedClassOrInterface;
-import com.android.jack.ir.ast.JNode;
+import com.android.jack.ir.ast.JMethod;
+import com.android.jack.ir.ast.JParameter;
 import com.android.jack.ir.ast.JVisitor;
 import com.android.jack.ir.sourceinfo.SourceInfo;
 import com.android.jack.ir.sourceinfo.SourceInfoFactory;
@@ -29,11 +29,11 @@
 import javax.annotation.Nonnull;
 
 /**
- * A {@link RunnableSchedulable} that removes line numbers.
+ * A {@link RunnableSchedulable} that removes line numbers of parameters.
  */
-@Description("Removes line numbers")
-@Support(RemoveLineNumber.class)
-public class LineNumberRemover implements RunnableSchedulable<JDefinedClassOrInterface> {
+@Description("Removes line numbers of parameters")
+@Support(RemoveParameterLineNumber.class)
+public class ParameterLineNumberRemover implements RunnableSchedulable<JMethod> {
 
   private static class Visitor extends JVisitor {
     @Nonnull
@@ -44,19 +44,20 @@
     }
 
     @Override
-    public boolean visit(@Nonnull JNode node) {
+    public boolean visit(@Nonnull JParameter node) {
       SourceInfo info = node.getSourceInfo();
       if (info != SourceInfo.UNKNOWN) {
         node.setSourceInfo(info.getFileSourceInfo());
       }
-      return false;
+      return true;
     }
   }
 
+
   @Override
-  public void run(@Nonnull JDefinedClassOrInterface type) {
+  public void run(@Nonnull JMethod method) {
     Visitor visitor = new Visitor(Jack.getSession().getSourceInfoFactory());
-    visitor.accept(type);
+    visitor.accept(method);
   }
 
 }
diff --git a/jack/src/com/android/jack/shrob/obfuscation/annotation/ParameterNameRemover.java b/jack/src/com/android/jack/shrob/obfuscation/annotation/ParameterNameRemover.java
index f876c36..1623c1c 100644
--- a/jack/src/com/android/jack/shrob/obfuscation/annotation/ParameterNameRemover.java
+++ b/jack/src/com/android/jack/shrob/obfuscation/annotation/ParameterNameRemover.java
@@ -16,8 +16,11 @@
 
 package com.android.jack.shrob.obfuscation.annotation;
 
+import com.android.jack.debug.DebugVariableInfoMarker;
 import com.android.jack.ir.ast.JMethod;
 import com.android.jack.ir.ast.JParameter;
+import com.android.jack.ir.ast.JParameterRef;
+import com.android.jack.ir.ast.JVisitor;
 import com.android.sched.item.Description;
 import com.android.sched.schedulable.Constraint;
 import com.android.sched.schedulable.RunnableSchedulable;
@@ -29,14 +32,30 @@
  * A {@link RunnableSchedulable} that removes parameter names.
  */
 @Description("Removes parameters names")
-@Constraint(need = JParameter.class)
+@Constraint(need = {JParameter.class, DebugVariableInfoMarker.class})
 @Transform(modify = JParameter.class)
 public class ParameterNameRemover implements RunnableSchedulable<JMethod> {
 
+  private static class Visitor extends JVisitor {
+
+    @Override
+    public boolean visit(@Nonnull JParameterRef parameterRef) {
+      DebugVariableInfoMarker marker = parameterRef.getMarker(DebugVariableInfoMarker.class);
+      if (marker != null) {
+        marker.setName(null);
+      }
+      return false;
+    }
+
+    @Override
+    public boolean visit(@Nonnull JParameter node) {
+      node.setName(null);
+      return false;
+    }
+  }
+
   @Override
   public void run(@Nonnull JMethod t) {
-    for (JParameter param : t.getParams()) {
-      param.setName(null);
-    }
+    new Visitor().accept(t);
   }
 }
diff --git a/jack/src/com/android/jack/shrob/obfuscation/annotation/RemoveLocalLineNumber.java b/jack/src/com/android/jack/shrob/obfuscation/annotation/RemoveLocalLineNumber.java
new file mode 100644
index 0000000..c89588f
--- /dev/null
+++ b/jack/src/com/android/jack/shrob/obfuscation/annotation/RemoveLocalLineNumber.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.shrob.obfuscation.annotation;
+
+import com.android.sched.item.Description;
+import com.android.sched.item.Feature;
+import com.android.sched.util.config.HasKeyId;
+import com.android.sched.util.config.id.BooleanPropertyId;
+
+import javax.annotation.Nonnull;
+
+/**
+ * Represents the removal of line numbers of local variables and 'this' in source info.
+ */
+@HasKeyId
+@Description("The removal of line numbers of local variables and 'this' in source info")
+public class RemoveLocalLineNumber implements Feature {
+
+  /**
+   * This property indicates if the line numbers of local variables and 'this' in source info must
+   * be removed.
+   * If a flags file (provided with --config-proguard) contradicts this property, the property is
+   * overridden.
+   */
+  @Nonnull
+  public static final BooleanPropertyId KEEP_LOCAL_LINE_NUMBER = BooleanPropertyId.create(
+      "jack.obfuscation.local.keep-line-number", "Keep line numbers for locals")
+      .addDefaultValue(Boolean.TRUE);
+}
diff --git a/jack/src/com/android/jack/shrob/obfuscation/annotation/RemoveLocalVariableGenericSignature.java b/jack/src/com/android/jack/shrob/obfuscation/annotation/RemoveLocalVariableGenericSignature.java
deleted file mode 100644
index 96e5795..0000000
--- a/jack/src/com/android/jack/shrob/obfuscation/annotation/RemoveLocalVariableGenericSignature.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.jack.shrob.obfuscation.annotation;
-
-import com.android.sched.item.Description;
-import com.android.sched.item.Feature;
-
-/**
- * Represents the removal of the generic signatures of a local variable
- */
-@Description("The removal of the generic signatures of a local variable")
-public class RemoveLocalVariableGenericSignature implements Feature {
-
-}
diff --git a/jack/src/com/android/jack/shrob/obfuscation/annotation/RemoveLocalVariableName.java b/jack/src/com/android/jack/shrob/obfuscation/annotation/RemoveLocalVariableName.java
index b70bab2..4244912 100644
--- a/jack/src/com/android/jack/shrob/obfuscation/annotation/RemoveLocalVariableName.java
+++ b/jack/src/com/android/jack/shrob/obfuscation/annotation/RemoveLocalVariableName.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2015 The Android Open Source Project
+ * Copyright (C) 2016 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,11 +18,26 @@
 
 import com.android.sched.item.Description;
 import com.android.sched.item.Feature;
+import com.android.sched.util.config.HasKeyId;
+import com.android.sched.util.config.id.BooleanPropertyId;
+
+import javax.annotation.Nonnull;
 
 /**
- * A {@link Feature} that represents the removal of local variables names.
+ * A {@link Feature} that represents the removal of local variables and 'this' names.
  */
-@Description("The removal of local variables names")
+@HasKeyId
+@Description("The removal of local variables and 'this' names")
 public class RemoveLocalVariableName implements Feature {
 
+  /**
+   * This property indicates if the names of local variables and 'this' in source info must
+   * be removed.
+   * If a flags file (provided with --config-proguard) contradicts this property, the property is
+   * overridden.
+   */
+  @Nonnull
+  public static final BooleanPropertyId KEEP_LOCAL_NAME = BooleanPropertyId.create(
+      "jack.obfuscation.local.keep-name", "Keep names for locals")
+      .addDefaultValue(Boolean.TRUE);
 }
diff --git a/jack/src/com/android/jack/shrob/obfuscation/annotation/RemoveParameterLineNumber.java b/jack/src/com/android/jack/shrob/obfuscation/annotation/RemoveParameterLineNumber.java
new file mode 100644
index 0000000..1a3ccc5
--- /dev/null
+++ b/jack/src/com/android/jack/shrob/obfuscation/annotation/RemoveParameterLineNumber.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.jack.shrob.obfuscation.annotation;
+
+import com.android.sched.item.Description;
+import com.android.sched.item.Feature;
+import com.android.sched.util.config.HasKeyId;
+import com.android.sched.util.config.id.BooleanPropertyId;
+
+import javax.annotation.Nonnull;
+
+/**
+ * Represents the removal of line numbers in source info for parameters.
+ */
+@HasKeyId
+@Description("The removal of line numbers in source info for parameters")
+public class RemoveParameterLineNumber implements Feature {
+
+  /**
+   * This property indicates if the line numbers of parameters in source info must be removed.
+   * If a flags file (provided with --config-proguard) contradicts this property, the property is
+   * overridden.
+   */
+  @Nonnull
+  public static final BooleanPropertyId KEEP_PARAMETER_LINE_NUMBER = BooleanPropertyId.create(
+      "jack.obfuscation.parameter.keep-line-number", "Keep line numbers for parameters")
+      .addDefaultValue(Boolean.TRUE);
+
+}
diff --git a/jack/src/com/android/jack/shrob/obfuscation/annotation/RemoveParameterName.java b/jack/src/com/android/jack/shrob/obfuscation/annotation/RemoveParameterName.java
index 4afd970..cf3f1ed 100644
--- a/jack/src/com/android/jack/shrob/obfuscation/annotation/RemoveParameterName.java
+++ b/jack/src/com/android/jack/shrob/obfuscation/annotation/RemoveParameterName.java
@@ -18,11 +18,25 @@
 
 import com.android.sched.item.Description;
 import com.android.sched.item.Feature;
+import com.android.sched.util.config.HasKeyId;
+import com.android.sched.util.config.id.BooleanPropertyId;
+
+import javax.annotation.Nonnull;
 
 /**
  * A {@link Feature} that represents the removal of parameter names.
  */
+@HasKeyId
 @Description("The removal of parameter names")
 public class RemoveParameterName implements Feature {
 
+  /**
+   * This property indicates if the names of parameters in source info must be removed.
+   * If a flags file (provided with --config-proguard) contradicts this property, the property is
+   * overridden.
+   */
+  @Nonnull
+  public static final BooleanPropertyId KEEP_PARAMETER_NAME = BooleanPropertyId.create(
+      "jack.obfuscation.parameter.keep-name", "Keep names for parameters")
+      .addDefaultValue(Boolean.TRUE);
 }
diff --git a/jack/src/com/android/jack/shrob/obfuscation/annotation/RemoveLineNumber.java b/jack/src/com/android/jack/shrob/obfuscation/annotation/RemoveVariableGenericSignature.java
similarity index 79%
rename from jack/src/com/android/jack/shrob/obfuscation/annotation/RemoveLineNumber.java
rename to jack/src/com/android/jack/shrob/obfuscation/annotation/RemoveVariableGenericSignature.java
index 4d63713..3bab585 100644
--- a/jack/src/com/android/jack/shrob/obfuscation/annotation/RemoveLineNumber.java
+++ b/jack/src/com/android/jack/shrob/obfuscation/annotation/RemoveVariableGenericSignature.java
@@ -20,9 +20,9 @@
 import com.android.sched.item.Feature;
 
 /**
- * Represents the removal of line numbers in source info.
+ * Represents the removal of the generic signatures of a variable
  */
-@Description("The removal of line numbers in source info")
-public class RemoveLineNumber implements Feature {
+@Description("The removal of the generic signatures of a variable")
+public class RemoveVariableGenericSignature implements Feature {
 
 }
diff --git a/jack/src/com/android/jack/shrob/obfuscation/annotation/LocalVariableGenericSignatureRemover.java b/jack/src/com/android/jack/shrob/obfuscation/annotation/VariableGenericSignatureRemover.java
similarity index 86%
rename from jack/src/com/android/jack/shrob/obfuscation/annotation/LocalVariableGenericSignatureRemover.java
rename to jack/src/com/android/jack/shrob/obfuscation/annotation/VariableGenericSignatureRemover.java
index a3fd7d6..1cf7a7f 100644
--- a/jack/src/com/android/jack/shrob/obfuscation/annotation/LocalVariableGenericSignatureRemover.java
+++ b/jack/src/com/android/jack/shrob/obfuscation/annotation/VariableGenericSignatureRemover.java
@@ -29,12 +29,11 @@
 import javax.annotation.Nonnull;
 
 /**
- * A {@link RunnableSchedulable} that removes signatures from local variables.
+ * A {@link RunnableSchedulable} that removes signatures from variables.
  */
-@Description("Removes signatures from local variables")
-@Support(RemoveLocalVariableGenericSignature.class)
-public class LocalVariableGenericSignatureRemover implements
-    RunnableSchedulable<JMethod> {
+@Description("Removes signatures from variables")
+@Support(RemoveVariableGenericSignature.class)
+public class VariableGenericSignatureRemover implements RunnableSchedulable<JMethod> {
 
   private static class Visitor extends JVisitor {
 
diff --git a/jack/src/com/android/jack/shrob/proguard/GrammarActions.java b/jack/src/com/android/jack/shrob/proguard/GrammarActions.java
index 0382273..3c917b8 100644
--- a/jack/src/com/android/jack/shrob/proguard/GrammarActions.java
+++ b/jack/src/com/android/jack/shrob/proguard/GrammarActions.java
@@ -79,10 +79,10 @@
       SourceFormatter.getFormatter();
 
   enum FilterSeparator {
-    GENERAL(".", "[^./]*"),
-    FILE(".", "[^/]*"),
-    CLASS("[^.]", "[^.]*"),
-    ATTRIBUTE(".", ".*");
+    GENERAL(".", "[^./]*", ".*"),
+    FILE(".", "[^/]*", ".*"),
+    CLASS("[^.]", "[^.]*", "[^\\[\\]]*"),
+    ATTRIBUTE(".", ".*", ".*");
 
     /**
      * Represents the pattern equivalent to Proguard's "?"
@@ -96,9 +96,17 @@
     @Nonnull
     private final String multipleCharWildcard;
 
-    FilterSeparator(@Nonnull String singleCharWilcard, @Nonnull String multipleCharWildcard) {
+    /**
+     * Represents the pattern equivalent to Proguard's "**"
+     */
+    @Nonnull
+    private final String multipleCharWildcardWithSeparator;
+
+    FilterSeparator(@Nonnull String singleCharWilcard, @Nonnull String multipleCharWildcard,
+        @Nonnull String multipleCharWildcardWithSeparator) {
       this.singleCharWilcard = singleCharWilcard;
       this.multipleCharWildcard = multipleCharWildcard;
+      this.multipleCharWildcardWithSeparator = multipleCharWildcardWithSeparator;
     }
   }
 
@@ -117,30 +125,30 @@
 
   @Nonnull
   public static String getSignature(@Nonnull String name) {
-    assert name != null;
-    if (name.contains("[")) {
-      String nameWithoutArray = name.substring(0, name.lastIndexOf('['));
+    int lastOpeningBracketPos = name.lastIndexOf('[');
+    if (lastOpeningBracketPos != -1) {
+      String nameWithoutArray = name.substring(0, lastOpeningBracketPos);
       return '[' + getSignature(nameWithoutArray);
     }
     StringBuilder sig = new StringBuilder();
     if (name.equals("boolean")) {
-      sig.append("Z");
+      sig.append('Z');
     } else if (name.equals("byte")) {
-      sig.append("B");
+      sig.append('B');
     } else if (name.equals("char")) {
-      sig.append("C");
+      sig.append('C');
     } else if (name.equals("short")) {
-      sig.append("S");
+      sig.append('S');
     } else if (name.equals("int")) {
-      sig.append("I");
+      sig.append('I');
     } else if (name.equals("float")) {
-      sig.append("F");
+      sig.append('F');
     } else if (name.equals("double")) {
-      sig.append("D");
+      sig.append('D');
     } else if (name.equals("long")) {
-      sig.append("J");
+      sig.append('J');
     } else if (name.equals("void")) {
-      sig.append("V");
+      sig.append('V');
     } else {
       sig.append(NamingTools.getTypeSignatureName(name));
     }
@@ -148,16 +156,15 @@
     return sig.toString();
   }
 
+  private static final String PRIMITIVE_TYPE_NON_VOID =
+      "(boolean|byte|char|short|int|float|double|long)";
+
   @Nonnull
-  static String getSignature(@Nonnull String name, int dim) {
+  static String getSourceNamePattern(@Nonnull String name, int dim) {
     assert name != null;
 
     StringBuilder sig = new StringBuilder();
 
-    for (int i = 0; i < dim; i++) {
-      sig.append("\\[");
-    }
-
     // ... matches any number of arguments of any type
     if (name.equals("...")) {
       sig.append(".*");
@@ -166,35 +173,23 @@
       sig.append(".*");
       // % matches any primitive type ("boolean", "int", etc, but not "void")
     } else if (name.equals("%")) {
-      sig.append("(B|C|D|F|I|J|S|Z)");
-    } else if (name.equals("boolean")) {
-      sig.append("Z");
-    } else if (name.equals("byte")) {
-      sig.append("B");
-    } else if (name.equals("char")) {
-      sig.append("C");
-    } else if (name.equals("short")) {
-      sig.append("S");
-    } else if (name.equals("int")) {
-      sig.append("I");
-    } else if (name.equals("float")) {
-      sig.append("F");
-    } else if (name.equals("double")) {
-      sig.append("D");
-    } else if (name.equals("long")) {
-      sig.append("J");
-    } else if (name.equals("void")) {
-      sig.append("V");
+      sig.append(PRIMITIVE_TYPE_NON_VOID);
+    } else if (name.equals("**")) {
+      sig.append("[^\\[\\[]*(?<!" + PRIMITIVE_TYPE_NON_VOID + ")");
     } else {
       sig.append(
-          convertNameToPattern(NamingTools.getTypeSignatureName(name), FilterSeparator.CLASS));
+          convertNameToRegex(name, FilterSeparator.CLASS));
+    }
+
+    for (int i = 0; i < dim; i++) {
+      sig.append("\\[\\]");
     }
 
     return sig.toString();
   }
 
   @Nonnull
-  private static String convertNameToPattern(
+  private static String convertNameToRegex(
       @Nonnull String name, @Nonnull FilterSeparator separator) {
     StringBuilder sb = new StringBuilder();
     for (int i = 0; i < name.length(); i++) {
@@ -208,7 +203,7 @@
           if (j < name.length() && name.charAt(j) == '*') {
             // ** matches any part of a name, possibly containing
             // any number of package separators or directory separators
-            sb.append(".*");
+            sb.append(separator.multipleCharWildcardWithSeparator);
             i++;
           } else {
             // * matches any part of a name not containing
@@ -231,7 +226,7 @@
   static NameSpecification name(/*@Nonnull*/ String name, @Nonnull FilterSeparator separator) {
     assert name != null;
     String transformedName = "^" +
-        convertNameToPattern(name, separator) + "$";
+        convertNameToRegex(name, separator) + "$";
 
     Pattern pattern = Pattern.compile(transformedName);
     return new NameSpecification(pattern);
@@ -296,48 +291,55 @@
 
   static void method(@Nonnull ClassSpecification classSpec,
       @CheckForNull AnnotationSpecification annotationType,
-      @CheckForNull String typeSig, /*@Nonnull*/ String name, @Nonnull String signature,
+      @CheckForNull String typeSigRegex, /*@Nonnull*/ String name, @Nonnull String signature,
       @CheckForNull ModifierSpecification modifier) {
     assert name != null;
-    String fullName = "^" + convertNameToPattern(name, FilterSeparator.CLASS);
+    String fullName = "^" + convertNameToRegex(name, FilterSeparator.CLASS);
     fullName += signature;
-    if (typeSig != null) {
-      fullName += typeSig;
-    } else {
-      fullName += "V";
+    NameSpecification typeSignature = null;
+    if (typeSigRegex != null) {
+      Pattern pattern = Pattern.compile("^" + typeSigRegex + "$");
+      typeSignature = new NameSpecification(pattern);
     }
     fullName += "$";
     Pattern pattern = Pattern.compile(fullName);
     classSpec.add(new MethodSpecification(new NameSpecification(pattern),
-        modifier, annotationType));
+        modifier, typeSignature, annotationType));
   }
 
   static void fieldOrAnyMember(@Nonnull ClassSpecification classSpec,
       @CheckForNull AnnotationSpecification annotationType, @CheckForNull String typeSig,
-      /*@Nonnull*/ String name, @Nonnull ModifierSpecification modifier) {
+      /* @Nonnull */ String name, @Nonnull ModifierSpecification modifier,
+      @Nonnull CharStream inputStream) throws RecognitionException {
     assert name != null;
     if (typeSig == null) {
-      assert name.equals("*");
+      if (!name.equals("*")) {
+        throw new RecognitionException(inputStream);
+      }
       // This is the "any member" case, we have to handle methods as well.
       method(classSpec,
           annotationType,
-          getSignature("***", 0),
+          getSourceNamePattern("***", 0),
           "*",
-          "\\(" + getSignature("...", 0) + "\\)",
+          "\\(" + getSourceNamePattern("...", 0) + "\\)",
           modifier);
     }
-    field(classSpec, annotationType, typeSig, name, modifier);
+    field(classSpec, annotationType, typeSig, name, modifier, inputStream);
   }
 
   static void field(@Nonnull ClassSpecification classSpec,
-      @CheckForNull AnnotationSpecification annotationType, @CheckForNull String typeSig,
-      /*@Nonnull*/ String name, @Nonnull ModifierSpecification modifier) {
+      @CheckForNull AnnotationSpecification annotationType, @CheckForNull String typeSigRegex,
+      /* @Nonnull */ String name, @Nonnull ModifierSpecification modifier,
+      @Nonnull CharStream inputStream) throws RecognitionException {
     assert name != null;
     NameSpecification typeSignature = null;
-    if (typeSig != null) {
-      typeSignature = name(typeSig, FilterSeparator.CLASS);
+    if (typeSigRegex != null) {
+      Pattern pattern = Pattern.compile("^" + typeSigRegex + "$");
+      typeSignature = new NameSpecification(pattern);
     } else {
-      assert name.equals("*");
+      if (!name.equals("*")) {
+        throw new RecognitionException(inputStream);
+      }
     }
     classSpec.add(
         new FieldSpecification(
diff --git a/jack/src/com/android/jack/shrob/proguard/Proguard.g b/jack/src/com/android/jack/shrob/proguard/Proguard.g
index bdd4a89..e045dec 100644
--- a/jack/src/com/android/jack/shrob/proguard/Proguard.g
+++ b/jack/src/com/android/jack/shrob/proguard/Proguard.g
@@ -202,11 +202,11 @@
     annotation? modifiers
     (
       (typeSig=type)? name=(NAME|'<init>') (signature=arguments {GrammarActions.method(classSpec, $annotation.annotSpec, typeSig, $name.text, signature, $modifiers.modifiers);}
-                  | {GrammarActions.fieldOrAnyMember(classSpec, $annotation.annotSpec, typeSig, $name.text, $modifiers.modifiers);})
+                  | {assert $name != null; GrammarActions.fieldOrAnyMember(classSpec, $annotation.annotSpec, typeSig, $name.text, $modifiers.modifiers, $name.getInputStream());})
       | '<methods>' {GrammarActions.method(classSpec, $annotation.annotSpec,
-          GrammarActions.getSignature("***", 0), "*", "\\("+ GrammarActions.getSignature("...", 0) + "\\)",
+          GrammarActions.getSourceNamePattern("***", 0), "*", "\\("+ GrammarActions.getSourceNamePattern("...", 0) + "\\)",
           $modifiers.modifiers);}
-      | '<fields>' {GrammarActions.field(classSpec, $annotation.annotSpec, null, "*", $modifiers.modifiers);}
+      | fields='<fields>' {GrammarActions.field(classSpec, $annotation.annotSpec, null, "*", $modifiers.modifiers, $fields.getInputStream());}
     ) ';'
   ;
 
@@ -261,20 +261,20 @@
   '(' {signature = "\\(";}
     (
       (
-        parameterSig=type {signature += parameterSig;}
-        (',' parameterSig=type {signature += parameterSig;})*
+        parameterSig=type {signature += $parameterSig.typeSourceNamePattern;}
+        (',' parameterSig=type {signature += ", " + $parameterSig.typeSourceNamePattern;})*
         )?
       )
     ')' {signature += "\\)";}
   ;
 
-private type returns [String signature]
+private type returns [String typeSourceNamePattern]
 @init {
   int dim = 0;
 }
   :
   (
-    typeName=('%' | NAME) ('[]' {dim++;})*  {String sig = $typeName.text; signature = GrammarActions.getSignature(sig == null ? "" : sig, dim);}
+    typeName=('%' | NAME) ('[]' {dim++;})*  {String sig = $typeName.text; typeSourceNamePattern = GrammarActions.getSourceNamePattern(sig == null ? "" : sig, dim);}
   )
   ;
 
diff --git a/jack/src/com/android/jack/shrob/proguard/ProguardFileParsingException.java b/jack/src/com/android/jack/shrob/proguard/ProguardFileParsingException.java
index 981ef07..47b559f 100644
--- a/jack/src/com/android/jack/shrob/proguard/ProguardFileParsingException.java
+++ b/jack/src/com/android/jack/shrob/proguard/ProguardFileParsingException.java
@@ -21,7 +21,7 @@
 import javax.annotation.Nonnull;
 
 /**
- * This exception is thrown if a problem occured when attempting to parse
+ * This exception is thrown if a problem occurred when attempting to parse
  * a proguard flags file.
  */
 public class ProguardFileParsingException extends ConfigurationException {
diff --git a/jack/src/com/android/jack/shrob/spec/ClassSpecification.java b/jack/src/com/android/jack/shrob/spec/ClassSpecification.java
index b5b9b8e..2678a07 100644
--- a/jack/src/com/android/jack/shrob/spec/ClassSpecification.java
+++ b/jack/src/com/android/jack/shrob/spec/ClassSpecification.java
@@ -185,7 +185,7 @@
       sb.append('\n');
     }
 
-    sb.append("}");
+    sb.append('}');
 
     return sb.toString();
   }
diff --git a/jack/src/com/android/jack/shrob/spec/FieldSpecification.java b/jack/src/com/android/jack/shrob/spec/FieldSpecification.java
index 3b01752..5fc8427 100644
--- a/jack/src/com/android/jack/shrob/spec/FieldSpecification.java
+++ b/jack/src/com/android/jack/shrob/spec/FieldSpecification.java
@@ -65,7 +65,7 @@
     }
 
     if (type != null
-        && !type.matches(GrammarActions.getSignatureFormatter().getName(f.getType()))) {
+        && !type.matches(GrammarActions.getSourceFormatter().getName(f.getType()))) {
       return false;
     }
 
diff --git a/jack/src/com/android/jack/shrob/spec/Flags.java b/jack/src/com/android/jack/shrob/spec/Flags.java
index 969adfd..b654c51 100644
--- a/jack/src/com/android/jack/shrob/spec/Flags.java
+++ b/jack/src/com/android/jack/shrob/spec/Flags.java
@@ -16,6 +16,9 @@
 
 package com.android.jack.shrob.spec;
 
+import com.android.jack.ir.ast.JClassOrInterface;
+import com.android.jack.shrob.proguard.GrammarActions;
+
 import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
@@ -391,4 +394,10 @@
   public List<FilterSpecification> getAdaptResourceFileContents() {
     return adaptResourceFileContents;
   }
+
+  public static boolean acceptClass(@Nonnull JClassOrInterface type,
+      @Nonnull List<FilterSpecification> specs) {
+    return specs.stream()
+        .anyMatch(x -> x.matches(GrammarActions.getSourceFormatter().getName(type)));
+  }
 }
\ No newline at end of file
diff --git a/jack/src/com/android/jack/shrob/spec/MethodSpecification.java b/jack/src/com/android/jack/shrob/spec/MethodSpecification.java
index 63d2c29..9ad6790 100644
--- a/jack/src/com/android/jack/shrob/spec/MethodSpecification.java
+++ b/jack/src/com/android/jack/shrob/spec/MethodSpecification.java
@@ -34,16 +34,21 @@
   @CheckForNull
   private final ModifierSpecification modifier;
 
+  @CheckForNull
+  private final NameSpecification type;
+
   @Nonnull
-  private final NameSpecification sigPattern;
+  private final NameSpecification fullSourceName;
 
   public MethodSpecification(
       @Nonnull NameSpecification sigPattern,
       @CheckForNull ModifierSpecification modifier,
+      @CheckForNull NameSpecification type,
       @CheckForNull AnnotationSpecification annotationType) {
-    this.sigPattern = sigPattern;
+    this.fullSourceName = sigPattern;
     this.modifier = modifier;
     this.annotationType = annotationType;
+    this.type = type;
   }
 
   @Override
@@ -56,20 +61,26 @@
       return false;
     }
 
-    String signature = GrammarActions.getSignatureFormatter().getName(t);
+    if (type != null
+        && !type.matches(GrammarActions.getSourceFormatter().getName(t.getType()))) {
+      return false;
+    }
+
+    String signature =
+        GrammarActions.getSourceFormatter().getNameWithoutReturnType(t.getMethodIdWide());
     if (t instanceof JConstructor) {
       String methodName = signature.replace(NamingTools.INIT_NAME, t.getEnclosingType().getName());
-      if (sigPattern.matches(methodName)) {
+      if (fullSourceName.matches(methodName)) {
         return true;
       }
       methodName = signature.replace(NamingTools.INIT_NAME,
           GrammarActions.getSourceFormatter().getName(t.getEnclosingType()));
-      if (sigPattern.matches(methodName)) {
+      if (fullSourceName.matches(methodName)) {
         return true;
       }
     }
 
-    return sigPattern.matches(signature);
+    return fullSourceName.matches(signature);
   }
 
   @Override
@@ -87,7 +98,12 @@
       sb.append(' ');
     }
 
-    sb.append(sigPattern);
+    if (type != null) {
+      sb.append(type);
+      sb.append(' ');
+    }
+
+    sb.append(fullSourceName);
     sb.append(';');
 
     return sb.toString();
diff --git a/jack/src/com/android/jack/tools/merger/JackMerger.java b/jack/src/com/android/jack/tools/merger/JackMerger.java
index a28cd97..5da082f 100644
--- a/jack/src/com/android/jack/tools/merger/JackMerger.java
+++ b/jack/src/com/android/jack/tools/merger/JackMerger.java
@@ -34,6 +34,8 @@
 import com.android.jack.dx.rop.type.StdTypeList;
 import com.android.jack.dx.rop.type.Type;
 import com.android.jack.dx.rop.type.TypeList;
+import com.android.sched.util.file.CannotWriteException;
+import com.android.sched.util.location.HasLocation;
 
 import java.io.IOException;
 import java.io.OutputStream;
@@ -142,13 +144,18 @@
     }
   }
 
-  public void finish(@Nonnull OutputStream out) throws IOException {
+  public void finish(@Nonnull OutputStream out, @Nonnull HasLocation locationProvider)
+      throws CannotWriteException {
     dexResult.prepare(cstManager.getCstStrings(), cstManager.getCstFieldRefs(),
         cstManager.getCstMethodRefs(), cstManager.getTypes(), cstManager.getCstPrototypeRefs());
     if (!cstManager.validate(dexResult)) {
       throw new AssertionError();
     }
-    dexResult.writeTo(out, null /* humanOut */, false /* verbose */);
+    try {
+      dexResult.writeTo(out, null /* humanOut */, false /* verbose */);
+    } catch (IOException e) {
+      throw new CannotWriteException(locationProvider);
+    }
     finished = true;
   }
 
diff --git a/jack/src/com/android/jack/transformations/ast/BoostLockedRegionPriority.java b/jack/src/com/android/jack/transformations/ast/BoostLockedRegionPriority.java
index 5475792..a42d235 100644
--- a/jack/src/com/android/jack/transformations/ast/BoostLockedRegionPriority.java
+++ b/jack/src/com/android/jack/transformations/ast/BoostLockedRegionPriority.java
@@ -213,6 +213,7 @@
       }
 
       JStatementList list = (JStatementList) jLock.getParent();
+      assert list != null;
       int index = list.getStatements().indexOf(jLock) + 1;
       if (index >= list.getStatements().size()) {
         abortPass();
diff --git a/jack/src/com/android/jack/transformations/ast/ConcatRemover.java b/jack/src/com/android/jack/transformations/ast/ConcatRemover.java
index d37dea4..2edb69e 100644
--- a/jack/src/com/android/jack/transformations/ast/ConcatRemover.java
+++ b/jack/src/com/android/jack/transformations/ast/ConcatRemover.java
@@ -116,9 +116,10 @@
       if (binary instanceof JConcatOperation) {
         TransformationRequest tr = new TransformationRequest(method);
         SourceInfo sourceInfo = binary.getSourceInfo();
-        JNode parent = binary.getParent();
-        if (isReplaceableAppend(parent)) {
-          JMethodCall toReplace = (JMethodCall) parent;
+        final JNode binaryParent = binary.getParent();
+        assert binaryParent != null;
+        if (isReplaceableAppend(binaryParent)) {
+          JMethodCall toReplace = (JMethodCall) binaryParent;
 
           JExpression instance = toReplace.getInstance();
           assert instance != null;
diff --git a/jack/src/com/android/jack/transformations/ast/SideEffectExtractor.java b/jack/src/com/android/jack/transformations/ast/SideEffectExtractor.java
index 88050e5..b89bdb8 100644
--- a/jack/src/com/android/jack/transformations/ast/SideEffectExtractor.java
+++ b/jack/src/com/android/jack/transformations/ast/SideEffectExtractor.java
@@ -23,6 +23,7 @@
 import com.android.jack.ir.ast.JLocal;
 import com.android.jack.ir.ast.JLocalRef;
 import com.android.jack.ir.ast.JMultiExpression;
+import com.android.jack.ir.ast.JNode;
 import com.android.jack.ir.ast.JParameter;
 import com.android.jack.ir.ast.JParameterRef;
 import com.android.jack.ir.sourceinfo.SourceInfo;
@@ -87,7 +88,9 @@
     if (!extracted.isEmpty()) {
       extracted.add((JExpression) ref.getParent());
       JMultiExpression multiExpression = new JMultiExpression(sourceInfo, extracted);
-      tr.append(new Replace(ref.getParent(), multiExpression));
+      final JNode parent = ref.getParent();
+      assert parent != null;
+      tr.append(new Replace(parent, multiExpression));
     }
 
     return new JFieldRef(sourceInfo, newInstance, ref.getFieldId(), ref.getReceiverType());
@@ -105,7 +108,9 @@
     if (!extracted.isEmpty()) {
       extracted.add((JExpression) ref.getParent());
       JMultiExpression multiExpression = new JMultiExpression(sourceInfo, extracted);
-      tr.append(new Replace(ref.getParent(), multiExpression));
+      final JNode parent = ref.getParent();
+      assert parent != null;
+      tr.append(new Replace(parent, multiExpression));
     }
 
     assert newInstance != null;
diff --git a/jack/src/com/android/jack/transformations/ast/SynchronizeTransformer.java b/jack/src/com/android/jack/transformations/ast/SynchronizeTransformer.java
index 0a7cf3f..3b33935 100644
--- a/jack/src/com/android/jack/transformations/ast/SynchronizeTransformer.java
+++ b/jack/src/com/android/jack/transformations/ast/SynchronizeTransformer.java
@@ -74,6 +74,7 @@
 @Constraint(need = {NoImplicitBlock.class})
 @Transform(remove = {JSynchronizedBlock.class, ThreeAddressCodeForm.class}, add = {JBlock.class,
     JTryStatement.class,
+    JTryStatement.FinallyBlock.class,
     JLock.class,
     JUnlock.class,
     JLocalRef.class,
diff --git a/jack/src/com/android/jack/transformations/ast/inner/InnerAccessorGenerator.java b/jack/src/com/android/jack/transformations/ast/inner/InnerAccessorGenerator.java
index cb9ac87..101cbbf 100644
--- a/jack/src/com/android/jack/transformations/ast/inner/InnerAccessorGenerator.java
+++ b/jack/src/com/android/jack/transformations/ast/inner/InnerAccessorGenerator.java
@@ -304,6 +304,7 @@
 
     // this.this$0.field = $value => $set<id>(this.this$0, $value)
     JBinaryOperation binOp = (JBinaryOperation) fieldRef.getParent();
+    assert binOp != null;
 
     JMethodId setterId = setter.getMethodId();
     JMethodCall setterCall = new JMethodCall(binOp.getSourceInfo(), null, accessorClass, setterId,
diff --git a/jack/src/com/android/jack/transformations/ast/removeinit/FieldInitMethodCallRemover.java b/jack/src/com/android/jack/transformations/ast/removeinit/FieldInitMethodCallRemover.java
index d19223b..b9feea0 100644
--- a/jack/src/com/android/jack/transformations/ast/removeinit/FieldInitMethodCallRemover.java
+++ b/jack/src/com/android/jack/transformations/ast/removeinit/FieldInitMethodCallRemover.java
@@ -25,6 +25,7 @@
 import com.android.jack.ir.ast.JMethod;
 import com.android.jack.ir.ast.JMethodBody;
 import com.android.jack.ir.ast.JMethodCall;
+import com.android.jack.ir.ast.JNode;
 import com.android.jack.ir.ast.JPrimitiveType.JPrimitiveTypeEnum;
 import com.android.jack.ir.ast.JVisitor;
 import com.android.jack.lookup.JMethodLookupException;
@@ -92,12 +93,14 @@
         assert body instanceof JMethodBody;
         JBlock varInitMethodBLock = ((JMethodBody) body).getBlock();
 
+        final JNode methodCallParent = methodCall.getParent();
+        assert methodCallParent != null;
         if (varInitMethodBLock.getStatements().isEmpty()) {
-          tr.append(new Remove(methodCall.getParent()));
+          tr.append(new Remove(methodCallParent));
         } else {
           CloneStatementVisitor csv = new CloneStatementVisitor(tr,
               methodCall.getParent(JMethod.class));
-          tr.append(new Replace(methodCall.getParent(), csv.cloneStatement(varInitMethodBLock)));
+          tr.append(new Replace(methodCallParent, csv.cloneStatement(varInitMethodBLock)));
         }
       }
       super.endVisit(methodCall);
diff --git a/jack/src/com/android/jack/transformations/ast/string/FieldStringLiteralRefiner.java b/jack/src/com/android/jack/transformations/ast/string/FieldStringLiteralRefiner.java
index 7a7aab0..c60f8b9 100644
--- a/jack/src/com/android/jack/transformations/ast/string/FieldStringLiteralRefiner.java
+++ b/jack/src/com/android/jack/transformations/ast/string/FieldStringLiteralRefiner.java
@@ -16,14 +16,20 @@
 
 package com.android.jack.transformations.ast.string;
 
+import com.android.jack.Options;
 import com.android.jack.ir.ast.JField;
 import com.android.jack.ir.ast.JSession;
+import com.android.jack.shrob.spec.FilterSpecification;
+import com.android.jack.shrob.spec.Flags;
 import com.android.jack.transformations.request.TransformationRequest;
 import com.android.sched.item.Description;
 import com.android.sched.schedulable.Access;
 import com.android.sched.schedulable.RunnableSchedulable;
 import com.android.sched.schedulable.Transform;
 import com.android.sched.schedulable.Use;
+import com.android.sched.util.config.ThreadConfig;
+
+import java.util.List;
 
 import javax.annotation.Nonnull;
 
@@ -33,16 +39,22 @@
 @Description("Refine JStringLiteral in fields into more specific string literals.")
 @Use(StringLiteralRefinerVisitor.class)
 @Transform(add = StringLiteralRefined.Field.class)
-// Uses StringLiteralRefinerVisitor which lookup types.
+// Uses StringLiteralRefinerVisitor which looks up types.
 @Access(JSession.class)
 public class FieldStringLiteralRefiner implements RunnableSchedulable<JField> {
 
+  @Nonnull
+  private final List<FilterSpecification> adaptClassStrings =
+      ThreadConfig.get(Options.FLAGS).getAdaptClassStrings();
+
   @Override
   public void run(@Nonnull JField field) {
-    TransformationRequest tr = new TransformationRequest(field);
-    StringLiteralRefinerVisitor visitor = new StringLiteralRefinerVisitor(tr);
-    visitor.accept(field);
-    tr.commit();
+    if (Flags.acceptClass(field.getEnclosingType(), adaptClassStrings)) {
+      TransformationRequest tr = new TransformationRequest(field);
+      StringLiteralRefinerVisitor visitor = new StringLiteralRefinerVisitor(tr);
+      visitor.accept(field);
+      tr.commit();
+    }
   }
 
 }
diff --git a/jack/src/com/android/jack/transformations/ast/string/MethodStringLiteralRefiner.java b/jack/src/com/android/jack/transformations/ast/string/MethodStringLiteralRefiner.java
index 0cc57c2..f3c02ed 100644
--- a/jack/src/com/android/jack/transformations/ast/string/MethodStringLiteralRefiner.java
+++ b/jack/src/com/android/jack/transformations/ast/string/MethodStringLiteralRefiner.java
@@ -16,14 +16,20 @@
 
 package com.android.jack.transformations.ast.string;
 
+import com.android.jack.Options;
 import com.android.jack.ir.ast.JMethod;
 import com.android.jack.ir.ast.JSession;
+import com.android.jack.shrob.spec.FilterSpecification;
+import com.android.jack.shrob.spec.Flags;
 import com.android.jack.transformations.request.TransformationRequest;
 import com.android.sched.item.Description;
 import com.android.sched.schedulable.Access;
 import com.android.sched.schedulable.RunnableSchedulable;
 import com.android.sched.schedulable.Transform;
 import com.android.sched.schedulable.Use;
+import com.android.sched.util.config.ThreadConfig;
+
+import java.util.List;
 
 import javax.annotation.Nonnull;
 
@@ -32,16 +38,23 @@
  */
 @Description("Refine JStringLiteral in methods into more specific string literals.")
 @Use(StringLiteralRefinerVisitor.class)
+// Uses StringLiteralRefinerVisitor which looks up types.
 @Access(JSession.class)
 @Transform(add = StringLiteralRefined.Method.class)
 public class MethodStringLiteralRefiner implements RunnableSchedulable<JMethod> {
 
+  @Nonnull
+  private final List<FilterSpecification> adaptClassStrings =
+      ThreadConfig.get(Options.FLAGS).getAdaptClassStrings();
+
   @Override
   public void run(@Nonnull JMethod method) {
-    TransformationRequest tr = new TransformationRequest(method);
-    StringLiteralRefinerVisitor visitor = new StringLiteralRefinerVisitor(tr);
-    visitor.accept(method);
-    tr.commit();
+    if (Flags.acceptClass(method.getEnclosingType(), adaptClassStrings)) {
+      TransformationRequest tr = new TransformationRequest(method);
+      StringLiteralRefinerVisitor visitor = new StringLiteralRefinerVisitor(tr);
+      visitor.accept(method);
+      tr.commit();
+    }
   }
 
 }
diff --git a/jack/src/com/android/jack/transformations/ast/string/ReflectionStringLiteralRefiner.java b/jack/src/com/android/jack/transformations/ast/string/ReflectionStringLiteralRefiner.java
index 5c2f03d..cbefc39 100644
--- a/jack/src/com/android/jack/transformations/ast/string/ReflectionStringLiteralRefiner.java
+++ b/jack/src/com/android/jack/transformations/ast/string/ReflectionStringLiteralRefiner.java
@@ -65,6 +65,7 @@
     AtomicReferenceUpdaterParameterRefiner.class,
     GetMethodParameterRefiner.class,
     GetDeclaredMethodParameterRefiner.class})
+// Uses refiners which look up types.
 @Access(JSession.class)
 public class ReflectionStringLiteralRefiner implements RunnableSchedulable<JMethod> {
 
diff --git a/jack/src/com/android/jack/transformations/ast/string/StringLiteralRefinerVisitor.java b/jack/src/com/android/jack/transformations/ast/string/StringLiteralRefinerVisitor.java
index 7761df3..c9c493b 100644
--- a/jack/src/com/android/jack/transformations/ast/string/StringLiteralRefinerVisitor.java
+++ b/jack/src/com/android/jack/transformations/ast/string/StringLiteralRefinerVisitor.java
@@ -62,16 +62,16 @@
   @Override
   public boolean visit(@Nonnull JStringLiteral stringLiteral) {
     String strValue = stringLiteral.getValue();
-    boolean hasDot = strValue.contains(".");
-    boolean hasSlash = strValue.contains("/");
+    boolean hasDot = strValue.indexOf('.') != -1;
+    boolean hasSlash = strValue.indexOf('/') != -1;
 
     if (hasDot && hasSlash) {
       // String mixing '.' and '/' is not considered as type.
       return false;
     }
 
-
-    JType type = getTypeFromString(strValue);
+    String signatureName = getSignatureName(strValue);
+    JType type = getTypeFromSignature(signatureName);
     if (type != null) {
       tr.append(new Replace(stringLiteral, new JTypeStringLiteral(stringLiteral.getSourceInfo(),
           hasDot ? Kind.SRC_QN : Kind.BINARY_QN, type)));
@@ -80,8 +80,7 @@
   }
 
   @CheckForNull
-  private JType getTypeFromString(@Nonnull String str) {
-    String signatureName = getSignatureName(str);
+  private JType getTypeFromSignature(@Nonnull String signatureName) {
     if (NamingTools.isTypeDescriptor(signatureName)) {
       try {
         JType type = lookup.getType(signatureName);
diff --git a/jack/src/com/android/jack/transformations/ast/string/TypeStringLiteralRefiner.java b/jack/src/com/android/jack/transformations/ast/string/TypeStringLiteralRefiner.java
index 81ea40c..107e691 100644
--- a/jack/src/com/android/jack/transformations/ast/string/TypeStringLiteralRefiner.java
+++ b/jack/src/com/android/jack/transformations/ast/string/TypeStringLiteralRefiner.java
@@ -16,14 +16,20 @@
 
 package com.android.jack.transformations.ast.string;
 
+import com.android.jack.Options;
 import com.android.jack.ir.ast.JDefinedClassOrInterface;
 import com.android.jack.ir.ast.JSession;
+import com.android.jack.shrob.spec.FilterSpecification;
+import com.android.jack.shrob.spec.Flags;
 import com.android.jack.transformations.request.TransformationRequest;
 import com.android.sched.item.Description;
 import com.android.sched.schedulable.Access;
 import com.android.sched.schedulable.RunnableSchedulable;
 import com.android.sched.schedulable.Transform;
 import com.android.sched.schedulable.Use;
+import com.android.sched.util.config.ThreadConfig;
+
+import java.util.List;
 
 import javax.annotation.Nonnull;
 
@@ -32,16 +38,23 @@
  */
 @Description("Refine JStringLiteral in types into more specific string literals.")
 @Use(StringLiteralRefinerVisitor.class)
+// Uses StringLiteralRefinerVisitor which looks up types.
 @Access(JSession.class)
 @Transform(add = StringLiteralRefined.Type.class)
 public class TypeStringLiteralRefiner implements RunnableSchedulable<JDefinedClassOrInterface> {
 
+  @Nonnull
+  private final List<FilterSpecification> adaptClassStrings =
+      ThreadConfig.get(Options.FLAGS).getAdaptClassStrings();
+
   @Override
   public void run(@Nonnull JDefinedClassOrInterface type) {
-    TransformationRequest tr = new TransformationRequest(type);
-    StringLiteralRefinerVisitor visitor = new StringLiteralRefinerVisitor(tr);
-    visitor.accept(type);
-    tr.commit();
+    if (Flags.acceptClass(type, adaptClassStrings)) {
+      TransformationRequest tr = new TransformationRequest(type);
+      StringLiteralRefinerVisitor visitor = new StringLiteralRefinerVisitor(tr);
+      visitor.accept(type.getAnnotations());
+      tr.commit();
+    }
   }
 
 }
diff --git a/jack/src/com/android/jack/transformations/ast/string/parameterrefiners/ForNameParameterRefiner.java b/jack/src/com/android/jack/transformations/ast/string/parameterrefiners/ForNameParameterRefiner.java
index 346bf9e..91ec8f1 100644
--- a/jack/src/com/android/jack/transformations/ast/string/parameterrefiners/ForNameParameterRefiner.java
+++ b/jack/src/com/android/jack/transformations/ast/string/parameterrefiners/ForNameParameterRefiner.java
@@ -79,11 +79,11 @@
     JType type;
     JTypeStringLiteral strTypeLiteral = null;
 
-    if (typeName.contains("/")) {
+    if (typeName.indexOf('/') != -1) {
       return null;
     }
 
-    if (typeName.startsWith("[")) {
+    if (typeName.charAt(0) == '[') {
       typeSignature = NamingTools.getBinaryName(typeName);
     } else {
       typeSignature = NamingTools.getTypeSignatureName(typeName);
diff --git a/jack/src/com/android/jack/transformations/ast/string/parameterrefiners/GetMethodParameterRefiner.java b/jack/src/com/android/jack/transformations/ast/string/parameterrefiners/GetMethodParameterRefiner.java
index f16caa0..236c28b 100644
--- a/jack/src/com/android/jack/transformations/ast/string/parameterrefiners/GetMethodParameterRefiner.java
+++ b/jack/src/com/android/jack/transformations/ast/string/parameterrefiners/GetMethodParameterRefiner.java
@@ -130,7 +130,7 @@
 
     if (parameters instanceof JNewArray) {
       StringBuilder sb = new StringBuilder(methodName);
-      sb.append("(");
+      sb.append('(');
       for (JExpression param : ((JNewArray) parameters).getInitializers()) {
         if (param instanceof JClassLiteral) {
           sb.append(Jack.getLookupFormatter().getName(((JClassLiteral) param).getRefType()));
@@ -139,7 +139,7 @@
         }
       }
 
-      sb.append(")");
+      sb.append(')');
       return sb.toString();
     }
 
diff --git a/jack/src/com/android/jack/transformations/enums/opt/SyntheticClassManager.java b/jack/src/com/android/jack/transformations/enums/opt/SyntheticClassManager.java
index 6b08ecc..be6bba0 100644
--- a/jack/src/com/android/jack/transformations/enums/opt/SyntheticClassManager.java
+++ b/jack/src/com/android/jack/transformations/enums/opt/SyntheticClassManager.java
@@ -364,14 +364,14 @@
           sortedEnumType.getMarker(EnumFieldMarker.class);
       assert enumFieldMarker != null;
       sb.append(Jack.getLookupFormatter().getName(sortedEnumType));
-      sb.append(":");
+      sb.append(':');
       enumFieldMarker.sortEnumFields();
       List<JEnumField> sortedEnumFields = enumFieldMarker.getEnumFields();
       for (JEnumField enumField : sortedEnumFields) {
         sb.append(enumField.getName());
-        sb.append(",");
+        sb.append(',');
       }
-      sb.append(".");
+      sb.append('.');
     }
     String sig = sb.toString();
     sb.delete(0, sb.length());
diff --git a/jack/src/com/android/jack/transformations/finallyblock/FinallyRemover.java b/jack/src/com/android/jack/transformations/finallyblock/FinallyRemover.java
index 0e253c5..6367c0c 100644
--- a/jack/src/com/android/jack/transformations/finallyblock/FinallyRemover.java
+++ b/jack/src/com/android/jack/transformations/finallyblock/FinallyRemover.java
@@ -268,6 +268,7 @@
 
         // Find the previous try statement which will catch exceptions.
         while (!(stmt instanceof JTryStatement) && !(stmt instanceof JMethodBody)) {
+          assert stmt != null;
           previous = stmt;
           stmt = stmt.getParent();
         }
@@ -402,6 +403,7 @@
     private boolean isBranchingOutsideOfTryStatement(@Nonnull JGoto gotoStatement) {
       JNode parent = gotoStatement.getTargetBlock().getParent();
       while (parent != tryStmt && !(parent instanceof JMethodBody)) {
+        assert parent != null;
         parent = parent.getParent();
       }
       if (parent == tryStmt) {
diff --git a/jack/src/com/android/jack/transformations/lambda/LambdaCollection.java b/jack/src/com/android/jack/transformations/lambda/LambdaCollection.java
index b1e3e4e..1882659 100644
--- a/jack/src/com/android/jack/transformations/lambda/LambdaCollection.java
+++ b/jack/src/com/android/jack/transformations/lambda/LambdaCollection.java
@@ -45,11 +45,11 @@
 import java.nio.charset.StandardCharsets;
 import java.security.MessageDigest;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.concurrent.ConcurrentHashMap;
-import javax.annotation.Nonnegative;
 import javax.annotation.Nonnull;
 
 /**
@@ -214,14 +214,14 @@
    * </pre>
    */
   void createLambdaClassGroups(@Nonnull JSession session) {
-    int nextId = 0;
     // Create a map sorted by key to ensure a stable order
     // of the created lambda group classes
+    Map<String, Integer> typeHashConflicts = new HashMap<>();
     TreeMap<Key, ConcurrentHashMap<String, JLambda>> sorted = new TreeMap<>(lambdaClassSets);
     for (Map.Entry<Key, ConcurrentHashMap<String, JLambda>> entry : sorted.entrySet()) {
       // Create a group class to represent lambda group
-      JDefinedClass groupClass = createGroupClass(
-          nextId++, session, entry.getKey().pkg, getLambdaTypesHash(entry.getValue().values()));
+      JDefinedClass groupClass = createGroupClass(session, entry.getKey().pkg,
+          getLambdaTypesHash(entry.getValue().values()), typeHashConflicts);
 
       LambdaGroup lambdaGroup = new LambdaGroup(
           entry.getValue(), groupClass, entry.getKey().captureSignature);
@@ -248,16 +248,28 @@
       digest.update(name.getBytes(StandardCharsets.UTF_8));
       digest.update((byte) 0);
     }
-    return BaseEncoding.base64Url().omitPadding().encode(digest.digest());
+    String encode = BaseEncoding.base64Url().omitPadding().encode(digest.digest());
+    assert encode != null;
+    return encode;
   }
 
   @Nonnull
-  private JDefinedClass createGroupClass(@Nonnegative int id,
-      @Nonnull JSession session, @Nonnull JPackage pkg, @Nonnull String typesHash) {
+  private JDefinedClass createGroupClass(@Nonnull JSession session, @Nonnull JPackage pkg,
+      @Nonnull String typesHash, @Nonnull Map<String, Integer> typeHashConflicts) {
+    String lambdaClassName =
+        NamingTools.getNonSourceConflictingName(LAMBDA_GROUP_CLASS_NAME_PREFIX + typesHash);
+    Integer count = typeHashConflicts.get(typesHash);
+    if (count == null) {
+      typeHashConflicts.put(typesHash, Integer.valueOf(0));
+    } else {
+      int nextId = count.intValue() + 1;
+      lambdaClassName += "$" + nextId;
+      typeHashConflicts.put(typesHash, Integer.valueOf(nextId));
+    }
+
     // Create a class
-    JDefinedClass groupClass = new JDefinedClass(SourceInfo.UNKNOWN,
-        NamingTools.getNonSourceConflictingName(
-            LAMBDA_GROUP_CLASS_NAME_PREFIX + id + "$" + typesHash),
+    JDefinedClass groupClass = new JDefinedClass(
+        SourceInfo.UNKNOWN, lambdaClassName,
         JModifier.FINAL | JModifier.SYNTHETIC,
         pkg, NopClassOrInterfaceLoader.INSTANCE);
     groupClass.setSuperClass(javaLangObject);
diff --git a/jack/src/com/android/jack/transformations/request/AddNameValuePair.java b/jack/src/com/android/jack/transformations/request/AddNameValuePair.java
index 3c6fafd..cfa97d4 100644
--- a/jack/src/com/android/jack/transformations/request/AddNameValuePair.java
+++ b/jack/src/com/android/jack/transformations/request/AddNameValuePair.java
@@ -18,6 +18,7 @@
 
 import com.android.jack.ir.ast.JAnnotation;
 import com.android.jack.ir.ast.JNameValuePair;
+import com.android.jack.ir.ast.JNode;
 import com.android.sched.transform.TransformStep;
 
 import javax.annotation.Nonnull;
@@ -54,12 +55,14 @@
   @Override
   @Nonnull
   public String toString() {
+    JNode annotationParent = annotation.getParent();
+    assert annotationParent != null;
     StringBuilder sb = new StringBuilder("Add ");
     sb.append(pair.toSource());
     sb.append(" in ");
     sb.append(annotation.toSource());
     sb.append(" on ");
-    sb.append(annotation.getParent().toSource());
+    sb.append(annotationParent.toSource());
     return sb.toString();
   }
 }
diff --git a/jack/src/com/android/jack/transformations/request/AppendBefore.java b/jack/src/com/android/jack/transformations/request/AppendBefore.java
index 43969cd..25f6184 100644
--- a/jack/src/com/android/jack/transformations/request/AppendBefore.java
+++ b/jack/src/com/android/jack/transformations/request/AppendBefore.java
@@ -50,21 +50,24 @@
 
   @Override
   public void apply() throws UnsupportedOperationException {
-    if (existingNode.getParent() == null) {
+    final JNode existingNodeParent = existingNode.getParent();
+    if (existingNodeParent == null) {
       throw new UnsupportedOperationException();
     }
-    existingNode.getParent().insertBefore(existingNode, newNode);
+    existingNodeParent.insertBefore(existingNode, newNode);
   }
 
   @Override
   @Nonnull
   public String toString() {
+    final JNode existingNodeParent = existingNode.getParent();
+    assert existingNodeParent != null;
     StringBuilder sb = new StringBuilder("Append ");
     sb.append(newNode.toSource());
     sb.append(" before ");
     sb.append(existingNode.toSource());
     sb.append(" in ");
-    sb.append(existingNode.getParent().toSource());
+    sb.append(existingNodeParent.toSource());
     return sb.toString();
   }
 
diff --git a/jack/src/com/android/jack/transformations/request/PrependAfter.java b/jack/src/com/android/jack/transformations/request/PrependAfter.java
index 1b49e46..32b7903 100644
--- a/jack/src/com/android/jack/transformations/request/PrependAfter.java
+++ b/jack/src/com/android/jack/transformations/request/PrependAfter.java
@@ -50,21 +50,24 @@
 
   @Override
   public void apply() throws UnsupportedOperationException {
-    if (existingNode.getParent() == null) {
+    final JNode existingNodeParent = existingNode.getParent();
+    if (existingNodeParent == null) {
       throw new UnsupportedOperationException();
     }
-    existingNode.getParent().insertAfter(existingNode, newNode);
+    existingNodeParent.insertAfter(existingNode, newNode);
   }
 
   @Override
   @Nonnull
   public String toString() {
+    final JNode existingNodeParent = existingNode.getParent();
+    assert existingNodeParent != null;
     StringBuilder sb = new StringBuilder("Prepend ");
     sb.append(newNode.toSource());
     sb.append(" after ");
     sb.append(existingNode.toSource());
     sb.append(" in ");
-    sb.append(existingNode.getParent().toSource());
+    sb.append(existingNodeParent.toSource());
     return sb.toString();
   }
 
diff --git a/jack/src/com/android/jack/transformations/request/PutNameValuePair.java b/jack/src/com/android/jack/transformations/request/PutNameValuePair.java
index 5c98e49..aef0557 100644
--- a/jack/src/com/android/jack/transformations/request/PutNameValuePair.java
+++ b/jack/src/com/android/jack/transformations/request/PutNameValuePair.java
@@ -18,6 +18,7 @@
 
 import com.android.jack.ir.ast.JAnnotation;
 import com.android.jack.ir.ast.JNameValuePair;
+import com.android.jack.ir.ast.JNode;
 
 import javax.annotation.Nonnull;
 
@@ -54,12 +55,14 @@
   @Override
   @Nonnull
   public String toString() {
+    final JNode annotationParent = annotation.getParent();
+    assert annotationParent != null;
     StringBuilder sb = new StringBuilder("Put ");
     sb.append(pair.toSource());
     sb.append(" in ");
     sb.append(annotation.toSource());
     sb.append(" on ");
-    sb.append(annotation.getParent().toSource());
+    sb.append(annotationParent.toSource());
     return sb.toString();
   }
 }
diff --git a/jack/src/com/android/jack/transformations/request/Remove.java b/jack/src/com/android/jack/transformations/request/Remove.java
index 6dd2ccb..61b9941 100644
--- a/jack/src/com/android/jack/transformations/request/Remove.java
+++ b/jack/src/com/android/jack/transformations/request/Remove.java
@@ -41,18 +41,21 @@
 
   @Override
   public void apply() throws UnsupportedOperationException {
-    if (node.getParent() == null) {
+    final JNode parent = node.getParent();
+    if (parent == null) {
       throw new UnsupportedOperationException();
     }
-    node.getParent().remove(node);
+    parent.remove(node);
   }
 
   @Override
   public String toString() {
+    final JNode parent = node.getParent();
+    assert parent != null;
     StringBuilder sb = new StringBuilder("Remove ");
     sb.append(node.toSource());
     sb.append(" in ");
-    sb.append(node.getParent().toSource());
+    sb.append(parent.toSource());
     return sb.toString();
   }
 
diff --git a/jack/src/com/android/jack/transformations/request/Replace.java b/jack/src/com/android/jack/transformations/request/Replace.java
index 57a2e4f..d766999 100644
--- a/jack/src/com/android/jack/transformations/request/Replace.java
+++ b/jack/src/com/android/jack/transformations/request/Replace.java
@@ -48,21 +48,24 @@
 
   @Override
   public void apply() throws UnsupportedOperationException {
-    if (existingNode.getParent() == null) {
+    final JNode existingNodeParent = existingNode.getParent();
+    if (existingNodeParent == null) {
       throw new UnsupportedOperationException();
     }
-    existingNode.getParent().replace(existingNode, newNode);
+    existingNodeParent.replace(existingNode, newNode);
   }
 
   @Override
   @Nonnull
   public String toString() {
+    final JNode existingNodeParent = existingNode.getParent();
+    assert existingNodeParent != null;
     StringBuilder sb = new StringBuilder("Replace ");
     sb.append(existingNode.toSource());
     sb.append(" with ");
     sb.append(newNode.toSource());
     sb.append(" in ");
-    sb.append(existingNode.getParent().toSource());
+    sb.append(existingNodeParent.toSource());
     return sb.toString();
   }
 }
diff --git a/jack/src/com/android/jack/transformations/threeaddresscode/ThreeAddressCodeChecker.java b/jack/src/com/android/jack/transformations/threeaddresscode/ThreeAddressCodeChecker.java
index e138738..cff840f 100644
--- a/jack/src/com/android/jack/transformations/threeaddresscode/ThreeAddressCodeChecker.java
+++ b/jack/src/com/android/jack/transformations/threeaddresscode/ThreeAddressCodeChecker.java
@@ -26,6 +26,7 @@
 import com.android.jack.ir.ast.JLocalRef;
 import com.android.jack.ir.ast.JMethod;
 import com.android.jack.ir.ast.JMethodCall;
+import com.android.jack.ir.ast.JNode;
 import com.android.jack.ir.ast.JParameterRef;
 import com.android.jack.ir.ast.JVisitor;
 import com.android.jack.transformations.SanityChecks;
@@ -74,7 +75,9 @@
     }
 
     private static void throwError(@Nonnull JExpression expr) {
-      throw new AssertionError(expr.getParent().toSource() + " is not three address code.");
+      final JNode parent = expr.getParent();
+      assert parent != null;
+      throw new AssertionError(parent.toSource() + " is not three address code.");
     }
 
     private boolean isValidExpressionForTac(@Nonnull JExpression expr) {
diff --git a/jack/tests/com/android/jack/AllUnitTests.java b/jack/tests/com/android/jack/AllUnitTests.java
index 9042487..b0af5fb 100644
--- a/jack/tests/com/android/jack/AllUnitTests.java
+++ b/jack/tests/com/android/jack/AllUnitTests.java
@@ -20,7 +20,7 @@
 import com.android.jack.ir.ast.JDefinedInterfaceTest;
 import com.android.jack.ir.ast.MarkerCollectorTest;
 import com.android.jack.ir.impl.ReferenceMapperTest;
-import com.android.jack.jayce.v0002.io.EscapeStringTest;
+import com.android.jack.jayce.v0004.io.EscapeStringTest;
 import com.android.jack.optimizations.ExpressionSimplifierTest;
 import com.android.jack.optimizations.tailrecursion.TailRecursionTest;
 import com.android.jack.preprocessor.PreProcessorTest;
diff --git a/jack/tests/com/android/jack/frontend/ClinitTest.java b/jack/tests/com/android/jack/frontend/ClinitTest.java
index 7f4fac0..f88725e 100644
--- a/jack/tests/com/android/jack/frontend/ClinitTest.java
+++ b/jack/tests/com/android/jack/frontend/ClinitTest.java
@@ -36,9 +36,9 @@
 public class ClinitTest {
 
   public static final String CLASS_WITH_VARIABLE_INIT_BINARY_NAME
-    = "com/android/jack/clinit/jack/ClInitWithVariableInit";
+    = "com/android/jack/clinit/test001/jack/ClInitWithVariableInit";
   public static final String CLASS_BINARY_NAME
-    = "com/android/jack/clinit/jack/ClInit";
+    = "com/android/jack/clinit/test001/jack/ClInit";
 
   @After
   public void tearDown() {
diff --git a/jack/tests/com/android/jack/jayce/v0003/io/EscapeStringTest.java b/jack/tests/com/android/jack/jayce/v0003/io/EscapeStringTest.java
deleted file mode 100644
index 8ee4e46..0000000
--- a/jack/tests/com/android/jack/jayce/v0003/io/EscapeStringTest.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.jack.jayce.v0003.io;
-
-import com.android.jack.IllegalOptionsException;
-import com.android.jack.Options;
-import com.android.jack.TestTools;
-import com.android.sched.util.RunnableHooks;
-import com.android.sched.util.config.ConfigurationException;
-import com.android.sched.util.config.ThreadConfig;
-import com.android.sched.util.file.CannotChangePermissionException;
-import com.android.sched.util.file.CannotCreateFileException;
-
-import junit.framework.Assert;
-
-import org.junit.Test;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-
-import javax.annotation.Nonnull;
-
-public class EscapeStringTest {
-
-  @Test
-  public void test001() throws Exception {
-    String string = "abcd";
-    Assert.assertEquals(string, writeStringAndReadItAfter(string));
-  }
-
-  @Test
-  public void test002() throws Exception {
-    String string = "ab\"cd\"";
-    Assert.assertEquals(string, writeStringAndReadItAfter(string));
-  }
-
-  @Test
-  public void test003() throws Exception {
-    String string = "ab'cd'";
-    Assert.assertEquals(string, writeStringAndReadItAfter(string));
-  }
-
-  @Test
-  public void test004() throws Exception {
-    String string = "ab\tcd";
-    Assert.assertEquals(string, writeStringAndReadItAfter(string));
-  }
-
-  @Test
-  public void test005() throws Exception {
-    String string = "ab\rcd";
-    Assert.assertEquals(string, writeStringAndReadItAfter(string));
-  }
-
-  @Test
-  public void test006() throws Exception {
-    String string = "ab\ncd";
-    Assert.assertEquals(string, writeStringAndReadItAfter(string));
-  }
-
-  @Test
-  public void test007() throws Exception {
-    String string = "ab\bcd";
-    Assert.assertEquals(string, writeStringAndReadItAfter(string));
-  }
-
-  @Test
-  public void test008() throws Exception {
-    String string = "ab\fcd";
-    Assert.assertEquals(string, writeStringAndReadItAfter(string));
-  }
-
-  @Test
-  public void test009() throws Exception {
-    String string = "\"'\\";
-    Assert.assertEquals(string, writeStringAndReadItAfter(string));
-  }
-
-  @Test
-  public void test010() throws Exception {
-    String string = "[ab]\\b\\\\o5\\xF9\\u1E7B\\t\\n\\f\\r\\a\\e[yz]";
-    Assert.assertEquals(string, writeStringAndReadItAfter(string));
-  }
-
-  @Test
-  public void test011() throws Exception {
-    String string = "\uD9A0\uDE81*abc";
-    Assert.assertEquals(string, writeStringAndReadItAfter(string));
-  }
-
-  @Test
-  public void test012() throws Exception {
-    String string = "\uDE81|\uD9A0\uDE81|\uD9A0";
-    Assert.assertEquals(string, writeStringAndReadItAfter(string));
-  }
-
-  @Nonnull
-  private String writeStringAndReadItAfter(@Nonnull String stringToWrite) throws IOException,
-      IllegalOptionsException, CannotCreateFileException, CannotChangePermissionException {
-    File tmp = TestTools.createTempFile("tmp", "");
-    RunnableHooks hooks = new RunnableHooks();
-    try {
-      Options options = new Options();
-      options.checkValidity(hooks);
-      options.getConfigBuilder(hooks).getCodecContext().setDebug();
-      ThreadConfig.setConfig(options.getConfig());
-      FileOutputStream fos = new FileOutputStream(tmp);
-      JayceInternalWriterImpl jw = new JayceInternalWriterImpl(fos);
-      jw.writeString(stringToWrite);
-      jw.close();
-      FileInputStream fis = new FileInputStream(tmp);
-      Tokenizer t = new Tokenizer(fis);
-      String result = t.readString();
-      fis.close();
-      assert result != null;
-      return result;
-    } catch (ConfigurationException e) {
-      throw new AssertionError(e);
-    } finally {
-      ThreadConfig.unsetConfig();
-      hooks.runHooks();
-    }
-  }
-}
diff --git a/jack/tests/com/android/jack/jayce/v0002/io/EscapeStringTest.java b/jack/tests/com/android/jack/jayce/v0004/io/EscapeStringTest.java
similarity index 90%
rename from jack/tests/com/android/jack/jayce/v0002/io/EscapeStringTest.java
rename to jack/tests/com/android/jack/jayce/v0004/io/EscapeStringTest.java
index 4900be2..011b30f 100644
--- a/jack/tests/com/android/jack/jayce/v0002/io/EscapeStringTest.java
+++ b/jack/tests/com/android/jack/jayce/v0004/io/EscapeStringTest.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package com.android.jack.jayce.v0002.io;
+package com.android.jack.jayce.v0004.io;
 
 import com.android.jack.IllegalOptionsException;
 import com.android.jack.Options;
@@ -23,7 +23,11 @@
 import com.android.sched.util.config.ConfigurationException;
 import com.android.sched.util.config.ThreadConfig;
 import com.android.sched.util.file.CannotChangePermissionException;
+import com.android.sched.util.file.CannotCloseException;
 import com.android.sched.util.file.CannotCreateFileException;
+import com.android.sched.util.location.FileLocation;
+import com.android.sched.util.location.HasLocation;
+import com.android.sched.util.location.Location;
 
 import junit.framework.Assert;
 
@@ -113,7 +117,7 @@
   @Nonnull
   private String writeStringAndReadItAfter(@Nonnull String stringToWrite)
       throws CannotCreateFileException, CannotChangePermissionException, IllegalOptionsException,
-      IOException {
+      CannotCloseException, IOException {
     File tmp = TestTools.createTempFile("tmp", "");
     RunnableHooks hooks = new RunnableHooks();
     try {
@@ -122,7 +126,13 @@
       options.getConfigBuilder(hooks).getCodecContext().setDebug();
       ThreadConfig.setConfig(options.getConfig());
       FileOutputStream fos = new FileOutputStream(tmp);
-      JayceInternalWriterImpl jw = new JayceInternalWriterImpl(fos);
+      JayceInternalWriterImpl jw = new JayceInternalWriterImpl(fos, new HasLocation(){
+        @Override
+        @Nonnull
+        public Location getLocation() {
+          return new FileLocation(tmp);
+        }
+      });
       jw.writeString(stringToWrite);
       jw.close();
       FileInputStream fis = new FileInputStream(tmp);
diff --git a/jill/src/com/android/jill/frontend/java/ClassNodeWriter.java b/jill/src/com/android/jill/frontend/java/ClassNodeWriter.java
index 60d56ba..1114df4 100644
--- a/jill/src/com/android/jill/frontend/java/ClassNodeWriter.java
+++ b/jill/src/com/android/jill/frontend/java/ClassNodeWriter.java
@@ -154,7 +154,6 @@
     writeAnnotationMethods(cn);
     annotWriter.writeAnnotations(cn);
     writer.writeOpenNodeList(); // Markers
-    writeGenericSignatureMarker(cn);
     writeSourceNameMarker(cn);
     writer.writeCloseNodeList();
     sourceInfoWriter.writeDebugEnd(cn);
diff --git a/jill/src/com/android/jill/frontend/java/JavaTransformer.java b/jill/src/com/android/jill/frontend/java/JavaTransformer.java
index fcfc082..5fe7cec 100644
--- a/jill/src/com/android/jill/frontend/java/JavaTransformer.java
+++ b/jill/src/com/android/jill/frontend/java/JavaTransformer.java
@@ -50,6 +50,7 @@
 import com.android.sched.vfs.VFS;
 import com.android.sched.vfs.VPath;
 import com.android.sched.vfs.WriteZipFS;
+import com.android.sched.vfs.WrongVFSTypeException;
 
 import org.objectweb.asm.ClassReader;
 import org.objectweb.asm.tree.ClassNode;
@@ -200,9 +201,15 @@
     Service service = mdCodec.parseString(new CodecContext(), "SHA");
 
     try {
-      return new GenericOutputVFS(new DeflateFS(new MessageDigestFS(
-          new PrefixedFS(baseVFS, new VPath("jayce", '/')), new MessageDigestFactory(service))));
-    } catch (NotDirectoryException | CannotCreateFileException | BadVFSFormatException e) {
+      return new GenericOutputVFS(
+          new DeflateFS(
+              new MessageDigestFS(
+                  new PrefixedFS(baseVFS, new VPath("jayce", '/'), Existence.MAY_EXIST),
+                  new MessageDigestFactory(service))));
+    } catch (NotDirectoryException
+        | CannotCreateFileException
+        | BadVFSFormatException
+        | WrongVFSTypeException e) {
       throw new JillException(e);
     }
   }
diff --git a/jill/src/com/android/jill/frontend/java/MethodBodyWriter.java b/jill/src/com/android/jill/frontend/java/MethodBodyWriter.java
index 401e63a..c4203ac 100644
--- a/jill/src/com/android/jill/frontend/java/MethodBodyWriter.java
+++ b/jill/src/com/android/jill/frontend/java/MethodBodyWriter.java
@@ -262,7 +262,9 @@
   }
 
   public void write() throws IOException {
-    if (AsmHelper.isAnnotation(currentClass)) {
+    if (AsmHelper.isAnnotation(currentClass)
+        && AsmHelper.isAbstract(currentMethod)
+        && (currentMethod.parameters == null || currentMethod.parameters.isEmpty())) {
       writeAnnotationMethod();
     } else if (AsmHelper.isConstructor(currentMethod)) {
       writeConstructor();
@@ -281,7 +283,7 @@
     annotWriter.writeAnnotations(currentMethod);
     writeMethodBody();
     writer.writeOpenNodeList(); // Markers
-    writeOriginalTypeInfoMarker();
+    writeGenericSignatureMarker();
     writeThrownExceptionMarker();
     writer.writeCloseNodeList();
     sourceInfoWriter.writeDebugEnd(currentClass, endLine);
@@ -342,7 +344,7 @@
     annotWriter.writeAnnotations(currentMethod);
     writeMethodBody();
     writer.writeOpenNodeList(); // Markers
-    writeOriginalTypeInfoMarker();
+    writeGenericSignatureMarker();
     writeThrownExceptionMarker();
     writer.writeCloseNodeList();
     sourceInfoWriter.writeDebugEnd(currentClass, endLine);
@@ -364,20 +366,18 @@
       writer.writeNull();
     }
     writer.writeOpenNodeList(); // Markers
-    writeOriginalTypeInfoMarker();
+    writeGenericSignatureMarker();
     writer.writeCloseNodeList();
     sourceInfoWriter.writeDebugEnd(currentClass, endLine);
     writer.writeClose();
   }
 
-  private void writeOriginalTypeInfoMarker() throws IOException {
+  private void writeGenericSignatureMarker() throws IOException {
     if (AsmHelper.hasValidGenericSignature(currentMethod)) {
       writer.writeKeyword(Token.GENERIC_SIGNATURE);
       writer.writeOpen();
       writer.writeString(currentMethod.signature);
       writer.writeClose();
-    } else {
-      writer.writeNull();
     }
   }
 
@@ -453,7 +453,7 @@
         caughtType = Type.getType(Throwable.class);
       }
       String id = "-e_" + (unusedVarCount++);
-      declaringCatchVariable = new Variable(id, id, caughtType, null);
+      declaringCatchVariable = new Variable(id, id, caughtType);
       catchBlockToCatchedVariable.put(tryCatchNode, declaringCatchVariable);
     }
   }
@@ -1118,7 +1118,7 @@
       @Nonnull IntInsnNode intInsn) throws IOException {
     if (intInsn.getOpcode() == BIPUSH || intInsn.getOpcode() == SIPUSH) {
       varWithCstValue.put(getStackVariable(nextFrame, TOP_OF_STACK),
-          new Integer(intInsn.operand));
+          Integer.valueOf(intInsn.operand));
       return;
     }
 
@@ -1741,7 +1741,7 @@
       case ICONST_5: {
         assert nextFrame != null;
         varWithCstValue.put(getStackVariable(nextFrame, TOP_OF_STACK),
-            new Integer(insn.getOpcode() - ICONST_0));
+            Integer.valueOf(insn.getOpcode() - ICONST_0));
         break;
       }
       case ACONST_NULL: {
@@ -1753,7 +1753,7 @@
       case LCONST_1: {
         assert nextFrame != null;
         varWithCstValue.put(getStackVariable(nextFrame, TOP_OF_STACK),
-            new Long(insn.getOpcode() - LCONST_0));
+            Long.valueOf(insn.getOpcode() - LCONST_0));
         break;
       }
       case FCONST_0:
@@ -2182,6 +2182,7 @@
           // Result of comparison must be pop
           cmpOperands.remove(getStackVariable(frame, TOP_OF_STACK));
         }
+        removeStackVariableConstant(frame, TOP_OF_STACK);
         break;
       }
       case NOP:
@@ -2197,6 +2198,10 @@
             // Result of comparison must be pop
             cmpOperands.remove(getStackVariable(frame, TOP_OF_STACK - 1));
           }
+          removeStackVariableConstant(frame, TOP_OF_STACK);
+          removeStackVariableConstant(frame, TOP_OF_STACK - 1);
+        } else {
+          removeStackVariableConstant(frame, TOP_OF_STACK);
         }
         break;
       }
@@ -2728,15 +2733,26 @@
   private void writeDupX1(@Nonnull Frame<BasicValue> frame, @Nonnull Frame<BasicValue> nextFrame)
       throws IOException {
     writeAssign(frame, TOP_OF_STACK, nextFrame, TOP_OF_STACK);
+    removeStackVariableConstant(frame, TOP_OF_STACK);
     writeAssign(frame, TOP_OF_STACK - 1, nextFrame, TOP_OF_STACK - 1);
+    removeStackVariableConstant(frame, TOP_OF_STACK - 1);
     writeAssign(nextFrame, TOP_OF_STACK, nextFrame, TOP_OF_STACK - 2);
   }
 
+  private void removeStackVariableConstant(@Nonnull Frame<BasicValue> frame, int stackIdx) {
+    // Stack level will be erased by an assignment thus it is no longer a constant, it could become
+    // one again if the stack variable read is a constant
+    varWithCstValue.remove(getStackVariable(frame, stackIdx));
+  }
+
   private void writeDupX2(@Nonnull Frame<BasicValue> frame, @Nonnull Frame<BasicValue> nextFrame)
       throws IOException {
     writeAssign(frame, TOP_OF_STACK, nextFrame, TOP_OF_STACK);
+    removeStackVariableConstant(frame, TOP_OF_STACK);
     writeAssign(frame, TOP_OF_STACK - 1, nextFrame, TOP_OF_STACK - 1);
+    removeStackVariableConstant(frame, TOP_OF_STACK - 1);
     writeAssign(frame, TOP_OF_STACK - 2, nextFrame, TOP_OF_STACK - 2);
+    removeStackVariableConstant(frame, TOP_OF_STACK - 2);
     writeAssign(nextFrame, TOP_OF_STACK, nextFrame, TOP_OF_STACK - 3);
   }
 
@@ -2767,8 +2783,11 @@
   private void writeDup2X1(@Nonnull Frame<BasicValue> frame, @Nonnull Frame<BasicValue> nextFrame)
       throws IOException {
     writeAssign(frame, TOP_OF_STACK, nextFrame, TOP_OF_STACK);
+    removeStackVariableConstant(frame, TOP_OF_STACK);
     writeAssign(frame, TOP_OF_STACK - 1, nextFrame, TOP_OF_STACK - 1);
+    removeStackVariableConstant(frame, TOP_OF_STACK - 1);
     writeAssign(frame, TOP_OF_STACK - 2, nextFrame, TOP_OF_STACK - 2);
+    removeStackVariableConstant(frame, TOP_OF_STACK - 2);
     writeAssign(nextFrame, TOP_OF_STACK, nextFrame, TOP_OF_STACK - 3);
     writeAssign(nextFrame, TOP_OF_STACK - 1, nextFrame, TOP_OF_STACK - 4);
   }
@@ -2776,9 +2795,13 @@
   private void writeDup2X2(@Nonnull Frame<BasicValue> frame, @Nonnull Frame<BasicValue> nextFrame)
       throws IOException {
     writeAssign(frame, TOP_OF_STACK, nextFrame, TOP_OF_STACK);
+    removeStackVariableConstant(frame, TOP_OF_STACK);
     writeAssign(frame, TOP_OF_STACK - 1, nextFrame, TOP_OF_STACK - 1);
+    removeStackVariableConstant(frame, TOP_OF_STACK - 1);
     writeAssign(frame, TOP_OF_STACK - 2, nextFrame, TOP_OF_STACK - 2);
+    removeStackVariableConstant(frame, TOP_OF_STACK - 2);
     writeAssign(frame, TOP_OF_STACK - 3, nextFrame, TOP_OF_STACK - 3);
+    removeStackVariableConstant(frame, TOP_OF_STACK - 3);
     writeAssign(nextFrame, TOP_OF_STACK, nextFrame, TOP_OF_STACK - 4);
     writeAssign(nextFrame, TOP_OF_STACK - 1, nextFrame, TOP_OF_STACK - 5);
   }
@@ -2887,7 +2910,7 @@
   private Variable getTempVarFromTopOfStackMinus1(@Nonnull Frame<BasicValue> frame) {
     Variable topOfStackBeforeInst = getStackVariable(frame, TOP_OF_STACK - 1);
     String tmpVarId = "-swap_tmp_" + typeToUntypedDesc(topOfStackBeforeInst.getType());
-    Variable tmpVariable = getVariable(tmpVarId, tmpVarId, topOfStackBeforeInst.getType(), null);
+    Variable tmpVariable = getVariable(tmpVarId, tmpVarId, topOfStackBeforeInst.getType());
     return tmpVariable;
   }
 
@@ -3056,17 +3079,16 @@
     BasicValue bv = frame.getStack(stackHeight);
     assert bv != BasicValue.UNINITIALIZED_VALUE;
     String id = "-s_" + stackHeight + "_" + typeToUntypedDesc(bv.getType());
-    Variable variable = getVariable(id, id, typeToUntyped(bv.getType()), null);
+    Variable variable = getVariable(id, id, typeToUntyped(bv.getType()));
     return variable;
   }
 
   @Nonnull
-  private Variable getVariable(@Nonnull String id, @Nonnull String name, @Nonnull Type type,
-      @CheckForNull String signature) {
+  private Variable getVariable(@Nonnull String id, @Nonnull String name, @Nonnull Type type) {
     Variable var = nameToVar.get(id);
 
     if (var == null) {
-      var = new Variable(id, name, type, signature);
+      var = new Variable(id, name, type);
       nameToVar.put(id, var);
     }
 
@@ -3075,7 +3097,7 @@
 
   @Nonnull
   private Variable getVariableWithLocalIndex(@Nonnegative int localIdx, @Nonnull String id,
-      @Nonnull String name, @Nonnull Type type, @CheckForNull String signature, int modifier) {
+      @CheckForNull String name, @Nonnull Type type, @CheckForNull String signature, int modifier) {
     Variable var = nameToVar.get(id);
 
     if (var == null) {
diff --git a/jill/src/com/android/jill/frontend/java/Variable.java b/jill/src/com/android/jill/frontend/java/Variable.java
index 04619ed..1bad9a1 100644
--- a/jill/src/com/android/jill/frontend/java/Variable.java
+++ b/jill/src/com/android/jill/frontend/java/Variable.java
@@ -51,9 +51,8 @@
   /* Index of local variable, -1 means the variable does not represent a local variable. */
   private final int localIdx;
 
-  public Variable(@Nonnull String id, @CheckForNull String name, @Nonnull Type type,
-      @CheckForNull String signature) {
-    this(id, name, type, signature, NO_LOCAL_IDX, Opcodes.ACC_SYNTHETIC);
+  public Variable(@Nonnull String id, @CheckForNull String name, @Nonnull Type type) {
+    this(id, name, type, null, NO_LOCAL_IDX, Opcodes.ACC_SYNTHETIC);
   }
 
   public Variable(@Nonnull String id, @CheckForNull String name, @Nonnull Type type,
diff --git a/sched/build.gradle b/sched/build.gradle
index fa55937..691558c 100644
--- a/sched/build.gradle
+++ b/sched/build.gradle
@@ -96,6 +96,7 @@
           java {
               srcDirs = ['../src']
               include 'com/android/sched/build/*'
+              include 'com/android/sched/util/findbugs/*'
           }
           resources {
               srcDir '../rsc-ap'
diff --git a/sched/src/com/android/sched/build/SchedAnnotationProcessor.java b/sched/src/com/android/sched/build/SchedAnnotationProcessor.java
index 2f10208..64802a0 100644
--- a/sched/src/com/android/sched/build/SchedAnnotationProcessor.java
+++ b/sched/src/com/android/sched/build/SchedAnnotationProcessor.java
@@ -16,6 +16,8 @@
 
 package com.android.sched.build;
 
+import com.android.sched.util.findbugs.SuppressFBWarnings;
+
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
@@ -99,9 +101,10 @@
     FILTER("com.android.sched.schedulable.ComponentFilter") {
       @Override
       @Nonnull
+      @SuppressFBWarnings("NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE") // probably a FindBugs bug
       public TypeMirror getTypeMirror() throws AbortException {
         return env.getTypeUtils().getDeclaredType(getTypeElement(),
-               env.getTypeUtils().getWildcardType(null, null));
+            env.getTypeUtils().getWildcardType(null, null));
       }
     },
     PRODUCTION("com.android.sched.item.Production"),
@@ -145,6 +148,7 @@
       if (typeElement == null) {
         typeElement = env.getElementUtils().getTypeElement(getCanonicalName(fqName));
         if (typeElement == null) {
+          assert env != null;
           env.getMessager().printMessage(Kind.ERROR, "Can not get element type '" + fqName + "'");
           throw new AbortException();
         }
diff --git a/sched/src/com/android/sched/util/file/AbstractStreamFile.java b/sched/src/com/android/sched/util/file/AbstractStreamFile.java
index 580e6c9..93f9096 100644
--- a/sched/src/com/android/sched/util/file/AbstractStreamFile.java
+++ b/sched/src/com/android/sched/util/file/AbstractStreamFile.java
@@ -33,7 +33,7 @@
 /**
  * Abstract class representing a stream from a file path or a standard input/output.
  */
-public abstract class AbstractStreamFile extends FileOrDirectory {
+public abstract class AbstractStreamFile extends FileOrDirectory implements Statusful {
   @Nonnull
   private static final Logger  logger = LoggerFactory.getLogger();
   @CheckForNull
@@ -141,6 +141,7 @@
   }
 
   @Nonnull
+  @Override
   public final synchronized StreamFileStatus getStatus() {
     if (!wasUsed) {
       return StreamFileStatus.NOT_USED;
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java b/sched/src/com/android/sched/util/file/Statusful.java
similarity index 68%
copy from jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
copy to sched/src/com/android/sched/util/file/Statusful.java
index 680f9cf..d782913 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInit.java
+++ b/sched/src/com/android/sched/util/file/Statusful.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 The Android Open Source Project
+ * Copyright (C) 2017 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,8 +14,15 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.sched.util.file;
 
-public class ClInit {
+import javax.annotation.Nonnull;
 
+/**
+ * An object that can return a {@link StreamFileStatus}.
+ */
+public interface Statusful {
+
+  @Nonnull
+  StreamFileStatus getStatus();
 }
diff --git a/sched/src/com/android/sched/vfs/CachedDirectFS.java b/sched/src/com/android/sched/vfs/CachedDirectFS.java
index 6ec09b6..8a27c35 100644
--- a/sched/src/com/android/sched/vfs/CachedDirectFS.java
+++ b/sched/src/com/android/sched/vfs/CachedDirectFS.java
@@ -26,6 +26,8 @@
 import com.android.sched.util.file.NoSuchFileException;
 import com.android.sched.util.file.NotDirectoryException;
 import com.android.sched.util.file.NotFileException;
+import com.android.sched.util.file.Statusful;
+import com.android.sched.util.file.StreamFileStatus;
 import com.android.sched.util.file.WrongPermissionException;
 import com.android.sched.util.location.DirectoryLocation;
 import com.android.sched.util.location.FileLocation;
@@ -63,7 +65,8 @@
  * A {@link VFS} implementation backed by a real file system, but where directories are cached in
  * memory.
  */
-public class CachedDirectFS extends BaseVFS<CachedParentVDir, CachedParentVFile> implements VFS {
+public class CachedDirectFS extends BaseVFS<CachedParentVDir, CachedParentVFile>
+    implements VFS, Statusful {
 
   static class CachedParentVDir extends InMemoryVDir {
 
@@ -160,6 +163,8 @@
   @CheckForNull
   private String infoString;
 
+  private boolean used = false;
+
 
   public CachedDirectFS(@Nonnull Directory dir, int permissions) {
     this.dir = dir;
@@ -253,6 +258,9 @@
 
   @Override
   public CachedParentVDir getRootDir() {
+
+    used = true;
+
     return root;
   }
 
@@ -566,6 +574,18 @@
   }
 
   @Override
+  @Nonnull
+  public StreamFileStatus getStatus() {
+    if (!used) {
+      return StreamFileStatus.NOT_USED;
+    } else if (closed) {
+      return StreamFileStatus.CLOSED;
+    } else {
+      return StreamFileStatus.OPEN;
+    }
+  }
+
+  @Override
   @CheckForNull
   public String getInfoString() {
     return infoString;
diff --git a/sched/src/com/android/sched/vfs/CaseInsensitiveFS.java b/sched/src/com/android/sched/vfs/CaseInsensitiveFS.java
index 046a106..01ff002 100644
--- a/sched/src/com/android/sched/vfs/CaseInsensitiveFS.java
+++ b/sched/src/com/android/sched/vfs/CaseInsensitiveFS.java
@@ -32,6 +32,8 @@
 import com.android.sched.util.file.NoSuchFileException;
 import com.android.sched.util.file.NotDirectoryException;
 import com.android.sched.util.file.NotFileException;
+import com.android.sched.util.file.Statusful;
+import com.android.sched.util.file.StreamFileStatus;
 import com.android.sched.util.file.WrongPermissionException;
 import com.android.sched.util.location.ColumnAndLineLocation;
 import com.android.sched.util.location.Location;
@@ -64,7 +66,7 @@
  */
 @HasKeyId
 public class CaseInsensitiveFS extends BaseVFS<CaseInsensitiveVDir, CaseInsensitiveVFile> implements
-    VFS {
+    VFS, Statusful {
   static final String INDEX_NAME = "index";
   static final String DEBUG_NAME = "index.dbg";
 
@@ -205,6 +207,8 @@
   @Nonnull
   private final BaseVFS<BaseVDir, BaseVFile> vfs;
 
+  private boolean used = false;
+
   public CaseInsensitiveFS(@Nonnull VFS vfs) throws BadVFSFormatException {
     this(vfs, ThreadConfig.get(NB_GROUP).intValue(), ThreadConfig.get(SZ_GROUP).intValue(),
         ThreadConfig.get(ALGO), ThreadConfig.get(DEBUG).booleanValue());
@@ -341,6 +345,8 @@
   @Override
   @Nonnull
   public CaseInsensitiveVDir getRootDir() {
+    used = true;
+
     return root;
   }
 
@@ -734,6 +740,18 @@
   }
 
   @Override
+  @Nonnull
+  public StreamFileStatus getStatus() {
+    if (!used) {
+      return StreamFileStatus.NOT_USED;
+    } else if (closed) {
+      return StreamFileStatus.CLOSED;
+    } else {
+      return StreamFileStatus.OPEN;
+    }
+  }
+
+  @Override
   @CheckForNull
   public String getInfoString() {
     return vfs.getInfoString();
diff --git a/sched/src/com/android/sched/vfs/DeflateFS.java b/sched/src/com/android/sched/vfs/DeflateFS.java
index 90edda1..a6a5825 100644
--- a/sched/src/com/android/sched/vfs/DeflateFS.java
+++ b/sched/src/com/android/sched/vfs/DeflateFS.java
@@ -37,9 +37,7 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.Set;
-import java.util.zip.Deflater;
 import java.util.zip.DeflaterOutputStream;
-import java.util.zip.Inflater;
 import java.util.zip.InflaterInputStream;
 
 import javax.annotation.CheckForNull;
@@ -160,7 +158,7 @@
   @Override
   @Nonnull
   InputStream openRead(@Nonnull DeflateVFile file) throws WrongPermissionException {
-    return new InflaterInputStream(vfs.openRead(file.getWrappedFile()), new Inflater());
+    return new InflaterInputStream(vfs.openRead(file.getWrappedFile()));
   }
 
   @Override
@@ -173,7 +171,7 @@
   @Nonnull
   OutputStream openWrite(@Nonnull DeflateVFile file, boolean append)
       throws WrongPermissionException {
-    return new DeflaterOutputStream(vfs.openWrite(file.getWrappedFile(), append), new Deflater());
+    return new DeflaterOutputStream(vfs.openWrite(file.getWrappedFile(), append));
   }
 
   @Override
diff --git a/sched/src/com/android/sched/vfs/DirectFS.java b/sched/src/com/android/sched/vfs/DirectFS.java
index 41fa6f9..7abfff9 100644
--- a/sched/src/com/android/sched/vfs/DirectFS.java
+++ b/sched/src/com/android/sched/vfs/DirectFS.java
@@ -29,6 +29,8 @@
 import com.android.sched.util.file.NoSuchFileException;
 import com.android.sched.util.file.NotDirectoryException;
 import com.android.sched.util.file.NotFileException;
+import com.android.sched.util.file.Statusful;
+import com.android.sched.util.file.StreamFileStatus;
 import com.android.sched.util.file.WrongPermissionException;
 import com.android.sched.util.location.DirectoryLocation;
 import com.android.sched.util.location.FileLocation;
@@ -55,7 +57,7 @@
 /**
  * A {@link VFS} implementation backed by a real file system.
  */
-public class DirectFS extends BaseVFS<ParentVDir, ParentVFile> implements VFS {
+public class DirectFS extends BaseVFS<ParentVDir, ParentVFile> implements VFS, Statusful {
 
   @Nonnull
   private final Directory  dir;
@@ -66,6 +68,8 @@
   @CheckForNull
   private String infoString;
 
+  private boolean used = false;
+
   public DirectFS(@Nonnull Directory dir, int permissions) {
     this.dir = dir;
     this.root = new ParentVDir(this, "");
@@ -113,6 +117,9 @@
 
   @Override
   public ParentVDir getRootDir() {
+
+    used = true;
+
     return root;
   }
 
@@ -378,6 +385,18 @@
     return getPathFromDir(root, file);
   }
 
+  @Override
+  @Nonnull
+  public StreamFileStatus getStatus() {
+    if (!used) {
+      return StreamFileStatus.NOT_USED;
+    } else if (closed) {
+      return StreamFileStatus.CLOSED;
+    } else {
+      return StreamFileStatus.OPEN;
+    }
+  }
+
   public void setInfoString(@CheckForNull String infoString) {
     this.infoString = infoString;
   }
diff --git a/sched/src/com/android/sched/vfs/MessageDigestFS.java b/sched/src/com/android/sched/vfs/MessageDigestFS.java
index 4ebe981..7de3fe4 100644
--- a/sched/src/com/android/sched/vfs/MessageDigestFS.java
+++ b/sched/src/com/android/sched/vfs/MessageDigestFS.java
@@ -172,7 +172,7 @@
 
   @SuppressWarnings("unchecked")
   public MessageDigestFS(@Nonnull VFS vfs, @Nonnull MessageDigestFactory factory)
-      throws BadVFSFormatException {
+      throws BadVFSFormatException, WrongVFSTypeException {
     this.vfs = (BaseVFS<BaseVDir, BaseVFile>) vfs;
     this.mdFactory = factory;
 
@@ -184,7 +184,7 @@
     init();
   }
 
-  private void init() throws BadVFSFormatException {
+  private void init() throws BadVFSFormatException, WrongVFSTypeException {
     BaseVFile digestFile;
 
     try {
@@ -193,7 +193,7 @@
       throw new BadVFSFormatException(this, vfs.getLocation(), e);
     } catch (NoSuchFileException e) {
       if (!vfs.getRootDir().isEmpty()) {
-        throw new BadVFSFormatException(this, vfs.getLocation(), e);
+        throw new WrongVFSTypeException(vfs, vfs.getLocation(), getDescription(), e);
       }
 
       return;
diff --git a/sched/src/com/android/sched/vfs/PrefixedFS.java b/sched/src/com/android/sched/vfs/PrefixedFS.java
index d90cd0d..58da11d 100644
--- a/sched/src/com/android/sched/vfs/PrefixedFS.java
+++ b/sched/src/com/android/sched/vfs/PrefixedFS.java
@@ -19,6 +19,7 @@
 import com.android.sched.util.file.CannotCreateFileException;
 import com.android.sched.util.file.CannotDeleteFileException;
 import com.android.sched.util.file.CannotGetModificationTimeException;
+import com.android.sched.util.file.FileOrDirectory.Existence;
 import com.android.sched.util.file.NoSuchFileException;
 import com.android.sched.util.file.NotDirectoryException;
 import com.android.sched.util.file.NotFileException;
@@ -44,16 +45,22 @@
   private final BaseVDir rootDir;
 
   @SuppressWarnings("unchecked")
-  public PrefixedFS(@Nonnull VFS vfs, @Nonnull VPath prefix)
-      throws CannotCreateFileException, NotDirectoryException {
+  public PrefixedFS(@Nonnull VFS vfs, @Nonnull VPath prefix, @Nonnull Existence existence)
+      throws CannotCreateFileException, NotDirectoryException, WrongVFSTypeException {
     this.vfs = (BaseVFS<BaseVDir, BaseVFile>) vfs;
 
     BaseVDir rootDir;
-    // let's try to get the VDir before creating it because we not have write permissions.
     try {
       rootDir = this.vfs.getRootDir().getVDir(prefix);
+      if (existence == Existence.NOT_EXIST) {
+        throw new WrongVFSTypeException(vfs, vfs.getLocation(), getDescription());
+      }
     } catch (NoSuchFileException e) {
-      rootDir = this.vfs.getRootDir().createVDir(prefix);
+      if (existence == Existence.MUST_EXIST) {
+        throw new WrongVFSTypeException(vfs, vfs.getLocation(), getDescription(), e);
+      } else {
+        rootDir = this.vfs.getRootDir().createVDir(prefix);
+      }
     }
     this.rootDir = changeVFS(rootDir);
   }
diff --git a/sched/src/com/android/sched/vfs/ReadWriteZipFS.java b/sched/src/com/android/sched/vfs/ReadWriteZipFS.java
index 5a31f9d..2ac78bc 100644
--- a/sched/src/com/android/sched/vfs/ReadWriteZipFS.java
+++ b/sched/src/com/android/sched/vfs/ReadWriteZipFS.java
@@ -33,6 +33,8 @@
 import com.android.sched.util.file.NotDirectoryException;
 import com.android.sched.util.file.NotFileException;
 import com.android.sched.util.file.OutputZipFile;
+import com.android.sched.util.file.Statusful;
+import com.android.sched.util.file.StreamFileStatus;
 import com.android.sched.util.file.WrongPermissionException;
 import com.android.sched.util.location.DirectoryLocation;
 import com.android.sched.util.location.Location;
@@ -51,7 +53,7 @@
 /**
  * A {@link VFS} backed by a real filesystem directory, compressed into a zip archive when closed.
  */
-public class ReadWriteZipFS extends BaseVFS<BaseVDir, BaseVFile> implements VFS {
+public class ReadWriteZipFS extends BaseVFS<BaseVDir, BaseVFile> implements VFS, Statusful {
 
   @Nonnull
   private final VFSToVFSWrapper vfs;
@@ -273,4 +275,10 @@
   public String toString() {
     return "rwZipFS >> " + vfs.toString();
   }
+
+  @Override
+  @Nonnull
+  public StreamFileStatus getStatus() {
+    return ((Statusful) vfs.getWorkVFS()).getStatus();
+  }
 }
diff --git a/sched/src/com/android/sched/vfs/UnionVFS.java b/sched/src/com/android/sched/vfs/UnionVFS.java
index e3844f1..4a16e78 100644
--- a/sched/src/com/android/sched/vfs/UnionVFS.java
+++ b/sched/src/com/android/sched/vfs/UnionVFS.java
@@ -27,6 +27,8 @@
 import com.android.sched.util.file.NoSuchFileException;
 import com.android.sched.util.file.NotDirectoryException;
 import com.android.sched.util.file.NotFileException;
+import com.android.sched.util.file.Statusful;
+import com.android.sched.util.file.StreamFileStatus;
 import com.android.sched.util.file.WrongPermissionException;
 import com.android.sched.util.location.Location;
 import com.android.sched.vfs.UnionVFS.UnionVDir;
@@ -49,7 +51,7 @@
  * A {@link VFS} that acts as an ordered agglomerate of other VFS. Writing is done in the top VFS
  * only, if it is supported. The VFS are ordered according to their priority.
  */
-public class UnionVFS extends BaseVFS<UnionVDir, UnionVFile> implements VFS {
+public class UnionVFS extends BaseVFS<UnionVDir, UnionVFile> implements VFS, Statusful {
 
   /**
    * Only delete the VFile that is on top, do not delete those that are under.
@@ -217,6 +219,8 @@
 
   private final boolean writable;
 
+  private boolean used = false;
+
   public UnionVFS(@Nonnull List<VFS> vfsList) {
     assert !vfsList.isEmpty();
     this.vfsList = vfsList;
@@ -346,6 +350,8 @@
   @Override
   @Nonnull
   public UnionVDir getRootDir() {
+    used = true;
+
     return rootDir;
   }
 
@@ -649,6 +655,18 @@
   }
 
   @Override
+  @Nonnull
+  public StreamFileStatus getStatus() {
+    if (!used) {
+      return StreamFileStatus.NOT_USED;
+    } else if (closed) {
+      return StreamFileStatus.CLOSED;
+    } else {
+      return StreamFileStatus.OPEN;
+    }
+  }
+
+  @Override
   @CheckForNull
   public String getInfoString() {
     return vfsList.get(0).getInfoString();
diff --git a/sched/src/com/android/sched/vfs/VFSPropertyId.java b/sched/src/com/android/sched/vfs/VFSPropertyId.java
index 5dcf778..3858a30 100644
--- a/sched/src/com/android/sched/vfs/VFSPropertyId.java
+++ b/sched/src/com/android/sched/vfs/VFSPropertyId.java
@@ -23,6 +23,8 @@
 import com.android.sched.util.config.category.Category;
 import com.android.sched.util.config.expression.BooleanExpression;
 import com.android.sched.util.config.id.PropertyId;
+import com.android.sched.util.file.Statusful;
+import com.android.sched.util.file.StreamFileStatus;
 
 import javax.annotation.Nonnull;
 
@@ -90,7 +92,14 @@
         new ShutdownRunnable<VFS>() {
           @Override
           public void run(@Nonnull VFS vfs) {
-            if (!vfs.isClosed()) {
+            boolean open;
+            if (vfs instanceof Statusful) {
+              open = ((Statusful) vfs).getStatus() == StreamFileStatus.OPEN;
+            } else {
+              open = !vfs.isClosed();
+            }
+
+            if (open) {
               throw new AssertionError(
                   "VFS '"
                       + vfs.getDescription()
diff --git a/sched/src/com/android/sched/vfs/WrongVFSTypeException.java b/sched/src/com/android/sched/vfs/WrongVFSTypeException.java
new file mode 100644
index 0000000..b01f7ff
--- /dev/null
+++ b/sched/src/com/android/sched/vfs/WrongVFSTypeException.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.sched.vfs;
+
+import com.android.sched.util.file.SchedIOException;
+import com.android.sched.util.location.Location;
+
+import javax.annotation.Nonnull;
+
+/**
+ * {@link Exception} when a {@link VFS} does not match the expected VFS type, but may be a valid VFS
+ * of another type.
+ */
+public class WrongVFSTypeException extends SchedIOException {
+  private static final long serialVersionUID = 1L;
+
+  @Nonnull
+  private final VFS vfs;
+  @Nonnull
+  private final String expectedVfsDescription;
+
+  public WrongVFSTypeException(@Nonnull VFS vfs, @Nonnull Location location,
+      @Nonnull String expectedVfsDescription, @Nonnull Throwable cause) {
+    super(location, cause);
+    this.vfs = vfs;
+    this.expectedVfsDescription = expectedVfsDescription;
+  }
+
+  public WrongVFSTypeException(@Nonnull VFS vfs, @Nonnull Location location,
+      @Nonnull String expectedVfsDescription) {
+    super(location, null);
+    this.vfs = vfs;
+    this.expectedVfsDescription = expectedVfsDescription;
+  }
+
+  @Override
+  @Nonnull
+  protected String createMessage(@Nonnull String description) {
+    return "'"
+        + vfs.getDescription()
+        + "' VFS in "
+        + description
+        + " does not match the expected VFS type '"
+        + expectedVfsDescription
+        + "': "
+        + getCause().getMessage();
+  }
+}
diff --git a/sched/tests/com/android/sched/util/codec/AllTests.java b/sched/tests/com/android/sched/util/codec/AllTests.java
index db3d776..4409b61 100644
--- a/sched/tests/com/android/sched/util/codec/AllTests.java
+++ b/sched/tests/com/android/sched/util/codec/AllTests.java
@@ -21,6 +21,7 @@
 import org.junit.runners.Suite.SuiteClasses;
 
 @RunWith(Suite.class)
-@SuiteClasses(value = {DurationFormatterTest.class, QuantityFormatterTest.class})
-public class AllTests {
-}
+@SuiteClasses(
+  value = {DurationFormatterTest.class, QuantityFormatterTest.class, WriterFileCodecTest.class}
+)
+public class AllTests {}
diff --git a/sched/tests/com/android/sched/util/codec/WriterFileCodecTest.java b/sched/tests/com/android/sched/util/codec/WriterFileCodecTest.java
new file mode 100644
index 0000000..e5084a7
--- /dev/null
+++ b/sched/tests/com/android/sched/util/codec/WriterFileCodecTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.sched.util.codec;
+
+import com.android.sched.util.LineSeparator;
+import com.android.sched.util.file.CannotChangePermissionException;
+import com.android.sched.util.file.CannotCreateFileException;
+import com.android.sched.util.file.FileAlreadyExistsException;
+import com.android.sched.util.file.FileOrDirectory.ChangePermission;
+import com.android.sched.util.file.FileOrDirectory.Existence;
+import com.android.sched.util.file.NoSuchFileException;
+import com.android.sched.util.file.NotFileException;
+import com.android.sched.util.file.StandardOutputKind;
+import com.android.sched.util.file.WriterFile;
+import com.android.sched.util.file.WrongPermissionException;
+import com.android.sched.util.findbugs.SuppressFBWarnings;
+import com.android.sched.util.location.NoLocation;
+
+import junit.framework.Assert;
+
+import org.junit.Ignore;
+import org.junit.Test;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.Charset;
+
+public class WriterFileCodecTest {
+
+  @Test
+  public void testFormatValueStdout() {
+    String string =
+        new WriterFileCodec(Existence.MAY_EXIST)
+            .formatValue(new WriterFile(StandardOutputKind.STANDARD_OUTPUT));
+    Assert.assertEquals(FileCodec.STANDARD_IO_NAME, string);
+  }
+
+  @Test
+  public void testFormatValueStderr() {
+    String string =
+        new WriterFileCodec(Existence.MAY_EXIST)
+            .formatValue(new WriterFile(StandardOutputKind.STANDARD_ERROR));
+    Assert.assertEquals(FileCodec.STANDARD_ERROR_NAME, string);
+  }
+
+  @Test
+  @SuppressFBWarnings("RV_RETURN_VALUE_IGNORED_BAD_PRACTICE")
+  public void testFormatValueFile()
+      throws NotFileException, FileAlreadyExistsException, CannotCreateFileException,
+          CannotChangePermissionException, WrongPermissionException, NoSuchFileException,
+          IOException {
+    File file = File.createTempFile("sched-test", "tmp");
+    try {
+      String string =
+          new WriterFileCodec(Existence.MAY_EXIST)
+              .formatValue(new WriterFile(/* workingDirectory = */ null,
+                  file.getPath(),
+                  Charset.forName("UTF-8"),
+                  LineSeparator.SYSTEM,
+                  /* bufferSize = */ 4 * 1024,
+                  /* hooks = */ null,
+                  Existence.MAY_EXIST,
+                  ChangePermission.NOCHANGE,
+                  /* append = */ false));
+      Assert.assertEquals(file.getPath(), string);
+    } finally {
+      file.delete();
+    }
+  }
+
+  @Test
+  @Ignore // Known Schedlib bug
+  public void testFormatValueStreamOnly() {
+    ByteArrayOutputStream out = new ByteArrayOutputStream();
+    String string =
+        new WriterFileCodec(Existence.MAY_EXIST)
+            .formatValue(new WriterFile(out, new NoLocation()));
+    Assert.assertEquals("TBD", string);
+  }
+}
diff --git a/sched/tests/com/android/sched/vfs/VFSTest.java b/sched/tests/com/android/sched/vfs/VFSTest.java
index 27dd9bb..fd9b0c4 100644
--- a/sched/tests/com/android/sched/vfs/VFSTest.java
+++ b/sched/tests/com/android/sched/vfs/VFSTest.java
@@ -232,7 +232,8 @@
   public void testMessageDigestFS()
       throws CannotCreateFileException, WrongPermissionException, CannotChangePermissionException,
       NoSuchFileException, FileAlreadyExistsException, IOException, CannotDeleteFileException,
-      NotFileOrDirectoryException, CannotCloseException, BadVFSFormatException {
+      NotFileOrDirectoryException, CannotCloseException, BadVFSFormatException,
+      WrongVFSTypeException {
     File file = null;
     InputOutputVFS ioVFS1 = null;
     InputOutputVFS ioVFS2 = null;
@@ -285,7 +286,8 @@
   public void testMessageDigestFSWithCaseInsensitiveFS()
       throws CannotCreateFileException, WrongPermissionException, CannotChangePermissionException,
       NoSuchFileException, FileAlreadyExistsException, IOException, CannotDeleteFileException,
-      NotFileOrDirectoryException, CannotCloseException, BadVFSFormatException {
+      NotFileOrDirectoryException, CannotCloseException, BadVFSFormatException,
+      WrongVFSTypeException {
     File file = null;
     InputOutputVFS ioVFS1 = null;
     InputOutputVFS ioVFS2 = null;
@@ -344,8 +346,9 @@
   @Test
   public void testDeflatePrefixedCaseInsensitiveDirectFS()
       throws CannotCreateFileException, WrongPermissionException, CannotChangePermissionException,
-      NoSuchFileException, FileAlreadyExistsException, IOException, CannotDeleteFileException,
-      NotFileOrDirectoryException, CannotCloseException, BadVFSFormatException {
+          NoSuchFileException, FileAlreadyExistsException, IOException, CannotDeleteFileException,
+          NotFileOrDirectoryException, CannotCloseException, BadVFSFormatException,
+          WrongVFSTypeException {
     File file = null;
     InputOutputVFS ioVFS1 = null;
     InputOutputVFS ioVFS2 = null;
@@ -358,7 +361,8 @@
           Permission.READ | Permission.WRITE));
 
       ioVFS1 =
-          new GenericInputOutputVFS(new DeflateFS(new PrefixedFS(ciFS, new VPath("stuff", '/'))));
+          new GenericInputOutputVFS(
+              new DeflateFS(new PrefixedFS(ciFS, new VPath("stuff", '/'), Existence.MAY_EXIST)));
 
       testOutputVFS(ioVFS1);
       testDelete(ioVFS1);
@@ -371,7 +375,8 @@
           Permission.READ | Permission.WRITE));
 
       ioVFS2 =
-          new GenericInputOutputVFS(new DeflateFS(new PrefixedFS(ciFS2, new VPath("stuff", '/'))));
+          new GenericInputOutputVFS(
+              new DeflateFS(new PrefixedFS(ciFS2, new VPath("stuff", '/'), Existence.MUST_EXIST)));
       testInputVFS(ioVFS2);
       ciFS2.close();
 
@@ -389,7 +394,8 @@
   public void testMessageDigestFSWithCachedDirectFS()
       throws CannotCreateFileException, WrongPermissionException, CannotChangePermissionException,
       NoSuchFileException, FileAlreadyExistsException, IOException, CannotDeleteFileException,
-      NotFileOrDirectoryException, CannotCloseException, BadVFSFormatException {
+      NotFileOrDirectoryException, CannotCloseException, BadVFSFormatException,
+      WrongVFSTypeException {
     File file = null;
     InputOutputVFS ioVFS1 = null;
     InputOutputVFS ioVFS2 = null;
@@ -453,7 +459,7 @@
   public void testPrefixedFSWithDirectFS()
       throws CannotCreateFileException, WrongPermissionException, CannotChangePermissionException,
       NoSuchFileException, FileAlreadyExistsException, IOException, NotFileOrDirectoryException,
-      CannotDeleteFileException, CannotCloseException {
+      CannotDeleteFileException, CannotCloseException, WrongVFSTypeException {
     File file = null;
     InputOutputVFS ioVFS1 = null;
     InputOutputVFS ioVFS2 = null;
@@ -464,7 +470,7 @@
       ioVFS1 =
           new GenericInputOutputVFS(new PrefixedFS(new DirectFS(new Directory(path, null,
               Existence.MUST_EXIST, Permission.WRITE, ChangePermission.NOCHANGE), Permission.READ
-              | Permission.WRITE), new VPath("stuff", '/')));
+              | Permission.WRITE), new VPath("stuff", '/'), Existence.NOT_EXIST));
 
       testOutputVFS(ioVFS1);
       testDelete(ioVFS1);
@@ -475,7 +481,7 @@
       ioVFS2 =
           new GenericInputOutputVFS(new PrefixedFS(new DirectFS(new Directory(path, null,
               Existence.MUST_EXIST, Permission.WRITE, ChangePermission.NOCHANGE), Permission.READ
-              | Permission.WRITE), new VPath("stuff", '/')));
+              | Permission.WRITE), new VPath("stuff", '/'), Existence.MUST_EXIST));
       testInputVFS(ioVFS2);
       checkFileLocations(ioVFS2);
 
@@ -493,7 +499,7 @@
   public void testPrefixedFSWithZip()
       throws CannotCreateFileException, WrongPermissionException, CannotChangePermissionException,
       NoSuchFileException, FileAlreadyExistsException, IOException, ZipException,
-      NotFileOrDirectoryException, CannotCloseException {
+      NotFileOrDirectoryException, CannotCloseException, WrongVFSTypeException {
     String prefix = "stuff";
     File file = null;
     InputOutputVFS ioVFS1 = null;
@@ -505,7 +511,9 @@
       WriteZipFS writeZipFS = new WriteZipFS(new OutputZipFile(path, null, Existence.MAY_EXIST,
           ChangePermission.NOCHANGE, Compression.COMPRESSED));
 
-      ioVFS1 = new GenericInputOutputVFS(new PrefixedFS(writeZipFS, new VPath(prefix, '/')));
+      ioVFS1 =
+          new GenericInputOutputVFS(
+              new PrefixedFS(writeZipFS, new VPath(prefix, '/'), Existence.NOT_EXIST));
 
       testOutputVFS(ioVFS1);
       ioVFS1.close();
@@ -513,7 +521,9 @@
 
       ReadZipFS readZipFS = new ReadZipFS(new InputZipFile(path));
 
-      ioVFS2 = new GenericInputOutputVFS(new PrefixedFS(readZipFS, new VPath(prefix, '/')));
+      ioVFS2 =
+          new GenericInputOutputVFS(
+              new PrefixedFS(readZipFS, new VPath(prefix, '/'), Existence.MUST_EXIST));
       testInputVFS(ioVFS2);
       checkZipLocations(ioVFS2, prefix);
 
@@ -532,8 +542,9 @@
   @Test
   public void testPrefixedFSWithCaseInsensitiveFS()
       throws CannotCreateFileException, WrongPermissionException, CannotChangePermissionException,
-      NoSuchFileException, FileAlreadyExistsException, IOException, CannotDeleteFileException,
-      NotFileOrDirectoryException, CannotCloseException, BadVFSFormatException {
+          NoSuchFileException, FileAlreadyExistsException, IOException, CannotDeleteFileException,
+          NotFileOrDirectoryException, CannotCloseException, BadVFSFormatException,
+          WrongVFSTypeException {
     File file = null;
     InputOutputVFS ioVFS1 = null;
     InputOutputVFS ioVFS2 = null;
@@ -545,7 +556,9 @@
           Existence.MUST_EXIST, Permission.WRITE, ChangePermission.NOCHANGE),
           Permission.READ | Permission.WRITE));
 
-      ioVFS1 = new GenericInputOutputVFS(new PrefixedFS(ciFS, new VPath("stuff", '/')));
+      ioVFS1 =
+          new GenericInputOutputVFS(
+              new PrefixedFS(ciFS, new VPath("stuff", '/'), Existence.NOT_EXIST));
 
       testOutputVFS(ioVFS1);
       testDelete(ioVFS1);
@@ -557,7 +570,9 @@
           Existence.MUST_EXIST, Permission.WRITE, ChangePermission.NOCHANGE),
           Permission.READ | Permission.WRITE));
 
-      ioVFS2 = new GenericInputOutputVFS(new PrefixedFS(ciFS2, new VPath("stuff", '/')));
+      ioVFS2 =
+          new GenericInputOutputVFS(
+              new PrefixedFS(ciFS2, new VPath("stuff", '/'), Existence.MUST_EXIST));
       testInputVFS(ioVFS2);
       ciFS2.close();
 
@@ -574,8 +589,9 @@
   @Test
   public void testMessageDigestFSWithPrefixedFSAndCaseInsensitiveFS()
       throws CannotCreateFileException, WrongPermissionException, CannotChangePermissionException,
-      NoSuchFileException, FileAlreadyExistsException, IOException, CannotDeleteFileException,
-      NotFileOrDirectoryException, CannotCloseException, BadVFSFormatException {
+          NoSuchFileException, FileAlreadyExistsException, IOException, CannotDeleteFileException,
+          NotFileOrDirectoryException, CannotCloseException, BadVFSFormatException,
+          WrongVFSTypeException {
     File file = null;
     InputOutputVFS ioVFS1 = null;
     InputOutputVFS ioVFS2 = null;
@@ -598,7 +614,9 @@
               Existence.MUST_EXIST, Permission.WRITE, ChangePermission.NOCHANGE),
               Permission.READ | Permission.WRITE), new MessageDigestFactory(sha1)));
 
-      ioVFS1 = new GenericInputOutputVFS(new PrefixedFS(ciFS, new VPath("stuff", '/')));
+      ioVFS1 =
+          new GenericInputOutputVFS(
+              new PrefixedFS(ciFS, new VPath("stuff", '/'), Existence.NOT_EXIST));
 
       testOutputVFS(ioVFS1);
       testDelete(ioVFS1);
@@ -611,7 +629,9 @@
               Existence.MUST_EXIST, Permission.WRITE, ChangePermission.NOCHANGE),
               Permission.READ | Permission.WRITE), new MessageDigestFactory(sha1)));
 
-      ioVFS2 = new GenericInputOutputVFS(new PrefixedFS(ciFS2, new VPath("stuff", '/')));
+      ioVFS2 =
+          new GenericInputOutputVFS(
+              new PrefixedFS(ciFS2, new VPath("stuff", '/'), Existence.MUST_EXIST));
       testInputVFS(ioVFS2);
       ciFS2.close();
 
@@ -775,10 +795,11 @@
 
   @SuppressWarnings("resource")
   @Test
-  public void testIncrementalStack() throws IOException, CannotCreateFileException,
-      WrongPermissionException, CannotChangePermissionException, NoSuchFileException,
-      FileAlreadyExistsException, ZipException, NotFileOrDirectoryException,
-      CannotDeleteFileException, CannotCloseException, BadVFSFormatException {
+  public void testIncrementalStack()
+      throws IOException, CannotCreateFileException, WrongPermissionException,
+          CannotChangePermissionException, NoSuchFileException, FileAlreadyExistsException,
+          ZipException, NotFileOrDirectoryException, CannotDeleteFileException,
+          CannotCloseException, BadVFSFormatException, WrongVFSTypeException {
     final VPath prefix = new VPath("pre", '/');
     File inputZipFile = null;
     File outputZipFile = null;
@@ -796,7 +817,8 @@
                 ChangePermission.NOCHANGE, Compression.COMPRESSED),
             /* numGroups = */ 1, /* groupSize = */ 2, new MessageDigestFactory(getSha1Service()),
             /* debug = */ false);
-        InputOutputVFS ioVFS1 = new GenericInputOutputVFS(new PrefixedFS(writeZipVFS, prefix));
+        InputOutputVFS ioVFS1 =
+            new GenericInputOutputVFS(new PrefixedFS(writeZipVFS, prefix, Existence.NOT_EXIST));
         testOutputVFS(ioVFS1);
         ioVFS1.close();
         writeZipVFS.close();
@@ -806,7 +828,7 @@
       VFS ciVFS = new CaseInsensitiveFS(
           new CachedDirectFS(new Directory(dirPath, null, Existence.MUST_EXIST, Permission.WRITE,
               ChangePermission.NOCHANGE), Permission.READ | Permission.WRITE));
-      VFS prefixedFS1 = new PrefixedFS(ciVFS, prefix);
+      VFS prefixedFS1 = new PrefixedFS(ciVFS, prefix, Existence.NOT_EXIST);
       prefixedFS1.close();
 
       // create R/W output zip that uses as temp dir an UnionVFS between dir and read-only zip
@@ -822,7 +844,7 @@
         VFS unionVFS = new UnionVFS(vfsList);
         rwzfs.setWorkVFS(unionVFS);
       }
-      VFS prefixedFS = new PrefixedFS(rwzfs, prefix);
+      VFS prefixedFS = new PrefixedFS(rwzfs, prefix, Existence.MUST_EXIST);
 
       testInputVFS(new GenericInputVFS(prefixedFS));
 
@@ -1026,7 +1048,8 @@
   public void testDeflateFSWithMessageDigestFS()
       throws CannotCreateFileException, WrongPermissionException, CannotChangePermissionException,
       NoSuchFileException, FileAlreadyExistsException, IOException, CannotDeleteFileException,
-      NotFileOrDirectoryException, ZipException, CannotCloseException, BadVFSFormatException {
+      NotFileOrDirectoryException, ZipException, CannotCloseException, BadVFSFormatException,
+      WrongVFSTypeException {
     File file = null;
     InputOutputVFS ioVFS1 = null;
     InputVFS ioVFS2 = null;
diff --git a/server/jack-server/etc/jack b/server/jack-server/etc/jack
index 75aed94..0f9187e 100755
--- a/server/jack-server/etc/jack
+++ b/server/jack-server/etc/jack
@@ -26,9 +26,7 @@
 JACK_HOME="${JACK_HOME:=$HOME/.jack-server}"
 JACK_CLIENT_SETTING="${JACK_CLIENT_SETTING:=$HOME/.jack-settings}"
 TMPDIR=${TMPDIR:=/tmp}
-# This is half the timeout since the script will make a second attempt collecting debugs when
-# the first attempt fails on connection timeout
-JACK_CONNECTION_TIMEOUT=150
+JACK_CONNECTION_TIMEOUT=300
 JACK_EXTRA_CURL_OPTIONS=${JACK_EXTRA_CURL_OPTIONS:=}
 JACK_ASSERTION_ENABLED="${JACK_ASSERTION_ENABLED:=false}"
 
@@ -112,15 +110,11 @@
 # Check base64 availability
 BASE64_CHECK=$((echo amFjaw==;echo LXNlcnZlcg==) | base64 --decode 2>&1)
 
-sendRequest() {
-RETRY_OPTION=$1
-shift
-
 # Launch compilation
 exec 3>&1
 exec 4>&2
 if [ "$BASE64_CHECK" = jack-server ]; then
-  HTTP_CODE=$(curl -f $JACK_EXTRA_CURL_OPTIONS $RETRY_OPTION \
+  HTTP_CODE=$(curl -f $JACK_EXTRA_CURL_OPTIONS \
        --cert "${JACK_HOME}/client.pem" \
        --cacert "${JACK_HOME}/server.pem" \
        --output >(tee >(sed -n -e 's/^E|\(.*\)$/\1/p' | base64 --decode >&4 ) | tee >(sed -n -e 's/^X|\(.*\)$/\1/p' >>$JACK_EXIT) | sed -n -e 's/^O|\(.*\)$/\1/p' | base64 --decode >&3) \
@@ -135,7 +129,7 @@
        https://${SERVER_HOST}:$SERVER_PORT_SERVICE/jack \
        )
 else
-  HTTP_CODE=$(curl -f $JACK_EXTRA_CURL_OPTIONS $RETRY_OPTION \
+  HTTP_CODE=$(curl -f $JACK_EXTRA_CURL_OPTIONS \
        --cert "${JACK_HOME}/client.pem" \
        --cacert "${JACK_HOME}/server.pem" \
        --output >(tee >(sed -n -e 's/^E|\(.*\)$/\1/p' >&4 ) | tee >(sed -n -e 's/^X|\(.*\)$/\1/p' >>$JACK_EXIT) | sed -n -e 's/^O|\(.*\)$/\1/p' >&3) \
@@ -164,22 +158,9 @@
   # Failed to connect
   echo "No Jack server running. Try 'jack-admin start-server'" >&2
   abort
-elif [ $CURL_CODE -eq 28 ]; then
-  if [ "$RETRY_OPTION" == "" ]; then
-    echo "Connection to the Jack server timeout, retrying with debug"
-    sendRequest -v $@
-  else
-    echo "Connection to the Jack server timeout" >&2
-    abort
-  fi
 elif [ $CURL_CODE -eq 35 ]; then
-  if [ "$RETRY_OPTION" == "" ]; then
-    echo "SSL error when connecting to the Jack server, retrying with debug"
-    sendRequest -v $@
-  else
-    echo "SSL error when connecting to the Jack server. Try 'jack-diagnose'" >&2
-    abort
-  fi
+  echo "SSL error when connecting to the Jack server. Try 'jack-diagnose'" >&2
+  abort
 elif [ $CURL_CODE -eq 58 ]; then
   echo "Failed to contact Jack server: Problem reading ${JACK_HOME}/client.pem. Try 'jack-diagnose'" >&2
   abort
@@ -204,6 +185,3 @@
   echo "Communication error with Jack server ($CURL_CODE). Try 'jack-diagnose'" >&2
   abort
 fi
-}
-
-sendRequest "" $@
\ No newline at end of file
diff --git a/server/jack-server/etc/jack-admin b/server/jack-server/etc/jack-admin
index 0209ffc..d7fb11b 100755
--- a/server/jack-server/etc/jack-admin
+++ b/server/jack-server/etc/jack-admin
@@ -606,11 +606,21 @@
     echo "\$ lsof -i TCP:$SERVER_PORT_SERVICE -l" >>"$REPORT_INFO"
              lsof -i TCP:$SERVER_PORT_SERVICE -l  >>"$REPORT_INFO" 2>&1
 
+    echo "Test if Jack server service port $SERVER_PORT_SERVICE is open..."
+    echo >>"$REPORT_INFO"
+    echo "\$ if (exec 6<> /dev/tcp/127.0.0.1/$SERVER_PORT_SERVICE) 2> /dev/null ; then echo port $SERVER_PORT_SERVICE is in use; else echo port $SERVER_PORT_SERVICE is available; fi" >>"$REPORT_INFO"
+            (if (exec 6<> /dev/tcp/127.0.0.1/$SERVER_PORT_SERVICE) 2> /dev/null ; then echo port $SERVER_PORT_SERVICE is in use; else echo port $SERVER_PORT_SERVICE is available; fi)  >>"$REPORT_INFO" 2>&1
+
     echo "Listing process using Jack server admin port $SERVER_PORT_ADMIN..."
     echo >>"$REPORT_INFO"
     echo "\$ lsof -i TCP:$SERVER_PORT_ADMIN -l" >>"$REPORT_INFO"
              lsof -i TCP:$SERVER_PORT_ADMIN -l  >>"$REPORT_INFO" 2>&1
 
+    echo "Test if Jack server admin port $SERVER_PORT_ADMIN is open..."
+    echo >>"$REPORT_INFO"
+    echo "\$ if (exec 6<> /dev/tcp/127.0.0.1/$SERVER_PORT_ADMIN) 2> /dev/null ; then echo port $SERVER_PORT_ADMIN is in use; else echo port $SERVER_PORT_ADMIN is available; fi" >>"$REPORT_INFO"
+            (if (exec 6<> /dev/tcp/127.0.0.1/$SERVER_PORT_ADMIN) 2> /dev/null ; then echo port $SERVER_PORT_ADMIN is in use; else echo port $SERVER_PORT_ADMIN is available; fi) >>"$REPORT_INFO" 2>&1
+
     echo "Collecting Jack client configuration..."
     echo >>"$REPORT_INFO"
     echo "\$ cat \"\$JACK_CLIENT_SETTING\"" >>"$REPORT_INFO"
diff --git a/server/jack-server/etc/jack-diagnose b/server/jack-server/etc/jack-diagnose
index c8c51da..45dff60 100755
--- a/server/jack-server/etc/jack-diagnose
+++ b/server/jack-server/etc/jack-diagnose
@@ -127,6 +127,10 @@
 checkport() {
   PID_USING_PORT=$(lsof -F p -i TCP:$1 -sTCP:LISTEN | cut -c 2-)
   if [ -z "$PID_USING_PORT" ] ; then
+    if (exec 6<> /dev/tcp/127.0.0.1/$1) 2> /dev/null ; then
+      echo "Port $1 is used by a process owned by another user. Unless this is expected, please ensure the port is free or change port configuration in '$JACK_CLIENT_SETTING' and '$JACK_HOME/config.properties'"
+      return 255
+    fi
     # port is free nothing to check
     return 0
   fi
@@ -143,7 +147,7 @@
   fi
 
   if [ "$(echo $PS_OUT | awk '{print $2}')" -ne "$(id -u)" ] ; then
-    echo "Port $1 is used b a Jack server from another user uid=$(echo $PS_OUT | awk '{print $2}'), please change port configuration in '$JACK_CLIENT_SETTING' and '$JACK_HOME/config.properties'"
+    echo "Port $1 is used by a Jack server from another user uid=$(echo $PS_OUT | awk '{print $2}'), please change port configuration in '$JACK_CLIENT_SETTING' and '$JACK_HOME/config.properties'"
     return 255
   fi
 }