Merge remote-tracking branch 'aosp/ub-jack' into optim-dev
diff --git a/build.xml b/build.xml
index cabafa8..b798d0d 100644
--- a/build.xml
+++ b/build.xml
@@ -36,8 +36,7 @@
     schedtests-lib,
     jill,
     jill-api,
-    jack-jar-tools,
-    jack-jacoco-reporter"/>
+    jack-jar-tools"/>
 
   <target name="clean" depends="jack-clean,
     jack-api-lib-clean,
@@ -79,10 +78,7 @@
     jill-api-lib-clean,
     jill-api-src-clean,
     jack-jar-tools-clean,
-    jack-jacoco-reporter-clean,
-    jacoco-clean,
     asm4-clean,
-    gson-clean,
     dist-clean" />
 
   <dirname property="jack-project.dir" file="${ant.file.jack}"/>
@@ -112,13 +108,10 @@
   <property name="dx-ref.dir" value="${jack-project.dir}/dx-ref"/>
   <property name="core-stubs-mini.dir" value="${jack-project.dir}/core-stubs-mini"/>
   <property name="jack-jar-tools.dir" value="${jack-project.dir}/jack-jar-tools"/>
-  <property name="jack-jacoco-reporter.dir" value="${jack-project.dir}/jack-jacoco-reporter"/>
-  <property name="jacoco.dir" value="${jack-project.dir}/jacoco"/>
 
   <property name="jill.dir" value="${jack-project.dir}/jill" />
   <property name="jill-api.dir" value="${jack-project.dir}/jill-api" />
   <property name="asm4.dir" value="${jack-project.dir}/asm4" />
-  <property name="gson.dir" value="${jack-project.dir}/gson"/>
 
   <taskdef name="jarjar" classname="com.tonicsystems.jarjar.JarJarTask"
       classpath="${jack-project.dir}/jarjar/jarjar.jar"/>
@@ -380,7 +373,6 @@
     description="package a tools distribution"
     depends="dist-check-version-files,
              jack-jar-tools,
-             jack-jacoco-reporter,
              generate-eng-signature">
 
     <mkdir dir="${jack-top-dist.dir}"/>
@@ -403,10 +395,6 @@
         basedir="${tools-sign.tmp}"
         includes="jack-jar-tools-version.properties"/>
 
-    <jar destfile="${jack-top-dist.dir}/${jack-jacoco-reporter.name}" filesetmanifest="merge">
-      <zipfileset src="${jack-jacoco-reporter.dist.dir}/${jack-jacoco-reporter.name}"/>
-    </jar>
-
     <delete dir="${tools-sign.tmp}"/>
 
   </target>
@@ -544,7 +532,7 @@
     </dependset>
     <javac encoding="UTF-8" srcdir="${jack.dir}/src"
       destdir="${jack.build.outdir}"
-      source="1.7" target="1.7"
+      source="1.8" target="1.8"
       debug="true" includeantruntime="false" includeDestClasses="false">
       <classpath>
         <filelist refid="jack.link.libs.fileset" />
@@ -678,7 +666,7 @@
       </targets>
     </dependset>
      <javac encoding="UTF-8" srcdir="${jack-api.dir}/src" destdir="${jack-api.lib.build.outdir}"
-          source="1.6" target="1.6" debug="true"
+          source="1.8" target="1.8" debug="true"
           includeantruntime="false"  includeDestClasses="false" nowarn="true">
           <classpath>
             <filelist dir="/" files="${jsr305.dist.dir}/${jsr305.libname}" />
@@ -753,7 +741,7 @@
      <javac encoding="UTF-8" srcdir="${jack-tests.dir}/src"
           includes="com/android/jack/annotations/**/*.java"
           destdir="${jack-test-annotations.build.outdir}"
-          source="1.6" target="1.6" debug="true"
+          source="1.8" target="1.8" debug="true"
           includeantruntime="false"  includeDestClasses="false" nowarn="true" />
 
      <copy file="${jack-project.dir}/version.properties"
@@ -809,7 +797,7 @@
      <javac encoding="UTF-8" srcdir="${jack.dir}/src"
           includes="com/android/jack/annotations/**/*.java"
           destdir="${jack-annotations.build.outdir}"
-          source="1.6" target="1.6" debug="true"
+          source="1.8" target="1.8" debug="true"
           includeantruntime="false"  includeDestClasses="false" nowarn="true" />
 
      <copy file="${jack-project.dir}/version.properties"
@@ -873,7 +861,7 @@
     <copy file="${sched-build.dist.dir}/${sched-build.execname}" todir="${jackunittests.tools.dir}" />
     <!-- compile -->
     <javac encoding="UTF-8" srcdir="${jack.dir}/tests" destdir="${jackunittests.build.outdir}"
-      source="1.7" target="1.7" debug="true"
+      source="1.8" target="1.8" debug="true"
       includeantruntime="false"  includeDestClasses="false" nowarn="true">
       <classpath>
         <filelist refid="jackunittests.link.libs.fileset"/>
@@ -983,12 +971,12 @@
     <javac
       encoding="UTF-8"
       destdir="${jack-tests.build.outdir}"
-      source="1.7" target="1.7"
+      source="1.8" target="1.8"
       debug="true" includeantruntime="false" nowarn="true">
       <src path="${jack-tests.dir}/src"/>
       <src path="${jack-tests.dir}/tests"/>
-      <exclude name="com/android/jack/annotation/processor/sample2/src/**"/>
-      <exclude name="com/android/jack/annotation/test019/jack/**"/>
+      <exclude name="com/android/jack/annotation/processor/sample2/src/"/>
+      <exclude name="com/android/jack/annotation/processor/sample2/src/"/>
       <exclude name="com/android/jack/classpath/test002/lib1override/**"/>
       <exclude name="com/android/jack/encoding/tests/**"/>
       <exclude name="com/android/jack/enums/test003/link/Other.java"/>
@@ -996,6 +984,9 @@
       <exclude name="com/android/jack/error/test001/jack/A.java"/>
       <exclude name="com/android/jack/error/test002/jack/A.java"/>
       <exclude name="com/android/jack/frontend/test002/jack/PackageName/ClassInConflictingPackage.java"/>
+      <exclude name="com/android/jack/frontend/test005/jack/**"/>
+      <exclude name="com/android/jack/frontend/test006/jack/**"/>
+      <exclude name="com/android/jack/frontend/test007/jackduplicate/"/>
       <exclude name="com/android/jack/frontend/test008/jack/NoOuterContext.java"/>
       <exclude name="com/android/jack/frontend/test010/jack/UnusedLocalVar.java"/>
       <exclude name="com/android/jack/frontend/test013/jack/ExtendingInnerOnly.java"/>
@@ -1004,46 +995,24 @@
       <exclude name="com/android/jack/frontend/test016/jack/WithDuplicated.java"/>
       <exclude name="com/android/jack/frontend/test017/jack/InvalidQualification.java"/>
       <exclude name="com/android/jack/frontend/test019/jack/TooBig.java"/>
-      <exclude name="com/android/jack/frontend/generic/test002/jack/**"/>
-      <exclude name="com/android/jack/frontend/generic/test003/jack/**"/>
-      <exclude name="com/android/jack/nopackage/jack/**"/>
-      <exclude name="com/android/jack/multidex/test004/jack/**"/>
-      <exclude name="com/android/jack/java8/lambda/**"/>
-      <exclude name="com/android/jack/java8/defaultmethod/**"/>
-      <exclude name="com/android/jack/java8/staticmethod/**"/>
-      <exclude name="com/android/jack/java8/methodref/**"/>
-      <exclude name="com/android/jack/java8/inference/**"/>
-      <exclude name="com/android/jack/java8/gwt/**"/>
-      <exclude name="com/android/jack/java8/retrolambda/**"/>
-      <exclude name="com/android/jack/java8/intersectiontype/**"/>
-      <exclude name="com/android/jack/java8/annotation/**"/>
-      <exclude name="com/android/jack/java8/variable/**"/>
-      <exclude name="com/android/jack/java8/bridges/**"/>
-      <exclude name="com/android/jack/java8/parameter/**"/>
-      <exclude name="com/android/jack/jarjar/test003/dontcompile/**"/>
-      <exclude name="com/android/jack/jarjar/test004/dontcompile/**"/>
-      <exclude name="com/android/jack/jarjar/test006/dontcompile/**"/>
-      <exclude name="com/android/jack/lookup/test001/liboverride/**"/>
-      <exclude name="com/android/jack/frontend/test005/jack/**"/>
-      <exclude name="com/android/jack/frontend/test006/jack/**"/>
-      <exclude name="com/android/jack/frontend/test007/**"/>
+      <exclude name="com/android/jack/jarjar/test003/dontcompile/"/>
+      <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/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/"/>
+      <exclude name="com/android/jack/java8/variable/test003/"/>
       <exclude name="com/android/jack/jill/test001/**"/>
       <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/optimizations/lambdas/test001/**"/>
-      <exclude name="com/android/jack/optimizations/lambdas/test002/**"/>
-      <exclude name="com/android/jack/optimizations/lambdas/test003/**"/>
-      <exclude name="com/android/jack/optimizations/lambdas/test004/**"/>
-      <exclude name="com/android/jack/optimizations/lambdas/test005/**"/>
-      <exclude name="com/android/jack/optimizations/lambdas/test006/**"/>
-      <exclude name="com/android/jack/optimizations/lambdas/test007/**"/>
-      <exclude name="com/android/jack/optimizations/lambdas/test008/**"/>
+      <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"/>
-      <exclude name="com/android/jack/shrob/test062/jack/**"/>
-      <exclude name="com/android/jack/shrob/test066/jack/**"/>
-      <exclude name="com/android/jack/shrob/test067/jack/**"/>
-      <exclude name="com/android/jack/shrob/test068/jack/**"/>
       <classpath>
         <filelist dir="/">
           <file name="${jill-api.dist.dir}/${jill-api.lib.name}" />
@@ -1155,7 +1124,7 @@
     <!-- compile -->
     <javac  encoding="UTF-8" srcdir="${jill.dir}/src"
           destdir="${jill.build.outdir}"
-          source="1.7" target="1.7"
+          source="1.8" target="1.8"
           debug="true" includeantruntime="false">
       <classpath>
         <filelist refid="jill.libs.filelist" />
@@ -1247,7 +1216,7 @@
     <delete dir="${jill-api.lib.build.outdir}"/>
     <mkdir dir="${jill-api.lib.build.outdir}"/>
     <javac  encoding="UTF-8" srcdir="${jill-api.dir}/src" destdir="${jill-api.lib.build.outdir}"
-          source="1.6" target="1.6" debug="true"
+          source="1.8" target="1.8" debug="true"
           includeantruntime="false"  includeDestClasses="false" nowarn="true">
       <classpath>
         <filelist dir="/" files="${jsr305.dist.dir}/${jsr305.libname}" />
@@ -1621,7 +1590,7 @@
       </targets>
     </dependset>
     <javac encoding="UTF-8" srcdir="${sched.dir}/src" destdir="${schedlib.build.outdir}"
-      source="1.7" target="1.7" debug="true" includeantruntime="false"  includeDestClasses="false">
+      source="1.8" target="1.8" debug="true" includeantruntime="false"  includeDestClasses="false">
       <classpath>
         <filelist refid="schedlib.link.libs.fileset"/>
       </classpath>
@@ -1674,7 +1643,7 @@
        encoding="UTF-8"
        srcdir="${sched.dir}/src"
        destdir="${sched-build.build.outdir}"
-       source="1.6" target="1.6"
+       source="1.8" target="1.8"
        debug="true" includeantruntime="false" includeDestClasses="false">
       <compilerarg line="-Xlint:-options"/>
       <classpath>
@@ -1763,7 +1732,7 @@
     <javac encoding="UTF-8"
       srcdir="${sched.dir}/tests"
       destdir="${schedtests.build.outdir}"
-      source="1.7" target="1.7"
+      source="1.8" target="1.8"
       debug="true" includeantruntime="false"  includeDestClasses="false">
       <compilerarg line="-Xlint:-options"/>
       <classpath>
@@ -2098,7 +2067,7 @@
     <delete dir="${dexcomparator.dist.dir}" />
   </target>
 
-  <target name="dexcomparator-compile" depends="jack-lib, dex-lib,jsr305-lib,guava-lib,args4j-lib">
+  <target name="dexcomparator-compile" depends="jack-lib, dex-lib,jsr305-lib,guava-lib,args4j-lib,sched-lib">
     <!-- project layout -->
     <mkdir dir="${dexcomparator.build.outdir}"/>
     <mkdir dir="${dexcomparator.libs.dir}"/>
@@ -2111,6 +2080,7 @@
         <file name="${guava.dist.dir}/${guava.libname}" />
         <file name="${args4j.dist.dir}/${args4j.libname}" />
         <file name="${jack.dist.dir}/${jack.libname}" />
+	<file name="${schedlib.dist.dir}/${schedlib.libname}" />
       </filelist>
     </copy>
     <!-- compile -->
@@ -2129,7 +2099,7 @@
     <javac encoding="UTF-8"
             srcdir="${dexcomparator.dir}/src"
             destdir="${dexcomparator.build.outdir}"
-            source="1.6" target="1.6"
+            source="1.8" target="1.8"
             debug="true" includeantruntime="false"  includeDestClasses="false">
       <compilerarg line="-Xlint:-options"/>
       <classpath>
@@ -2253,59 +2223,6 @@
   </target>
 
   <!-- ******************* -->
-  <!-- gson                -->
-  <!-- ******************* -->
-  <property name="gson.build.dir" value="${gson.dir}/build" />
-  <property name="gson.build.outdir" value="${gson.build.dir}/classes" />
-  <property name="gson.dist.dir" value="${gson.dir}/dist" />
-  <property name="gson.libname" value="gson.jar"/>
-
-  <target name="gson-clean">
-    <delete dir="${gson.build.dir}" />
-    <delete dir="${gson.dist.dir}" />
-  </target>
-
-  <target name="gson-lib">
-    <!-- project layout -->
-    <mkdir dir="${gson.build.outdir}"/>
-    <mkdir dir="${gson.dist.dir}"/>
-    <!-- compile -->
-    <dependset>
-      <sources>
-        <fileset dir="${gson.dir}/gson/src/main/java" />
-      </sources>
-      <targets>
-        <fileset file="${gson.dist.dir}/${gson.libname}"/>
-      </targets>
-    </dependset>
-    <javac encoding="UTF-8" srcdir="${gson.dir}/gson/src/main/java"
-          destdir="${gson.build.outdir}"
-          source="1.5" target="1.5"
-          debug="true" includeantruntime="false"/>
-    <!-- package -->
-    <jar destfile="${gson.dist.dir}/${gson.libname}"
-          basedir="${gson.build.outdir}"
-          includes="**"/>
-  </target>
-
-  <!-- ******************* -->
-  <!-- jacoco              -->
-  <!-- ******************* -->
-  <property name="jacoco.dist.dir" value="${jacoco.dir}/dist" />
-  <property name="jacoco.core.libname" value="org.jacoco.core.jar"/>
-  <property name="jacoco.report.libname" value="org.jacoco.report.jar"/>
-
-  <target name="jacoco-clean">
-    <delete dir="${jacoco.dist.dir}"/>
-  </target>
-
-  <target name="jacoco-libs">
-    <mkdir dir="${jacoco.dist.dir}"/>
-    <copy file="${jacoco.dir}/org.jacoco.core-0.7.5.201505241946.jar" tofile="${jacoco.dist.dir}/${jacoco.core.libname}"/>
-    <copy file="${jacoco.dir}/org.jacoco.report-0.7.5.201505241946.jar" tofile="${jacoco.dist.dir}/${jacoco.report.libname}"/>
-  </target>
-
-  <!-- ******************* -->
   <!-- jack-default-lib    -->
   <!-- ******************* -->
   <property name="jack-default-lib.build.jack" value="${jack.dir}/build/default-lib.jack"/>
@@ -2717,7 +2634,7 @@
     <delete dir="${jack-jar-tools.build.outdir}"/>
     <mkdir dir="${jack-jar-tools.build.outdir}"/>
     <javac encoding="UTF-8" srcdir="${jack-jar-tools.dir}/src" destdir="${jack-jar-tools.build.outdir}"
-         source="1.6" target="1.6" debug="true"
+         source="1.8" target="1.8" debug="true"
          includeantruntime="false"  includeDestClasses="false" nowarn="true">
       <classpath>
         <filelist refid="jack-jar-tools.static.libs.fileset"/>
@@ -2735,81 +2652,6 @@
 
 
   <!-- ************************* -->
-  <!-- jack-jacoco-reporter   -->
-  <!-- ************************* -->
-  <property name="jack-jacoco-reporter.build.dir" value="${jack-jacoco-reporter.dir}/build" />
-  <property name="jack-jacoco-reporter.dist.dir" value="${jack-jacoco-reporter.dir}/dist" />
-  <property name="jack-jacoco-reporter.libs.dir" value="${jack-jacoco-reporter.dir}/libs" />
-  <property name="jack-jacoco-reporter.build.outdir" value="${jack-jacoco-reporter.build.dir}/classes" />
-  <property name="jack-jacoco-reporter.name" value="jack-jacoco-reporter.jar" />
-
-  <target name="jack-jacoco-reporter-clean">
-    <delete dir="${jack-jacoco-reporter.build.dir}" />
-    <delete dir="${jack-jacoco-reporter.dist.dir}" />
-    <delete dir="${jack-jacoco-reporter.libs.dir}" />
-  </target>
-
-  <target name="jack-jacoco-reporter-copy-libs"
-    depends="jsr305-lib,args4j-lib,asm4-lib,gson-lib,junit4,jacoco-libs">
-    <copy todir="${jack-jacoco-reporter.libs.dir}" flatten="true">
-      <filelist dir="/" >
-        <file name="${jsr305.dist.dir}/${jsr305.libname}"/>
-        <file name="${schedlib.dist.dir}/${schedlib.libname}" />
-        <file name="${args4j.dist.dir}/${args4j.libname}"/>
-        <file name="${asm4.dist.dir}/${asm4.libname}"/>
-        <file name="${gson.dist.dir}/${gson.libname}"/>
-        <file name="${jacoco.dist.dir}/${jacoco.core.libname}"/>
-        <file name="${jacoco.dist.dir}/${jacoco.report.libname}"/>
-        <file name="${junit4.dist.dir}/${junit4.execname}"/>
-      </filelist>
-    </copy>
-  </target>
-
-  <target name="jack-jacoco-reporter-check">
-    <union id="jack-jacoco-reporter.uptodate.files">
-      <fileset dir="${jack-jacoco-reporter.dir}/src" />
-      <fileset dir="${jack-jacoco-reporter.dir}/etc" />
-      <filelist id="jack-jacoco-reporter.static.libs.fileset" dir="/">
-        <file name="${jack-jacoco-reporter.libs.dir}/${jsr305.libname}"/>
-        <file name="${jack-jacoco-reporter.libs.dir}/${schedlib.libname}"/>
-        <file name="${jack-jacoco-reporter.libs.dir}/${args4j.libname}"/>
-        <file name="${jack-jacoco-reporter.libs.dir}/${asm4.libname}"/>
-        <file name="${jack-jacoco-reporter.libs.dir}/${gson.libname}"/>
-        <file name="${jack-jacoco-reporter.libs.dir}/${jacoco.core.libname}"/>
-        <file name="${jack-jacoco-reporter.libs.dir}/${jacoco.report.libname}"/>
-      </filelist>
-    </union>
-
-    <uptodate property="jack-jacoco-reporter.uptodate"
-      targetfile="${jack-jacoco-reporter.dist.dir}/${jack-jacoco-reporter.name}">
-      <srcresources refid="jack-jacoco-reporter.uptodate.files" />
-    </uptodate>
-  </target>
-
-  <target name="jack-jacoco-reporter"
-      depends="jack-jacoco-reporter-copy-libs,jack-jacoco-reporter-check"
-      unless="${jack-jacoco-reporter.uptodate}">
-    <delete dir="${jack-jacoco-reporter.build.outdir}"/>
-    <mkdir dir="${jack-jacoco-reporter.build.outdir}"/>
-    <javac encoding="UTF-8" srcdir="${jack-jacoco-reporter.dir}/src" destdir="${jack-jacoco-reporter.build.outdir}"
-         source="1.6" target="1.6" debug="true"
-         includeantruntime="false"  includeDestClasses="false" nowarn="true">
-      <classpath>
-        <filelist refid="jack-jacoco-reporter.static.libs.fileset"/>
-      </classpath>
-    </javac>
-    <unzip dest="${jack-jacoco-reporter.build.outdir}">
-      <filelist refid="jack-jacoco-reporter.static.libs.fileset"/>
-    </unzip>
-    <copy file="${jack-project.dir}/version.properties"
-          tofile="${jack-jacoco-reporter.build.outdir}/jack-jacoco-reporter-version.properties"/>
-    <jar destfile="${jack-jacoco-reporter.dist.dir}/${jack-jacoco-reporter.name}" manifest="${jack-jacoco-reporter.dir}/etc/manifest.txt">
-      <fileset dir="${jack-jacoco-reporter.build.outdir}"/>
-    </jar>
-  </target>
-
-
-  <!-- ************************* -->
   <!--       Checkstyle          -->
   <!-- ************************* -->
     <property name="ivy.install.version" value="2.4.0" />
diff --git a/dexcomparator/.classpath b/dexcomparator/.classpath
index 645477c..ec1f6a8 100644
--- a/dexcomparator/.classpath
+++ b/dexcomparator/.classpath
@@ -2,7 +2,7 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="src" path="testing"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
 	<classpathentry kind="src" path=".apt_generated">
 		<attributes>
 			<attribute name="optional" value="true"/>
@@ -14,5 +14,6 @@
 	<classpathentry kind="lib" path="libs/args4j-lib.jar"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/Jack"/>
+	<classpathentry kind="src" path="/Scheduler"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/dexcomparator/.settings/org.eclipse.jdt.core.prefs b/dexcomparator/.settings/org.eclipse.jdt.core.prefs
index 88b949f..0a5bb1e 100644
--- a/dexcomparator/.settings/org.eclipse.jdt.core.prefs
+++ b/dexcomparator/.settings/org.eclipse.jdt.core.prefs
@@ -6,9 +6,9 @@
 org.eclipse.jdt.core.compiler.annotation.nullable=javax.annotation.CheckForNull
 org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -96,7 +96,7 @@
 org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
 org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field=1585
 org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field.count_dependent=1585|-1|1585
diff --git a/dexcomparator/Android.mk b/dexcomparator/Android.mk
index e78edb0..f0b81c4 100644
--- a/dexcomparator/Android.mk
+++ b/dexcomparator/Android.mk
@@ -13,6 +13,7 @@
 
 LOCAL_JAVA_LIBRARIES := \
     jack \
+    schedlib \
     dexlib-jack \
     jsr305lib-jack \
     args4j-jack
@@ -30,6 +31,7 @@
 
 LOCAL_STATIC_JAVA_LIBRARIES := \
     jack \
+    schedlib \
     dexlib-jack \
     jsr305lib-jack \
     args4j-jack
diff --git a/dexcomparator/build.gradle b/dexcomparator/build.gradle
index ac363e6..03bd43b 100644
--- a/dexcomparator/build.gradle
+++ b/dexcomparator/build.gradle
@@ -16,8 +16,8 @@
 
 apply plugin: 'java'
 
-sourceCompatibility = 1.6
-targetCompatibility = 1.6
+sourceCompatibility = 1.8
+targetCompatibility = 1.8
 
 apply from: "$rootDir/gradle-script/checkstyle.gradle"
 apply from: "$rootDir/gradle-script/findbugs.gradle"
@@ -34,6 +34,7 @@
   compile project(':args4j')
   compile project(':dexlib')
   compile project(':jack')
+  compile project(':sched')
   compileOnly libs.jsr305
   compile libs.guava
 }
diff --git a/dexcomparator/src/com/android/jack/comparator/DexComparator.java b/dexcomparator/src/com/android/jack/comparator/DexComparator.java
index 395e0df..e152d8f 100644
--- a/dexcomparator/src/com/android/jack/comparator/DexComparator.java
+++ b/dexcomparator/src/com/android/jack/comparator/DexComparator.java
@@ -29,6 +29,8 @@
 import com.android.jack.dx.rop.code.AccessFlags;
 import com.android.jack.dx.rop.type.Prototype;
 import com.android.jack.dx.util.ByteInput;
+import com.android.sched.util.file.CannotCloseException;
+import com.android.sched.util.file.CannotReadException;
 
 import org.kohsuke.args4j.CmdLineException;
 import org.kohsuke.args4j.CmdLineParser;
@@ -137,8 +139,8 @@
     enableDebugInfoComparison = compareDebugInfo;
   }
 
-  public void compare(@Nonnull File referenceFile, @Nonnull File candidateFile) throws IOException,
-      DifferenceFoundException {
+  public void compare(@Nonnull File referenceFile, @Nonnull File candidateFile)
+      throws DifferenceFoundException, CannotReadException, CannotCloseException {
 
     if (enableBinaryDebugInfoComparison && !enableDebugInfoComparison) {
       throw new IllegalArgumentException(
@@ -1052,6 +1054,12 @@
     } catch (IOException e) {
       System.err.println(e.getMessage());
       System.exit(PROBLEM);
+    } catch (CannotReadException e) {
+      System.err.println(e.getMessage());
+      System.exit(PROBLEM);
+    } catch (CannotCloseException e) {
+      System.err.println(e.getMessage());
+      System.exit(PROBLEM);
     } catch (DifferenceFoundException e) {
       System.err.println(e.getMessage());
       System.exit(DIFFERENCE);
diff --git a/dexcomparator/testing/com/android/jack/dexcomparator/test/BinaryCodeComparisonTest.java b/dexcomparator/testing/com/android/jack/dexcomparator/test/BinaryCodeComparisonTest.java
index 7c8c40f..e64636c 100644
--- a/dexcomparator/testing/com/android/jack/dexcomparator/test/BinaryCodeComparisonTest.java
+++ b/dexcomparator/testing/com/android/jack/dexcomparator/test/BinaryCodeComparisonTest.java
@@ -18,6 +18,8 @@
 
 import com.android.jack.comparator.DexComparator;
 import com.android.jack.comparator.DifferenceFoundException;
+import com.android.sched.util.file.CannotCloseException;
+import com.android.sched.util.file.CannotReadException;
 
 import org.junit.Assert;
 import org.junit.Test;
@@ -36,7 +38,8 @@
   private static final File testSource2 = new File("testsource2");
 
   @Test
-  public void testDifferentBinaryCodeComparison() throws IOException {
+  public void testDifferentBinaryCodeComparison()
+      throws IOException, CannotReadException, CannotCloseException {
     String sourcePath = "com/android/jack/dexcomparator/test/A.java";
     File a1 = new File(testSource1, sourcePath);
     File a2 = new File(testSource2, sourcePath);
@@ -61,7 +64,8 @@
   }
 
   @Test
-  public void testIdenticalBinaryCodeComparison() throws IOException {
+  public void testIdenticalBinaryCodeComparison()
+      throws IOException, CannotReadException, CannotCloseException {
     String sourcePath = "com/android/jack/dexcomparator/test/A.java";
     File a1 = new File(testSource1, sourcePath);
     File dex1 = File.createTempFile("dex1", ".dex");
diff --git a/jack-api/.classpath b/jack-api/.classpath
index d320d31..4c675c8 100644
--- a/jack-api/.classpath
+++ b/jack-api/.classpath
@@ -2,7 +2,7 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="src" path="example"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
 	<classpathentry kind="src" path=".apt_generated">
 		<attributes>
 			<attribute name="optional" value="true"/>
diff --git a/jack-api/.settings/org.eclipse.jdt.core.prefs b/jack-api/.settings/org.eclipse.jdt.core.prefs
index dc66277..73739d4 100644
--- a/jack-api/.settings/org.eclipse.jdt.core.prefs
+++ b/jack-api/.settings/org.eclipse.jdt.core.prefs
@@ -7,9 +7,9 @@
 org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
 org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -113,7 +113,7 @@
 org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.processAnnotations=enabled
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
 org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field=1585
 org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field.count_dependent=1585|-1|1585
diff --git a/jack-api/build.gradle b/jack-api/build.gradle
index 5ae349b..77386d5 100644
--- a/jack-api/build.gradle
+++ b/jack-api/build.gradle
@@ -17,8 +17,8 @@
 apply plugin: 'java'
 apply plugin: 'com.github.johnrengelman.shadow'
 
-sourceCompatibility = 1.6
-targetCompatibility = 1.6
+sourceCompatibility = 1.8
+targetCompatibility = 1.8
 
 apply from: "$rootDir/gradle-script/checkstyle.gradle"
 apply from: "$rootDir/gradle-script/findbugs.gradle"
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 f23e7e6..27e9134 100644
--- a/jack-coverage/build.xml
+++ b/jack-coverage/build.xml
@@ -18,49 +18,65 @@
 <project name="jack-coverage" default="all">
 
   <dirname property="jack-coverage-project.dir" file="${ant.file.jack-coverage}" />
-  <property name="jack-coverage-libs.dir" value="${jack-coverage-project.dir}/libs" />
-  <property name="jack-coverage-tools.dir" value="${jack-coverage-project.dir}/tools" />
-  <property name="jack-coverage-rsc.dir" value="${jack-coverage-project.dir}/rsc" />
-  <property name="jack-coverage-build.dir" value="${jack-coverage-project.dir}/build" />
-  <property name="jack-coverage-build-classes.dir" value="${jack-coverage-build.dir}/classes" />
-  <property name="jack-coverage-build-test-classes.dir"
-            value="${jack-coverage-build.dir}/testClasses" />
   <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.execname" value="jack-coverage-plugin.jar" />
-  <property name="jack-coverage-tests.execname" value="jack-coverage-tests.jar" />
-  <property name="jack-coverage-tests.output.dir" value="${jack-coverage-project.dir}/testResults" />
+  <property name="jack-coverage-tests.output.dir"
+            value="${jack-coverage-project.dir}/testResults" />
   <property name="jack-coverage-tests.dump.dir" value="${jack-coverage-dist.dir}/dump" />
   <property name="jack-coverage-tests.suite.name"
             value="com.android.jack.coverage.AllCoverageTests" />
 
   <target name="all"
           description="Build plugin and tests"
-          depends="jack-coverage-plugin,jack-coverage-tests" />
+          depends="jack-coverage-plugin,jack-coverage-tests,jack-jacoco-reporter" />
 
-  <target name="clean" description="deletes files produced by all targets">
-    <delete dir="${jack-coverage-build.dir}" />
+  <target name="clean"
+          description="deletes files produced by all targets"
+          depends="plugin-clean,reporter-clean,gson-clean">
     <delete dir="${jack-coverage-dist.dir}" />
-    <delete dir="${jack-coverage-libs.dir}" />
-    <delete dir="${jack-coverage-tools.dir}" />
     <delete dir="${jack-coverage-tests.output.dir}" />
   </target>
 
+  <!-- *************** -->
+  <!-- Coverage plugin -->
+  <!-- *************** -->
+  <property name="plugin.dir" value="${jack-coverage-project.dir}/plugin"/>
+  <property name="plugin.libs.dir" value="${plugin.dir}/libs" />
+  <property name="plugin.tools.dir" value="${plugin.dir}/tools" />
+  <property name="plugin.rsc.dir" value="${plugin.dir}/rsc" />
+  <property name="plugin.build.dir" value="${plugin.dir}/build" />
+  <property name="plugin.build.src.classes.dir" value="${plugin.build.dir}/classes" />
+  <property name="plugin.build.test.classes.dir" value="${plugin.build.dir}/testClasses" />
+  <property name="plugin.execname" value="jack-coverage-plugin.jar" />
+  <property name="plugin.tests.execname" value="jack-coverage-tests.jar" />
+
+  <target name="plugin-clean" description="deletes files produced by all targets">
+    <delete dir="${plugin.build.dir}" />
+    <delete dir="${plugin.libs.dir}" />
+    <delete dir="${plugin.tools.dir}" />
+  </target>
+
   <target name="copy-jack-libs-and-tools"
-          description="update the project libraries (must be used at least once to install them)">
-    <mkdir dir="${jack-coverage-libs.dir}" />
-    <mkdir dir="${jack-coverage-tools.dir}" />
+          description="update the project libraries (must be used at least once to install them)"
+          depends="gson-lib">
+    <mkdir dir="${plugin.libs.dir}" />
+    <mkdir dir="${plugin.tools.dir}" />
 
     <!-- Copy required libraries -->
-    <copy file="../jack/dist/jack-lib.jar" todir="${jack-coverage-libs.dir}" />
-    <copy file="../jack-tests/dist/jack-tests.jar" todir="${jack-coverage-libs.dir}" />
-    <copy file="../gson/dist/gson.jar" todir="${jack-coverage-libs.dir}" />
-    <copy file="../sched/dist/sched-lib.jar" todir="${jack-coverage-libs.dir}" />
-    <copy file="../junit4/dist/junit4.jar" todir="${jack-coverage-libs.dir}" />
-    <copy file="../jsr305/dist/jsr305-lib.jar" todir="${jack-coverage-libs.dir}" />
+    <copy todir="${plugin.libs.dir}" flatten="true">
+      <filelist dir="${jack-coverage-project.dir}/../" >
+        <file name="jack/dist/jack-lib.jar"/>
+        <file name="jack-tests/dist/jack-tests.jar" />
+        <file name="sched/dist/sched-lib.jar"/>
+        <file name="junit4/dist/junit4.jar"/>
+        <file name="jsr305/dist/jsr305-lib.jar"/>
+      </filelist>
+    </copy>
+    <copy file="${gson.dist.dir}/${gson.libname}" todir="${plugin.libs.dir}" />
 
     <!-- Copy required tools for packaging -->
-    <copy file="../sched/dist/sched-build.jar" todir="${jack-coverage-tools.dir}" />
+    <copy file="../sched/dist/sched-build.jar" todir="${plugin.tools.dir}" />
 
   </target>
 
@@ -68,9 +84,9 @@
           description="build Jack code coverage support"
           depends="copy-jack-libs-and-tools">
 
-    <mkdir dir="${jack-coverage-build-classes.dir}" />
-    <javac srcdir="src"
-           destdir="${jack-coverage-build-classes.dir}"
+    <mkdir dir="${plugin.build.src.classes.dir}" />
+    <javac srcdir="${plugin.dir}/src"
+           destdir="${plugin.build.src.classes.dir}"
            source="1.7"
            target="1.7"
            encoding="UTF-8"
@@ -78,24 +94,28 @@
            includeantruntime="false"
            includeDestClasses="false">
       <classpath>
-        <filelist dir="${jack-coverage-libs.dir}">
+        <filelist dir="${plugin.libs.dir}">
           <file name="jsr305-lib.jar" />
           <file name="sched-lib.jar" />
           <file name="jack-lib.jar" />
         </filelist>
       </classpath>
-      <compilerarg line="-processorpath ${jack-coverage-tools.dir}/sched-build.jar" />
+      <compilerarg line="-processorpath ${plugin.tools.dir}/sched-build.jar" />
       <compilerarg line="-processor com.android.sched.build.SchedAnnotationProcessor" />
     </javac>
 
     <!-- copy resource files -->
-    <copy todir="${jack-coverage-build-classes.dir}">
-      <fileset dir="${jack-coverage-rsc.dir}" />
+    <copy todir="${plugin.build.src.classes.dir}">
+      <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="${jack-coverage-build-classes.dir}"
-         destfile="${jack-coverage-dist.dir}/${jack-coverage.execname}" />
+    <jar basedir="${plugin.build.src.classes.dir}"
+         destfile="${jack-coverage-dist.dir}/${plugin.execname}" />
 
   </target>
 
@@ -103,9 +123,9 @@
           description="build coverage tests"
           depends="jack-coverage-plugin">
 
-    <mkdir dir="${jack-coverage-build-test-classes.dir}" />
-    <javac srcdir="tests"
-           destdir="${jack-coverage-build-test-classes.dir}"
+    <mkdir dir="${plugin.build.test.classes.dir}" />
+    <javac srcdir="${plugin.dir}/tests"
+           destdir="${plugin.build.test.classes.dir}"
            source="1.7"
            target="1.7"
            encoding="UTF-8"
@@ -114,27 +134,27 @@
            includeDestClasses="false">
       <exclude name="com/android/jack/coverage/**/test*/**" />
       <classpath>
-        <filelist dir="${jack-coverage-libs.dir}">
+        <filelist dir="${plugin.libs.dir}">
           <file name="jsr305-lib.jar" />
           <file name="sched-lib.jar" />
           <file name="jack-tests.jar" />
-          <file name="gson.jar" />
+          <file name="${gson.libname}" />
         </filelist>
-        <file name="${jack-coverage-dist.dir}/${jack-coverage.execname}" />
+        <file name="${jack-coverage-dist.dir}/${plugin.execname}" />
       </classpath>
     </javac>
 
     <!-- Extract jack-tests classes to embed them in the final jar -->
-    <unzip dest="${jack-coverage-build-test-classes.dir}">
-      <filelist dir="${jack-coverage-libs.dir}">
+    <unzip dest="${plugin.build.test.classes.dir}">
+      <filelist dir="${plugin.libs.dir}">
         <file name="jack-tests.jar" />
-        <file name="gson.jar" />
+        <file name="${gson.libname}" />
       </filelist>
     </unzip>
 
     <!-- TODO can we strip out Jack tests to only keep infrastrcture ? -->
-    <jar basedir="${jack-coverage-build-test-classes.dir}"
-         destfile="${jack-coverage-dist.dir}/${jack-coverage-tests.execname}"
+    <jar basedir="${plugin.build.test.classes.dir}"
+         destfile="${jack-coverage-dist.dir}/${plugin.tests.execname}"
          manifest="etc/manifest.txt" />
   </target>
 
@@ -144,7 +164,7 @@
 
 
   <filelist id="jack.junit.tests.classpath" dir="${jack-coverage-dist.dir}">
-    <file name="${jack-coverage-tests.execname}" />
+    <file name="${plugin.tests.execname}" />
   </filelist>
 
   <condition property="jack.tests.assertions" value="-da" else="-ea">
@@ -217,14 +237,94 @@
 
   </target>
 
+  <!-- ***************** -->
+  <!-- Coverage reporter -->
+  <!-- ***************** -->
+  <property name="reporter.dir" value="${jack-coverage-project.dir}/reporter"/>
+  <property name="reporter.build.dir" value="${reporter.dir}/build" />
+  <property name="reporter.libs.dir" value="${reporter.dir}/libs" />
+  <property name="reporter.build.src.classes.dir" value="${reporter.build.dir}/classes" />
+  <property name="reporter.execname" value="jack-jacoco-reporter.jar" />
+
+  <target name="reporter-clean">
+    <delete dir="${reporter.build.dir}" />
+    <delete dir="${reporter.libs.dir}" />
+  </target>
+
+  <target name="jack-jacoco-reporter-copy-libs" depends="gson-lib">
+    <copy todir="${reporter.libs.dir}" flatten="true">
+      <filelist dir="${jack-coverage-project.dir}/.." >
+        <file name="jsr305/dist/jsr305-lib.jar"/>
+        <file name="sched/dist/sched-lib.jar" />
+        <file name="args4j/dist/args4j-lib.jar"/>
+        <file name="asm4/dist/asm4-lib.jar"/>
+        <file name="junit4/dist/junit4.jar"/>
+      </filelist>
+    </copy>
+
+    <copy file="${gson.dist.dir}/${gson.libname}" todir="${reporter.libs.dir}" />
+    <copy file="../jacoco/org.jacoco.core-0.7.5.201505241946.jar"
+          tofile="${reporter.libs.dir}/org.jacoco.core.jar"/>
+    <copy file="../jacoco/org.jacoco.report-0.7.5.201505241946.jar"
+          tofile="${reporter.libs.dir}/org.jacoco.report.jar"/>
+  </target>
+
+  <target name="jack-jacoco-reporter-check">
+    <union id="jack-jacoco-reporter.uptodate.files">
+      <fileset dir="${reporter.dir}/src" />
+      <fileset dir="${reporter.dir}/etc" />
+      <filelist id="jack-jacoco-reporter.static.libs.fileset" dir="/">
+        <file name="${reporter.libs.dir}/jsr305-lib.jar"/>
+        <file name="${reporter.libs.dir}/sched-lib.jar"/>
+        <file name="${reporter.libs.dir}/args4j-lib.jar"/>
+        <file name="${reporter.libs.dir}/asm4-lib.jar"/>
+        <file name="${reporter.libs.dir}/${gson.libname}"/>
+        <file name="${reporter.libs.dir}/org.jacoco.core.jar"/>
+        <file name="${reporter.libs.dir}/org.jacoco.report.jar"/>
+      </filelist>
+    </union>
+
+    <uptodate property="jack-jacoco-reporter.uptodate"
+      targetfile="${jack-coverage-dist.dir}/${reporter.execname}">
+      <srcresources refid="jack-jacoco-reporter.uptodate.files" />
+    </uptodate>
+  </target>
+
+  <target name="jack-jacoco-reporter"
+          depends="jack-jacoco-reporter-copy-libs,jack-jacoco-reporter-check"
+          unless="${jack-jacoco-reporter.uptodate}">
+    <delete dir="${reporter.build.src.classes.dir}"/>
+    <mkdir dir="${reporter.build.src.classes.dir}"/>
+    <javac encoding="UTF-8" srcdir="${reporter.dir}/src"
+           destdir="${reporter.build.src.classes.dir}"
+           source="1.6" target="1.6" debug="true"
+           includeantruntime="false"  includeDestClasses="false" nowarn="true">
+      <classpath>
+        <filelist refid="jack-jacoco-reporter.static.libs.fileset"/>
+      </classpath>
+    </javac>
+    <unzip dest="${reporter.build.src.classes.dir}">
+      <filelist refid="jack-jacoco-reporter.static.libs.fileset"/>
+    </unzip>
+
+    <!-- Reuse the same version.properties than the plugin. -->
+    <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}"
+         manifest="${reporter.dir}/etc/manifest.txt">
+      <fileset dir="${reporter.build.src.classes.dir}"/>
+    </jar>
+  </target>
+
   <target name="dist" description="distribution of the code coverage plugin" depends="all">
     <!-- Placeholder for future release process -->
   </target>
 
   <target name="dist-doc" description="documentation of the code coverage support" depends="dist">
       <union id="dist-doc.classpath.files">
-        <fileset dir="${jack-coverage-project.dir}/libs" />
-        <fileset file="${jack-coverage-dist.dir}/${jack-coverage.execname}" />
+        <fileset dir="${plugin.dir}/libs" />
+        <fileset file="${jack-coverage-dist.dir}/${plugin.execname}" />
       </union>
       <pathconvert property="dist-doc.classpath.path" refid="dist-doc.classpath.files" />
     <mkdir dir="${jack-coverage-doc.dir}" />
@@ -236,7 +336,7 @@
         windowtitle="Jack's code coverage plugin"
         classpath="${dist-doc.classpath.path}"
         nodeprecated="true">
-          <fileset dir="${jack-coverage-project.dir}/src" includes="**/*.java" />
+          <fileset dir="${plugin.dir}/src" includes="**/*.java" />
       </javadoc>
       <!-- README.md -->
       <copy file="${jack-coverage-project.dir}/README-jack-coverage.md"
@@ -249,4 +349,41 @@
       </exec>
   </target>
 
+  <!-- ******************* -->
+  <!-- gson                -->
+  <!-- ******************* -->
+  <property name="gson.dir" value="${jack-coverage-project.dir}/../gson"/>
+  <property name="gson.build.dir" value="${gson.dir}/build" />
+  <property name="gson.build.outdir" value="${gson.build.dir}/classes" />
+  <property name="gson.dist.dir" value="${gson.dir}/dist" />
+  <property name="gson.libname" value="gson.jar"/>
+
+  <target name="gson-clean">
+    <delete dir="${gson.build.dir}" />
+    <delete dir="${gson.dist.dir}" />
+  </target>
+
+  <target name="gson-lib">
+    <!-- project layout -->
+    <mkdir dir="${gson.build.outdir}"/>
+    <mkdir dir="${gson.dist.dir}"/>
+    <!-- compile -->
+    <dependset>
+      <sources>
+        <fileset dir="${gson.dir}/gson/src/main/java" />
+      </sources>
+      <targets>
+        <fileset file="${gson.dist.dir}/${gson.libname}"/>
+      </targets>
+    </dependset>
+    <javac encoding="UTF-8" srcdir="${gson.dir}/gson/src/main/java"
+          destdir="${gson.build.outdir}"
+          source="1.5" target="1.5"
+          debug="true" includeantruntime="false"/>
+    <!-- package -->
+    <jar destfile="${gson.dist.dir}/${gson.libname}"
+          basedir="${gson.build.outdir}"
+          includes="**"/>
+  </target>
+
 </project>
diff --git a/jack-coverage/.classpath b/jack-coverage/plugin/.classpath
similarity index 100%
rename from jack-coverage/.classpath
rename to jack-coverage/plugin/.classpath
diff --git a/jack-coverage/.factorypath b/jack-coverage/plugin/.factorypath
similarity index 100%
rename from jack-coverage/.factorypath
rename to jack-coverage/plugin/.factorypath
diff --git a/jack-coverage/.project b/jack-coverage/plugin/.project
similarity index 100%
rename from jack-coverage/.project
rename to jack-coverage/plugin/.project
diff --git a/jack-coverage/.settings/edu.umd.cs.findbugs.core.prefs b/jack-coverage/plugin/.settings/edu.umd.cs.findbugs.core.prefs
similarity index 100%
rename from jack-coverage/.settings/edu.umd.cs.findbugs.core.prefs
rename to jack-coverage/plugin/.settings/edu.umd.cs.findbugs.core.prefs
diff --git a/jack-coverage/.settings/org.eclipse.core.resources.prefs b/jack-coverage/plugin/.settings/org.eclipse.core.resources.prefs
similarity index 100%
rename from jack-coverage/.settings/org.eclipse.core.resources.prefs
rename to jack-coverage/plugin/.settings/org.eclipse.core.resources.prefs
diff --git a/jack-coverage/.settings/org.eclipse.jdt.core.prefs b/jack-coverage/plugin/.settings/org.eclipse.jdt.core.prefs
similarity index 100%
rename from jack-coverage/.settings/org.eclipse.jdt.core.prefs
rename to jack-coverage/plugin/.settings/org.eclipse.jdt.core.prefs
diff --git a/jack-coverage/.settings/org.eclipse.jdt.ui.prefs b/jack-coverage/plugin/.settings/org.eclipse.jdt.ui.prefs
similarity index 100%
rename from jack-coverage/.settings/org.eclipse.jdt.ui.prefs
rename to jack-coverage/plugin/.settings/org.eclipse.jdt.ui.prefs
diff --git a/jack-coverage/.settings/org.eclipse.ltk.core.refactoring.prefs b/jack-coverage/plugin/.settings/org.eclipse.ltk.core.refactoring.prefs
similarity index 100%
rename from jack-coverage/.settings/org.eclipse.ltk.core.refactoring.prefs
rename to jack-coverage/plugin/.settings/org.eclipse.ltk.core.refactoring.prefs
diff --git a/jack-coverage/plugin/Android.mk b/jack-coverage/plugin/Android.mk
new file mode 100644
index 0000000..b23622d
--- /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
+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/rsc/META-INF/services/com.android.jack.plugin.v01.Plugin b/jack-coverage/plugin/rsc/META-INF/services/com.android.jack.plugin.v01.Plugin
similarity index 100%
rename from jack-coverage/rsc/META-INF/services/com.android.jack.plugin.v01.Plugin
rename to jack-coverage/plugin/rsc/META-INF/services/com.android.jack.plugin.v01.Plugin
diff --git a/jack-coverage/src/com/android/jack/coverage/CodeCoverageAnalyzer.java b/jack-coverage/plugin/src/com/android/jack/coverage/CodeCoverageAnalyzer.java
similarity index 100%
rename from jack-coverage/src/com/android/jack/coverage/CodeCoverageAnalyzer.java
rename to jack-coverage/plugin/src/com/android/jack/coverage/CodeCoverageAnalyzer.java
diff --git a/jack-coverage/src/com/android/jack/coverage/CodeCoverageFeature.java b/jack-coverage/plugin/src/com/android/jack/coverage/CodeCoverageFeature.java
similarity index 100%
rename from jack-coverage/src/com/android/jack/coverage/CodeCoverageFeature.java
rename to jack-coverage/plugin/src/com/android/jack/coverage/CodeCoverageFeature.java
diff --git a/jack-coverage/src/com/android/jack/coverage/CodeCoverageLookupException.java b/jack-coverage/plugin/src/com/android/jack/coverage/CodeCoverageLookupException.java
similarity index 100%
rename from jack-coverage/src/com/android/jack/coverage/CodeCoverageLookupException.java
rename to jack-coverage/plugin/src/com/android/jack/coverage/CodeCoverageLookupException.java
diff --git a/jack-coverage/src/com/android/jack/coverage/CodeCoverageMarker.java b/jack-coverage/plugin/src/com/android/jack/coverage/CodeCoverageMarker.java
similarity index 100%
rename from jack-coverage/src/com/android/jack/coverage/CodeCoverageMarker.java
rename to jack-coverage/plugin/src/com/android/jack/coverage/CodeCoverageMarker.java
diff --git a/jack-coverage/src/com/android/jack/coverage/CodeCoverageMetadataFile.java b/jack-coverage/plugin/src/com/android/jack/coverage/CodeCoverageMetadataFile.java
similarity index 100%
rename from jack-coverage/src/com/android/jack/coverage/CodeCoverageMetadataFile.java
rename to jack-coverage/plugin/src/com/android/jack/coverage/CodeCoverageMetadataFile.java
diff --git a/jack-coverage/src/com/android/jack/coverage/CodeCoverageMetadataFileWriter.java b/jack-coverage/plugin/src/com/android/jack/coverage/CodeCoverageMetadataFileWriter.java
similarity index 100%
rename from jack-coverage/src/com/android/jack/coverage/CodeCoverageMetadataFileWriter.java
rename to jack-coverage/plugin/src/com/android/jack/coverage/CodeCoverageMetadataFileWriter.java
diff --git a/jack-coverage/src/com/android/jack/coverage/CodeCoveragePlugin.java b/jack-coverage/plugin/src/com/android/jack/coverage/CodeCoveragePlugin.java
similarity index 100%
rename from jack-coverage/src/com/android/jack/coverage/CodeCoveragePlugin.java
rename to jack-coverage/plugin/src/com/android/jack/coverage/CodeCoveragePlugin.java
diff --git a/jack-coverage/src/com/android/jack/coverage/CodeCoverageSelector.java b/jack-coverage/plugin/src/com/android/jack/coverage/CodeCoverageSelector.java
similarity index 100%
rename from jack-coverage/src/com/android/jack/coverage/CodeCoverageSelector.java
rename to jack-coverage/plugin/src/com/android/jack/coverage/CodeCoverageSelector.java
diff --git a/jack-coverage/src/com/android/jack/coverage/CodeCoverageTransformer.java b/jack-coverage/plugin/src/com/android/jack/coverage/CodeCoverageTransformer.java
similarity index 100%
rename from jack-coverage/src/com/android/jack/coverage/CodeCoverageTransformer.java
rename to jack-coverage/plugin/src/com/android/jack/coverage/CodeCoverageTransformer.java
diff --git a/jack-coverage/src/com/android/jack/coverage/CoverageFilter.java b/jack-coverage/plugin/src/com/android/jack/coverage/CoverageFilter.java
similarity index 100%
rename from jack-coverage/src/com/android/jack/coverage/CoverageFilter.java
rename to jack-coverage/plugin/src/com/android/jack/coverage/CoverageFilter.java
diff --git a/jack-coverage/src/com/android/jack/coverage/CoverageFilterSet.java b/jack-coverage/plugin/src/com/android/jack/coverage/CoverageFilterSet.java
similarity index 100%
rename from jack-coverage/src/com/android/jack/coverage/CoverageFilterSet.java
rename to jack-coverage/plugin/src/com/android/jack/coverage/CoverageFilterSet.java
diff --git a/jack-coverage/src/com/android/jack/coverage/CoverageFilterSetCodec.java b/jack-coverage/plugin/src/com/android/jack/coverage/CoverageFilterSetCodec.java
similarity index 100%
rename from jack-coverage/src/com/android/jack/coverage/CoverageFilterSetCodec.java
rename to jack-coverage/plugin/src/com/android/jack/coverage/CoverageFilterSetCodec.java
diff --git a/jack-coverage/src/com/android/jack/coverage/CoveragePattern.java b/jack-coverage/plugin/src/com/android/jack/coverage/CoveragePattern.java
similarity index 100%
rename from jack-coverage/src/com/android/jack/coverage/CoveragePattern.java
rename to jack-coverage/plugin/src/com/android/jack/coverage/CoveragePattern.java
diff --git a/jack-coverage/src/com/android/jack/coverage/CoveragePatternCodec.java b/jack-coverage/plugin/src/com/android/jack/coverage/CoveragePatternCodec.java
similarity index 100%
rename from jack-coverage/src/com/android/jack/coverage/CoveragePatternCodec.java
rename to jack-coverage/plugin/src/com/android/jack/coverage/CoveragePatternCodec.java
diff --git a/jack-coverage/src/com/android/jack/coverage/CoverageScope.java b/jack-coverage/plugin/src/com/android/jack/coverage/CoverageScope.java
similarity index 100%
rename from jack-coverage/src/com/android/jack/coverage/CoverageScope.java
rename to jack-coverage/plugin/src/com/android/jack/coverage/CoverageScope.java
diff --git a/jack-coverage/src/com/android/jack/coverage/JacocoPackage.java b/jack-coverage/plugin/src/com/android/jack/coverage/JacocoPackage.java
similarity index 100%
rename from jack-coverage/src/com/android/jack/coverage/JacocoPackage.java
rename to jack-coverage/plugin/src/com/android/jack/coverage/JacocoPackage.java
diff --git a/jack-coverage/src/com/android/jack/coverage/ProbeDescription.java b/jack-coverage/plugin/src/com/android/jack/coverage/ProbeDescription.java
similarity index 100%
rename from jack-coverage/src/com/android/jack/coverage/ProbeDescription.java
rename to jack-coverage/plugin/src/com/android/jack/coverage/ProbeDescription.java
diff --git a/jack-coverage/src/com/android/jack/coverage/ProbeMarker.java b/jack-coverage/plugin/src/com/android/jack/coverage/ProbeMarker.java
similarity index 100%
rename from jack-coverage/src/com/android/jack/coverage/ProbeMarker.java
rename to jack-coverage/plugin/src/com/android/jack/coverage/ProbeMarker.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/AllCoverageTests.java b/jack-coverage/plugin/tests/com/android/jack/coverage/AllCoverageTests.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/AllCoverageTests.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/AllCoverageTests.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/AllUnitTests.java b/jack-coverage/plugin/tests/com/android/jack/coverage/AllUnitTests.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/AllUnitTests.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/AllUnitTests.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/CoverageFilterSetCodecTest.java b/jack-coverage/plugin/tests/com/android/jack/coverage/CoverageFilterSetCodecTest.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/CoverageFilterSetCodecTest.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/CoverageFilterSetCodecTest.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/CoverageFilterSetTest.java b/jack-coverage/plugin/tests/com/android/jack/coverage/CoverageFilterSetTest.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/CoverageFilterSetTest.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/CoverageFilterSetTest.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/CoverageFilterTest.java b/jack-coverage/plugin/tests/com/android/jack/coverage/CoverageFilterTest.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/CoverageFilterTest.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/CoverageFilterTest.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/CoverageJava8Tests.java b/jack-coverage/plugin/tests/com/android/jack/coverage/CoverageJava8Tests.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/CoverageJava8Tests.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/CoverageJava8Tests.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/CoveragePatternCodecTest.java b/jack-coverage/plugin/tests/com/android/jack/coverage/CoveragePatternCodecTest.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/CoveragePatternCodecTest.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/CoveragePatternCodecTest.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/CoveragePatternTest.java b/jack-coverage/plugin/tests/com/android/jack/coverage/CoveragePatternTest.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/CoveragePatternTest.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/CoveragePatternTest.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/CoverageShrobTests.java b/jack-coverage/plugin/tests/com/android/jack/coverage/CoverageShrobTests.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/CoverageShrobTests.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/CoverageShrobTests.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/CoverageTest.java b/jack-coverage/plugin/tests/com/android/jack/coverage/CoverageTest.java
similarity index 94%
rename from jack-coverage/tests/com/android/jack/coverage/CoverageTest.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/CoverageTest.java
index c04bd03..08ed6be 100644
--- a/jack-coverage/tests/com/android/jack/coverage/CoverageTest.java
+++ b/jack-coverage/plugin/tests/com/android/jack/coverage/CoverageTest.java
@@ -54,10 +54,11 @@
    */
   @Nonnull
   protected static final File getTestRootDir(@Nonnull String testPackageName) {
-    File jackRootDir = TestsProperties.getJackRootDir();
-    File jackCoverageDir = new File(jackRootDir, "jack-coverage");
-    File jackCoverageTestsDir = new File(jackCoverageDir, "tests");
-    return new File(jackCoverageTestsDir, testPackageName.replace('.', File.separatorChar));
+    File rootDir = TestsProperties.getJackRootDir();
+    rootDir = new File(rootDir, "jack-coverage");
+    rootDir = new File(rootDir, "plugin");
+    rootDir = new File(rootDir, "tests");
+    return new File(rootDir, testPackageName.replace('.', File.separatorChar));
   }
 
   @Nonnull
diff --git a/jack-coverage/tests/com/android/jack/coverage/CoverageTests.java b/jack-coverage/plugin/tests/com/android/jack/coverage/CoverageTests.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/CoverageTests.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/CoverageTests.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/CoverageToolchainBuilder.java b/jack-coverage/plugin/tests/com/android/jack/coverage/CoverageToolchainBuilder.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/CoverageToolchainBuilder.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/CoverageToolchainBuilder.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/java8/test001/Foo.java b/jack-coverage/plugin/tests/com/android/jack/coverage/java8/test001/Foo.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/java8/test001/Foo.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/java8/test001/Foo.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/java8/test001/SAM.java b/jack-coverage/plugin/tests/com/android/jack/coverage/java8/test001/SAM.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/java8/test001/SAM.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/java8/test001/SAM.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/java8/test002/Foo.java b/jack-coverage/plugin/tests/com/android/jack/coverage/java8/test002/Foo.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/java8/test002/Foo.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/java8/test002/Foo.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/java8/test002/SAM.java b/jack-coverage/plugin/tests/com/android/jack/coverage/java8/test002/SAM.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/java8/test002/SAM.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/java8/test002/SAM.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/shrob/test001/Bar.java b/jack-coverage/plugin/tests/com/android/jack/coverage/shrob/test001/Bar.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/shrob/test001/Bar.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/shrob/test001/Bar.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/shrob/test001/Foo.java b/jack-coverage/plugin/tests/com/android/jack/coverage/shrob/test001/Foo.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/shrob/test001/Foo.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/shrob/test001/Foo.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/shrob/test001/proguard.flags b/jack-coverage/plugin/tests/com/android/jack/coverage/shrob/test001/proguard.flags
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/shrob/test001/proguard.flags
rename to jack-coverage/plugin/tests/com/android/jack/coverage/shrob/test001/proguard.flags
diff --git a/jack-coverage/tests/com/android/jack/coverage/shrob/test002/Foo.java b/jack-coverage/plugin/tests/com/android/jack/coverage/shrob/test002/Foo.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/shrob/test002/Foo.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/shrob/test002/Foo.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/shrob/test002/proguard.flags b/jack-coverage/plugin/tests/com/android/jack/coverage/shrob/test002/proguard.flags
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/shrob/test002/proguard.flags
rename to jack-coverage/plugin/tests/com/android/jack/coverage/shrob/test002/proguard.flags
diff --git a/jack-coverage/tests/com/android/jack/coverage/shrob/test002/sub/Bar.java b/jack-coverage/plugin/tests/com/android/jack/coverage/shrob/test002/sub/Bar.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/shrob/test002/sub/Bar.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/shrob/test002/sub/Bar.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/test001/AbstractClass.java b/jack-coverage/plugin/tests/com/android/jack/coverage/test001/AbstractClass.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/test001/AbstractClass.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/test001/AbstractClass.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/test002/EmptyInterface.java b/jack-coverage/plugin/tests/com/android/jack/coverage/test002/EmptyInterface.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/test002/EmptyInterface.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/test002/EmptyInterface.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/test002/InterfaceWithInit.java b/jack-coverage/plugin/tests/com/android/jack/coverage/test002/InterfaceWithInit.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/test002/InterfaceWithInit.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/test002/InterfaceWithInit.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/test003/foo/Foo.java b/jack-coverage/plugin/tests/com/android/jack/coverage/test003/foo/Foo.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/test003/foo/Foo.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/test003/foo/Foo.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/test003/foo/bar/Bar.java b/jack-coverage/plugin/tests/com/android/jack/coverage/test003/foo/bar/Bar.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/test003/foo/bar/Bar.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/test003/foo/bar/Bar.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/test004/lib/LibClass.java b/jack-coverage/plugin/tests/com/android/jack/coverage/test004/lib/LibClass.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/test004/lib/LibClass.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/test004/lib/LibClass.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/test004/src/SrcClass.java b/jack-coverage/plugin/tests/com/android/jack/coverage/test004/src/SrcClass.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/test004/src/SrcClass.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/test004/src/SrcClass.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/test005/jack/LibClass.java b/jack-coverage/plugin/tests/com/android/jack/coverage/test005/jack/LibClass.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/test005/jack/LibClass.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/test005/jack/LibClass.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/test005/jack/SrcClass.java b/jack-coverage/plugin/tests/com/android/jack/coverage/test005/jack/SrcClass.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/test005/jack/SrcClass.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/test005/jack/SrcClass.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/test005/proguard.flags b/jack-coverage/plugin/tests/com/android/jack/coverage/test005/proguard.flags
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/test005/proguard.flags
rename to jack-coverage/plugin/tests/com/android/jack/coverage/test005/proguard.flags
diff --git a/jack-coverage/tests/com/android/jack/coverage/test006_v1/jack/SrcClass.java b/jack-coverage/plugin/tests/com/android/jack/coverage/test006_v1/jack/SrcClass.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/test006_v1/jack/SrcClass.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/test006_v1/jack/SrcClass.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/test006_v2/jack/SrcClass.java b/jack-coverage/plugin/tests/com/android/jack/coverage/test006_v2/jack/SrcClass.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/test006_v2/jack/SrcClass.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/test006_v2/jack/SrcClass.java
diff --git a/jack-coverage/tests/com/android/jack/coverage/test007/ThrowClass.java b/jack-coverage/plugin/tests/com/android/jack/coverage/test007/ThrowClass.java
similarity index 100%
rename from jack-coverage/tests/com/android/jack/coverage/test007/ThrowClass.java
rename to jack-coverage/plugin/tests/com/android/jack/coverage/test007/ThrowClass.java
diff --git a/jack-jacoco-reporter/.checkstyle b/jack-coverage/reporter/.checkstyle
similarity index 100%
rename from jack-jacoco-reporter/.checkstyle
rename to jack-coverage/reporter/.checkstyle
diff --git a/jack-jacoco-reporter/.classpath b/jack-coverage/reporter/.classpath
similarity index 100%
rename from jack-jacoco-reporter/.classpath
rename to jack-coverage/reporter/.classpath
diff --git a/jack-jacoco-reporter/.project b/jack-coverage/reporter/.project
similarity index 100%
rename from jack-jacoco-reporter/.project
rename to jack-coverage/reporter/.project
diff --git a/jack-coverage/.settings/edu.umd.cs.findbugs.core.prefs b/jack-coverage/reporter/.settings/edu.umd.cs.findbugs.core.prefs
similarity index 100%
copy from jack-coverage/.settings/edu.umd.cs.findbugs.core.prefs
copy to jack-coverage/reporter/.settings/edu.umd.cs.findbugs.core.prefs
diff --git a/jack-coverage/.settings/org.eclipse.core.resources.prefs b/jack-coverage/reporter/.settings/org.eclipse.core.resources.prefs
similarity index 100%
copy from jack-coverage/.settings/org.eclipse.core.resources.prefs
copy to jack-coverage/reporter/.settings/org.eclipse.core.resources.prefs
diff --git a/jack-jacoco-reporter/.settings/org.eclipse.jdt.core.prefs b/jack-coverage/reporter/.settings/org.eclipse.jdt.core.prefs
similarity index 100%
rename from jack-jacoco-reporter/.settings/org.eclipse.jdt.core.prefs
rename to jack-coverage/reporter/.settings/org.eclipse.jdt.core.prefs
diff --git a/jack-jacoco-reporter/.settings/org.eclipse.jdt.ui.prefs b/jack-coverage/reporter/.settings/org.eclipse.jdt.ui.prefs
similarity index 100%
rename from jack-jacoco-reporter/.settings/org.eclipse.jdt.ui.prefs
rename to jack-coverage/reporter/.settings/org.eclipse.jdt.ui.prefs
diff --git a/jack-jacoco-reporter/etc/manifest.txt b/jack-coverage/reporter/etc/manifest.txt
similarity index 100%
rename from jack-jacoco-reporter/etc/manifest.txt
rename to jack-coverage/reporter/etc/manifest.txt
diff --git a/jack-jacoco-reporter/jackstyle.xml b/jack-coverage/reporter/jackstyle.xml
similarity index 100%
rename from jack-jacoco-reporter/jackstyle.xml
rename to jack-coverage/reporter/jackstyle.xml
diff --git a/jack-jacoco-reporter/src/com/android/jack/tools/jacoco/Constants.java b/jack-coverage/reporter/src/com/android/jack/tools/jacoco/Constants.java
similarity index 100%
rename from jack-jacoco-reporter/src/com/android/jack/tools/jacoco/Constants.java
rename to jack-coverage/reporter/src/com/android/jack/tools/jacoco/Constants.java
diff --git a/jack-jacoco-reporter/src/com/android/jack/tools/jacoco/ExitStatus.java b/jack-coverage/reporter/src/com/android/jack/tools/jacoco/ExitStatus.java
similarity index 100%
rename from jack-jacoco-reporter/src/com/android/jack/tools/jacoco/ExitStatus.java
rename to jack-coverage/reporter/src/com/android/jack/tools/jacoco/ExitStatus.java
diff --git a/jack-jacoco-reporter/src/com/android/jack/tools/jacoco/JackCoverageAnalyzer.java b/jack-coverage/reporter/src/com/android/jack/tools/jacoco/JackCoverageAnalyzer.java
similarity index 100%
rename from jack-jacoco-reporter/src/com/android/jack/tools/jacoco/JackCoverageAnalyzer.java
rename to jack-coverage/reporter/src/com/android/jack/tools/jacoco/JackCoverageAnalyzer.java
diff --git a/jack-jacoco-reporter/src/com/android/jack/tools/jacoco/JackMethodCoverage.java b/jack-coverage/reporter/src/com/android/jack/tools/jacoco/JackMethodCoverage.java
similarity index 100%
rename from jack-jacoco-reporter/src/com/android/jack/tools/jacoco/JackMethodCoverage.java
rename to jack-coverage/reporter/src/com/android/jack/tools/jacoco/JackMethodCoverage.java
diff --git a/jack-jacoco-reporter/src/com/android/jack/tools/jacoco/Main.java b/jack-coverage/reporter/src/com/android/jack/tools/jacoco/Main.java
similarity index 100%
rename from jack-jacoco-reporter/src/com/android/jack/tools/jacoco/Main.java
rename to jack-coverage/reporter/src/com/android/jack/tools/jacoco/Main.java
diff --git a/jack-jacoco-reporter/src/com/android/jack/tools/jacoco/MappingFileLoader.java b/jack-coverage/reporter/src/com/android/jack/tools/jacoco/MappingFileLoader.java
similarity index 100%
rename from jack-jacoco-reporter/src/com/android/jack/tools/jacoco/MappingFileLoader.java
rename to jack-coverage/reporter/src/com/android/jack/tools/jacoco/MappingFileLoader.java
diff --git a/jack-jacoco-reporter/src/com/android/jack/tools/jacoco/NamingUtils.java b/jack-coverage/reporter/src/com/android/jack/tools/jacoco/NamingUtils.java
similarity index 100%
rename from jack-jacoco-reporter/src/com/android/jack/tools/jacoco/NamingUtils.java
rename to jack-coverage/reporter/src/com/android/jack/tools/jacoco/NamingUtils.java
diff --git a/jack-jacoco-reporter/src/com/android/jack/tools/jacoco/Options.java b/jack-coverage/reporter/src/com/android/jack/tools/jacoco/Options.java
similarity index 100%
rename from jack-jacoco-reporter/src/com/android/jack/tools/jacoco/Options.java
rename to jack-coverage/reporter/src/com/android/jack/tools/jacoco/Options.java
diff --git a/jack-jacoco-reporter/src/com/android/jack/tools/jacoco/ProbeDescription.java b/jack-coverage/reporter/src/com/android/jack/tools/jacoco/ProbeDescription.java
similarity index 100%
rename from jack-jacoco-reporter/src/com/android/jack/tools/jacoco/ProbeDescription.java
rename to jack-coverage/reporter/src/com/android/jack/tools/jacoco/ProbeDescription.java
diff --git a/jack-jacoco-reporter/src/com/android/jack/tools/jacoco/ReportType.java b/jack-coverage/reporter/src/com/android/jack/tools/jacoco/ReportType.java
similarity index 100%
rename from jack-jacoco-reporter/src/com/android/jack/tools/jacoco/ReportType.java
rename to jack-coverage/reporter/src/com/android/jack/tools/jacoco/ReportType.java
diff --git a/jack-jacoco-reporter/src/com/android/jack/tools/jacoco/Reporter.java b/jack-coverage/reporter/src/com/android/jack/tools/jacoco/Reporter.java
similarity index 100%
rename from jack-jacoco-reporter/src/com/android/jack/tools/jacoco/Reporter.java
rename to jack-coverage/reporter/src/com/android/jack/tools/jacoco/Reporter.java
diff --git a/jack-jacoco-reporter/src/com/android/jack/tools/jacoco/ReporterException.java b/jack-coverage/reporter/src/com/android/jack/tools/jacoco/ReporterException.java
similarity index 100%
rename from jack-jacoco-reporter/src/com/android/jack/tools/jacoco/ReporterException.java
rename to jack-coverage/reporter/src/com/android/jack/tools/jacoco/ReporterException.java
diff --git a/jack-jacoco-reporter/tests/com/android/jack/tools/jacoco/AllTests.java b/jack-coverage/reporter/tests/com/android/jack/tools/jacoco/AllTests.java
similarity index 100%
rename from jack-jacoco-reporter/tests/com/android/jack/tools/jacoco/AllTests.java
rename to jack-coverage/reporter/tests/com/android/jack/tools/jacoco/AllTests.java
diff --git a/jack-jacoco-reporter/tests/com/android/jack/tools/jacoco/JackCoverageAnalyzerTest.java b/jack-coverage/reporter/tests/com/android/jack/tools/jacoco/JackCoverageAnalyzerTest.java
similarity index 100%
rename from jack-jacoco-reporter/tests/com/android/jack/tools/jacoco/JackCoverageAnalyzerTest.java
rename to jack-coverage/reporter/tests/com/android/jack/tools/jacoco/JackCoverageAnalyzerTest.java
diff --git a/jack-jacoco-reporter/tests/com/android/jack/tools/jacoco/MappingFileLoaderTest.java b/jack-coverage/reporter/tests/com/android/jack/tools/jacoco/MappingFileLoaderTest.java
similarity index 100%
rename from jack-jacoco-reporter/tests/com/android/jack/tools/jacoco/MappingFileLoaderTest.java
rename to jack-coverage/reporter/tests/com/android/jack/tools/jacoco/MappingFileLoaderTest.java
diff --git a/jack-jacoco-reporter/tests/com/android/jack/tools/jacoco/OptionsTest.java b/jack-coverage/reporter/tests/com/android/jack/tools/jacoco/OptionsTest.java
similarity index 100%
rename from jack-jacoco-reporter/tests/com/android/jack/tools/jacoco/OptionsTest.java
rename to jack-coverage/reporter/tests/com/android/jack/tools/jacoco/OptionsTest.java
diff --git a/jack-jacoco-reporter/tests/com/android/jack/tools/jacoco/ReporterTest.java b/jack-coverage/reporter/tests/com/android/jack/tools/jacoco/ReporterTest.java
similarity index 100%
rename from jack-jacoco-reporter/tests/com/android/jack/tools/jacoco/ReporterTest.java
rename to jack-coverage/reporter/tests/com/android/jack/tools/jacoco/ReporterTest.java
diff --git a/jack-jacoco-reporter/.settings/edu.umd.cs.findbugs.core.prefs b/jack-jacoco-reporter/.settings/edu.umd.cs.findbugs.core.prefs
deleted file mode 100644
index ea6af7a..0000000
--- a/jack-jacoco-reporter/.settings/edu.umd.cs.findbugs.core.prefs
+++ /dev/null
@@ -1,134 +0,0 @@
-#FindBugs User Preferences
-#Fri Feb 28 14:57:04 CET 2014
-cloud_id=edu.umd.cs.findbugs.cloud.doNothingCloud
-detectorAppendingToAnObjectOutputStream=AppendingToAnObjectOutputStream|true
-detectorAtomicityProblem=AtomicityProblem|true
-detectorBadAppletConstructor=BadAppletConstructor|false
-detectorBadResultSetAccess=BadResultSetAccess|true
-detectorBadSyntaxForRegularExpression=BadSyntaxForRegularExpression|true
-detectorBadUseOfReturnValue=BadUseOfReturnValue|true
-detectorBadlyOverriddenAdapter=BadlyOverriddenAdapter|true
-detectorBooleanReturnNull=BooleanReturnNull|true
-detectorCallToUnsupportedMethod=CallToUnsupportedMethod|false
-detectorCheckExpectedWarnings=CheckExpectedWarnings|false
-detectorCheckImmutableAnnotation=CheckImmutableAnnotation|true
-detectorCheckRelaxingNullnessAnnotation=CheckRelaxingNullnessAnnotation|true
-detectorCheckTypeQualifiers=CheckTypeQualifiers|true
-detectorCloneIdiom=CloneIdiom|true
-detectorComparatorIdiom=ComparatorIdiom|true
-detectorConfusedInheritance=ConfusedInheritance|true
-detectorConfusionBetweenInheritedAndOuterMethod=ConfusionBetweenInheritedAndOuterMethod|true
-detectorCrossSiteScripting=CrossSiteScripting|true
-detectorDefaultEncodingDetector=DefaultEncodingDetector|true
-detectorDoInsideDoPrivileged=DoInsideDoPrivileged|true
-detectorDontCatchIllegalMonitorStateException=DontCatchIllegalMonitorStateException|true
-detectorDontIgnoreResultOfPutIfAbsent=DontIgnoreResultOfPutIfAbsent|true
-detectorDontUseEnum=DontUseEnum|true
-detectorDroppedException=DroppedException|true
-detectorDumbMethodInvocations=DumbMethodInvocations|true
-detectorDumbMethods=DumbMethods|true
-detectorDuplicateBranches=DuplicateBranches|true
-detectorEmptyZipFileEntry=EmptyZipFileEntry|true
-detectorEqualsOperandShouldHaveClassCompatibleWithThis=EqualsOperandShouldHaveClassCompatibleWithThis|true
-detectorExplicitSerialization=ExplicitSerialization|true
-detectorFinalizerNullsFields=FinalizerNullsFields|true
-detectorFindBadCast2=FindBadCast2|true
-detectorFindBadForLoop=FindBadForLoop|true
-detectorFindCircularDependencies=FindCircularDependencies|false
-detectorFindDeadLocalStores=FindDeadLocalStores|true
-detectorFindDoubleCheck=FindDoubleCheck|true
-detectorFindEmptySynchronizedBlock=FindEmptySynchronizedBlock|true
-detectorFindFieldSelfAssignment=FindFieldSelfAssignment|true
-detectorFindFinalizeInvocations=FindFinalizeInvocations|true
-detectorFindFloatEquality=FindFloatEquality|true
-detectorFindHEmismatch=FindHEmismatch|true
-detectorFindInconsistentSync2=FindInconsistentSync2|true
-detectorFindJSR166LockMonitorenter=FindJSR166LockMonitorenter|true
-detectorFindLocalSelfAssignment2=FindLocalSelfAssignment2|true
-detectorFindMaskedFields=FindMaskedFields|true
-detectorFindMismatchedWaitOrNotify=FindMismatchedWaitOrNotify|true
-detectorFindNakedNotify=FindNakedNotify|true
-detectorFindNonShortCircuit=FindNonShortCircuit|true
-detectorFindNullDeref=FindNullDeref|true
-detectorFindNullDerefsInvolvingNonShortCircuitEvaluation=FindNullDerefsInvolvingNonShortCircuitEvaluation|true
-detectorFindOpenStream=FindOpenStream|true
-detectorFindPuzzlers=FindPuzzlers|true
-detectorFindRefComparison=FindRefComparison|true
-detectorFindReturnRef=FindReturnRef|true
-detectorFindRunInvocations=FindRunInvocations|true
-detectorFindSelfComparison=FindSelfComparison|true
-detectorFindSelfComparison2=FindSelfComparison2|true
-detectorFindSleepWithLockHeld=FindSleepWithLockHeld|true
-detectorFindSpinLoop=FindSpinLoop|true
-detectorFindSqlInjection=FindSqlInjection|true
-detectorFindTwoLockWait=FindTwoLockWait|true
-detectorFindUncalledPrivateMethods=FindUncalledPrivateMethods|true
-detectorFindUnconditionalWait=FindUnconditionalWait|true
-detectorFindUninitializedGet=FindUninitializedGet|true
-detectorFindUnrelatedTypesInGenericContainer=FindUnrelatedTypesInGenericContainer|true
-detectorFindUnreleasedLock=FindUnreleasedLock|true
-detectorFindUnsatisfiedObligation=FindUnsatisfiedObligation|true
-detectorFindUnsyncGet=FindUnsyncGet|true
-detectorFindUseOfNonSerializableValue=FindUseOfNonSerializableValue|true
-detectorFindUselessControlFlow=FindUselessControlFlow|true
-detectorFormatStringChecker=FormatStringChecker|true
-detectorHugeSharedStringConstants=HugeSharedStringConstants|true
-detectorIDivResultCastToDouble=IDivResultCastToDouble|true
-detectorIncompatMask=IncompatMask|true
-detectorInconsistentAnnotations=InconsistentAnnotations|true
-detectorInefficientMemberAccess=InefficientMemberAccess|false
-detectorInefficientToArray=InefficientToArray|true
-detectorInfiniteLoop=InfiniteLoop|true
-detectorInfiniteRecursiveLoop=InfiniteRecursiveLoop|true
-detectorInheritanceUnsafeGetResource=InheritanceUnsafeGetResource|true
-detectorInitializationChain=InitializationChain|true
-detectorInitializeNonnullFieldsInConstructor=InitializeNonnullFieldsInConstructor|true
-detectorInstantiateStaticClass=InstantiateStaticClass|true
-detectorIntCast2LongAsInstant=IntCast2LongAsInstant|true
-detectorInvalidJUnitTest=InvalidJUnitTest|true
-detectorIteratorIdioms=IteratorIdioms|true
-detectorLazyInit=LazyInit|true
-detectorLoadOfKnownNullValue=LoadOfKnownNullValue|true
-detectorLostLoggerDueToWeakReference=LostLoggerDueToWeakReference|true
-detectorMethodReturnCheck=MethodReturnCheck|true
-detectorMultithreadedInstanceAccess=MultithreadedInstanceAccess|true
-detectorMutableLock=MutableLock|true
-detectorMutableStaticFields=MutableStaticFields|true
-detectorNaming=Naming|true
-detectorNoteUnconditionalParamDerefs=NoteUnconditionalParamDerefs|true
-detectorNumberConstructor=NumberConstructor|true
-detectorOverridingEqualsNotSymmetrical=OverridingEqualsNotSymmetrical|true
-detectorPreferZeroLengthArrays=PreferZeroLengthArrays|true
-detectorPublicSemaphores=PublicSemaphores|false
-detectorQuestionableBooleanAssignment=QuestionableBooleanAssignment|true
-detectorReadOfInstanceFieldInMethodInvokedByConstructorInSuperclass=ReadOfInstanceFieldInMethodInvokedByConstructorInSuperclass|true
-detectorReadReturnShouldBeChecked=ReadReturnShouldBeChecked|true
-detectorRedundantInterfaces=RedundantInterfaces|true
-detectorRepeatedConditionals=RepeatedConditionals|true
-detectorRuntimeExceptionCapture=RuntimeExceptionCapture|true
-detectorSerializableIdiom=SerializableIdiom|true
-detectorStartInConstructor=StartInConstructor|true
-detectorStaticCalendarDetector=StaticCalendarDetector|true
-detectorStringConcatenation=StringConcatenation|true
-detectorSuperfluousInstanceOf=SuperfluousInstanceOf|true
-detectorSuspiciousThreadInterrupted=SuspiciousThreadInterrupted|true
-detectorSwitchFallthrough=SwitchFallthrough|true
-detectorSynchronizeAndNullCheckField=SynchronizeAndNullCheckField|true
-detectorSynchronizeOnClassLiteralNotGetClass=SynchronizeOnClassLiteralNotGetClass|true
-detectorSynchronizingOnContentsOfFieldToProtectField=SynchronizingOnContentsOfFieldToProtectField|true
-detectorURLProblems=URLProblems|true
-detectorUncallableMethodOfAnonymousClass=UncallableMethodOfAnonymousClass|true
-detectorUnnecessaryMath=UnnecessaryMath|true
-detectorUnreadFields=UnreadFields|true
-detectorUselessSubclassMethod=UselessSubclassMethod|false
-detectorVarArgsProblems=VarArgsProblems|true
-detectorVolatileUsage=VolatileUsage|true
-detectorWaitInLoop=WaitInLoop|true
-detectorWrongMapIterator=WrongMapIterator|true
-detectorXMLFactoryBypass=XMLFactoryBypass|true
-detector_threshold=2
-effort=default
-excludefilter0=.settings/findbugs-exclude.xml|true
-filter_settings=Medium|BAD_PRACTICE,CORRECTNESS,EXPERIMENTAL,MALICIOUS_CODE,MT_CORRECTNESS,PERFORMANCE,SECURITY,STYLE|false|20
-filter_settings_neg=NOISE,I18N|
-run_at_full_build=true
diff --git a/jack-jacoco-reporter/.settings/org.eclipse.core.resources.prefs b/jack-jacoco-reporter/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index 99f26c0..0000000
--- a/jack-jacoco-reporter/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,2 +0,0 @@
-eclipse.preferences.version=1
-encoding/<project>=UTF-8
diff --git a/jack-jar-tools/.classpath b/jack-jar-tools/.classpath
index 4a22221..4838580 100644
--- a/jack-jar-tools/.classpath
+++ b/jack-jar-tools/.classpath
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <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.6"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
 	<classpathentry kind="lib" path="libs/jsr305-lib.jar"/>
 	<classpathentry kind="lib" path="libs/args4j-lib.jar"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/Scheduler"/>
diff --git a/jack-jar-tools/.settings/org.eclipse.jdt.core.prefs b/jack-jar-tools/.settings/org.eclipse.jdt.core.prefs
index d4b25d9..3b86858 100644
--- a/jack-jar-tools/.settings/org.eclipse.jdt.core.prefs
+++ b/jack-jar-tools/.settings/org.eclipse.jdt.core.prefs
@@ -6,9 +6,9 @@
 org.eclipse.jdt.core.compiler.annotation.nullable=javax.annotation.CheckForNull
 org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -97,7 +97,7 @@
 org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.processAnnotations=disabled
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
 org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field=1585
 org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field.count_dependent=1585|-1|1585
diff --git a/jack-jar-tools/build.gradle b/jack-jar-tools/build.gradle
index 7e17051..7590f27 100644
--- a/jack-jar-tools/build.gradle
+++ b/jack-jar-tools/build.gradle
@@ -17,8 +17,8 @@
 apply plugin: 'java'
 apply plugin: 'com.github.johnrengelman.shadow'
 
-sourceCompatibility = 1.6
-targetCompatibility = 1.6
+sourceCompatibility = 1.8
+targetCompatibility = 1.8
 
 apply from: "$rootDir/gradle-script/checkstyle.gradle"
 apply from: "$rootDir/gradle-script/findbugs.gradle"
diff --git a/jack-tests/.classpath b/jack-tests/.classpath
index 4ba5943..49d610b 100644
--- a/jack-tests/.classpath
+++ b/jack-tests/.classpath
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <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.7"/>
-	<classpathentry excluding="com/android/jack/annotation/test014/jack/|com/android/jack/annotation/test015/jack/|com/android/jack/annotation/test016/jack/|com/android/jack/annotation/test017/jack/|com/android/jack/classpath/test002/lib1override/|com/android/jack/compiletime/test*/**|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/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/jarjar/test003/dontcompile/|com/android/jack/jarjar/test004/dontcompile/|com/android/jack/java8/annotation/|com/android/jack/java8/defaultmethod/|com/android/jack/java8/gwt/|com/android/jack/java8/inference/|com/android/jack/java8/intersectiontype/|com/android/jack/java8/lambda/|com/android/jack/java8/methodref/|com/android/jack/java8/retrolambda/|com/android/jack/java8/staticmethod/|com/android/jack/java8/variable/|com/android/jack/lookup/test001/liboverride/|com/android/jack/nopackage/test*/**|com/android/jack/optimizations/lambdas/test*/**|com/android/jack/jarjar/test006/dontcompile/|com/android/jack/java8/bridges/|com/android/jack/jill/test001/|com/android/jack/jill/test002/|com/android/jack/jill/test003/|com/android/jack/jill/test004/|com/android/jack/sourcepath/test002/jack/Sourcepath002.java|com/android/jack/annotation/test019/jack/|com/android/jack/frontend/test018/jack/|com/android/jack/annotation/test020/jack/|com/android/jack/assign/test002/jack/|com/android/jack/annotation/processor/sample2/src/|com/android/jack/shrob/test062/jack/Tests.java|com/android/jack/shrob/test062/jack/A.java|com/android/jack/coverage/test006_v1/jack/|com/android/jack/coverage/test006_v2/jack/|com/android/jack/multidex/test004/jack/|com/android/jack/shrob/test066/jack/MySuperInterfaceWithDefaultMethod.java|com/android/jack/shrob/test066/jack/MyClass.java|com/android/jack/shrob/test068/jack/I1.java|com/android/jack/shrob/test068/jack/I2.java|com/android/jack/shrob/test068/jack/I2Impl.java|com/android/jack/shrob/test068/jack/I2ImplImpl.java|com/android/jack/shrob/test068/jack/Kept.java|com/android/jack/shrob/test067/jack/MyInterfaceWithDefaultMethod.java|com/android/jack/shrob/test067/jack/MyClass.java|com/android/jack/shrob/test067/jack/Kept.java|com/android/jack/frontend/generic/test002/jack/|com/android/jack/frontend/generic/test003/jack/|com/android/jack/frontend/test019/jack/TooBig.java|com/android/jack/frontend/generic/test003/jack/|com/android/jack/java8/parameter/" kind="src" path="tests"/>
+	<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/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/.settings/org.eclipse.jdt.core.prefs b/jack-tests/.settings/org.eclipse.jdt.core.prefs
index eeaca9e..2aa601b 100644
--- a/jack-tests/.settings/org.eclipse.jdt.core.prefs
+++ b/jack-tests/.settings/org.eclipse.jdt.core.prefs
@@ -7,9 +7,9 @@
 org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
 org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -92,7 +92,7 @@
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
 org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.7
+org.eclipse.jdt.core.compiler.source=1.8
 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
 org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field=1585
 org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field.count_dependent=1585|-1|1585
diff --git a/jack-tests/build.gradle b/jack-tests/build.gradle
index 1133f5d..5c84b4c 100644
--- a/jack-tests/build.gradle
+++ b/jack-tests/build.gradle
@@ -18,8 +18,8 @@
   apply plugin: 'java'
   apply plugin: 'org.anarres.jarjar'
 
-  sourceCompatibility = 1.7
-  targetCompatibility = 1.7
+  sourceCompatibility = 1.8
+  targetCompatibility = 1.8
 
   apply from: "$rootDir/gradle-script/checkstyle.gradle"
   apply from: "$rootDir/gradle-script/findbugs.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/src/com/android/jack/test/comparator/ComparatorDex.java b/jack-tests/src/com/android/jack/test/comparator/ComparatorDex.java
index 00f47a1..486ff10 100644
--- a/jack-tests/src/com/android/jack/test/comparator/ComparatorDex.java
+++ b/jack-tests/src/com/android/jack/test/comparator/ComparatorDex.java
@@ -18,9 +18,10 @@
 
 import com.android.jack.comparator.DexComparator;
 import com.android.jack.comparator.DifferenceFoundException;
+import com.android.sched.util.file.CannotCloseException;
+import com.android.sched.util.file.CannotReadException;
 
 import java.io.File;
-import java.io.IOException;
 
 import javax.annotation.Nonnull;
 
@@ -74,7 +75,7 @@
     try {
       new DexComparator(withDebugInfo, strict, compareDebugInfoBinary, compareInstructionNumber,
           instructionNumberTolerance).compare(reference, candidate);
-    } catch (IOException e) {
+    } catch (CannotReadException | CannotCloseException e) {
       throw new ComparatorException(e);
     }
   }
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/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..1bc9191 100644
--- a/jack-tests/src/com/android/jack/test/toolchain/AbstractTestTools.java
+++ b/jack-tests/src/com/android/jack/test/toolchain/AbstractTestTools.java
@@ -839,6 +839,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 {
 
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 83de85c..731340d 100644
--- a/jack-tests/src/com/android/jack/test/toolchain/JackCliToolchain.java
+++ b/jack-tests/src/com/android/jack/test/toolchain/JackCliToolchain.java
@@ -19,7 +19,7 @@
 import com.google.common.base.Joiner;
 
 import com.android.jack.Options;
-import com.android.jack.Options.VerbosityLevel;
+import com.android.jack.VerbosityLevel;
 import com.android.jack.test.util.ExecFileException;
 import com.android.jack.test.util.ExecuteFile;
 
@@ -50,7 +50,7 @@
   @CheckForNull
   protected File incrementalFolder;
   @Nonnull
-  protected Options.VerbosityLevel verbosityLevel = VerbosityLevel.WARNING;
+  protected VerbosityLevel verbosityLevel = VerbosityLevel.WARNING;
   @Nonnull
   protected final Map<String, String> properties = new HashMap<String, String>();
 
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/clinit/ClinitTests.java b/jack-tests/tests/com/android/jack/clinit/ClinitTests.java
index 01262e1..6dd4dcc 100644
--- a/jack-tests/tests/com/android/jack/clinit/ClinitTests.java
+++ b/jack-tests/tests/com/android/jack/clinit/ClinitTests.java
@@ -16,15 +16,17 @@
 
 package com.android.jack.clinit;
 
+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.JillBasedToolchain;
 
 import org.junit.Test;
 
 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 +35,18 @@
     .srcToExe(
         AbstractTestTools.createTempDir(),
         /* zipFile = */ false,
-        AbstractTestTools.getTestRootDir("com.android.jack.clinit.jack"));
+        AbstractTestTools.getTestRootDir("com.android.jack.clinit.test001.jack"));
+  }
+
+  @Test
+  @KnownIssue(candidate=JillBasedToolchain.class)
+  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/dextag/DexTagTests.java b/jack-tests/tests/com/android/jack/dextag/DexTagTests.java
index fd3498c..c2e6b2d 100644
--- a/jack-tests/tests/com/android/jack/dextag/DexTagTests.java
+++ b/jack-tests/tests/com/android/jack/dextag/DexTagTests.java
@@ -20,13 +20,14 @@
 import com.android.jack.dx.io.DexBuffer;
 import com.android.jack.test.toolchain.AbstractTestTools;
 import com.android.jack.test.toolchain.JackBasedToolchain;
+import com.android.sched.util.file.CannotCloseException;
+import com.android.sched.util.file.CannotReadException;
 
 import junit.framework.Assert;
 
 import org.junit.Test;
 
 import java.io.File;
-import java.io.IOException;
 import java.util.Iterator;
 
 import javax.annotation.Nonnull;
@@ -49,7 +50,7 @@
     Assert.assertTrue(hasTag(classesDex));
   }
 
-  private boolean hasTag(@Nonnull File dexFile) throws IOException {
+  private boolean hasTag(@Nonnull File dexFile) throws CannotReadException, CannotCloseException {
     Iterator<String> stringsIt = new DexBuffer(dexFile).strings().iterator();
 
     while (stringsIt.hasNext()) {
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/experimental/incremental/DependenciesTest014.java b/jack-tests/tests/com/android/jack/experimental/incremental/DependenciesTest014.java
index d9c2359..b564534 100644
--- a/jack-tests/tests/com/android/jack/experimental/incremental/DependenciesTest014.java
+++ b/jack-tests/tests/com/android/jack/experimental/incremental/DependenciesTest014.java
@@ -19,6 +19,7 @@
 import com.android.jack.dx.io.DexBuffer;
 import com.android.jack.test.helper.IncrementalTestHelper;
 import com.android.jack.test.toolchain.AbstractTestTools;
+import com.android.sched.util.location.FileLocation;
 
 import junit.framework.Assert;
 
@@ -56,7 +57,7 @@
     ite.deleteJavaFile(f);
     ite.incrementalBuildFromFolder();
     try (InputStream is = new FileInputStream(ite.getDexFile())) {
-      DexBuffer db = new DexBuffer(is);
+      DexBuffer db = new DexBuffer(is, new FileLocation(ite.getDexFile()));
       for (String typeName : db.typeNames()) {
         if (typeName.equals("Ljack/incremental/B;")) {
           Assert.fail();
@@ -91,7 +92,7 @@
     ite.incrementalBuildFromFolder();
     DexBuffer db;
     try (InputStream is = new FileInputStream(ite.getDexFile())) {
-      db = new DexBuffer(is);
+      db = new DexBuffer(is, new FileLocation(ite.getDexFile()));
     }
     for (String typeName : db.typeNames()) {
       if (typeName.equals("Ljack/incremental/B;") ||
diff --git a/jack-tests/tests/com/android/jack/experimental/incremental/DependenciesTest015.java b/jack-tests/tests/com/android/jack/experimental/incremental/DependenciesTest015.java
index 9aa24e1..8268558 100644
--- a/jack-tests/tests/com/android/jack/experimental/incremental/DependenciesTest015.java
+++ b/jack-tests/tests/com/android/jack/experimental/incremental/DependenciesTest015.java
@@ -21,6 +21,7 @@
 import com.android.jack.test.helper.IncrementalTestHelper;
 import com.android.jack.test.toolchain.AbstractTestTools;
 import com.android.jack.test.toolchain.JackBasedToolchain.MultiDexKind;
+import com.android.sched.util.location.FileLocation;
 
 import junit.framework.Assert;
 
@@ -116,7 +117,7 @@
 
     DexBuffer db;
     try (InputStream is = new FileInputStream(iteProg.getDexFile())) {
-      db = new DexBuffer(is);
+      db = new DexBuffer(is, new FileLocation(iteProg.getDexFile()));
     }
     Assert.assertTrue(db.typeNames().contains("Ljack/incremental/A;"));
     Assert.assertTrue(db.typeNames().contains("Ljack/incremental/B;"));
@@ -133,7 +134,7 @@
     Assert.assertEquals(1, iteProg.getJayceCount());
 
     try (InputStream is = new FileInputStream(iteProg.getDexFile())) {
-      db = new DexBuffer(is);
+      db = new DexBuffer(is, new FileLocation(iteProg.getDexFile()));
     }
     Assert.assertTrue(db.typeNames().contains("Ljack/incremental/A;"));
     Assert.assertTrue(db.typeNames().contains("Ljack/incremental/B;"));
@@ -170,7 +171,7 @@
 
     DexBuffer db;
     try (InputStream is = new FileInputStream(iteProg.getDexFile())) {
-      db = new DexBuffer(is);
+      db = new DexBuffer(is, new FileLocation(iteProg.getDexFile()));
     }
     Assert.assertTrue(db.typeNames().contains("Ljack/incremental/A;"));
     Assert.assertTrue(db.typeNames().contains("Ljack/incremental/B;"));
@@ -189,7 +190,7 @@
     Assert.assertEquals(2, iteProg.getJayceCount());
 
     try (InputStream is = new FileInputStream(iteProg.getDexFile())) {
-      db = new DexBuffer(is);
+      db = new DexBuffer(is, new FileLocation(iteProg.getDexFile()));
     }
     Assert.assertTrue(db.typeNames().contains("Ljack/incremental/A;"));
     Assert.assertTrue(db.typeNames().contains("Ljack/incremental/B;"));
@@ -227,7 +228,7 @@
 
     DexBuffer db;
     try (InputStream is = new FileInputStream(iteProg.getDexFile())) {
-      db = new DexBuffer(is);
+      db = new DexBuffer(is, new FileLocation(iteProg.getDexFile()));
     }
     Assert.assertTrue(db.typeNames().contains("Ljack/incremental/A;"));
     Assert.assertTrue(db.typeNames().contains("Ljack/incremental/B;"));
@@ -244,7 +245,7 @@
     Assert.assertEquals(1, iteProg.getJayceCount());
 
     try (InputStream is = new FileInputStream(iteProg.getDexFile())) {
-      db = new DexBuffer(is);
+      db = new DexBuffer(is, new FileLocation(iteProg.getDexFile()));
     }
     Assert.assertTrue(db.typeNames().contains("Ljack/incremental/A;"));
     Assert.assertTrue(db.typeNames().contains("Ljack/incremental/B;"));
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/jarjar/JarjarTests.java b/jack-tests/tests/com/android/jack/jarjar/JarjarTests.java
index d63c60a..7fed66c 100644
--- a/jack-tests/tests/com/android/jack/jarjar/JarjarTests.java
+++ b/jack-tests/tests/com/android/jack/jarjar/JarjarTests.java
@@ -175,7 +175,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(
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/EcjInterfaceMethodsTest.java b/jack-tests/tests/com/android/jack/java8/EcjInterfaceMethodsTest.java
index d0727e0..31dce4f 100644
--- a/jack-tests/tests/com/android/jack/java8/EcjInterfaceMethodsTest.java
+++ b/jack-tests/tests/com/android/jack/java8/EcjInterfaceMethodsTest.java
@@ -199,7 +199,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..4826620 100644
--- a/jack-tests/tests/com/android/jack/java8/EcjLambdaTest.java
+++ b/jack-tests/tests/com/android/jack/java8/EcjLambdaTest.java
@@ -181,7 +181,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/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/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..b9a11fb 100644
--- a/jack-tests/tests/com/android/jack/java8/LambdaTest.java
+++ b/jack-tests/tests/com/android/jack/java8/LambdaTest.java
@@ -866,7 +866,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..1cdbeee 100644
--- a/jack-tests/tests/com/android/jack/java8/LambdaTestPostM.java
+++ b/jack-tests/tests/com/android/jack/java8/LambdaTestPostM.java
@@ -97,7 +97,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/ParameterNameTest.java b/jack-tests/tests/com/android/jack/java8/ParameterNameTest.java
index be751f7..551b3e0 100644
--- a/jack-tests/tests/com/android/jack/java8/ParameterNameTest.java
+++ b/jack-tests/tests/com/android/jack/java8/ParameterNameTest.java
@@ -45,45 +45,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)
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/clinit/jack/ClInitWithVariableInit.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/ClInitWithVariableInit.java
copy to jack-tests/tests/com/android/jack/java8/lambda/test044/jack/B2.java
index 8c344dd..4bc004a 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInitWithVariableInit.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,11 +14,16 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.java8.lambda.test044.jack;
 
-public class ClInitWithVariableInit {
+import com.android.jack.java8.lambda.test044.lib1.I2;
+import com.android.jack.java8.lambda.test044.lib1.subpkg.A2;
 
-  static {
-    int lv = 5;
+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/ClInitWithVariableInit.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/ClInitWithVariableInit.java
copy to jack-tests/tests/com/android/jack/java8/lambda/test044/jack/B3.java
index 8c344dd..664ac01 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInitWithVariableInit.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,11 +14,16 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.java8.lambda.test044.jack;
 
-public class ClInitWithVariableInit {
+import com.android.jack.java8.lambda.test044.lib1.I2;
+import com.android.jack.java8.lambda.test044.lib1.subpkg.A2;
 
-  static {
-    int lv = 5;
+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/ClInitWithVariableInit.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/ClInitWithVariableInit.java
copy to jack-tests/tests/com/android/jack/java8/lambda/test044/lib1/A4.java
index 8c344dd..02ab933 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInitWithVariableInit.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,11 +14,13 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.java8.lambda.test044.lib1;
 
-public class ClInitWithVariableInit {
 
-  static {
-    int lv = 5;
+public class A4 {
+
+  public I2 m() {
+    I2 i = () -> 4;
+    return i;
   }
 }
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInitWithVariableInit.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/ClInitWithVariableInit.java
copy to jack-tests/tests/com/android/jack/java8/lambda/test044/lib1/A5.java
index 8c344dd..37c6334 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInitWithVariableInit.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,11 +14,13 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.java8.lambda.test044.lib1;
 
-public class ClInitWithVariableInit {
 
-  static {
-    int lv = 5;
+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/ClInitWithVariableInit.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/ClInitWithVariableInit.java
copy to jack-tests/tests/com/android/jack/java8/lambda/test044/lib1/subpkg/A2.java
index 8c344dd..3a801e3 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInitWithVariableInit.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,11 +14,8 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.java8.lambda.test044.lib1.subpkg;
 
-public class ClInitWithVariableInit {
-
-  static {
-    int lv = 5;
-  }
+public class A2 {
+  protected int field = 10;
 }
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInitWithVariableInit.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/ClInitWithVariableInit.java
copy to jack-tests/tests/com/android/jack/java8/lambda/test044/lib2/A1.java
index 8c344dd..d7ac151 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInitWithVariableInit.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,11 +14,13 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.java8.lambda.test044.lib2;
 
-public class ClInitWithVariableInit {
 
-  static {
-    int lv = 5;
+public class A1 {
+
+  public I1 m() {
+    I1 i = () -> 1;
+    return i;
   }
 }
diff --git a/jack-tests/tests/com/android/jack/clinit/jack/ClInitWithVariableInit.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/ClInitWithVariableInit.java
copy to jack-tests/tests/com/android/jack/java8/lambda/test044/lib2/A3.java
index 8c344dd..2bff856 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInitWithVariableInit.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,11 +14,13 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.java8.lambda.test044.lib2;
 
-public class ClInitWithVariableInit {
 
-  static {
-    int lv = 5;
+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/ClInitWithVariableInit.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/ClInitWithVariableInit.java
copy to jack-tests/tests/com/android/jack/java8/parameter/common/ParameterTestModifier.java
index 8c344dd..89763b4 100644
--- a/jack-tests/tests/com/android/jack/clinit/jack/ClInitWithVariableInit.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,11 +14,11 @@
  * limitations under the License.
  */
 
-package com.android.jack.clinit.jack;
+package com.android.jack.java8.parameter.common;
 
-public class ClInitWithVariableInit {
-
-  static {
-    int lv = 5;
-  }
+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/multidex/MultiDexTests.java b/jack-tests/tests/com/android/jack/multidex/MultiDexTests.java
index 3b0b548..6c76032 100644
--- a/jack-tests/tests/com/android/jack/multidex/MultiDexTests.java
+++ b/jack-tests/tests/com/android/jack/multidex/MultiDexTests.java
@@ -41,6 +41,8 @@
 import com.android.jack.test.toolchain.JillBasedToolchain;
 import com.android.jack.test.toolchain.Toolchain.SourceLevel;
 import com.android.sched.util.TextUtils;
+import com.android.sched.util.file.CannotCloseException;
+import com.android.sched.util.file.CannotReadException;
 
 import junit.framework.Assert;
 
@@ -72,7 +74,7 @@
     public void compare() throws DifferenceFoundException, ComparatorException {
       try {
         ListingComparator.compare(reference, getListingOfDex(candidate));
-      } catch (IOException e) {
+      } catch (IOException | CannotCloseException | CannotReadException e) {
         throw new ComparatorException(e);
       }
     }
@@ -252,7 +254,8 @@
     toolchain.addProperty(PreProcessor.FILE.getName(), configFile.getAbsolutePath());
   }
 
-  private String getListingOfDex(@Nonnull File dex) throws IOException {
+  private String getListingOfDex(@Nonnull File dex)
+      throws CannotCloseException, CannotReadException {
     assert dex.isFile();
     StringBuilder sb = new StringBuilder();
     for (ClassDef def : new DexBuffer(dex).classDefs()) {
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/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/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/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/.classpath b/jack/.classpath
index ec7e2eb..e0d1ee8 100644
--- a/jack/.classpath
+++ b/jack/.classpath
@@ -16,7 +16,7 @@
 	<classpathentry kind="lib" path="libs/guava-lib.jar"/>
 	<classpathentry kind="lib" path="libs/jsr305-lib.jar"/>
 	<classpathentry kind="lib" path="libs/junit4.jar"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/jack-api"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/jill"/>
 	<classpathentry kind="output" path="bin"/>
diff --git a/jack/.settings/org.eclipse.jdt.core.prefs b/jack/.settings/org.eclipse.jdt.core.prefs
index 5ea7f7d..253bb09 100644
--- a/jack/.settings/org.eclipse.jdt.core.prefs
+++ b/jack/.settings/org.eclipse.jdt.core.prefs
@@ -7,9 +7,9 @@
 org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
 org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -100,7 +100,7 @@
 org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.processAnnotations=enabled
-org.eclipse.jdt.core.compiler.source=1.7
+org.eclipse.jdt.core.compiler.source=1.8
 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
 org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field=1585
 org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field.count_dependent=1585|-1|1585
diff --git a/jack/build.gradle b/jack/build.gradle
index c4b0867..0751ff9 100644
--- a/jack/build.gradle
+++ b/jack/build.gradle
@@ -24,8 +24,8 @@
     excludeFilter = file("config/findbugs/findbugs-exclude.xml")
 }
 
-sourceCompatibility = 1.7
-targetCompatibility = 1.7
+sourceCompatibility = 1.8
+targetCompatibility = 1.8
 
 sourceSets {
     main {
@@ -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/")
 }
 
@@ -240,8 +249,8 @@
   apply plugin: 'java'
   apply plugin: 'com.github.johnrengelman.shadow'
 
-  sourceCompatibility = 1.6
-  targetCompatibility = 1.6
+  sourceCompatibility = 1.8
+  targetCompatibility = 1.8
 
   compileJava.options.encoding = 'UTF-8'
 
diff --git a/jack/src/com/android/jack/Jack.java b/jack/src/com/android/jack/Jack.java
index 953abff..4015559 100644
--- a/jack/src/com/android/jack/Jack.java
+++ b/jack/src/com/android/jack/Jack.java
@@ -22,7 +22,6 @@
 import com.google.common.eventbus.EventBus;
 
 import com.android.jack.Options.AssertionPolicy;
-import com.android.jack.Options.SwitchEnumOptStrategy;
 import com.android.jack.abort.Aborter;
 import com.android.jack.analysis.DefinitionMarkerAdder;
 import com.android.jack.analysis.DefinitionMarkerRemover;
@@ -243,8 +242,6 @@
 import com.android.jack.transformations.EmptyClinitRemover;
 import com.android.jack.transformations.FieldInitializer;
 import com.android.jack.transformations.Jarjar;
-import com.android.jack.transformations.OptimizedSwitchEnumFeedbackFeature;
-import com.android.jack.transformations.OptimizedSwitchEnumNonFeedbackFeature;
 import com.android.jack.transformations.SanityChecks;
 import com.android.jack.transformations.UnusedLocalRemover;
 import com.android.jack.transformations.VisibilityBridgeAdder;
@@ -303,7 +300,10 @@
 import com.android.jack.transformations.enums.SwitchEnumSupport;
 import com.android.jack.transformations.enums.UsedEnumFieldCollector;
 import com.android.jack.transformations.enums.UsedEnumFieldMarkerRemover;
+import com.android.jack.transformations.enums.opt.OptimizedSwitchEnumFeedbackFeature;
+import com.android.jack.transformations.enums.opt.OptimizedSwitchEnumNonFeedbackFeature;
 import com.android.jack.transformations.enums.opt.OptimizedSwitchEnumSupport;
+import com.android.jack.transformations.enums.opt.SwitchEnumOptStrategy;
 import com.android.jack.transformations.enums.opt.SwitchEnumUsageCollector;
 import com.android.jack.transformations.exceptions.ExceptionRuntimeValueAdder;
 import com.android.jack.transformations.exceptions.TryCatchRemover;
@@ -713,9 +713,11 @@
             request.addFeature(CheckAndroidCompatibility.class);
           }
 
-          if (config.get(Options.OPTIMIZED_ENUM_SWITCH) == SwitchEnumOptStrategy.FEEDBACK) {
+          if (config.get(OptimizedSwitchEnumSupport.OPTIMIZED_ENUM_SWITCH)
+              == SwitchEnumOptStrategy.FEEDBACK) {
             request.addFeature(OptimizedSwitchEnumFeedbackFeature.class);
-          } else if (config.get(Options.OPTIMIZED_ENUM_SWITCH) == SwitchEnumOptStrategy.ALWAYS) {
+          } else if (config.get(OptimizedSwitchEnumSupport.OPTIMIZED_ENUM_SWITCH)
+              == SwitchEnumOptStrategy.ALWAYS) {
             request.addFeature(OptimizedSwitchEnumNonFeedbackFeature.class);
           }
 
diff --git a/jack/src/com/android/jack/Options.java b/jack/src/com/android/jack/Options.java
index a51513f..1f29c83 100644
--- a/jack/src/com/android/jack/Options.java
+++ b/jack/src/com/android/jack/Options.java
@@ -36,8 +36,6 @@
 import com.android.jack.plugin.NotJackPluginException;
 import com.android.jack.plugin.PluginManager;
 import com.android.jack.plugin.PluginNotFoundException;
-import com.android.jack.reporting.Reportable;
-import com.android.jack.reporting.Reportable.ProblemLevel;
 import com.android.jack.reporting.Reporter;
 import com.android.jack.reporting.Reporter.Severity;
 import com.android.jack.resource.ResourceImporter;
@@ -49,6 +47,8 @@
 import com.android.jack.shrob.obfuscation.annotation.ParameterAnnotationRemover;
 import com.android.jack.shrob.seed.SeedPrinter;
 import com.android.jack.shrob.spec.Flags;
+import com.android.jack.transformations.enums.opt.OptimizedSwitchEnumSupport;
+import com.android.jack.transformations.enums.opt.SwitchEnumOptStrategy;
 import com.android.jack.transformations.lambda.LambdaGroupingScope;
 import com.android.jack.transformations.renamepackage.PackageRenamer;
 import com.android.jack.util.AndroidApiLevel;
@@ -155,28 +155,6 @@
   @Nonnull
   private static final Logger logger = LoggerFactory.getLogger();
 
-  private static class DeprecatedVerbosity implements Reportable {
-    @Nonnull
-    private final VerbosityLevel verbosity;
-
-    private DeprecatedVerbosity(@Nonnull VerbosityLevel verbosity) {
-      this.verbosity = verbosity;
-    }
-
-    @Override
-    @Nonnull
-    public String getMessage() {
-      return "Verbosity level '" + verbosity.name().toLowerCase() + "' is deprecated";
-    }
-
-    @Override
-    @Nonnull
-    public ProblemLevel getDefaultProblemLevel() {
-      return ProblemLevel.WARNING;
-    }
-
-  }
-
   /**
    * Assertion policies
    */
@@ -270,19 +248,6 @@
       BooleanPropertyId.create("jack.dex", "Generate dex file").addDefaultValue(Boolean.FALSE)
           .addCategory(DumpInLibrary.class);
 
-  /**
-   * property used to specify the kind of switch enum optimization that is enabled. See(@link
-   * SwitchEnumOptStrategy)
-   */
-  @Nonnull
-  public static final EnumPropertyId<SwitchEnumOptStrategy> OPTIMIZED_ENUM_SWITCH =
-      EnumPropertyId.create(
-              "jack.optimization.enum.switch", "Optimize enum switch", SwitchEnumOptStrategy.class)
-          .addDefaultValue(SwitchEnumOptStrategy.NEVER)
-          .ignoreCase()
-          .addCategory(DumpInLibrary.class)
-          .addCategory(PrebuiltCompatibility.class);
-
   @Nonnull
   public static final BooleanPropertyId GENERATE_DEX_IN_LIBRARY = BooleanPropertyId
       .create("jack.library.dex", "Generate dex files in library").addDefaultValue(Boolean.TRUE)
@@ -431,63 +396,6 @@
 
   private final File propertiesFile = null;
 
-  /**
-   * Jack verbosity level.
-   * Note: The implementation of {@link ProblemLevel} assumes that the ordinal values of
-   * {@link VerbosityLevel} are ordered from the highest severity to the lowest.
-   */
-  @VariableName("level")
-  public enum VerbosityLevel {
-    @EnumName(name = "error")
-    ERROR("error"),
-    @EnumName(name = "warning")
-    WARNING("warning"),
-    @EnumName(name = "info")
-    INFO("info"),
-    @EnumName(name = "debug", hide = true)
-    @Deprecated DEBUG("debug"),
-    @EnumName(name = "trace", hide = true)
-    @Deprecated TRACE("trace");
-
-    @Nonnull
-    private final String id;
-
-    VerbosityLevel(@Nonnull String id) {
-      this.id = id;
-    }
-
-    public String getId() {
-      return id;
-    }
-  }
-
-  /**
-   * Types of switch enum optimization strategies.
-   * 1. feedback (set on by default)
-   * 2. always
-   * 3. never
-   */
-  @VariableName("strategy")
-  public enum SwitchEnumOptStrategy {
-    // feedback-based optimization: this strategy will be enabled/disabled based on the
-    // compile time information collected, e.g., if it is detected that an enum is only
-    // used in one/few switch statements, it is useless to optimize it. Potentially enable
-    // this strategy will cost more compilation time, but save more dex code
-    @EnumName(name = "feedback")
-    FEEDBACK(),
-    // different from feedback-based optimization, always strategy doesn't collect compile-
-    // time information to guide switch enum optimization. It will always enable switch enum
-    // optimization no matter the enum is rarely/frequently used. Ideally this strategy will
-    // compile code quicker than feedback-based strategy does, but the generated dex may be
-    // larger than feedback strategy
-    @EnumName(name = "always")
-    ALWAYS(),
-    // this actually is not real strategy, but we still need it because switch enum
-    // optimization is disabled when incremental compilation is triggered
-    @EnumName(name = "never")
-    NEVER();
-  }
-
   @Nonnull
   public static final EnumPropertyId<VerbosityLevel> VERBOSITY_LEVEL = EnumPropertyId.create(
       "jack.verbose.level", "Verbosity level", VerbosityLevel.class)
@@ -1343,7 +1251,8 @@
       // if the incremental compilation is enabled, the switch enum optimization cannot
       // be enabled because it will generates non-deterministic code. This has to be done after
       // -D options are set
-      configBuilder.set(OPTIMIZED_ENUM_SWITCH.getName(), SwitchEnumOptStrategy.NEVER);
+      configBuilder.set(
+          OptimizedSwitchEnumSupport.OPTIMIZED_ENUM_SWITCH.getName(), SwitchEnumOptStrategy.NEVER);
     }
 
     configBuilder.processEnvironmentVariables("JACK_CONFIG_");
@@ -1391,7 +1300,9 @@
     }
 
     if (verbose == VerbosityLevel.DEBUG || verbose == VerbosityLevel.TRACE) {
-      config.get(Reporter.REPORTER).report(Severity.NON_FATAL, new DeprecatedVerbosity(verbose));
+      config
+          .get(Reporter.REPORTER)
+          .report(Severity.NON_FATAL, new VerbosityLevel.DeprecatedVerbosity(verbose));
     }
   }
 
diff --git a/jack/src/com/android/jack/VerbosityLevel.java b/jack/src/com/android/jack/VerbosityLevel.java
new file mode 100644
index 0000000..b710946
--- /dev/null
+++ b/jack/src/com/android/jack/VerbosityLevel.java
@@ -0,0 +1,77 @@
+/*
+ * 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;
+
+import com.android.jack.reporting.Reportable;
+import com.android.jack.reporting.Reportable.ProblemLevel;
+import com.android.sched.util.codec.EnumName;
+import com.android.sched.util.codec.VariableName;
+
+import javax.annotation.Nonnull;
+
+/**
+ * Jack verbosity level.
+ * Note: The implementation of {@link ProblemLevel} assumes that the ordinal values of
+ * {@link VerbosityLevel} are ordered from the highest severity to the lowest.
+ */
+@VariableName("level")
+public enum VerbosityLevel {
+  @EnumName(name = "error")
+  ERROR("error"),
+  @EnumName(name = "warning")
+  WARNING("warning"),
+  @EnumName(name = "info")
+  INFO("info"),
+  @EnumName(name = "debug", hide = true)
+  @Deprecated DEBUG("debug"),
+  @EnumName(name = "trace", hide = true)
+  @Deprecated TRACE("trace");
+
+  @Nonnull
+  private final String id;
+
+  VerbosityLevel(@Nonnull String id) {
+    this.id = id;
+  }
+
+  @Nonnull
+  public String getId() {
+    return id;
+  }
+
+  static class DeprecatedVerbosity implements Reportable {
+    @Nonnull
+    private final VerbosityLevel verbosity;
+
+    DeprecatedVerbosity(@Nonnull VerbosityLevel verbosity) {
+      this.verbosity = verbosity;
+    }
+
+    @Override
+    @Nonnull
+    public String getMessage() {
+      return "Verbosity level '" + verbosity.name().toLowerCase() + "' is deprecated";
+    }
+
+    @Override
+    @Nonnull
+    public ProblemLevel getDefaultProblemLevel() {
+      return ProblemLevel.WARNING;
+    }
+
+  }
+}
\ No newline at end of file
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/api/v01/impl/Api01ConfigImpl.java b/jack/src/com/android/jack/api/v01/impl/Api01ConfigImpl.java
index cbdaec4..a5da41d 100644
--- a/jack/src/com/android/jack/api/v01/impl/Api01ConfigImpl.java
+++ b/jack/src/com/android/jack/api/v01/impl/Api01ConfigImpl.java
@@ -398,22 +398,22 @@
   @Override
   public void setVerbosityLevel(@Nonnull VerbosityLevel verbosityLevel)
       throws ConfigurationException {
-    com.android.jack.Options.VerbosityLevel jackVerbosityLevel;
+    com.android.jack.VerbosityLevel jackVerbosityLevel;
     switch (verbosityLevel) {
       case DEBUG: {
-        jackVerbosityLevel = com.android.jack.Options.VerbosityLevel.INFO;
+        jackVerbosityLevel = com.android.jack.VerbosityLevel.INFO;
         break;
       }
       case ERROR: {
-        jackVerbosityLevel = com.android.jack.Options.VerbosityLevel.ERROR;
+        jackVerbosityLevel = com.android.jack.VerbosityLevel.ERROR;
         break;
       }
       case INFO: {
-        jackVerbosityLevel = com.android.jack.Options.VerbosityLevel.INFO;
+        jackVerbosityLevel = com.android.jack.VerbosityLevel.INFO;
         break;
       }
       case WARNING: {
-        jackVerbosityLevel = com.android.jack.Options.VerbosityLevel.WARNING;
+        jackVerbosityLevel = com.android.jack.VerbosityLevel.WARNING;
         break;
       }
       default: {
diff --git a/jack/src/com/android/jack/api/v02/impl/Api02ConfigImpl.java b/jack/src/com/android/jack/api/v02/impl/Api02ConfigImpl.java
index 1b52ced..69f06cd 100644
--- a/jack/src/com/android/jack/api/v02/impl/Api02ConfigImpl.java
+++ b/jack/src/com/android/jack/api/v02/impl/Api02ConfigImpl.java
@@ -79,18 +79,18 @@
   @Override
   public void setVerbosityLevel(@Nonnull VerbosityLevel verbosityLevel)
       throws ConfigurationException {
-    com.android.jack.Options.VerbosityLevel jackVerbosityLevel;
+    com.android.jack.VerbosityLevel jackVerbosityLevel;
     switch (verbosityLevel) {
       case ERROR: {
-        jackVerbosityLevel = com.android.jack.Options.VerbosityLevel.ERROR;
+        jackVerbosityLevel = com.android.jack.VerbosityLevel.ERROR;
         break;
       }
       case INFO: {
-        jackVerbosityLevel = com.android.jack.Options.VerbosityLevel.INFO;
+        jackVerbosityLevel = com.android.jack.VerbosityLevel.INFO;
         break;
       }
       case WARNING: {
-        jackVerbosityLevel = com.android.jack.Options.VerbosityLevel.WARNING;
+        jackVerbosityLevel = com.android.jack.VerbosityLevel.WARNING;
         break;
       }
       default: {
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 1bb5944..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,23 +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));
-    } catch (IOException e) {
-      throw new DexWritingException(new CannotReadException(inputDex, e));
-    } catch (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/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/dx/io/DexBuffer.java b/jack/src/com/android/jack/dx/io/DexBuffer.java
index 5c68d13..b90e567 100644
--- a/jack/src/com/android/jack/dx/io/DexBuffer.java
+++ b/jack/src/com/android/jack/dx/io/DexBuffer.java
@@ -32,6 +32,11 @@
 import com.android.jack.dx.util.Leb128Utils;
 import com.android.jack.dx.util.Mutf8;
 import com.android.jack.tools.merger.MergerTools;
+import com.android.sched.util.file.CannotCloseException;
+import com.android.sched.util.file.CannotReadException;
+import com.android.sched.util.location.FileLocation;
+import com.android.sched.util.location.Location;
+import com.android.sched.util.location.ZipLocation;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -129,8 +134,8 @@
   /**
    * Creates a new dex buffer of the dex in {@code in}.
    */
-  public DexBuffer(InputStream in) throws IOException {
-    loadFrom(in);
+  public DexBuffer(@Nonnull InputStream in, @Nonnull Location location) throws CannotReadException {
+    loadFrom(in, location);
     this.internalSection = new Section(0);
     this.strings = readStrings();
     this.typeIds = readTypeIds();
@@ -144,21 +149,28 @@
   /**
    * Creates a new dex buffer from the dex file {@code file}.
    */
-  public DexBuffer(File file) throws IOException {
+  public DexBuffer(File file) throws CannotReadException, CannotCloseException {
+    FileLocation fileLocation = new FileLocation(file);
     if (FileUtils.hasArchiveSuffix(file.getName())) {
       try (ZipFile zipFile = new ZipFile(file)) {
         ZipEntry entry = zipFile.getEntry(DexFormat.DEX_IN_JAR_NAME);
         if (entry != null) {
           try (InputStream is = zipFile.getInputStream(entry)) {
-            loadFrom(is);
+            loadFrom(is, new ZipLocation(fileLocation, entry));
+          } catch (IOException e) {
+            throw new CannotCloseException(new ZipLocation(fileLocation, entry), e);
           }
         } else {
           throw new DexException("Expected " + DexFormat.DEX_IN_JAR_NAME + " in " + file);
         }
+      } catch (IOException e) {
+        throw new CannotCloseException(fileLocation, e);
       }
     } else if (file.getName().endsWith(".dex")) {
       try (InputStream is = new FileInputStream(file)) {
-        loadFrom(is);
+        loadFrom(is, fileLocation);
+      } catch (IOException e) {
+        throw new CannotCloseException(fileLocation, e);
       }
     } else {
       throw new DexException("unknown output extension: " + file);
@@ -255,13 +267,18 @@
     return Arrays.asList(result);
   }
 
-  private void loadFrom(InputStream in) throws IOException {
+  private void loadFrom(@Nonnull InputStream in, @Nonnull Location location)
+      throws CannotReadException {
     ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
     byte[] buffer = new byte[8192];
 
-    int count;
-    while ((count = in.read(buffer)) != -1) {
-      bytesOut.write(buffer, 0, count);
+    try {
+      int count;
+      while ((count = in.read(buffer)) != -1) {
+        bytesOut.write(buffer, 0, count);
+      }
+    } catch (IOException e) {
+      throw new CannotReadException(location, e);
     }
 
     this.data = bytesOut.toByteArray();
diff --git a/jack/src/com/android/jack/dx/io/DexIndexPrinter.java b/jack/src/com/android/jack/dx/io/DexIndexPrinter.java
index d194b43..dbd9cfc 100644
--- a/jack/src/com/android/jack/dx/io/DexIndexPrinter.java
+++ b/jack/src/com/android/jack/dx/io/DexIndexPrinter.java
@@ -17,9 +17,10 @@
 package com.android.jack.dx.io;
 
 import com.android.jack.dx.dex.TableOfContents;
+import com.android.sched.util.file.CannotCloseException;
+import com.android.sched.util.file.CannotReadException;
 
 import java.io.File;
-import java.io.IOException;
 
 /**
  * Executable that prints all indices of a dex file.
@@ -28,7 +29,7 @@
   private final DexBuffer dexBuffer;
   private final TableOfContents tableOfContents;
 
-  public DexIndexPrinter(File file) throws IOException {
+  public DexIndexPrinter(File file) throws CannotReadException, CannotCloseException {
     this.dexBuffer = new DexBuffer(file);
     this.tableOfContents = dexBuffer.getTableOfContents();
   }
@@ -110,7 +111,7 @@
     }
   }
 
-  public static void main(String[] args) throws IOException {
+  public static void main(String[] args) throws CannotReadException, CannotCloseException {
     DexIndexPrinter indexPrinter = new DexIndexPrinter(new File(args[0]));
     indexPrinter.printMap();
     indexPrinter.printStrings();
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/impl/BaseGenerationVisitor.java b/jack/src/com/android/jack/ir/impl/BaseGenerationVisitor.java
index 62bce20..1056276 100644
--- a/jack/src/com/android/jack/ir/impl/BaseGenerationVisitor.java
+++ b/jack/src/com/android/jack/ir/impl/BaseGenerationVisitor.java
@@ -715,7 +715,8 @@
     accept(x.getThenStmt());
     nestedStatementPop(x.getThenStmt());
 
-    if (x.getElseStmt() != null) {
+    JStatement elseStmt = x.getElseStmt();
+    if (elseStmt != null) {
       if (needSemi) {
         semi();
         newline();
@@ -724,15 +725,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/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/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..4e6b95e 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,12 +150,15 @@
     } 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) {
@@ -161,7 +166,7 @@
           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
+          // 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..e24bed6 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,12 +157,15 @@
     } 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) {
@@ -168,7 +173,7 @@
           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
+          // 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..610112f 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);
       }
 
@@ -186,7 +191,7 @@
           inputVFS = new MessageDigestFS(inputVFS,
                   ThreadConfig.get(JackLibraryFactory.MESSAGE_DIGEST_ALGO));
         } catch (BadVFSFormatException 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/library/v0003/OutputJackLibraryImpl.java b/jack/src/com/android/jack/library/v0003/OutputJackLibraryImpl.java
index e4ea796..d52d8b8 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,21 @@
       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));
         }
+      } 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 and digest exists 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/lookup/JLookup.java b/jack/src/com/android/jack/lookup/JLookup.java
index aaf0376..a431bbc 100644
--- a/jack/src/com/android/jack/lookup/JLookup.java
+++ b/jack/src/com/android/jack/lookup/JLookup.java
@@ -262,17 +262,22 @@
     T type;
     synchronized (cache) {
       type = cache.get(signature);
+    }
 
-      if (type == null) {
-        int typeNameLength = signature.length();
-        assert typeNameLength > 1 : "Invalid signature '" + signature + "'";
-        if (signature.charAt(0) == '[') {
-          type = (T) findArrayType(signature);
-        } else {
-          type = findClassOrInterface(signature, adapter);
-        }
+    if (type == null) {
+      int typeNameLength = signature.length();
+      assert typeNameLength > 1 : "Invalid signature '" + signature + "'";
+      if (signature.charAt(0) == '[') {
+        type = (T) findArrayType(signature);
+      } else {
+        type = findClassOrInterface(signature, adapter);
+      }
+      synchronized (cache) {
+        // Model already ensures unicity of types, so the worst that could happen here would be to
+        // store the exact same type that is already stored.
+        assert cache.get(signature) == null || cache.get(signature) == type;
         cache.put(signature, type);
-     }
+      }
     }
     return type;
   }
diff --git a/jack/src/com/android/jack/reporting/CommonReporter.java b/jack/src/com/android/jack/reporting/CommonReporter.java
index ac0589b..242c778 100644
--- a/jack/src/com/android/jack/reporting/CommonReporter.java
+++ b/jack/src/com/android/jack/reporting/CommonReporter.java
@@ -18,7 +18,7 @@
 
 import com.android.jack.Jack;
 import com.android.jack.Options;
-import com.android.jack.Options.VerbosityLevel;
+import com.android.jack.VerbosityLevel;
 import com.android.jack.ir.HasSourceInfo;
 import com.android.jack.reporting.Reportable.ProblemLevel;
 import com.android.sched.util.config.ThreadConfig;
diff --git a/jack/src/com/android/jack/reporting/Reportable.java b/jack/src/com/android/jack/reporting/Reportable.java
index df34c27..956e23d 100644
--- a/jack/src/com/android/jack/reporting/Reportable.java
+++ b/jack/src/com/android/jack/reporting/Reportable.java
@@ -16,7 +16,7 @@
 
 package com.android.jack.reporting;
 
-import com.android.jack.Options.VerbosityLevel;
+import com.android.jack.VerbosityLevel;
 import com.android.sched.util.codec.EnumName;
 import com.android.sched.util.codec.VariableName;
 
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/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/string/FieldStringLiteralRefiner.java b/jack/src/com/android/jack/transformations/ast/string/FieldStringLiteralRefiner.java
index 7a7aab0..edee06b 100644
--- a/jack/src/com/android/jack/transformations/ast/string/FieldStringLiteralRefiner.java
+++ b/jack/src/com/android/jack/transformations/ast/string/FieldStringLiteralRefiner.java
@@ -33,7 +33,7 @@
 @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> {
 
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..5375d83 100644
--- a/jack/src/com/android/jack/transformations/ast/string/MethodStringLiteralRefiner.java
+++ b/jack/src/com/android/jack/transformations/ast/string/MethodStringLiteralRefiner.java
@@ -32,6 +32,7 @@
  */
 @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> {
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/TypeStringLiteralRefiner.java b/jack/src/com/android/jack/transformations/ast/string/TypeStringLiteralRefiner.java
index 81ea40c..f02921e 100644
--- a/jack/src/com/android/jack/transformations/ast/string/TypeStringLiteralRefiner.java
+++ b/jack/src/com/android/jack/transformations/ast/string/TypeStringLiteralRefiner.java
@@ -32,6 +32,7 @@
  */
 @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> {
@@ -40,7 +41,7 @@
   public void run(@Nonnull JDefinedClassOrInterface type) {
     TransformationRequest tr = new TransformationRequest(type);
     StringLiteralRefinerVisitor visitor = new StringLiteralRefinerVisitor(tr);
-    visitor.accept(type);
+    visitor.accept(type.getAnnotations());
     tr.commit();
   }
 
diff --git a/jack/src/com/android/jack/transformations/ast/string/parameterrefiners/CommonStringParameterRefiner.java b/jack/src/com/android/jack/transformations/ast/string/parameterrefiners/CommonStringParameterRefiner.java
index 78de47c..8e1c463 100644
--- a/jack/src/com/android/jack/transformations/ast/string/parameterrefiners/CommonStringParameterRefiner.java
+++ b/jack/src/com/android/jack/transformations/ast/string/parameterrefiners/CommonStringParameterRefiner.java
@@ -25,6 +25,7 @@
 import com.android.jack.ir.ast.JExpression;
 import com.android.jack.ir.ast.JMethodCall;
 import com.android.jack.ir.ast.JReferenceType;
+import com.android.jack.ir.ast.JReinterpretCastOperation;
 import com.android.jack.ir.ast.JStringLiteral;
 import com.android.jack.ir.ast.JType;
 import com.android.jack.ir.formatter.BinarySignatureFormatter;
@@ -81,6 +82,9 @@
 
     if (arg instanceof JStringLiteral) {
       return (JStringLiteral) arg;
+    } else if (arg instanceof JReinterpretCastOperation
+        && ((JReinterpretCastOperation) arg).getExpr() instanceof JStringLiteral) {
+      return (JStringLiteral) ((JReinterpretCastOperation) arg).getExpr();
     }
 
     return null;
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 f81fcef..f16caa0 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
@@ -93,7 +93,7 @@
     JMethodNameLiteral strMethodLiteral = null;
     String methodName = paramToRefine.getValue();
     JDefinedClassOrInterface type = getTypeFromClassLiteralExpression(call.getInstance());
-    String methodSignature = getMethodSignature(call);
+    String methodSignature = getMethodSignature(methodName, call);
 
     if (type != null && methodSignature != null) {
       JMethod method = lookupMethod(type, methodSignature);
@@ -120,17 +120,16 @@
   }
 
   @CheckForNull
-  private String getMethodSignature(@Nonnull JMethodCall call) {
+  private String getMethodSignature(@Nonnull String methodName, @Nonnull JMethodCall call) {
     JExpression instance = call.getInstance();
     assert instance != null;
 
     List<JExpression> args = call.getArgs();
     assert args.size() == 2;
-    JExpression methodName = args.get(0);
     JExpression parameters = args.get(1);
 
-    if (methodName instanceof JStringLiteral && parameters instanceof JNewArray) {
-      StringBuilder sb = new StringBuilder(((JStringLiteral) methodName).getValue());
+    if (parameters instanceof JNewArray) {
+      StringBuilder sb = new StringBuilder(methodName);
       sb.append("(");
       for (JExpression param : ((JNewArray) parameters).getInitializers()) {
         if (param instanceof JClassLiteral) {
diff --git a/jack/src/com/android/jack/transformations/OptimizedSwitchEnumFeedbackFeature.java b/jack/src/com/android/jack/transformations/enums/opt/OptimizedSwitchEnumFeedbackFeature.java
similarity index 89%
rename from jack/src/com/android/jack/transformations/OptimizedSwitchEnumFeedbackFeature.java
rename to jack/src/com/android/jack/transformations/enums/opt/OptimizedSwitchEnumFeedbackFeature.java
index 7bc01ea..f740a1c 100644
--- a/jack/src/com/android/jack/transformations/OptimizedSwitchEnumFeedbackFeature.java
+++ b/jack/src/com/android/jack/transformations/enums/opt/OptimizedSwitchEnumFeedbackFeature.java
@@ -14,9 +14,8 @@
  * limitations under the License.
  */
 
-package com.android.jack.transformations;
+package com.android.jack.transformations.enums.opt;
 
-import com.android.jack.transformations.enums.opt.OptimizedSwitchEnumSupport;
 import com.android.sched.item.Description;
 import com.android.sched.item.Feature;
 import com.android.sched.item.Name;
diff --git a/jack/src/com/android/jack/transformations/OptimizedSwitchEnumNonFeedbackFeature.java b/jack/src/com/android/jack/transformations/enums/opt/OptimizedSwitchEnumNonFeedbackFeature.java
similarity index 89%
rename from jack/src/com/android/jack/transformations/OptimizedSwitchEnumNonFeedbackFeature.java
rename to jack/src/com/android/jack/transformations/enums/opt/OptimizedSwitchEnumNonFeedbackFeature.java
index dda415c..6a2cb06 100644
--- a/jack/src/com/android/jack/transformations/OptimizedSwitchEnumNonFeedbackFeature.java
+++ b/jack/src/com/android/jack/transformations/enums/opt/OptimizedSwitchEnumNonFeedbackFeature.java
@@ -14,9 +14,8 @@
  * limitations under the License.
  */
 
-package com.android.jack.transformations;
+package com.android.jack.transformations.enums.opt;
 
-import com.android.jack.transformations.enums.opt.OptimizedSwitchEnumSupport;
 import com.android.sched.item.Description;
 import com.android.sched.item.Feature;
 import com.android.sched.item.Name;
diff --git a/jack/src/com/android/jack/transformations/enums/opt/OptimizedSwitchEnumSupport.java b/jack/src/com/android/jack/transformations/enums/opt/OptimizedSwitchEnumSupport.java
index 62b7647..00decd8 100644
--- a/jack/src/com/android/jack/transformations/enums/opt/OptimizedSwitchEnumSupport.java
+++ b/jack/src/com/android/jack/transformations/enums/opt/OptimizedSwitchEnumSupport.java
@@ -50,6 +50,8 @@
 import com.android.jack.ir.ast.JTryStatement;
 import com.android.jack.ir.ast.JType;
 import com.android.jack.ir.ast.JVisitor;
+import com.android.jack.library.DumpInLibrary;
+import com.android.jack.library.PrebuiltCompatibility;
 import com.android.jack.scheduling.filter.SourceTypeFilter;
 import com.android.jack.shrob.obfuscation.OriginalNames;
 import com.android.jack.transformations.LocalVarCreator;
@@ -67,6 +69,8 @@
 import com.android.sched.schedulable.RunnableSchedulable;
 import com.android.sched.schedulable.Transform;
 import com.android.sched.schedulable.Use;
+import com.android.sched.util.config.HasKeyId;
+import com.android.sched.util.config.id.EnumPropertyId;
 
 import java.util.Map;
 
@@ -98,7 +102,22 @@
 @Filter(SourceTypeFilter.class)
 // This schedulable modifies a class (that it added in a previous run) that it is not visiting.
 @ExclusiveAccess(JSession.class)
+@HasKeyId
 public class OptimizedSwitchEnumSupport implements RunnableSchedulable<JMethod> {
+
+  /**
+   * property used to specify the kind of switch enum optimization that is enabled. See(@link
+   * SwitchEnumOptStrategy)
+   */
+  @Nonnull
+  public static final EnumPropertyId<SwitchEnumOptStrategy> OPTIMIZED_ENUM_SWITCH =
+      EnumPropertyId.create(
+              "jack.optimization.enum.switch", "Optimize enum switch", SwitchEnumOptStrategy.class)
+          .addDefaultValue(SwitchEnumOptStrategy.NEVER)
+          .ignoreCase()
+          .addCategory(DumpInLibrary.class)
+          .addCategory(PrebuiltCompatibility.class);
+
   // switch map filler which will fills synthetic switch map field and initializer
   @Nonnull
   private final SwitchMapClassFiller classFiller = new SwitchMapClassFiller();
diff --git a/jack/src/com/android/jack/transformations/enums/opt/SwitchEnumOptStrategy.java b/jack/src/com/android/jack/transformations/enums/opt/SwitchEnumOptStrategy.java
new file mode 100644
index 0000000..1e06882
--- /dev/null
+++ b/jack/src/com/android/jack/transformations/enums/opt/SwitchEnumOptStrategy.java
@@ -0,0 +1,47 @@
+/*
+ * 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.transformations.enums.opt;
+
+import com.android.sched.util.codec.EnumName;
+import com.android.sched.util.codec.VariableName;
+
+/**
+ * Types of switch enum optimization strategies.
+ * 1. feedback (set on by default)
+ * 2. always
+ * 3. never
+ */
+@VariableName("strategy")
+public enum SwitchEnumOptStrategy {
+  // feedback-based optimization: this strategy will be enabled/disabled based on the
+  // compile time information collected, e.g., if it is detected that an enum is only
+  // used in one/few switch statements, it is useless to optimize it. Potentially enable
+  // this strategy will cost more compilation time, but save more dex code
+  @EnumName(name = "feedback")
+  FEEDBACK(),
+  // different from feedback-based optimization, always strategy doesn't collect compile-
+  // time information to guide switch enum optimization. It will always enable switch enum
+  // optimization no matter the enum is rarely/frequently used. Ideally this strategy will
+  // compile code quicker than feedback-based strategy does, but the generated dex may be
+  // larger than feedback strategy
+  @EnumName(name = "always")
+  ALWAYS(),
+  // this actually is not real strategy, but we still need it because switch enum
+  // optimization is disabled when incremental compilation is triggered
+  @EnumName(name = "never")
+  NEVER();
+}
\ No newline at end of file
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 3ab512f..6b08ecc 100644
--- a/jack/src/com/android/jack/transformations/enums/opt/SyntheticClassManager.java
+++ b/jack/src/com/android/jack/transformations/enums/opt/SyntheticClassManager.java
@@ -21,8 +21,6 @@
 import com.google.common.collect.Sets;
 
 import com.android.jack.Jack;
-import com.android.jack.Options;
-import com.android.jack.Options.SwitchEnumOptStrategy;
 import com.android.jack.ir.ast.JDefinedClass;
 import com.android.jack.ir.ast.JDefinedClassOrInterface;
 import com.android.jack.ir.ast.JDefinedEnum;
@@ -79,7 +77,7 @@
 
   @Nonnull
   private final SwitchEnumOptStrategy optimizationStrategy =
-    ThreadConfig.get(Options.OPTIMIZED_ENUM_SWITCH);
+    ThreadConfig.get(OptimizedSwitchEnumSupport.OPTIMIZED_ENUM_SWITCH);
 
   // this map represents relationship from the package to synthetic class. There should only be
   // one synthetic class at most per package. Synthetic class cannot be located anywhere because
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/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 98%
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..a503170 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;
diff --git a/jack/tests/com/android/jack/reporting/ProblemLevelTest.java b/jack/tests/com/android/jack/reporting/ProblemLevelTest.java
index 0b5eb5f..5551c5c 100644
--- a/jack/tests/com/android/jack/reporting/ProblemLevelTest.java
+++ b/jack/tests/com/android/jack/reporting/ProblemLevelTest.java
@@ -16,7 +16,7 @@
 
 package com.android.jack.reporting;
 
-import com.android.jack.Options.VerbosityLevel;
+import com.android.jack.VerbosityLevel;
 import com.android.jack.reporting.Reportable.ProblemLevel;
 
 import junit.framework.Assert;
diff --git a/jill-api/.classpath b/jill-api/.classpath
index 6a74d2e..dcc207a 100644
--- a/jill-api/.classpath
+++ b/jill-api/.classpath
@@ -2,7 +2,7 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="lib" path="libs/jsr305-lib.jar"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
 	<classpathentry kind="src" path=".apt_generated">
 		<attributes>
 			<attribute name="optional" value="true"/>
diff --git a/jill-api/.settings/org.eclipse.jdt.core.prefs b/jill-api/.settings/org.eclipse.jdt.core.prefs
index f6e5ff1..7eb95e1 100644
--- a/jill-api/.settings/org.eclipse.jdt.core.prefs
+++ b/jill-api/.settings/org.eclipse.jdt.core.prefs
@@ -6,9 +6,9 @@
 org.eclipse.jdt.core.compiler.annotation.nullable=javax.annotation.CheckForNull
 org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -97,7 +97,7 @@
 org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.processAnnotations=enabled
-org.eclipse.jdt.core.compiler.source=1.6
+org.eclipse.jdt.core.compiler.source=1.8
 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
 org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field=1585
 org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field.count_dependent=1585|-1|1585
diff --git a/jill-api/build.gradle b/jill-api/build.gradle
index 731e0d9..f746453 100644
--- a/jill-api/build.gradle
+++ b/jill-api/build.gradle
@@ -17,8 +17,8 @@
 apply plugin: 'java'
 apply plugin: 'com.github.johnrengelman.shadow'
 
-sourceCompatibility = 1.6
-targetCompatibility = 1.6
+sourceCompatibility = 1.8
+targetCompatibility = 1.8
 
 apply from: "$rootDir/gradle-script/checkstyle.gradle"
 apply from: "$rootDir/gradle-script/findbugs.gradle"
diff --git a/jill/.classpath b/jill/.classpath
index d583854..e82e9f7 100644
--- a/jill/.classpath
+++ b/jill/.classpath
@@ -8,6 +8,6 @@
 	<classpathentry kind="lib" path="libs/jsr305-lib.jar"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/jill-api"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/Scheduler"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/jill/.settings/org.eclipse.jdt.core.prefs b/jill/.settings/org.eclipse.jdt.core.prefs
index 1e8b72f..9ca25ee 100644
--- a/jill/.settings/org.eclipse.jdt.core.prefs
+++ b/jill/.settings/org.eclipse.jdt.core.prefs
@@ -7,9 +7,9 @@
 org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
 org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -97,7 +97,7 @@
 org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
 org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.7
+org.eclipse.jdt.core.compiler.source=1.8
 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
 org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field=1585
 org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field.count_dependent=1585|-1|1585
diff --git a/jill/build.gradle b/jill/build.gradle
index 3c421a2..fbce8a7 100644
--- a/jill/build.gradle
+++ b/jill/build.gradle
@@ -17,8 +17,8 @@
 apply plugin: 'java'
 apply plugin: 'com.github.johnrengelman.shadow'
 
-sourceCompatibility = 1.7
-targetCompatibility = 1.7
+sourceCompatibility = 1.8
+targetCompatibility = 1.8
 
 apply from: "$rootDir/gradle-script/checkstyle.gradle"
 apply from: "$rootDir/gradle-script/findbugs.gradle"
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/JillWriter.java b/jill/src/com/android/jill/frontend/java/JillWriter.java
index 8c9efa2..5da7fb8 100644
--- a/jill/src/com/android/jill/frontend/java/JillWriter.java
+++ b/jill/src/com/android/jill/frontend/java/JillWriter.java
@@ -51,7 +51,7 @@
   protected void writeValue(Object value, @CheckForNull ClassNode classNode,
       @Nonnegative int currentLine)  throws IOException{
     if (value == null) {
-      writer.writeNull();
+      writeValue(classNode, currentLine);
     } else if (value instanceof Boolean) {
       writeValue(((Boolean) value).booleanValue(), classNode, currentLine);
     } else if (value instanceof Integer) {
diff --git a/jill/src/com/android/jill/frontend/java/MethodBodyWriter.java b/jill/src/com/android/jill/frontend/java/MethodBodyWriter.java
index 86d6893..0ac6c97 100644
--- a/jill/src/com/android/jill/frontend/java/MethodBodyWriter.java
+++ b/jill/src/com/android/jill/frontend/java/MethodBodyWriter.java
@@ -66,6 +66,7 @@
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 
 import javax.annotation.CheckForNull;
@@ -159,14 +160,19 @@
     @Nonnegative
     int opcode;
     @Nonnull
-    Variable lhs;
+    Frame<BasicValue> lhsFrame;
+    int lhsStackIdx;
     @Nonnull
-    Variable rhs;
+    Frame<BasicValue> rhsFrame;
+    int rhsStackIdx;
 
-    public CmpOperands(@Nonnegative int opcode, @Nonnull Variable lhs, @Nonnull Variable rhs) {
+    public CmpOperands(@Nonnegative int opcode, @Nonnull Frame<BasicValue> lhsFrame,
+        int lhsStackIdx, @Nonnull Frame<BasicValue> rhsFrame, int rhsStackIdx) {
       this.opcode = opcode;
-      this.lhs = lhs;
-      this.rhs = rhs;
+      this.lhsFrame = lhsFrame;
+      this.lhsStackIdx = lhsStackIdx;
+      this.rhsFrame = rhsFrame;
+      this.rhsStackIdx = rhsStackIdx;
     }
   }
 
@@ -175,6 +181,9 @@
       new HashMap<Variable, MethodBodyWriter.CmpOperands>();
 
   @Nonnull
+  private final HashMap<Variable, Object> varWithCstValue = new HashMap<>();
+
+  @Nonnull
   private final AnnotationWriter annotWriter;
 
   @Nonnegative
@@ -272,7 +281,7 @@
     annotWriter.writeAnnotations(currentMethod);
     writeMethodBody();
     writer.writeOpenNodeList(); // Markers
-    writeOriginalTypeInfoMarker();
+    writeGenericSignatureMarker();
     writeThrownExceptionMarker();
     writer.writeCloseNodeList();
     sourceInfoWriter.writeDebugEnd(currentClass, endLine);
@@ -333,7 +342,7 @@
     annotWriter.writeAnnotations(currentMethod);
     writeMethodBody();
     writer.writeOpenNodeList(); // Markers
-    writeOriginalTypeInfoMarker();
+    writeGenericSignatureMarker();
     writeThrownExceptionMarker();
     writer.writeCloseNodeList();
     sourceInfoWriter.writeDebugEnd(currentClass, endLine);
@@ -355,20 +364,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();
     }
   }
 
@@ -444,7 +451,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);
     }
   }
@@ -528,6 +535,7 @@
         Frame<BasicValue> nextFrame = (insnIdx < frames.length - 1) ? frames[insnIdx + 1] : null;
 
         if (insn instanceof JumpInsnNode) {
+          forceToUseCstThroughVariable();
           writeInsn(currentFrame, (JumpInsnNode) insn, insnIdx);
         } else if (insn instanceof LdcInsnNode) {
           assert nextFrame != null;
@@ -538,6 +546,7 @@
           assert nextFrame != null;
           writeInsn(currentFrame, nextFrame, (VarInsnNode) insn);
         } else if (insn instanceof LabelNode) {
+          forceToUseCstThroughVariable();
           computeCatchList((LabelNode) insn);
           writeCatchBlock((LabelNode) insn, insnIdx, frames);
           writeLabelInsn(insnIdx);
@@ -596,6 +605,33 @@
     writer.writeClose();
   }
 
+
+  // Stack variable is produced before a branch instruction and was not yet consumed,
+  // generated it on this branch because another branch can produce another value and Jill
+  // do not know which value used since it depend on a runtime behavior.
+  // In the same way, if we reach a label, generate stack variable with constant because
+  // several path can produce different values.
+  private void forceToUseCstThroughVariable() throws IOException {
+    if (!varWithCstValue.isEmpty()) {
+      for (Entry<Variable, Object> entry : varWithCstValue.entrySet()) {
+        writeDebugBegin(currentClass, currentLine);
+        writer.writeCatchBlockIds(currentCatchList);
+        writer.writeKeyword(Token.EXPRESSION_STATEMENT);
+        writer.writeOpen();
+        writeDebugBegin(currentClass, currentLine);
+        writer.writeKeyword(Token.ASG_OPERATION);
+        writer.writeOpen();
+        writeLocalRef(entry.getKey());
+        writeValue(entry.getValue(), currentClass, currentLine);
+        writeDebugEnd(currentClass, currentLine);
+        writer.writeClose();
+        writeDebugEnd(currentClass, currentLine);
+        writer.writeClose();
+      }
+      varWithCstValue.clear();
+    }
+  }
+
   private void writeLambda(@Nonnull Frame<BasicValue> frame, @Nonnull Frame<BasicValue> nextFrame,
       @Nonnull InvokeDynamicInsnNode iDyn) throws IOException {
     Handle mthImplementingLambda = (Handle) iDyn.bsmArgs[1];
@@ -608,7 +644,7 @@
     writeDebugBegin(currentClass, currentLine);
     writer.writeKeyword(Token.ASG_OPERATION);
     writer.writeOpen();
-    writeStackAccess(nextFrame, TOP_OF_STACK);
+    writeStack(nextFrame, TOP_OF_STACK);
 
     writeDebugBegin(currentClass, currentLine);
     writer.writeKeyword(Token.LAMBDA);
@@ -990,7 +1026,7 @@
           writeDebugBegin(currentClass, currentLine);
           writer.writeKeyword(Token.ASG_OPERATION);
           writer.writeOpen();
-          writeStackAccess(frames[labelIdx], TOP_OF_STACK);
+          writeStack(frames[labelIdx], TOP_OF_STACK);
           writeLocalRef(declaringCatchVariable);
           writeDebugEnd(currentClass, currentLine);
           writer.writeClose();
@@ -1078,6 +1114,12 @@
 
   private void writeInsn(@Nonnull Frame<BasicValue> frame, @Nonnull Frame<BasicValue> nextFrame,
       @Nonnull IntInsnNode intInsn) throws IOException {
+    if (intInsn.getOpcode() == BIPUSH || intInsn.getOpcode() == SIPUSH) {
+      varWithCstValue.put(getStackVariable(nextFrame, TOP_OF_STACK),
+          new Integer(intInsn.operand));
+      return;
+    }
+
     writeDebugBegin(currentClass, currentLine);
     writer.writeCatchBlockIds(currentCatchList);
     writer.writeKeyword(Token.EXPRESSION_STATEMENT);
@@ -1085,17 +1127,9 @@
     writeDebugBegin(currentClass, currentLine);
     writer.writeKeyword(Token.ASG_OPERATION);
     writer.writeOpen();
-    writeStackAccess(nextFrame, TOP_OF_STACK);
+    writeStack(nextFrame, TOP_OF_STACK);
 
     switch (intInsn.getOpcode()) {
-      case BIPUSH: {
-        writeValue(intInsn.operand, currentClass, currentLine);
-        break;
-      }
-      case SIPUSH: {
-        writeValue(intInsn.operand, currentClass, currentLine);
-        break;
-      }
       case NEWARRAY: {
 
         switch (intInsn.operand) {
@@ -1157,7 +1191,7 @@
     writeDebugBegin(currentClass, currentLine);
     writer.writeKeyword(Token.ASG_OPERATION);
     writer.writeOpen();
-    writeStackAccess(nextFrame, TOP_OF_STACK);
+    writeStack(nextFrame, TOP_OF_STACK);
     writeNewArray(frame, manaIns.desc, manaIns.dims);
     writeDebugEnd(currentClass, currentLine);
     writer.writeClose();
@@ -1174,7 +1208,7 @@
     writer.writeId(typeDesc);
     writer.writeOpenNodeList();
     for (int i = (dims - 1); i >= 0; i--) {
-      writeStackAccess(frame, TOP_OF_STACK - i);
+      readStack(frame, TOP_OF_STACK - i);
     }
     writer.writeCloseNodeList();
     writer.writeOpenNodeList(); // Empty initializers list.
@@ -1247,11 +1281,11 @@
         throw new JillException("Not yet supported " + Printer.OPCODES[opcode]);
       }
     }
-    writeStackAccess(frame, startIdx);
+    readStack(frame, startIdx);
     writeDebugEnd(currentClass, currentLine);
     writer.writeClose();
 
-    writeStackAccess(frame, startIdx + 1);
+    readStack(frame, startIdx + 1);
     writeDebugEnd(currentClass, currentLine);
     writer.writeClose();
   }
@@ -1295,7 +1329,7 @@
     writer.writeCatchBlockIds(currentCatchList);
     writer.writeKeyword(Token.SWITCH_STATEMENT);
     writer.writeOpen();
-    writeStackAccess(frame, TOP_OF_STACK);
+    readStack(frame, TOP_OF_STACK);
     writer.writeIds(cases);
     writeDebugBegin(currentClass, currentLine);
     writer.writeCatchBlockIds(currentCatchList);
@@ -1308,7 +1342,11 @@
       writer.writeKeyword(Token.CASE_STATEMENT);
       writer.writeOpen();
       writer.writeId(c.caseId);
-      writeValue(c.key, currentClass, currentLine);
+      if (c.key == null) {
+        writer.writeNull();
+      } else {
+        writeValue(c.key, currentClass, currentLine);
+      }
       writeDebugEnd(currentClass, currentLine);
       writer.writeClose();
       writeGoto(c.labelNode);
@@ -1330,7 +1368,7 @@
     writeDebugBegin(currentClass, currentLine);
     writer.writeKeyword(Token.ASG_OPERATION);
     writer.writeOpen();
-    writeStackAccess(nextFrame, TOP_OF_STACK);
+    writeStack(nextFrame, TOP_OF_STACK);
 
     String descriptor = Type.getObjectType(typeInsn.desc).getDescriptor();
 
@@ -1356,7 +1394,7 @@
         writeDebugBegin(currentClass, currentLine);
         writer.writeKeyword(Token.INSTANCE_OF);
         writer.writeOpen();
-        writeStackAccess(frame, TOP_OF_STACK);
+        readStack(frame, TOP_OF_STACK);
         writer.writeId(descriptor);
         writeDebugEnd(currentClass, currentLine);
         writer.writeClose();
@@ -1396,7 +1434,7 @@
           writeCastOperation(Token.REINTERPRETCAST_OPERATION, frame,
               Type.BOOLEAN_TYPE.getDescriptor(), TOP_OF_STACK);
         } else {
-          writeStackAccess(frame, TOP_OF_STACK);
+          readStack(frame, TOP_OF_STACK);
         }
         break;
       }
@@ -1406,12 +1444,12 @@
           writeCastOperation(Token.REINTERPRETCAST_OPERATION, frame,
               Type.BOOLEAN_TYPE.getDescriptor(), TOP_OF_STACK);
         } else {
-          writeStackAccess(frame, TOP_OF_STACK);
+          readStack(frame, TOP_OF_STACK);
         }
         break;
       }
       case GETFIELD: {
-        writeStackAccess(nextFrame, TOP_OF_STACK);
+        writeStack(nextFrame, TOP_OF_STACK);
         if (Type.getType(fldInsn.desc) == Type.BOOLEAN_TYPE) {
           writeDebugBegin(currentClass, currentLine);
           writer.writeKeyword(Token.REINTERPRETCAST_OPERATION);
@@ -1426,7 +1464,7 @@
         break;
       }
       case GETSTATIC: {
-        writeStackAccess(nextFrame, TOP_OF_STACK);
+        writeStack(nextFrame, TOP_OF_STACK);
         if (Type.getType(fldInsn.desc) == Type.BOOLEAN_TYPE) {
           writeDebugBegin(currentClass, currentLine);
           writer.writeKeyword(Token.REINTERPRETCAST_OPERATION);
@@ -1473,7 +1511,7 @@
           writeDebugBegin(currentClass, currentLine);
           writer.writeKeyword(Token.ASG_OPERATION);
           writer.writeOpen();
-          writeStackAccess(nextFrame, TOP_OF_STACK);
+          writeStack(nextFrame, TOP_OF_STACK);
           if (returnType == Type.BOOLEAN_TYPE) {
             writeDebugBegin(currentClass, currentLine);
             writer.writeKeyword(Token.REINTERPRETCAST_OPERATION);
@@ -1539,7 +1577,7 @@
           if ((receiverType.equals(frame.getStack(frame.getStackSize() - stackArgIndex).getType())
               && !isCallToPolymorphicMethod) || mthInsn.name.equals("<init>")) {
             // It is not possible to add cast on object before call to init
-            writeStackAccess(frame, -stackArgIndex);
+            readStack(frame, -stackArgIndex);
           } else {
             writeCastOperation(Token.REINTERPRETCAST_OPERATION, frame, receiverType.getDescriptor(),
                 -stackArgIndex);
@@ -1588,7 +1626,7 @@
             writeCastOperation(Token.REINTERPRETCAST_OPERATION, frame, argType.getDescriptor(),
                 -stackArgIndex);
           } else {
-            writeStackAccess(frame, -stackArgIndex);
+            readStack(frame, -stackArgIndex);
           }
           stackArgIndex--;
         }
@@ -1638,7 +1676,7 @@
         writeDebugBegin(currentClass, currentLine);
         writer.writeKeyword(Token.ASG_OPERATION);
         writer.writeOpen();
-        writeStackAccess(nextFrame, TOP_OF_STACK);
+        writeStack(nextFrame, TOP_OF_STACK);
         if (getLocalVariable(frame, varInsn.var).getType() == Type.BOOLEAN_TYPE) {
           writeCastOperation(Token.REINTERPRETCAST_OPERATION, getLocalVariable(frame, varInsn.var),
               Type.INT_TYPE.getDescriptor());
@@ -1674,7 +1712,7 @@
             writeCastOperation(Token.REINTERPRETCAST_OPERATION, frame, destType.getDescriptor(),
                 TOP_OF_STACK);
           } else {
-            writeStackAccess(frame, TOP_OF_STACK);
+            readStack(frame, TOP_OF_STACK);
           }
           writeDebugEnd(currentClass, currentLine);
           writer.writeClose();
@@ -1700,91 +1738,35 @@
       case ICONST_4:
       case ICONST_5: {
         assert nextFrame != null;
-        writeDebugBegin(currentClass, currentLine);
-        writer.writeCatchBlockIds(currentCatchList);
-        writer.writeKeyword(Token.EXPRESSION_STATEMENT);
-        writer.writeOpen();
-        writeDebugBegin(currentClass, currentLine);
-        writer.writeKeyword(Token.ASG_OPERATION);
-        writer.writeOpen();
-        writeStackAccess(nextFrame, TOP_OF_STACK);
-        writeValue(insn.getOpcode() - ICONST_0, currentClass, currentLine);
-        writeDebugEnd(currentClass, currentLine);
-        writer.writeClose();
-        writeDebugEnd(currentClass, currentLine);
-        writer.writeClose();
+        varWithCstValue.put(getStackVariable(nextFrame, TOP_OF_STACK),
+            new Integer(insn.getOpcode() - ICONST_0));
         break;
       }
       case ACONST_NULL: {
         assert nextFrame != null;
-        writeDebugBegin(currentClass, currentLine);
-        writer.writeCatchBlockIds(currentCatchList);
-        writer.writeKeyword(Token.EXPRESSION_STATEMENT);
-        writer.writeOpen();
-        writeDebugBegin(currentClass, currentLine);
-        writer.writeKeyword(Token.ASG_OPERATION);
-        writer.writeOpen();
-        writeStackAccess(nextFrame, TOP_OF_STACK);
-        writeValue(currentClass, currentLine);
-        writeDebugEnd(currentClass, currentLine);
-        writer.writeClose();
-        writeDebugEnd(currentClass, currentLine);
-        writer.writeClose();
+        varWithCstValue.put(getStackVariable(nextFrame, TOP_OF_STACK), null);
         break;
       }
       case LCONST_0:
       case LCONST_1: {
         assert nextFrame != null;
-        writeDebugBegin(currentClass, currentLine);
-        writer.writeCatchBlockIds(currentCatchList);
-        writer.writeKeyword(Token.EXPRESSION_STATEMENT);
-        writer.writeOpen();
-        writeDebugBegin(currentClass, currentLine);
-        writer.writeKeyword(Token.ASG_OPERATION);
-        writer.writeOpen();
-        writeStackAccess(nextFrame, TOP_OF_STACK);
-        writeValue((long) (insn.getOpcode() - LCONST_0), currentClass, currentLine);
-        writeDebugEnd(currentClass, currentLine);
-        writer.writeClose();
-        writeDebugEnd(currentClass, currentLine);
-        writer.writeClose();
+        varWithCstValue.put(getStackVariable(nextFrame, TOP_OF_STACK),
+            new Long(insn.getOpcode() - LCONST_0));
         break;
       }
       case FCONST_0:
       case FCONST_1:
       case FCONST_2: {
         assert nextFrame != null;
-        writeDebugBegin(currentClass, currentLine);
-        writer.writeCatchBlockIds(currentCatchList);
-        writer.writeKeyword(Token.EXPRESSION_STATEMENT);
-        writer.writeOpen();
-        writeDebugBegin(currentClass, currentLine);
-        writer.writeKeyword(Token.ASG_OPERATION);
-        writer.writeOpen();
-        writeStackAccess(nextFrame, TOP_OF_STACK);
-        writeValue((float) (insn.getOpcode() - FCONST_0), currentClass, currentLine);
-        writeDebugEnd(currentClass, currentLine);
-        writer.writeClose();
-        writeDebugEnd(currentClass, currentLine);
-        writer.writeClose();
+        varWithCstValue.put(getStackVariable(nextFrame, TOP_OF_STACK),
+            new Float(insn.getOpcode() - FCONST_0));
         break;
       }
       case DCONST_0:
       case DCONST_1: {
         assert nextFrame != null;
-        writeDebugBegin(currentClass, currentLine);
-        writer.writeCatchBlockIds(currentCatchList);
-        writer.writeKeyword(Token.EXPRESSION_STATEMENT);
-        writer.writeOpen();
-        writeDebugBegin(currentClass, currentLine);
-        writer.writeKeyword(Token.ASG_OPERATION);
-        writer.writeOpen();
-        writeStackAccess(nextFrame, TOP_OF_STACK);
-        writeValue((double) (insn.getOpcode() - DCONST_0), currentClass, currentLine);
-        writeDebugEnd(currentClass, currentLine);
-        writer.writeClose();
-        writeDebugEnd(currentClass, currentLine);
-        writer.writeClose();
+        varWithCstValue.put(getStackVariable(nextFrame, TOP_OF_STACK),
+            new Double(insn.getOpcode() - DCONST_0));
         break;
       }
       case D2L:
@@ -1867,10 +1849,9 @@
       case DCMPL:
       case DCMPG: {
         assert nextFrame != null;
-        Variable lhs = getStackVariable(frame, TOP_OF_STACK - 1);
-        Variable rhs = getStackVariable(frame, TOP_OF_STACK);
         Variable result = getStackVariable(nextFrame, TOP_OF_STACK);
-        cmpOperands.put(result, new CmpOperands(insn.getOpcode(), lhs, rhs));
+        cmpOperands.put(result,
+            new CmpOperands(insn.getOpcode(), frame, TOP_OF_STACK - 1, frame, TOP_OF_STACK));
         break;
       }
       case DSUB:
@@ -1917,11 +1898,11 @@
         writeDebugBegin(currentClass, currentLine);
         writer.writeKeyword(Token.ASG_OPERATION);
         writer.writeOpen();
-        writeStackAccess(nextFrame, TOP_OF_STACK);
+        writeStack(nextFrame, TOP_OF_STACK);
         writeDebugBegin(currentClass, currentLine);
         writer.writeKeyword(Token.PREFIX_NEG_OPERATION);
         writer.writeOpen();
-        writeStackAccess(frame, TOP_OF_STACK);
+        readStack(frame, TOP_OF_STACK);
         writeDebugEnd(currentClass, currentLine);
         writer.writeClose();
         writeDebugEnd(currentClass, currentLine);
@@ -1975,11 +1956,11 @@
         writeDebugBegin(currentClass, currentLine);
         writer.writeKeyword(Token.ASG_OPERATION);
         writer.writeOpen();
-        writeStackAccess(nextFrame, TOP_OF_STACK);
+        writeStack(nextFrame, TOP_OF_STACK);
         writeDebugBegin(currentClass, currentLine);
         writer.writeKeyword(Token.ARRAY_LENGTH);
         writer.writeOpen();
-        writeStackAccess(frame, TOP_OF_STACK);
+        readStack(frame, TOP_OF_STACK);
         writeDebugEnd(currentClass, currentLine);
         writer.writeClose();
         writeDebugEnd(currentClass, currentLine);
@@ -2005,7 +1986,7 @@
         writeDebugBegin(currentClass, currentLine);
         writer.writeKeyword(Token.ASG_OPERATION);
         writer.writeOpen();
-        writeStackAccess(nextFrame, TOP_OF_STACK);
+        writeStack(nextFrame, TOP_OF_STACK);
         writeArrayRef(frame, TOP_OF_STACK - 1, insn.getOpcode());
         writeDebugEnd(currentClass, currentLine);
         writer.writeClose();
@@ -2029,7 +2010,7 @@
         writer.writeKeyword(Token.ASG_OPERATION);
         writer.writeOpen();
         writeArrayRef(frame, TOP_OF_STACK - 2, insn.getOpcode());
-        writeStackAccess(frame, TOP_OF_STACK);
+        readStack(frame, TOP_OF_STACK);
         writeDebugEnd(currentClass, currentLine);
         writer.writeClose();
         writeDebugEnd(currentClass, currentLine);
@@ -2041,7 +2022,7 @@
         writer.writeCatchBlockIds(currentCatchList);
         writer.writeKeyword(Token.LOCK);
         writer.writeOpen();
-        writeStackAccess(frame, TOP_OF_STACK);
+        readStack(frame, TOP_OF_STACK);
         writeDebugEnd(currentClass, currentLine);
         writer.writeClose();
         break;
@@ -2051,7 +2032,7 @@
         writer.writeCatchBlockIds(currentCatchList);
         writer.writeKeyword(Token.UNLOCK);
         writer.writeOpen();
-        writeStackAccess(frame, TOP_OF_STACK);
+        readStack(frame, TOP_OF_STACK);
         writeDebugEnd(currentClass, currentLine);
         writer.writeClose();
         break;
@@ -2081,7 +2062,7 @@
           writer.writeKeyword(Token.ASG_OPERATION);
           writer.writeOpen();
           writeLocalRef(tmpVar);
-          writeStackAccess(frame, TOP_OF_STACK - 1);
+          readStack(frame, TOP_OF_STACK - 1);
           writeDebugEnd(currentClass, currentLine);
           writer.writeClose();
           writeDebugEnd(currentClass, currentLine);
@@ -2111,7 +2092,7 @@
           writeDebugBegin(currentClass, currentLine);
           writer.writeKeyword(Token.ASG_OPERATION);
           writer.writeOpen();
-          writeStackAccess(nextFrame, TOP_OF_STACK);
+          writeStack(nextFrame, TOP_OF_STACK);
           writeLocalRef(tmpVar);
           writeDebugEnd(currentClass, currentLine);
           writer.writeClose();
@@ -2199,6 +2180,7 @@
           // Result of comparison must be pop
           cmpOperands.remove(getStackVariable(frame, TOP_OF_STACK));
         }
+        removeStackVariableConstant(frame, TOP_OF_STACK);
         break;
       }
       case NOP:
@@ -2214,6 +2196,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;
       }
@@ -2222,7 +2208,7 @@
         writer.writeCatchBlockIds(currentCatchList);
         writer.writeKeyword(Token.THROW_STATEMENT);
         writer.writeOpen();
-        writeStackAccess(frame, TOP_OF_STACK);
+        readStack(frame, TOP_OF_STACK);
         writeDebugEnd(currentClass, currentLine);
         writer.writeClose();
         break;
@@ -2238,21 +2224,8 @@
     return cmpOperands.containsKey(stackVar);
   }
 
-  private void writeInsn(@Nonnull Frame<BasicValue> nextFrame, @Nonnull LdcInsnNode ldcInsn)
-      throws IOException {
-    writeDebugBegin(currentClass, currentLine);
-    writer.writeCatchBlockIds(currentCatchList);
-    writer.writeKeyword(Token.EXPRESSION_STATEMENT);
-    writer.writeOpen();
-    writeDebugBegin(currentClass, currentLine);
-    writer.writeKeyword(Token.ASG_OPERATION);
-    writer.writeOpen();
-    writeStackAccess(nextFrame, TOP_OF_STACK);
-    writeValue(ldcInsn.cst, currentClass, currentLine);
-    writeDebugEnd(currentClass, currentLine);
-    writer.writeClose();
-    writeDebugEnd(currentClass, currentLine);
-    writer.writeClose();
+  private void writeInsn(@Nonnull Frame<BasicValue> nextFrame, @Nonnull LdcInsnNode ldcInsn) {
+    varWithCstValue.put(getStackVariable(nextFrame, TOP_OF_STACK), ldcInsn.cst);
   }
 
   private void writeInsn(
@@ -2294,8 +2267,8 @@
           writeDebugBegin(currentClass, currentLine);
           writer.writeKeyword(comparisonToken);
           writer.writeOpen();
-          writeLocalRef(cmpOps.lhs);
-          writeLocalRef(cmpOps.rhs);
+          readStack(cmpOps.lhsFrame, cmpOps.lhsStackIdx);
+          readStack(cmpOps.rhsFrame, cmpOps.rhsStackIdx);
           writeDebugEnd(currentClass, currentLine);
           writer.writeClose();
 
@@ -2336,7 +2309,7 @@
           writeDebugBegin(currentClass, currentLine);
           writer.writeKeyword(conditionalToken);
           writer.writeOpen();
-          writeStackAccess(frame, TOP_OF_STACK);
+          readStack(frame, TOP_OF_STACK);
           Variable v = getStackVariable(frame, TOP_OF_STACK);
           if (v.getType().equals(Type.BOOLEAN_TYPE)) {
             writeValue(false, currentClass, currentLine);
@@ -2381,8 +2354,8 @@
         writeDebugBegin(currentClass, currentLine);
         writer.writeKeyword(conditionalToken);
         writer.writeOpen();
-        writeStackAccess(frame, TOP_OF_STACK - 1);
-        writeStackAccess(frame, TOP_OF_STACK);
+        readStack(frame, TOP_OF_STACK - 1);
+        readStack(frame, TOP_OF_STACK);
         writeDebugEnd(currentClass, currentLine);
         writer.writeClose();
         // Then block
@@ -2524,17 +2497,27 @@
     if (stackIdx == 0) {
       writer.writeNull();
     } else {
-      writeStackAccess(frame, stackIdx);
+      readStack(frame, stackIdx);
     }
     writeDebugEnd(currentClass, currentLine);
     writer.writeClose();
   }
 
-  private void writeStackAccess(@Nonnull Frame<BasicValue> frame, int stackIdx)
+  private void writeStack(@Nonnull Frame<BasicValue> frame, int stackIdx)
       throws IndexOutOfBoundsException, IOException {
     writeLocalRef(getStackVariable(frame, stackIdx));
   }
 
+  private void readStack(@Nonnull Frame<BasicValue> frame, int stackIdx)
+      throws IndexOutOfBoundsException, IOException {
+    Variable stackVariable = getStackVariable(frame, stackIdx);
+    if (varWithCstValue.containsKey(stackVariable)) {
+      writeValue(varWithCstValue.remove(stackVariable), currentClass, currentLine);
+    } else {
+      writeLocalRef(stackVariable);
+    }
+  }
+
   private void writeLocalAccess(@Nonnull Frame<BasicValue> frame, @Nonnegative int localIdx)
       throws IndexOutOfBoundsException, IOException {
     writeLocalRef(getLocalVariable(frame, localIdx));
@@ -2601,7 +2584,7 @@
     writer.writeId(fldInsn.desc);
     writer.writeId(Type.getObjectType(fldInsn.owner).getDescriptor());
     writer.writeFieldRefKindEnum(FieldRefKind.INSTANCE);
-    writeStackAccess(frame, offset);
+    readStack(frame, offset);
     writeDebugEnd(currentClass, currentLine);
     writer.writeClose();
   }
@@ -2686,7 +2669,7 @@
     writeDebugBegin(currentClass, currentLine);
     writer.writeKeyword(Token.ASG_OPERATION);
     writer.writeOpen();
-    writeStackAccess(nextFrame, TOP_OF_STACK);
+    writeStack(nextFrame, TOP_OF_STACK);
     writeCastOperation(Token.DYNAMIC_CAST_OPERATION, frame, Type.getDescriptor(targetType),
         TOP_OF_STACK);
     writeDebugEnd(currentClass, currentLine);
@@ -2715,7 +2698,20 @@
 
   private void writeCastOperation(@Nonnull Token cast, @Nonnull Frame<BasicValue> frame,
       @Nonnull String typeDesc, int stackIdx) throws IOException {
-    writeCastOperation(cast, getStackVariable(frame, stackIdx), typeDesc);
+    assert cast == Token.DYNAMIC_CAST_OPERATION || cast == Token.REINTERPRETCAST_OPERATION;
+    writeDebugBegin(currentClass, currentLine);
+    writer.writeKeyword(cast);
+    writer.writeOpen();
+    if (cast == Token.DYNAMIC_CAST_OPERATION) {
+      ArrayList<String> types = new ArrayList<String>(1);
+      types.add(typeDesc);
+      writer.writeIds(types);
+    } else {
+      writer.writeId(typeDesc);
+    }
+    readStack(frame, stackIdx);
+    writeDebugEnd(currentClass, currentLine);
+    writer.writeClose();
   }
 
   private void writeDup(@Nonnull Frame<BasicValue> frame, @Nonnull Frame<BasicValue> nextFrame)
@@ -2735,15 +2731,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);
   }
 
@@ -2774,8 +2781,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);
   }
@@ -2783,15 +2793,20 @@
   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);
   }
 
   /**
    * writes frame2.stack[frame.stack.size() + offset2] = frame1.stack[frame.stack.size() + offset1]
+   * This method is used to simulate stack operations such swap, dup and so on.
    *
    * @throws IOException
    */
@@ -2800,19 +2815,27 @@
     assert !isBooleanAssignIssue(
         getStackVariable(frame2, offset2),
         getStackVariable(frame1, offset1));
-    writeDebugBegin(currentClass, currentLine);
-    writer.writeCatchBlockIds(currentCatchList);
-    writer.writeKeyword(Token.EXPRESSION_STATEMENT);
-    writer.writeOpen();
-    writeDebugBegin(currentClass, currentLine);
-    writer.writeKeyword(Token.ASG_OPERATION);
-    writer.writeOpen();
-    writeStackAccess(frame2, offset2);
-    writeStackAccess(frame1, offset1);
-    writeDebugEnd(currentClass, currentLine);
-    writer.writeClose();
-    writeDebugEnd(currentClass, currentLine);
-    writer.writeClose();
+    Variable stackVariableRead = getStackVariable(frame1, offset1);
+    if (varWithCstValue.containsKey(stackVariableRead)) {
+      // The read variable is a constant, thus do not write the constant into the stack but
+      // associate this stack variable with the same constant.
+      varWithCstValue.put(getStackVariable(frame2, offset2),
+          varWithCstValue.get(stackVariableRead));
+    } else {
+      writeDebugBegin(currentClass, currentLine);
+      writer.writeCatchBlockIds(currentCatchList);
+      writer.writeKeyword(Token.EXPRESSION_STATEMENT);
+      writer.writeOpen();
+      writeDebugBegin(currentClass, currentLine);
+      writer.writeKeyword(Token.ASG_OPERATION);
+      writer.writeOpen();
+      writeStack(frame2, offset2);
+      readStack(frame1, offset1);
+      writeDebugEnd(currentClass, currentLine);
+      writer.writeClose();
+      writeDebugEnd(currentClass, currentLine);
+      writer.writeClose();
+    }
   }
 
   private void writeBinaryOperation(
@@ -2828,12 +2851,12 @@
     writeDebugBegin(currentClass, currentLine);
     writer.writeKeyword(Token.ASG_OPERATION);
     writer.writeOpen();
-    writeStackAccess(nextFrame, TOP_OF_STACK);
+    writeStack(nextFrame, TOP_OF_STACK);
     writeDebugBegin(currentClass, currentLine);
     writer.writeKeyword(op);
     writer.writeOpen();
-    writeStackAccess(frame, TOP_OF_STACK - 1);
-    writeStackAccess(frame, TOP_OF_STACK);
+    readStack(frame, TOP_OF_STACK - 1);
+    readStack(frame, TOP_OF_STACK);
     writeDebugEnd(currentClass, currentLine);
     writer.writeClose();
     writeDebugEnd(currentClass, currentLine);
@@ -2861,6 +2884,9 @@
           }
         }
         for (int stackIdx = 0; stackIdx < frame.getStackSize(); stackIdx++) {
+          // Useless local variables can be created by Jill, indeed all stack variables are created
+          // but some of them will be never used, for instance constant will be put directly on
+          // their usage and will not used stack variable.
           Variable v = getStackVariable(frame, -stackIdx - 1);
           locals.add(v);
         }
@@ -2882,7 +2908,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;
   }
 
@@ -3051,17 +3077,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);
     }
 
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/.classpath b/sched/.classpath
index b7f9d32..28dfb36 100644
--- a/sched/.classpath
+++ b/sched/.classpath
@@ -3,7 +3,7 @@
 	<classpathentry excluding="com/android/sched/util/log/tracer/SpeedTracer.java" kind="src" path="src"/>
 	<classpathentry kind="src" path="tests"/>
 	<classpathentry kind="src" path="rsc"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
 	<classpathentry kind="src" path=".apt_generated">
 		<attributes>
 			<attribute name="optional" value="true"/>
diff --git a/sched/.settings/org.eclipse.jdt.core.prefs b/sched/.settings/org.eclipse.jdt.core.prefs
index ffb197c..0a1d86d 100644
--- a/sched/.settings/org.eclipse.jdt.core.prefs
+++ b/sched/.settings/org.eclipse.jdt.core.prefs
@@ -7,9 +7,9 @@
 org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
 org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.7
+org.eclipse.jdt.core.compiler.compliance=1.8
 org.eclipse.jdt.core.compiler.debug.lineNumber=generate
 org.eclipse.jdt.core.compiler.debug.localVariable=generate
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
@@ -98,7 +98,7 @@
 org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.processAnnotations=enabled
-org.eclipse.jdt.core.compiler.source=1.7
+org.eclipse.jdt.core.compiler.source=1.8
 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
 org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field=1585
 org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field.count_dependent=1585|-1|1585
diff --git a/sched/build.gradle b/sched/build.gradle
index 6413e19..fa55937 100644
--- a/sched/build.gradle
+++ b/sched/build.gradle
@@ -21,8 +21,8 @@
   apply from: "$rootDir/gradle-script/checkstyle.gradle"
   apply from: "$rootDir/gradle-script/findbugs.gradle"
 
-  sourceCompatibility = 1.7
-  targetCompatibility = 1.7
+  sourceCompatibility = 1.8
+  targetCompatibility = 1.8
 
   sourceSets {
       main {
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/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/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/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/vfs/VFSTest.java b/sched/tests/com/android/sched/vfs/VFSTest.java
index 27dd9bb..1fd2be7 100644
--- a/sched/tests/com/android/sched/vfs/VFSTest.java
+++ b/sched/tests/com/android/sched/vfs/VFSTest.java
@@ -344,8 +344,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 +359,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 +373,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();
 
@@ -453,7 +456,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 +467,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 +478,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 +496,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 +508,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 +518,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 +539,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 +553,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 +567,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 +586,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 +611,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 +626,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 +792,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 +814,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 +825,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 +841,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));
 
diff --git a/server/jack-server/etc/jack-diagnose b/server/jack-server/etc/jack-diagnose
index c8c51da..d707d67 100755
--- a/server/jack-server/etc/jack-diagnose
+++ b/server/jack-server/etc/jack-diagnose
@@ -143,7 +143,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
 }