Merge changes from topic 'upgrade-smali'

* changes:
  Update smali/baksmali to 2.2.0
  Merge remote-tracking branch 'aosp/upstream-master'
diff --git a/README.md b/README.md
index ccae135..a5169b4 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
 
 smali/baksmali is an assembler/disassembler for the dex format used by dalvik, Android's Java VM implementation. The syntax is loosely based on Jasmin's/dedexer's syntax, and supports the full functionality of the dex format (annotations, debug info, line info, etc.)
 
-Downloads are at  https://bitbucket.org/JesusFreke/smali/downloads. If you are interested in submitting a patch, feel free to send me a pull request here.
+Downloads are at  https://bitbucket.org/JesusFreke/smali/downloads/. If you are interested in submitting a patch, feel free to send me a pull request here.
 
 See [the wiki](https://github.com/JesusFreke/smali/wiki) for more info/news/release notes/etc.
 
diff --git a/README.version b/README.version
index 227d2d3..22387f0 100644
--- a/README.version
+++ b/README.version
@@ -1,3 +1,3 @@
-URL: https://bitbucket.org/JesusFreke/smali/downloads/smali-2.0.5.jar
-Version: 2.0.5
+URL: https://bitbucket.org/JesusFreke/smali/downloads/smali-2.2.0.jar
+Version: 2.2.0
 BugComponent: 99143
diff --git a/baksmali/Android.mk b/baksmali/Android.mk
index feaff1d..5e828ed 100644
--- a/baksmali/Android.mk
+++ b/baksmali/Android.mk
@@ -36,7 +36,8 @@
 LOCAL_JAR_MANIFEST := manifest.txt
 
 LOCAL_STATIC_JAVA_LIBRARIES := \
-	dexlib2
+	dexlib2 \
+	jcommander-host
 
 #create a new baksmali.properties file using the correct version
 $(intermediates)/resources/baksmali.properties: $(LOCAL_PATH)/../build.gradle
diff --git a/baksmali/build.gradle b/baksmali/build.gradle
index f3a14b1..aae88a3 100644
--- a/baksmali/build.gradle
+++ b/baksmali/build.gradle
@@ -41,8 +41,8 @@
 dependencies {
     compile project(':util')
     compile project(':dexlib2')
-    compile depends.commons_cli
     compile depends.guava
+    compile depends.jcommander
 
     testCompile depends.junit
     testCompile project(':smali')
@@ -59,7 +59,7 @@
     classifier = 'fat'
 
     manifest {
-        attributes('Main-Class': 'org.jf.baksmali.main')
+        attributes('Main-Class': 'org.jf.baksmali.Main')
     }
 
     doLast {
@@ -92,7 +92,9 @@
     dontobfuscate
     dontoptimize
 
-    keep 'public class org.jf.baksmali.main { public static void main(java.lang.String[]); }'
+    keep 'public class org.jf.baksmali.Main { public static void main(java.lang.String[]); }'
+    keep 'public class org.jf.util.jcommander.ColonParameterSplitter'
+    keep 'class com.beust.jcommander.** { *; }'
     keepclassmembers 'enum * { public static **[] values(); public static ** valueOf(java.lang.String); }'
 
     dontwarn 'com.google.common.**'
@@ -100,3 +102,17 @@
 }
 
 tasks.getByPath(':release').dependsOn(proguard)
+
+task fastbuild(dependsOn: build) {
+}
+
+task fb(dependsOn: fastbuild) {
+}
+
+tasks.getByPath('javadoc').onlyIf({
+    !gradle.taskGraph.hasTask(fastbuild)
+})
+
+tasks.getByPath('test').onlyIf({
+    !gradle.taskGraph.hasTask(fastbuild)
+})
\ No newline at end of file
diff --git a/baksmali/manifest.txt b/baksmali/manifest.txt
index ac02629..f769c2d 100644
--- a/baksmali/manifest.txt
+++ b/baksmali/manifest.txt
@@ -1 +1 @@
-Main-Class: org.jf.baksmali.main
+Main-Class: org.jf.baksmali.Main
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/CatchMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/CatchMethodItem.java
index 6c67d4a..4b545ee 100644
--- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/CatchMethodItem.java
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/CatchMethodItem.java
@@ -28,7 +28,7 @@
 
 package org.jf.baksmali.Adaptors;
 
-import org.jf.baksmali.baksmaliOptions;
+import org.jf.baksmali.BaksmaliOptions;
 import org.jf.util.IndentingWriter;
 
 import javax.annotation.Nonnull;
@@ -42,7 +42,7 @@
     private final LabelMethodItem tryEndLabel;
     private final LabelMethodItem handlerLabel;
 
-    public CatchMethodItem(@Nonnull baksmaliOptions options, @Nonnull MethodDefinition.LabelCache labelCache,
+    public CatchMethodItem(@Nonnull BaksmaliOptions options, @Nonnull MethodDefinition.LabelCache labelCache,
                            int codeAddress, @Nullable String exceptionType, int startAddress, int endAddress,
                            int handlerAddress) {
         super(codeAddress);
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/ClassDefinition.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/ClassDefinition.java
index 2529af8..361826d 100644
--- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/ClassDefinition.java
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/ClassDefinition.java
@@ -28,8 +28,7 @@
 
 package org.jf.baksmali.Adaptors;
 
-import com.google.common.collect.Lists;
-import org.jf.baksmali.baksmaliOptions;
+import org.jf.baksmali.BaksmaliOptions;
 import org.jf.dexlib2.AccessFlags;
 import org.jf.dexlib2.dexbacked.DexBackedClassDef;
 import org.jf.dexlib2.dexbacked.DexBackedDexFile.InvalidItemIndex;
@@ -46,16 +45,16 @@
 import java.util.*;
 
 public class ClassDefinition {
-    @Nonnull public final baksmaliOptions options;
+    @Nonnull public final BaksmaliOptions options;
     @Nonnull public final ClassDef classDef;
     @Nonnull private final HashSet<String> fieldsSetInStaticConstructor;
 
     protected boolean validationErrors;
 
-    public ClassDefinition(@Nonnull baksmaliOptions options, @Nonnull ClassDef classDef) {
+    public ClassDefinition(@Nonnull BaksmaliOptions options, @Nonnull ClassDef classDef) {
         this.options = options;
         this.classDef = classDef;
-        fieldsSetInStaticConstructor = findFieldsSetInStaticConstructor();
+        fieldsSetInStaticConstructor = findFieldsSetInStaticConstructor(classDef);
     }
 
     public boolean hadValidationErrors() {
@@ -63,7 +62,7 @@
     }
 
     @Nonnull
-    private HashSet<String> findFieldsSetInStaticConstructor() {
+    private static HashSet<String> findFieldsSetInStaticConstructor(@Nonnull ClassDef classDef) {
         HashSet<String> fieldsSetInStaticConstructor = new HashSet<String>();
 
         for (Method method: classDef.getDirectMethods()) {
@@ -166,7 +165,7 @@
             writer.write("# annotations\n");
 
             String containingClass = null;
-            if (options.useImplicitReferences) {
+            if (options.implicitReferences) {
                 containingClass = classDef.getType();
             }
 
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EndTryLabelMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EndTryLabelMethodItem.java
index aed315d..2680704 100644
--- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EndTryLabelMethodItem.java
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EndTryLabelMethodItem.java
@@ -28,14 +28,14 @@
 
 package org.jf.baksmali.Adaptors;
 
-import org.jf.baksmali.baksmaliOptions;
+import org.jf.baksmali.BaksmaliOptions;
 
 import javax.annotation.Nonnull;
 
 public class EndTryLabelMethodItem extends LabelMethodItem {
     private int endTryAddress;
 
-    public EndTryLabelMethodItem(@Nonnull baksmaliOptions options, int codeAddress, int endTryAddress) {
+    public EndTryLabelMethodItem(@Nonnull BaksmaliOptions options, int codeAddress, int endTryAddress) {
         super(options, codeAddress, "try_end_");
         this.endTryAddress = endTryAddress;
     }
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/FieldDefinition.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/FieldDefinition.java
index ae01791..90291b7 100644
--- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/FieldDefinition.java
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/FieldDefinition.java
@@ -29,7 +29,7 @@
 package org.jf.baksmali.Adaptors;
 
 import org.jf.baksmali.Adaptors.EncodedValue.EncodedValueAdaptor;
-import org.jf.baksmali.baksmaliOptions;
+import org.jf.baksmali.BaksmaliOptions;
 import org.jf.dexlib2.AccessFlags;
 import org.jf.dexlib2.iface.Annotation;
 import org.jf.dexlib2.iface.Field;
@@ -41,7 +41,7 @@
 import java.util.Collection;
 
 public class FieldDefinition {
-    public static void writeTo(baksmaliOptions options, IndentingWriter writer, Field field,
+    public static void writeTo(BaksmaliOptions options, IndentingWriter writer, Field field,
                                boolean setInStaticConstructor) throws IOException {
         EncodedValue initialValue = field.getInitialValue();
         int accessFlags = field.getAccessFlags();
@@ -68,7 +68,7 @@
             writer.write(" = ");
 
             String containingClass = null;
-            if (options.useImplicitReferences) {
+            if (options.implicitReferences) {
                 containingClass = field.getDefiningClass();
             }
 
@@ -82,7 +82,7 @@
             writer.indent(4);
 
             String containingClass = null;
-            if (options.useImplicitReferences) {
+            if (options.implicitReferences) {
                 containingClass = field.getDefiningClass();
             }
 
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/InstructionMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/InstructionMethodItem.java
index fe85fe0..d58b2b6 100644
--- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/InstructionMethodItem.java
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/InstructionMethodItem.java
@@ -32,7 +32,7 @@
 import org.jf.baksmali.Adaptors.MethodDefinition.InvalidSwitchPayload;
 import org.jf.baksmali.Adaptors.MethodItem;
 import org.jf.baksmali.Renderers.LongRenderer;
-import org.jf.baksmali.baksmaliOptions;
+import org.jf.baksmali.BaksmaliOptions;
 import org.jf.dexlib2.Opcode;
 import org.jf.dexlib2.ReferenceType;
 import org.jf.dexlib2.VerificationError;
@@ -67,7 +67,7 @@
     }
 
     private boolean isAllowedOdex(@Nonnull Opcode opcode) {
-        baksmaliOptions options = methodDef.classDef.options;
+        BaksmaliOptions options = methodDef.classDef.options;
         if (options.allowOdex) {
             return true;
         }
@@ -110,7 +110,7 @@
         if (instruction instanceof ReferenceInstruction) {
             ReferenceInstruction referenceInstruction = (ReferenceInstruction)instruction;
             String classContext = null;
-            if (methodDef.classDef.options.useImplicitReferences) {
+            if (methodDef.classDef.options.implicitReferences) {
                 classContext = methodDef.method.getDefiningClass();
             }
 
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/OffsetInstructionFormatMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/OffsetInstructionFormatMethodItem.java
index 3ffb4bd..be76edf 100644
--- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/OffsetInstructionFormatMethodItem.java
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/Format/OffsetInstructionFormatMethodItem.java
@@ -30,7 +30,7 @@
 
 import org.jf.baksmali.Adaptors.LabelMethodItem;
 import org.jf.baksmali.Adaptors.MethodDefinition;
-import org.jf.baksmali.baksmaliOptions;
+import org.jf.baksmali.BaksmaliOptions;
 import org.jf.dexlib2.Opcode;
 import org.jf.dexlib2.iface.instruction.OffsetInstruction;
 import org.jf.util.IndentingWriter;
@@ -41,7 +41,7 @@
 public class OffsetInstructionFormatMethodItem extends InstructionMethodItem<OffsetInstruction> {
     protected LabelMethodItem label;
 
-    public OffsetInstructionFormatMethodItem(@Nonnull baksmaliOptions options, @Nonnull MethodDefinition methodDef,
+    public OffsetInstructionFormatMethodItem(@Nonnull BaksmaliOptions options, @Nonnull MethodDefinition methodDef,
                                              int codeAddress, OffsetInstruction instruction) {
         super(methodDef, codeAddress, instruction);
 
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/LabelMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/LabelMethodItem.java
index b152bb6..268d643 100644
--- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/LabelMethodItem.java
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/LabelMethodItem.java
@@ -28,18 +28,18 @@
 
 package org.jf.baksmali.Adaptors;
 
-import org.jf.baksmali.baksmaliOptions;
+import org.jf.baksmali.BaksmaliOptions;
 import org.jf.util.IndentingWriter;
 
 import javax.annotation.Nonnull;
 import java.io.IOException;
 
 public class LabelMethodItem extends MethodItem {
-    private final baksmaliOptions options;
+    private final BaksmaliOptions options;
     private final String labelPrefix;
     private int labelSequence;
 
-    public LabelMethodItem(@Nonnull baksmaliOptions options, int codeAddress, @Nonnull String labelPrefix) {
+    public LabelMethodItem(@Nonnull BaksmaliOptions options, int codeAddress, @Nonnull String labelPrefix) {
         super(codeAddress);
         this.options = options;
         this.labelPrefix = labelPrefix;
@@ -76,7 +76,7 @@
     public boolean writeTo(IndentingWriter writer) throws IOException {
         writer.write(':');
         writer.write(labelPrefix);
-        if (options.useSequentialLabels) {
+        if (options.sequentialLabels) {
             writer.printUnsignedLongAsHex(labelSequence);
         } else {
             writer.printUnsignedLongAsHex(this.getLabelAddress());
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/MethodDefinition.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/MethodDefinition.java
index ef2110a..8161fe4 100644
--- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/MethodDefinition.java
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/MethodDefinition.java
@@ -32,7 +32,7 @@
 import com.google.common.collect.Lists;
 import org.jf.baksmali.Adaptors.Debug.DebugMethodItem;
 import org.jf.baksmali.Adaptors.Format.InstructionMethodItemFactory;
-import org.jf.baksmali.baksmaliOptions;
+import org.jf.baksmali.BaksmaliOptions;
 import org.jf.dexlib2.AccessFlags;
 import org.jf.dexlib2.Format;
 import org.jf.dexlib2.Opcode;
@@ -163,7 +163,7 @@
     }
 
     public static void writeEmptyMethodTo(IndentingWriter writer, Method method,
-                                          baksmaliOptions options) throws IOException {
+                                          BaksmaliOptions options) throws IOException {
         writer.write(".method ");
         writeAccessFlags(writer, method.getAccessFlags());
         writer.write(method.getName());
@@ -180,7 +180,7 @@
         writeParameters(writer, method, methodParameters, options);
 
         String containingClass = null;
-        if (options.useImplicitReferences) {
+        if (options.implicitReferences) {
             containingClass = method.getDefiningClass();
         }
         AnnotationFormatter.writeTo(writer, method.getAnnotations(), containingClass);
@@ -212,7 +212,7 @@
         writer.write('\n');
 
         writer.indent(4);
-        if (classDef.options.useLocalsDirective) {
+        if (classDef.options.localsDirective) {
             writer.write(".locals ");
             writer.printSignedIntAsDec(methodImpl.getRegisterCount() - parameterRegisterCount);
         } else {
@@ -228,7 +228,7 @@
         }
 
         String containingClass = null;
-        if (classDef.options.useImplicitReferences) {
+        if (classDef.options.implicitReferences) {
             containingClass = method.getDefiningClass();
         }
         AnnotationFormatter.writeTo(writer, method.getAnnotations(), containingClass);
@@ -313,18 +313,18 @@
 
     private static void writeParameters(IndentingWriter writer, Method method,
                                         List<? extends MethodParameter> parameters,
-                                        baksmaliOptions options) throws IOException {
+                                        BaksmaliOptions options) throws IOException {
         boolean isStatic = AccessFlags.STATIC.isSet(method.getAccessFlags());
         int registerNumber = isStatic?0:1;
         for (MethodParameter parameter: parameters) {
             String parameterType = parameter.getType();
             String parameterName = parameter.getName();
             Collection<? extends Annotation> annotations = parameter.getAnnotations();
-            if ((options.outputDebugInfo && parameterName != null) || annotations.size() != 0) {
+            if ((options.debugInfo && parameterName != null) || annotations.size() != 0) {
                 writer.write(".param p");
                 writer.printSignedIntAsDec(registerNumber);
 
-                if (parameterName != null && options.outputDebugInfo) {
+                if (parameterName != null && options.debugInfo) {
                     writer.write(", ");
                     ReferenceFormatter.writeStringReference(writer, parameterName);
                 }
@@ -335,7 +335,7 @@
                     writer.indent(4);
 
                     String containingClass = null;
-                    if (options.useImplicitReferences) {
+                    if (options.implicitReferences) {
                         containingClass = method.getDefiningClass();
                     }
                     AnnotationFormatter.writeTo(writer, annotations, containingClass);
@@ -374,11 +374,11 @@
         }
 
         addTries(methodItems);
-        if (classDef.options.outputDebugInfo) {
+        if (classDef.options.debugInfo) {
             addDebugInfo(methodItems);
         }
 
-        if (classDef.options.useSequentialLabels) {
+        if (classDef.options.sequentialLabels) {
             setLabelSequentialNumbers();
         }
 
@@ -415,7 +415,7 @@
                 methodItems.add(new BlankMethodItem(currentCodeAddress));
             }
 
-            if (classDef.options.addCodeOffsets) {
+            if (classDef.options.codeOffsets) {
                 methodItems.add(new MethodItem(currentCodeAddress) {
 
                     @Override
@@ -432,7 +432,8 @@
                 });
             }
 
-            if (!classDef.options.noAccessorComments && (instruction instanceof ReferenceInstruction)) {
+            if (classDef.options.accessorComments && classDef.options.syntheticAccessorResolver != null &&
+                    (instruction instanceof ReferenceInstruction)) {
                 Opcode opcode = instruction.getOpcode();
 
                 if (opcode.referenceType == ReferenceType.METHOD) {
@@ -493,7 +494,7 @@
                 methodItems.add(new BlankMethodItem(currentCodeAddress));
             }
 
-            if (classDef.options.addCodeOffsets) {
+            if (classDef.options.codeOffsets) {
                 methodItems.add(new MethodItem(currentCodeAddress) {
 
                     @Override
@@ -597,7 +598,7 @@
 
     @Nullable
     private String getContainingClassForImplicitReference() {
-        if (classDef.options.useImplicitReferences) {
+        if (classDef.options.implicitReferences) {
             return classDef.classDef.getType();
         }
         return null;
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/PostInstructionRegisterInfoMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/PostInstructionRegisterInfoMethodItem.java
index 812a282..62826b1 100644
--- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/PostInstructionRegisterInfoMethodItem.java
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/PostInstructionRegisterInfoMethodItem.java
@@ -28,7 +28,7 @@
 
 package org.jf.baksmali.Adaptors;
 
-import org.jf.baksmali.baksmaliOptions;
+import org.jf.baksmali.BaksmaliOptions;
 import org.jf.dexlib2.analysis.AnalyzedInstruction;
 import org.jf.dexlib2.analysis.RegisterType;
 import org.jf.util.IndentingWriter;
@@ -60,12 +60,12 @@
         int registerCount = analyzedInstruction.getRegisterCount();
         BitSet registers = new BitSet(registerCount);
 
-        if ((registerInfo & baksmaliOptions.ALL) != 0) {
+        if ((registerInfo & BaksmaliOptions.ALL) != 0) {
             registers.set(0, registerCount);
         } else {
-            if ((registerInfo & baksmaliOptions.ALLPOST) != 0) {
+            if ((registerInfo & BaksmaliOptions.ALLPOST) != 0) {
                 registers.set(0, registerCount);
-            } else if ((registerInfo & baksmaliOptions.DEST) != 0) {
+            } else if ((registerInfo & BaksmaliOptions.DEST) != 0) {
                 addDestRegs(registers, registerCount);
             }
         }
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/PreInstructionRegisterInfoMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/PreInstructionRegisterInfoMethodItem.java
index f532938..f934edd 100644
--- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/PreInstructionRegisterInfoMethodItem.java
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/PreInstructionRegisterInfoMethodItem.java
@@ -28,7 +28,7 @@
 
 package org.jf.baksmali.Adaptors;
 
-import org.jf.baksmali.baksmaliOptions;
+import org.jf.baksmali.BaksmaliOptions;
 import org.jf.dexlib2.analysis.AnalyzedInstruction;
 import org.jf.dexlib2.analysis.MethodAnalyzer;
 import org.jf.dexlib2.analysis.RegisterType;
@@ -68,29 +68,29 @@
         BitSet registers = new BitSet(registerCount);
         BitSet mergeRegisters = null;
 
-        if ((registerInfo & baksmaliOptions.ALL) != 0) {
+        if ((registerInfo & BaksmaliOptions.ALL) != 0) {
             registers.set(0, registerCount);
         } else {
-            if ((registerInfo & baksmaliOptions.ALLPRE) != 0) {
+            if ((registerInfo & BaksmaliOptions.ALLPRE) != 0) {
                 registers.set(0, registerCount);
             } else {
-                if ((registerInfo & baksmaliOptions.ARGS) != 0) {
+                if ((registerInfo & BaksmaliOptions.ARGS) != 0) {
                     addArgsRegs(registers);
                 }
-                if ((registerInfo & baksmaliOptions.MERGE) != 0) {
+                if ((registerInfo & BaksmaliOptions.MERGE) != 0) {
                     if (analyzedInstruction.isBeginningInstruction()) {
                         addParamRegs(registers, registerCount);
                     }
                     mergeRegisters = new BitSet(registerCount);
                     addMergeRegs(mergeRegisters, registerCount);
-                } else if ((registerInfo & baksmaliOptions.FULLMERGE) != 0 &&
+                } else if ((registerInfo & BaksmaliOptions.FULLMERGE) != 0 &&
                         (analyzedInstruction.isBeginningInstruction())) {
                     addParamRegs(registers, registerCount);
                 }
             }
         }
 
-        if ((registerInfo & baksmaliOptions.FULLMERGE) != 0) {
+        if ((registerInfo & BaksmaliOptions.FULLMERGE) != 0) {
             if (mergeRegisters == null) {
                 mergeRegisters = new BitSet(registerCount);
                 addMergeRegs(mergeRegisters, registerCount);
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/RegisterFormatter.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/RegisterFormatter.java
index bffcb38..3d72f46 100644
--- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/RegisterFormatter.java
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/RegisterFormatter.java
@@ -28,7 +28,7 @@
 
 package org.jf.baksmali.Adaptors;
 
-import org.jf.baksmali.baksmaliOptions;
+import org.jf.baksmali.BaksmaliOptions;
 import org.jf.util.IndentingWriter;
 
 import javax.annotation.Nonnull;
@@ -38,11 +38,11 @@
  * This class contains the logic used for formatting registers
  */
 public class RegisterFormatter {
-    @Nonnull public final baksmaliOptions options;
+    @Nonnull public final BaksmaliOptions options;
     public final int registerCount;
     public final int parameterRegisterCount;
 
-    public RegisterFormatter(@Nonnull baksmaliOptions options, int registerCount, int parameterRegisterCount) {
+    public RegisterFormatter(@Nonnull BaksmaliOptions options, int registerCount, int parameterRegisterCount) {
         this.options = options;
         this.registerCount = registerCount;
         this.parameterRegisterCount = parameterRegisterCount;
@@ -58,7 +58,7 @@
      * @param lastRegister the last register in the range
      */
     public void writeRegisterRange(IndentingWriter writer, int startRegister, int lastRegister) throws IOException {
-        if (!options.noParameterRegisters) {
+        if (options.parameterRegisters) {
             assert startRegister <= lastRegister;
 
             if (startRegister >= registerCount - parameterRegisterCount) {
@@ -86,7 +86,7 @@
      * @param register the register number
      */
     public void writeTo(IndentingWriter writer, int register) throws IOException {
-        if (!options.noParameterRegisters) {
+        if (options.parameterRegisters) {
             if (register >= registerCount - parameterRegisterCount) {
                 writer.write('p');
                 writer.printSignedIntAsDec((register - (registerCount - parameterRegisterCount)));
diff --git a/baksmali/src/main/java/org/jf/baksmali/AnalysisArguments.java b/baksmali/src/main/java/org/jf/baksmali/AnalysisArguments.java
new file mode 100644
index 0000000..20bc45b
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/AnalysisArguments.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.Parameter;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.analysis.ClassPath;
+import org.jf.dexlib2.analysis.ClassPathResolver;
+import org.jf.dexlib2.dexbacked.OatFile.OatDexFile;
+import org.jf.dexlib2.iface.DexFile;
+import org.jf.util.jcommander.ColonParameterSplitter;
+import org.jf.util.jcommander.ExtendedParameter;
+
+import javax.annotation.Nonnull;
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+import static org.jf.dexlib2.analysis.ClassPath.NOT_ART;
+
+public class AnalysisArguments {
+    @Parameter(names = {"-b", "--bootclasspath", "--bcp"},
+            description = "A colon separated list of the files to include in the bootclasspath when analyzing the " +
+                    "dex file. If not specified, baksmali will attempt to choose an " +
+                    "appropriate default. When analyzing oat files, this can simply be the path to the device's " +
+                    "boot.oat file. A single empty string can be used to specify that an empty bootclasspath should " +
+                    "be used. (e.g. --bootclasspath \"\") See baksmali help classpath for more information.",
+            splitter = ColonParameterSplitter.class)
+    @ExtendedParameter(argumentNames = "classpath")
+    public List<String> bootClassPath = null;
+
+    @Parameter(names = {"-c", "--classpath", "--cp"},
+            description = "A colon separated list of additional files to include in the classpath when analyzing the " +
+                    "dex file. These will be added to the classpath after any bootclasspath entries.",
+            splitter = ColonParameterSplitter.class)
+    @ExtendedParameter(argumentNames = "classpath")
+    public List<String> classPath = Lists.newArrayList();
+
+    @Parameter(names = {"-d", "--classpath-dir", "--cpd", "--dir"},
+            description = "A directory to search for classpath files. This option can be used multiple times to " +
+                    "specify multiple directories to search. They will be searched in the order they are provided.")
+    @ExtendedParameter(argumentNames = "dir")
+    public List<String> classPathDirectories = null;
+
+    public static class CheckPackagePrivateArgument {
+        @Parameter(names = {"--check-package-private-access", "--package-private", "--checkpp", "--pp"},
+                description = "Use the package-private access check when calculating vtable indexes. This is enabled " +
+                        "by default for oat files. For odex files, this is only needed for odexes from 4.2.0. It " +
+                        "was reverted in 4.2.1.")
+        public boolean checkPackagePrivateAccess = false;
+    }
+
+    @Nonnull
+    public ClassPath loadClassPathForDexFile(@Nonnull File dexFileDir, @Nonnull DexFile dexFile,
+                                             boolean checkPackagePrivateAccess) throws IOException {
+        return loadClassPathForDexFile(dexFileDir, dexFile, checkPackagePrivateAccess, NOT_ART);
+    }
+
+    @Nonnull
+    public ClassPath loadClassPathForDexFile(@Nonnull File dexFileDir, @Nonnull DexFile dexFile,
+                                             boolean checkPackagePrivateAccess, int oatVersion)
+            throws IOException {
+        ClassPathResolver resolver;
+
+        // By default, oatVersion should be NOT_ART, and we'll automatically set it if dexFile is an oat file. In some
+        // cases the caller may choose to override the oat version, in which case we should use the given oat version
+        // regardless of the actual version of the oat file
+        if (oatVersion == NOT_ART) {
+            if (dexFile instanceof OatDexFile) {
+                checkPackagePrivateAccess = true;
+                oatVersion = ((OatDexFile)dexFile).getContainer().getOatVersion();
+            }
+        } else {
+            // this should always be true for ART
+            checkPackagePrivateAccess = true;
+        }
+
+        if (classPathDirectories == null || classPathDirectories.size() == 0) {
+            classPathDirectories = Lists.newArrayList(dexFileDir.getPath());
+        }
+
+        List<String> filteredClassPathDirectories = Lists.newArrayList();
+        if (classPathDirectories != null) {
+            for (String dir: classPathDirectories) {
+                File file = new File(dir);
+                if (!file.exists()) {
+                    System.err.println(String.format("Warning: directory %s does not exist. Ignoring.", dir));
+                } else if (!file.isDirectory()) {
+                    System.err.println(String.format("Warning: %s is not a directory. Ignoring.", dir));
+                } else {
+                    filteredClassPathDirectories.add(dir);
+                }
+            }
+        }
+
+        if (bootClassPath == null) {
+            // TODO: we should be able to get the api from the Opcodes object associated with the dexFile..
+            // except that the oat version -> api mapping doesn't fully work yet
+            resolver = new ClassPathResolver(filteredClassPathDirectories, classPath, dexFile);
+        }  else if (bootClassPath.size() == 1 && bootClassPath.get(0).length() == 0) {
+            // --bootclasspath "" is a special case, denoting that no bootclasspath should be used
+            resolver = new ClassPathResolver(
+                    ImmutableList.<String>of(), ImmutableList.<String>of(), classPath, dexFile);
+        } else {
+            resolver = new ClassPathResolver(filteredClassPathDirectories, bootClassPath, classPath, dexFile);
+        }
+
+        if (oatVersion == 0 && dexFile instanceof OatDexFile) {
+            oatVersion = ((OatDexFile)dexFile).getContainer().getOatVersion();
+        }
+        return new ClassPath(resolver.getResolvedClassProviders(), checkPackagePrivateAccess, oatVersion);
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/baksmali.java b/baksmali/src/main/java/org/jf/baksmali/Baksmali.java
similarity index 60%
rename from baksmali/src/main/java/org/jf/baksmali/baksmali.java
rename to baksmali/src/main/java/org/jf/baksmali/Baksmali.java
index 5060734..1c0231b 100644
--- a/baksmali/src/main/java/org/jf/baksmali/baksmali.java
+++ b/baksmali/src/main/java/org/jf/baksmali/Baksmali.java
@@ -28,105 +28,28 @@
 
 package org.jf.baksmali;
 
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Ordering;
 import org.jf.baksmali.Adaptors.ClassDefinition;
-import org.jf.dexlib2.analysis.ClassPath;
-import org.jf.dexlib2.analysis.CustomInlineMethodResolver;
 import org.jf.dexlib2.iface.ClassDef;
 import org.jf.dexlib2.iface.DexFile;
-import org.jf.dexlib2.util.SyntheticAccessorResolver;
 import org.jf.util.ClassFileNameHandler;
 import org.jf.util.IndentingWriter;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
 
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
+import javax.annotation.Nullable;
 import java.io.*;
+import java.util.HashSet;
 import java.util.List;
-import java.util.Map.Entry;
+import java.util.Set;
 import java.util.concurrent.*;
 
-public class baksmali {
+public class Baksmali {
+    public static boolean disassembleDexFile(DexFile dexFile, File outputDir, int jobs, final BaksmaliOptions options) {
+        return disassembleDexFile(dexFile, outputDir, jobs, options, null);
+    }
 
-    public static boolean disassembleDexFile(DexFile dexFile, final baksmaliOptions options) {
-        if (options.registerInfo != 0 || options.deodex || options.normalizeVirtualMethods) {
-            try {
-                Iterable<String> extraClassPathEntries;
-                if (options.extraClassPathEntries != null) {
-                    extraClassPathEntries = options.extraClassPathEntries;
-                } else {
-                    extraClassPathEntries = ImmutableList.of();
-                }
-
-                options.classPath = ClassPath.fromClassPath(options.bootClassPathDirs,
-                        Iterables.concat(options.bootClassPathEntries, extraClassPathEntries), dexFile,
-                        options.apiLevel, options.checkPackagePrivateAccess, options.experimental);
-
-                if (options.customInlineDefinitions != null) {
-                    options.inlineResolver = new CustomInlineMethodResolver(options.classPath,
-                            options.customInlineDefinitions);
-                }
-            } catch (Exception ex) {
-                System.err.println("\n\nError occurred while loading boot class path files. Aborting.");
-                ex.printStackTrace(System.err);
-                return false;
-            }
-        }
-
-        if (options.resourceIdFileEntries != null) {
-            class PublicHandler extends DefaultHandler {
-                String prefix = null;
-                public PublicHandler(String prefix) {
-                    super();
-                    this.prefix = prefix;
-                }
-
-                public void startElement(String uri, String localName,
-                        String qName, Attributes attr) throws SAXException {
-                    if (qName.equals("public")) {
-                        String type = attr.getValue("type");
-                        String name = attr.getValue("name").replace('.', '_');
-                        Integer public_key = Integer.decode(attr.getValue("id"));
-                        String public_val = new StringBuffer()
-                            .append(prefix)
-                            .append(".")
-                            .append(type)
-                            .append(".")
-                            .append(name)
-                            .toString();
-                        options.resourceIds.put(public_key, public_val);
-                    }
-                }
-            };
-
-            for (Entry<String,String> entry: options.resourceIdFileEntries.entrySet()) {
-                try {
-                    SAXParser saxp = SAXParserFactory.newInstance().newSAXParser();
-                    String prefix = entry.getValue();
-                    saxp.parse(entry.getKey(), new PublicHandler(prefix));
-                } catch (ParserConfigurationException e) {
-                    continue;
-                } catch (SAXException e) {
-                    continue;
-                } catch (IOException e) {
-                    continue;
-                }
-            }
-        }
-
-        File outputDirectoryFile = new File(options.outputDirectory);
-        if (!outputDirectoryFile.exists()) {
-            if (!outputDirectoryFile.mkdirs()) {
-                System.err.println("Can't create the output directory " + options.outputDirectory);
-                return false;
-            }
-        }
+    public static boolean disassembleDexFile(DexFile dexFile, File outputDir, int jobs, final BaksmaliOptions options,
+                                             @Nullable List<String> classes) {
 
         //sort the classes, so that if we're on a case-insensitive file system and need to handle classes with file
         //name collisions, then we'll use the same name for each class, if the dex file goes through multiple
@@ -134,16 +57,20 @@
         //may still change of course
         List<? extends ClassDef> classDefs = Ordering.natural().sortedCopy(dexFile.getClasses());
 
-        if (!options.noAccessorComments) {
-            options.syntheticAccessorResolver = new SyntheticAccessorResolver(dexFile.getOpcodes(), classDefs);
-        }
+        final ClassFileNameHandler fileNameHandler = new ClassFileNameHandler(outputDir, ".smali");
 
-        final ClassFileNameHandler fileNameHandler = new ClassFileNameHandler(outputDirectoryFile, ".smali");
-
-        ExecutorService executor = Executors.newFixedThreadPool(options.jobs);
+        ExecutorService executor = Executors.newFixedThreadPool(jobs);
         List<Future<Boolean>> tasks = Lists.newArrayList();
 
+        Set<String> classSet = null;
+        if (classes != null) {
+            classSet = new HashSet<String>(classes);
+        }
+
         for (final ClassDef classDef: classDefs) {
+            if (classSet != null && !classSet.contains(classDef.getType())) {
+                continue;
+            }
             tasks.add(executor.submit(new Callable<Boolean>() {
                 @Override public Boolean call() throws Exception {
                     return disassembleClass(classDef, fileNameHandler, options);
@@ -174,7 +101,7 @@
     }
 
     private static boolean disassembleClass(ClassDef classDef, ClassFileNameHandler fileNameHandler,
-                                            baksmaliOptions options) {
+                                            BaksmaliOptions options) {
         /**
          * The path for the disassembly file is based on the package name
          * The class descriptor will look something like:
diff --git a/baksmali/src/main/java/org/jf/baksmali/BaksmaliOptions.java b/baksmali/src/main/java/org/jf/baksmali/BaksmaliOptions.java
new file mode 100644
index 0000000..7ad5124
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/BaksmaliOptions.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import org.jf.dexlib2.analysis.ClassPath;
+import org.jf.dexlib2.analysis.InlineMethodResolver;
+import org.jf.dexlib2.util.SyntheticAccessorResolver;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+public class BaksmaliOptions {
+    public int apiLevel = 15;
+
+    public boolean parameterRegisters = true;
+    public boolean localsDirective = false;
+    public boolean sequentialLabels = false;
+    public boolean debugInfo = true;
+    public boolean codeOffsets = false;
+    public boolean accessorComments = true;
+    public boolean allowOdex = false;
+    public boolean deodex = false;
+    public boolean implicitReferences = false;
+    public boolean normalizeVirtualMethods = false;
+
+    // register info values
+    public static final int ALL = 1;
+    public static final int ALLPRE = 2;
+    public static final int ALLPOST = 4;
+    public static final int ARGS = 8;
+    public static final int DEST = 16;
+    public static final int MERGE = 32;
+    public static final int FULLMERGE = 64;
+
+    public int registerInfo = 0;
+
+    public Map<Integer,String> resourceIds = new HashMap<Integer,String>();
+    public InlineMethodResolver inlineResolver = null;
+    public ClassPath classPath = null;
+    public SyntheticAccessorResolver syntheticAccessorResolver = null;
+
+    /**
+     * Load the resource ids from a set of public.xml files.
+     *
+     * @param resourceFiles A map of resource prefixes -> public.xml files
+     */
+    public void loadResourceIds(Map<String, File> resourceFiles) throws SAXException, IOException {
+        for (Map.Entry<String, File> entry: resourceFiles.entrySet()) {
+            try {
+                SAXParser saxp = SAXParserFactory.newInstance().newSAXParser();
+                final String prefix = entry.getKey();
+                saxp.parse(entry.getValue(), new DefaultHandler() {
+                    @Override
+                    public void startElement(String uri, String localName, String qName,
+                                             Attributes attr) throws SAXException {
+                        if (qName.equals("public")) {
+                            String resourceType = attr.getValue("type");
+                            String resourceName = attr.getValue("name").replace('.', '_');
+                            Integer resourceId = Integer.decode(attr.getValue("id"));
+                            String qualifiedResourceName =
+                                    String.format("%s.%s.%s", prefix, resourceType, resourceName);
+                            resourceIds.put(resourceId, qualifiedResourceName);
+                        }
+                    }
+                });
+            } catch (ParserConfigurationException ex) {
+                throw new RuntimeException(ex);
+            }
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/DeodexCommand.java b/baksmali/src/main/java/org/jf/baksmali/DeodexCommand.java
new file mode 100644
index 0000000..3ded479
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/DeodexCommand.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import com.beust.jcommander.ParametersDelegate;
+import org.jf.baksmali.AnalysisArguments.CheckPackagePrivateArgument;
+import org.jf.dexlib2.analysis.CustomInlineMethodResolver;
+import org.jf.dexlib2.analysis.InlineMethodResolver;
+import org.jf.dexlib2.dexbacked.DexBackedOdexFile;
+import org.jf.util.jcommander.ExtendedParameter;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+@Parameters(commandDescription = "Deodexes an odex/oat file")
+@ExtendedParameters(
+        commandName = "deodex",
+        commandAliases = { "de", "x" })
+public class DeodexCommand extends DisassembleCommand {
+
+    @ParametersDelegate
+    protected CheckPackagePrivateArgument checkPackagePrivateArgument = new CheckPackagePrivateArgument();
+
+    @Parameter(names = {"--inline-table", "--inline", "--it"},
+            description = "Specify a file containing a custom inline method table to use. See the " +
+                    "\"deodexerant\" tool in the smali github repository to dump the inline method table from a " +
+                    "device that uses dalvik.")
+    @ExtendedParameter(argumentNames = "file")
+    private String inlineTable;
+
+    public DeodexCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    @Override protected BaksmaliOptions getOptions() {
+        BaksmaliOptions options = super.getOptions();
+
+        options.deodex = true;
+
+        if (dexFile instanceof DexBackedOdexFile) {
+            if (inlineTable == null) {
+                options.inlineResolver = InlineMethodResolver.createInlineMethodResolver(
+                        ((DexBackedOdexFile)dexFile).getOdexVersion());
+            } else {
+                File inlineTableFile = new File(inlineTable);
+                if (!inlineTableFile.exists()) {
+                    System.err.println(String.format("Could not find file: %s", inlineTable));
+                    System.exit(-1);
+                }
+                try {
+                    options.inlineResolver = new CustomInlineMethodResolver(options.classPath, inlineTableFile);
+                } catch (IOException ex) {
+                    System.err.println(String.format("Error while reading file: %s", inlineTableFile));
+                    ex.printStackTrace(System.err);
+                    System.exit(-1);
+                }
+            }
+        }
+
+        return options;
+    }
+
+    @Override protected boolean shouldCheckPackagePrivateAccess() {
+        return checkPackagePrivateArgument.checkPackagePrivateAccess;
+    }
+
+    @Override protected boolean needsClassPath() {
+        return true;
+    }
+
+    @Override protected boolean showDeodexWarning() {
+        return false;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/DexInputCommand.java b/baksmali/src/main/java/org/jf/baksmali/DexInputCommand.java
new file mode 100644
index 0000000..c7660cb
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/DexInputCommand.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.google.common.base.Strings;
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.DexFileFactory;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.util.jcommander.Command;
+import org.jf.util.jcommander.ExtendedParameter;
+
+import javax.annotation.Nonnull;
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * This class implements common functionality for commands that need to load a dex file based on
+ * command line input
+ */
+public abstract class DexInputCommand extends Command {
+
+    @Parameter(names = {"-a", "--api"},
+            description = "The numeric api level of the file being disassembled.")
+    @ExtendedParameter(argumentNames = "api")
+    public int apiLevel = 15;
+
+    @Parameter(description = "A dex/apk/oat/odex file. For apk or oat files that contain multiple dex " +
+            "files, you can specify the specific entry to use as if the apk/oat file was a directory. " +
+            "e.g. \"app.apk/classes2.dex\". For more information, see \"baksmali help input\".")
+    @ExtendedParameter(argumentNames = "file")
+    protected List<String> inputList = Lists.newArrayList();
+
+    protected File inputFile;
+    protected String inputEntry;
+    protected DexBackedDexFile dexFile;
+
+    public DexInputCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    /**
+     * Parses a dex file input from the user and loads the given dex file.
+     *
+     * In some cases, the input file can contain multiple dex files. If this is the case, you can refer to a specific
+     * dex file with a slash, followed by the entry name, optionally in quotes.
+     *
+     * If the entry name is enclosed in quotes, then it will strip the first and last quote and look for an entry with
+     * exactly that name. Otherwise, it will perform a partial filename match against the entry to find any candidates.
+     * If there is a single matching candidate, it will be used. Otherwise, an error will be generated.
+     *
+     * For example, to refer to the "/system/framework/framework.jar:classes2.dex" entry within the
+     * "framework/arm/framework.oat" oat file, you could use any of:
+     *
+     * framework/arm/framework.oat/"/system/framework/framework.jar:classes2.dex"
+     * framework/arm/framework.oat/system/framework/framework.jar:classes2.dex
+     * framework/arm/framework.oat/framework/framework.jar:classes2.dex
+     * framework/arm/framework.oat/framework.jar:classes2.dex
+     * framework/arm/framework.oat/classes2.dex
+     *
+     * The last option is the easiest, but only works if the oat file doesn't contain another entry with the
+     * "classes2.dex" name. e.g. "/system/framework/blah.jar:classes2.dex"
+     *
+     * It's technically possible (although unlikely) for an oat file to contain 2 entries like:
+     * /system/framework/framework.jar:classes2.dex
+     * system/framework/framework.jar:classes2.dex
+     *
+     * In this case, the "framework/arm/framework.oat/system/framework/framework.jar:classes2.dex" syntax will generate
+     * an error because both entries match the partial entry name. Instead, you could use the following for the
+     * first and second entry respectively:
+     *
+     * framework/arm/framework.oat/"/system/framework/framework.jar:classes2.dex"
+     * framework/arm/framework.oat/"system/framework/framework.jar:classes2.dex"
+     *
+     * @param input The name of a dex, apk, odex or oat file/entry.
+     */
+    protected void loadDexFile(@Nonnull String input) {
+        File file = new File(input);
+
+        while (file != null && !file.exists()) {
+            file = file.getParentFile();
+        }
+
+        if (file == null || !file.exists() || file.isDirectory()) {
+            System.err.println("Can't find file: " + input);
+            System.exit(1);
+        }
+
+        inputFile = file;
+
+        String dexEntry = null;
+        if (file.getPath().length() < input.length()) {
+            dexEntry = input.substring(file.getPath().length() + 1);
+        }
+
+        if (!Strings.isNullOrEmpty(dexEntry)) {
+            boolean exactMatch = false;
+            if (dexEntry.length() > 2 && dexEntry.charAt(0) == '"' && dexEntry.charAt(dexEntry.length() - 1) == '"') {
+                dexEntry = dexEntry.substring(1, dexEntry.length() - 1);
+                exactMatch = true;
+            }
+
+            inputEntry = dexEntry;
+
+            try {
+                dexFile = DexFileFactory.loadDexEntry(file, dexEntry, exactMatch, Opcodes.forApi(apiLevel));
+            } catch (IOException ex) {
+                throw new RuntimeException(ex);
+            }
+        } else {
+            try {
+                dexFile = DexFileFactory.loadDexFile(file, Opcodes.forApi(apiLevel));
+            } catch (IOException ex) {
+                throw new RuntimeException(ex);
+            }
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/DisassembleCommand.java b/baksmali/src/main/java/org/jf/baksmali/DisassembleCommand.java
new file mode 100644
index 0000000..2e3eb79
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/DisassembleCommand.java
@@ -0,0 +1,287 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import com.beust.jcommander.ParametersDelegate;
+import com.beust.jcommander.validators.PositiveInteger;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import org.jf.dexlib2.util.SyntheticAccessorResolver;
+import org.jf.util.StringWrapper;
+import org.jf.util.jcommander.ExtendedParameter;
+import org.jf.util.jcommander.ExtendedParameters;
+import org.xml.sax.SAXException;
+
+import javax.annotation.Nonnull;
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+
+@Parameters(commandDescription = "Disassembles a dex file.")
+@ExtendedParameters(
+        commandName = "disassemble",
+        commandAliases = { "dis", "d" })
+public class DisassembleCommand extends DexInputCommand {
+
+    @Parameter(names = {"-h", "-?", "--help"}, help = true,
+            description = "Show usage information for this command.")
+    private boolean help;
+
+    @ParametersDelegate
+    protected AnalysisArguments analysisArguments = new AnalysisArguments();
+
+    @Parameter(names = {"--debug-info", "--di"}, arity = 1,
+            description = "Whether to include debug information in the output (.local, .param, .line, etc.). True " +
+                    "by default, use --debug-info=false to disable.")
+    @ExtendedParameter(argumentNames = "boolean")
+    private boolean debugInfo = true;
+
+    @Parameter(names = {"--code-offsets", "--offsets", "--off"},
+            description = "Add a comment before each instruction with it's code offset within the method.")
+    private boolean codeOffsets = false;
+
+    @Parameter(names = {"--resolve-resources", "--rr"}, arity = 2,
+            description = "This will attempt to find any resource id references within the bytecode and add a " +
+                    "comment with the name of the resource being referenced. The parameter accepts 2 values:" +
+                    "an arbitrary resource prefix and the path to a public.xml file. For example: " +
+                    "--resolve-resources android.R framework/res/values/public.xml. This option can be specified " +
+                    "multiple times to provide resources from multiple packages.")
+    @ExtendedParameter(argumentNames = {"resource prefix", "public.xml file"})
+    private List<String> resourceIdFiles = Lists.newArrayList();
+
+    @Parameter(names = {"-j", "--jobs"},
+            description = "The number of threads to use. Defaults to the number of cores available.",
+            validateWith = PositiveInteger.class)
+    @ExtendedParameter(argumentNames = "n")
+    private int jobs = Runtime.getRuntime().availableProcessors();
+
+    @Parameter(names = {"-l", "--use-locals"},
+            description = "When disassembling, output the .locals directive with the number of non-parameter " +
+                    "registers instead of the .registers directive with the total number of registers.")
+    private boolean localsDirective = false;
+
+    @Parameter(names = {"--accessor-comments", "--ac"}, arity = 1,
+            description = "Generate helper comments for synthetic accessors. True by default, use " +
+                    "--accessor-comments=false to disable.")
+    @ExtendedParameter(argumentNames = "boolean")
+    private boolean accessorComments = true;
+
+    @Parameter(names = {"--normalize-virtual-methods", "--norm", "--nvm"},
+            description = "Normalize virtual method references to use the base class where the method is " +
+                    "originally declared.")
+    private boolean normalizeVirtualMethods = false;
+
+    @Parameter(names = {"-o", "--output"},
+            description = "The directory to write the disassembled files to.")
+    @ExtendedParameter(argumentNames = "dir")
+    private String outputDir = "out";
+
+    @Parameter(names = {"--parameter-registers", "--preg", "--pr"}, arity = 1,
+            description = "Use the pNN syntax for registers that refer to a method parameter on method entry. True " +
+                    "by default, use --parameter-registers=false to disable.")
+    @ExtendedParameter(argumentNames = "boolean")
+    private boolean parameterRegisters = true;
+
+    @Parameter(names = {"-r", "--register-info"},
+            description = "Add comments before/after each instruction with information about register types. " +
+                    "The value is a comma-separated list of any of ALL, ALLPRE, ALLPOST, ARGS, DEST, MERGE and " +
+                    "FULLMERGE. See \"baksmali help register-info\" for more information.")
+    @ExtendedParameter(argumentNames = "register info specifier")
+    private List<String> registerInfoTypes = Lists.newArrayList();
+
+    @Parameter(names = {"--sequential-labels", "--seq", "--sl"},
+            description = "Create label names using a sequential numbering scheme per label type, rather than " +
+                    "using the bytecode address.")
+    private boolean sequentialLabels = false;
+
+    @Parameter(names = {"--implicit-references", "--implicit", "--ir"},
+            description = "Use implicit method and field references (without the class name) for methods and " +
+                    "fields from the current class.")
+    private boolean implicitReferences = false;
+
+    @Parameter(names = "--classes",
+            description = "A comma separated list of classes. Only disassemble these classes")
+    @ExtendedParameter(argumentNames = "classes")
+    private List<String> classes = null;
+
+    public DisassembleCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    public void run() {
+        if (help || inputList == null || inputList.isEmpty()) {
+            usage();
+            return;
+        }
+
+        if (inputList.size() > 1) {
+            System.err.println("Too many files specified");
+            usage();
+            return;
+        }
+
+        String input = inputList.get(0);
+        loadDexFile(input);
+
+        if (showDeodexWarning() && dexFile.hasOdexOpcodes()) {
+            StringWrapper.printWrappedString(System.err,
+                    "Warning: You are disassembling an odex/oat file without deodexing it. You won't be able to " +
+                            "re-assemble the results unless you deodex it. See \"baksmali help deodex\"");
+        }
+
+        File outputDirectoryFile = new File(outputDir);
+        if (!outputDirectoryFile.exists()) {
+            if (!outputDirectoryFile.mkdirs()) {
+                System.err.println("Can't create the output directory " + outputDir);
+                System.exit(-1);
+            }
+        }
+
+        if (analysisArguments.classPathDirectories == null || analysisArguments.classPathDirectories.isEmpty()) {
+            analysisArguments.classPathDirectories = Lists.newArrayList(inputFile.getAbsoluteFile().getParent());
+        }
+
+        if (!Baksmali.disassembleDexFile(dexFile, outputDirectoryFile, jobs, getOptions(), classes)) {
+            System.exit(-1);
+        }
+    }
+
+    protected boolean needsClassPath() {
+        return !registerInfoTypes.isEmpty() || normalizeVirtualMethods;
+    }
+
+    protected boolean shouldCheckPackagePrivateAccess() {
+        return false;
+    }
+
+    protected boolean showDeodexWarning() {
+        return true;
+    }
+
+    protected BaksmaliOptions getOptions() {
+        if (dexFile == null) {
+            throw new IllegalStateException("You must call loadDexFile first");
+        }
+
+        final BaksmaliOptions options = new BaksmaliOptions();
+
+        if (needsClassPath()) {
+            try {
+                options.classPath = analysisArguments.loadClassPathForDexFile(
+                        inputFile.getAbsoluteFile().getParentFile(), dexFile, shouldCheckPackagePrivateAccess());
+            } catch (Exception ex) {
+                System.err.println("\n\nError occurred while loading class path files. Aborting.");
+                ex.printStackTrace(System.err);
+                System.exit(-1);
+            }
+        }
+
+        if (!resourceIdFiles.isEmpty()) {
+            Map<String, File> resourceFiles = Maps.newHashMap();
+
+            assert (resourceIdFiles.size() % 2) == 0;
+            for (int i=0; i<resourceIdFiles.size(); i+=2) {
+                String resourcePrefix = resourceIdFiles.get(i);
+                String publicXml = resourceIdFiles.get(i+1);
+
+                File publicXmlFile = new File(publicXml);
+
+                if (!publicXmlFile.exists()) {
+                    System.err.println(String.format("Can't find file: %s", publicXmlFile));
+                    System.exit(-1);
+                }
+
+                resourceFiles.put(resourcePrefix, publicXmlFile);
+            }
+
+            try {
+                options.loadResourceIds(resourceFiles);
+            } catch (IOException ex) {
+                System.err.println("Error while loading resource files:");
+                ex.printStackTrace(System.err);
+                System.exit(-1);
+            } catch (SAXException ex) {
+                System.err.println("Error while loading resource files:");
+                ex.printStackTrace(System.err);
+                System.exit(-1);
+            }
+        }
+
+        options.parameterRegisters = parameterRegisters;
+        options.localsDirective = localsDirective;
+        options.sequentialLabels = sequentialLabels;
+        options.debugInfo = debugInfo;
+        options.codeOffsets = codeOffsets;
+        options.accessorComments = accessorComments;
+        options.implicitReferences = implicitReferences;
+        options.normalizeVirtualMethods = normalizeVirtualMethods;
+
+        options.registerInfo = 0;
+
+        for (String registerInfoType: registerInfoTypes) {
+            if (registerInfoType.equalsIgnoreCase("ALL")) {
+                options.registerInfo  |= BaksmaliOptions.ALL;
+            } else if (registerInfoType.equalsIgnoreCase("ALLPRE")) {
+                options.registerInfo  |= BaksmaliOptions.ALLPRE;
+            } else if (registerInfoType.equalsIgnoreCase("ALLPOST")) {
+                options.registerInfo  |= BaksmaliOptions.ALLPOST;
+            } else if (registerInfoType.equalsIgnoreCase("ARGS")) {
+                options.registerInfo  |= BaksmaliOptions.ARGS;
+            } else if (registerInfoType.equalsIgnoreCase("DEST")) {
+                options.registerInfo  |= BaksmaliOptions.DEST;
+            } else if (registerInfoType.equalsIgnoreCase("MERGE")) {
+                options.registerInfo  |= BaksmaliOptions.MERGE;
+            } else if (registerInfoType.equalsIgnoreCase("FULLMERGE")) {
+                options.registerInfo  |= BaksmaliOptions.FULLMERGE;
+            } else {
+                System.err.println(String.format("Invalid register info type: %s", registerInfoType));
+                usage();
+                System.exit(-1);
+            }
+
+            if ((options.registerInfo & BaksmaliOptions.FULLMERGE) != 0) {
+                options.registerInfo &= ~BaksmaliOptions.MERGE;
+            }
+        }
+
+        if (accessorComments) {
+            options.syntheticAccessorResolver = new SyntheticAccessorResolver(dexFile.getOpcodes(),
+                    dexFile.getClasses());
+        }
+
+        return options;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/DumpCommand.java b/baksmali/src/main/java/org/jf/baksmali/DumpCommand.java
new file mode 100644
index 0000000..433be12
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/DumpCommand.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.raw.RawDexFile;
+import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
+import org.jf.util.ConsoleUtil;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.io.*;
+import java.util.List;
+
+@Parameters(commandDescription = "Prints an annotated hex dump for the given dex file")
+@ExtendedParameters(
+        commandName = "dump",
+        commandAliases = "du")
+public class DumpCommand extends DexInputCommand {
+
+    @Parameter(names = {"-h", "-?", "--help"}, help = true,
+            description = "Show usage information for this command.")
+    private boolean help;
+
+    public DumpCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    public void run() {
+        if (help || inputList == null || inputList.isEmpty()) {
+            usage();
+            return;
+        }
+
+        if (inputList.size() > 1) {
+            System.err.println("Too many files specified");
+            usage();
+            return;
+        }
+
+        String input = inputList.get(0);
+        loadDexFile(input);
+
+        try {
+            dump(dexFile, System.out);
+        } catch (IOException ex) {
+            System.err.println("There was an error while dumping the dex file");
+            ex.printStackTrace(System.err);
+        }
+    }
+
+    /**
+     * Writes an annotated hex dump of the given dex file to output.
+     *
+     * @param dexFile The dex file to dump
+     * @param output An OutputStream to write the annotated hex dump to. The caller is responsible for closing this
+     *               when needed.
+     *
+     * @throws IOException
+     */
+    public static void dump(@Nonnull DexBackedDexFile dexFile, @Nonnull OutputStream output)
+            throws IOException {
+        Writer writer = new BufferedWriter(new OutputStreamWriter(output));
+
+        int consoleWidth = ConsoleUtil.getConsoleWidth();
+        if (consoleWidth <= 0) {
+            consoleWidth = 120;
+        }
+
+        RawDexFile rawDexFile = new RawDexFile(dexFile.getOpcodes(), dexFile);
+        DexAnnotator annotator = new DexAnnotator(rawDexFile, consoleWidth);
+        annotator.writeAnnotations(writer);
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/HelpCommand.java b/baksmali/src/main/java/org/jf/baksmali/HelpCommand.java
new file mode 100644
index 0000000..149ac63
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/HelpCommand.java
@@ -0,0 +1,204 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import com.google.common.collect.Lists;
+import org.jf.util.ConsoleUtil;
+import org.jf.util.StringWrapper;
+import org.jf.util.jcommander.*;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+@Parameters(commandDescription = "Shows usage information")
+@ExtendedParameters(
+        commandName = "help",
+        commandAliases = "h")
+public class HelpCommand extends Command {
+
+    public HelpCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    @Parameter(description = "If specified, show the detailed usage information for the given commands")
+    @ExtendedParameter(argumentNames = "commands")
+    private List<String> commands = Lists.newArrayList();
+
+    public void run() {
+        JCommander parentJc = commandAncestors.get(commandAncestors.size() - 1);
+
+        if (commands == null || commands.isEmpty()) {
+            System.out.println(new HelpFormatter()
+                    .width(ConsoleUtil.getConsoleWidth())
+                    .format(commandAncestors));
+        } else {
+            boolean printedHelp = false;
+            for (String cmd : commands) {
+                if (cmd.equals("register-info")) {
+                    printedHelp = true;
+                    String registerInfoHelp = "The --register-info parameter will cause baksmali to generate " +
+                            "comments before and after every instruction containing register type " +
+                            "information about some subset of registers. This parameter accepts a comma-separated list" +
+                            "of values specifying which registers and how much information to include.\n" +
+                            "    ALL: all pre- and post-instruction registers\n" +
+                            "    ALLPRE: all pre-instruction registers\n" +
+                            "    ALLPOST: all post-instruction registers\n" +
+                            "    ARGS: any pre-instruction registers used as arguments to the instruction\n" +
+                            "    DEST: the post-instruction register used as the output of the instruction\n" +
+                            "    MERGE: any pre-instruction register that has been merged from multiple " +
+                            "incoming code paths\n" +
+                            "    FULLMERGE: an extended version of MERGE that also includes a list of all " +
+                            "the register types from incoming code paths that were merged";
+
+                    Iterable<String> lines = StringWrapper.wrapStringOnBreaks(registerInfoHelp,
+                            ConsoleUtil.getConsoleWidth());
+                    for (String line : lines) {
+                        System.out.println(line);
+                    }
+                } else if (cmd.equals("input")) {
+                    printedHelp = true;
+                    String registerInfoHelp = "Apks and oat files can contain multiple dex files. In order to " +
+                            "specify a particular dex file, the basic syntax is to treat the apk/oat file as a " +
+                            "directory. For example, to load the \"classes2.dex\" entry from \"app.apk\", you can " +
+                            "use \"app.apk/classes2.dex\".\n" +
+                            "\n" +
+                            "For ease of use, you can also specify a partial path to the dex file to load. For " +
+                            "example, to load a entry named \"/system/framework/framework.jar:classes2.dex\" from " +
+                            "\"framework.oat\", you can use any of the following:\n" +
+                            "\"framework.oat/classes2.dex\"\n" +
+                            "\"framework.oat/framework.jar:classes2.dex\"\n" +
+                            "\"framework.oat/framework/framework.jar:classes2.dex\"\n" +
+                            "\"framework.oat/system/framework/framework.jar:classes2.dex\"\n" +
+                            "\n" +
+                            "In some rare cases, an oat file could have entries that can't be differentiated with " +
+                            "the above syntax. For example \"/blah/blah.dex\" and \"blah/blah.dex\". In this case, " +
+                            "the \"blah.oat/blah/blah.dex\" would match both entries and generate an error. To get " +
+                            "around this, you can add double quotes around the entry name to specify an exact entry " +
+                            "name. E.g. blah.oat/\"/blah/blah.dex\" or blah.oat/\"blah/blah.dex\" respectively.";
+
+                    Iterable<String> lines = StringWrapper.wrapStringOnBreaks(registerInfoHelp,
+                            ConsoleUtil.getConsoleWidth());
+                    for (String line : lines) {
+                        System.out.println(line);
+                    }
+                } else if (cmd.equals("classpath")) {
+                    printedHelp = true;
+                    String registerInfoHelp = "When deodexing odex/oat files or when using the --register-info " +
+                            "option, baksmali needs to load all classes from the framework files on the device " +
+                            "in order to fully understand the class hierarchy. There are several options that " +
+                            "control how baksmali finds and loads the classpath entries.\n" +
+                            "\n"+
+                            "L+ devices (ART):\n" +
+                            "When deodexing or disassembling a file from an L+ device using ART, you generally " +
+                            "just need to specify the path to the boot.oat file via the --bootclasspath/-b " +
+                            "parameter. On pre-N devices, the boot.oat file is self-contained and no other files are " +
+                            "needed. In N, boot.oat was split into multiple files. In this case, the other " +
+                            "files should be in the same directory as the boot.oat file, but you still only need to " +
+                            "specify the boot.oat file in the --bootclasspath/-b option. The other files will be " +
+                            "automatically loaded from the same directory.\n" +
+                            "\n" +
+                            "Pre-L devices (dalvik):\n" +
+                            "When deodexing odex files from a pre-L device using dalvik, you " +
+                            "generally just need to specify the path to a directory containing the framework files " +
+                            "from the device via the --classpath-dir/-d option. odex files contain a list of " +
+                            "framework files they depend on and baksmali will search for these dependencies in the " +
+                            "directory that you specify.\n" +
+                            "\n" +
+                            "Dex files don't contain a list of dependencies like odex files, so when disassembling a " +
+                            "dex file using the --register-info option, and using the framework files from a " +
+                            "pre-L device, baksmali will attempt to use a reasonable default list of classpath files " +
+                            "based on the api level set via the -a option. If this default list is incorrect, you " +
+                            "can override the classpath using the --bootclasspath/-b option. This option accepts a " +
+                            "colon separated list of classpath entries. Each entry can be specified in a few " +
+                            "different ways.\n" +
+                            " - A simple filename like \"framework.jar\"\n" +
+                            " - A device path like \"/system/framework/framework.jar\"\n" +
+                            " - A local relative or absolute path like \"/tmp/framework/framework.jar\"\n" +
+                            "When using the first or second formats, you should also specify the directory " +
+                            "containing the framework files via the --classpath-dir/-d option. When using the third " +
+                            "format, this option is not needed.\n" +
+                            "It's worth noting that the second format matches the format used by Android for the " +
+                            "BOOTCLASSPATH environment variable, so you can simply grab the value of that variable " +
+                            "from the device and use it as-is.\n" +
+                            "\n" +
+                            "Examples:\n" +
+                            "  For an M device:\n" +
+                            "    adb pull /system/framework/arm/boot.oat /tmp/boot.oat\n" +
+                            "    baksmali deodex blah.oat -b /tmp/boot.oat\n" +
+                            "  For an N+ device:\n" +
+                            "    adb pull /system/framework/arm /tmp/framework\n" +
+                            "    baksmali deodex blah.oat -b /tmp/framework/boot.oat\n" +
+                            "  For a pre-L device:\n" +
+                            "    adb pull /system/framework /tmp/framework\n" +
+                            "    baksmali deodex blah.odex -d /tmp/framework\n" +
+                            "  Using the BOOTCLASSPATH on a pre-L device:\n" +
+                            "    adb pull /system/framework /tmp/framework\n" +
+                            "    export BOOTCLASSPATH=`adb shell \"echo \\\\$BOOTCLASPATH\"`\n" +
+                            "    baksmali disassemble --register-info ARGS,DEST blah.apk -b $BOOTCLASSPATH -d " +
+                            "/tmp/framework";
+
+                    Iterable<String> lines = StringWrapper.wrapStringOnBreaks(registerInfoHelp,
+                            ConsoleUtil.getConsoleWidth());
+                    for (String line : lines) {
+                        System.out.println(line);
+                    }
+                } else {
+                    JCommander command = ExtendedCommands.getSubcommand(parentJc, cmd);
+                    if (command == null) {
+                        System.err.println("No such command: " + cmd);
+                    } else {
+                        printedHelp = true;
+                        System.out.println(new HelpFormatter()
+                                .width(ConsoleUtil.getConsoleWidth())
+                                .format(((Command)command.getObjects().get(0)).getCommandHierarchy()));
+                    }
+                }
+            }
+            if (!printedHelp) {
+                System.out.println(new HelpFormatter()
+                        .width(ConsoleUtil.getConsoleWidth())
+                        .format(commandAncestors));
+            }
+        }
+    }
+
+    @Parameters(hidden =  true)
+    @ExtendedParameters(commandName = "hlep")
+    public static class HlepCommand extends HelpCommand {
+        public HlepCommand(@Nonnull List<JCommander> commandAncestors) {
+            super(commandAncestors);
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListClassesCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListClassesCommand.java
new file mode 100644
index 0000000..fb172bd
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListClassesCommand.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+@Parameters(commandDescription = "Lists the classes in a dex file.")
+@ExtendedParameters(
+        commandName = "classes",
+        commandAliases = { "class", "c" })
+public class ListClassesCommand extends DexInputCommand {
+
+    @Parameter(names = {"-h", "-?", "--help"}, help = true,
+            description = "Show usage information")
+    private boolean help;
+
+    public ListClassesCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    @Override public void run() {
+        if (help || inputList == null || inputList.isEmpty()) {
+            usage();
+            return;
+        }
+
+        if (inputList.size() > 1) {
+            System.err.println("Too many files specified");
+            usage();
+            return;
+        }
+
+        String input = inputList.get(0);
+        loadDexFile(input);
+
+        for (ClassDef classDef: dexFile.getClasses()) {
+            System.out.println(classDef.getType());
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListCommand.java
new file mode 100644
index 0000000..9547620
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListCommand.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import org.jf.baksmali.ListHelpCommand.ListHlepCommand;
+import org.jf.util.jcommander.Command;
+import org.jf.util.jcommander.ExtendedCommands;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+@Parameters(commandDescription = "Lists various objects in a dex file.")
+@ExtendedParameters(
+        commandName = "list",
+        commandAliases = "l")
+public class ListCommand extends Command {
+
+    @Parameter(names = {"-h", "-?", "--help"}, help = true,
+            description = "Show usage information")
+    private boolean help;
+
+    public ListCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    @Override protected void setupCommand(JCommander jc) {
+        List<JCommander> hierarchy = getCommandHierarchy();
+
+        ExtendedCommands.addExtendedCommand(jc, new ListStringsCommand(hierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new ListMethodsCommand(hierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new ListFieldsCommand(hierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new ListTypesCommand(hierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new ListClassesCommand(hierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new ListDexCommand(hierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new ListVtablesCommand(hierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new ListFieldOffsetsCommand(hierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new ListDependenciesCommand(hierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new ListHelpCommand(hierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new ListHlepCommand(hierarchy));
+    }
+
+    @Override public void run() {
+        JCommander jc = getJCommander();
+        if (help || jc.getParsedCommand() == null) {
+            usage();
+            return;
+        }
+
+        Command command = (Command)jc.getCommands().get(jc.getParsedCommand()).getObjects().get(0);
+        command.run();
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListDependenciesCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListDependenciesCommand.java
new file mode 100644
index 0000000..636a87c
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListDependenciesCommand.java
@@ -0,0 +1,118 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexBackedOdexFile;
+import org.jf.dexlib2.dexbacked.OatFile;
+import org.jf.util.jcommander.Command;
+import org.jf.util.jcommander.ExtendedParameter;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.io.*;
+import java.util.List;
+
+@Parameters(commandDescription = "Lists the stored dependencies in an odex/oat file.")
+@ExtendedParameters(
+        commandName = "dependencies",
+        commandAliases = { "deps", "dep" })
+public class ListDependenciesCommand extends Command {
+
+    @Parameter(names = {"-h", "-?", "--help"}, help = true,
+            description = "Show usage information")
+    private boolean help;
+
+    @Parameter(description = "An oat/odex file")
+    @ExtendedParameter(argumentNames = "file")
+    private List<String> inputList = Lists.newArrayList();
+
+    public ListDependenciesCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    @Override public void run() {
+        if (help || inputList == null || inputList.isEmpty()) {
+            usage();
+            return;
+        }
+
+        if (inputList.size() > 1) {
+            System.err.println("Too many files specified");
+            usage();
+            return;
+        }
+
+        String input = inputList.get(0);
+        InputStream inputStream = null;
+        try {
+            inputStream = new BufferedInputStream(new FileInputStream(input));
+        } catch (FileNotFoundException ex) {
+            System.err.println("Could not find file: " + input);
+            System.exit(-1);
+        }
+
+        try {
+            OatFile oatFile = OatFile.fromInputStream(inputStream);
+            for (String entry: oatFile.getBootClassPath()) {
+                System.out.println(entry);
+            }
+            return;
+        } catch (OatFile.NotAnOatFileException ex) {
+            // ignore
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+
+        try {
+            DexBackedOdexFile odexFile = DexBackedOdexFile.fromInputStream(Opcodes.getDefault(), inputStream);
+            for (String entry: odexFile.getDependencies()) {
+                System.out.println(entry);
+            }
+            return;
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        } catch (DexBackedOdexFile.NotAnOdexFile ex) {
+            // handled below
+        } catch (DexBackedDexFile.NotADexFile ex) {
+            // handled below
+        }
+
+        System.err.println(input + " is not an odex or oat file.");
+        System.exit(-1);
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListDexCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListDexCommand.java
new file mode 100644
index 0000000..d5862eb
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListDexCommand.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.DexFileFactory;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.iface.MultiDexContainer;
+import org.jf.util.jcommander.Command;
+import org.jf.util.jcommander.ExtendedParameter;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+@Parameters(commandDescription = "Lists the dex files in an apk/oat file.")
+@ExtendedParameters(
+        commandName = "dex",
+        commandAliases = "d")
+public class ListDexCommand extends Command {
+
+    @Parameter(names = {"-h", "-?", "--help"}, help = true,
+            description = "Show usage information")
+    private boolean help;
+
+    @Parameter(description = "An apk or oat file.")
+    @ExtendedParameter(argumentNames = "file")
+    private List<String> inputList = Lists.newArrayList();
+
+    public ListDexCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    @Override public void run() {
+        if (help || inputList == null || inputList.isEmpty()) {
+            usage();
+            return;
+        }
+
+        if (inputList.size() > 1) {
+            System.err.println("Too many files specified");
+            usage();
+            return;
+        }
+
+        String input = inputList.get(0);
+        File file = new File(input);
+
+        if (!file.exists()) {
+            System.err.println(String.format("Could not find the file: %s", input));
+            System.exit(-1);
+        }
+
+        List<String> entries;
+        try {
+            MultiDexContainer<? extends DexBackedDexFile> container =
+                    DexFileFactory.loadDexContainer(file, Opcodes.getDefault());
+            entries = container.getDexEntryNames();
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+
+        for (String entry: entries) {
+            System.out.println(entry);
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListFieldOffsetsCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListFieldOffsetsCommand.java
new file mode 100644
index 0000000..d6dd6e2
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListFieldOffsetsCommand.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import com.beust.jcommander.ParametersDelegate;
+import org.jf.dexlib2.analysis.ClassProto;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.util.SparseArray;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.util.List;
+
+@Parameters(commandDescription = "Lists the instance field offsets for classes in a dex file.")
+@ExtendedParameters(
+        commandName = "fieldoffsets",
+        commandAliases = { "fieldoffset", "fo" })
+public class ListFieldOffsetsCommand extends DexInputCommand {
+
+    @Parameter(names = {"-h", "-?", "--help"}, help = true,
+            description = "Show usage information")
+    private boolean help;
+
+    @ParametersDelegate
+    private AnalysisArguments analysisArguments = new AnalysisArguments();
+
+    public ListFieldOffsetsCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    @Override public void run() {
+        if (help || inputList == null || inputList.isEmpty()) {
+            usage();
+            return;
+        }
+
+        if (inputList.size() > 1) {
+            System.err.println("Too many files specified");
+            usage();
+            return;
+        }
+
+        String input = inputList.get(0);
+        loadDexFile(input);
+        BaksmaliOptions options = getOptions();
+
+        try {
+            for (ClassDef classDef: dexFile.getClasses()) {
+                ClassProto classProto = (ClassProto) options.classPath.getClass(classDef);
+                SparseArray<FieldReference> fields = classProto.getInstanceFields();
+                String className = "Class "  + classDef.getType() + " : " + fields.size() + " instance fields\n";
+                System.out.write(className.getBytes());
+                for (int i=0;i<fields.size();i++) {
+                    String field = fields.keyAt(i) + ":" + fields.valueAt(i).getType() + " " + fields.valueAt(i).getName() + "\n";
+                    System.out.write(field.getBytes());
+                }
+                System.out.write("\n".getBytes());
+            }
+            System.out.close();
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    @Nonnull
+    private BaksmaliOptions getOptions() {
+        if (dexFile == null) {
+            throw new IllegalStateException("You must call loadDexFile first");
+        }
+
+        final BaksmaliOptions options = new BaksmaliOptions();
+
+        options.apiLevel = apiLevel;
+
+        try {
+            options.classPath = analysisArguments.loadClassPathForDexFile(
+                    inputFile.getAbsoluteFile().getParentFile(), dexFile, false);
+        } catch (Exception ex) {
+            System.err.println("Error occurred while loading class path files.");
+            ex.printStackTrace(System.err);
+            System.exit(-1);
+        }
+
+        return options;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListFieldsCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListFieldsCommand.java
new file mode 100644
index 0000000..c4d090d
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListFieldsCommand.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameters;
+import org.jf.dexlib2.ReferenceType;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+@Parameters(commandDescription = "Lists the fields in a dex file's field table.")
+@ExtendedParameters(
+        commandName = "fields",
+        commandAliases = { "field", "f" })
+public class ListFieldsCommand extends ListReferencesCommand {
+    public ListFieldsCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors, ReferenceType.FIELD);
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListHelpCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListHelpCommand.java
new file mode 100644
index 0000000..2e64286
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListHelpCommand.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import com.google.common.collect.Iterables;
+import org.jf.util.ConsoleUtil;
+import org.jf.util.jcommander.*;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+@Parameters(commandDescription = "Shows usage information")
+@ExtendedParameters(
+        commandName = "help",
+        commandAliases = "h")
+public class ListHelpCommand extends Command {
+
+    @Parameter(description = "If specified, show the detailed usage information for the given commands")
+    @ExtendedParameter(argumentNames = "commands")
+    private List<String> commands;
+
+    public ListHelpCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    public void run() {
+        if (commands == null || commands.isEmpty()) {
+            System.out.println(new HelpFormatter()
+                    .width(ConsoleUtil.getConsoleWidth())
+                    .format(commandAncestors));
+        } else {
+            boolean printedHelp = false;
+            JCommander parentJc = Iterables.getLast(commandAncestors);
+            for (String cmd : commands) {
+                JCommander command = ExtendedCommands.getSubcommand(parentJc, cmd);
+                if (command == null) {
+                    System.err.println("No such command: " + cmd);
+                } else {
+                    printedHelp = true;
+                    System.out.println(new HelpFormatter()
+                            .width(ConsoleUtil.getConsoleWidth())
+                            .format(((Command)command.getObjects().get(0)).getCommandHierarchy()));
+                }
+            }
+            if (!printedHelp) {
+                System.out.println(new HelpFormatter()
+                        .width(ConsoleUtil.getConsoleWidth())
+                        .format(commandAncestors));
+            }
+        }
+    }
+
+    @Parameters(hidden =  true)
+    @ExtendedParameters(commandName = "hlep")
+    public static class ListHlepCommand extends ListHelpCommand {
+        public ListHlepCommand(@Nonnull List<JCommander> commandAncestors) {
+            super(commandAncestors);
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListMethodsCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListMethodsCommand.java
new file mode 100644
index 0000000..603e764
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListMethodsCommand.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameters;
+import org.jf.dexlib2.ReferenceType;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+@Parameters(commandDescription = "Lists the methods in a dex file's method table.")
+@ExtendedParameters(
+        commandName = "methods",
+        commandAliases = { "method", "m" })
+public class ListMethodsCommand extends ListReferencesCommand {
+    public ListMethodsCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors, ReferenceType.METHOD);
+    }
+}
\ No newline at end of file
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListReferencesCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListReferencesCommand.java
new file mode 100644
index 0000000..da9c3e3
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListReferencesCommand.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.util.ReferenceUtil;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public abstract class ListReferencesCommand extends DexInputCommand {
+
+    private final int referenceType;
+
+    @Parameter(names = {"-h", "-?", "--help"}, help = true,
+            description = "Show usage information")
+    private boolean help;
+
+    public ListReferencesCommand(@Nonnull List<JCommander> commandAncestors, int referenceType) {
+        super(commandAncestors);
+        this.referenceType = referenceType;
+    }
+
+    @Override public void run() {
+        if (help || inputList == null || inputList.isEmpty()) {
+            usage();
+            return;
+        }
+
+        if (inputList.size() > 1) {
+            System.err.println("Too many files specified");
+            usage();
+            return;
+        }
+
+        String input = inputList.get(0);
+        loadDexFile(input);
+
+        for (Reference reference: dexFile.getReferences(referenceType)) {
+            System.out.println(ReferenceUtil.getReferenceString(reference));
+        }
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListStringsCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListStringsCommand.java
new file mode 100644
index 0000000..8694f91
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListStringsCommand.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameters;
+import org.jf.dexlib2.ReferenceType;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+@Parameters(commandDescription = "Lists the strings in a dex file's string table.")
+@ExtendedParameters(
+        commandName = "strings",
+        commandAliases = { "string", "str", "s" })
+public class ListStringsCommand extends ListReferencesCommand {
+    public ListStringsCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors, ReferenceType.STRING);
+    }
+}
\ No newline at end of file
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListTypesCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListTypesCommand.java
new file mode 100644
index 0000000..fbff2f2
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListTypesCommand.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameters;
+import org.jf.dexlib2.ReferenceType;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+@Parameters(commandDescription = "Lists the type ids in a dex file's type table.")
+@ExtendedParameters(
+        commandName = "types",
+        commandAliases = { "type", "t" })
+public class ListTypesCommand extends ListReferencesCommand {
+    public ListTypesCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors, ReferenceType.TYPE);
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/ListVtablesCommand.java b/baksmali/src/main/java/org/jf/baksmali/ListVtablesCommand.java
new file mode 100644
index 0000000..74435b3
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/ListVtablesCommand.java
@@ -0,0 +1,157 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import com.beust.jcommander.ParametersDelegate;
+import org.jf.baksmali.AnalysisArguments.CheckPackagePrivateArgument;
+import org.jf.dexlib2.AccessFlags;
+import org.jf.dexlib2.analysis.ClassProto;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.Method;
+import org.jf.util.jcommander.ExtendedParameter;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.util.List;
+
+@Parameters(commandDescription = "Lists the virtual method tables for classes in a dex file.")
+@ExtendedParameters(
+        commandName = "vtables",
+        commandAliases = { "vtable", "v" })
+public class ListVtablesCommand extends DexInputCommand {
+
+    @Parameter(names = {"-h", "-?", "--help"}, help = true,
+            description = "Show usage information")
+    private boolean help;
+
+    @ParametersDelegate
+    private AnalysisArguments analysisArguments = new AnalysisArguments();
+
+    @ParametersDelegate
+    private CheckPackagePrivateArgument checkPackagePrivateArgument = new CheckPackagePrivateArgument();
+
+    @Parameter(names = "--classes",
+            description = "A comma separated list of classes. Only print the vtable for these classes")
+    @ExtendedParameter(argumentNames = "classes")
+    private List<String> classes = null;
+
+    @Parameter(names = "--override-oat-version",
+            description = "Uses a classpath for the given oat version, regardless of the actual oat version. This " +
+                    "can be used, e.g. to list vtables from a dex file, as if they were in an oat file of the given " +
+                    "version.")
+    private int oatVersion = 0;
+
+    public ListVtablesCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    @Override public void run() {
+        if (help || inputList == null || inputList.isEmpty()) {
+            usage();
+            return;
+        }
+
+        if (inputList.size() > 1) {
+            System.err.println("Too many files specified");
+            usage();
+            return;
+        }
+
+        String input = inputList.get(0);
+        loadDexFile(input);
+
+        BaksmaliOptions options = getOptions();
+        if (options == null) {
+            return;
+        }
+
+        try {
+            if (classes != null && !classes.isEmpty()) {
+                for (String cls: classes) {
+                    listClassVtable((ClassProto)options.classPath.getClass(cls));
+                }
+                return;
+            }
+
+            for (ClassDef classDef : dexFile.getClasses()) {
+                if (!AccessFlags.INTERFACE.isSet(classDef.getAccessFlags())) {
+                    listClassVtable((ClassProto)options.classPath.getClass(classDef));
+                }
+            }
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    private void listClassVtable(ClassProto classProto) throws IOException {
+        List<Method> methods = classProto.getVtable();
+        String className = "Class " + classProto.getType() + " extends " + classProto.getSuperclass() +
+                " : " + methods.size() + " methods\n";
+        System.out.write(className.getBytes());
+        for (int i = 0; i < methods.size(); i++) {
+            Method method = methods.get(i);
+
+            String methodString = i + ":" + method.getDefiningClass() + "->" + method.getName() + "(";
+            for (CharSequence parameter : method.getParameterTypes()) {
+                methodString += parameter;
+            }
+            methodString += ")" + method.getReturnType() + "\n";
+            System.out.write(methodString.getBytes());
+        }
+        System.out.write("\n".getBytes());
+    }
+
+    protected BaksmaliOptions getOptions() {
+        if (dexFile == null) {
+            throw new IllegalStateException("You must call loadDexFile first");
+        }
+
+        final BaksmaliOptions options = new BaksmaliOptions();
+
+        options.apiLevel = apiLevel;
+
+        try {
+            options.classPath = analysisArguments.loadClassPathForDexFile(inputFile.getAbsoluteFile().getParentFile(),
+                    dexFile, checkPackagePrivateArgument.checkPackagePrivateAccess, oatVersion);
+        } catch (Exception ex) {
+            System.err.println("Error occurred while loading class path files.");
+            ex.printStackTrace(System.err);
+            return null;
+        }
+
+        return options;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/Main.java b/baksmali/src/main/java/org/jf/baksmali/Main.java
new file mode 100644
index 0000000..66d9b4f
--- /dev/null
+++ b/baksmali/src/main/java/org/jf/baksmali/Main.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.baksmali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.google.common.collect.Lists;
+import org.jf.baksmali.HelpCommand.HlepCommand;
+import org.jf.util.jcommander.Command;
+import org.jf.util.jcommander.ExtendedCommands;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Properties;
+
+@ExtendedParameters(
+        includeParametersInUsage = true,
+        commandName = "baksmali",
+        postfixDescription = "See baksmali help <command> for more information about a specific command")
+public class Main extends Command {
+    public static final String VERSION = loadVersion();
+
+    @Parameter(names = {"--help", "-h", "-?"}, help = true,
+            description = "Show usage information")
+    private boolean help;
+
+    @Parameter(names = {"--version", "-v"}, help = true,
+            description = "Print the version of baksmali and then exit")
+    public boolean version;
+
+    private JCommander jc;
+
+    public Main() {
+        super(Lists.<JCommander>newArrayList());
+    }
+
+    @Override public void run() {
+    }
+
+    @Override protected JCommander getJCommander() {
+        return jc;
+    }
+
+    public static void main(String[] args) {
+        Main main = new Main();
+
+        JCommander jc = new JCommander(main);
+        main.jc = jc;
+        jc.setProgramName("baksmali");
+        List<JCommander> commandHierarchy = main.getCommandHierarchy();
+
+        ExtendedCommands.addExtendedCommand(jc, new DisassembleCommand(commandHierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new DeodexCommand(commandHierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new DumpCommand(commandHierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new HelpCommand(commandHierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new HlepCommand(commandHierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new ListCommand(commandHierarchy));
+
+        jc.parse(args);
+
+        if (main.version) {
+            version();
+        }
+
+        if (jc.getParsedCommand() == null || main.help) {
+            main.usage();
+            return;
+        }
+
+        Command command = (Command)jc.getCommands().get(jc.getParsedCommand()).getObjects().get(0);
+        command.run();
+    }
+
+    protected static void version() {
+        System.out.println("baksmali " + VERSION + " (http://smali.org)");
+        System.out.println("Copyright (C) 2010 Ben Gruver (JesusFreke@JesusFreke.com)");
+        System.out.println("BSD license (http://www.opensource.org/licenses/bsd-license.php)");
+        System.exit(0);
+    }
+
+    private static String loadVersion() {
+        InputStream propertiesStream = Baksmali.class.getClassLoader().getResourceAsStream("baksmali.properties");
+        String version = "[unknown version]";
+        if (propertiesStream != null) {
+            Properties properties = new Properties();
+            try {
+                properties.load(propertiesStream);
+                version = properties.getProperty("application.version");
+            } catch (IOException ex) {
+                // ignore
+            }
+        }
+        return version;
+    }
+}
diff --git a/baksmali/src/main/java/org/jf/baksmali/baksmaliOptions.java b/baksmali/src/main/java/org/jf/baksmali/baksmaliOptions.java
deleted file mode 100644
index 32685dd..0000000
--- a/baksmali/src/main/java/org/jf/baksmali/baksmaliOptions.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright 2013, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package org.jf.baksmali;
-
-import com.google.common.collect.Lists;
-import org.jf.dexlib2.analysis.ClassPath;
-import org.jf.dexlib2.analysis.InlineMethodResolver;
-import org.jf.dexlib2.util.SyntheticAccessorResolver;
-
-import javax.annotation.Nullable;
-import java.io.File;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class baksmaliOptions {
-    // register info values
-    public static final int ALL = 1;
-    public static final int ALLPRE = 2;
-    public static final int ALLPOST = 4;
-    public static final int ARGS = 8;
-    public static final int DEST = 16;
-    public static final int MERGE = 32;
-    public static final int FULLMERGE = 64;
-
-    public int apiLevel = 15;
-    public String outputDirectory = "out";
-    @Nullable public String dexEntry = null;
-    public List<String> bootClassPathDirs = Lists.newArrayList();
-
-    public List<String> bootClassPathEntries = Lists.newArrayList();
-    public List<String> extraClassPathEntries = Lists.newArrayList();
-
-    public Map<String,String> resourceIdFileEntries = new HashMap<String,String>();
-    public Map<Integer,String> resourceIds = new HashMap<Integer,String>();
-
-    public boolean noParameterRegisters = false;
-    public boolean useLocalsDirective = false;
-    public boolean useSequentialLabels = false;
-    public boolean outputDebugInfo = true;
-    public boolean addCodeOffsets = false;
-    public boolean noAccessorComments = false;
-    public boolean allowOdex = false;
-    public boolean deodex = false;
-    public boolean experimental = false;
-    public boolean ignoreErrors = false;
-    public boolean checkPackagePrivateAccess = false;
-    public boolean useImplicitReferences = false;
-    public boolean normalizeVirtualMethods = false;
-    public File customInlineDefinitions = null;
-    public InlineMethodResolver inlineResolver = null;
-    public int registerInfo = 0;
-    public ClassPath classPath = null;
-    public int jobs = Runtime.getRuntime().availableProcessors();
-    public boolean disassemble = true;
-    public boolean dump = false;
-    public String dumpFileName = null;
-
-    public SyntheticAccessorResolver syntheticAccessorResolver = null;
-
-    public void setBootClassPath(String bootClassPath) {
-        bootClassPathEntries = Lists.newArrayList(bootClassPath.split(":"));
-    }
-
-    public void addExtraClassPath(String extraClassPath) {
-        if (extraClassPath.startsWith(":")) {
-            extraClassPath = extraClassPath.substring(1);
-        }
-        extraClassPathEntries.addAll(Arrays.asList(extraClassPath.split(":")));
-    }
-
-    public void setResourceIdFiles(String resourceIdFiles) {
-        for (String resourceIdFile: resourceIdFiles.split(":")) {
-            String[] entry = resourceIdFile.split("=");
-            resourceIdFileEntries.put(entry[1], entry[0]);
-        }
-    }
-}
diff --git a/baksmali/src/main/java/org/jf/baksmali/dump.java b/baksmali/src/main/java/org/jf/baksmali/dump.java
deleted file mode 100644
index 79405e5..0000000
--- a/baksmali/src/main/java/org/jf/baksmali/dump.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * [The "BSD licence"]
- * Copyright (c) 2010 Ben Gruver (JesusFreke)
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package org.jf.baksmali;
-
-import org.jf.dexlib2.Opcodes;
-import org.jf.dexlib2.dexbacked.DexBackedDexFile;
-import org.jf.dexlib2.dexbacked.raw.RawDexFile;
-import org.jf.dexlib2.dexbacked.raw.util.DexAnnotator;
-import org.jf.util.ConsoleUtil;
-
-import java.io.BufferedWriter;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.Writer;
-
-public class dump {
-    public static void dump(DexBackedDexFile dexFile, String dumpFileName, int apiLevel) throws IOException {
-        if (dumpFileName != null) {
-            Writer writer = null;
-
-            try {
-                writer = new BufferedWriter(new FileWriter(dumpFileName));
-
-                int consoleWidth = ConsoleUtil.getConsoleWidth();
-                if (consoleWidth <= 0) {
-                    consoleWidth = 120;
-                }
-
-                RawDexFile rawDexFile = new RawDexFile(Opcodes.forApi(apiLevel), dexFile);
-                DexAnnotator annotator = new DexAnnotator(rawDexFile, consoleWidth);
-                annotator.writeAnnotations(writer);
-            } catch (IOException ex) {
-                System.err.println("There was an error while dumping the dex file to " + dumpFileName);
-                ex.printStackTrace(System.err);
-            } finally {
-                if (writer != null) {
-                    try {
-                        writer.close();
-                    } catch (IOException ex) {
-                        System.err.println("There was an error while closing the dump file " + dumpFileName);
-                        ex.printStackTrace(System.err);
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/baksmali/src/main/java/org/jf/baksmali/main.java b/baksmali/src/main/java/org/jf/baksmali/main.java
deleted file mode 100644
index 86f43d8..0000000
--- a/baksmali/src/main/java/org/jf/baksmali/main.java
+++ /dev/null
@@ -1,626 +0,0 @@
-/*
- * [The "BSD licence"]
- * Copyright (c) 2010 Ben Gruver (JesusFreke)
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package org.jf.baksmali;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.cli.*;
-import org.jf.dexlib2.DexFileFactory;
-import org.jf.dexlib2.DexFileFactory.MultipleDexFilesException;
-import org.jf.dexlib2.analysis.InlineMethodResolver;
-import org.jf.dexlib2.dexbacked.DexBackedDexFile;
-import org.jf.dexlib2.dexbacked.DexBackedOdexFile;
-import org.jf.dexlib2.dexbacked.OatFile.OatDexFile;
-import org.jf.dexlib2.iface.DexFile;
-import org.jf.util.ConsoleUtil;
-import org.jf.util.SmaliHelpFormatter;
-
-import javax.annotation.Nonnull;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.List;
-import java.util.Locale;
-import java.util.Properties;
-
-public class main {
-
-    public static final String VERSION;
-
-    private static final Options basicOptions;
-    private static final Options debugOptions;
-    private static final Options options;
-
-    static {
-        options = new Options();
-        basicOptions = new Options();
-        debugOptions = new Options();
-        buildOptions();
-
-        InputStream templateStream = baksmali.class.getClassLoader().getResourceAsStream("baksmali.properties");
-        if (templateStream != null) {
-            Properties properties = new Properties();
-            String version = "(unknown)";
-            try {
-                properties.load(templateStream);
-                version = properties.getProperty("application.version");
-            } catch (IOException ex) {
-                // ignore
-            }
-            VERSION = version;
-        } else {
-            VERSION = "[unknown version]";
-        }
-    }
-
-    /**
-     * This class is uninstantiable.
-     */
-    private main() {
-    }
-
-    /**
-     * A more programmatic-friendly entry point for baksmali
-     *
-     * @param options a baksmaliOptions object with the options to run baksmali with
-     * @param inputDexFile The DexFile to disassemble
-     * @return true if disassembly completed with no errors, or false if errors were encountered
-     */
-    public static boolean run(@Nonnull baksmaliOptions options, @Nonnull DexFile inputDexFile) throws IOException {
-        if (options.bootClassPathEntries.isEmpty() &&
-                (options.deodex || options.registerInfo != 0 || options.normalizeVirtualMethods)) {
-            if (inputDexFile instanceof DexBackedOdexFile) {
-                options.bootClassPathEntries = ((DexBackedOdexFile)inputDexFile).getDependencies();
-            } else {
-                options.bootClassPathEntries = getDefaultBootClassPathForApi(options.apiLevel,
-                        options.experimental);
-            }
-        }
-
-        if (options.customInlineDefinitions == null && inputDexFile instanceof DexBackedOdexFile) {
-            options.inlineResolver =
-                    InlineMethodResolver.createInlineMethodResolver(
-                            ((DexBackedOdexFile)inputDexFile).getOdexVersion());
-        }
-
-        boolean errorOccurred = false;
-        if (options.disassemble) {
-            errorOccurred = !baksmali.disassembleDexFile(inputDexFile, options);
-        }
-
-        if (options.dump) {
-            if (!(inputDexFile instanceof DexBackedDexFile)) {
-                throw new IllegalArgumentException("Annotated hex-dumps require a DexBackedDexFile");
-            }
-            dump.dump((DexBackedDexFile)inputDexFile, options.dumpFileName, options.apiLevel);
-        }
-
-        return !errorOccurred;
-    }
-
-    /**
-     * Run!
-     */
-    public static void main(String[] args) throws IOException {
-        Locale locale = new Locale("en", "US");
-        Locale.setDefault(locale);
-
-        CommandLineParser parser = new PosixParser();
-        CommandLine commandLine;
-
-        try {
-            commandLine = parser.parse(options, args);
-        } catch (ParseException ex) {
-            usage();
-            return;
-        }
-
-        baksmaliOptions options = new baksmaliOptions();
-
-        String[] remainingArgs = commandLine.getArgs();
-        Option[] clOptions = commandLine.getOptions();
-
-        for (int i=0; i<clOptions.length; i++) {
-            Option option = clOptions[i];
-            String opt = option.getOpt();
-
-            switch (opt.charAt(0)) {
-                case 'v':
-                    version();
-                    return;
-                case '?':
-                    while (++i < clOptions.length) {
-                        if (clOptions[i].getOpt().charAt(0) == '?') {
-                            usage(true);
-                            return;
-                        }
-                    }
-                    usage(false);
-                    return;
-                case 'o':
-                    options.outputDirectory = commandLine.getOptionValue("o");
-                    break;
-                case 'p':
-                    options.noParameterRegisters = true;
-                    break;
-                case 'l':
-                    options.useLocalsDirective = true;
-                    break;
-                case 's':
-                    options.useSequentialLabels = true;
-                    break;
-                case 'b':
-                    options.outputDebugInfo = false;
-                    break;
-                case 'd':
-                    options.bootClassPathDirs.add(option.getValue());
-                    break;
-                case 'f':
-                    options.addCodeOffsets = true;
-                    break;
-                case 'r':
-                    String[] values = commandLine.getOptionValues('r');
-                    int registerInfo = 0;
-
-                    if (values == null || values.length == 0) {
-                        registerInfo = baksmaliOptions.ARGS | baksmaliOptions.DEST;
-                    } else {
-                        for (String value: values) {
-                            if (value.equalsIgnoreCase("ALL")) {
-                                registerInfo |= baksmaliOptions.ALL;
-                            } else if (value.equalsIgnoreCase("ALLPRE")) {
-                                registerInfo |= baksmaliOptions.ALLPRE;
-                            } else if (value.equalsIgnoreCase("ALLPOST")) {
-                                registerInfo |= baksmaliOptions.ALLPOST;
-                            } else if (value.equalsIgnoreCase("ARGS")) {
-                                registerInfo |= baksmaliOptions.ARGS;
-                            } else if (value.equalsIgnoreCase("DEST")) {
-                                registerInfo |= baksmaliOptions.DEST;
-                            } else if (value.equalsIgnoreCase("MERGE")) {
-                                registerInfo |= baksmaliOptions.MERGE;
-                            } else if (value.equalsIgnoreCase("FULLMERGE")) {
-                                registerInfo |= baksmaliOptions.FULLMERGE;
-                            } else {
-                                usage();
-                                return;
-                            }
-                        }
-
-                        if ((registerInfo & baksmaliOptions.FULLMERGE) != 0) {
-                            registerInfo &= ~baksmaliOptions.MERGE;
-                        }
-                    }
-                    options.registerInfo = registerInfo;
-                    break;
-                case 'c':
-                    String bcp = commandLine.getOptionValue("c");
-                    if (bcp != null && bcp.charAt(0) == ':') {
-                        options.addExtraClassPath(bcp);
-                    } else {
-                        options.setBootClassPath(bcp);
-                    }
-                    break;
-                case 'x':
-                    options.deodex = true;
-                    break;
-                case 'X':
-                    options.experimental = true;
-                    break;
-                case 'm':
-                    options.noAccessorComments = true;
-                    break;
-                case 'a':
-                    options.apiLevel = Integer.parseInt(commandLine.getOptionValue("a"));
-                    break;
-                case 'j':
-                    options.jobs = Integer.parseInt(commandLine.getOptionValue("j"));
-                    break;
-                case 'i':
-                    String rif = commandLine.getOptionValue("i");
-                    options.setResourceIdFiles(rif);
-                    break;
-                case 't':
-                    options.useImplicitReferences = true;
-                    break;
-                case 'e':
-                    options.dexEntry = commandLine.getOptionValue("e");
-                    break;
-                case 'k':
-                    options.checkPackagePrivateAccess = true;
-                    break;
-                case 'n':
-                    options.normalizeVirtualMethods = true;
-                    break;
-                case 'N':
-                    options.disassemble = false;
-                    break;
-                case 'D':
-                    options.dump = true;
-                    options.dumpFileName = commandLine.getOptionValue("D");
-                    break;
-                case 'I':
-                    options.ignoreErrors = true;
-                    break;
-                case 'T':
-                    options.customInlineDefinitions = new File(commandLine.getOptionValue("T"));
-                    break;
-                default:
-                    assert false;
-            }
-        }
-
-        if (remainingArgs.length != 1) {
-            usage();
-            return;
-        }
-
-        String inputDexPath = remainingArgs[0];
-        File dexFileFile = new File(inputDexPath);
-        if (!dexFileFile.exists()) {
-            System.err.println("Can't find the file " + inputDexPath);
-            System.exit(1);
-        }
-
-        //Read in and parse the dex file
-        DexBackedDexFile dexFile = null;
-        try {
-            dexFile = DexFileFactory.loadDexFile(dexFileFile, options.dexEntry, options.apiLevel, options.experimental);
-        } catch (MultipleDexFilesException ex) {
-            System.err.println(String.format("%s contains multiple dex files. You must specify which one to " +
-                    "disassemble with the -e option", dexFileFile.getName()));
-            System.err.println("Valid entries include:");
-
-            for (OatDexFile oatDexFile: ex.oatFile.getDexFiles()) {
-                System.err.println(oatDexFile.filename);
-            }
-            System.exit(1);
-        }
-
-        if (dexFile.hasOdexOpcodes()) {
-            if (!options.deodex) {
-                System.err.println("Warning: You are disassembling an odex file without deodexing it. You");
-                System.err.println("won't be able to re-assemble the results unless you deodex it with the -x");
-                System.err.println("option");
-                options.allowOdex = true;
-            }
-        } else {
-            options.deodex = false;
-        }
-
-        if (options.dump) {
-            if (options.dumpFileName == null) {
-                options.dumpFileName =  inputDexPath + ".dump";
-            }
-        }
-
-        try {
-            if (!run(options, dexFile)) {
-                System.exit(1);
-            }
-        } catch (IllegalArgumentException ex) {
-            System.err.println(ex.getMessage());
-            System.exit(1);
-        }
-    }
-
-    /**
-     * Prints the usage message.
-     */
-    private static void usage(boolean printDebugOptions) {
-        SmaliHelpFormatter formatter = new SmaliHelpFormatter();
-        int consoleWidth = ConsoleUtil.getConsoleWidth();
-        if (consoleWidth <= 0) {
-            consoleWidth = 80;
-        }
-
-        formatter.setWidth(consoleWidth);
-
-        formatter.printHelp("java -jar baksmali.jar [options] <dex-file>",
-                "disassembles and/or dumps a dex file", basicOptions, printDebugOptions?debugOptions:null);
-    }
-
-    private static void usage() {
-        usage(false);
-    }
-
-    /**
-     * Prints the version message.
-     */
-    protected static void version() {
-        System.out.println("baksmali " + VERSION + " (http://smali.googlecode.com)");
-        System.out.println("Copyright (C) 2010 Ben Gruver (JesusFreke@JesusFreke.com)");
-        System.out.println("BSD license (http://www.opensource.org/licenses/bsd-license.php)");
-        System.exit(0);
-    }
-
-    @SuppressWarnings("AccessStaticViaInstance")
-    private static void buildOptions() {
-        Option versionOption = OptionBuilder.withLongOpt("version")
-                .withDescription("prints the version then exits")
-                .create("v");
-
-        Option helpOption = OptionBuilder.withLongOpt("help")
-                .withDescription("prints the help message then exits. Specify twice for debug options")
-                .create("?");
-
-        Option outputDirOption = OptionBuilder.withLongOpt("output")
-                .withDescription("the directory where the disassembled files will be placed. The default is out")
-                .hasArg()
-                .withArgName("DIR")
-                .create("o");
-
-        Option noParameterRegistersOption = OptionBuilder.withLongOpt("no-parameter-registers")
-                .withDescription("use the v<n> syntax instead of the p<n> syntax for registers mapped to method " +
-                        "parameters")
-                .create("p");
-
-        Option deodexerantOption = OptionBuilder.withLongOpt("deodex")
-                .withDescription("deodex the given odex file. This option is ignored if the input file is not an " +
-                        "odex file")
-                .create("x");
-
-        Option experimentalOption = OptionBuilder.withLongOpt("experimental")
-                .withDescription("enable experimental opcodes to be disassembled, even if they aren't necessarily supported in the Android runtime yet")
-                .create("X");
-
-        Option useLocalsOption = OptionBuilder.withLongOpt("use-locals")
-                .withDescription("output the .locals directive with the number of non-parameter registers, rather" +
-                        " than the .register directive with the total number of register")
-                .create("l");
-
-        Option sequentialLabelsOption = OptionBuilder.withLongOpt("sequential-labels")
-                .withDescription("create label names using a sequential numbering scheme per label type, rather than " +
-                        "using the bytecode address")
-                .create("s");
-
-        Option noDebugInfoOption = OptionBuilder.withLongOpt("no-debug-info")
-                .withDescription("don't write out debug info (.local, .param, .line, etc.)")
-                .create("b");
-
-        Option registerInfoOption = OptionBuilder.withLongOpt("register-info")
-                .hasOptionalArgs()
-                .withArgName("REGISTER_INFO_TYPES")
-                .withValueSeparator(',')
-                .withDescription("print the specificed type(s) of register information for each instruction. " +
-                        "\"ARGS,DEST\" is the default if no types are specified.\nValid values are:\nALL: all " +
-                        "pre- and post-instruction registers.\nALLPRE: all pre-instruction registers\nALLPOST: all " +
-                        "post-instruction registers\nARGS: any pre-instruction registers used as arguments to the " +
-                        "instruction\nDEST: the post-instruction destination register, if any\nMERGE: Any " +
-                        "pre-instruction register has been merged from more than 1 different post-instruction " +
-                        "register from its predecessors\nFULLMERGE: For each register that would be printed by " +
-                        "MERGE, also show the incoming register types that were merged")
-                .create("r");
-
-        Option classPathOption = OptionBuilder.withLongOpt("bootclasspath")
-                .withDescription("A colon-separated list of bootclasspath jar/oat files to use for analysis. Add an " +
-                        "initial colon to specify that the jars/oats should be appended to the default bootclasspath " +
-                        "instead of replacing it")
-                .hasOptionalArg()
-                .withArgName("BOOTCLASSPATH")
-                .create("c");
-
-        Option classPathDirOption = OptionBuilder.withLongOpt("bootclasspath-dir")
-                .withDescription("the base folder to look for the bootclasspath files in. Defaults to the current " +
-                        "directory")
-                .hasArg()
-                .withArgName("DIR")
-                .create("d");
-
-        Option codeOffsetOption = OptionBuilder.withLongOpt("code-offsets")
-                .withDescription("add comments to the disassembly containing the code offset for each address")
-                .create("f");
-
-        Option noAccessorCommentsOption = OptionBuilder.withLongOpt("no-accessor-comments")
-                .withDescription("don't output helper comments for synthetic accessors")
-                .create("m");
-
-        Option apiLevelOption = OptionBuilder.withLongOpt("api-level")
-                .withDescription("The numeric api-level of the file being disassembled. If not " +
-                        "specified, it defaults to 15 (ICS).")
-                .hasArg()
-                .withArgName("API_LEVEL")
-                .create("a");
-
-        Option jobsOption = OptionBuilder.withLongOpt("jobs")
-                .withDescription("The number of threads to use. Defaults to the number of cores available, up to a " +
-                        "maximum of 6")
-                .hasArg()
-                .withArgName("NUM_THREADS")
-                .create("j");
-
-        Option resourceIdFilesOption = OptionBuilder.withLongOpt("resource-id-files")
-                .withDescription("the resource ID files to use, for analysis. A colon-separated list of prefix=file " +
-                        "pairs.  For example R=res/values/public.xml:" +
-                        "android.R=$ANDROID_HOME/platforms/android-19/data/res/values/public.xml")
-                .hasArg()
-                .withArgName("FILES")
-                .create("i");
-
-        Option noImplicitReferencesOption = OptionBuilder.withLongOpt("implicit-references")
-                .withDescription("Use implicit (type-less) method and field references")
-                .create("t");
-
-        Option checkPackagePrivateAccessOption = OptionBuilder.withLongOpt("check-package-private-access")
-                .withDescription("When deodexing, use the package-private access check when calculating vtable " +
-                        "indexes. It should only be needed for 4.2.0 odexes. The functionality was reverted for " +
-                        "4.2.1.")
-                .create("k");
-
-        Option normalizeVirtualMethods = OptionBuilder.withLongOpt("normalize-virtual-methods")
-                .withDescription("Normalize virtual method references to the reference the base method.")
-                .create("n");
-
-        Option dumpOption = OptionBuilder.withLongOpt("dump-to")
-                .withDescription("dumps the given dex file into a single annotated dump file named FILE" +
-                        " (<dexfile>.dump by default), along with the normal disassembly")
-                .hasOptionalArg()
-                .withArgName("FILE")
-                .create("D");
-
-        Option ignoreErrorsOption = OptionBuilder.withLongOpt("ignore-errors")
-                .withDescription("ignores any non-fatal errors that occur while disassembling/deodexing," +
-                        " ignoring the class if needed, and continuing with the next class. The default" +
-                        " behavior is to stop disassembling and exit once an error is encountered")
-                .create("I");
-
-        Option noDisassemblyOption = OptionBuilder.withLongOpt("no-disassembly")
-                .withDescription("suppresses the output of the disassembly")
-                .create("N");
-
-        Option inlineTableOption = OptionBuilder.withLongOpt("inline-table")
-                .withDescription("specify a file containing a custom inline method table to use for deodexing")
-                .hasArg()
-                .withArgName("FILE")
-                .create("T");
-
-        Option dexEntryOption = OptionBuilder.withLongOpt("dex-file")
-                .withDescription("looks for dex file named DEX_FILE, defaults to classes.dex")
-                .withArgName("DEX_FILE")
-                .hasArg()
-                .create("e");
-
-        basicOptions.addOption(versionOption);
-        basicOptions.addOption(helpOption);
-        basicOptions.addOption(outputDirOption);
-        basicOptions.addOption(noParameterRegistersOption);
-        basicOptions.addOption(deodexerantOption);
-        basicOptions.addOption(experimentalOption);
-        basicOptions.addOption(useLocalsOption);
-        basicOptions.addOption(sequentialLabelsOption);
-        basicOptions.addOption(noDebugInfoOption);
-        basicOptions.addOption(registerInfoOption);
-        basicOptions.addOption(classPathOption);
-        basicOptions.addOption(classPathDirOption);
-        basicOptions.addOption(codeOffsetOption);
-        basicOptions.addOption(noAccessorCommentsOption);
-        basicOptions.addOption(apiLevelOption);
-        basicOptions.addOption(jobsOption);
-        basicOptions.addOption(resourceIdFilesOption);
-        basicOptions.addOption(noImplicitReferencesOption);
-        basicOptions.addOption(dexEntryOption);
-        basicOptions.addOption(checkPackagePrivateAccessOption);
-        basicOptions.addOption(normalizeVirtualMethods);
-
-        debugOptions.addOption(dumpOption);
-        debugOptions.addOption(ignoreErrorsOption);
-        debugOptions.addOption(noDisassemblyOption);
-        debugOptions.addOption(inlineTableOption);
-
-        for (Object option: basicOptions.getOptions()) {
-            options.addOption((Option)option);
-        }
-        for (Object option: debugOptions.getOptions()) {
-            options.addOption((Option)option);
-        }
-    }
-
-    @Nonnull
-    private static List<String> getDefaultBootClassPathForApi(int apiLevel, boolean experimental) {
-        if (apiLevel < 9) {
-            return Lists.newArrayList(
-                    "/system/framework/core.jar",
-                    "/system/framework/ext.jar",
-                    "/system/framework/framework.jar",
-                    "/system/framework/android.policy.jar",
-                    "/system/framework/services.jar");
-        } else if (apiLevel < 12) {
-            return Lists.newArrayList(
-                    "/system/framework/core.jar",
-                    "/system/framework/bouncycastle.jar",
-                    "/system/framework/ext.jar",
-                    "/system/framework/framework.jar",
-                    "/system/framework/android.policy.jar",
-                    "/system/framework/services.jar",
-                    "/system/framework/core-junit.jar");
-        } else if (apiLevel < 14) {
-            return Lists.newArrayList(
-                    "/system/framework/core.jar",
-                    "/system/framework/apache-xml.jar",
-                    "/system/framework/bouncycastle.jar",
-                    "/system/framework/ext.jar",
-                    "/system/framework/framework.jar",
-                    "/system/framework/android.policy.jar",
-                    "/system/framework/services.jar",
-                    "/system/framework/core-junit.jar");
-        } else if (apiLevel < 16) {
-            return Lists.newArrayList(
-                    "/system/framework/core.jar",
-                    "/system/framework/core-junit.jar",
-                    "/system/framework/bouncycastle.jar",
-                    "/system/framework/ext.jar",
-                    "/system/framework/framework.jar",
-                    "/system/framework/android.policy.jar",
-                    "/system/framework/services.jar",
-                    "/system/framework/apache-xml.jar",
-                    "/system/framework/filterfw.jar");
-        } else if (apiLevel < 21) {
-            // this is correct as of api 17/4.2.2
-            return Lists.newArrayList(
-                    "/system/framework/core.jar",
-                    "/system/framework/core-junit.jar",
-                    "/system/framework/bouncycastle.jar",
-                    "/system/framework/ext.jar",
-                    "/system/framework/framework.jar",
-                    "/system/framework/telephony-common.jar",
-                    "/system/framework/mms-common.jar",
-                    "/system/framework/android.policy.jar",
-                    "/system/framework/services.jar",
-                    "/system/framework/apache-xml.jar");
-        } else if (apiLevel < 26) {
-            return Lists.newArrayList(
-                    "/system/framework/core-libart.jar",
-                    "/system/framework/conscrypt.jar",
-                    "/system/framework/okhttp.jar",
-                    "/system/framework/core-junit.jar",
-                    "/system/framework/bouncycastle.jar",
-                    "/system/framework/ext.jar",
-                    "/system/framework/framework.jar",
-                    "/system/framework/telephony-common.jar",
-                    "/system/framework/voip-common.jar",
-                    "/system/framework/ims-common.jar",
-                    "/system/framework/mms-common.jar",
-                    "/system/framework/android.policy.jar",
-                    "/system/framework/apache-xml.jar");
-        } else { // api >= 26
-            // TODO: verify, add new ones?
-            return Lists.newArrayList(
-                    "/system/framework/core-libart.jar",
-                    "/system/framework/conscrypt.jar",
-                    "/system/framework/okhttp.jar",
-                    "/system/framework/bouncycastle.jar",
-                    "/system/framework/ext.jar",
-                    "/system/framework/framework.jar",
-                    "/system/framework/telephony-common.jar",
-                    "/system/framework/voip-common.jar",
-                    "/system/framework/ims-common.jar",
-                    "/system/framework/mms-common.jar",
-                    "/system/framework/android.policy.jar",
-                    "/system/framework/apache-xml.jar");
-        }
-    }
-}
diff --git a/baksmali/src/test/java/org/jf/baksmali/AnalysisTest.java b/baksmali/src/test/java/org/jf/baksmali/AnalysisTest.java
index 2bb04dd..a68038d 100644
--- a/baksmali/src/test/java/org/jf/baksmali/AnalysisTest.java
+++ b/baksmali/src/test/java/org/jf/baksmali/AnalysisTest.java
@@ -36,7 +36,9 @@
 import junit.framework.Assert;
 import org.jf.baksmali.Adaptors.ClassDefinition;
 import org.jf.dexlib2.DexFileFactory;
+import org.jf.dexlib2.Opcodes;
 import org.jf.dexlib2.analysis.ClassPath;
+import org.jf.dexlib2.analysis.ClassProvider;
 import org.jf.dexlib2.iface.ClassDef;
 import org.jf.dexlib2.iface.DexFile;
 import org.jf.util.IndentingWriter;
@@ -49,6 +51,7 @@
 import java.io.StringWriter;
 import java.net.URISyntaxException;
 import java.net.URL;
+import java.util.ArrayList;
 
 public class AnalysisTest {
 
@@ -68,6 +71,11 @@
     }
 
     @Test
+    public void InstanceOfTest() throws IOException, URISyntaxException {
+        runTest("InstanceOfTest", true, true);
+    }
+
+    @Test
     public void MultipleStartInstructionsTest() throws IOException, URISyntaxException {
         runTest("MultipleStartInstructionsTest", true);
     }
@@ -83,16 +91,24 @@
     }
 
     public void runTest(String test, boolean registerInfo) throws IOException, URISyntaxException {
+        runTest(test, registerInfo, false);
+    }
+
+    public void runTest(String test, boolean registerInfo, boolean isArt) throws IOException, URISyntaxException {
         String dexFilePath = String.format("%s%sclasses.dex", test, File.separatorChar);
 
-        DexFile dexFile = DexFileFactory.loadDexFile(findResource(dexFilePath), 15, false);
+        DexFile dexFile = DexFileFactory.loadDexFile(findResource(dexFilePath), Opcodes.getDefault());
 
-        baksmaliOptions options = new baksmaliOptions();
+        BaksmaliOptions options = new BaksmaliOptions();
         if (registerInfo) {
-            options.registerInfo = baksmaliOptions.ALL | baksmaliOptions.FULLMERGE;
-            options.classPath = new ClassPath();
+            options.registerInfo = BaksmaliOptions.ALL | BaksmaliOptions.FULLMERGE;
+            if (isArt) {
+                options.classPath = new ClassPath(new ArrayList<ClassProvider>(), true, 56);
+            } else {
+                options.classPath = new ClassPath();
+            }
         }
-        options.useImplicitReferences = false;
+        options.implicitReferences = false;
 
         for (ClassDef classDef: dexFile.getClasses()) {
             StringWriter stringWriter = new StringWriter();
diff --git a/baksmali/src/test/java/org/jf/baksmali/BaksmaliTestUtils.java b/baksmali/src/test/java/org/jf/baksmali/BaksmaliTestUtils.java
index 1c570b6..4dd2ad9 100644
--- a/baksmali/src/test/java/org/jf/baksmali/BaksmaliTestUtils.java
+++ b/baksmali/src/test/java/org/jf/baksmali/BaksmaliTestUtils.java
@@ -48,10 +48,9 @@
 
 public class BaksmaliTestUtils {
     public static void assertSmaliCompiledEquals(String source, String expected,
-            baksmaliOptions options, boolean stripComments) throws IOException,
+                                                 BaksmaliOptions options, boolean stripComments) throws IOException,
             RecognitionException {
-        ClassDef classDef = SmaliTestUtils.compileSmali(source, options.apiLevel,
-                options.experimental);
+        ClassDef classDef = SmaliTestUtils.compileSmali(source, options.apiLevel);
 
         // Remove unnecessary whitespace and optionally strip all comments from smali file
         String normalizedActual = getNormalizedSmali(classDef, options, stripComments);
@@ -62,13 +61,13 @@
     }
 
     public static void assertSmaliCompiledEquals(String source, String expected,
-            baksmaliOptions options) throws IOException, RecognitionException {
+            BaksmaliOptions options) throws IOException, RecognitionException {
         assertSmaliCompiledEquals(source, expected, options, false);
     }
 
     public static void assertSmaliCompiledEquals(String source, String expected)
             throws IOException, RecognitionException {
-        baksmaliOptions options = new baksmaliOptions();
+        BaksmaliOptions options = new BaksmaliOptions();
         assertSmaliCompiledEquals(source, expected, options);
     }
 
@@ -81,7 +80,7 @@
     }
 
     @Nonnull
-    public static String getNormalizedSmali(@Nonnull ClassDef classDef, @Nonnull baksmaliOptions options,
+    public static String getNormalizedSmali(@Nonnull ClassDef classDef, @Nonnull BaksmaliOptions options,
                                             boolean stripComments)
             throws IOException {
         StringWriter stringWriter = new StringWriter();
diff --git a/baksmali/src/test/java/org/jf/baksmali/DexTest.java b/baksmali/src/test/java/org/jf/baksmali/DexTest.java
index 5a4db65..f9f5562 100644
--- a/baksmali/src/test/java/org/jf/baksmali/DexTest.java
+++ b/baksmali/src/test/java/org/jf/baksmali/DexTest.java
@@ -65,7 +65,7 @@
     }
 
     @Nonnull
-    protected DexBackedDexFile getInputDexFile(@Nonnull String testName, @Nonnull baksmaliOptions options) {
+    protected DexBackedDexFile getInputDexFile(@Nonnull String testName, @Nonnull BaksmaliOptions options) {
         try {
             // Load file from resources as a stream
             byte[] inputBytes = BaksmaliTestUtils.readResourceBytesFully(getInputFilename(testName));
diff --git a/baksmali/src/test/java/org/jf/baksmali/DisassemblyTest.java b/baksmali/src/test/java/org/jf/baksmali/DisassemblyTest.java
index 1a34e8c..769372e 100644
--- a/baksmali/src/test/java/org/jf/baksmali/DisassemblyTest.java
+++ b/baksmali/src/test/java/org/jf/baksmali/DisassemblyTest.java
@@ -57,10 +57,10 @@
     }
 
     protected void runTest(@Nonnull String testName) {
-        runTest(testName, new baksmaliOptions());
+        runTest(testName, new BaksmaliOptions());
     }
 
-    protected void runTest(@Nonnull String testName, @Nonnull baksmaliOptions options) {
+    protected void runTest(@Nonnull String testName, @Nonnull BaksmaliOptions options) {
         try {
             DexBackedDexFile inputDex = getInputDexFile(testName, options);
             Assert.assertEquals(1, inputDex.getClassCount());
diff --git a/baksmali/src/test/java/org/jf/baksmali/FieldGapOrderTest.java b/baksmali/src/test/java/org/jf/baksmali/FieldGapOrderTest.java
index 78fabc0..ad2aad5 100644
--- a/baksmali/src/test/java/org/jf/baksmali/FieldGapOrderTest.java
+++ b/baksmali/src/test/java/org/jf/baksmali/FieldGapOrderTest.java
@@ -42,7 +42,7 @@
 public class FieldGapOrderTest extends DexTest {
     @Test
     public void testOldOrder() {
-        DexFile dexFile = getInputDexFile("FieldGapOrder", new baksmaliOptions());
+        DexFile dexFile = getInputDexFile("FieldGapOrder", new BaksmaliOptions());
         Assert.assertEquals(3, dexFile.getClasses().size());
 
         ClassPath classPath = new ClassPath(Lists.newArrayList(new DexClassProvider(dexFile)), false, 66);
@@ -56,7 +56,7 @@
 
     @Test
     public void testNewOrder() {
-        DexFile dexFile = getInputDexFile("FieldGapOrder", new baksmaliOptions());
+        DexFile dexFile = getInputDexFile("FieldGapOrder", new BaksmaliOptions());
         Assert.assertEquals(3, dexFile.getClasses().size());
 
         ClassPath classPath = new ClassPath(Lists.newArrayList(new DexClassProvider(dexFile)), false, 67);
diff --git a/baksmali/src/test/java/org/jf/baksmali/ImplicitReferenceTest.java b/baksmali/src/test/java/org/jf/baksmali/ImplicitReferenceTest.java
index 1f2ae5b..962a6be 100644
--- a/baksmali/src/test/java/org/jf/baksmali/ImplicitReferenceTest.java
+++ b/baksmali/src/test/java/org/jf/baksmali/ImplicitReferenceTest.java
@@ -62,8 +62,8 @@
                 "return-void\n" +
                 ".end method\n";
 
-        baksmaliOptions options = new baksmaliOptions();
-        options.useImplicitReferences = true;
+        BaksmaliOptions options = new BaksmaliOptions();
+        options.implicitReferences = true;
 
         BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options);
     }
@@ -93,8 +93,8 @@
                 "    return-void\n" +
                 ".end method\n";
 
-        baksmaliOptions options = new baksmaliOptions();
-        options.useImplicitReferences = false;
+        BaksmaliOptions options = new BaksmaliOptions();
+        options.implicitReferences = false;
 
         BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options);
     }
@@ -118,8 +118,8 @@
                 ".field public static field3:Ljava/lang/reflect/Method; = I()V\n" +
                 ".field public static field4:Ljava/lang/Class; = I\n";
 
-        baksmaliOptions options = new baksmaliOptions();
-        options.useImplicitReferences = true;
+        BaksmaliOptions options = new BaksmaliOptions();
+        options.implicitReferences = true;
 
         BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options);
     }
@@ -143,8 +143,8 @@
                 ".field public static field3:Ljava/lang/reflect/Method; = LHelloWorld;->I()V\n" +
                 ".field public static field4:Ljava/lang/Class; = I\n";
 
-        baksmaliOptions options = new baksmaliOptions();
-        options.useImplicitReferences = false;
+        BaksmaliOptions options = new BaksmaliOptions();
+        options.implicitReferences = false;
 
         BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options);
     }
@@ -174,8 +174,8 @@
                 "    return-void\n" +
                 ".end method\n";
 
-        baksmaliOptions options = new baksmaliOptions();
-        options.useImplicitReferences = true;
+        BaksmaliOptions options = new BaksmaliOptions();
+        options.implicitReferences = true;
 
         BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options);
     }
@@ -205,8 +205,8 @@
                 "    return-void\n" +
                 ".end method\n";
 
-        baksmaliOptions options = new baksmaliOptions();
-        options.useImplicitReferences = false;
+        BaksmaliOptions options = new BaksmaliOptions();
+        options.implicitReferences = false;
 
         BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options);
     }
@@ -228,8 +228,8 @@
                 ".field public static field2:Ljava/lang/reflect/Field; = V:I\n" +
                 ".field public static field3:Ljava/lang/reflect/Field; = I:I\n";
 
-        baksmaliOptions options = new baksmaliOptions();
-        options.useImplicitReferences = true;
+        BaksmaliOptions options = new BaksmaliOptions();
+        options.implicitReferences = true;
 
         BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options);
     }
@@ -251,8 +251,8 @@
                 ".field public static field2:Ljava/lang/reflect/Field; = LHelloWorld;->V:I\n" +
                 ".field public static field3:Ljava/lang/reflect/Field; = LHelloWorld;->I:I\n";
 
-        baksmaliOptions options = new baksmaliOptions();
-        options.useImplicitReferences = false;
+        BaksmaliOptions options = new BaksmaliOptions();
+        options.implicitReferences = false;
 
         BaksmaliTestUtils.assertSmaliCompiledEquals(source, expected, options);
     }
diff --git a/baksmali/src/test/java/org/jf/baksmali/InterfaceOrderTest.java b/baksmali/src/test/java/org/jf/baksmali/InterfaceOrderTest.java
index d85d791..f1ade1e 100644
--- a/baksmali/src/test/java/org/jf/baksmali/InterfaceOrderTest.java
+++ b/baksmali/src/test/java/org/jf/baksmali/InterfaceOrderTest.java
@@ -36,6 +36,6 @@
 public class InterfaceOrderTest extends IdenticalRoundtripTest {
     @Test
     public void testInterfaceOrder() {
-        runTest("InterfaceOrder", new baksmaliOptions());
+        runTest("InterfaceOrder", new BaksmaliOptions());
     }
 }
diff --git a/baksmali/src/test/java/org/jf/baksmali/RoundtripTest.java b/baksmali/src/test/java/org/jf/baksmali/RoundtripTest.java
index c9ff2d4..81e98a3 100644
--- a/baksmali/src/test/java/org/jf/baksmali/RoundtripTest.java
+++ b/baksmali/src/test/java/org/jf/baksmali/RoundtripTest.java
@@ -69,10 +69,10 @@
     }
 
     protected void runTest(@Nonnull String testName) {
-        runTest(testName, new baksmaliOptions());
+        runTest(testName, new BaksmaliOptions());
     }
 
-    protected void runTest(@Nonnull String testName, @Nonnull baksmaliOptions options) {
+    protected void runTest(@Nonnull String testName, @Nonnull BaksmaliOptions options) {
         try {
             // Load file from resources as a stream
             String inputFilename = getInputFilename(testName);
diff --git a/baksmali/src/test/resources/InstanceOfTest/InstanceOfTest.smali b/baksmali/src/test/resources/InstanceOfTest/InstanceOfTest.smali
new file mode 100644
index 0000000..8e3337a
--- /dev/null
+++ b/baksmali/src/test/resources/InstanceOfTest/InstanceOfTest.smali
@@ -0,0 +1,118 @@
+.class public LInstanceOfTest;
+.super Ljava/lang/Object;
+
+
+# virtual methods
+.method public testInstanceOfEqz(Ljava/lang/Object;)I
+    .registers 3
+
+    #v0=(Uninit);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+    instance-of v0, p1, Ljava/lang/String;
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+    if-eqz v0, :cond_9
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Unknown);
+
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+    invoke-virtual {p1}, Ljava/lang/String;->length()I
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+    move-result v0
+    #v0=(Integer);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+
+    #v0=(Integer);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+    return v0
+    #v0=(Integer);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+
+    :cond_9
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+    const v0, -0x1
+    #v0=(Byte);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+
+    #v0=(Byte);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+    return v0
+    #v0=(Byte);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+.end method
+
+.method public testInstanceOfNez(Ljava/lang/Object;)I
+    .registers 3
+
+    #v0=(Uninit);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+    instance-of v0, p1, Ljava/lang/String;
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+    if-nez v0, :cond_8
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Unknown);
+
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+    const v0, -0x1
+    #v0=(Byte);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+
+    #v0=(Byte);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+    return v0
+    #v0=(Byte);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+
+    :cond_8
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+    invoke-virtual {p1}, Ljava/lang/String;->length()I
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+
+    #v0=(Boolean);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+    move-result v0
+    #v0=(Integer);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+
+    #v0=(Integer);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+    return v0
+    #v0=(Integer);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/String;);
+.end method
+
+.method public testRegisterAlias(Ljava/lang/Object;)I
+    .registers 4
+
+    #v0=(Uninit);v1=(Uninit);p0=(Reference,LInstanceOfTest;);p1=(Reference,Ljava/lang/Object;);
+    move-object p0, p1
+    #v0=(Uninit);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;);
+
+    #v0=(Uninit);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;);
+    instance-of v0, p0, Ljava/lang/String;
+    #v0=(Boolean);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;);
+
+    #v0=(Boolean);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;);
+    if-eqz v0, :cond_f
+    #v0=(Boolean);v1=(Uninit);p0=(Unknown);p1=(Unknown);
+
+    :cond_5
+    #v0=(Integer):merge{0x3:(Boolean),0xc:(Integer)}
+    #v1=(Conflicted):merge{0x3:(Uninit),0xc:(Null)}
+    #p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;);
+    invoke-virtual {p1}, Ljava/lang/String;->length()I
+    #v0=(Integer);v1=(Conflicted);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;);
+
+    #v0=(Integer);v1=(Conflicted);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;);
+    move-result v0
+    #v0=(Integer);v1=(Conflicted);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;);
+
+    #v0=(Integer);v1=(Conflicted);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;);
+    const v1, 0x0
+    #v0=(Integer);v1=(Null);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;);
+
+    #v0=(Integer);v1=(Null);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;);
+    if-le v0, v1, :cond_5
+    #v0=(Integer);v1=(Null);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;);
+
+    #v0=(Integer);v1=(Null);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;);
+    return v0
+    #v0=(Integer);v1=(Null);p0=(Reference,Ljava/lang/String;);p1=(Reference,Ljava/lang/String;);
+
+    :cond_f
+    #v0=(Boolean);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;);
+    const v0, -0x1
+    #v0=(Byte);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;);
+
+    #v0=(Byte);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;);
+    return v0
+    #v0=(Byte);v1=(Uninit);p0=(Reference,Ljava/lang/Object;);p1=(Reference,Ljava/lang/Object;);
+.end method
diff --git a/baksmali/src/test/resources/InstanceOfTest/classes.dex b/baksmali/src/test/resources/InstanceOfTest/classes.dex
new file mode 100644
index 0000000..571bdb8
--- /dev/null
+++ b/baksmali/src/test/resources/InstanceOfTest/classes.dex
Binary files differ
diff --git a/baksmali/src/test/resources/UninitRefIdentityTest/UninitRefIdentityTest.smali b/baksmali/src/test/resources/UninitRefIdentityTest/UninitRefIdentityTest.smali
index f9c4363..1970d3b 100644
--- a/baksmali/src/test/resources/UninitRefIdentityTest/UninitRefIdentityTest.smali
+++ b/baksmali/src/test/resources/UninitRefIdentityTest/UninitRefIdentityTest.smali
@@ -26,11 +26,37 @@
     #v0=(Conflicted):merge{0x5:(UninitRef,Ljava/lang/String;),0x7:(UninitRef,Ljava/lang/String;)}
     #v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
     invoke-direct {v0}, Ljava/lang/String;-><init>()V
-    #v0=(Unknown);v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
+    #v0=(Conflicted);v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
 
-    #v0=(Unknown);v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
+    #v0=(Conflicted);v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
     return-void
-    #v0=(Unknown);v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
+    #v0=(Conflicted);v1=(Uninit);v2=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
+.end method
+
+.method public constructor <init>(I)V
+    .registers 2
+
+    #p0=(UninitThis,LUninitRefIdentityTest;);p1=(Integer);
+    move-object p1, p0
+    #p0=(UninitThis,LUninitRefIdentityTest;);p1=(UninitThis,LUninitRefIdentityTest;);
+
+    #p0=(UninitThis,LUninitRefIdentityTest;);p1=(UninitThis,LUninitRefIdentityTest;);
+    invoke-direct {p1}, Ljava/lang/Object;-><init>()V
+    #p0=(Reference,LUninitRefIdentityTest;);p1=(Reference,LUninitRefIdentityTest;);
+
+    :cond_4
+    #p0=(Reference,LUninitRefIdentityTest;);
+    #p1=(Reference,LUninitRefIdentityTest;):merge{0x1:(Reference,LUninitRefIdentityTest;),0x7:(Null)}
+    const p1, 0x0
+    #p0=(Reference,LUninitRefIdentityTest;);p1=(Null);
+
+    #p0=(Reference,LUninitRefIdentityTest;);p1=(Null);
+    if-nez p1, :cond_4
+    #p0=(Reference,LUninitRefIdentityTest;);p1=(Null);
+
+    #p0=(Reference,LUninitRefIdentityTest;);p1=(Null);
+    return-void
+    #p0=(Reference,LUninitRefIdentityTest;);p1=(Null);
 .end method
 
 .method public constructor <init>(Ljava/lang/String;)V
@@ -48,3 +74,37 @@
     return-void
     #p0=(Reference,LUninitRefIdentityTest;);p1=(Reference,LUninitRefIdentityTest;);
 .end method
+
+
+# virtual methods
+.method public overlappingInits()V
+    .registers 3
+
+    #v0=(Uninit);v1=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
+    new-instance v0, Ljava/lang/String;
+    #v0=(UninitRef,Ljava/lang/String;);v1=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
+
+    #v0=(UninitRef,Ljava/lang/String;);v1=(Uninit);p0=(Reference,LUninitRefIdentityTest;);
+    new-instance v1, Ljava/lang/String;
+    #v0=(UninitRef,Ljava/lang/String;);v1=(UninitRef,Ljava/lang/String;);p0=(Reference,LUninitRefIdentityTest;);
+
+    #v0=(UninitRef,Ljava/lang/String;);v1=(UninitRef,Ljava/lang/String;);p0=(Reference,LUninitRefIdentityTest;);
+    new-instance p0, Ljava/lang/String;
+    #v0=(UninitRef,Ljava/lang/String;);v1=(UninitRef,Ljava/lang/String;);p0=(UninitRef,Ljava/lang/String;);
+
+    #v0=(UninitRef,Ljava/lang/String;);v1=(UninitRef,Ljava/lang/String;);p0=(UninitRef,Ljava/lang/String;);
+    invoke-direct {p0}, Ljava/lang/String;-><init>()V
+    #v0=(UninitRef,Ljava/lang/String;);v1=(UninitRef,Ljava/lang/String;);p0=(Reference,Ljava/lang/String;);
+
+    #v0=(UninitRef,Ljava/lang/String;);v1=(UninitRef,Ljava/lang/String;);p0=(Reference,Ljava/lang/String;);
+    invoke-direct {v1}, Ljava/lang/String;-><init>()V
+    #v0=(UninitRef,Ljava/lang/String;);v1=(Reference,Ljava/lang/String;);p0=(Reference,Ljava/lang/String;);
+
+    #v0=(UninitRef,Ljava/lang/String;);v1=(Reference,Ljava/lang/String;);p0=(Reference,Ljava/lang/String;);
+    invoke-direct {v0}, Ljava/lang/String;-><init>()V
+    #v0=(Reference,Ljava/lang/String;);v1=(Reference,Ljava/lang/String;);p0=(Reference,Ljava/lang/String;);
+
+    #v0=(Reference,Ljava/lang/String;);v1=(Reference,Ljava/lang/String;);p0=(Reference,Ljava/lang/String;);
+    return-void
+    #v0=(Reference,Ljava/lang/String;);v1=(Reference,Ljava/lang/String;);p0=(Reference,Ljava/lang/String;);
+.end method
diff --git a/baksmali/src/test/resources/UninitRefIdentityTest/classes.dex b/baksmali/src/test/resources/UninitRefIdentityTest/classes.dex
index ea146cf..0f0caab 100644
--- a/baksmali/src/test/resources/UninitRefIdentityTest/classes.dex
+++ b/baksmali/src/test/resources/UninitRefIdentityTest/classes.dex
Binary files differ
diff --git a/build.gradle b/build.gradle
index 56aaa3f..9e8205d 100644
--- a/build.gradle
+++ b/build.gradle
@@ -31,9 +31,14 @@
 
 apply plugin: 'idea'
 
-version = '2.1.3'
+version = '2.2.0'
+def jcommanderVersion = ''
 
 if (!('release' in gradle.startParameter.taskNames)) {
+    // we compile against 1.48 normally, to match what's in AOSP, but switch to a newer version
+    // for release, because it has some fixes required when running on Android
+    jcommanderVersion = 'com.beust:jcommander:1.48'
+
     def versionSuffix
     try {
         def git = org.eclipse.jgit.api.Git.open(file('.'))
@@ -51,6 +56,8 @@
 
     version += "-${versionSuffix}"
 } else {
+    jcommanderVersion = 'com.beust:jcommander:1.64'
+
     if (System.env.JDK6_HOME == null && !JavaVersion.current().isJava6()) {
         throw new InvalidUserDataException("bzzzzzzzt. Release builds must be performed with java 6. " +
                 "Either run gradle with java 6, or define the JDK6_HOME environment variable.")
@@ -101,15 +108,16 @@
                 guava: 'com.google.guava:guava:18.0',
                 findbugs: 'com.google.code.findbugs:jsr305:1.3.9',
                 junit: 'junit:junit:4.6',
+                mockito: 'org.mockito:mockito-core:1.10.19',
                 antlr_runtime: 'org.antlr:antlr-runtime:3.5.2',
                 antlr: 'org.antlr:antlr:3.5.2',
                 stringtemplate: 'org.antlr:stringtemplate:3.2.1',
-                commons_cli: 'commons-cli:commons-cli:1.2',
                 jflex_plugin: 'org.xbib.gradle.plugin:gradle-plugin-jflex:1.1.0',
                 proguard_gradle: 'net.sf.proguard:proguard-gradle:5.2.1',
                 dx: 'com.google.android.tools:dx:1.7',
-                gson: 'com.google.code.gson:gson:2.3.1'
-         ]
+                gson: 'com.google.code.gson:gson:2.3.1',
+                jcommander: jcommanderVersion
+        ]
     }
 
     repositories {
@@ -196,5 +204,6 @@
 }
 
 task wrapper(type: Wrapper) {
-    gradleVersion = '2.14'
+    gradleVersion = '3.1'
+    distributionType = Wrapper.DistributionType.ALL
 }
\ No newline at end of file
diff --git a/dexlib2/Android.mk b/dexlib2/Android.mk
index 437ee37..e55aa47 100644
--- a/dexlib2/Android.mk
+++ b/dexlib2/Android.mk
@@ -33,6 +33,7 @@
 LOCAL_STATIC_JAVA_LIBRARIES := \
 	commons-cli-1.2 \
 	guavalib \
+	jcommander-host \
 	jsr305lib
 
 
diff --git a/dexlib2/OatVersions.txt b/dexlib2/OatVersions.txt
index 8aa9ea9..329c4f0 100644
--- a/dexlib2/OatVersions.txt
+++ b/dexlib2/OatVersions.txt
@@ -8,6 +8,7 @@
  - return-void-barrier -> return-void-no-barrier
 1412dfa4adcd511902e510fa0c948b168ab5840c - 61 (re-commit of f3251d12)
 9d6bf69ad3012a9d843268fdd5325b6719b6d5f2 - 62
+- classpath list was added
 0de1133ba600f299b3d67938f650720d9f859eb2 - 63
 07785bb98dc8bbe192970e0f4c2cafd338a8dc68 - 64
 fa2c054b28d4b540c1b3651401a7a091282a015f - 65
@@ -21,4 +22,69 @@
 6e2d5747d00697a25251d25dd33b953e54709507 - 68 (revert of 54b62480)
 0747466fca310eedea5fc49e37d54f240a0b3c0f - 69 (re-commit of 54b62480)
 501fd635a557645ab05f893c56e1f358e21bab82 - 70
-99170c636dfae4908b102347cfe9f92bad1881cc - 71
\ No newline at end of file
+99170c636dfae4908b102347cfe9f92bad1881cc - 71
+3cfa4d05afa76e19ca99ec964b535a15c73683f0 - 72
+- default methods
+d9786b0e5be23ea0258405165098b4216579209c - 73
+- fast class lookup table
+a4f1220c1518074db18ca1044e9201492975750b - 74
+625a64aad13905d8a2454bf3cc0e874487b110d5 - 75
+- bootclasspath list was added
+- class offsets moved out to a separate table
+919f5536182890d2e03f59b961acf8f7c836ff61 - 74 (revert of 625a64aa)
+9bdf108885a27ba05fae8501725649574d7c491b - 75 (re-commit of 625a64aa)
+a62d2f04a6ecf804f8a78e722a6ca8ccb2dfa931 - 76
+845e5064580bd37ad5014f7aa0d078be7265464d - 75 (revert of a62d2f04)
+29d38e77c553c6cf71fc4dafe2d22b4e3f814872 - 76 (re-commit of 845e5064)
+d1537b569b6cd18297c5e02d13cdd588c4366c51 - 77
+61b28a17d9b6e8e998103646e98e4a9772e11927 - 78
+9d07e3d128ccfa0ef7670feadd424a825e447d1d - 79
+952e1e3710158982941fc70326e9fddc3021235d - 80
+013e3f33495dcc31dba19c9de128d23ed441d7d3 - 81
+87f3fcbd0db352157fc59148e94647ef21b73bce - 82
+02b75806a80f8b75c3d6ba2ff97c995117630f36 - 83
+4359e61927866c254bc2d701e3ea4c48de10b79c - 84
+d549c28cfbddba945cb88857bcca3dce1414fb29 - 85
+952dbb19cd094b8bfb01dbb33e0878db429e499a - 86
+239d6eaff0cbb5c4c0139f7053a012758799f186 - 87 - introduction of vdex files
+77d9dd75d5d4a22ad1235f9a08d2cfbf2f0ae6fa - 89
+af1e2990cd1406a0fb7cba1d2e208208e950e413 - 90
+9fd8c60cdff7b28a89bb97fd90ae9d0f37cf8f8b - 91
+6beced4c017826f7c449f12fac7fa42403657f2b - 92
+58c3f6a0d15a4340c0a11ab7fbc8c4b990c64b77 - 93
+5923b5238091d9cd65f988fc059deb4fbb2e7f08 - 94
+2b615ba29c4dfcf54aaf44955f2eac60f5080b2e - 95
+f7aaacd97881c6924b8212c7f8fe4a4c8721ef53 - 94 (revert of 2b615ba)
+0d3998b5ff619364acf47bec0b541e7a49bd6fe7 - 95 (re-commit of 2b615ba)
+ac141397dc29189ad2b2df41f8d4312246beec60 - 96
+1998cd02603197f2acdc0734397a6d48b2f59b80 - 97
+e71b35446985835363a4508646cf7b1121bd95a3 - 98
+39cee66a8ddf0254626c9591662cf87e4a1cedc4 - 99
+cc99df230feb46ba717252f002d0cc2da6828421 - 100
+fee255039e30c1c3dfc70c426c3d176221c3cdf9 - 99 (revert of cc99df23)
+e761bccf9f0d884cc4d4ec104568cef968296492 - 100 (re-commit of cc99df23)
+8d91ac31ccb92557e434d89ffade3372466e1af5 - 101
+fd3161acfbe82c54ef49958f0ccc62511f224f91 - 102
+a2f526f889be06f96ea59624c9dfb1223b3839f3 - 103
+b048cb74b742b03eb6dd5f1d6dd49e559f730b36 - 104
+12f1b99775bbf7dd82d0a897587ab6ed0e75ee22 - 105
+ec7862283dd49f5a58d0ac45960ce27c2f7671b8 - 106
+45aa598cd1773f5eb1705dec13bea059238e054d - 107
+d16363a93053de0f32252c7897d839a46aff14ae - 108
+1a20b6801f2432a42b906f0de01e7e9586526aec - 109
+575d3e60c68b5cf481b615dde4a16283507b19ed - 110
+85c0f2ac03417f5125bc2ff1dab8109859c67d5c - 111
+5812e20ff7cbc8efa0b8d7486ada2f58840a6ad5 - 111
+b7ea3799c15b0090bb690e18ac1b5b0fddbdeee8 - 112
+    - version bump for missing bump in commits
+    - 3228908337fdfe851223f8ae374538de25cb5ad1
+    - 5812e20ff7cbc8efa0b8d7486ada2f58840a6ad5
+d776ff08e07494327716f0d2ea1a774b2ebfbca9 - 113
+bfb80d25eaeb7a604d5dd25a370e3869e96a33ab - 114
+1aea3510b8dd0c512cec61c91c5ef1f1e5d53d64 - 115
+6374c58f2ea403b3a05fb27376110fe4d0fc8e3f - 114 (revert of 1aea3510)
+0b66d6174bf1f6023f9d36dda8538490b79c2e9f - 113 (revert of bfb80d25)
+8d6768d47b66a688d35399d524ad5a5450e9d9d4 - 114 (i don't even)
+f44d36c8423f81cbb5e9f55d8813e26ffa1a7f3b - 115 (115 again. heck if I know what's going on)
+cbcedbf9382bc773713cd3552ed96f417bf1daeb - 116
+051071718085ce807a2e7c55278a8d723e238e86 - 116
diff --git a/dexlib2/VdexVersions.txt b/dexlib2/VdexVersions.txt
new file mode 100644
index 0000000..9cb1a73
--- /dev/null
+++ b/dexlib2/VdexVersions.txt
@@ -0,0 +1,8 @@
+7b49e6cade09bc65b3b5f22d45fc9d0a7184e4f2 - 0 - introduction of vdex files
+5d5a36bddbc008cd52a3207aa2b31177c47f9a49 - 0 - verifier deps
+4acefd33064d37b41ca55c3c9355345a20e5f9c2 - 0 - quickening info
+f54e5df37cb42d9a83fc54b375da5ef335d604a9 - 1 - dex file count + dex location checksum
+7498105ec7497bae2ba9f1a697da9efa0c979654 - 2 - verify profile
+3eba863e41d531340392d9ec64e17963ac898d81 - 3
+97fa9928c07d3e0ee631235e9619fb0f8949ed7a - 4
+6e54f78c7c1e01c1a91a458c6e51cca1c7d13ad4 - 5
diff --git a/dexlib2/build.gradle b/dexlib2/build.gradle
index 8fbe5ff..422d2c3 100644
--- a/dexlib2/build.gradle
+++ b/dexlib2/build.gradle
@@ -51,6 +51,7 @@
     compile depends.guava
 
     testCompile depends.junit
+    testCompile depends.mockito
 
     accessorTestGenerator project('accessorTestGenerator')
 
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/DexFileFactory.java b/dexlib2/src/main/java/org/jf/dexlib2/DexFileFactory.java
index 60488ba..1caaf9f 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/DexFileFactory.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/DexFileFactory.java
@@ -31,14 +31,22 @@
 
 package org.jf.dexlib2;
 
-import com.google.common.base.MoreObjects;
+import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
 import com.google.common.io.ByteStreams;
+import com.google.common.io.Files;
 import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile.NotADexFile;
 import org.jf.dexlib2.dexbacked.DexBackedOdexFile;
 import org.jf.dexlib2.dexbacked.OatFile;
 import org.jf.dexlib2.dexbacked.OatFile.NotAnOatFileException;
 import org.jf.dexlib2.dexbacked.OatFile.OatDexFile;
+import org.jf.dexlib2.dexbacked.OatFile.VdexProvider;
+import org.jf.dexlib2.dexbacked.ZipDexContainer;
+import org.jf.dexlib2.dexbacked.ZipDexContainer.NotAZipFileException;
 import org.jf.dexlib2.iface.DexFile;
+import org.jf.dexlib2.iface.MultiDexContainer;
 import org.jf.dexlib2.writer.pool.DexPool;
 import org.jf.util.ExceptionWithContext;
 
@@ -46,80 +54,44 @@
 import javax.annotation.Nullable;
 import java.io.*;
 import java.util.List;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
 
 public final class DexFileFactory {
+
     @Nonnull
-    public static DexBackedDexFile loadDexFile(@Nonnull String path, int api) throws IOException {
-        return loadDexFile(path, api, false);
+    public static DexBackedDexFile loadDexFile(@Nonnull String path, @Nonnull Opcodes opcodes) throws IOException {
+        return loadDexFile(new File(path), opcodes);
     }
 
+    /**
+     * Loads a dex/apk/odex/oat file.
+     *
+     * For oat files with multiple dex files, the first will be opened. For zip/apk files, the "classes.dex" entry
+     * will be opened.
+     *
+     * @param file The file to open
+     * @param opcodes The set of opcodes to use
+     * @return A DexBackedDexFile for the given file
+     *
+     * @throws UnsupportedOatVersionException If file refers to an unsupported oat file
+     * @throws DexFileNotFoundException If file does not exist, if file is a zip file but does not have a "classes.dex"
+     * entry, or if file is an oat file that has no dex entries.
+     * @throws UnsupportedFileTypeException If file is not a valid dex/zip/odex/oat file, or if the "classes.dex" entry
+     * in a zip file is not a valid dex file
+     */
     @Nonnull
-    public static DexBackedDexFile loadDexFile(@Nonnull String path, int api, boolean experimental)
-            throws IOException {
-        return loadDexFile(new File(path), "classes.dex", Opcodes.forApi(api, experimental));
-    }
-
-    @Nonnull
-    public static DexBackedDexFile loadDexFile(@Nonnull File dexFile, int api) throws IOException {
-        return loadDexFile(dexFile, api, false);
-    }
-
-    @Nonnull
-    public static DexBackedDexFile loadDexFile(@Nonnull File dexFile, int api, boolean experimental)
-            throws IOException {
-        return loadDexFile(dexFile, null, Opcodes.forApi(api, experimental));
-    }
-
-    @Nonnull
-    public static DexBackedDexFile loadDexFile(@Nonnull File dexFile, @Nullable String dexEntry, int api,
-            boolean experimental) throws IOException {
-        return loadDexFile(dexFile, dexEntry, Opcodes.forApi(api, experimental));
-    }
-
-    @Nonnull
-    public static DexBackedDexFile loadDexFile(@Nonnull File dexFile, @Nullable String dexEntry,
-                                               @Nonnull Opcodes opcodes) throws IOException {
-        ZipFile zipFile = null;
-        boolean isZipFile = false;
-        try {
-            zipFile = new ZipFile(dexFile);
-            // if we get here, it's safe to assume we have a zip file
-            isZipFile = true;
-
-            String zipEntryName = MoreObjects.firstNonNull(dexEntry, "classes.dex");
-            ZipEntry zipEntry = zipFile.getEntry(zipEntryName);
-            if (zipEntry == null) {
-                throw new DexFileNotFound("zip file %s does not contain a %s file", dexFile.getName(), zipEntryName);
-            }
-            long fileLength = zipEntry.getSize();
-            if (fileLength < 40) {
-                throw new ExceptionWithContext("The %s file in %s is too small to be a valid dex file",
-                        zipEntryName, dexFile.getName());
-            } else if (fileLength > Integer.MAX_VALUE) {
-                throw new ExceptionWithContext("The %s file in %s is too large to read in",
-                        zipEntryName, dexFile.getName());
-            }
-            byte[] dexBytes = new byte[(int)fileLength];
-            ByteStreams.readFully(zipFile.getInputStream(zipEntry), dexBytes);
-            return new DexBackedDexFile(opcodes, dexBytes);
-        } catch (IOException ex) {
-            // don't continue on if we know it's a zip file
-            if (isZipFile) {
-                throw ex;
-            }
-        } finally {
-            if (zipFile != null) {
-                try {
-                    zipFile.close();
-                } catch (IOException ex) {
-                    // just eat it
-                }
-            }
+    public static DexBackedDexFile loadDexFile(@Nonnull File file, @Nonnull Opcodes opcodes) throws IOException {
+        if (!file.exists()) {
+            throw new DexFileNotFoundException("%s does not exist", file.getName());
         }
 
-        InputStream inputStream = new BufferedInputStream(new FileInputStream(dexFile));
+        try {
+            ZipDexContainer container = new ZipDexContainer(file, opcodes);
+            return new DexEntryFinder(file.getPath(), container).findEntry("classes.dex", true);
+        } catch (NotAZipFileException ex) {
+            // eat it and continue
+        }
+
+        InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
         try {
             try {
                 return DexBackedDexFile.fromInputStream(opcodes, inputStream);
@@ -127,17 +99,18 @@
                 // just eat it
             }
 
-            // Note: DexBackedDexFile.fromInputStream will reset inputStream back to the same position, if it fails
-
             try {
                 return DexBackedOdexFile.fromInputStream(opcodes, inputStream);
             } catch (DexBackedOdexFile.NotAnOdexFile ex) {
                 // just eat it
             }
 
+            // Note: DexBackedDexFile.fromInputStream and DexBackedOdexFile.fromInputStream will reset inputStream
+            // back to the same position, if they fails
+
             OatFile oatFile = null;
             try {
-                oatFile = OatFile.fromInputStream(inputStream);
+                oatFile = OatFile.fromInputStream(inputStream, new FilenameVdexProvider(file));
             } catch (NotAnOatFileException ex) {
                 // just eat it
             }
@@ -150,71 +123,181 @@
                 List<OatDexFile> oatDexFiles = oatFile.getDexFiles();
 
                 if (oatDexFiles.size() == 0) {
-                    throw new DexFileNotFound("Oat file %s contains no dex files", dexFile.getName());
+                    throw new DexFileNotFoundException("Oat file %s contains no dex files", file.getName());
                 }
 
-                if (dexEntry == null) {
-                    if (oatDexFiles.size() > 1) {
-                        throw new MultipleDexFilesException(oatFile);
-                    }
-                    return oatDexFiles.get(0);
-                } else {
-                    // first check for an exact match
-                    for (OatDexFile oatDexFile : oatFile.getDexFiles()) {
-                        if (oatDexFile.filename.equals(dexEntry)) {
-                            return oatDexFile;
-                        }
-                    }
-
-                    if (!dexEntry.contains("/")) {
-                        for (OatDexFile oatDexFile : oatFile.getDexFiles()) {
-                            File oatEntryFile = new File(oatDexFile.filename);
-                            if (oatEntryFile.getName().equals(dexEntry)) {
-                                return oatDexFile;
-                            }
-                        }
-                    }
-
-                    throw new DexFileNotFound("oat file %s does not contain a dex file named %s",
-                            dexFile.getName(), dexEntry);
-                }
+                return oatDexFiles.get(0);
             }
         } finally {
             inputStream.close();
         }
 
-        throw new ExceptionWithContext("%s is not an apk, dex, odex or oat file.", dexFile.getPath());
+        throw new UnsupportedFileTypeException("%s is not an apk, dex, odex or oat file.", file.getPath());
     }
 
+    /**
+     * Loads a dex entry from a container format (zip/oat)
+     *
+     * This has two modes of operation, depending on the exactMatch parameter. When exactMatch is true, it will only
+     * load an entry whose name exactly matches that provided by the dexEntry parameter.
+     *
+     * When exactMatch is false, then it will search for any entry that dexEntry is a path suffix of. "path suffix"
+     * meaning all the path components in dexEntry must fully match the corresponding path components in the entry name,
+     * but some path components at the beginning of entry name can be missing.
+     *
+     * For example, if an oat file contains a "/system/framework/framework.jar:classes2.dex" entry, then the following
+     * will match (not an exhaustive list):
+     *
+     * "/system/framework/framework.jar:classes2.dex"
+     * "system/framework/framework.jar:classes2.dex"
+     * "framework/framework.jar:classes2.dex"
+     * "framework.jar:classes2.dex"
+     * "classes2.dex"
+     *
+     * Note that partial path components specifically don't match. So something like "work/framework.jar:classes2.dex"
+     * would not match.
+     *
+     * If dexEntry contains an initial slash, it will be ignored for purposes of this suffix match -- but not when
+     * performing an exact match.
+     *
+     * If multiple entries match the given dexEntry, a MultipleMatchingDexEntriesException will be thrown
+     *
+     * @param file The container file. This must be either a zip (apk) file or an oat file.
+     * @param dexEntry The name of the entry to load. This can either be the exact entry name, if exactMatch is true,
+     *                 or it can be a path suffix.
+     * @param exactMatch If true, dexE
+     * @param opcodes The set of opcodes to use
+     * @return A DexBackedDexFile for the given entry
+     *
+     * @throws UnsupportedOatVersionException If file refers to an unsupported oat file
+     * @throws DexFileNotFoundException If the file does not exist, or if no matching entry could be found
+     * @throws UnsupportedFileTypeException If file is not a valid zip/oat file, or if the matching entry is not a
+     * valid dex file
+     * @throws MultipleMatchingDexEntriesException If multiple entries match the given dexEntry
+     */
+    public static DexBackedDexFile loadDexEntry(@Nonnull File file, @Nonnull String dexEntry,
+                                                boolean exactMatch, @Nonnull Opcodes opcodes) throws IOException {
+        if (!file.exists()) {
+            throw new DexFileNotFoundException("Container file %s does not exist", file.getName());
+        }
+
+        try {
+            ZipDexContainer container = new ZipDexContainer(file, opcodes);
+            return new DexEntryFinder(file.getPath(), container).findEntry(dexEntry, exactMatch);
+        } catch (NotAZipFileException ex) {
+            // eat it and continue
+        }
+
+        InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
+        try {
+            OatFile oatFile = null;
+            try {
+                oatFile = OatFile.fromInputStream(inputStream, new FilenameVdexProvider(file));
+            } catch (NotAnOatFileException ex) {
+                // just eat it
+            }
+
+            if (oatFile != null) {
+                if (oatFile.isSupportedVersion() == OatFile.UNSUPPORTED) {
+                    throw new UnsupportedOatVersionException(oatFile);
+                }
+
+                List<OatDexFile> oatDexFiles = oatFile.getDexFiles();
+
+                if (oatDexFiles.size() == 0) {
+                    throw new DexFileNotFoundException("Oat file %s contains no dex files", file.getName());
+                }
+
+                return new DexEntryFinder(file.getPath(), oatFile).findEntry(dexEntry, exactMatch);
+            }
+        } finally {
+            inputStream.close();
+        }
+
+        throw new UnsupportedFileTypeException("%s is not an apk or oat file.", file.getPath());
+    }
+
+    /**
+     * Loads a file containing 1 or more dex files
+     *
+     * If the given file is a dex or odex file, it will return a MultiDexContainer containing that single entry.
+     * Otherwise, for an oat or zip file, it will return an OatFile or ZipDexContainer respectively.
+     *
+     * @param file The file to open
+     * @param opcodes The set of opcodes to use
+     * @return A MultiDexContainer
+     * @throws DexFileNotFoundException If the given file does not exist
+     * @throws UnsupportedFileTypeException If the given file is not a valid dex/zip/odex/oat file
+     */
+    public static MultiDexContainer<? extends DexBackedDexFile> loadDexContainer(
+            @Nonnull File file, @Nonnull final Opcodes opcodes) throws IOException {
+        if (!file.exists()) {
+            throw new DexFileNotFoundException("%s does not exist", file.getName());
+        }
+
+        ZipDexContainer zipDexContainer = new ZipDexContainer(file, opcodes);
+        if (zipDexContainer.isZipFile()) {
+            return zipDexContainer;
+        }
+
+        InputStream inputStream = new BufferedInputStream(new FileInputStream(file));
+        try {
+            try {
+                DexBackedDexFile dexFile = DexBackedDexFile.fromInputStream(opcodes, inputStream);
+                return new SingletonMultiDexContainer(file.getPath(), dexFile);
+            } catch (DexBackedDexFile.NotADexFile ex) {
+                // just eat it
+            }
+
+            try {
+                DexBackedOdexFile odexFile = DexBackedOdexFile.fromInputStream(opcodes, inputStream);
+                return new SingletonMultiDexContainer(file.getPath(), odexFile);
+            } catch (DexBackedOdexFile.NotAnOdexFile ex) {
+                // just eat it
+            }
+
+            // Note: DexBackedDexFile.fromInputStream and DexBackedOdexFile.fromInputStream will reset inputStream
+            // back to the same position, if they fails
+
+            OatFile oatFile = null;
+            try {
+                oatFile = OatFile.fromInputStream(inputStream, new FilenameVdexProvider(file));
+            } catch (NotAnOatFileException ex) {
+                // just eat it
+            }
+
+            if (oatFile != null) {
+                // TODO: we should support loading earlier oat files, just not deodexing them
+                if (oatFile.isSupportedVersion() == OatFile.UNSUPPORTED) {
+                    throw new UnsupportedOatVersionException(oatFile);
+                }
+                return oatFile;
+            }
+        } finally {
+            inputStream.close();
+        }
+
+        throw new UnsupportedFileTypeException("%s is not an apk, dex, odex or oat file.", file.getPath());
+    }
+
+    /**
+     * Writes a DexFile out to disk
+     *
+     * @param path The path to write the dex file to
+     * @param dexFile a DexFile to write
+     */
     public static void writeDexFile(@Nonnull String path, @Nonnull DexFile dexFile) throws IOException {
         DexPool.writeTo(path, dexFile);
     }
 
     private DexFileFactory() {}
 
-    public static class DexFileNotFound extends ExceptionWithContext {
-        public DexFileNotFound(@Nullable Throwable cause) {
-            super(cause);
-        }
-
-        public DexFileNotFound(@Nullable Throwable cause, @Nullable String message, Object... formatArgs) {
-            super(cause, message, formatArgs);
-        }
-
-        public DexFileNotFound(@Nullable String message, Object... formatArgs) {
+    public static class DexFileNotFoundException extends ExceptionWithContext {
+        public DexFileNotFoundException(@Nullable String message, Object... formatArgs) {
             super(message, formatArgs);
         }
     }
 
-    public static class MultipleDexFilesException extends ExceptionWithContext {
-        @Nonnull public final OatFile oatFile;
-
-        public MultipleDexFilesException(@Nonnull OatFile oatFile) {
-            super("Oat file has multiple dex files.");
-            this.oatFile = oatFile;
-        }
-    }
-
     public static class UnsupportedOatVersionException extends ExceptionWithContext {
         @Nonnull public final OatFile oatFile;
 
@@ -223,4 +306,190 @@
             this.oatFile = oatFile;
         }
     }
+
+    public static class MultipleMatchingDexEntriesException extends ExceptionWithContext {
+        public MultipleMatchingDexEntriesException(@Nonnull String message, Object... formatArgs) {
+            super(String.format(message, formatArgs));
+        }
+    }
+
+    public static class UnsupportedFileTypeException extends ExceptionWithContext {
+        public UnsupportedFileTypeException(@Nonnull String message, Object... formatArgs) {
+            super(String.format(message, formatArgs));
+        }
+    }
+
+    /**
+     * Matches two entries fully, ignoring any initial slash, if any
+     */
+    private static boolean fullEntryMatch(@Nonnull String entry, @Nonnull String targetEntry) {
+        if (entry.equals(targetEntry)) {
+            return true;
+        }
+
+        if (entry.charAt(0) == '/') {
+            entry = entry.substring(1);
+        }
+
+        if (targetEntry.charAt(0) == '/') {
+            targetEntry = targetEntry.substring(1);
+        }
+
+        return entry.equals(targetEntry);
+    }
+
+    /**
+     * Performs a partial match against entry and targetEntry.
+     *
+     * This is considered a partial match if targetEntry is a suffix of entry, and if the suffix starts
+     * on a path "part" (ignoring the initial separator, if any). Both '/' and ':' are considered separators for this.
+     *
+     * So entry="/blah/blah/something.dex" and targetEntry="lah/something.dex" shouldn't match, but
+     * both targetEntry="blah/something.dex" and "/blah/something.dex" should match.
+     */
+    private static boolean partialEntryMatch(String entry, String targetEntry) {
+        if (entry.equals(targetEntry)) {
+            return true;
+        }
+
+        if (!entry.endsWith(targetEntry)) {
+            return false;
+        }
+
+        // Make sure the first matching part is a full entry. We don't want to match "/blah/blah/something.dex" with
+        // "lah/something.dex", but both "/blah/something.dex" and "blah/something.dex" should match
+        char precedingChar = entry.charAt(entry.length() - targetEntry.length() - 1);
+        char firstTargetChar = targetEntry.charAt(0);
+        // This is a device path, so we should always use the linux separator '/', rather than the current platform's
+        // separator
+        return firstTargetChar == ':' || firstTargetChar == '/' || precedingChar == ':' || precedingChar == '/';
+    }
+
+    protected static class DexEntryFinder {
+        private final String filename;
+        private final MultiDexContainer<? extends DexBackedDexFile> dexContainer;
+
+        public DexEntryFinder(@Nonnull String filename,
+                              @Nonnull MultiDexContainer<? extends DexBackedDexFile> dexContainer) {
+            this.filename = filename;
+            this.dexContainer = dexContainer;
+        }
+
+        @Nonnull
+        public DexBackedDexFile findEntry(@Nonnull String targetEntry, boolean exactMatch) throws IOException {
+            if (exactMatch) {
+                try {
+                    DexBackedDexFile dexFile = dexContainer.getEntry(targetEntry);
+                    if (dexFile == null) {
+                        throw new DexFileNotFoundException("Could not find entry %s in %s.", targetEntry, filename);
+                    }
+                    return dexFile;
+                } catch (NotADexFile ex) {
+                    throw new UnsupportedFileTypeException("Entry %s in %s is not a dex file", targetEntry, filename);
+                }
+            }
+
+            // find all full and partial matches
+            List<String> fullMatches = Lists.newArrayList();
+            List<DexBackedDexFile> fullEntries = Lists.newArrayList();
+            List<String> partialMatches = Lists.newArrayList();
+            List<DexBackedDexFile> partialEntries = Lists.newArrayList();
+            for (String entry: dexContainer.getDexEntryNames()) {
+                if (fullEntryMatch(entry, targetEntry)) {
+                    // We want to grab all full matches, regardless of whether they're actually a dex file.
+                    fullMatches.add(entry);
+                    fullEntries.add(dexContainer.getEntry(entry));
+                } else if (partialEntryMatch(entry, targetEntry)) {
+                    partialMatches.add(entry);
+                    partialEntries.add(dexContainer.getEntry(entry));
+                }
+            }
+
+            // full matches always take priority
+            if (fullEntries.size() == 1) {
+                try {
+                    DexBackedDexFile dexFile = fullEntries.get(0);
+                    assert dexFile != null;
+                    return dexFile;
+                } catch (NotADexFile ex) {
+                    throw new UnsupportedFileTypeException("Entry %s in %s is not a dex file",
+                            fullMatches.get(0), filename);
+                }
+            }
+            if (fullEntries.size() > 1) {
+                // This should be quite rare. This would only happen if an oat file has two entries that differ
+                // only by an initial path separator. e.g. "/blah/blah.dex" and "blah/blah.dex"
+                throw new MultipleMatchingDexEntriesException(String.format(
+                        "Multiple entries in %s match %s: %s", filename, targetEntry,
+                        Joiner.on(", ").join(fullMatches)));
+            }
+
+            if (partialEntries.size() == 0) {
+                throw new DexFileNotFoundException("Could not find a dex entry in %s matching %s",
+                        filename, targetEntry);
+            }
+            if (partialEntries.size() > 1) {
+                throw new MultipleMatchingDexEntriesException(String.format(
+                        "Multiple dex entries in %s match %s: %s", filename, targetEntry,
+                        Joiner.on(", ").join(partialMatches)));
+            }
+            return partialEntries.get(0);
+        }
+    }
+
+    private static class SingletonMultiDexContainer implements MultiDexContainer<DexBackedDexFile> {
+        private final String entryName;
+        private final DexBackedDexFile dexFile;
+
+        public SingletonMultiDexContainer(@Nonnull String entryName, @Nonnull DexBackedDexFile dexFile) {
+            this.entryName = entryName;
+            this.dexFile = dexFile;
+        }
+
+        @Nonnull @Override public List<String> getDexEntryNames() throws IOException {
+            return ImmutableList.of(entryName);
+        }
+
+        @Nullable @Override public DexBackedDexFile getEntry(@Nonnull String entryName) throws IOException {
+            if (entryName.equals(this.entryName)) {
+                return dexFile;
+            }
+            return null;
+        }
+
+        @Nonnull @Override public Opcodes getOpcodes() {
+            return dexFile.getOpcodes();
+        }
+    }
+
+    public static class FilenameVdexProvider implements VdexProvider {
+        private final File vdexFile;
+
+        @Nullable
+        private byte[] buf = null;
+        private boolean loadedVdex = false;
+
+        public FilenameVdexProvider(File oatFile) {
+            File oatParent = oatFile.getAbsoluteFile().getParentFile();
+            String baseName = Files.getNameWithoutExtension(oatFile.getAbsolutePath());
+            vdexFile = new File(oatParent, baseName + ".vdex");
+        }
+
+        @Nullable @Override public byte[] getVdex() {
+            if (!loadedVdex) {
+                if (vdexFile.exists()) {
+                    try {
+                        buf = ByteStreams.toByteArray(new FileInputStream(vdexFile));
+                    } catch (FileNotFoundException e) {
+                        buf = null;
+                    } catch (IOException ex) {
+                        throw new RuntimeException(ex);
+                    }
+                }
+                loadedVdex = true;
+            }
+
+            return buf;
+        }
+    }
 }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/Opcode.java b/dexlib2/src/main/java/org/jf/dexlib2/Opcode.java
index 843550f..60dffa2 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/Opcode.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/Opcode.java
@@ -330,8 +330,6 @@
     public static final int JUMBO_OPCODE = 0x200;
     //if the instruction can initialize an uninitialized object reference
     public static final int CAN_INITIALIZE_REFERENCE = 0x400;
-    //if the instruction is experimental (not potentially supported by Android runtime yet)
-    public static final int EXPERIMENTAL = 0x800;
 
     private static final int ALL_APIS = 0xFFFF0000;
 
@@ -471,10 +469,6 @@
         return (flags & CAN_INITIALIZE_REFERENCE) != 0;
     }
 
-    public final boolean isExperimental() {
-        return (flags & EXPERIMENTAL) != 0;
-    }
-
     private static class VersionConstraint {
         @Nonnull public final Range<Integer> apiRange;
         @Nonnull public final Range<Integer> artVersionRange;
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java b/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java
index a137dee..5f8106d 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/Opcodes.java
@@ -56,41 +56,32 @@
 
     @Nonnull
     public static Opcodes forApi(int api) {
-        return new Opcodes(api, NO_VERSION, false);
-    }
-
-    @Nonnull
-    public static Opcodes forApi(int api, boolean experimental) {
-        return new Opcodes(api, NO_VERSION, experimental);
+        return new Opcodes(api, NO_VERSION);
     }
 
     @Nonnull
     public static Opcodes forArtVersion(int artVersion) {
-        return forArtVersion(artVersion, false);
+        return new Opcodes(NO_VERSION, artVersion);
     }
 
+    /**
+     * @return a default Opcodes instance for when the exact Opcodes to use doesn't matter or isn't known
+     */
     @Nonnull
-    public static Opcodes forArtVersion(int artVersion, boolean experimental) {
-        return new Opcodes(NO_VERSION, artVersion, experimental);
+    public static Opcodes getDefault() {
+        // The last pre-art api
+        return forApi(20);
     }
 
-    @Deprecated
-    public Opcodes(int api) {
-        this(api, false);
-    }
+    private Opcodes(int api, int artVersion) {
 
-    @Deprecated
-    public Opcodes(int api, boolean experimental) {
-        this(api, VersionMap.mapApiToArtVersion(api), experimental);
-    }
 
-    private Opcodes(int api, int artVersion, boolean experimental) {
         if (api >= 21) {
-            this.api = api;
+        this.api = api;
             this.artVersion = mapApiToArtVersion(api);
         } else if (artVersion >= 0 && artVersion < 39) {
             this.api = mapArtVersionToApi(artVersion);
-            this.artVersion = artVersion;
+        this.artVersion = artVersion;
         } else {
             this.api = api;
             this.artVersion = artVersion;
@@ -116,7 +107,7 @@
             }
 
             Short opcodeValue = versionToValueMap.get(version);
-            if (opcodeValue != null && (!opcode.isExperimental() || experimental)) {
+            if (opcodeValue != null) {
                 if (!opcode.format.isPayloadFormat) {
                     opcodesByValue[opcodeValue] = opcode;
                 }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/AnalyzedInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/AnalyzedInstruction.java
index 55f1ddc..1a9b9ad 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/AnalyzedInstruction.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/AnalyzedInstruction.java
@@ -32,12 +32,14 @@
 package org.jf.dexlib2.analysis;
 
 import com.google.common.base.Objects;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import org.jf.dexlib2.Opcode;
 import org.jf.dexlib2.iface.instruction.*;
 import org.jf.dexlib2.iface.instruction.formats.Instruction22c;
 import org.jf.dexlib2.iface.reference.MethodReference;
 import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.iface.reference.TypeReference;
 import org.jf.util.ExceptionWithContext;
 
 import javax.annotation.Nonnull;
@@ -54,7 +56,7 @@
     /**
      * The actual instruction
      */
-    @Nullable
+    @Nonnull
     protected Instruction instruction;
 
     /**
@@ -65,21 +67,25 @@
     /**
      * Instructions that can pass on execution to this one during normal execution
      */
+    @Nonnull
     protected final TreeSet<AnalyzedInstruction> predecessors = new TreeSet<AnalyzedInstruction>();
 
     /**
      * Instructions that can execution could pass on to next during normal execution
      */
+    @Nonnull
     protected final LinkedList<AnalyzedInstruction> successors = new LinkedList<AnalyzedInstruction>();
 
     /**
      * This contains the register types *before* the instruction has executed
      */
+    @Nonnull
     protected final RegisterType[] preRegisterMap;
 
     /**
      * This contains the register types *after* the instruction has executed
      */
+    @Nonnull
     protected final RegisterType[] postRegisterMap;
 
     /**
@@ -94,8 +100,8 @@
      */
     protected final Instruction originalInstruction;
 
-    public AnalyzedInstruction(MethodAnalyzer methodAnalyzer, Instruction instruction, int instructionIndex,
-                               int registerCount) {
+    public AnalyzedInstruction(@Nonnull MethodAnalyzer methodAnalyzer, @Nonnull Instruction instruction,
+                               int instructionIndex, int registerCount) {
         this.methodAnalyzer = methodAnalyzer;
         this.instruction = instruction;
         this.originalInstruction = instruction;
@@ -150,18 +156,17 @@
         instruction = originalInstruction;
     }
 
-    public int getSuccessorCount() {
-        return successors.size();
-    }
-
-    public List<AnalyzedInstruction> getSuccesors() {
+    @Nonnull
+    public List<AnalyzedInstruction> getSuccessors() {
         return Collections.unmodifiableList(successors);
     }
 
+    @Nonnull
     public Instruction getInstruction() {
         return instruction;
     }
 
+    @Nonnull
     public Instruction getOriginalInstruction() {
         return originalInstruction;
     }
@@ -184,11 +189,7 @@
         if (predecessors.size() == 0) {
             return false;
         }
-
-        if (predecessors.first().instructionIndex == -1) {
-            return true;
-        }
-        return false;
+        return predecessors.first().instructionIndex == -1;
     }
 
     /*
@@ -237,6 +238,7 @@
      * @param registerNumber the register number
      * @return The register type resulting from merging the post-instruction register types from all predecessors
      */
+    @Nonnull
     protected RegisterType getMergedPreRegisterTypeFromPredecessors(int registerNumber) {
         RegisterType mergedRegisterType = null;
         for (AnalyzedInstruction predecessor: predecessors) {
@@ -249,6 +251,10 @@
                 }
             }
         }
+        if (mergedRegisterType == null) {
+            // This is a start-of-method or unreachable instruction.
+            throw new IllegalStateException();
+        }
         return mergedRegisterType;
     }
     /**
@@ -275,10 +281,10 @@
      *
      * This is used to set the register type for only one branch from a conditional jump.
      *
-     * @param predecessor Which predecessor is being overriden
-     * @param registerNumber The register number of the register being overriden
+     * @param predecessor Which predecessor is being overridden
+     * @param registerNumber The register number of the register being overridden
      * @param registerType The overridden register type
-     * @param verifiedInstructions
+     * @param verifiedInstructions A bit vector of instructions that have been verified
      *
      * @return true if the post-instruction register type for this instruction changed as a result of this override
      */
@@ -308,8 +314,8 @@
         return false;
     }
 
-    protected boolean isInvokeInit() {
-        if (instruction == null || !instruction.getOpcode().canInitializeReference()) {
+    public boolean isInvokeInit() {
+        if (!instruction.getOpcode().canInitializeReference()) {
             return false;
         }
 
@@ -323,23 +329,26 @@
         return false;
     }
 
-    public boolean setsRegister() {
-        return instruction.getOpcode().setsRegister();
-    }
-
-    public boolean setsWideRegister() {
-        return instruction.getOpcode().setsWideRegister();
-    }
-
+    /**
+     * Determines if this instruction sets the given register, or alters its type
+     *
+     * @param registerNumber The register to check
+     * @return true if this instruction sets the given register or alters its type
+     */
     public boolean setsRegister(int registerNumber) {
-        //When constructing a new object, the register type will be an uninitialized reference after the new-instance
-        //instruction, but becomes an initialized reference once the <init> method is called. So even though invoke
-        //instructions don't normally change any registers, calling an <init> method will change the type of its
-        //object register. If the uninitialized reference has been copied to other registers, they will be initialized
-        //as well, so we need to check for that too
+        // This method could be implemented by calling getSetRegisters and checking if registerNumber is in the result
+        // However, this is a frequently called method, and this is a more efficient implementation, because it doesn't
+        // allocate a new list, and it can potentially exit earlier
+
         if (isInvokeInit()) {
+            // When constructing a new object, the register type will be an uninitialized reference after the
+            // new-instance instruction, but becomes an initialized reference once the <init> method is called. So even
+            // though invoke instructions don't normally change any registers, calling an <init> method will change the
+            // type of its object register. If the uninitialized reference has been copied to other registers, they will
+            // be initialized as well, so we need to check for that too
             int destinationRegister;
             if (instruction instanceof FiveRegisterInstruction) {
+                assert ((FiveRegisterInstruction)instruction).getRegisterCount() > 0;
                 destinationRegister = ((FiveRegisterInstruction)instruction).getRegisterC();
             } else {
                 assert instruction instanceof RegisterRangeInstruction;
@@ -348,34 +357,107 @@
                 destinationRegister = rangeInstruction.getStartRegister();
             }
 
+            RegisterType preInstructionDestRegisterType = getPreInstructionRegisterType(destinationRegister);
+            if (preInstructionDestRegisterType.category == RegisterType.UNKNOWN) {
+                // We never let an uninitialized reference propagate past an invoke-init if the object register type is
+                // unknown This is because the uninitialized reference may be an alias to the reference being
+                // initialized, but we can't know that until the object register's type is known
+                RegisterType preInstructionRegisterType = getPreInstructionRegisterType(registerNumber);
+                if (preInstructionRegisterType.category == RegisterType.UNINIT_REF ||
+                        preInstructionRegisterType.category == RegisterType.UNINIT_THIS) {
+                    return true;
+                }
+            }
+
+            if (preInstructionDestRegisterType.category != RegisterType.UNINIT_REF &&
+                    preInstructionDestRegisterType.category != RegisterType.UNINIT_THIS) {
+                return false;
+            }
+
             if (registerNumber == destinationRegister) {
                 return true;
             }
-            RegisterType preInstructionDestRegisterType = getPreInstructionRegisterType(registerNumber);
-            if (preInstructionDestRegisterType.category != RegisterType.UNINIT_REF &&
-                preInstructionDestRegisterType.category != RegisterType.UNINIT_THIS) {
 
-                return false;
-            }
             //check if the uninit ref has been copied to another register
-            if (getPreInstructionRegisterType(registerNumber).equals(preInstructionDestRegisterType)) {
-                return true;
-            }
-            return false;
+            return preInstructionDestRegisterType.equals(getPreInstructionRegisterType(registerNumber));
         }
 
-        if (instruction.getOpcode() == Opcode.IF_EQZ || instruction.getOpcode() == Opcode.IF_NEZ) {
-            AnalyzedInstruction previousInstruction = getPreviousInstruction();
-            if (previousInstruction != null &&
-                    previousInstruction.instruction != null &&
-                    previousInstruction.instruction.getOpcode() == Opcode.INSTANCE_OF &&
-                    registerNumber == ((Instruction22c)previousInstruction.instruction).getRegisterB() &&
-                    MethodAnalyzer.canNarrowAfterInstanceOf(previousInstruction, this, methodAnalyzer.getClassPath())) {
-                return true;
+        // On art, the optimizer will often nop out a check-cast instruction after an instance-of instruction.
+        // Normally, check-cast is where the register type actually changes.
+        // In order to correctly handle this case, we have to propagate the narrowed register type to the appropriate
+        // branch of the following if-eqz/if-nez
+        if (instructionIndex > 0 &&
+                methodAnalyzer.getClassPath().isArt() &&
+                getPredecessorCount() == 1 &&
+                (instruction.getOpcode() == Opcode.IF_EQZ || instruction.getOpcode() == Opcode.IF_NEZ)) {
+
+            AnalyzedInstruction prevInstruction = predecessors.first();
+            if (prevInstruction.instruction.getOpcode() == Opcode.INSTANCE_OF &&
+                    MethodAnalyzer.canPropagateTypeAfterInstanceOf(
+                            prevInstruction, this, methodAnalyzer.getClassPath())) {
+                Instruction22c instanceOfInstruction = (Instruction22c)prevInstruction.instruction;
+
+                if (registerNumber == instanceOfInstruction.getRegisterB()) {
+                    return true;
+                }
+
+                // Additionally, there may be a move instruction just before the instance-of, in order to put the value
+                // into a register that is addressable by the instance-of. In this case, we also need to propagate the
+                // new register type for the original register that the value was moved from.
+                // In some cases, the instance-of may have multiple predecessors. In this case, we should only do the
+                // propagation if all predecessors are move-object instructions for the same source register
+                // TODO: do we need to do some sort of additional check that these multiple move-object predecessors actually refer to the same value?
+                if (instructionIndex > 1) {
+                    int originalSourceRegister = -1;
+
+                    RegisterType newType = null;
+
+                    for (AnalyzedInstruction prevPrevAnalyzedInstruction : prevInstruction.predecessors) {
+                        Opcode opcode = prevPrevAnalyzedInstruction.instruction.getOpcode();
+                        if (opcode == Opcode.MOVE_OBJECT || opcode == Opcode.MOVE_OBJECT_16 ||
+                                opcode == Opcode.MOVE_OBJECT_FROM16) {
+                            TwoRegisterInstruction moveInstruction =
+                                    ((TwoRegisterInstruction)prevPrevAnalyzedInstruction.instruction);
+                            RegisterType originalType =
+                                    prevPrevAnalyzedInstruction.getPostInstructionRegisterType(
+                                            moveInstruction.getRegisterB());
+                            if (moveInstruction.getRegisterA() != instanceOfInstruction.getRegisterB()) {
+                                originalSourceRegister = -1;
+                                break;
+                            }
+                            if (originalType.type == null) {
+                                originalSourceRegister = -1;
+                                break;
+                            }
+
+                            if (newType == null) {
+                                newType = RegisterType.getRegisterType(methodAnalyzer.getClassPath(),
+                                        (TypeReference)instanceOfInstruction.getReference());
+                            }
+
+                            if (MethodAnalyzer.isNotWideningConversion(originalType, newType)) {
+                                if (originalSourceRegister != -1) {
+                                    if (originalSourceRegister != moveInstruction.getRegisterB()) {
+                                        originalSourceRegister = -1;
+                                        break;
+                                    }
+                                } else {
+                                    originalSourceRegister = moveInstruction.getRegisterB();
+                                }
+                            }
+                        } else {
+                            originalSourceRegister = -1;
+                            break;
+                        }
+                    }
+                    if (originalSourceRegister != -1 && registerNumber == originalSourceRegister) {
+                        return true;
+                    }
+                }
             }
         }
 
-        if (!setsRegister()) {
+        if (!instruction.getOpcode().setsRegister()) {
             return false;
         }
         int destinationRegister = getDestinationRegister();
@@ -383,20 +465,151 @@
         if (registerNumber == destinationRegister) {
             return true;
         }
-        if (setsWideRegister() && registerNumber == (destinationRegister + 1)) {
+        if (instruction.getOpcode().setsWideRegister() && registerNumber == (destinationRegister + 1)) {
             return true;
         }
         return false;
     }
 
-    @Nullable
-    private AnalyzedInstruction getPreviousInstruction() {
-        for (AnalyzedInstruction predecessor: predecessors) {
-            if (predecessor.getInstructionIndex() == getInstructionIndex() - 1) {
-                return predecessor;
+    public List<Integer> getSetRegisters() {
+        List<Integer> setRegisters = Lists.newArrayList();
+
+        if (instruction.getOpcode().setsRegister()) {
+            setRegisters.add(getDestinationRegister());
+        }
+        if (instruction.getOpcode().setsWideRegister()) {
+            setRegisters.add(getDestinationRegister() + 1);
+        }
+
+        if (isInvokeInit()) {
+            //When constructing a new object, the register type will be an uninitialized reference after the new-instance
+            //instruction, but becomes an initialized reference once the <init> method is called. So even though invoke
+            //instructions don't normally change any registers, calling an <init> method will change the type of its
+            //object register. If the uninitialized reference has been copied to other registers, they will be initialized
+            //as well, so we need to check for that too
+
+            int destinationRegister;
+            if (instruction instanceof FiveRegisterInstruction) {
+                destinationRegister = ((FiveRegisterInstruction)instruction).getRegisterC();
+                assert ((FiveRegisterInstruction)instruction).getRegisterCount() > 0;
+            } else {
+                assert instruction instanceof RegisterRangeInstruction;
+                RegisterRangeInstruction rangeInstruction = (RegisterRangeInstruction)instruction;
+                assert rangeInstruction.getRegisterCount() > 0;
+                destinationRegister = rangeInstruction.getStartRegister();
+            }
+
+            RegisterType preInstructionDestRegisterType = getPreInstructionRegisterType(destinationRegister);
+            if (preInstructionDestRegisterType.category == RegisterType.UNINIT_REF ||
+                    preInstructionDestRegisterType.category == RegisterType.UNINIT_THIS) {
+                setRegisters.add(destinationRegister);
+
+                RegisterType objectRegisterType = preRegisterMap[destinationRegister];
+                for (int i = 0; i < preRegisterMap.length; i++) {
+                    if (i == destinationRegister) {
+                        continue;
+                    }
+
+                    RegisterType preInstructionRegisterType = preRegisterMap[i];
+
+                    if (preInstructionRegisterType.equals(objectRegisterType)) {
+                        setRegisters.add(i);
+                    } else if (preInstructionRegisterType.category == RegisterType.UNINIT_REF ||
+                            preInstructionRegisterType.category == RegisterType.UNINIT_THIS) {
+                        RegisterType postInstructionRegisterType = postRegisterMap[i];
+                        if (postInstructionRegisterType.category == RegisterType.UNKNOWN) {
+                            setRegisters.add(i);
+                        }
+                    }
+                }
+            } else if (preInstructionDestRegisterType.category == RegisterType.UNKNOWN) {
+                // We never let an uninitialized reference propagate past an invoke-init if the object register type is
+                // unknown This is because the uninitialized reference may be an alias to the reference being
+                // initialized, but we can't know that until the object register's type is known
+
+                for (int i = 0; i < preRegisterMap.length; i++) {
+                    RegisterType registerType = preRegisterMap[i];
+                    if (registerType.category == RegisterType.UNINIT_REF ||
+                            registerType.category == RegisterType.UNINIT_THIS) {
+                        setRegisters.add(i);
+                    }
+                }
             }
         }
-        return null;
+
+        // On art, the optimizer will often nop out a check-cast instruction after an instance-of instruction.
+        // Normally, check-cast is where the register type actually changes.
+        // In order to correctly handle this case, we have to propagate the narrowed register type to the appropriate
+        // branch of the following if-eqz/if-nez
+        if (instructionIndex > 0 &&
+                methodAnalyzer.getClassPath().isArt() &&
+                getPredecessorCount() == 1 &&
+                (instruction.getOpcode() == Opcode.IF_EQZ || instruction.getOpcode() == Opcode.IF_NEZ)) {
+
+            AnalyzedInstruction prevInstruction = predecessors.first();
+            if (prevInstruction.instruction.getOpcode() == Opcode.INSTANCE_OF &&
+                    MethodAnalyzer.canPropagateTypeAfterInstanceOf(
+                            prevInstruction, this, methodAnalyzer.getClassPath())) {
+                Instruction22c instanceOfInstruction = (Instruction22c)prevInstruction.instruction;
+                setRegisters.add(instanceOfInstruction.getRegisterB());
+
+                // Additionally, there may be a move instruction just before the instance-of, in order to put the value
+                // into a register that is addressable by the instance-of. In this case, we also need to propagate the
+                // new register type for the original register that the value was moved from.
+                // In some cases, the instance-of may have multiple predecessors. In this case, we should only do the
+                // propagation if all predecessors are move-object instructions for the same source register
+                // TODO: do we need to do some sort of additional check that these multiple move-object predecessors actually refer to the same value?
+                if (instructionIndex > 1) {
+                    int originalSourceRegister = -1;
+
+                    RegisterType newType = null;
+
+                    for (AnalyzedInstruction prevPrevAnalyzedInstruction : prevInstruction.predecessors) {
+                        Opcode opcode = prevPrevAnalyzedInstruction.instruction.getOpcode();
+                        if (opcode == Opcode.MOVE_OBJECT || opcode == Opcode.MOVE_OBJECT_16 ||
+                                opcode == Opcode.MOVE_OBJECT_FROM16) {
+                            TwoRegisterInstruction moveInstruction =
+                                    ((TwoRegisterInstruction)prevPrevAnalyzedInstruction.instruction);
+                            RegisterType originalType =
+                                    prevPrevAnalyzedInstruction.getPostInstructionRegisterType(
+                                            moveInstruction.getRegisterB());
+                            if (moveInstruction.getRegisterA() != instanceOfInstruction.getRegisterB()) {
+                                originalSourceRegister = -1;
+                                break;
+                            }
+                            if (originalType.type == null) {
+                                originalSourceRegister = -1;
+                                break;
+                            }
+
+                            if (newType == null) {
+                                newType = RegisterType.getRegisterType(methodAnalyzer.getClassPath(),
+                                        (TypeReference)instanceOfInstruction.getReference());
+                            }
+
+                            if (MethodAnalyzer.isNotWideningConversion(originalType, newType)) {
+                                if (originalSourceRegister != -1) {
+                                    if (originalSourceRegister != moveInstruction.getRegisterB()) {
+                                        originalSourceRegister = -1;
+                                        break;
+                                    }
+                                } else {
+                                    originalSourceRegister = moveInstruction.getRegisterB();
+                                }
+                            }
+                        } else {
+                            originalSourceRegister = -1;
+                            break;
+                        }
+                    }
+                    if (originalSourceRegister != -1) {
+                        setRegisters.add(originalSourceRegister);
+                    }
+                }
+            }
+        }
+
+        return setRegisters;
     }
 
     public int getDestinationRegister() {
@@ -421,7 +634,7 @@
         return preRegisterMap[registerNumber];
     }
 
-    public int compareTo(AnalyzedInstruction analyzedInstruction) {
+    public int compareTo(@Nonnull AnalyzedInstruction analyzedInstruction) {
         if (instructionIndex < analyzedInstruction.instructionIndex) {
             return -1;
         } else if (instructionIndex == analyzedInstruction.instructionIndex) {
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java
index 9f9e396..48bf618 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java
@@ -36,28 +36,18 @@
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
-import org.jf.dexlib2.DexFileFactory;
-import org.jf.dexlib2.DexFileFactory.DexFileNotFound;
-import org.jf.dexlib2.DexFileFactory.MultipleDexFilesException;
 import org.jf.dexlib2.Opcodes;
 import org.jf.dexlib2.analysis.reflection.ReflectionClassDef;
-import org.jf.dexlib2.dexbacked.OatFile.OatDexFile;
 import org.jf.dexlib2.iface.ClassDef;
-import org.jf.dexlib2.iface.DexFile;
 import org.jf.dexlib2.immutable.ImmutableDexFile;
-import org.jf.util.ExceptionWithContext;
 
 import javax.annotation.Nonnull;
-import java.io.File;
 import java.io.IOException;
 import java.io.Serializable;
 import java.util.Arrays;
 import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 public class ClassPath {
     @Nonnull private final TypeProto unknownClass;
@@ -70,8 +60,8 @@
     /**
      * Creates a new ClassPath instance that can load classes from the given providers
      *
-     * @param classProviders An iterable of ClassProviders. When loading a class, these providers will be searched in
-     *                       order
+     * @param classProviders A varargs array of ClassProviders. When loading a class, these providers will be searched
+     *                       in order
      */
     public ClassPath(ClassProvider... classProviders) throws IOException {
         this(Arrays.asList(classProviders), false, NOT_ART);
@@ -82,6 +72,16 @@
      *
      * @param classProviders An iterable of ClassProviders. When loading a class, these providers will be searched in
      *                       order
+     */
+    public ClassPath(Iterable<ClassProvider> classProviders) throws IOException {
+        this(classProviders, false, NOT_ART);
+    }
+
+    /**
+     * Creates a new ClassPath instance that can load classes from the given providers
+     *
+     * @param classProviders An iterable of ClassProviders. When loading a class, these providers will be searched in
+     *                       order
      * @param checkPackagePrivateAccess Whether checkPackagePrivateAccess is needed, enabled for ONLY early API 17 by
      *                                  default
      * @param oatVersion The applicable oat version, or NOT_ART
@@ -114,7 +114,7 @@
 
     private static ClassProvider getBasicClasses() {
         // fallbacks for some special classes that we assume are present
-        return new DexClassProvider(new ImmutableDexFile(Opcodes.forApi(19), ImmutableSet.of(
+        return new DexClassProvider(new ImmutableDexFile(Opcodes.getDefault(), ImmutableSet.of(
                 new ReflectionClassDef(Class.class),
                 new ReflectionClassDef(Cloneable.class),
                 new ReflectionClassDef(Object.class),
@@ -164,119 +164,6 @@
         return checkPackagePrivateAccess;
     }
 
-    @Nonnull
-    public static ClassPath fromClassPath(Iterable<String> classPathDirs, Iterable<String> classPath, DexFile dexFile,
-                                          int api, boolean experimental) {
-        return fromClassPath(classPathDirs, classPath, dexFile, api, api == 17, experimental);
-    }
-
-    @Nonnull
-    public static ClassPath fromClassPath(Iterable<String> classPathDirs, Iterable<String> classPath, DexFile dexFile,
-                                          int api, boolean checkPackagePrivateAccess, boolean experimental) {
-        List<ClassProvider> providers = Lists.newArrayList();
-
-        int oatVersion = NOT_ART;
-
-        for (String classPathEntry: classPath) {
-            List<? extends DexFile> classPathDexFiles =
-                    loadClassPathEntry(classPathDirs, classPathEntry, api, experimental);
-            if (oatVersion == NOT_ART) {
-                for (DexFile classPathDexFile: classPathDexFiles) {
-                    if (classPathDexFile instanceof OatDexFile) {
-                        oatVersion = ((OatDexFile)classPathDexFile).getOatVersion();
-                        break;
-                    }
-                }
-            }
-            for (DexFile classPathDexFile: classPathDexFiles) {
-                providers.add(new DexClassProvider(classPathDexFile));
-            }
-        }
-        providers.add(new DexClassProvider(dexFile));
-        return new ClassPath(providers, checkPackagePrivateAccess, oatVersion);
-    }
-
-    @Nonnull
-    public static ClassPath fromClassPath(Iterable<String> classPathDirs, Iterable<String> classPath, DexFile dexFile,
-                                          int api, boolean checkPackagePrivateAccess, boolean experimental,
-                                          int oatVersion) {
-        List<ClassProvider> providers = Lists.newArrayList();
-
-        for (String classPathEntry: classPath) {
-            List<? extends DexFile> classPathDexFiles =
-                    loadClassPathEntry(classPathDirs, classPathEntry, api, experimental);
-            for (DexFile classPathDexFile: classPathDexFiles) {
-                providers.add(new DexClassProvider(classPathDexFile));
-            }
-        }
-        providers.add(new DexClassProvider(dexFile));
-        return new ClassPath(providers, checkPackagePrivateAccess, oatVersion);
-    }
-
-    private static final Pattern dalvikCacheOdexPattern = Pattern.compile("@([^@]+)@classes.dex$");
-
-    @Nonnull
-    private static List<? extends DexFile> loadClassPathEntry(@Nonnull Iterable<String> classPathDirs,
-                                                              @Nonnull String bootClassPathEntry, int api,
-                                                              boolean experimental) {
-        File rawEntry = new File(bootClassPathEntry);
-        // strip off the path - we only care about the filename
-        String entryName = rawEntry.getName();
-
-        // if it's a dalvik-cache entry, grab the name of the jar/apk
-        if (entryName.endsWith("@classes.dex")) {
-            Matcher m = dalvikCacheOdexPattern.matcher(entryName);
-
-            if (!m.find()) {
-                throw new ExceptionWithContext(String.format("Cannot parse dependency value %s", bootClassPathEntry));
-            }
-
-            entryName = m.group(1);
-        }
-
-        int extIndex = entryName.lastIndexOf(".");
-
-        String baseEntryName;
-        if (extIndex == -1) {
-            baseEntryName = entryName;
-        } else {
-            baseEntryName = entryName.substring(0, extIndex);
-        }
-
-        for (String classPathDir: classPathDirs) {
-            String[] extensions;
-
-            if (entryName.endsWith(".oat")) {
-                extensions = new String[] { ".oat" };
-            } else {
-                extensions = new String[] { "", ".odex", ".jar", ".apk", ".zip" };
-            }
-
-            for (String ext: extensions) {
-                File file = new File(classPathDir, baseEntryName + ext);
-
-                if (file.exists() && file.isFile()) {
-                    if (!file.canRead()) {
-                        System.err.println(String.format(
-                                "warning: cannot open %s for reading. Will continue looking.", file.getPath()));
-                    } else {
-                        try {
-                            return ImmutableList.of(DexFileFactory.loadDexFile(file, api, experimental));
-                        } catch (DexFileNotFound ex) {
-                            // ignore and continue
-                        } catch (MultipleDexFilesException ex) {
-                            return ex.oatFile.getDexFiles();
-                        } catch (Exception ex) {
-                            throw ExceptionWithContext.withContext(ex,
-                                    "Error while reading boot class path entry \"%s\"", bootClassPathEntry);
-                        }
-                    }
-                }
-            }
-        }
-        throw new ExceptionWithContext("Cannot locate boot class path file %s", bootClassPathEntry);
-    }
-
     private final Supplier<OdexedFieldInstructionMapper> fieldInstructionMapperSupplier = Suppliers.memoize(
             new Supplier<OdexedFieldInstructionMapper>() {
                 @Override public OdexedFieldInstructionMapper get() {
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPathResolver.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPathResolver.java
new file mode 100644
index 0000000..10daa56
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPathResolver.java
@@ -0,0 +1,465 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import com.beust.jcommander.internal.Sets;
+import com.google.common.base.Joiner;
+import com.google.common.base.Splitter;
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.DexFileFactory;
+import org.jf.dexlib2.DexFileFactory.UnsupportedFileTypeException;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexBackedOdexFile;
+import org.jf.dexlib2.dexbacked.OatFile;
+import org.jf.dexlib2.dexbacked.OatFile.OatDexFile;
+import org.jf.dexlib2.iface.DexFile;
+import org.jf.dexlib2.iface.MultiDexContainer;
+import org.jf.dexlib2.iface.MultiDexContainer.MultiDexFile;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Set;
+
+public class ClassPathResolver {
+    private final Iterable<String> classPathDirs;
+    private final Opcodes opcodes;
+
+    private final Set<File> loadedFiles = Sets.newHashSet();
+    private final List<ClassProvider> classProviders = Lists.newArrayList();
+
+    /**
+     * Constructs a new ClassPathResolver using a specified list of bootclasspath entries
+     *
+     * @param bootClassPathDirs A list of directories to search for boot classpath entries. Can be empty if all boot
+     *                          classpath entries are specified as local paths
+     * @param bootClassPathEntries A list of boot classpath entries to load. These can either be local paths, or
+     *                             device paths (e.g. "/system/framework/framework.jar"). The entry will be interpreted
+     *                             first as a local path. If not found as a local path, it will be interpreted as a
+     *                             partial or absolute device path, and will be searched for in bootClassPathDirs
+     * @param extraClassPathEntries A list of additional classpath entries to load. Can be empty. All entries must be
+     *                              local paths. Device paths are not supported.
+     * @param dexFile The dex file that the classpath will be used to analyze
+     * @throws IOException If any IOException occurs
+     * @throws ResolveException If any classpath entries cannot be loaded for some reason
+     *
+     *  If null, a default bootclasspath is used,
+     *                             depending on the the file type of dexFile and the api level. If empty, no boot
+     *                             classpath entries will be loaded
+     */
+    public ClassPathResolver(@Nonnull List<String> bootClassPathDirs, @Nonnull List<String> bootClassPathEntries,
+                             @Nonnull List<String> extraClassPathEntries, @Nonnull DexFile dexFile)
+            throws IOException {
+        this(bootClassPathDirs, bootClassPathEntries, extraClassPathEntries, dexFile, true);
+    }
+
+    /**
+     * Constructs a new ClassPathResolver using a default list of bootclasspath entries
+     *
+     * @param bootClassPathDirs A list of directories to search for boot classpath entries
+     * @param extraClassPathEntries A list of additional classpath entries to load. Can be empty. All entries must be
+     *                              local paths. Device paths are not supported.
+     * @param dexFile The dex file that the classpath will be used to analyze
+     * @throws IOException If any IOException occurs
+     * @throws ResolveException If any classpath entries cannot be loaded for some reason
+     *
+     *  If null, a default bootclasspath is used,
+     *                             depending on the the file type of dexFile and the api level. If empty, no boot
+     *                             classpath entries will be loaded
+     */
+    public ClassPathResolver(@Nonnull List<String> bootClassPathDirs, @Nonnull List<String> extraClassPathEntries,
+                             @Nonnull DexFile dexFile)
+            throws IOException {
+        this(bootClassPathDirs, null, extraClassPathEntries, dexFile, true);
+    }
+
+    private ClassPathResolver(@Nonnull List<String> bootClassPathDirs, @Nullable List<String> bootClassPathEntries,
+                              @Nonnull List<String> extraClassPathEntries, @Nonnull DexFile dexFile, boolean unused)
+            throws IOException {
+        this.classPathDirs = bootClassPathDirs;
+        opcodes = dexFile.getOpcodes();
+
+        if (bootClassPathEntries == null) {
+            bootClassPathEntries = getDefaultBootClassPath(dexFile, opcodes.api);
+        }
+
+        for (String entry : bootClassPathEntries) {
+            try {
+                loadLocalOrDeviceBootClassPathEntry(entry);
+            } catch (NoDexException ex) {
+                if (entry.endsWith(".jar")) {
+                    String odexEntry = entry.substring(0, entry.length() - 4) + ".odex";
+                    try {
+                        loadLocalOrDeviceBootClassPathEntry(odexEntry);
+                    } catch (NoDexException ex2) {
+                        throw new ResolveException("Neither %s nor %s contain a dex file", entry, odexEntry);
+                    } catch (NotFoundException ex2) {
+                        throw new ResolveException(ex);
+                    }
+                } else {
+                    throw new ResolveException(ex);
+                }
+            } catch (NotFoundException ex) {
+                if (entry.endsWith(".odex")) {
+                    String jarEntry = entry.substring(0, entry.length() - 5) + ".jar";
+                    try {
+                        loadLocalOrDeviceBootClassPathEntry(jarEntry);
+                        } catch (NoDexException ex2) {
+                        throw new ResolveException("Neither %s nor %s contain a dex file", entry, jarEntry);
+                    } catch (NotFoundException ex2) {
+                        throw new ResolveException(ex);
+                    }
+                } else {
+                    throw new ResolveException(ex);
+                }
+            }
+        }
+
+        for (String entry: extraClassPathEntries) {
+            // extra classpath entries must be specified using a local path, so we don't need to do the search through
+            // bootClassPathDirs
+            try {
+                loadLocalClassPathEntry(entry);
+            } catch (NoDexException ex) {
+                throw new ResolveException(ex);
+            }
+        }
+
+        if (dexFile instanceof MultiDexContainer.MultiDexFile) {
+            MultiDexContainer<? extends MultiDexFile> container = ((MultiDexFile)dexFile).getContainer();
+            for (String entry: container.getDexEntryNames()) {
+                classProviders.add(new DexClassProvider(container.getEntry(entry)));
+            }
+        } else {
+            classProviders.add(new DexClassProvider(dexFile));
+        }
+    }
+
+    @Nonnull
+    public List<ClassProvider> getResolvedClassProviders() {
+        return classProviders;
+    }
+
+    private boolean loadLocalClassPathEntry(@Nonnull String entry) throws NoDexException, IOException {
+        File entryFile = new File(entry);
+        if (entryFile.exists() && entryFile.isFile()) {
+            try {
+                loadEntry(entryFile, true);
+                return true;
+            } catch (UnsupportedFileTypeException ex) {
+                throw new ResolveException(ex, "Couldn't load classpath entry %s", entry);
+            }
+        }
+        return false;
+    }
+
+    private void loadLocalOrDeviceBootClassPathEntry(@Nonnull String entry)
+            throws IOException, NoDexException, NotFoundException {
+        // first, see if the entry is a valid local path
+        if (loadLocalClassPathEntry(entry)) {
+            return;
+        }
+
+        // It's not a local path, so let's try to resolve it as a device path, relative to one of the provided
+        // directories
+        List<String> pathComponents = splitDevicePath(entry);
+        Joiner pathJoiner = Joiner.on(File.pathSeparatorChar);
+
+        for (String directory: classPathDirs) {
+            File directoryFile = new File(directory);
+            if (!directoryFile.exists()) {
+                continue;
+            }
+
+            for (int i=0; i<pathComponents.size(); i++) {
+                String partialPath = pathJoiner.join(pathComponents.subList(i, pathComponents.size()));
+                File entryFile = new File(directoryFile, partialPath);
+                if (entryFile.exists() && entryFile.isFile()) {
+                    loadEntry(entryFile, true);
+                    return;
+                }
+            }
+        }
+
+        throw new NotFoundException("Could not find classpath entry %s", entry);
+    }
+
+    private void loadEntry(@Nonnull File entryFile, boolean loadOatDependencies)
+            throws IOException, NoDexException {
+        if (loadedFiles.contains(entryFile)) {
+            return;
+        }
+
+        MultiDexContainer<? extends DexBackedDexFile> container;
+        try {
+            container = DexFileFactory.loadDexContainer(entryFile, opcodes);
+        } catch (UnsupportedFileTypeException ex) {
+            throw new ResolveException(ex);
+        }
+
+        List<String> entryNames = container.getDexEntryNames();
+
+        if (entryNames.size() == 0) {
+            throw new NoDexException("%s contains no dex file", entryFile);
+        }
+
+        loadedFiles.add(entryFile);
+
+        for (String entryName: entryNames) {
+            classProviders.add(new DexClassProvider(container.getEntry(entryName)));
+        }
+
+        if (loadOatDependencies && container instanceof OatFile) {
+            List<String> oatDependencies = ((OatFile)container).getBootClassPath();
+            if (!oatDependencies.isEmpty()) {
+                try {
+                    loadOatDependencies(entryFile.getParentFile(), oatDependencies);
+                } catch (NotFoundException ex) {
+                    throw new ResolveException(ex, "Error while loading oat file %s", entryFile);
+                } catch (NoDexException ex) {
+                    throw new ResolveException(ex, "Error while loading dependencies for oat file %s", entryFile);
+                }
+            }
+        }
+    }
+
+    @Nonnull
+    private static List<String> splitDevicePath(@Nonnull String path) {
+        return Lists.newArrayList(Splitter.on('/').split(path));
+    }
+
+    private void loadOatDependencies(@Nonnull File directory, @Nonnull List<String> oatDependencies)
+            throws IOException, NoDexException, NotFoundException {
+        // We assume that all oat dependencies are located in the same directory as the oat file
+        for (String oatDependency: oatDependencies) {
+            String oatDependencyName = getFilenameForOatDependency(oatDependency);
+            File file = new File(directory, oatDependencyName);
+            if (!file.exists()) {
+                throw new NotFoundException("Cannot find dependency %s in %s", oatDependencyName, directory);
+            }
+
+            loadEntry(file, false);
+        }
+    }
+
+    @Nonnull
+    private String getFilenameForOatDependency(String oatDependency) {
+        int index = oatDependency.lastIndexOf('/');
+
+        String dependencyLeaf = oatDependency.substring(index+1);
+        if (dependencyLeaf.endsWith(".art")) {
+            return dependencyLeaf.substring(0, dependencyLeaf.length() - 4) + ".oat";
+        }
+        return dependencyLeaf;
+    }
+
+    private static class NotFoundException extends Exception {
+        public NotFoundException(String message, Object... formatArgs) {
+            super(String.format(message, formatArgs));
+        }
+    }
+    
+    private static class NoDexException extends Exception {
+        public NoDexException(String message, Object... formatArgs) {
+            super(String.format(message, formatArgs));
+        }
+    }
+
+    /**
+     * An error that occurred while resolving the classpath
+     */
+    public static class ResolveException extends RuntimeException {
+        public ResolveException (String message, Object... formatArgs) {
+            super(String.format(message, formatArgs));
+        }
+
+        public ResolveException (Throwable cause) {
+            super(cause);
+        }
+
+        public ResolveException (Throwable cause, String message, Object... formatArgs) {
+            super(String.format(message, formatArgs), cause);
+        }
+    }
+
+    /**
+     * Returns the default boot class path for the given dex file and api level.
+     */
+    @Nonnull
+    private static List<String> getDefaultBootClassPath(@Nonnull DexFile dexFile, int apiLevel) {
+        if (dexFile instanceof OatFile.OatDexFile) {
+            List<String> bcp = ((OatDexFile)dexFile).getContainer().getBootClassPath();
+            if (!bcp.isEmpty()) {
+                for (int i=0; i<bcp.size(); i++) {
+                    String entry = bcp.get(i);
+                    if (entry.endsWith(".art")) {
+                        bcp.set(i, entry.substring(0, entry.length() - 4) + ".oat");
+                    }
+                }
+                return bcp;
+            }
+            return Lists.newArrayList("boot.oat");
+        }
+
+        if (dexFile instanceof DexBackedOdexFile) {
+            return ((DexBackedOdexFile)dexFile).getDependencies();
+        }
+
+        if (apiLevel <= 8) {
+            return Lists.newArrayList(
+                    "/system/framework/core.jar",
+                    "/system/framework/ext.jar",
+                    "/system/framework/framework.jar",
+                    "/system/framework/android.policy.jar",
+                    "/system/framework/services.jar");
+        } else if (apiLevel <= 11) {
+            return Lists.newArrayList(
+                    "/system/framework/core.jar",
+                    "/system/framework/bouncycastle.jar",
+                    "/system/framework/ext.jar",
+                    "/system/framework/framework.jar",
+                    "/system/framework/android.policy.jar",
+                    "/system/framework/services.jar",
+                    "/system/framework/core-junit.jar");
+        } else if (apiLevel <= 13) {
+            return Lists.newArrayList(
+                    "/system/framework/core.jar",
+                    "/system/framework/apache-xml.jar",
+                    "/system/framework/bouncycastle.jar",
+                    "/system/framework/ext.jar",
+                    "/system/framework/framework.jar",
+                    "/system/framework/android.policy.jar",
+                    "/system/framework/services.jar",
+                    "/system/framework/core-junit.jar");
+        } else if (apiLevel <= 15) {
+            return Lists.newArrayList(
+                    "/system/framework/core.jar",
+                    "/system/framework/core-junit.jar",
+                    "/system/framework/bouncycastle.jar",
+                    "/system/framework/ext.jar",
+                    "/system/framework/framework.jar",
+                    "/system/framework/android.policy.jar",
+                    "/system/framework/services.jar",
+                    "/system/framework/apache-xml.jar",
+                    "/system/framework/filterfw.jar");
+        } else if (apiLevel <= 17) {
+            // this is correct as of api 17/4.2.2
+            return Lists.newArrayList(
+                    "/system/framework/core.jar",
+                    "/system/framework/core-junit.jar",
+                    "/system/framework/bouncycastle.jar",
+                    "/system/framework/ext.jar",
+                    "/system/framework/framework.jar",
+                    "/system/framework/telephony-common.jar",
+                    "/system/framework/mms-common.jar",
+                    "/system/framework/android.policy.jar",
+                    "/system/framework/services.jar",
+                    "/system/framework/apache-xml.jar");
+        } else if (apiLevel <= 18) {
+            return Lists.newArrayList(
+                    "/system/framework/core.jar",
+                    "/system/framework/core-junit.jar",
+                    "/system/framework/bouncycastle.jar",
+                    "/system/framework/ext.jar",
+                    "/system/framework/framework.jar",
+                    "/system/framework/telephony-common.jar",
+                    "/system/framework/voip-common.jar",
+                    "/system/framework/mms-common.jar",
+                    "/system/framework/android.policy.jar",
+                    "/system/framework/services.jar",
+                    "/system/framework/apache-xml.jar");
+        } else if (apiLevel <= 19) {
+            return Lists.newArrayList(
+                    "/system/framework/core.jar",
+                    "/system/framework/conscrypt.jar",
+                    "/system/framework/core-junit.jar",
+                    "/system/framework/bouncycastle.jar",
+                    "/system/framework/ext.jar",
+                    "/system/framework/framework.jar",
+                    "/system/framework/framework2.jar",
+                    "/system/framework/telephony-common.jar",
+                    "/system/framework/voip-common.jar",
+                    "/system/framework/mms-common.jar",
+                    "/system/framework/android.policy.jar",
+                    "/system/framework/services.jar",
+                    "/system/framework/apache-xml.jar",
+                    "/system/framework/webviewchromium.jar");
+        } else if (apiLevel <= 22) {
+            return Lists.newArrayList(
+                    "/system/framework/core-libart.jar",
+                    "/system/framework/conscrypt.jar",
+                    "/system/framework/okhttp.jar",
+                    "/system/framework/core-junit.jar",
+                    "/system/framework/bouncycastle.jar",
+                    "/system/framework/ext.jar",
+                    "/system/framework/framework.jar",
+                    "/system/framework/telephony-common.jar",
+                    "/system/framework/voip-common.jar",
+                    "/system/framework/ims-common.jar",
+                    "/system/framework/mms-common.jar",
+                    "/system/framework/android.policy.jar",
+                    "/system/framework/apache-xml.jar");
+        } else if (apiLevel <= 23) {
+            return Lists.newArrayList(
+                    "/system/framework/core-libart.jar",
+                    "/system/framework/conscrypt.jar",
+                    "/system/framework/okhttp.jar",
+                    "/system/framework/core-junit.jar",
+                    "/system/framework/bouncycastle.jar",
+                    "/system/framework/ext.jar",
+                    "/system/framework/framework.jar",
+                    "/system/framework/telephony-common.jar",
+                    "/system/framework/voip-common.jar",
+                    "/system/framework/ims-common.jar",
+                    "/system/framework/apache-xml.jar",
+                    "/system/framework/org.apache.http.legacy.boot.jar");
+        } else /*if (apiLevel <= 24)*/ {
+            return Lists.newArrayList(
+                    "/system/framework/core-oj.jar",
+                    "/system/framework/core-libart.jar",
+                    "/system/framework/conscrypt.jar",
+                    "/system/framework/okhttp.jar",
+                    "/system/framework/core-junit.jar",
+                    "/system/framework/bouncycastle.jar",
+                    "/system/framework/ext.jar",
+                    "/system/framework/framework.jar",
+                    "/system/framework/telephony-common.jar",
+                    "/system/framework/voip-common.jar",
+                    "/system/framework/ims-common.jar",
+                    "/system/framework/apache-xml.jar",
+                    "/system/framework/org.apache.http.legacy.boot.jar");
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProto.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProto.java
old mode 100644
new mode 100755
index cef683c..44cc5e2
--- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProto.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassProto.java
@@ -31,6 +31,7 @@
 
 package org.jf.dexlib2.analysis;
 
+import com.google.common.base.Joiner;
 import com.google.common.base.Predicates;
 import com.google.common.base.Supplier;
 import com.google.common.base.Suppliers;
@@ -38,12 +39,10 @@
 import com.google.common.primitives.Ints;
 import org.jf.dexlib2.AccessFlags;
 import org.jf.dexlib2.analysis.util.TypeProtoUtils;
-import org.jf.dexlib2.iface.ClassDef;
-import org.jf.dexlib2.iface.Field;
-import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.base.reference.BaseMethodReference;
+import org.jf.dexlib2.iface.*;
 import org.jf.dexlib2.iface.reference.FieldReference;
 import org.jf.dexlib2.iface.reference.MethodReference;
-import org.jf.dexlib2.immutable.ImmutableMethod;
 import org.jf.dexlib2.util.MethodUtil;
 import org.jf.util.AlignmentUtils;
 import org.jf.util.ExceptionWithContext;
@@ -52,6 +51,7 @@
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import java.util.*;
+import java.util.Map.Entry;
 
 /**
  * A class "prototype". This contains things like the interfaces, the superclass, the vtable and the instance fields
@@ -122,11 +122,18 @@
      */
     @Nonnull
     protected LinkedHashMap<String, ClassDef> getInterfaces() {
-        return interfacesSupplier.get();
+        if (!classPath.isArt() || classPath.oatVersion < 72) {
+            return preDefaultMethodInterfaceSupplier.get();
+        } else {
+            return postDefaultMethodInterfaceSupplier.get();
+        }
     }
 
+    /**
+     * This calculates the interfaces in the order required for vtable generation for dalvik and pre-default method ART
+     */
     @Nonnull
-    private final Supplier<LinkedHashMap<String, ClassDef>> interfacesSupplier =
+    private final Supplier<LinkedHashMap<String, ClassDef>> preDefaultMethodInterfaceSupplier =
             Suppliers.memoize(new Supplier<LinkedHashMap<String, ClassDef>>() {
                 @Override public LinkedHashMap<String, ClassDef> get() {
                     Set<String> unresolvedInterfaces = new HashSet<String>(0);
@@ -148,7 +155,8 @@
                                 ClassProto interfaceProto = (ClassProto) classPath.getClass(interfaceType);
                                 for (String superInterface: interfaceProto.getInterfaces().keySet()) {
                                     if (!interfaces.containsKey(superInterface)) {
-                                        interfaces.put(superInterface, interfaceProto.getInterfaces().get(superInterface));
+                                        interfaces.put(superInterface,
+                                                interfaceProto.getInterfaces().get(superInterface));
                                     }
                                 }
                                 if (!interfaceProto.interfacesFullyResolved) {
@@ -158,6 +166,7 @@
                             }
                         }
                     } catch (UnresolvedClassException ex) {
+                        interfaces.put(type, null);
                         unresolvedInterfaces.add(type);
                         interfacesFullyResolved = false;
                     }
@@ -196,6 +205,71 @@
                 }
             });
 
+    /**
+     * This calculates the interfaces in the order required for vtable generation for post-default method ART
+     */
+    @Nonnull
+    private final Supplier<LinkedHashMap<String, ClassDef>> postDefaultMethodInterfaceSupplier =
+            Suppliers.memoize(new Supplier<LinkedHashMap<String, ClassDef>>() {
+                @Override public LinkedHashMap<String, ClassDef> get() {
+                    Set<String> unresolvedInterfaces = new HashSet<String>(0);
+                    LinkedHashMap<String, ClassDef> interfaces = Maps.newLinkedHashMap();
+
+                    String superclass = getSuperclass();
+                    if (superclass != null) {
+                        ClassProto superclassProto = (ClassProto) classPath.getClass(superclass);
+                        for (String superclassInterface: superclassProto.getInterfaces().keySet()) {
+                            interfaces.put(superclassInterface, null);
+                        }
+                        if (!superclassProto.interfacesFullyResolved) {
+                            unresolvedInterfaces.addAll(superclassProto.getUnresolvedInterfaces());
+                            interfacesFullyResolved = false;
+                        }
+                    }
+
+                    try {
+                        for (String interfaceType: getClassDef().getInterfaces()) {
+                            if (!interfaces.containsKey(interfaceType)) {
+                                ClassProto interfaceProto = (ClassProto)classPath.getClass(interfaceType);
+                                try {
+                                    for (Entry<String, ClassDef> entry: interfaceProto.getInterfaces().entrySet()) {
+                                        if (!interfaces.containsKey(entry.getKey())) {
+                                            interfaces.put(entry.getKey(), entry.getValue());
+                                        }
+                                    }
+                                } catch (UnresolvedClassException ex) {
+                                    interfaces.put(interfaceType, null);
+                                    unresolvedInterfaces.add(interfaceType);
+                                    interfacesFullyResolved = false;
+                                }
+                                if (!interfaceProto.interfacesFullyResolved) {
+                                    unresolvedInterfaces.addAll(interfaceProto.getUnresolvedInterfaces());
+                                    interfacesFullyResolved = false;
+                                }
+                                try {
+                                    ClassDef interfaceDef = classPath.getClassDef(interfaceType);
+                                    interfaces.put(interfaceType, interfaceDef);
+                                } catch (UnresolvedClassException ex) {
+                                    interfaces.put(interfaceType, null);
+                                    unresolvedInterfaces.add(interfaceType);
+                                    interfacesFullyResolved = false;
+                                }
+                            }
+                        }
+                    } catch (UnresolvedClassException ex) {
+                        interfaces.put(type, null);
+                        unresolvedInterfaces.add(type);
+                        interfacesFullyResolved = false;
+                    }
+
+                    if (unresolvedInterfaces.size() > 0) {
+                        ClassProto.this.unresolvedInterfaces = unresolvedInterfaces;
+                    }
+
+                    return interfaces;
+                }
+            });
+
     @Nonnull
     protected Set<String> getUnresolvedInterfaces() {
         if (unresolvedInterfaces == null) {
@@ -219,7 +293,7 @@
 
         if (!interfacesFullyResolved) {
             throw new UnresolvedClassException("Interfaces for class %s not fully resolved: %s", getType(),
-                    getUnresolvedInterfaces());
+                    Joiner.on(',').join(getUnresolvedInterfaces()));
         }
 
         return directInterfaces;
@@ -378,7 +452,10 @@
     }
 
     public int findMethodIndexInVtable(@Nonnull MethodReference method) {
-        List<Method> vtable = getVtable();
+        return findMethodIndexInVtable(getVtable(), method);
+    }
+
+    private int findMethodIndexInVtable(@Nonnull List<Method> vtable, MethodReference method) {
         for (int i=0; i<vtable.size(); i++) {
             Method candidate = vtable.get(i);
             if (MethodUtil.methodSignaturesMatch(candidate, method)) {
@@ -391,7 +468,20 @@
         return -1;
     }
 
-    @Nonnull SparseArray<FieldReference> getInstanceFields() {
+    private int findMethodIndexInVtableReverse(@Nonnull List<Method> vtable, MethodReference method) {
+        for (int i=vtable.size() - 1; i>=0; i--) {
+            Method candidate = vtable.get(i);
+            if (MethodUtil.methodSignaturesMatch(candidate, method)) {
+                if (!classPath.shouldCheckPackagePrivateAccess() ||
+                        AnalyzedMethodUtil.canAccess(this, candidate, true, false, false)) {
+                    return i;
+                }
+            }
+        }
+        return -1;
+    }
+
+    @Nonnull public SparseArray<FieldReference> getInstanceFields() {
         if (classPath.isArt()) {
             return artInstanceFieldsSupplier.get();
         } else {
@@ -439,10 +529,8 @@
                     ClassProto superclass = null;
                     if (superclassType != null) {
                         superclass = (ClassProto) classPath.getClass(superclassType);
-                        if (superclass != null) {
                             startFieldOffset = superclass.getNextFieldOffset();
                         }
-                    }
 
                     int fieldIndexMod;
                     if ((startFieldOffset % 8) == 0) {
@@ -529,14 +617,12 @@
 
                         //add padding to align the wide fields, if needed
                         if (fieldTypes[i] == WIDE && !gotDouble) {
-                            if (!gotDouble) {
                                 if (fieldOffset % 8 != 0) {
                                     assert fieldOffset % 8 == 4;
                                     fieldOffset += 4;
                                 }
                                 gotDouble = true;
                             }
-                        }
 
                         instanceFields.append(fieldOffset, field);
                         if (fieldTypes[i] == WIDE) {
@@ -573,7 +659,7 @@
         public static FieldGap newFieldGap(int offset, int size, int oatVersion) {
             if (oatVersion >= 67) {
                 return new FieldGap(offset, size) {
-                    @Override public int compareTo(FieldGap o) {
+                    @Override public int compareTo(@Nonnull FieldGap o) {
                         int result = Ints.compare(o.size, size);
                         if (result != 0) {
                             return result;
@@ -583,7 +669,7 @@
                 };
             } else {
                 return new FieldGap(offset, size) {
-                    @Override public int compareTo(FieldGap o) {
+                    @Override public int compareTo(@Nonnull FieldGap o) {
                         int result = Ints.compare(size, o.size);
                         if (result != 0) {
                             return result;
@@ -777,12 +863,18 @@
         throw new ExceptionWithContext("Invalid type: %s", type);
     }
 
-    @Nonnull List<Method> getVtable() {
-        return vtableSupplier.get();
+    @Nonnull public List<Method> getVtable() {
+        if (!classPath.isArt() || classPath.oatVersion < 72) {
+            return preDefaultMethodVtableSupplier.get();
+        } else if (classPath.oatVersion < 87) {
+            return buggyPostDefaultMethodVtableSupplier.get();
+        } else {
+            return postDefaultMethodVtableSupplier.get();
+        }
     }
 
     //TODO: check the case when we have a package private method that overrides an interface method
-    @Nonnull private final Supplier<List<Method>> vtableSupplier = Suppliers.memoize(new Supplier<List<Method>>() {
+    @Nonnull private final Supplier<List<Method>> preDefaultMethodVtableSupplier = Suppliers.memoize(new Supplier<List<Method>>() {
         @Override public List<Method> get() {
             List<Method> vtable = Lists.newArrayList();
 
@@ -811,52 +903,315 @@
             //iterate over the virtual methods in the current class, and only add them when we don't already have the
             //method (i.e. if it was implemented by the superclass)
             if (!isInterface()) {
-                addToVtable(getClassDef().getVirtualMethods(), vtable, true);
+                addToVtable(getClassDef().getVirtualMethods(), vtable, true, true);
 
-                // assume that interface method is implemented in the current class, when adding it to vtable
-                // otherwise it looks like that method is invoked on an interface, which fails Dalvik's optimization checks
-                for (ClassDef interfaceDef: getDirectInterfaces()) {
+                // We use the current class for any vtable method references that we add, rather than the interface, so
+                // we don't end up trying to call invoke-virtual using an interface, which will fail verification
+                Iterable<ClassDef> interfaces = getDirectInterfaces();
+                for (ClassDef interfaceDef: interfaces) {
                     List<Method> interfaceMethods = Lists.newArrayList();
                     for (Method interfaceMethod: interfaceDef.getVirtualMethods()) {
-                        ImmutableMethod method = new ImmutableMethod(
-                                type,
-                                interfaceMethod.getName(),
-                                interfaceMethod.getParameters(),
-                                interfaceMethod.getReturnType(),
-                                interfaceMethod.getAccessFlags(),
-                                interfaceMethod.getAnnotations(),
-                                interfaceMethod.getImplementation());
-                        interfaceMethods.add(method);
+                        interfaceMethods.add(new ReparentedMethod(interfaceMethod, type));
                     }
-                    addToVtable(interfaceMethods, vtable, false);
+                    addToVtable(interfaceMethods, vtable, false, true);
                 }
             }
             return vtable;
         }
+    });
 
-        private void addToVtable(@Nonnull Iterable<? extends Method> localMethods,
-                                 @Nonnull List<Method> vtable, boolean replaceExisting) {
-            List<? extends Method> methods = Lists.newArrayList(localMethods);
-            Collections.sort(methods);
+    /**
+     * This is the vtable supplier for a version of art that had buggy vtable calculation logic. In some cases it can
+     * produce multiple vtable entries for a given virtual method. This supplier duplicates this buggy logic in order to
+     * generate an identical vtable
+     */
+    @Nonnull private final Supplier<List<Method>> buggyPostDefaultMethodVtableSupplier = Suppliers.memoize(new Supplier<List<Method>>() {
+        @Override public List<Method> get() {
+            List<Method> vtable = Lists.newArrayList();
 
-            outer: for (Method virtualMethod: methods) {
-                for (int i=0; i<vtable.size(); i++) {
-                    Method superMethod = vtable.get(i);
-                    if (MethodUtil.methodSignaturesMatch(superMethod, virtualMethod)) {
+            //copy the virtual methods from the superclass
+            String superclassType;
+            try {
+                superclassType = getSuperclass();
+            } catch (UnresolvedClassException ex) {
+                vtable.addAll(((ClassProto)classPath.getClass("Ljava/lang/Object;")).getVtable());
+                vtableFullyResolved = false;
+                return vtable;
+            }
+
+            if (superclassType != null) {
+                ClassProto superclass = (ClassProto) classPath.getClass(superclassType);
+                vtable.addAll(superclass.getVtable());
+
+                // if the superclass's vtable wasn't fully resolved, then we can't know where the new methods added by
+                // this class should start, so we just propagate what we can from the parent and hope for the best.
+                if (!superclass.vtableFullyResolved) {
+                    vtableFullyResolved = false;
+                    return vtable;
+                }
+            }
+
+            //iterate over the virtual methods in the current class, and only add them when we don't already have the
+            //method (i.e. if it was implemented by the superclass)
+            if (!isInterface()) {
+                addToVtable(getClassDef().getVirtualMethods(), vtable, true, true);
+
+                List<String> interfaces = Lists.newArrayList(getInterfaces().keySet());
+
+                List<Method> defaultMethods = Lists.newArrayList();
+                List<Method> defaultConflictMethods = Lists.newArrayList();
+                List<Method> mirandaMethods = Lists.newArrayList();
+
+                final HashMap<MethodReference, Integer> methodOrder = Maps.newHashMap();
+
+                for (int i=interfaces.size()-1; i>=0; i--) {
+                    String interfaceType = interfaces.get(i);
+                    ClassDef interfaceDef = classPath.getClassDef(interfaceType);
+
+                    for (Method interfaceMethod : interfaceDef.getVirtualMethods()) {
+
+                        int vtableIndex = findMethodIndexInVtableReverse(vtable, interfaceMethod);
+                        Method oldVtableMethod = null;
+                        if (vtableIndex >= 0) {
+                            oldVtableMethod = vtable.get(vtableIndex);
+                        }
+
+                        for (int j=0; j<vtable.size(); j++) {
+                            Method candidate = vtable.get(j);
+                            if (MethodUtil.methodSignaturesMatch(candidate, interfaceMethod)) {
                         if (!classPath.shouldCheckPackagePrivateAccess() ||
-                                AnalyzedMethodUtil.canAccess(ClassProto.this, superMethod, true, false, false)) {
-                            if (replaceExisting) {
-                                vtable.set(i, virtualMethod);
+                                        AnalyzedMethodUtil.canAccess(ClassProto.this, candidate, true, false, false)) {
+                                    if (interfaceMethodOverrides(interfaceMethod, candidate)) {
+                                        vtable.set(j, interfaceMethod);
                             }
-                            continue outer;
                         }
                     }
                 }
+
+                        if (vtableIndex >= 0) {
+                            if (!isOverridableByDefaultMethod(vtable.get(vtableIndex))) {
+                                continue;
+                            }
+                        }
+
+                        int defaultMethodIndex = findMethodIndexInVtable(defaultMethods, interfaceMethod);
+
+                        if (defaultMethodIndex >= 0) {
+                            if (!AccessFlags.ABSTRACT.isSet(interfaceMethod.getAccessFlags())) {
+                                ClassProto existingInterface = (ClassProto)classPath.getClass(
+                                        defaultMethods.get(defaultMethodIndex).getDefiningClass());
+                                if (!existingInterface.implementsInterface(interfaceMethod.getDefiningClass())) {
+                                    Method removedMethod = defaultMethods.remove(defaultMethodIndex);
+                                    defaultConflictMethods.add(removedMethod);
+                                }
+                            }
+                            continue;
+                        }
+
+                        int defaultConflictMethodIndex = findMethodIndexInVtable(
+                                defaultConflictMethods, interfaceMethod);
+                        if (defaultConflictMethodIndex >= 0) {
+                            // There's already a matching method in the conflict list, we don't need to do
+                            // anything else
+                            continue;
+                        }
+
+                        int mirandaMethodIndex = findMethodIndexInVtable(mirandaMethods, interfaceMethod);
+
+                        if (mirandaMethodIndex >= 0) {
+                            if (!AccessFlags.ABSTRACT.isSet(interfaceMethod.getAccessFlags())) {
+
+                                ClassProto existingInterface = (ClassProto)classPath.getClass(
+                                        mirandaMethods.get(mirandaMethodIndex).getDefiningClass());
+                                if (!existingInterface.implementsInterface(interfaceMethod.getDefiningClass())) {
+                                    Method oldMethod = mirandaMethods.remove(mirandaMethodIndex);
+                                    int methodOrderValue = methodOrder.get(oldMethod);
+                                    methodOrder.put(interfaceMethod, methodOrderValue);
+                                    defaultMethods.add(interfaceMethod);
+                                }
+                            }
+                            continue;
+                        }
+
+                        if (!AccessFlags.ABSTRACT.isSet(interfaceMethod.getAccessFlags())) {
+                            if (oldVtableMethod != null) {
+                                if (!interfaceMethodOverrides(interfaceMethod, oldVtableMethod)) {
+                                    continue;
+                                }
+                            }
+                            defaultMethods.add(interfaceMethod);
+                            methodOrder.put(interfaceMethod, methodOrder.size());
+                        } else {
+                            // TODO: do we need to check interfaceMethodOverrides here?
+                            if (oldVtableMethod == null) {
+                                mirandaMethods.add(interfaceMethod);
+                                methodOrder.put(interfaceMethod, methodOrder.size());
+                            }
+                        }
+                    }
+                }
+
+                Comparator<MethodReference> comparator = new Comparator<MethodReference>() {
+                    @Override public int compare(MethodReference o1, MethodReference o2) {
+                        return Ints.compare(methodOrder.get(o1), methodOrder.get(o2));
+                    }
+                };
+
+                // The methods should be in the same order within each list as they were iterated over.
+                // They can be misordered if, e.g. a method was originally added to the default list, but then moved
+                // to the conflict list.
+                Collections.sort(mirandaMethods, comparator);
+                Collections.sort(defaultMethods, comparator);
+                Collections.sort(defaultConflictMethods, comparator);
+
+                vtable.addAll(mirandaMethods);
+                vtable.addAll(defaultMethods);
+                vtable.addAll(defaultConflictMethods);
+            }
+            return vtable;
+        }
+    });
+
+    @Nonnull private final Supplier<List<Method>> postDefaultMethodVtableSupplier = Suppliers.memoize(new Supplier<List<Method>>() {
+        @Override public List<Method> get() {
+            List<Method> vtable = Lists.newArrayList();
+
+            //copy the virtual methods from the superclass
+            String superclassType;
+            try {
+                superclassType = getSuperclass();
+            } catch (UnresolvedClassException ex) {
+                vtable.addAll(((ClassProto)classPath.getClass("Ljava/lang/Object;")).getVtable());
+                vtableFullyResolved = false;
+                return vtable;
+            }
+
+            if (superclassType != null) {
+                ClassProto superclass = (ClassProto) classPath.getClass(superclassType);
+                vtable.addAll(superclass.getVtable());
+
+                // if the superclass's vtable wasn't fully resolved, then we can't know where the new methods added by
+                // this class should start, so we just propagate what we can from the parent and hope for the best.
+                if (!superclass.vtableFullyResolved) {
+                    vtableFullyResolved = false;
+                    return vtable;
+                }
+            }
+
+            //iterate over the virtual methods in the current class, and only add them when we don't already have the
+            //method (i.e. if it was implemented by the superclass)
+            if (!isInterface()) {
+                addToVtable(getClassDef().getVirtualMethods(), vtable, true, true);
+
+                Iterable<ClassDef> interfaces = Lists.reverse(Lists.newArrayList(getDirectInterfaces()));
+
+                List<Method> defaultMethods = Lists.newArrayList();
+                List<Method> defaultConflictMethods = Lists.newArrayList();
+                List<Method> mirandaMethods = Lists.newArrayList();
+
+                final HashMap<MethodReference, Integer> methodOrder = Maps.newHashMap();
+
+                for (ClassDef interfaceDef: interfaces) {
+                    for (Method interfaceMethod : interfaceDef.getVirtualMethods()) {
+
+                        int vtableIndex = findMethodIndexInVtable(vtable, interfaceMethod);
+
+                        if (vtableIndex >= 0) {
+                            if (interfaceMethodOverrides(interfaceMethod, vtable.get(vtableIndex))) {
+                                vtable.set(vtableIndex, interfaceMethod);
+                            }
+                        } else {
+                            int defaultMethodIndex = findMethodIndexInVtable(defaultMethods, interfaceMethod);
+
+                            if (defaultMethodIndex >= 0) {
+                                if (!AccessFlags.ABSTRACT.isSet(interfaceMethod.getAccessFlags())) {
+                                    ClassProto existingInterface = (ClassProto)classPath.getClass(
+                                            defaultMethods.get(defaultMethodIndex).getDefiningClass());
+                                    if (!existingInterface.implementsInterface(interfaceMethod.getDefiningClass())) {
+                                        Method removedMethod = defaultMethods.remove(defaultMethodIndex);
+                                        defaultConflictMethods.add(removedMethod);
+                                    }
+                                }
+                                continue;
+                            }
+
+                            int defaultConflictMethodIndex = findMethodIndexInVtable(
+                                    defaultConflictMethods, interfaceMethod);
+                            if (defaultConflictMethodIndex >= 0) {
+                                // There's already a matching method in the conflict list, we don't need to do
+                                // anything else
+                                continue;
+                            }
+
+                            int mirandaMethodIndex = findMethodIndexInVtable(mirandaMethods, interfaceMethod);
+
+                            if (mirandaMethodIndex >= 0) {
+                                if (!AccessFlags.ABSTRACT.isSet(interfaceMethod.getAccessFlags())) {
+
+                                    ClassProto existingInterface = (ClassProto)classPath.getClass(
+                                            mirandaMethods.get(mirandaMethodIndex).getDefiningClass());
+                                    if (!existingInterface.implementsInterface(interfaceMethod.getDefiningClass())) {
+                                        Method oldMethod = mirandaMethods.remove(mirandaMethodIndex);
+                                        int methodOrderValue = methodOrder.get(oldMethod);
+                                        methodOrder.put(interfaceMethod, methodOrderValue);
+                                        defaultMethods.add(interfaceMethod);
+                                    }
+                                }
+                                continue;
+                            }
+
+                            if (!AccessFlags.ABSTRACT.isSet(interfaceMethod.getAccessFlags())) {
+                                defaultMethods.add(interfaceMethod);
+                                methodOrder.put(interfaceMethod, methodOrder.size());
+                            } else {
+                                mirandaMethods.add(interfaceMethod);
+                                methodOrder.put(interfaceMethod, methodOrder.size());
+                            }
+                        }
+                    }
+                }
+
+                Comparator<MethodReference> comparator = new Comparator<MethodReference>() {
+                    @Override public int compare(MethodReference o1, MethodReference o2) {
+                        return Ints.compare(methodOrder.get(o1), methodOrder.get(o2));
+                    }
+                };
+
+                // The methods should be in the same order within each list as they were iterated over.
+                // They can be misordered if, e.g. a method was originally added to the default list, but then moved
+                // to the conflict list.
+                Collections.sort(defaultMethods, comparator);
+                Collections.sort(defaultConflictMethods, comparator);
+                Collections.sort(mirandaMethods, comparator);
+                addToVtable(defaultMethods, vtable, false, false);
+                addToVtable(defaultConflictMethods, vtable, false, false);
+                addToVtable(mirandaMethods, vtable, false, false);
+            }
+            return vtable;
+        }
+    });
+
+    private void addToVtable(@Nonnull Iterable<? extends Method> localMethods, @Nonnull List<Method> vtable,
+                             boolean replaceExisting, boolean sort) {
+        if (sort) {
+            ArrayList<Method> methods = Lists.newArrayList(localMethods);
+            Collections.sort(methods);
+            localMethods = methods;
+        }
+
+        for (Method virtualMethod: localMethods) {
+            int vtableIndex = findMethodIndexInVtable(vtable, virtualMethod);
+
+            if (vtableIndex >= 0) {
+                if (replaceExisting) {
+                    vtable.set(vtableIndex, virtualMethod);
+                }
+            } else {
                 // we didn't find an equivalent method, so add it as a new entry
                 vtable.add(virtualMethod);
             }
         }
-    });
+    }
 
     private static byte getFieldType(@Nonnull FieldReference field) {
         switch (field.getType().charAt(0)) {
@@ -870,4 +1225,68 @@
                 return 2; //OTHER
         }
     }
+
+    private boolean isOverridableByDefaultMethod(@Nonnull Method method) {
+        ClassProto classProto = (ClassProto)classPath.getClass(method.getDefiningClass());
+        return classProto.isInterface();
+    }
+
+    /**
+     * Checks if the interface method overrides the virtual or interface method2
+     * @param method A Method from an interface
+     * @param method2 A Method from an interface or a class
+     * @return true if the interface method overrides the virtual or interface method2
+     */
+    private boolean interfaceMethodOverrides(@Nonnull Method method, @Nonnull Method method2) {
+        ClassProto classProto = (ClassProto)classPath.getClass(method2.getDefiningClass());
+
+        if (classProto.isInterface()) {
+            ClassProto targetClassProto = (ClassProto)classPath.getClass(method.getDefiningClass());
+            return targetClassProto.implementsInterface(method2.getDefiningClass());
+        } else {
+            return false;
+        }
+    }
+
+    static class ReparentedMethod extends BaseMethodReference implements Method {
+        private final Method method;
+        private final String definingClass;
+
+        public ReparentedMethod(Method method, String definingClass) {
+            this.method = method;
+            this.definingClass = definingClass;
+        }
+
+        @Nonnull @Override public String getDefiningClass() {
+            return definingClass;
+        }
+
+        @Nonnull @Override public String getName() {
+            return method.getName();
+        }
+
+        @Nonnull @Override public List<? extends CharSequence> getParameterTypes() {
+            return method.getParameterTypes();
+        }
+
+        @Nonnull @Override public String getReturnType() {
+            return method.getReturnType();
+        }
+
+        @Nonnull @Override public List<? extends MethodParameter> getParameters() {
+            return method.getParameters();
+        }
+
+        @Override public int getAccessFlags() {
+            return method.getAccessFlags();
+        }
+
+        @Nonnull @Override public Set<? extends Annotation> getAnnotations() {
+            return method.getAnnotations();
+        }
+
+        @Nullable @Override public MethodImplementation getImplementation() {
+            return method.getImplementation();
+        }
+    }
 }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/DumpFields.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/DumpFields.java
deleted file mode 100644
index 2bb3e49..0000000
--- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/DumpFields.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright 2013, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package org.jf.dexlib2.analysis;
-
-import com.google.common.base.Splitter;
-import com.google.common.collect.Lists;
-import org.apache.commons.cli.*;
-import org.jf.dexlib2.DexFileFactory;
-import org.jf.dexlib2.dexbacked.DexBackedDexFile;
-import org.jf.dexlib2.iface.ClassDef;
-import org.jf.dexlib2.iface.Field;
-import org.jf.dexlib2.iface.Method;
-import org.jf.dexlib2.iface.reference.FieldReference;
-import org.jf.util.ConsoleUtil;
-import org.jf.util.SparseArray;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-
-public class DumpFields {
-    private static final Options options;
-
-    static {
-        options = new Options();
-        buildOptions();
-    }
-
-    public static void main(String[] args) {
-        CommandLineParser parser = new PosixParser();
-        CommandLine commandLine;
-
-        try {
-            commandLine = parser.parse(options, args);
-        } catch (ParseException ex) {
-            usage();
-            return;
-        }
-
-        String[] remainingArgs = commandLine.getArgs();
-
-        Option[] parsedOptions = commandLine.getOptions();
-        ArrayList<String> bootClassPathDirs = Lists.newArrayList();
-        String outFile = "fields.txt";
-        int apiLevel = 15;
-        boolean experimental = false;
-
-        for (int i=0; i<parsedOptions.length; i++) {
-            Option option = parsedOptions[i];
-            String opt = option.getOpt();
-
-            switch (opt.charAt(0)) {
-                case 'd':
-                    bootClassPathDirs.add(option.getValue());
-                    break;
-                case 'o':
-                    outFile = option.getValue();
-                    break;
-                case 'a':
-                    apiLevel = Integer.parseInt(commandLine.getOptionValue("a"));
-                    break;
-                case 'X':
-                    experimental = true;
-                    break;
-                default:
-                    assert false;
-            }
-        }
-
-        if (remainingArgs.length != 1) {
-            usage();
-            return;
-        }
-
-        String inputDexFileName = remainingArgs[0];
-
-        File dexFileFile = new File(inputDexFileName);
-        if (!dexFileFile.exists()) {
-            System.err.println("Can't find the file " + inputDexFileName);
-            System.exit(1);
-        }
-
-        try {
-            DexBackedDexFile dexFile = DexFileFactory.loadDexFile(dexFileFile, apiLevel, experimental);
-            Iterable<String> bootClassPaths = Splitter.on(":").split("core.jar:ext.jar:framework.jar:android.policy.jar:services.jar");
-            ClassPath classPath = ClassPath.fromClassPath(bootClassPathDirs, bootClassPaths, dexFile, apiLevel, experimental);
-            FileOutputStream outStream = new FileOutputStream(outFile);
-
-            for (ClassDef classDef: dexFile.getClasses()) {
-                ClassProto classProto = (ClassProto) classPath.getClass(classDef);
-                SparseArray<FieldReference> fields = classProto.getInstanceFields();
-                String className = "Class "  + classDef.getType() + " : " + fields.size() + " instance fields\n";
-                outStream.write(className.getBytes());
-                for (int i=0;i<fields.size();i++) {
-                    String field = fields.keyAt(i) + ":" + fields.valueAt(i).getType() + " " + fields.valueAt(i).getName() + "\n";
-                    outStream.write(field.getBytes());
-                }
-                outStream.write("\n".getBytes());
-            }
-            outStream.close();
-        } catch (IOException ex) {
-            System.out.println("IOException thrown when trying to open a dex file or write out vtables: " + ex);
-        }
-
-    }
-
-    /**
-     * Prints the usage message.
-     */
-    private static void usage() {
-        int consoleWidth = ConsoleUtil.getConsoleWidth();
-        if (consoleWidth <= 0) {
-            consoleWidth = 80;
-        }
-
-        System.out.println("java -cp baksmali.jar org.jf.dexlib2.analysis.DumpFields -d path/to/framework/jar/files <dex-file>");
-    }
-
-    private static void buildOptions() {
-        Option classPathDirOption = OptionBuilder.withLongOpt("bootclasspath-dir")
-                .withDescription("the base folder to look for the bootclasspath files in. Defaults to the current " +
-                        "directory")
-                .hasArg()
-                .withArgName("DIR")
-                .create("d");
-
-        Option outputFileOption = OptionBuilder.withLongOpt("out-file")
-                .withDescription("output file")
-                .hasArg()
-                .withArgName("FILE")
-                .create("o");
-
-        Option apiLevelOption = OptionBuilder.withLongOpt("api-level")
-                .withDescription("The numeric api-level of the file being disassembled. If not " +
-                                "specified, it defaults to 15 (ICS).")
-                .hasArg()
-                .withArgName("API_LEVEL")
-                .create("a");
-
-        Option experimentalOption = OptionBuilder.withLongOpt("experimental")
-                .withDescription("Enable dumping experimental opcodes, that aren't necessarily " +
-                                "supported by the android runtime yet.")
-                .create("X");
-
-        options.addOption(classPathDirOption);
-        options.addOption(outputFileOption);
-        options.addOption(apiLevelOption);
-        options.addOption(experimentalOption);
-    }
-}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/DumpVtables.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/DumpVtables.java
deleted file mode 100644
index 193c0d3..0000000
--- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/DumpVtables.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright 2013, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package org.jf.dexlib2.analysis;
-
-import com.google.common.base.Splitter;
-import com.google.common.collect.Lists;
-import org.apache.commons.cli.*;
-import org.jf.dexlib2.DexFileFactory;
-import org.jf.dexlib2.dexbacked.DexBackedDexFile;
-import org.jf.dexlib2.iface.ClassDef;
-import org.jf.dexlib2.iface.Method;
-import org.jf.util.ConsoleUtil;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-public class DumpVtables {
-    private static final Options options;
-
-    static {
-        options = new Options();
-        buildOptions();
-    }
-
-    public static void main(String[] args) {
-        CommandLineParser parser = new PosixParser();
-        CommandLine commandLine;
-
-        try {
-            commandLine = parser.parse(options, args);
-        } catch (ParseException ex) {
-            usage();
-            return;
-        }
-
-        String[] remainingArgs = commandLine.getArgs();
-
-        Option[] parsedOptions = commandLine.getOptions();
-        ArrayList<String> bootClassPathDirs = Lists.newArrayList();
-        String outFile = "vtables.txt";
-        int apiLevel = 15;
-        boolean experimental = false;
-
-        for (int i=0; i<parsedOptions.length; i++) {
-            Option option = parsedOptions[i];
-            String opt = option.getOpt();
-
-            switch (opt.charAt(0)) {
-                case 'd':
-                    bootClassPathDirs.add(option.getValue());
-                    break;
-                case 'o':
-                    outFile = option.getValue();
-                    break;
-                case 'a':
-                    apiLevel = Integer.parseInt(commandLine.getOptionValue("a"));
-                    break;
-                case 'X':
-                    experimental = true;
-                    break;
-                default:
-                    assert false;
-            }
-        }
-
-        if (remainingArgs.length != 1) {
-            usage();
-            return;
-        }
-
-        String inputDexFileName = remainingArgs[0];
-
-        File dexFileFile = new File(inputDexFileName);
-        if (!dexFileFile.exists()) {
-            System.err.println("Can't find the file " + inputDexFileName);
-            System.exit(1);
-        }
-
-        try {
-            DexBackedDexFile dexFile = DexFileFactory.loadDexFile(dexFileFile, apiLevel, experimental);
-            Iterable<String> bootClassPaths = Splitter.on(":").split("core.jar:ext.jar:framework.jar:android.policy.jar:services.jar");
-            ClassPath classPath = ClassPath.fromClassPath(bootClassPathDirs, bootClassPaths, dexFile, apiLevel, experimental);
-            FileOutputStream outStream = new FileOutputStream(outFile);
-
-            for (ClassDef classDef: dexFile.getClasses()) {
-                ClassProto classProto = (ClassProto) classPath.getClass(classDef);
-                List<Method> methods = classProto.getVtable();
-                String className = "Class "  + classDef.getType() + " extends " + classDef.getSuperclass() + " : " + methods.size() + " methods\n";
-                outStream.write(className.getBytes());
-                for (int i=0;i<methods.size();i++) {
-                    Method method = methods.get(i);
-
-                    String methodString = i + ":" + method.getDefiningClass() + "->" + method.getName() + "(";
-                    for (CharSequence parameter: method.getParameterTypes()) {
-                        methodString += parameter;
-                    }
-                    methodString += ")" + method.getReturnType() + "\n";
-                    outStream.write(methodString.getBytes());
-                }
-                outStream.write("\n".getBytes());
-            }
-            outStream.close();
-        } catch (IOException ex) {
-            System.out.println("IOException thrown when trying to open a dex file or write out vtables: " + ex);
-        }
-
-    }
-
-    /**
-     * Prints the usage message.
-     */
-    private static void usage() {
-        int consoleWidth = ConsoleUtil.getConsoleWidth();
-        if (consoleWidth <= 0) {
-            consoleWidth = 80;
-        }
-
-        System.out.println("java -cp baksmali.jar org.jf.dexlib2.analysis.DumpVtables -d path/to/framework/jar/files <dex-file>");
-    }
-
-    private static void buildOptions() {
-        Option classPathDirOption = OptionBuilder.withLongOpt("bootclasspath-dir")
-                .withDescription("the base folder to look for the bootclasspath files in. Defaults to the current " +
-                        "directory")
-                .hasArg()
-                .withArgName("DIR")
-                .create("d");
-
-        Option outputFileOption = OptionBuilder.withLongOpt("out-file")
-                .withDescription("output file")
-                .hasArg()
-                .withArgName("FILE")
-                .create("o");
-
-        Option apiLevelOption = OptionBuilder.withLongOpt("api-level")
-                .withDescription("The numeric api-level of the file being disassembled. If not " +
-                        "specified, it defaults to 15 (ICS).")
-                .hasArg()
-                .withArgName("API_LEVEL")
-                .create("a");
-
-        Option experimentalOption = OptionBuilder.withLongOpt("experimental")
-                .withDescription("Enable dumping experimental opcodes, that aren't necessarily " +
-                                "supported by the android runtime yet.")
-                .create("X");
-
-        options.addOption(classPathDirOption);
-        options.addOption(outputFileOption);
-        options.addOption(apiLevelOption);
-        options.addOption(experimentalOption);
-    }
-}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/MethodAnalyzer.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/MethodAnalyzer.java
index b7a15a0..7a51c96 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/MethodAnalyzer.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/MethodAnalyzer.java
@@ -36,6 +36,7 @@
 import com.google.common.collect.Lists;
 import org.jf.dexlib2.AccessFlags;
 import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.base.reference.BaseMethodReference;
 import org.jf.dexlib2.iface.*;
 import org.jf.dexlib2.iface.instruction.*;
 import org.jf.dexlib2.iface.instruction.formats.*;
@@ -89,10 +90,10 @@
 
     @Nullable private AnalysisException analysisException = null;
 
-    //This is a dummy instruction that occurs immediately before the first real instruction. We can initialize the
-    //register types for this instruction to the parameter types, in order to have them propagate to all of its
-    //successors, e.g. the first real instruction, the first instructions in any exception handlers covering the first
-    //instruction, etc.
+    // This is a dummy instruction that occurs immediately before the first real instruction. We can initialize the
+    // register types for this instruction to the parameter types, in order to have them propagate to all of its
+    // successors, e.g. the first real instruction, the first instructions in any exception handlers covering the first
+    // instruction, etc.
     private final AnalyzedInstruction startOfMethod;
 
     public MethodAnalyzer(@Nonnull ClassPath classPath, @Nonnull Method method,
@@ -110,27 +111,16 @@
 
         this.methodImpl = methodImpl;
 
-        //override AnalyzedInstruction and provide custom implementations of some of the methods, so that we don't
-        //have to handle the case this special case of instruction being null, in the main class
-        startOfMethod = new AnalyzedInstruction(this, null, -1, methodImpl.getRegisterCount()) {
-            public boolean setsRegister() {
-                return false;
+        // Override AnalyzedInstruction and provide custom implementations of some of the methods, so that we don't
+        // have to handle the case this special case of instruction being null, in the main class
+        startOfMethod = new AnalyzedInstruction(this, new ImmutableInstruction10x(Opcode.NOP), -1, methodImpl.getRegisterCount()) {
+            @Override protected boolean addPredecessor(AnalyzedInstruction predecessor) {
+                throw new UnsupportedOperationException();
             }
 
-            @Override
-            public boolean setsWideRegister() {
-                return false;
-            }
-
-            @Override
-            public boolean setsRegister(int registerNumber) {
-                return false;
-            }
-
-            @Override
-            public int getDestinationRegister() {
-                assert false;
-                return -1;
+            @Override @Nonnull
+            public RegisterType getPredecessorRegisterType(@Nonnull AnalyzedInstruction predecessor, int registerNumber) {
+                throw new UnsupportedOperationException();
             }
         };
 
@@ -141,6 +131,7 @@
         analyze();
     }
 
+    @Nonnull
     public ClassPath getClassPath() {
         return classPath;
     }
@@ -362,6 +353,7 @@
     private void overridePredecessorRegisterTypeAndPropagateChanges(
             @Nonnull AnalyzedInstruction analyzedInstruction, @Nonnull AnalyzedInstruction predecessor,
             int registerNumber, @Nonnull RegisterType registerType) {
+
         BitSet changedInstructions = new BitSet(analyzedInstructions.size());
 
         if (!analyzedInstruction.overridePredecessorRegisterType(
@@ -383,6 +375,28 @@
         }
     }
 
+    private void initializeRefAndPropagateChanges(@Nonnull AnalyzedInstruction analyzedInstruction,
+                                                  int registerNumber, @Nonnull RegisterType registerType) {
+
+        BitSet changedInstructions = new BitSet(analyzedInstructions.size());
+
+        if (!analyzedInstruction.setPostRegisterType(registerNumber, registerType)) {
+            return;
+        }
+
+        propagateRegisterToSuccessors(analyzedInstruction, registerNumber, changedInstructions, false);
+
+        propagateChanges(changedInstructions, registerNumber, false);
+
+        if (registerType.category == RegisterType.LONG_LO) {
+            checkWidePair(registerNumber, analyzedInstruction);
+            setPostRegisterTypeAndPropagateChanges(analyzedInstruction, registerNumber+1, RegisterType.LONG_HI_TYPE);
+        } else if (registerType.category == RegisterType.DOUBLE_LO) {
+            checkWidePair(registerNumber, analyzedInstruction);
+            setPostRegisterTypeAndPropagateChanges(analyzedInstruction, registerNumber+1, RegisterType.DOUBLE_HI_TYPE);
+        }
+    }
+
     private void setPostRegisterTypeAndPropagateChanges(@Nonnull AnalyzedInstruction analyzedInstruction,
                                                         int registerNumber, @Nonnull RegisterType registerType) {
 
@@ -1176,32 +1190,46 @@
         setDestinationRegisterTypeAndPropagateChanges(analyzedInstruction, castRegisterType);
     }
 
-    static boolean canNarrowAfterInstanceOf(AnalyzedInstruction analyzedInstanceOfInstruction,
-                                            AnalyzedInstruction analyzedIfInstruction, ClassPath classPath) {
+    public static boolean isNotWideningConversion(RegisterType originalType, RegisterType newType) {
+        if (originalType.type == null || newType.type == null) {
+            return true;
+        }
+        if (originalType.type.isInterface()) {
+            return newType.type.implementsInterface(originalType.type.getType());
+        } else {
+            TypeProto commonSuperclass = newType.type.getCommonSuperclass(originalType.type);
+            if (commonSuperclass.getType().equals(originalType.type.getType())) {
+                return true;
+        }
+            if (commonSuperclass.getType().equals(newType.type.getType())) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    static boolean canPropagateTypeAfterInstanceOf(AnalyzedInstruction analyzedInstanceOfInstruction,
+                                                   AnalyzedInstruction analyzedIfInstruction, ClassPath classPath) {
+        if (!classPath.isArt()) {
+            return false;
+        }
+
         Instruction ifInstruction = analyzedIfInstruction.instruction;
-        assert analyzedIfInstruction.instruction != null;
         if (((Instruction21t)ifInstruction).getRegisterA() == analyzedInstanceOfInstruction.getDestinationRegister()) {
             Reference reference = ((Instruction22c)analyzedInstanceOfInstruction.getInstruction()).getReference();
             RegisterType registerType = RegisterType.getRegisterType(classPath, (TypeReference)reference);
 
-            if (registerType.type != null && !registerType.type.isInterface()) {
-                int objectRegister = ((TwoRegisterInstruction)analyzedInstanceOfInstruction.getInstruction())
-                        .getRegisterB();
+            try {
+                if (registerType.type != null && !registerType.type.isInterface()) {
+                    int objectRegister = ((TwoRegisterInstruction)analyzedInstanceOfInstruction.getInstruction())
+                            .getRegisterB();
 
-                RegisterType originalType = analyzedIfInstruction.getPreInstructionRegisterType(objectRegister);
+                    RegisterType originalType = analyzedIfInstruction.getPreInstructionRegisterType(objectRegister);
 
-                if (originalType.type != null) {
-                    // Only override if we're going from an interface to a class, or are going to a narrower class
-                    if (originalType.type.isInterface()) {
-                        return true;
-                    } else {
-                        TypeProto commonSuperclass = registerType.type.getCommonSuperclass(originalType.type);
-                        // only if it's a narrowing conversion
-                        if (commonSuperclass.getType().equals(originalType.type.getType())) {
-                            return true;
-                        }
-                    }
+                    return isNotWideningConversion(originalType, registerType);
                 }
+            } catch (UnresolvedClassException ex) {
+                return false;
             }
         }
         return false;
@@ -1210,21 +1238,16 @@
     /**
      * Art uses a peephole optimization for an if-eqz or if-nez that occur immediately after an instance-of. It will
      * narrow the type if possible, and then NOP out any corresponding check-cast instruction later on
-     *
-     * TODO: Is this still safe to do even for dalvik odexes? I think it should be..
      */
     private void analyzeIfEqzNez(@Nonnull AnalyzedInstruction analyzedInstruction) {
-        int instructionIndex = analyzedInstruction.getInstructionIndex();
-        if (instructionIndex > 0) {
-            AnalyzedInstruction prevAnalyzedInstruction = analyzedInstructions.valueAt(instructionIndex - 1);
-            if (prevAnalyzedInstruction.instruction != null &&
-                    prevAnalyzedInstruction.instruction.getOpcode() == Opcode.INSTANCE_OF) {
-                if (canNarrowAfterInstanceOf(prevAnalyzedInstruction, analyzedInstruction, classPath)) {
-                    // Propagate the original type to the failing branch, and the new type to the successful branch
-                    int narrowingRegister = ((Instruction22c)prevAnalyzedInstruction.instruction).getRegisterB();
-                    RegisterType originalType = analyzedInstruction.getPreInstructionRegisterType(narrowingRegister);
-                    RegisterType newType = RegisterType.getRegisterType(classPath,
-                            (TypeReference)((Instruction22c)prevAnalyzedInstruction.instruction).getReference());
+        if (classPath.isArt()) {
+            int instructionIndex = analyzedInstruction.getInstructionIndex();
+            if (instructionIndex > 0) {
+                if (analyzedInstruction.getPredecessorCount() != 1) {
+                    return;
+                }
+                AnalyzedInstruction prevAnalyzedInstruction = analyzedInstruction.getPredecessors().first();
+                if (prevAnalyzedInstruction.instruction.getOpcode() == Opcode.INSTANCE_OF) {
 
                     AnalyzedInstruction fallthroughInstruction = analyzedInstructions.valueAt(
                             analyzedInstruction.getInstructionIndex() + 1);
@@ -1233,16 +1256,25 @@
                             ((Instruction21t)analyzedInstruction.instruction).getCodeOffset();
                     AnalyzedInstruction branchInstruction = analyzedInstructions.get(nextAddress);
 
-                    if (analyzedInstruction.instruction.getOpcode() == Opcode.IF_EQZ) {
-                        overridePredecessorRegisterTypeAndPropagateChanges(fallthroughInstruction, analyzedInstruction,
-                                narrowingRegister, newType);
-                        overridePredecessorRegisterTypeAndPropagateChanges(branchInstruction, analyzedInstruction,
-                                narrowingRegister, originalType);
-                    } else {
-                        overridePredecessorRegisterTypeAndPropagateChanges(fallthroughInstruction, analyzedInstruction,
-                                narrowingRegister, originalType);
-                        overridePredecessorRegisterTypeAndPropagateChanges(branchInstruction, analyzedInstruction,
-                                narrowingRegister, newType);
+                    int narrowingRegister = ((Instruction22c)prevAnalyzedInstruction.instruction).getRegisterB();
+                    RegisterType originalType = analyzedInstruction.getPreInstructionRegisterType(narrowingRegister);
+
+                    Instruction22c instanceOfInstruction = (Instruction22c)prevAnalyzedInstruction.instruction;
+                    RegisterType newType = RegisterType.getRegisterType(classPath,
+                            (TypeReference)instanceOfInstruction.getReference());
+
+                    for (int register : analyzedInstruction.getSetRegisters()) {
+                        if (analyzedInstruction.instruction.getOpcode() == Opcode.IF_EQZ) {
+                            overridePredecessorRegisterTypeAndPropagateChanges(fallthroughInstruction,
+                                    analyzedInstruction, register, newType);
+                            overridePredecessorRegisterTypeAndPropagateChanges(branchInstruction, analyzedInstruction,
+                                    register, originalType);
+                        } else {
+                            overridePredecessorRegisterTypeAndPropagateChanges(fallthroughInstruction,
+                                    analyzedInstruction, register, originalType);
+                            overridePredecessorRegisterTypeAndPropagateChanges(branchInstruction, analyzedInstruction,
+                                    register, newType);
+                        }
                     }
                 }
             }
@@ -1380,44 +1412,32 @@
     }
 
     private void analyzeInvokeDirectCommon(@Nonnull AnalyzedInstruction analyzedInstruction, int objectRegister) {
-        //the only time that an invoke instruction changes a register type is when using invoke-direct on a
-        //constructor (<init>) method, which changes the uninitialized reference (and any register that the same
-        //uninit reference has been copied to) to an initialized reference
+        // This handles the case of invoking a constructor on an uninitialized reference. This propagates the
+        // initialized type for the object register, and also any known aliased registers.
+        //
+        // In some cases, unrelated uninitialized references may not have been propagated past this instruction. This
+        // happens when propagating those types and the type of object register of this instruction isn't known yet.
+        // In this case, we can't determine if the uninitialized reference being propagated in an alias of the object
+        // register, so we don't stop propagation.
+        //
+        // We check for any of these unpropagated uninitialized references here and propagate them.
+        if (analyzedInstruction.isInvokeInit()) {
+            RegisterType uninitRef = analyzedInstruction.getPreInstructionRegisterType(objectRegister);
+            if (uninitRef.category != RegisterType.UNINIT_REF && uninitRef.category != RegisterType.UNINIT_THIS) {
+                assert analyzedInstruction.getSetRegisters().isEmpty();
+                return;
+            }
 
-        ReferenceInstruction instruction = (ReferenceInstruction)analyzedInstruction.instruction;
+            RegisterType initRef = RegisterType.getRegisterType(RegisterType.REFERENCE, uninitRef.type);
 
-        MethodReference methodReference = (MethodReference)instruction.getReference();
+            for (int register: analyzedInstruction.getSetRegisters()) {
+                RegisterType registerType = analyzedInstruction.getPreInstructionRegisterType(register);
 
-        if (!methodReference.getName().equals("<init>")) {
-            return;
-        }
-
-        RegisterType objectRegisterType = analyzedInstruction.getPreInstructionRegisterType(objectRegister);
-
-        if (objectRegisterType.category != RegisterType.UNINIT_REF &&
-                objectRegisterType.category != RegisterType.UNINIT_THIS) {
-            return;
-        }
-
-        setPostRegisterTypeAndPropagateChanges(analyzedInstruction, objectRegister,
-                RegisterType.getRegisterType(RegisterType.REFERENCE, objectRegisterType.type));
-
-        for (int i=0; i<analyzedInstruction.postRegisterMap.length; i++) {
-            RegisterType postInstructionRegisterType = analyzedInstruction.postRegisterMap[i];
-            if (postInstructionRegisterType.category == RegisterType.UNKNOWN) {
-                RegisterType preInstructionRegisterType =
-                        analyzedInstruction.getPreInstructionRegisterType(i);
-
-                if (preInstructionRegisterType.category == RegisterType.UNINIT_REF ||
-                        preInstructionRegisterType.category == RegisterType.UNINIT_THIS) {
-                    RegisterType registerType;
-                    if (preInstructionRegisterType.equals(objectRegisterType)) {
-                        registerType = analyzedInstruction.postRegisterMap[objectRegister];
-                    } else {
-                        registerType = preInstructionRegisterType;
-                    }
-
-                    setPostRegisterTypeAndPropagateChanges(analyzedInstruction, i, registerType);
+                if (registerType == uninitRef) {
+                    setPostRegisterTypeAndPropagateChanges(analyzedInstruction, register, initRef);
+                } else {
+                    // This is unrelated uninitialized reference. propagate it as-is
+                    setPostRegisterTypeAndPropagateChanges(analyzedInstruction, register, registerType);
                 }
             }
         }
@@ -1695,13 +1715,13 @@
 
             // fieldClass is now the first accessible class found. Now. we need to make sure that the field is
             // actually valid for this class
-            resolvedField = classPath.getClass(fieldClass.getType()).getFieldByOffset(fieldOffset);
-            if (resolvedField == null) {
+            FieldReference newResolvedField = classPath.getClass(fieldClass.getType()).getFieldByOffset(fieldOffset);
+            if (newResolvedField == null) {
                 throw new ExceptionWithContext("Couldn't find accessible class while resolving field %s",
                         ReferenceUtil.getShortFieldDescriptor(resolvedField));
             }
-            resolvedField = new ImmutableFieldReference(fieldClass.getType(), resolvedField.getName(),
-                    resolvedField.getType());
+            resolvedField = new ImmutableFieldReference(fieldClass.getType(), newResolvedField.getName(),
+                    newResolvedField.getType());
         }
 
         String fieldType = resolvedField.getType();
@@ -1733,41 +1753,9 @@
             targetMethod = (MethodReference)instruction.getReference();
         }
 
-        TypeProto typeProto = classPath.getClass(targetMethod.getDefiningClass());
-        int methodIndex;
-        try {
-            methodIndex = typeProto.findMethodIndexInVtable(targetMethod);
-        } catch (UnresolvedClassException ex) {
-            return true;
-        }
+        MethodReference replacementMethod = normalizeMethodReference(targetMethod);
 
-        if (methodIndex < 0) {
-            return true;
-        }
-
-        Method replacementMethod = typeProto.getMethodByVtableIndex(methodIndex);
-        assert replacementMethod != null;
-        while (true) {
-            String superType = typeProto.getSuperclass();
-            if (superType == null) {
-                break;
-            }
-            typeProto = classPath.getClass(superType);
-            Method resolvedMethod = typeProto.getMethodByVtableIndex(methodIndex);
-            if (resolvedMethod == null) {
-                break;
-            }
-
-            if (!resolvedMethod.equals(replacementMethod)) {
-                if (!AnalyzedMethodUtil.canAccess(typeProto, replacementMethod, true, true, true)) {
-                    continue;
-                }
-
-                replacementMethod = resolvedMethod;
-            }
-        }
-
-        if (replacementMethod.equals(method)) {
+        if (replacementMethod == null || replacementMethod.equals(targetMethod)) {
             return true;
         }
 
@@ -1839,7 +1827,9 @@
         // no need to check class access for invoke-super. A class can obviously access its superclass.
         ClassDef thisClass = classPath.getClassDef(method.getDefiningClass());
 
-        if (!isSuper && !TypeUtils.canAccessClass(
+        if (classPath.getClass(resolvedMethod.getDefiningClass()).isInterface()) {
+            resolvedMethod = new ReparentedMethodReference(resolvedMethod, objectRegisterTypeProto.getType());
+        } else if (!isSuper && !TypeUtils.canAccessClass(
                 thisClass.getType(), classPath.getClassDef(resolvedMethod.getDefiningClass()))) {
 
             // the class is not accessible. So we start looking at objectRegisterTypeProto (which may be different
@@ -1860,13 +1850,20 @@
             MethodReference newResolvedMethod =
                     classPath.getClass(methodClass.getType()).getMethodByVtableIndex(methodIndex);
             if (newResolvedMethod == null) {
-                // TODO: fix NPE here
                 throw new ExceptionWithContext("Couldn't find accessible class while resolving method %s",
                         ReferenceUtil.getMethodDescriptor(resolvedMethod, true));
             }
             resolvedMethod = newResolvedMethod;
             resolvedMethod = new ImmutableMethodReference(methodClass.getType(), resolvedMethod.getName(),
                     resolvedMethod.getParameterTypes(), resolvedMethod.getReturnType());
+
+        }
+
+        if (normalizeVirtualMethods) {
+            MethodReference replacementMethod = normalizeMethodReference(resolvedMethod);
+            if (replacementMethod != null) {
+                resolvedMethod = replacementMethod;
+            }
         }
 
         Instruction deodexedInstruction;
@@ -1967,4 +1964,70 @@
                     "pair because it is the last register.", registerNumber));
         }
     }
+
+    @Nullable
+    private MethodReference normalizeMethodReference(@Nonnull MethodReference methodRef) {
+        TypeProto typeProto = classPath.getClass(methodRef.getDefiningClass());
+        int methodIndex;
+        try {
+            methodIndex = typeProto.findMethodIndexInVtable(methodRef);
+        } catch (UnresolvedClassException ex) {
+            return null;
+        }
+
+        if (methodIndex < 0) {
+            return null;
+        }
+
+        ClassProto thisClass = (ClassProto)classPath.getClass(method.getDefiningClass());
+
+        Method replacementMethod = typeProto.getMethodByVtableIndex(methodIndex);
+        assert replacementMethod != null;
+        while (true) {
+            String superType = typeProto.getSuperclass();
+            if (superType == null) {
+                break;
+            }
+            typeProto = classPath.getClass(superType);
+            Method resolvedMethod = typeProto.getMethodByVtableIndex(methodIndex);
+            if (resolvedMethod == null) {
+                break;
+            }
+
+            if (!resolvedMethod.equals(replacementMethod)) {
+                if (!AnalyzedMethodUtil.canAccess(thisClass, resolvedMethod, false, false, true)) {
+                    continue;
+                }
+
+                replacementMethod = resolvedMethod;
+            }
+        }
+        return replacementMethod;
+    }
+
+    private static class ReparentedMethodReference extends BaseMethodReference {
+        private final MethodReference baseReference;
+        private final String definingClass;
+
+        public ReparentedMethodReference(MethodReference baseReference, String definingClass) {
+            this.baseReference = baseReference;
+            this.definingClass = definingClass;
+        }
+
+        @Override @Nonnull public String getName() {
+            return baseReference.getName();
+        }
+
+        @Override @Nonnull public List<? extends CharSequence> getParameterTypes() {
+            return baseReference.getParameterTypes();
+        }
+
+        @Override @Nonnull public String getReturnType() {
+            return baseReference.getReturnType();
+        }
+
+        @Nonnull @Override public String getDefiningClass() {
+            return definingClass;
+        }
+    }
 }
\ No newline at end of file
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/RegisterType.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/RegisterType.java
index ba782fe..75478ca 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/RegisterType.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/RegisterType.java
@@ -235,7 +235,7 @@
             case '[':
                 return getRegisterType(REFERENCE, classPath.getClass(type));
             default:
-                throw new ExceptionWithContext("Invalid type: " + type);
+                throw new AnalysisException("Invalid type: " + type);
         }
     }
 
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/reflection/util/ReflectionUtils.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/reflection/util/ReflectionUtils.java
index 4a4615a..029ddb9 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/reflection/util/ReflectionUtils.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/reflection/util/ReflectionUtils.java
@@ -31,12 +31,43 @@
 
 package org.jf.dexlib2.analysis.reflection.util;
 
+import com.google.common.collect.ImmutableBiMap;
+
 public class ReflectionUtils {
+
+    private static ImmutableBiMap<String, String> primitiveMap = ImmutableBiMap.<String, String>builder()
+            .put("boolean", "Z")
+            .put("int", "I")
+            .put("long", "J")
+            .put("double", "D")
+            .put("void", "V")
+            .put("float", "F")
+            .put("char", "C")
+            .put("short", "S")
+            .put("byte", "B")
+            .build();
+
     public static String javaToDexName(String javaName) {
-        javaName = javaName.replace('.', '/');
-        if (javaName.length() > 1 && javaName.charAt(javaName.length()-1) != ';') {
-            javaName = 'L' + javaName + ';';
+        if (javaName.charAt(0) == '[') {
+            return javaName.replace('.', '/');
         }
-        return javaName;
+
+        if (primitiveMap.containsKey(javaName)) {
+            return primitiveMap.get(javaName);
+        }
+
+        return 'L' + javaName.replace('.', '/') + ';';
+    }
+
+    public static String dexToJavaName(String dexName) {
+        if (dexName.charAt(0) == '[') {
+            return dexName.replace('/', '.');
+        }
+
+        if (primitiveMap.inverse().containsKey(dexName)) {
+            return primitiveMap.inverse().get(dexName);
+        }
+
+        return dexName.replace('/', '.').substring(1, dexName.length()-2);
     }
 }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseFieldReference.java b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseFieldReference.java
index f056f24..862e342 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseFieldReference.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseFieldReference.java
@@ -32,6 +32,7 @@
 package org.jf.dexlib2.base.reference;
 
 import org.jf.dexlib2.iface.reference.FieldReference;
+import org.jf.dexlib2.util.ReferenceUtil;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
@@ -64,4 +65,8 @@
         if (res != 0) return res;
         return getType().compareTo(o.getType());
     }
+
+    @Override public String toString() {
+        return ReferenceUtil.getFieldDescriptor(this);
+    }
 }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodProtoReference.java b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodProtoReference.java
index c0d38b0..2fc5ed1 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodProtoReference.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodProtoReference.java
@@ -33,6 +33,7 @@
 
 import com.google.common.collect.Ordering;
 import org.jf.dexlib2.iface.reference.MethodProtoReference;
+import org.jf.dexlib2.util.ReferenceUtil;
 import org.jf.util.CharSequenceUtils;
 import org.jf.util.CollectionUtils;
 
@@ -63,4 +64,8 @@
         if (res != 0) return res;
         return CollectionUtils.compareAsIterable(Ordering.usingToString(), getParameterTypes(), o.getParameterTypes());
     }
+
+    @Override public String toString() {
+        return ReferenceUtil.getMethodProtoDescriptor(this);
+    }
 }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodReference.java b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodReference.java
index 3ff6f7d..f297760 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodReference.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseMethodReference.java
@@ -33,6 +33,7 @@
 
 import com.google.common.collect.Ordering;
 import org.jf.dexlib2.iface.reference.MethodReference;
+import org.jf.dexlib2.util.ReferenceUtil;
 import org.jf.util.CharSequenceUtils;
 import org.jf.util.CollectionUtils;
 
@@ -70,4 +71,8 @@
         if (res != 0) return res;
         return CollectionUtils.compareAsIterable(Ordering.usingToString(), getParameterTypes(), o.getParameterTypes());
     }
+
+    @Override public String toString() {
+        return ReferenceUtil.getMethodDescriptor(this);
+    }
 }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseStringReference.java b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseStringReference.java
index c6daa91..2f13c1a 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseStringReference.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/base/reference/BaseStringReference.java
@@ -58,5 +58,5 @@
     @Override public int length() { return getString().length(); }
     @Override public char charAt(int index) { return getString().charAt(index); }
     @Override public CharSequence subSequence(int start, int end) { return getString().subSequence(start, end); }
-    @Override public String toString() { return getString(); }
+    @Override @Nonnull public String toString() { return getString(); }
 }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderOffsetInstruction.java b/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderOffsetInstruction.java
index d75d7b6..27e43d5 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderOffsetInstruction.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/builder/BuilderOffsetInstruction.java
@@ -33,6 +33,7 @@
 
 import org.jf.dexlib2.Opcode;
 import org.jf.dexlib2.iface.instruction.OffsetInstruction;
+import org.jf.util.ExceptionWithContext;
 
 import javax.annotation.Nonnull;
 
@@ -48,9 +49,16 @@
 
     @Override public int getCodeOffset() {
         int codeOffset = internalGetCodeOffset();
-        if ((this.getCodeUnits() == 1 && (codeOffset < Byte.MIN_VALUE || codeOffset > Byte.MAX_VALUE)) ||
-            (this.getCodeUnits() == 2 && (codeOffset < Short.MIN_VALUE || codeOffset > Short.MAX_VALUE))) {
-            throw new IllegalStateException("Target is out of range");
+        if (this.getCodeUnits() == 1) {
+            if (codeOffset < Byte.MIN_VALUE || codeOffset > Byte.MAX_VALUE) {
+                throw new ExceptionWithContext("Invalid instruction offset: %d. " +
+                        "Offset must be in [-128, 127]", codeOffset);
+            }
+        } else if (this.getCodeUnits() == 2) {
+            if (codeOffset < Short.MIN_VALUE || codeOffset > Short.MAX_VALUE) {
+                throw new ExceptionWithContext("Invalid instruction offset: %d. " +
+                        "Offset must be in [-32768, 32767]", codeOffset);
+            }
         }
         return codeOffset;
     }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java
index 32505ee..fe260c5 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedDexFile.java
@@ -33,16 +33,24 @@
 
 import com.google.common.io.ByteStreams;
 import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.ReferenceType;
 import org.jf.dexlib2.dexbacked.raw.*;
+import org.jf.dexlib2.dexbacked.reference.DexBackedFieldReference;
+import org.jf.dexlib2.dexbacked.reference.DexBackedMethodReference;
+import org.jf.dexlib2.dexbacked.reference.DexBackedStringReference;
+import org.jf.dexlib2.dexbacked.reference.DexBackedTypeReference;
 import org.jf.dexlib2.dexbacked.util.FixedSizeSet;
 import org.jf.dexlib2.iface.DexFile;
+import org.jf.dexlib2.iface.reference.Reference;
+import org.jf.dexlib2.util.DexUtil;
 import org.jf.util.ExceptionWithContext;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
-import java.io.EOFException;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.AbstractList;
+import java.util.List;
 import java.util.Set;
 
 public class DexBackedDexFile extends BaseDexBuffer implements DexFile {
@@ -61,13 +69,13 @@
     private final int classCount;
     private final int classStartOffset;
 
-    private DexBackedDexFile(@Nonnull Opcodes opcodes, @Nonnull byte[] buf, int offset, boolean verifyMagic) {
+    protected DexBackedDexFile(@Nonnull Opcodes opcodes, @Nonnull byte[] buf, int offset, boolean verifyMagic) {
         super(buf, offset);
 
         this.opcodes = opcodes;
 
         if (verifyMagic) {
-            verifyMagicAndByteOrder(buf, offset);
+            DexUtil.verifyDexHeader(buf, offset);
         }
 
         stringCount = readSmallUint(HeaderItem.STRING_COUNT_OFFSET);
@@ -85,7 +93,7 @@
     }
 
     public DexBackedDexFile(@Nonnull Opcodes opcodes, @Nonnull BaseDexBuffer buf) {
-        this(opcodes, buf.buf);
+        this(opcodes, buf.buf, buf.baseOffset);
     }
 
     public DexBackedDexFile(@Nonnull Opcodes opcodes, @Nonnull byte[] buf, int offset) {
@@ -96,22 +104,10 @@
         this(opcodes, buf, 0, true);
     }
 
+    @Nonnull
     public static DexBackedDexFile fromInputStream(@Nonnull Opcodes opcodes, @Nonnull InputStream is)
             throws IOException {
-        if (!is.markSupported()) {
-            throw new IllegalArgumentException("InputStream must support mark");
-        }
-        is.mark(44);
-        byte[] partialHeader = new byte[44];
-        try {
-            ByteStreams.readFully(is, partialHeader);
-        } catch (EOFException ex) {
-            throw new NotADexFile("File is too short");
-        } finally {
-            is.reset();
-        }
-
-        verifyMagicAndByteOrder(partialHeader, 0);
+        DexUtil.verifyDexHeader(is);
 
         byte[] buf = ByteStreams.toByteArray(is);
         return new DexBackedDexFile(opcodes, buf, 0, false);
@@ -148,25 +144,6 @@
         };
     }
 
-    private static void verifyMagicAndByteOrder(@Nonnull byte[] buf, int offset) {
-        if (!HeaderItem.verifyMagic(buf, offset)) {
-            StringBuilder sb = new StringBuilder("Invalid magic value:");
-            for (int i=0; i<8; i++) {
-                sb.append(String.format(" %02x", buf[i]));
-            }
-            throw new NotADexFile(sb.toString());
-        }
-
-        int endian = HeaderItem.getEndian(buf, offset);
-        if (endian == HeaderItem.BIG_ENDIAN_TAG) {
-            throw new ExceptionWithContext("Big endian dex files are not currently supported");
-        }
-
-        if (endian != HeaderItem.LITTLE_ENDIAN_TAG) {
-            throw new ExceptionWithContext("Invalid endian tag: 0x%x", endian);
-        }
-    }
-
     public int getStringIdItemOffset(int stringIndex) {
         if (stringIndex < 0 || stringIndex >= stringCount) {
             throw new InvalidItemIndex(stringIndex, "String index out of bounds: %d", stringIndex);
@@ -265,6 +242,81 @@
         return getType(typeIndex);
     }
 
+    public List<DexBackedStringReference> getStrings() {
+        return new AbstractList<DexBackedStringReference>() {
+            @Override public DexBackedStringReference get(int index) {
+                if (index < 0 || index >= getStringCount()) {
+                    throw new IndexOutOfBoundsException();
+                }
+                return new DexBackedStringReference(DexBackedDexFile.this, index);
+            }
+
+            @Override public int size() {
+                return getStringCount();
+            }
+        };
+    }
+
+    public List<DexBackedTypeReference> getTypes() {
+        return new AbstractList<DexBackedTypeReference>() {
+            @Override public DexBackedTypeReference get(int index) {
+                if (index < 0 || index >= getTypeCount()) {
+                    throw new IndexOutOfBoundsException();
+                }
+                return new DexBackedTypeReference(DexBackedDexFile.this, index);
+            }
+
+            @Override public int size() {
+                return getTypeCount();
+            }
+        };
+    }
+
+    public List<DexBackedMethodReference> getMethods() {
+        return new AbstractList<DexBackedMethodReference>() {
+            @Override public DexBackedMethodReference get(int index) {
+                if (index < 0 || index >= getMethodCount()) {
+                    throw new IndexOutOfBoundsException();
+                }
+                return new DexBackedMethodReference(DexBackedDexFile.this, index);
+            }
+
+            @Override public int size() {
+                return getMethodCount();
+            }
+        };
+    }
+
+    public List<DexBackedFieldReference> getFields() {
+        return new AbstractList<DexBackedFieldReference>() {
+            @Override public DexBackedFieldReference get(int index) {
+                if (index < 0 || index >= getFieldCount()) {
+                    throw new IndexOutOfBoundsException();
+                }
+                return new DexBackedFieldReference(DexBackedDexFile.this, index);
+            }
+
+            @Override public int size() {
+                return getFieldCount();
+            }
+        };
+    }
+
+    public List<? extends Reference> getReferences(int referenceType) {
+        switch (referenceType) {
+            case ReferenceType.STRING:
+                return getStrings();
+            case ReferenceType.TYPE:
+                return getTypes();
+            case ReferenceType.METHOD:
+                return getMethods();
+            case ReferenceType.FIELD:
+                return getFields();
+            default:
+                throw new IllegalArgumentException(String.format("Invalid reference type: %d", referenceType));
+        }
+    }
+
     @Override
     @Nonnull
     public DexReader readerAt(int offset) {
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java
index 676d86c..a82032a 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedMethodImplementation.java
@@ -84,7 +84,7 @@
                         // Does the instruction extend past the end of the method?
                         int offset = reader.getOffset();
                         if (offset > endOffset || offset < 0) {
-                            throw new ExceptionWithContext("The last instruction in the method is truncated");
+                            throw new ExceptionWithContext("The last instruction in method %s is truncated", method);
                         }
                         return instruction;
                     }
@@ -129,7 +129,11 @@
             return DebugInfo.newOrEmpty(dexFile, 0, this);
         }
         if (debugOffset < 0) {
-            System.err.println("%s: Invalid debug offset");
+            System.err.println(String.format("%s: Invalid debug offset", method));
+            return DebugInfo.newOrEmpty(dexFile, 0, this);
+        }
+        if (debugOffset >= dexFile.buf.length) {
+            System.err.println(String.format("%s: Invalid debug offset", method));
             return DebugInfo.newOrEmpty(dexFile, 0, this);
         }
         return DebugInfo.newOrEmpty(dexFile, debugOffset, this);
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedOdexFile.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedOdexFile.java
index 12f19db..379ecaa 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedOdexFile.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/DexBackedOdexFile.java
@@ -35,9 +35,9 @@
 import org.jf.dexlib2.Opcodes;
 import org.jf.dexlib2.dexbacked.raw.OdexHeaderItem;
 import org.jf.dexlib2.dexbacked.util.VariableSizeList;
+import org.jf.dexlib2.util.DexUtil;
 
 import javax.annotation.Nonnull;
-import java.io.EOFException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
@@ -49,7 +49,6 @@
 
     private final byte[] odexBuf;
 
-
     public DexBackedOdexFile(@Nonnull Opcodes opcodes, @Nonnull byte[] odexBuf, byte[] dexBuf) {
         super(opcodes, dexBuf);
 
@@ -64,7 +63,7 @@
         return true;
     }
 
-    public List<String> getDependencies() {
+    @Nonnull public List<String> getDependencies() {
         final int dexOffset = OdexHeaderItem.getDexOffset(odexBuf);
         final int dependencyOffset = OdexHeaderItem.getDependenciesOffset(odexBuf) - dexOffset;
 
@@ -85,22 +84,9 @@
         };
     }
 
-    public static DexBackedOdexFile fromInputStream(@Nonnull Opcodes opcodes, @Nonnull InputStream is)
+    @Nonnull public static DexBackedOdexFile fromInputStream(@Nonnull Opcodes opcodes, @Nonnull InputStream is)
             throws IOException {
-        if (!is.markSupported()) {
-            throw new IllegalArgumentException("InputStream must support mark");
-        }
-        is.mark(8);
-        byte[] partialHeader = new byte[8];
-        try {
-            ByteStreams.readFully(is, partialHeader);
-        } catch (EOFException ex) {
-            throw new NotADexFile("File is too short");
-        } finally {
-            is.reset();
-        }
-
-        verifyMagic(partialHeader);
+        DexUtil.verifyOdexHeader(is);
 
         is.reset();
         byte[] odexBuf = new byte[OdexHeaderItem.ITEM_SIZE];
@@ -115,18 +101,8 @@
         return new DexBackedOdexFile(opcodes, odexBuf, dexBuf);
     }
 
-    private static void verifyMagic(byte[] buf) {
-        if (!OdexHeaderItem.verifyMagic(buf)) {
-            StringBuilder sb = new StringBuilder("Invalid magic value:");
-            for (int i=0; i<8; i++) {
-                sb.append(String.format(" %02x", buf[i]));
-            }
-            throw new NotAnOdexFile(sb.toString());
-        }
-    }
-
     public int getOdexVersion() {
-        return OdexHeaderItem.getVersion(odexBuf);
+        return OdexHeaderItem.getVersion(odexBuf, 0);
     }
 
     public static class NotAnOdexFile extends RuntimeException {
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/OatFile.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/OatFile.java
index dbeb67c..aaf942e 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/OatFile.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/OatFile.java
@@ -31,22 +31,29 @@
 
 package org.jf.dexlib2.dexbacked;
 
+import com.google.common.base.Function;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterators;
 import com.google.common.io.ByteStreams;
 import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.dexbacked.OatFile.OatDexFile;
 import org.jf.dexlib2.dexbacked.OatFile.SymbolTable.Symbol;
 import org.jf.dexlib2.dexbacked.raw.HeaderItem;
+import org.jf.dexlib2.iface.MultiDexContainer;
 import org.jf.util.AbstractForwardSequentialList;
 
 import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 import java.io.EOFException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.Charset;
 import java.util.AbstractList;
+import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 
-public class OatFile extends BaseDexBuffer {
+public class OatFile extends BaseDexBuffer implements MultiDexContainer<OatDexFile> {
     private static final byte[] ELF_MAGIC = new byte[] { 0x7f, 'E', 'L', 'F' };
     private static final byte[] OAT_MAGIC = new byte[] { 'o', 'a', 't', '\n' };
     private static final int MIN_ELF_HEADER_SIZE = 52;
@@ -54,7 +61,7 @@
     // These are the "known working" versions that I have manually inspected the source for.
     // Later version may or may not work, depending on what changed.
     private static final int MIN_OAT_VERSION = 56;
-    private static final int MAX_OAT_VERSION = 71;
+    private static final int MAX_OAT_VERSION = 86;
 
     public static final int UNSUPPORTED = 0;
     public static final int SUPPORTED = 1;
@@ -63,8 +70,13 @@
     private final boolean is64bit;
     @Nonnull private final OatHeader oatHeader;
     @Nonnull private final Opcodes opcodes;
+    @Nullable private final VdexProvider vdexProvider;
 
     public OatFile(@Nonnull byte[] buf) {
+        this(buf, null);
+    }
+
+    public OatFile(@Nonnull byte[] buf, @Nullable VdexProvider vdexProvider) {
         super(buf);
 
         if (buf.length < MIN_ELF_HEADER_SIZE) {
@@ -100,6 +112,7 @@
         }
 
         this.opcodes = Opcodes.forArtVersion(oatHeader.getVersion());
+        this.vdexProvider = vdexProvider;
     }
 
     private static void verifyMagic(byte[] buf) {
@@ -110,7 +123,11 @@
         }
     }
 
-    public static OatFile fromInputStream(@Nonnull InputStream is)
+    public static OatFile fromInputStream(@Nonnull InputStream is) throws IOException {
+        return fromInputStream(is, null);
+    }
+
+    public static OatFile fromInputStream(@Nonnull InputStream is, @Nullable VdexProvider vdexProvider)
             throws IOException {
         if (!is.markSupported()) {
             throw new IllegalArgumentException("InputStream must support mark");
@@ -130,7 +147,7 @@
         is.reset();
 
         byte[] buf = ByteStreams.toByteArray(is);
-        return new OatFile(buf);
+        return new OatFile(buf, vdexProvider);
     }
 
     public int getOatVersion() {
@@ -149,6 +166,22 @@
     }
 
     @Nonnull
+    public List<String> getBootClassPath() {
+        if (getOatVersion() < 75) {
+            return ImmutableList.of();
+        }
+        String bcp = oatHeader.getKeyValue("bootclasspath");
+        if (bcp == null) {
+            return ImmutableList.of();
+        }
+        return Arrays.asList(bcp.split(":"));
+    }
+
+    @Nonnull @Override public Opcodes getOpcodes() {
+        return opcodes;
+    }
+
+    @Nonnull
     public List<OatDexFile> getDexFiles() {
         return new AbstractForwardSequentialList<OatDexFile>() {
             @Override public int size() {
@@ -156,53 +189,57 @@
             }
 
             @Nonnull @Override public Iterator<OatDexFile> iterator() {
-                return new Iterator<OatDexFile>() {
-                    int index = 0;
-                    int offset = oatHeader.getDexListStart();
-
-                    @Override public boolean hasNext() {
-                        return index < size();
+                return Iterators.transform(new DexEntryIterator(), new Function<DexEntry, OatDexFile>() {
+                    @Nullable @Override public OatDexFile apply(DexEntry dexEntry) {
+                        return dexEntry.getDexFile();
                     }
-
-                    @Override public OatDexFile next() {
-                        int filenameLength = readSmallUint(offset);
-                        offset += 4;
-
-                        // TODO: what is the correct character encoding?
-                        String filename = new String(buf, offset, filenameLength, Charset.forName("US-ASCII"));
-                        offset += filenameLength;
-
-                        offset += 4; // checksum
-
-                        int dexOffset = readSmallUint(offset) + oatHeader.offset;
-                        offset += 4;
-
-                        int classCount = readSmallUint(dexOffset + HeaderItem.CLASS_COUNT_OFFSET);
-                        offset += 4 * classCount;
-
-                        index++;
-
-                        return new OatDexFile(dexOffset, filename);
-                    }
-
-                    @Override public void remove() {
-                        throw new UnsupportedOperationException();
-                    }
-                };
+                });
             }
         };
     }
 
-    public class OatDexFile extends DexBackedDexFile {
+    @Nonnull @Override public List<String> getDexEntryNames() throws IOException {
+        return new AbstractForwardSequentialList<String>() {
+            @Override public int size() {
+                return oatHeader.getDexFileCount();
+            }
+
+            @Nonnull @Override public Iterator<String> iterator() {
+                return Iterators.transform(new DexEntryIterator(), new Function<DexEntry, String>() {
+                    @Nullable @Override public String apply(DexEntry dexEntry) {
+                        return dexEntry.entryName;
+                    }
+                });
+            }
+        };
+    }
+
+    @Nullable @Override public OatDexFile getEntry(@Nonnull String entryName) throws IOException {
+        DexEntryIterator iterator = new DexEntryIterator();
+        while (iterator.hasNext()) {
+            DexEntry entry = iterator.next();
+
+            if (entry.entryName.equals(entryName)) {
+                return entry.getDexFile();
+            }
+        }
+        return null;
+    }
+
+    public class OatDexFile extends DexBackedDexFile implements MultiDexContainer.MultiDexFile {
         @Nonnull public final String filename;
 
-        public OatDexFile(int offset, @Nonnull String filename) {
-            super(opcodes, OatFile.this.buf, offset);
+        public OatDexFile(byte[] buf, int offset, @Nonnull String filename) {
+            super(opcodes, buf, offset);
             this.filename = filename;
         }
 
-        public int getOatVersion() {
-            return OatFile.this.getOatVersion();
+        @Nonnull @Override public String getEntryName() {
+            return filename;
+        }
+
+        @Nonnull @Override public OatFile getContainer() {
+            return OatFile.this;
         }
 
         @Override public boolean hasOdexOpcodes() {
@@ -211,57 +248,87 @@
     }
 
     private class OatHeader {
-        private final int offset;
+        private final int headerOffset;
 
         public OatHeader(int offset) {
-            this.offset = offset;
+            this.headerOffset = offset;
         }
 
         public boolean isValid() {
             for (int i=0; i<OAT_MAGIC.length; i++) {
-                if (buf[offset + i] != OAT_MAGIC[i]) {
+                if (buf[headerOffset + i] != OAT_MAGIC[i]) {
                     return false;
                 }
             }
 
             for (int i=4; i<7; i++) {
-                if (buf[offset + i] < '0' || buf[offset + i] > '9') {
+                if (buf[headerOffset + i] < '0' || buf[headerOffset + i] > '9') {
                     return false;
                 }
             }
 
-            return buf[offset + 7] == 0;
+            return buf[headerOffset + 7] == 0;
         }
 
         public int getVersion() {
-            return Integer.valueOf(new String(buf, offset + 4, 3));
+            return Integer.valueOf(new String(buf, headerOffset + 4, 3));
         }
 
         public int getDexFileCount() {
-            return readSmallUint(offset + 20);
+            return readSmallUint(headerOffset + 20);
         }
 
         public int getKeyValueStoreSize() {
-            int version = getVersion();
-            if (version < 56) {
+            if (getVersion() < MIN_OAT_VERSION) {
                 throw new IllegalStateException("Unsupported oat version");
             }
             int fieldOffset = 17 * 4;
-            return readSmallUint(offset + fieldOffset);
+            return readSmallUint(headerOffset + fieldOffset);
         }
 
         public int getHeaderSize() {
-            int version = getVersion();
-             if (version >= 56) {
-                return 18*4 + getKeyValueStoreSize();
-            } else {
+            if (getVersion() < MIN_OAT_VERSION) {
                 throw new IllegalStateException("Unsupported oat version");
             }
+            return 18*4 + getKeyValueStoreSize();
+        }
 
+        @Nullable
+        public String getKeyValue(@Nonnull String key) {
+            int size = getKeyValueStoreSize();
+
+            int offset = headerOffset + 18 * 4;
+            int endOffset = offset + size;
+
+            while (offset < endOffset) {
+                int keyStartOffset = offset;
+                while (offset < endOffset && buf[offset] != '\0') {
+                    offset++;
+                }
+                if (offset >= endOffset) {
+                    throw new InvalidOatFileException("Oat file contains truncated key value store");
+                }
+                int keyEndOffset = offset;
+
+                String k = new String(buf, keyStartOffset, keyEndOffset - keyStartOffset);
+                if (k.equals(key)) {
+                    int valueStartOffset = ++offset;
+                    while (offset < endOffset && buf[offset] != '\0') {
+                        offset++;
+                    }
+                    if (offset >= endOffset) {
+                        throw new InvalidOatFileException("Oat file contains truncated key value store");
+                    }
+                    int valueEndOffset = offset;
+                    return new String(buf, valueStartOffset, valueEndOffset - valueStartOffset);
+                }
+                offset++;
+            }
+            return null;
         }
 
         public int getDexListStart() {
-            return offset + getHeaderSize();
+            return headerOffset + getHeaderSize();
         }
     }
 
@@ -481,7 +548,74 @@
 
             return new String(buf, start, end-start, Charset.forName("US-ASCII"));
         }
+    }
 
+    private class DexEntry {
+        public final String entryName;
+        public final byte[] buf;
+        public final int dexOffset;
+
+
+        public DexEntry(String entryName, byte[] buf, int dexOffset) {
+            this.entryName = entryName;
+            this.buf = buf;
+            this.dexOffset = dexOffset;
+        }
+
+        public OatDexFile getDexFile() {
+            return new OatDexFile(buf, dexOffset, entryName);
+        }
+    }
+
+    private class DexEntryIterator implements Iterator<DexEntry> {
+        int index = 0;
+        int offset = oatHeader.getDexListStart();
+
+        @Override public boolean hasNext() {
+            return index < oatHeader.getDexFileCount();
+        }
+
+        @Override public DexEntry next() {
+            int filenameLength = readSmallUint(offset);
+            offset += 4;
+
+            // TODO: what is the correct character encoding?
+            String filename = new String(buf, offset, filenameLength, Charset.forName("US-ASCII"));
+            offset += filenameLength;
+
+            offset += 4; // checksum
+
+            int dexOffset = readSmallUint(offset);
+            offset += 4;
+
+            byte[] buf;
+            if (getOatVersion() >= 87 && vdexProvider != null && vdexProvider.getVdex() != null) {
+                buf = vdexProvider.getVdex();
+            } else {
+                buf = OatFile.this.buf;
+                dexOffset += oatHeader.headerOffset;
+            }
+
+            if (getOatVersion() >= 75) {
+                offset += 4; // offset to class offsets table
+            }
+            if (getOatVersion() >= 73) {
+                offset += 4; // lookup table offset
+            }
+            if (getOatVersion() < 75) {
+                // prior to 75, the class offsets are included here directly
+                int classCount = readSmallUint(dexOffset + HeaderItem.CLASS_COUNT_OFFSET);
+                offset += 4 * classCount;
+            }
+
+            index++;
+
+            return new DexEntry(filename, buf, dexOffset);
+        }
+
+        @Override public void remove() {
+            throw new UnsupportedOperationException();
+        }
     }
 
     public static class InvalidOatFileException extends RuntimeException {
@@ -493,4 +627,9 @@
     public static class NotAnOatFileException extends RuntimeException {
         public NotAnOatFileException() {}
     }
+
+    public interface VdexProvider {
+        @Nullable
+        byte[] getVdex();
+    }
 }
\ No newline at end of file
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/ZipDexContainer.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/ZipDexContainer.java
new file mode 100644
index 0000000..50052c2
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/ZipDexContainer.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.dexbacked;
+
+import com.google.common.collect.Lists;
+import com.google.common.io.ByteStreams;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile.NotADexFile;
+import org.jf.dexlib2.dexbacked.ZipDexContainer.ZipDexFile;
+import org.jf.dexlib2.iface.MultiDexContainer;
+import org.jf.dexlib2.util.DexUtil;
+import org.jf.dexlib2.util.DexUtil.InvalidFile;
+import org.jf.dexlib2.util.DexUtil.UnsupportedFile;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+/**
+ * Represents a zip file that contains dex files (i.e. an apk or jar file)
+ */
+public class ZipDexContainer implements MultiDexContainer<ZipDexFile> {
+
+    private final File zipFilePath;
+    private final Opcodes opcodes;
+
+    /**
+     * Constructs a new ZipDexContainer for the given zip file
+     *
+     * @param zipFilePath The path to the zip file
+     * @param opcodes The Opcodes instance to use when loading dex files from this container
+     */
+    public ZipDexContainer(@Nonnull File zipFilePath, @Nonnull Opcodes opcodes) {
+        this.zipFilePath = zipFilePath;
+        this.opcodes = opcodes;
+    }
+
+    @Nonnull @Override public Opcodes getOpcodes() {
+        return opcodes;
+    }
+
+    /**
+     * Gets a list of the names of dex files in this zip file.
+     *
+     * @return A list of the names of dex files in this zip file
+     */
+    @Nonnull @Override public List<String> getDexEntryNames() throws IOException {
+        List<String> entryNames = Lists.newArrayList();
+        ZipFile zipFile = getZipFile();
+        try {
+            Enumeration<? extends ZipEntry> entriesEnumeration = zipFile.entries();
+
+            while (entriesEnumeration.hasMoreElements()) {
+                ZipEntry entry = entriesEnumeration.nextElement();
+
+                if (!isDex(zipFile, entry)) {
+                    continue;
+                }
+
+                entryNames.add(entry.getName());
+            }
+
+            return entryNames;
+        } finally {
+            zipFile.close();
+        }
+    }
+
+    /**
+     * Loads a dex file from a specific named entry.
+     *
+     * @param entryName The name of the entry
+     * @return A ZipDexFile, or null if there is no entry with the given name
+     * @throws NotADexFile If the entry isn't a dex file
+     */
+    @Nullable @Override public ZipDexFile getEntry(@Nonnull String entryName) throws IOException {
+        ZipFile zipFile = getZipFile();
+        try {
+            ZipEntry entry = zipFile.getEntry(entryName);
+            if (entry == null) {
+                return null;
+            }
+
+            return loadEntry(zipFile, entry);
+        } finally {
+            zipFile.close();
+        }
+    }
+
+    public boolean isZipFile() {
+        ZipFile zipFile = null;
+        try {
+            zipFile = getZipFile();
+            return true;
+        } catch (IOException ex) {
+            return false;
+        } catch (NotAZipFileException ex) {
+            return false;
+        } finally {
+            if(zipFile != null) {
+                try {
+                    zipFile.close();
+                } catch (IOException ex) {
+                    // just eat it
+                }
+            }
+        }
+    }
+
+    public class ZipDexFile extends DexBackedDexFile implements MultiDexContainer.MultiDexFile {
+
+        private final String entryName;
+
+        protected ZipDexFile(@Nonnull Opcodes opcodes, @Nonnull byte[] buf, @Nonnull String entryName) {
+            super(opcodes, buf, 0);
+            this.entryName = entryName;
+        }
+
+        @Nonnull @Override public String getEntryName() {
+            return entryName;
+        }
+
+        @Nonnull @Override public MultiDexContainer getContainer() {
+            return ZipDexContainer.this;
+        }
+    }
+
+    protected boolean isDex(@Nonnull ZipFile zipFile, @Nonnull ZipEntry zipEntry) throws IOException {
+        InputStream inputStream = new BufferedInputStream(zipFile.getInputStream(zipEntry));
+        try {
+            DexUtil.verifyDexHeader(inputStream);
+        } catch (NotADexFile ex) {
+            return false;
+        } catch (InvalidFile ex) {
+            return false;
+        } catch (UnsupportedFile ex) {
+            return false;
+        } finally {
+            inputStream.close();
+        }
+        return true;
+    }
+
+    protected ZipFile getZipFile() throws IOException {
+        try {
+            return new ZipFile(zipFilePath);
+        } catch (IOException ex) {
+            throw new NotAZipFileException();
+        }
+    }
+
+    @Nonnull
+    protected ZipDexFile loadEntry(@Nonnull ZipFile zipFile, @Nonnull ZipEntry zipEntry) throws IOException {
+        InputStream inputStream = zipFile.getInputStream(zipEntry);
+        try {
+            byte[] buf = ByteStreams.toByteArray(inputStream);
+            return new ZipDexFile(opcodes, buf, zipEntry.getName());
+        } finally {
+            inputStream.close();
+        }
+    }
+
+    public static class NotAZipFileException extends RuntimeException {
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java
index 2f3af4c..e8db969 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/HeaderItem.java
@@ -42,15 +42,8 @@
 public class HeaderItem {
     public static final int ITEM_SIZE = 0x70;
 
-    /**
-     * The magic numbers for dex files.
-     *
-     * They are: "dex\n035\0", "dex\n037\0", and "dex\n038\0".
-     */
-    public static final byte[][] MAGIC_VALUES= new byte[][] {
-            new byte[]{0x64, 0x65, 0x78, 0x0a, 0x30, 0x33, 0x35, 0x00},
-            new byte[]{0x64, 0x65, 0x78, 0x0a, 0x30, 0x33, 0x37, 0x00},
-            new byte[]{0x64, 0x65, 0x78, 0x0a, 0x30, 0x33, 0x38, 0x00}};
+    private static final byte[] MAGIC_VALUE = new byte[] { 0x64, 0x65, 0x78, 0x0a, 0x00, 0x00, 0x00, 0x00 };
+    private static final int[] SUPPORTED_DEX_VERSIONS = new int[] { 35, 37, 38 };
 
     public static final int LITTLE_ENDIAN_TAG = 0x12345678;
     public static final int BIG_ENDIAN_TAG = 0x78563412;
@@ -231,51 +224,100 @@
         return "Invalid";
     }
 
-
     /**
-     * Get the higest magic number supported by Android for this api level.
+     * Get the highest magic number supported by Android for this api level.
      * @return The dex file magic number
      */
     public static byte[] getMagicForApi(int api) {
         if (api < 24) {
             // Prior to Android N we only support dex version 035.
-            return HeaderItem.MAGIC_VALUES[0];
+            return getMagicForDexVersion(35);
         } else if (api < 26) {
             // On android N and later we support dex version 037.
-            return HeaderItem.MAGIC_VALUES[1];
+            return getMagicForDexVersion(37);
         } else {
             // On android O and later we support dex version 038.
-            return HeaderItem.MAGIC_VALUES[2];
+            return getMagicForDexVersion(38);
         }
     }
 
-    private static int getVersion(byte[] buf, int offset) {
-        if (buf.length - offset < 8) {
-            return 0;
+    public static byte[] getMagicForDexVersion(int dexVersion) {
+        byte[] magic = MAGIC_VALUE.clone();
+
+        if (dexVersion < 0 || dexVersion > 999) {
+            throw new IllegalArgumentException("dexVersion must be within [0, 999]");
         }
 
-        boolean matches = true;
-        for (int i=0; i<MAGIC_VALUES.length; i++) {
-            byte[] expected = MAGIC_VALUES[i];
-            matches = true;
-            for (int j=0; j<8; j++) {
-                if (buf[offset + j] != expected[j]) {
-                    matches = false;
-                    break;
+        for (int i=6; i>=4; i--) {
+            int digit = dexVersion % 10;
+            magic[i] = (byte)('0' + digit);
+            dexVersion /= 10;
+        }
+
+        return magic;
+    }
+
+    /**
+     * Verifies the magic value at the beginning of a dex file
+     *
+     * @param buf A byte array containing at least the first 8 bytes of a dex file
+     * @param offset The offset within the buffer to the beginning of the dex header
+     * @return True if the magic value is valid
+     */
+    public static boolean verifyMagic(byte[] buf, int offset) {
+        if (buf.length - offset < 8) {
+            return false;
+        }
+
+        for (int i=0; i<4; i++) {
+            if (buf[offset + i] != MAGIC_VALUE[i]) {
+                return false;
                 }
             }
-            if (matches) {
-                return i==0?35:(i==1?37:38);
+        for (int i=4; i<7; i++) {
+            if (buf[offset + i] < '0' ||
+                    buf[offset + i] > '9') {
+                return false;
             }
         }
-        return 0;
+        if (buf[offset + 7] != MAGIC_VALUE[7]) {
+            return false;
     }
 
-    public static boolean verifyMagic(byte[] buf, int offset) {
-        // verifies the magic value
-        return getVersion(buf, offset) != 0;
+        return true;
     }
 
+    /**
+     * Gets the dex version from a dex header
+     *
+     * @param buf A byte array containing at least the first 7 bytes of a dex file
+     * @param offset The offset within the buffer to the beginning of the dex header
+     * @return The dex version if the header is valid or -1 if the header is invalid
+     */
+    public static int getVersion(byte[] buf, int offset) {
+        if (!verifyMagic(buf, offset)) {
+            return -1;
+        }
+
+        return getVersionUnchecked(buf, offset);
+    }
+
+    private static int getVersionUnchecked(byte[] buf, int offset) {
+        int version = (buf[offset + 4] - '0') * 100;
+        version += (buf[offset + 5] - '0') * 10;
+        version += buf[offset + 6] - '0';
+
+        return version;
+    }
+
+    public static boolean isSupportedDexVersion(int version) {
+        for (int i=0; i<SUPPORTED_DEX_VERSIONS.length; i++) {
+            if (SUPPORTED_DEX_VERSIONS[i] == version) {
+                return true;
+            }
+        }
+        return false;
+    }
 
     public static int getEndian(byte[] buf, int offset) {
         BaseDexBuffer bdb = new BaseDexBuffer(buf);
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/OdexHeaderItem.java b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/OdexHeaderItem.java
index c6599bc..7566834 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/OdexHeaderItem.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/dexbacked/raw/OdexHeaderItem.java
@@ -36,10 +36,8 @@
 public class OdexHeaderItem {
     public static final int ITEM_SIZE = 40;
 
-    public static final byte[][] MAGIC_VALUES= new byte[][] {
-            new byte[] {0x64, 0x65, 0x79, 0x0A, 0x30, 0x33, 0x35, 0x00}, // "dey\n035\0"
-            new byte[] {0x64, 0x65, 0x79, 0x0A, 0x30, 0x33, 0x36, 0x00}  // "dey\n036\0"
-    };
+    private static final byte[] MAGIC_VALUE = new byte[] { 0x64, 0x65, 0x79, 0x0A, 0x00, 0x00, 0x00, 0x00 };
+    private static final int[] SUPPORTED_ODEX_VERSIONS = new int[] { 35, 36 };
 
     public static final int MAGIC_OFFSET = 0;
     public static final int MAGIC_LENGTH = 8;
@@ -51,31 +49,66 @@
     public static final int AUX_LENGTH_OFFSET = 28;
     public static final int FLAGS_OFFSET = 32;
 
-    public static int getVersion(byte[] magic) {
-        if (magic.length < 8) {
-            return 0;
+    /**
+     * Verifies the magic value at the beginning of an odex file
+     *
+     * @param buf A byte array containing at least the first 8 bytes of an odex file
+     * @param offset The offset within the buffer to the beginning of the odex header
+     * @return True if the magic value is valid
+     */
+    public static boolean verifyMagic(byte[] buf, int offset) {
+        if (buf.length - offset < 8) {
+            return false;
         }
 
-        boolean matches = true;
-        for (int i=0; i<MAGIC_VALUES.length; i++) {
-            byte[] expected = MAGIC_VALUES[i];
-            matches = true;
-            for (int j=0; j<8; j++) {
-                if (magic[j] != expected[j]) {
-                    matches = false;
-                    break;
-                }
-            }
-            if (matches) {
-                return i==0?35:36;
+        for (int i=0; i<4; i++) {
+            if (buf[offset + i] != MAGIC_VALUE[i]) {
+                return false;
             }
         }
-        return 0;
+        for (int i=4; i<7; i++) {
+            if (buf[offset + i] < '0' ||
+                    buf[offset + i] > '9') {
+                return false;
+            }
+        }
+        if (buf[offset + 7] != MAGIC_VALUE[7]) {
+            return false;
+        }
+
+        return true;
     }
 
-    public static boolean verifyMagic(byte[] buf) {
-        // verifies the magic value
-        return getVersion(buf) != 0;
+    /**
+     * Gets the dex version from an odex header
+     *
+     * @param buf A byte array containing at least the first 7 bytes of an odex file
+     * @param offset The offset within the buffer to the beginning of the odex header
+     * @return The odex version if the header is valid or -1 if the header is invalid
+     */
+    public static int getVersion(byte[] buf, int offset) {
+        if (!verifyMagic(buf, offset)) {
+            return -1;
+        }
+
+        return getVersionUnchecked(buf, offset);
+    }
+
+    private static int getVersionUnchecked(byte[] buf, int offset) {
+        int version = (buf[offset + 4] - '0') * 100;
+        version += (buf[offset + 5] - '0') * 10;
+        version += buf[offset + 6] - '0';
+
+        return version;
+    }
+
+    public static boolean isSupportedOdexVersion(int version) {
+        for (int i=0; i<SUPPORTED_ODEX_VERSIONS.length; i++) {
+            if (SUPPORTED_ODEX_VERSIONS[i] == version) {
+                return true;
+            }
+        }
+        return false;
     }
 
     public static int getDexOffset(byte[] buf) {
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/iface/MultiDexContainer.java b/dexlib2/src/main/java/org/jf/dexlib2/iface/MultiDexContainer.java
new file mode 100644
index 0000000..6c4e769
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/iface/MultiDexContainer.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.iface;
+
+import org.jf.dexlib2.Opcodes;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.util.List;
+
+/**
+ * This class represents a dex container that can contain multiple, named dex files
+ */
+public interface MultiDexContainer<T extends DexFile> {
+    /**
+     * @return A list of the names of dex entries in this container
+     */
+    @Nonnull List<String> getDexEntryNames() throws IOException;
+
+    /**
+     * Gets the dex entry with the given name
+     *
+     * @param entryName The name of the entry
+     * @return A DexFile, or null if no entry with that name is found
+     */
+    @Nullable T getEntry(@Nonnull String entryName) throws IOException;
+
+    /**
+     * @return the Opcodes instance associated with this MultiDexContainer
+     */
+    @Nonnull Opcodes getOpcodes();
+
+    /**
+     * This class represents a dex file that is contained in a MultiDexContainer
+     */
+    interface MultiDexFile extends DexFile {
+        /**
+         * @return The name of this entry within its container
+         */
+        @Nonnull String getEntryName();
+
+        /**
+         * @return The MultiDexContainer that contains this dex file
+         */
+        @Nonnull MultiDexContainer<? extends MultiDexFile> getContainer();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableDexFile.java b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableDexFile.java
index 2112bd0..76f39a1 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableDexFile.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/immutable/ImmutableDexFile.java
@@ -45,18 +45,6 @@
     @Nonnull protected final ImmutableSet<? extends ImmutableClassDef> classes;
     @Nonnull private final Opcodes opcodes;
 
-    @Deprecated
-    public ImmutableDexFile(@Nullable Collection<? extends ClassDef> classes) {
-        this.classes = ImmutableClassDef.immutableSetOf(classes);
-        this.opcodes = Opcodes.forApi(19);
-    }
-
-    @Deprecated
-    public ImmutableDexFile(@Nullable ImmutableSet<? extends ImmutableClassDef> classes) {
-        this.classes = ImmutableUtils.nullToEmptySet(classes);
-        this.opcodes = Opcodes.forApi(19);
-    }
-
     public ImmutableDexFile(@Nonnull Opcodes opcodes, @Nullable Collection<? extends ClassDef> classes) {
         this.classes = ImmutableClassDef.immutableSetOf(classes);
         this.opcodes = opcodes;
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/util/DexUtil.java b/dexlib2/src/main/java/org/jf/dexlib2/util/DexUtil.java
new file mode 100644
index 0000000..389edfd
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/util/DexUtil.java
@@ -0,0 +1,189 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.util;
+
+import com.google.common.io.ByteStreams;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile.NotADexFile;
+import org.jf.dexlib2.dexbacked.DexBackedOdexFile.NotAnOdexFile;
+import org.jf.dexlib2.dexbacked.raw.HeaderItem;
+import org.jf.dexlib2.dexbacked.raw.OdexHeaderItem;
+
+import javax.annotation.Nonnull;
+import java.io.EOFException;
+import java.io.IOException;
+import java.io.InputStream;
+
+public class DexUtil {
+
+    /**
+     * Reads in the dex header from the given input stream and verifies that it is valid and a supported version
+     *
+     * The inputStream must support mark(), and will be reset to initial position upon exiting the method
+     *
+     * @param inputStream An input stream that is positioned at a dex header
+     * @throws NotADexFile If the file is not a dex file
+     * @throws InvalidFile If the header appears to be a dex file, but is not valid for some reason
+     * @throws UnsupportedFile If the dex header is valid, but uses unsupported functionality
+     */
+    public static void verifyDexHeader(@Nonnull InputStream inputStream) throws IOException {
+        if (!inputStream.markSupported()) {
+            throw new IllegalArgumentException("InputStream must support mark");
+        }
+        inputStream.mark(44);
+        byte[] partialHeader = new byte[44];
+        try {
+            ByteStreams.readFully(inputStream, partialHeader);
+        } catch (EOFException ex) {
+            throw new NotADexFile("File is too short");
+        } finally {
+            inputStream.reset();
+        }
+
+        verifyDexHeader(partialHeader, 0);
+    }
+
+    /**
+     * Verifies that the dex header is valid and a supported version
+     *
+     * @param buf A byte array containing at least the first 44 bytes of a dex file
+     * @param offset The offset within the array to the dex header
+     * @throws NotADexFile If the file is not a dex file
+     * @throws InvalidFile If the header appears to be a dex file, but is not valid for some reason
+     * @throws UnsupportedFile If the dex header is valid, but uses unsupported functionality
+     */
+    public static void verifyDexHeader(@Nonnull byte[] buf, int offset) {
+        int dexVersion = HeaderItem.getVersion(buf, offset);
+        if (dexVersion == -1) {
+            StringBuilder sb = new StringBuilder("Not a valid dex magic value:");
+            for (int i=0; i<8; i++) {
+                sb.append(String.format(" %02x", buf[i]));
+            }
+            throw new NotADexFile(sb.toString());
+        }
+
+        if (!HeaderItem.isSupportedDexVersion(dexVersion)) {
+            throw new UnsupportedFile(String.format("Dex version %03d is not supported", dexVersion));
+        }
+
+        int endian = HeaderItem.getEndian(buf, offset);
+        if (endian == HeaderItem.BIG_ENDIAN_TAG) {
+            throw new UnsupportedFile("Big endian dex files are not supported");
+        }
+
+        if (endian != HeaderItem.LITTLE_ENDIAN_TAG) {
+            throw new InvalidFile(String.format("Invalid endian tag: 0x%x", endian));
+        }
+    }
+
+    /**
+     * Reads in the odex header from the given input stream and verifies that it is valid and a supported version
+     *
+     * The inputStream must support mark(), and will be reset to initial position upon exiting the method
+     *
+     * @param inputStream An input stream that is positioned at an odex header
+     * @throws NotAnOdexFile If the file is not an odex file
+     * @throws UnsupportedFile If the odex header is valid, but is an unsupported version
+     */
+    public static void verifyOdexHeader(@Nonnull InputStream inputStream) throws IOException {
+        if (!inputStream.markSupported()) {
+            throw new IllegalArgumentException("InputStream must support mark");
+        }
+        inputStream.mark(8);
+        byte[] partialHeader = new byte[8];
+        try {
+            ByteStreams.readFully(inputStream, partialHeader);
+        } catch (EOFException ex) {
+            throw new NotAnOdexFile("File is too short");
+        } finally {
+            inputStream.reset();
+        }
+
+        verifyOdexHeader(partialHeader, 0);
+    }
+
+    /**
+     * Verifies that the odex header is valid and a supported version
+     *
+     * @param buf A byte array containing at least the first 8 bytes of an odex file
+     * @param offset The offset within the array to the odex header
+     * @throws NotAnOdexFile If the file is not an odex file
+     * @throws UnsupportedFile If the odex header is valid, but uses unsupported functionality
+     */
+    public static void verifyOdexHeader(@Nonnull byte[] buf, int offset) {
+        int odexVersion = OdexHeaderItem.getVersion(buf, offset);
+        if (odexVersion == -1) {
+            StringBuilder sb = new StringBuilder("Not a valid odex magic value:");
+            for (int i=0; i<8; i++) {
+                sb.append(String.format(" %02x", buf[i]));
+            }
+            throw new NotAnOdexFile(sb.toString());
+        }
+
+        if (!OdexHeaderItem.isSupportedOdexVersion(odexVersion)) {
+            throw new UnsupportedFile(String.format("Odex version %03d is not supported", odexVersion));
+        }
+    }
+
+    public static class InvalidFile extends RuntimeException {
+        public InvalidFile() {
+        }
+
+        public InvalidFile(String message) {
+            super(message);
+        }
+
+        public InvalidFile(String message, Throwable cause) {
+            super(message, cause);
+        }
+
+        public InvalidFile(Throwable cause) {
+            super(cause);
+        }
+    }
+
+    public static class UnsupportedFile extends RuntimeException {
+        public UnsupportedFile() {
+        }
+
+        public UnsupportedFile(String message) {
+            super(message);
+        }
+
+        public UnsupportedFile(String message, Throwable cause) {
+            super(message, cause);
+        }
+
+        public UnsupportedFile(Throwable cause) {
+            super(cause);
+        }
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java
index 6ca1ce9..00cce65 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/DexWriter.java
@@ -53,11 +53,7 @@
 import org.jf.dexlib2.iface.instruction.OneRegisterInstruction;
 import org.jf.dexlib2.iface.instruction.ReferenceInstruction;
 import org.jf.dexlib2.iface.instruction.formats.*;
-import org.jf.dexlib2.iface.reference.FieldReference;
-import org.jf.dexlib2.iface.reference.MethodProtoReference;
-import org.jf.dexlib2.iface.reference.MethodReference;
-import org.jf.dexlib2.iface.reference.StringReference;
-import org.jf.dexlib2.iface.reference.TypeReference;
+import org.jf.dexlib2.iface.reference.*;
 import org.jf.dexlib2.util.InstructionUtil;
 import org.jf.dexlib2.util.MethodUtil;
 import org.jf.dexlib2.util.ReferenceUtil;
@@ -92,7 +88,18 @@
         TypeListKey,
         FieldKey, MethodKey,
         EncodedValue,
-        AnnotationElement extends org.jf.dexlib2.iface.AnnotationElement> {
+        AnnotationElement extends org.jf.dexlib2.iface.AnnotationElement,
+        StringSectionType extends StringSection<StringKey, StringRef>,
+        TypeSectionType extends TypeSection<StringKey, TypeKey, TypeRef>,
+        ProtoSectionType extends ProtoSection<StringKey, TypeKey, ProtoRefKey, TypeListKey>,
+        FieldSectionType extends FieldSection<StringKey, TypeKey, FieldRefKey, FieldKey>,
+        MethodSectionType extends MethodSection<StringKey, TypeKey, ProtoRefKey, MethodRefKey, MethodKey>,
+        ClassSectionType extends ClassSection<StringKey, TypeKey, TypeListKey, ClassKey, FieldKey, MethodKey,
+                AnnotationSetKey, EncodedValue>,
+        TypeListSectionType extends TypeListSection<TypeKey, TypeListKey>,
+        AnnotationSectionType extends AnnotationSection<StringKey, TypeKey, AnnotationKey, AnnotationElement,
+                EncodedValue>,
+        AnnotationSetSectionType extends AnnotationSetSection<AnnotationKey, AnnotationSetKey>> {
     public static final int NO_INDEX = -1;
     public static final int NO_OFFSET = 0;
 
@@ -124,43 +131,34 @@
     protected int numCodeItemItems = 0;
     protected int numClassDataItems = 0;
 
-    protected final StringSection<StringKey, StringRef> stringSection;
-    protected final TypeSection<StringKey, TypeKey, TypeRef> typeSection;
-    protected final ProtoSection<StringKey, TypeKey, ProtoRefKey, TypeListKey> protoSection;
-    protected final FieldSection<StringKey, TypeKey, FieldRefKey, FieldKey> fieldSection;
-    protected final MethodSection<StringKey, TypeKey, ProtoRefKey, MethodRefKey, MethodKey> methodSection;
-    protected final ClassSection<StringKey, TypeKey, TypeListKey, ClassKey, FieldKey, MethodKey, AnnotationSetKey,
-            EncodedValue> classSection;
+    public final StringSectionType stringSection;
+    public final TypeSectionType typeSection;
+    public final ProtoSectionType protoSection;
+    public final FieldSectionType fieldSection;
+    public final MethodSectionType methodSection;
+    public final ClassSectionType classSection;
     
-    protected final TypeListSection<TypeKey, TypeListKey> typeListSection;
-    protected final AnnotationSection<StringKey, TypeKey, AnnotationKey, AnnotationElement, EncodedValue> annotationSection;
-    protected final AnnotationSetSection<AnnotationKey, AnnotationSetKey> annotationSetSection;
+    public final TypeListSectionType typeListSection;
+    public final AnnotationSectionType annotationSection;
+    public final AnnotationSetSectionType annotationSetSection;
 
-    protected DexWriter(Opcodes opcodes,
-                        StringSection<StringKey, StringRef> stringSection,
-                        TypeSection<StringKey, TypeKey, TypeRef> typeSection,
-                        ProtoSection<StringKey, TypeKey, ProtoRefKey, TypeListKey> protoSection,
-                        FieldSection<StringKey, TypeKey, FieldRefKey, FieldKey> fieldSection,
-                        MethodSection<StringKey, TypeKey, ProtoRefKey, MethodRefKey, MethodKey> methodSection,
-                        ClassSection<StringKey, TypeKey, TypeListKey, ClassKey, FieldKey, MethodKey, AnnotationSetKey,
-                                EncodedValue> classSection,
-                        TypeListSection<TypeKey, TypeListKey> typeListSection,
-                        AnnotationSection<StringKey, TypeKey, AnnotationKey, AnnotationElement,
-                                EncodedValue> annotationSection,
-                        AnnotationSetSection<AnnotationKey, AnnotationSetKey> annotationSetSection) {
+    protected DexWriter(Opcodes opcodes) {
         this.opcodes = opcodes;
 
-        this.stringSection = stringSection;
-        this.typeSection = typeSection;
-        this.protoSection = protoSection;
-        this.fieldSection = fieldSection;
-        this.methodSection = methodSection;
-        this.classSection = classSection;
-        this.typeListSection = typeListSection;
-        this.annotationSection = annotationSection;
-        this.annotationSetSection = annotationSetSection;
+        SectionProvider sectionProvider = getSectionProvider();
+        this.stringSection = sectionProvider.getStringSection();
+        this.typeSection = sectionProvider.getTypeSection();
+        this.protoSection = sectionProvider.getProtoSection();
+        this.fieldSection = sectionProvider.getFieldSection();
+        this.methodSection = sectionProvider.getMethodSection();
+        this.classSection = sectionProvider.getClassSection();
+        this.typeListSection = sectionProvider.getTypeListSection();
+        this.annotationSection = sectionProvider.getAnnotationSection();
+        this.annotationSetSection = sectionProvider.getAnnotationSetSection();
     }
 
+    @Nonnull protected abstract SectionProvider getSectionProvider();
+
     protected abstract void writeEncodedValue(@Nonnull InternalEncodedValueWriter writer,
                                               @Nonnull EncodedValue encodedValue) throws IOException;
 
@@ -192,12 +190,12 @@
 
     private int getDataSectionOffset() {
         return HeaderItem.ITEM_SIZE +
-                stringSection.getItems().size() * StringIdItem.ITEM_SIZE +
-                typeSection.getItems().size() * TypeIdItem.ITEM_SIZE +
-                protoSection.getItems().size() * ProtoIdItem.ITEM_SIZE +
-                fieldSection.getItems().size() * FieldIdItem.ITEM_SIZE +
-                methodSection.getItems().size() * MethodIdItem.ITEM_SIZE +
-                classSection.getItems().size() * ClassDefItem.ITEM_SIZE;
+                stringSection.getItemCount() * StringIdItem.ITEM_SIZE +
+                typeSection.getItemCount() * TypeIdItem.ITEM_SIZE +
+                protoSection.getItemCount() * ProtoIdItem.ITEM_SIZE +
+                fieldSection.getItemCount() * FieldIdItem.ITEM_SIZE +
+                methodSection.getItemCount() * MethodIdItem.ITEM_SIZE +
+                classSection.getItemCount() * ClassDefItem.ITEM_SIZE;
     }
 
     @Nonnull
@@ -227,6 +225,22 @@
         return classReferences;
     }
 
+    /**
+     * Checks whether any of the size-sensitive constant pools have overflowed.
+     *
+     * This checks whether the type, method, field pools are larger than 64k entries.
+     *
+     * Note that even if this returns true, it may still be possible to successfully write the dex file, if the
+     * overflowed items are not referenced anywhere that uses a 16-bit index
+     *
+     * @return true if any of the size-sensitive constant pools have overflowed
+     */
+    public boolean hasOverflowed() {
+        return methodSection.getItemCount() > (1 << 16) ||
+                typeSection.getItemCount() > (1 << 16) ||
+                fieldSection.getItemCount() > (1 << 16);
+    }
+
     public void writeTo(@Nonnull DexDataStore dest) throws IOException {
         this.writeTo(dest, MemoryDeferredOutputStream.getFactory());
     }
@@ -801,7 +815,14 @@
 
                 int debugItemOffset = writeDebugItem(offsetWriter, debugWriter,
                         classSection.getParameterNames(methodKey), debugItems);
-                int codeItemOffset = writeCodeItem(codeWriter, ehBuf, methodKey, tryBlocks, instructions, debugItemOffset);
+                int codeItemOffset;
+                try {
+                    codeItemOffset = writeCodeItem(
+                            codeWriter, ehBuf, methodKey, tryBlocks, instructions, debugItemOffset);
+                } catch (RuntimeException ex) {
+                    throw new ExceptionWithContext(ex, "Exception occurred while writing code_item for method %s",
+                            methodSection.getMethodReference(methodKey));
+                }
 
                 if (codeItemOffset != -1) {
                     codeOffsets.add(new CodeItemOffset<MethodKey>(methodKey, codeItemOffset));
@@ -950,105 +971,111 @@
                             methodSection, protoSection);
 
             writer.writeInt(codeUnitCount);
+            int codeOffset = 0;
             for (Instruction instruction: instructions) {
-                switch (instruction.getOpcode().format) {
-                    case Format10t:
-                        instructionWriter.write((Instruction10t)instruction);
-                        break;
-                    case Format10x:
-                        instructionWriter.write((Instruction10x)instruction);
-                        break;
-                    case Format11n:
-                        instructionWriter.write((Instruction11n)instruction);
-                        break;
-                    case Format11x:
-                        instructionWriter.write((Instruction11x)instruction);
-                        break;
-                    case Format12x:
-                        instructionWriter.write((Instruction12x)instruction);
-                        break;
-                    case Format20bc:
-                        instructionWriter.write((Instruction20bc)instruction);
-                        break;
-                    case Format20t:
-                        instructionWriter.write((Instruction20t)instruction);
-                        break;
-                    case Format21c:
-                        instructionWriter.write((Instruction21c)instruction);
-                        break;
-                    case Format21ih:
-                        instructionWriter.write((Instruction21ih)instruction);
-                        break;
-                    case Format21lh:
-                        instructionWriter.write((Instruction21lh)instruction);
-                        break;
-                    case Format21s:
-                        instructionWriter.write((Instruction21s)instruction);
-                        break;
-                    case Format21t:
-                        instructionWriter.write((Instruction21t)instruction);
-                        break;
-                    case Format22b:
-                        instructionWriter.write((Instruction22b)instruction);
-                        break;
-                    case Format22c:
-                        instructionWriter.write((Instruction22c)instruction);
-                        break;
-                    case Format22s:
-                        instructionWriter.write((Instruction22s)instruction);
-                        break;
-                    case Format22t:
-                        instructionWriter.write((Instruction22t)instruction);
-                        break;
-                    case Format22x:
-                        instructionWriter.write((Instruction22x)instruction);
-                        break;
-                    case Format23x:
-                        instructionWriter.write((Instruction23x)instruction);
-                        break;
-                    case Format30t:
-                        instructionWriter.write((Instruction30t)instruction);
-                        break;
-                    case Format31c:
-                        instructionWriter.write((Instruction31c)instruction);
-                        break;
-                    case Format31i:
-                        instructionWriter.write((Instruction31i)instruction);
-                        break;
-                    case Format31t:
-                        instructionWriter.write((Instruction31t)instruction);
-                        break;
-                    case Format32x:
-                        instructionWriter.write((Instruction32x)instruction);
-                        break;
-                    case Format35c:
-                        instructionWriter.write((Instruction35c)instruction);
-                        break;
-                    case Format3rc:
-                        instructionWriter.write((Instruction3rc)instruction);
-                        break;
-                    case Format45cc:
-                        instructionWriter.write((Instruction45cc) instruction);
-                        break;
-                    case Format4rcc:
-                        instructionWriter.write((Instruction4rcc) instruction);
-                        break;
-                    case Format51l:
-                        instructionWriter.write((Instruction51l)instruction);
-                        break;
-                    case ArrayPayload:
-                        instructionWriter.write((ArrayPayload)instruction);
-                        break;
-                    case PackedSwitchPayload:
-                        instructionWriter.write((PackedSwitchPayload)instruction);
-                        break;
-                    case SparseSwitchPayload:
-                        instructionWriter.write((SparseSwitchPayload)instruction);
-                        break;
-                    default:
-                        throw new ExceptionWithContext("Unsupported instruction format: %s",
-                                instruction.getOpcode().format);
+                try {
+                    switch (instruction.getOpcode().format) {
+                        case Format10t:
+                            instructionWriter.write((Instruction10t)instruction);
+                            break;
+                        case Format10x:
+                            instructionWriter.write((Instruction10x)instruction);
+                            break;
+                        case Format11n:
+                            instructionWriter.write((Instruction11n)instruction);
+                            break;
+                        case Format11x:
+                            instructionWriter.write((Instruction11x)instruction);
+                            break;
+                        case Format12x:
+                            instructionWriter.write((Instruction12x)instruction);
+                            break;
+                        case Format20bc:
+                            instructionWriter.write((Instruction20bc)instruction);
+                            break;
+                        case Format20t:
+                            instructionWriter.write((Instruction20t)instruction);
+                            break;
+                        case Format21c:
+                            instructionWriter.write((Instruction21c)instruction);
+                            break;
+                        case Format21ih:
+                            instructionWriter.write((Instruction21ih)instruction);
+                            break;
+                        case Format21lh:
+                            instructionWriter.write((Instruction21lh)instruction);
+                            break;
+                        case Format21s:
+                            instructionWriter.write((Instruction21s)instruction);
+                            break;
+                        case Format21t:
+                            instructionWriter.write((Instruction21t)instruction);
+                            break;
+                        case Format22b:
+                            instructionWriter.write((Instruction22b)instruction);
+                            break;
+                        case Format22c:
+                            instructionWriter.write((Instruction22c)instruction);
+                            break;
+                        case Format22s:
+                            instructionWriter.write((Instruction22s)instruction);
+                            break;
+                        case Format22t:
+                            instructionWriter.write((Instruction22t)instruction);
+                            break;
+                        case Format22x:
+                            instructionWriter.write((Instruction22x)instruction);
+                            break;
+                        case Format23x:
+                            instructionWriter.write((Instruction23x)instruction);
+                            break;
+                        case Format30t:
+                            instructionWriter.write((Instruction30t)instruction);
+                            break;
+                        case Format31c:
+                            instructionWriter.write((Instruction31c)instruction);
+                            break;
+                        case Format31i:
+                            instructionWriter.write((Instruction31i)instruction);
+                            break;
+                        case Format31t:
+                            instructionWriter.write((Instruction31t)instruction);
+                            break;
+                        case Format32x:
+                            instructionWriter.write((Instruction32x)instruction);
+                            break;
+                        case Format35c:
+                            instructionWriter.write((Instruction35c)instruction);
+                            break;
+                        case Format3rc:
+                            instructionWriter.write((Instruction3rc)instruction);
+                            break;
+                        case Format45cc:
+                            instructionWriter.write((Instruction45cc)instruction);
+                            break;
+                        case Format4rcc:
+                            instructionWriter.write((Instruction4rcc)instruction);
+                            break;
+                        case Format51l:
+                            instructionWriter.write((Instruction51l)instruction);
+                            break;
+                        case ArrayPayload:
+                            instructionWriter.write((ArrayPayload)instruction);
+                            break;
+                        case PackedSwitchPayload:
+                            instructionWriter.write((PackedSwitchPayload)instruction);
+                            break;
+                        case SparseSwitchPayload:
+                            instructionWriter.write((SparseSwitchPayload)instruction);
+                            break;
+                        default:
+                            throw new ExceptionWithContext("Unsupported instruction format: %s",
+                                    instruction.getOpcode().format);
+                    }
+                } catch (RuntimeException ex) {
+                    throw new ExceptionWithContext(ex, "Error while writing instruction at code offset 0x%x", codeOffset);
                 }
+                codeOffset += instruction.getCodeUnits();
             }
 
             if (tryBlocks.size() > 0) {
@@ -1274,4 +1301,16 @@
         // (https://code.google.com/p/android/issues/detail?id=35304)
         return (opcodes.api < 17);
     }
+
+    public abstract class SectionProvider {
+        @Nonnull public abstract StringSectionType getStringSection();
+        @Nonnull public abstract TypeSectionType getTypeSection();
+        @Nonnull public abstract ProtoSectionType getProtoSection();
+        @Nonnull public abstract FieldSectionType getFieldSection();
+        @Nonnull public abstract MethodSectionType getMethodSection();
+        @Nonnull public abstract ClassSectionType getClassSection();
+        @Nonnull public abstract TypeListSectionType getTypeListSection();
+        @Nonnull public abstract AnnotationSectionType getAnnotationSection();
+        @Nonnull public abstract AnnotationSetSectionType getAnnotationSetSection();
+    }
 }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/IndexSection.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/IndexSection.java
index 53d1447..8abc776 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/IndexSection.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/IndexSection.java
@@ -38,4 +38,5 @@
 public interface IndexSection<Key> {
     int getItemIndex(@Nonnull Key key);
     @Nonnull Collection<? extends Map.Entry<? extends Key, Integer>> getItems();
+    int getItemCount();
 }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/MethodSection.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/MethodSection.java
index 32e6d6b..f31e84c 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/MethodSection.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/MethodSection.java
@@ -39,6 +39,7 @@
 public interface MethodSection<StringKey, TypeKey, ProtoRefKey extends MethodProtoReference,
         MethodRefKey extends MethodReference, MethodKey>
         extends IndexSection<MethodRefKey> {
+    @Nonnull MethodRefKey getMethodReference(@Nonnull MethodKey key);
     @Nonnull TypeKey getDefiningClass(@Nonnull MethodRefKey key);
     @Nonnull ProtoRefKey getPrototype(@Nonnull MethodRefKey key);
     @Nonnull ProtoRefKey getPrototype(@Nonnull MethodKey key);
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BaseBuilderPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BaseBuilderPool.java
new file mode 100644
index 0000000..64ba1d7
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BaseBuilderPool.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.builder;
+
+import javax.annotation.Nonnull;
+
+public class BaseBuilderPool {
+    @Nonnull protected final DexBuilder dexBuilder;
+
+    public BaseBuilderPool(@Nonnull DexBuilder dexBuilder) {
+        this.dexBuilder = dexBuilder;
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationPool.java
index e16bff0..37e536c 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationPool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationPool.java
@@ -41,14 +41,13 @@
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentMap;
 
-class BuilderAnnotationPool implements AnnotationSection<BuilderStringReference, BuilderTypeReference,
-        BuilderAnnotation, BuilderAnnotationElement, BuilderEncodedValue> {
-    @Nonnull private final BuilderContext context;
+class BuilderAnnotationPool extends BaseBuilderPool implements AnnotationSection<BuilderStringReference,
+        BuilderTypeReference, BuilderAnnotation, BuilderAnnotationElement, BuilderEncodedValue> {
     @Nonnull private final ConcurrentMap<Annotation, BuilderAnnotation> internedItems =
             Maps.newConcurrentMap();
 
-    BuilderAnnotationPool(@Nonnull BuilderContext context) {
-        this.context = context;
+    public BuilderAnnotationPool(@Nonnull DexBuilder dexBuilder) {
+        super(dexBuilder);
     }
 
     @Nonnull public BuilderAnnotation internAnnotation(@Nonnull Annotation annotation) {
@@ -59,8 +58,8 @@
 
         BuilderAnnotation dexBuilderAnnotation = new BuilderAnnotation(
                 annotation.getVisibility(),
-                context.typePool.internType(annotation.getType()),
-                context.internAnnotationElements(annotation.getElements()));
+                dexBuilder.typeSection.internType(annotation.getType()),
+                dexBuilder.internAnnotationElements(annotation.getElements()));
         ret = internedItems.putIfAbsent(dexBuilderAnnotation, dexBuilderAnnotation);
         return ret==null?dexBuilderAnnotation:ret;
     }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationSet.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationSet.java
index 43ca745..ef9a9d6 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationSet.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationSet.java
@@ -39,7 +39,7 @@
 import java.util.Iterator;
 import java.util.Set;
 
-class BuilderAnnotationSet extends AbstractSet<BuilderAnnotation> {
+public class BuilderAnnotationSet extends AbstractSet<BuilderAnnotation> {
     public static final BuilderAnnotationSet EMPTY =
             new BuilderAnnotationSet(ImmutableSet.<BuilderAnnotation>of());
 
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationSetPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationSetPool.java
index 353190f..45af5cf 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationSetPool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderAnnotationSetPool.java
@@ -46,13 +46,13 @@
 import java.util.Set;
 import java.util.concurrent.ConcurrentMap;
 
-class BuilderAnnotationSetPool implements AnnotationSetSection<BuilderAnnotation, BuilderAnnotationSet> {
-    @Nonnull private final BuilderContext context;
+class BuilderAnnotationSetPool extends BaseBuilderPool
+        implements AnnotationSetSection<BuilderAnnotation, BuilderAnnotationSet> {
     @Nonnull private final ConcurrentMap<Set<? extends Annotation>, BuilderAnnotationSet> internedItems =
             Maps.newConcurrentMap();
 
-    BuilderAnnotationSetPool(@Nonnull BuilderContext context) {
-        this.context = context;
+    public BuilderAnnotationSetPool(@Nonnull DexBuilder dexBuilder) {
+        super(dexBuilder);
     }
 
     @Nonnull public BuilderAnnotationSet internAnnotationSet(@Nullable Set<? extends Annotation> annotations) {
@@ -69,7 +69,7 @@
                 ImmutableSet.copyOf(Iterators.transform(annotations.iterator(),
                         new Function<Annotation, BuilderAnnotation>() {
                             @Nullable @Override public BuilderAnnotation apply(Annotation input) {
-                                return context.annotationPool.internAnnotation(input);
+                                return dexBuilder.annotationSection.internAnnotation(input);
                             }
                         })));
 
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassDef.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassDef.java
index 1021592..9938a6e 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassDef.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassDef.java
@@ -31,7 +31,6 @@
 
 package org.jf.dexlib2.writer.builder;
 
-import com.google.common.base.Function;
 import com.google.common.base.Functions;
 import com.google.common.collect.*;
 import org.jf.dexlib2.base.reference.BaseTypeReference;
@@ -81,14 +80,10 @@
         this.interfaces = interfaces;
         this.sourceFile = sourceFile;
         this.annotations = annotations;
-        this.staticFields = ImmutableSortedSet.copyOf(
-                (Iterable<? extends BuilderField>)Iterables.filter(fields, FieldUtil.FIELD_IS_STATIC));
-        this.instanceFields = ImmutableSortedSet.copyOf(
-                (Iterable<? extends BuilderField>)Iterables.filter(fields, FieldUtil.FIELD_IS_INSTANCE));
-        this.directMethods = ImmutableSortedSet.copyOf(
-                (Iterable<? extends BuilderMethod>)Iterables.filter(methods, MethodUtil.METHOD_IS_DIRECT));
-        this.virtualMethods = ImmutableSortedSet.copyOf(
-                (Iterable<? extends BuilderMethod>)Iterables.filter(methods, MethodUtil.METHOD_IS_VIRTUAL));
+        this.staticFields = ImmutableSortedSet.copyOf(Iterables.filter(fields, FieldUtil.FIELD_IS_STATIC));
+        this.instanceFields = ImmutableSortedSet.copyOf(Iterables.filter(fields, FieldUtil.FIELD_IS_INSTANCE));
+        this.directMethods = ImmutableSortedSet.copyOf(Iterables.filter(methods, MethodUtil.METHOD_IS_DIRECT));
+        this.virtualMethods = ImmutableSortedSet.copyOf(Iterables.filter(methods, MethodUtil.METHOD_IS_VIRTUAL));
     }
 
     @Nonnull @Override public String getType() { return type.getType(); }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassPool.java
index 29980f3..232b482 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassPool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderClassPool.java
@@ -60,12 +60,14 @@
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentMap;
 
-public class BuilderClassPool implements ClassSection<BuilderStringReference, BuilderTypeReference, BuilderTypeList,
-        BuilderClassDef, BuilderField, BuilderMethod, BuilderAnnotationSet, BuilderEncodedValue> {
+public class BuilderClassPool extends BaseBuilderPool implements ClassSection<BuilderStringReference,
+        BuilderTypeReference, BuilderTypeList, BuilderClassDef, BuilderField, BuilderMethod, BuilderAnnotationSet,
+        BuilderEncodedValue> {
     @Nonnull private final ConcurrentMap<String, BuilderClassDef> internedItems =
             Maps.newConcurrentMap();
 
-    BuilderClassPool() {
+    public BuilderClassPool(@Nonnull DexBuilder dexBuilder) {
+        super(dexBuilder);
     }
 
     @Nonnull BuilderClassDef internClass(@Nonnull BuilderClassDef classDef) {
@@ -441,4 +443,8 @@
             }
         };
     }
+
+    @Override public int getItemCount() {
+        return internedItems.size();
+    }
 }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderContext.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderContext.java
deleted file mode 100644
index e6f8e22..0000000
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderContext.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright 2013, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package org.jf.dexlib2.writer.builder;
-
-import com.google.common.base.Function;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterators;
-import org.jf.dexlib2.ValueType;
-import org.jf.dexlib2.iface.AnnotationElement;
-import org.jf.dexlib2.iface.value.*;
-import org.jf.dexlib2.writer.builder.BuilderEncodedValues.*;
-import org.jf.util.ExceptionWithContext;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import java.util.Set;
-
-class BuilderContext {
-    // keep our own local references to the various pools, using the Builder specific pool type;
-    @Nonnull final BuilderStringPool stringPool;
-    @Nonnull final BuilderTypePool typePool;
-    @Nonnull final BuilderFieldPool fieldPool;
-    @Nonnull final BuilderMethodPool methodPool;
-    @Nonnull final BuilderProtoPool protoPool;
-    @Nonnull final BuilderClassPool classPool;
-
-    @Nonnull final BuilderTypeListPool typeListPool;
-    @Nonnull final BuilderAnnotationPool annotationPool;
-    @Nonnull final BuilderAnnotationSetPool annotationSetPool;
-
-
-    BuilderContext() {
-        this.stringPool = new BuilderStringPool();
-        this.typePool = new BuilderTypePool(this);
-        this.fieldPool = new BuilderFieldPool(this);
-        this.methodPool = new BuilderMethodPool(this);
-        this.protoPool = new BuilderProtoPool(this);
-        this.classPool = new BuilderClassPool();
-
-        this.typeListPool = new BuilderTypeListPool(this);
-        this.annotationPool = new BuilderAnnotationPool(this);
-        this.annotationSetPool = new BuilderAnnotationSetPool(this);
-    }
-
-    @Nonnull Set<? extends BuilderAnnotationElement> internAnnotationElements(
-            @Nonnull Set<? extends AnnotationElement> elements) {
-        return ImmutableSet.copyOf(
-                Iterators.transform(elements.iterator(),
-                        new Function<AnnotationElement, BuilderAnnotationElement>() {
-                            @Nullable @Override
-                            public BuilderAnnotationElement apply(AnnotationElement input) {
-                                return internAnnotationElement(input);
-                            }
-                        }));
-    }
-
-    @Nonnull private BuilderAnnotationElement internAnnotationElement(@Nonnull AnnotationElement annotationElement) {
-        return new BuilderAnnotationElement(stringPool.internString(annotationElement.getName()),
-                internEncodedValue(annotationElement.getValue()));
-    }
-
-    @Nullable BuilderEncodedValue internNullableEncodedValue(@Nullable EncodedValue encodedValue) {
-        if (encodedValue == null) {
-            return null;
-        }
-        return internEncodedValue(encodedValue);
-    }
-
-    @Nonnull private BuilderEncodedValue internEncodedValue(@Nonnull EncodedValue encodedValue) {
-        switch (encodedValue.getValueType()) {
-            case ValueType.ANNOTATION:
-                return internAnnotationEncodedValue((AnnotationEncodedValue)encodedValue);
-            case ValueType.ARRAY:
-                return internArrayEncodedValue((ArrayEncodedValue)encodedValue);
-            case ValueType.BOOLEAN:
-                boolean value = ((BooleanEncodedValue)encodedValue).getValue();
-                return value?BuilderBooleanEncodedValue.TRUE_VALUE:BuilderBooleanEncodedValue.FALSE_VALUE;
-            case ValueType.BYTE:
-                return new BuilderByteEncodedValue(((ByteEncodedValue)encodedValue).getValue());
-            case ValueType.CHAR:
-                return new BuilderCharEncodedValue(((CharEncodedValue)encodedValue).getValue());
-            case ValueType.DOUBLE:
-                return new BuilderDoubleEncodedValue(((DoubleEncodedValue)encodedValue).getValue());
-            case ValueType.ENUM:
-                return internEnumEncodedValue((EnumEncodedValue)encodedValue);
-            case ValueType.FIELD:
-                return internFieldEncodedValue((FieldEncodedValue)encodedValue);
-            case ValueType.FLOAT:
-                return new BuilderFloatEncodedValue(((FloatEncodedValue)encodedValue).getValue());
-            case ValueType.INT:
-                return new BuilderIntEncodedValue(((IntEncodedValue)encodedValue).getValue());
-            case ValueType.LONG:
-                return new BuilderLongEncodedValue(((LongEncodedValue)encodedValue).getValue());
-            case ValueType.METHOD:
-                return internMethodEncodedValue((MethodEncodedValue)encodedValue);
-            case ValueType.NULL:
-                return BuilderNullEncodedValue.INSTANCE;
-            case ValueType.SHORT:
-                return new BuilderShortEncodedValue(((ShortEncodedValue)encodedValue).getValue());
-            case ValueType.STRING:
-                return internStringEncodedValue((StringEncodedValue)encodedValue);
-            case ValueType.TYPE:
-                return internTypeEncodedValue((TypeEncodedValue)encodedValue);
-            default:
-                throw new ExceptionWithContext("Unexpected encoded value type: %d", encodedValue.getValueType());
-        }
-    }
-
-    @Nonnull private BuilderAnnotationEncodedValue internAnnotationEncodedValue(@Nonnull AnnotationEncodedValue value) {
-        return new BuilderAnnotationEncodedValue(
-                typePool.internType(value.getType()),
-                internAnnotationElements(value.getElements()));
-    }
-
-    @Nonnull private BuilderArrayEncodedValue internArrayEncodedValue(@Nonnull ArrayEncodedValue value) {
-        return new BuilderArrayEncodedValue(
-                ImmutableList.copyOf(
-                        Iterators.transform(value.getValue().iterator(),
-                                new Function<EncodedValue, BuilderEncodedValue>() {
-                                    @Nullable @Override public BuilderEncodedValue apply(EncodedValue input) {
-                                        return internEncodedValue(input);
-                                    }
-                                })));
-    }
-
-    @Nonnull private BuilderEnumEncodedValue internEnumEncodedValue(@Nonnull EnumEncodedValue value) {
-        return new BuilderEnumEncodedValue(fieldPool.internField(value.getValue()));
-    }
-
-    @Nonnull private BuilderFieldEncodedValue internFieldEncodedValue(@Nonnull FieldEncodedValue value) {
-        return new BuilderFieldEncodedValue(fieldPool.internField(value.getValue()));
-    }
-
-    @Nonnull private BuilderMethodEncodedValue internMethodEncodedValue(@Nonnull MethodEncodedValue value) {
-        return new BuilderMethodEncodedValue(methodPool.internMethod(value.getValue()));
-    }
-
-    @Nonnull private BuilderStringEncodedValue internStringEncodedValue(@Nonnull StringEncodedValue string) {
-        return new BuilderStringEncodedValue(stringPool.internString(string.getValue()));
-    }
-
-    @Nonnull private BuilderTypeEncodedValue internTypeEncodedValue(@Nonnull TypeEncodedValue type) {
-        return new BuilderTypeEncodedValue(typePool.internType(type.getValue()));
-    }
-}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderFieldPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderFieldPool.java
index 7a90649..3bc65cd 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderFieldPool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderFieldPool.java
@@ -41,14 +41,13 @@
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentMap;
 
-public class BuilderFieldPool
+public class BuilderFieldPool extends BaseBuilderPool
         implements FieldSection<BuilderStringReference, BuilderTypeReference, BuilderFieldReference, BuilderField> {
-    @Nonnull private final BuilderContext context;
     @Nonnull private final ConcurrentMap<FieldReference, BuilderFieldReference> internedItems =
             Maps.newConcurrentMap();
 
-    BuilderFieldPool(@Nonnull BuilderContext context) {
-        this.context = context;
+    public BuilderFieldPool(@Nonnull DexBuilder dexBuilder) {
+        super(dexBuilder);
     }
 
     @Nonnull BuilderFieldReference internField(@Nonnull String definingClass, String name, String type) {
@@ -63,9 +62,9 @@
         }
 
         BuilderFieldReference dexPoolFieldReference = new BuilderFieldReference(
-                context.typePool.internType(fieldReference.getDefiningClass()),
-                context.stringPool.internString(fieldReference.getName()),
-                context.typePool.internType(fieldReference.getType()));
+                dexBuilder.typeSection.internType(fieldReference.getDefiningClass()),
+                dexBuilder.stringSection.internString(fieldReference.getName()),
+                dexBuilder.typeSection.internType(fieldReference.getType()));
         ret = internedItems.putIfAbsent(dexPoolFieldReference, dexPoolFieldReference);
         return ret==null?dexPoolFieldReference:ret;
     }
@@ -104,4 +103,8 @@
             }
         };
     }
+
+    @Override public int getItemCount() {
+        return internedItems.size();
+    }
 }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodPool.java
index 2c5dd81..7f937fd 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodPool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderMethodPool.java
@@ -42,14 +42,13 @@
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentMap;
 
-class BuilderMethodPool implements MethodSection<BuilderStringReference, BuilderTypeReference,
+class BuilderMethodPool extends BaseBuilderPool implements MethodSection<BuilderStringReference, BuilderTypeReference,
         BuilderMethodProtoReference, BuilderMethodReference, BuilderMethod>{
-    @Nonnull private final BuilderContext context;
     @Nonnull private final ConcurrentMap<MethodReference, BuilderMethodReference> internedItems =
             Maps.newConcurrentMap();
 
-    BuilderMethodPool(@Nonnull BuilderContext context) {
-        this.context = context;
+    public BuilderMethodPool(@Nonnull DexBuilder dexBuilder) {
+        super(dexBuilder);
     }
 
     @Nonnull public BuilderMethodReference internMethod(@Nonnull MethodReference methodReference) {
@@ -59,9 +58,9 @@
         }
 
         BuilderMethodReference dexPoolMethodReference = new BuilderMethodReference(
-                context.typePool.internType(methodReference.getDefiningClass()),
-                context.stringPool.internString(methodReference.getName()),
-                context.protoPool.internMethodProto(methodReference));
+                dexBuilder.typeSection.internType(methodReference.getDefiningClass()),
+                dexBuilder.stringSection.internString(methodReference.getName()),
+                dexBuilder.protoSection.internMethodProto(methodReference));
         ret = internedItems.putIfAbsent(dexPoolMethodReference, dexPoolMethodReference);
         return ret==null?dexPoolMethodReference:ret;
     }
@@ -72,6 +71,10 @@
         return internMethod(new MethodKey(definingClass, name, parameters, returnType));
     }
 
+    @Nonnull @Override public BuilderMethodReference getMethodReference(@Nonnull BuilderMethod builderMethod) {
+        return builderMethod.methodReference;
+    }
+
     @Nonnull @Override
     public BuilderTypeReference getDefiningClass(@Nonnull BuilderMethodReference key) {
         return key.definingClass; 
@@ -112,6 +115,10 @@
         };
     }
 
+    @Override public int getItemCount() {
+        return internedItems.size();
+    }
+
     private static class MethodKey extends BaseMethodReference implements MethodReference {
         @Nonnull private final String definingClass;
         @Nonnull private final String name;
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderProtoPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderProtoPool.java
index de19fa3..969f243 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderProtoPool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderProtoPool.java
@@ -44,14 +44,13 @@
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentMap;
 
-class BuilderProtoPool
+class BuilderProtoPool extends BaseBuilderPool
         implements ProtoSection<BuilderStringReference, BuilderTypeReference, BuilderMethodProtoReference, BuilderTypeList> {
-    @Nonnull private final BuilderContext context;
     @Nonnull private final ConcurrentMap<MethodProtoReference, BuilderMethodProtoReference> internedItems =
             Maps.newConcurrentMap();
 
-    BuilderProtoPool(@Nonnull BuilderContext context) {
-        this.context = context;
+    public BuilderProtoPool(@Nonnull DexBuilder dexBuilder) {
+        super(dexBuilder);
     }
 
     @Nonnull public BuilderMethodProtoReference internMethodProto(@Nonnull MethodProtoReference methodProto) {
@@ -61,10 +60,10 @@
         }
 
         BuilderMethodProtoReference protoReference = new BuilderMethodProtoReference(
-                context.stringPool.internString(MethodUtil.getShorty(
+                dexBuilder.stringSection.internString(MethodUtil.getShorty(
                         methodProto.getParameterTypes(), methodProto.getReturnType())),
-                context.typeListPool.internTypeList(methodProto.getParameterTypes()),
-                context.typePool.internType(methodProto.getReturnType()));
+                dexBuilder.typeListSection.internTypeList(methodProto.getParameterTypes()),
+                dexBuilder.typeSection.internType(methodProto.getReturnType()));
         ret = internedItems.putIfAbsent(protoReference, protoReference);
         return ret==null?protoReference:ret;
     }
@@ -103,4 +102,8 @@
             }
         };
     }
+
+    @Override public int getItemCount() {
+        return internedItems.size();
+    }
 }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderStringPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderStringPool.java
index 6b60e9f..95fe86f 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderStringPool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderStringPool.java
@@ -86,4 +86,8 @@
             }
         };
     }
+
+    @Override public int getItemCount() {
+        return internedItems.size();
+    }
 }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypeListPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypeListPool.java
index 7b189fd..604e39c 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypeListPool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypeListPool.java
@@ -45,13 +45,12 @@
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentMap;
 
-class BuilderTypeListPool implements TypeListSection<BuilderTypeReference, BuilderTypeList> {
-    @Nonnull private final BuilderContext context;
+class BuilderTypeListPool extends BaseBuilderPool implements TypeListSection<BuilderTypeReference, BuilderTypeList> {
     @Nonnull private final ConcurrentMap<List<? extends CharSequence>, BuilderTypeList> internedItems =
             Maps.newConcurrentMap();
 
-    BuilderTypeListPool(@Nonnull BuilderContext context) {
-        this.context = context;
+    public BuilderTypeListPool(@Nonnull DexBuilder dexBuilder) {
+        super(dexBuilder);
     }
 
     @Nonnull public BuilderTypeList internTypeList(@Nullable List<? extends CharSequence> types) {
@@ -67,7 +66,7 @@
         BuilderTypeList typeList = new BuilderTypeList(
                 ImmutableList.copyOf(Iterables.transform(types, new Function<CharSequence, BuilderTypeReference>() {
                     @Nonnull @Override public BuilderTypeReference apply(CharSequence input) {
-                        return context.typePool.internType(input.toString());
+                        return dexBuilder.typeSection.internType(input.toString());
                     }
                 })));
 
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypePool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypePool.java
index 29871fc..b9476de 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypePool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/BuilderTypePool.java
@@ -41,12 +41,12 @@
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentMap;
 
-class BuilderTypePool implements TypeSection<BuilderStringReference, BuilderTypeReference, BuilderTypeReference> {
-    @Nonnull private final BuilderContext context;
+class BuilderTypePool extends BaseBuilderPool
+        implements TypeSection<BuilderStringReference, BuilderTypeReference, BuilderTypeReference> {
     @Nonnull private final ConcurrentMap<String, BuilderTypeReference> internedItems = Maps.newConcurrentMap();
 
-    BuilderTypePool(@Nonnull BuilderContext context) {
-        this.context = context;
+    public BuilderTypePool(@Nonnull DexBuilder dexBuilder) {
+        super(dexBuilder);
     }
 
     @Nonnull public BuilderTypeReference internType(@Nonnull String type) {
@@ -54,7 +54,7 @@
         if (ret != null) {
             return ret;
         }
-        BuilderStringReference stringRef = context.stringPool.internString(type);
+        BuilderStringReference stringRef = dexBuilder.stringSection.internString(type);
         BuilderTypeReference typeReference = new BuilderTypeReference(stringRef);
         ret = internedItems.putIfAbsent(type, typeReference);
         return ret==null?typeReference:ret;
@@ -92,4 +92,8 @@
             }
         };
     }
+
+    @Override public int getItemCount() {
+        return internedItems.size();
+    }
 }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/DexBuilder.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/DexBuilder.java
index b7507fa..25938fe 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/DexBuilder.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/builder/DexBuilder.java
@@ -33,11 +33,13 @@
 
 import com.google.common.base.Function;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Sets;
 import org.jf.dexlib2.Opcodes;
 import org.jf.dexlib2.ValueType;
 import org.jf.dexlib2.iface.Annotation;
+import org.jf.dexlib2.iface.AnnotationElement;
 import org.jf.dexlib2.iface.MethodImplementation;
 import org.jf.dexlib2.iface.MethodParameter;
 import org.jf.dexlib2.iface.reference.*;
@@ -56,32 +58,16 @@
 public class DexBuilder extends DexWriter<BuilderStringReference, BuilderStringReference, BuilderTypeReference,
         BuilderTypeReference, BuilderMethodProtoReference, BuilderFieldReference, BuilderMethodReference,
         BuilderClassDef, BuilderAnnotation, BuilderAnnotationSet, BuilderTypeList, BuilderField, BuilderMethod,
-        BuilderEncodedValue, BuilderAnnotationElement> {
+        BuilderEncodedValue, BuilderAnnotationElement, BuilderStringPool, BuilderTypePool, BuilderProtoPool,
+        BuilderFieldPool, BuilderMethodPool, BuilderClassPool, BuilderTypeListPool, BuilderAnnotationPool,
+        BuilderAnnotationSetPool> {
 
-    @Nonnull private final BuilderContext context;
-
-    @Nonnull public static DexBuilder makeDexBuilder() {
-        BuilderContext context = new BuilderContext();
-        return new DexBuilder(Opcodes.forApi(20), context);
+    public DexBuilder(@Nonnull Opcodes opcodes) {
+        super(opcodes);
     }
 
-    @Deprecated
-    @Nonnull
-    public static DexBuilder makeDexBuilder(int api) {
-        BuilderContext context = new BuilderContext();
-        return new DexBuilder(Opcodes.forApi(api), context);
-    }
-
-    @Nonnull public static DexBuilder makeDexBuilder(@Nonnull Opcodes opcodes) {
-        BuilderContext context = new BuilderContext();
-        return new DexBuilder(opcodes, context);
-    }
-
-    private DexBuilder(@Nonnull Opcodes opcodes, @Nonnull BuilderContext context) {
-        super(opcodes, context.stringPool, context.typePool, context.protoPool,
-                context.fieldPool, context.methodPool, context.classPool, context.typeListPool, context.annotationPool,
-                context.annotationSetPool);
-        this.context = context;
+    @Nonnull @Override protected SectionProvider getSectionProvider() {
+        return new DexBuilderSectionProvider();
     }
 
     @Nonnull public BuilderField internField(@Nonnull String definingClass,
@@ -90,10 +76,10 @@
                                              int accessFlags,
                                              @Nullable EncodedValue initialValue,
                                              @Nonnull Set<? extends Annotation> annotations) {
-        return new BuilderField(context.fieldPool.internField(definingClass, name, type),
+        return new BuilderField(fieldSection.internField(definingClass, name, type),
                 accessFlags,
-                context.internNullableEncodedValue(initialValue),
-                context.annotationSetPool.internAnnotationSet(annotations));
+                internNullableEncodedValue(initialValue),
+                annotationSetSection.internAnnotationSet(annotations));
     }
 
     @Nonnull public BuilderMethod internMethod(@Nonnull String definingClass,
@@ -106,10 +92,10 @@
         if (parameters == null) {
             parameters = ImmutableList.of();
         }
-        return new BuilderMethod(context.methodPool.internMethod(definingClass, name, parameters, returnType),
+        return new BuilderMethod(methodSection.internMethod(definingClass, name, parameters, returnType),
                 internMethodParameters(parameters),
                 accessFlags,
-                context.annotationSetPool.internAnnotationSet(annotations),
+                annotationSetSection.internAnnotationSet(annotations),
                 methodImplementation);
     }
 
@@ -136,18 +122,18 @@
             }
         }
 
-        return context.classPool.internClass(new BuilderClassDef(context.typePool.internType(type),
+        return classSection.internClass(new BuilderClassDef(typeSection.internType(type),
                 accessFlags,
-                context.typePool.internNullableType(superclass),
-                context.typeListPool.internTypeList(interfaces),
-                context.stringPool.internNullableString(sourceFile),
-                context.annotationSetPool.internAnnotationSet(annotations),
+                typeSection.internNullableType(superclass),
+                typeListSection.internTypeList(interfaces),
+                stringSection.internNullableString(sourceFile),
+                annotationSetSection.internAnnotationSet(annotations),
                 fields,
                 methods));
     }
 
     @Nonnull public BuilderStringReference internStringReference(@Nonnull String string) {
-        return context.stringPool.internString(string);
+        return stringSection.internString(string);
     }
 
     @Nullable public BuilderStringReference internNullableStringReference(@Nullable String string) {
@@ -158,7 +144,7 @@
     }
 
     @Nonnull public BuilderTypeReference internTypeReference(@Nonnull String type) {
-        return context.typePool.internType(type);
+        return typeSection.internType(type);
     }
 
     @Nullable public BuilderTypeReference internNullableTypeReference(@Nullable String type) {
@@ -169,15 +155,15 @@
     }
 
     @Nonnull public BuilderFieldReference internFieldReference(@Nonnull FieldReference field) {
-        return context.fieldPool.internField(field);
+        return fieldSection.internField(field);
     }
 
     @Nonnull public BuilderMethodReference internMethodReference(@Nonnull MethodReference method) {
-        return context.methodPool.internMethod(method);
+        return methodSection.internMethod(method);
     }
 
     @Nonnull public BuilderMethodProtoReference internMethodProtoReference(@Nonnull MethodProtoReference methodProto) {
-        return context.protoPool.internMethodProto(methodProto);
+        return protoSection.internMethodProto(methodProto);
     }
 
     @Nonnull public BuilderReference internReference(@Nonnull Reference reference) {
@@ -214,9 +200,9 @@
 
     @Nonnull private BuilderMethodParameter internMethodParameter(@Nonnull MethodParameter methodParameter) {
         return new BuilderMethodParameter(
-                context.typePool.internType(methodParameter.getType()),
-                context.stringPool.internNullableString(methodParameter.getName()),
-                context.annotationSetPool.internAnnotationSet(methodParameter.getAnnotations()));
+                typeSection.internType(methodParameter.getType()),
+                stringSection.internNullableString(methodParameter.getName()),
+                annotationSetSection.internAnnotationSet(methodParameter.getAnnotations()));
     }
 
     @Override protected void writeEncodedValue(@Nonnull InternalEncodedValueWriter writer,
@@ -276,4 +262,143 @@
                 throw new ExceptionWithContext("Unrecognized value type: %d", encodedValue.getValueType());
         }
     }
+
+    @Nonnull Set<? extends BuilderAnnotationElement> internAnnotationElements(
+            @Nonnull Set<? extends AnnotationElement> elements) {
+        return ImmutableSet.copyOf(
+                Iterators.transform(elements.iterator(),
+                        new Function<AnnotationElement, BuilderAnnotationElement>() {
+                            @Nullable @Override
+                            public BuilderAnnotationElement apply(AnnotationElement input) {
+                                return internAnnotationElement(input);
+                            }
+                        }));
+    }
+
+    @Nonnull private BuilderAnnotationElement internAnnotationElement(@Nonnull AnnotationElement annotationElement) {
+        return new BuilderAnnotationElement(stringSection.internString(annotationElement.getName()),
+                internEncodedValue(annotationElement.getValue()));
+    }
+
+    @Nullable BuilderEncodedValue internNullableEncodedValue(@Nullable EncodedValue encodedValue) {
+        if (encodedValue == null) {
+            return null;
+        }
+        return internEncodedValue(encodedValue);
+    }
+
+    @Nonnull private BuilderEncodedValue internEncodedValue(@Nonnull EncodedValue encodedValue) {
+        switch (encodedValue.getValueType()) {
+            case ValueType.ANNOTATION:
+                return internAnnotationEncodedValue((AnnotationEncodedValue)encodedValue);
+            case ValueType.ARRAY:
+                return internArrayEncodedValue((ArrayEncodedValue)encodedValue);
+            case ValueType.BOOLEAN:
+                boolean value = ((BooleanEncodedValue)encodedValue).getValue();
+                return value?BuilderBooleanEncodedValue.TRUE_VALUE:BuilderBooleanEncodedValue.FALSE_VALUE;
+            case ValueType.BYTE:
+                return new BuilderByteEncodedValue(((ByteEncodedValue)encodedValue).getValue());
+            case ValueType.CHAR:
+                return new BuilderCharEncodedValue(((CharEncodedValue)encodedValue).getValue());
+            case ValueType.DOUBLE:
+                return new BuilderDoubleEncodedValue(((DoubleEncodedValue)encodedValue).getValue());
+            case ValueType.ENUM:
+                return internEnumEncodedValue((EnumEncodedValue)encodedValue);
+            case ValueType.FIELD:
+                return internFieldEncodedValue((FieldEncodedValue)encodedValue);
+            case ValueType.FLOAT:
+                return new BuilderFloatEncodedValue(((FloatEncodedValue)encodedValue).getValue());
+            case ValueType.INT:
+                return new BuilderIntEncodedValue(((IntEncodedValue)encodedValue).getValue());
+            case ValueType.LONG:
+                return new BuilderLongEncodedValue(((LongEncodedValue)encodedValue).getValue());
+            case ValueType.METHOD:
+                return internMethodEncodedValue((MethodEncodedValue)encodedValue);
+            case ValueType.NULL:
+                return BuilderNullEncodedValue.INSTANCE;
+            case ValueType.SHORT:
+                return new BuilderShortEncodedValue(((ShortEncodedValue)encodedValue).getValue());
+            case ValueType.STRING:
+                return internStringEncodedValue((StringEncodedValue)encodedValue);
+            case ValueType.TYPE:
+                return internTypeEncodedValue((TypeEncodedValue)encodedValue);
+            default:
+                throw new ExceptionWithContext("Unexpected encoded value type: %d", encodedValue.getValueType());
+        }
+    }
+
+    @Nonnull private BuilderAnnotationEncodedValue internAnnotationEncodedValue(@Nonnull AnnotationEncodedValue value) {
+        return new BuilderAnnotationEncodedValue(
+                typeSection.internType(value.getType()),
+                internAnnotationElements(value.getElements()));
+    }
+
+    @Nonnull private BuilderArrayEncodedValue internArrayEncodedValue(@Nonnull ArrayEncodedValue value) {
+        return new BuilderArrayEncodedValue(
+                ImmutableList.copyOf(
+                        Iterators.transform(value.getValue().iterator(),
+                                new Function<EncodedValue, BuilderEncodedValue>() {
+                                    @Nullable @Override public BuilderEncodedValue apply(EncodedValue input) {
+                                        return internEncodedValue(input);
+                                    }
+                                })));
+    }
+
+    @Nonnull private BuilderEnumEncodedValue internEnumEncodedValue(@Nonnull EnumEncodedValue value) {
+        return new BuilderEnumEncodedValue(fieldSection.internField(value.getValue()));
+    }
+
+    @Nonnull private BuilderFieldEncodedValue internFieldEncodedValue(@Nonnull FieldEncodedValue value) {
+        return new BuilderFieldEncodedValue(fieldSection.internField(value.getValue()));
+    }
+
+    @Nonnull private BuilderMethodEncodedValue internMethodEncodedValue(@Nonnull MethodEncodedValue value) {
+        return new BuilderMethodEncodedValue(methodSection.internMethod(value.getValue()));
+    }
+
+    @Nonnull private BuilderStringEncodedValue internStringEncodedValue(@Nonnull StringEncodedValue string) {
+        return new BuilderStringEncodedValue(stringSection.internString(string.getValue()));
+    }
+
+    @Nonnull private BuilderTypeEncodedValue internTypeEncodedValue(@Nonnull TypeEncodedValue type) {
+        return new BuilderTypeEncodedValue(typeSection.internType(type.getValue()));
+    }
+
+    protected class DexBuilderSectionProvider extends SectionProvider {
+        @Nonnull @Override public BuilderStringPool getStringSection() {
+            return new BuilderStringPool();
+        }
+
+        @Nonnull @Override public BuilderTypePool getTypeSection() {
+            return new BuilderTypePool(DexBuilder.this);
+        }
+
+        @Nonnull @Override public BuilderProtoPool getProtoSection() {
+            return new BuilderProtoPool(DexBuilder.this);
+        }
+
+        @Nonnull @Override public BuilderFieldPool getFieldSection() {
+            return new BuilderFieldPool(DexBuilder.this);
+        }
+
+        @Nonnull @Override public BuilderMethodPool getMethodSection() {
+            return new BuilderMethodPool(DexBuilder.this);
+        }
+
+        @Nonnull @Override public BuilderClassPool getClassSection() {
+            return new BuilderClassPool(DexBuilder.this);
+        }
+
+        @Nonnull @Override public BuilderTypeListPool getTypeListSection() {
+            return new BuilderTypeListPool(DexBuilder.this);
+        }
+
+        @Nonnull @Override public BuilderAnnotationPool getAnnotationSection() {
+            return new BuilderAnnotationPool(DexBuilder.this);
+        }
+
+        @Nonnull @Override public BuilderAnnotationSetPool getAnnotationSetSection() {
+            return new BuilderAnnotationSetPool(DexBuilder.this);
+        }
+    }
 }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/AnnotationPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/AnnotationPool.java
index c4cfa39..b2db889 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/AnnotationPool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/AnnotationPool.java
@@ -41,26 +41,18 @@
 
 public class AnnotationPool extends BaseOffsetPool<Annotation>
         implements AnnotationSection<CharSequence, CharSequence, Annotation, AnnotationElement, EncodedValue> {
-    @Nonnull StringPool stringPool;
-    @Nonnull TypePool typePool;
-    @Nonnull FieldPool fieldPool;
-    @Nonnull MethodPool methodPool;
 
-    public AnnotationPool(@Nonnull StringPool stringPool, @Nonnull TypePool typePool,
-                          @Nonnull FieldPool fieldPool, @Nonnull MethodPool methodPool) {
-        this.stringPool = stringPool;
-        this.typePool = typePool;
-        this.fieldPool = fieldPool;
-        this.methodPool = methodPool;
+    public AnnotationPool(@Nonnull DexPool dexPool) {
+        super(dexPool);
     }
 
     public void intern(@Nonnull Annotation annotation) {
         Integer prev = internedItems.put(annotation, 0);
         if (prev == null) {
-            typePool.intern(annotation.getType());
+            dexPool.typeSection.intern(annotation.getType());
             for (AnnotationElement element: annotation.getElements()) {
-                stringPool.intern(element.getName());
-                DexPool.internEncodedValue(element.getValue(), stringPool, typePool, fieldPool, methodPool);
+                dexPool.stringSection.intern(element.getName());
+                dexPool.internEncodedValue(element.getValue());
             }
         }
     }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/AnnotationSetPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/AnnotationSetPool.java
index 6512dcb..2170b95 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/AnnotationSetPool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/AnnotationSetPool.java
@@ -40,10 +40,9 @@
 
 public class AnnotationSetPool extends BaseNullableOffsetPool<Set<? extends Annotation>>
         implements AnnotationSetSection<Annotation, Set<? extends Annotation>> {
-    @Nonnull private final AnnotationPool annotationPool;
 
-    public AnnotationSetPool(@Nonnull AnnotationPool annotationPool) {
-        this.annotationPool = annotationPool;
+    public AnnotationSetPool(@Nonnull DexPool dexPool) {
+        super(dexPool);
     }
 
     public void intern(@Nonnull Set<? extends Annotation> annotationSet) {
@@ -51,7 +50,7 @@
             Integer prev = internedItems.put(annotationSet, 0);
             if (prev == null) {
                 for (Annotation annotation: annotationSet) {
-                    annotationPool.intern(annotation);
+                    dexPool.annotationSection.intern(annotation);
                 }
             }
         }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseIndexPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseIndexPool.java
index 01109ad..c07dcf1 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseIndexPool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseIndexPool.java
@@ -31,7 +31,6 @@
 
 package org.jf.dexlib2.writer.pool;
 
-import com.google.common.collect.Maps;
 import org.jf.dexlib2.writer.IndexSection;
 import org.jf.util.ExceptionWithContext;
 
@@ -39,8 +38,11 @@
 import java.util.Collection;
 import java.util.Map;
 
-public abstract class BaseIndexPool<Key> implements IndexSection<Key> {
-    @Nonnull protected final Map<Key, Integer> internedItems = Maps.newHashMap();
+public abstract class BaseIndexPool<Key> extends BasePool<Key, Integer> implements IndexSection<Key> {
+
+    public BaseIndexPool(@Nonnull DexPool dexPool) {
+        super(dexPool);
+    }
 
     @Nonnull @Override public Collection<? extends Map.Entry<? extends Key, Integer>> getItems() {
         return internedItems.entrySet();
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseNullableOffsetPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseNullableOffsetPool.java
index ed9dbb6..b04060a 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseNullableOffsetPool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseNullableOffsetPool.java
@@ -34,10 +34,16 @@
 import org.jf.dexlib2.writer.DexWriter;
 import org.jf.dexlib2.writer.NullableOffsetSection;
 
+import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
 public abstract class BaseNullableOffsetPool<Key> extends BaseOffsetPool<Key>
         implements NullableOffsetSection<Key> {
+
+    public BaseNullableOffsetPool(@Nonnull DexPool dexPool) {
+        super(dexPool);
+    }
+
     @Override public int getNullableItemOffset(@Nullable Key key) {
         if (key == null) {
             return DexWriter.NO_OFFSET;
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseOffsetPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseOffsetPool.java
index e66a50a..789c954 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseOffsetPool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BaseOffsetPool.java
@@ -31,7 +31,6 @@
 
 package org.jf.dexlib2.writer.pool;
 
-import com.google.common.collect.Maps;
 import org.jf.dexlib2.writer.OffsetSection;
 import org.jf.util.ExceptionWithContext;
 
@@ -39,8 +38,11 @@
 import java.util.Collection;
 import java.util.Map;
 
-public abstract class BaseOffsetPool<Key> implements OffsetSection<Key> {
-    @Nonnull protected final Map<Key, Integer> internedItems = Maps.newHashMap();
+public abstract class BaseOffsetPool<Key> extends BasePool<Key, Integer> implements OffsetSection<Key> {
+
+    public BaseOffsetPool(@Nonnull DexPool dexPool) {
+        super(dexPool);
+    }
 
     @Nonnull @Override public Collection<? extends Map.Entry<? extends Key, Integer>> getItems() {
         return internedItems.entrySet();
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BasePool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BasePool.java
new file mode 100644
index 0000000..4fa1810
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/BasePool.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+import com.google.common.collect.Maps;
+
+import javax.annotation.Nonnull;
+import java.util.Iterator;
+import java.util.Map;
+
+public class BasePool<Key, Value> implements Markable {
+    @Nonnull protected final DexPool dexPool;
+    @Nonnull protected final Map<Key, Value> internedItems = Maps.newLinkedHashMap();
+    private int markedItemCount = -1;
+
+    public BasePool(@Nonnull DexPool dexPool) {
+        this.dexPool = dexPool;
+    }
+
+    public void mark() {
+        markedItemCount = internedItems.size();
+    }
+
+    public void reset() {
+        if (markedItemCount < 0) {
+            throw new IllegalStateException("mark() must be called before calling reset()");
+        }
+
+        if (markedItemCount == internedItems.size()) {
+            return;
+        }
+
+        Iterator<Key> keys = internedItems.keySet().iterator();
+        for (int i=0; i<markedItemCount; i++) {
+            keys.next();
+        }
+        while (keys.hasNext()) {
+            keys.next();
+            keys.remove();
+        }
+    }
+
+    public int getItemCount() {
+        return internedItems.size();
+    }
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ClassPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ClassPool.java
index 0389973..7c1d681 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ClassPool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ClassPool.java
@@ -58,30 +58,12 @@
 import java.util.*;
 import java.util.Map.Entry;
 
-public class ClassPool implements ClassSection<CharSequence, CharSequence,
+public class ClassPool extends BasePool<String, PoolClassDef> implements ClassSection<CharSequence, CharSequence,
         TypeListPool.Key<? extends Collection<? extends CharSequence>>, PoolClassDef, Field, PoolMethod,
         Set<? extends Annotation>, EncodedValue> {
-    @Nonnull private HashMap<String, PoolClassDef> internedItems = Maps.newHashMap();
 
-    @Nonnull private final StringPool stringPool;
-    @Nonnull private final TypePool typePool;
-    @Nonnull private final FieldPool fieldPool;
-    @Nonnull private final MethodPool methodPool;
-    @Nonnull private final AnnotationSetPool annotationSetPool;
-    @Nonnull private final TypeListPool typeListPool;
-
-    public ClassPool(@Nonnull StringPool stringPool,
-                     @Nonnull TypePool typePool,
-                     @Nonnull FieldPool fieldPool,
-                     @Nonnull MethodPool methodPool,
-                     @Nonnull AnnotationSetPool annotationSetPool,
-                     @Nonnull TypeListPool typeListPool) {
-        this.stringPool = stringPool;
-        this.typePool = typePool;
-        this.fieldPool = fieldPool;
-        this.methodPool = methodPool;
-        this.annotationSetPool = annotationSetPool;
-        this.typeListPool = typeListPool;
+    public ClassPool(@Nonnull DexPool dexPool) {
+        super(dexPool);
     }
 
     public void intern(@Nonnull ClassDef classDef) {
@@ -92,10 +74,10 @@
             throw new ExceptionWithContext("Class %s has already been interned", poolClassDef.getType());
         }
 
-        typePool.intern(poolClassDef.getType());
-        typePool.internNullable(poolClassDef.getSuperclass());
-        typeListPool.intern(poolClassDef.getInterfaces());
-        stringPool.internNullable(poolClassDef.getSourceFile());
+        dexPool.typeSection.intern(poolClassDef.getType());
+        dexPool.typeSection.internNullable(poolClassDef.getSuperclass());
+        dexPool.typeListSection.intern(poolClassDef.getInterfaces());
+        dexPool.stringSection.internNullable(poolClassDef.getSourceFile());
 
         HashSet<String> fields = new HashSet<String>();
         for (Field field: poolClassDef.getFields()) {
@@ -104,14 +86,14 @@
                 throw new ExceptionWithContext("Multiple definitions for field %s->%s",
                         poolClassDef.getType(), fieldDescriptor);
             }
-            fieldPool.intern(field);
+            dexPool.fieldSection.intern(field);
 
             EncodedValue initialValue = field.getInitialValue();
             if (initialValue != null) {
-                DexPool.internEncodedValue(initialValue, stringPool, typePool, fieldPool, methodPool);
+                dexPool.internEncodedValue(initialValue);
             }
 
-            annotationSetPool.intern(field.getAnnotations());
+            dexPool.annotationSetSection.intern(field.getAnnotations());
         }
 
         HashSet<String> methods = new HashSet<String>();
@@ -121,17 +103,17 @@
                 throw new ExceptionWithContext("Multiple definitions for method %s->%s",
                         poolClassDef.getType(), methodDescriptor);
             }
-            methodPool.intern(method);
+            dexPool.methodSection.intern(method);
             internCode(method);
             internDebug(method);
-            annotationSetPool.intern(method.getAnnotations());
+            dexPool.annotationSetSection.intern(method.getAnnotations());
 
             for (MethodParameter parameter: method.getParameters()) {
-                annotationSetPool.intern(parameter.getAnnotations());
+                dexPool.annotationSetSection.intern(parameter.getAnnotations());
             }
         }
 
-        annotationSetPool.intern(poolClassDef.getAnnotations());
+        dexPool.annotationSetSection.intern(poolClassDef.getAnnotations());
     }
 
     private void internCode(@Nonnull Method method) {
@@ -146,16 +128,16 @@
                     Reference reference = ((ReferenceInstruction)instruction).getReference();
                     switch (instruction.getOpcode().referenceType) {
                         case ReferenceType.STRING:
-                            stringPool.intern((StringReference)reference);
+                            dexPool.stringSection.intern((StringReference)reference);
                             break;
                         case ReferenceType.TYPE:
-                            typePool.intern((TypeReference)reference);
+                            dexPool.typeSection.intern((TypeReference)reference);
                             break;
                         case ReferenceType.FIELD:
-                            fieldPool.intern((FieldReference) reference);
+                            dexPool.fieldSection.intern((FieldReference) reference);
                             break;
                         case ReferenceType.METHOD:
-                            methodPool.intern((MethodReference)reference);
+                            dexPool.methodSection.intern((MethodReference)reference);
                             break;
                         default:
                             throw new ExceptionWithContext("Unrecognized reference type: %d",
@@ -172,7 +154,7 @@
 
             for (TryBlock<? extends ExceptionHandler> tryBlock: methodImpl.getTryBlocks()) {
                 for (ExceptionHandler handler: tryBlock.getExceptionHandlers()) {
-                    typePool.internNullable(handler.getExceptionType());
+                    dexPool.typeSection.internNullable(handler.getExceptionType());
                 }
             }
         }
@@ -182,7 +164,7 @@
         for (MethodParameter param: method.getParameters()) {
             String paramName = param.getName();
             if (paramName != null) {
-                stringPool.intern(paramName);
+                dexPool.stringSection.intern(paramName);
             }
         }
 
@@ -192,12 +174,12 @@
                 switch (debugItem.getDebugItemType()) {
                     case DebugItemType.START_LOCAL:
                         StartLocal startLocal = (StartLocal)debugItem;
-                        stringPool.internNullable(startLocal.getName());
-                        typePool.internNullable(startLocal.getType());
-                        stringPool.internNullable(startLocal.getSignature());
+                        dexPool.stringSection.internNullable(startLocal.getName());
+                        dexPool.typeSection.internNullable(startLocal.getType());
+                        dexPool.stringSection.internNullable(startLocal.getSignature());
                         break;
                     case DebugItemType.SET_SOURCE_FILE:
-                        stringPool.internNullable(((SetSourceFile) debugItem).getSourceFile());
+                        dexPool.stringSection.internNullable(((SetSourceFile) debugItem).getSourceFile());
                         break;
                 }
             }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/DexPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/DexPool.java
index d12457a..6d662ec 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/DexPool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/DexPool.java
@@ -39,7 +39,7 @@
 import org.jf.dexlib2.iface.Field;
 import org.jf.dexlib2.iface.reference.*;
 import org.jf.dexlib2.iface.value.*;
-import org.jf.dexlib2.writer.DexWriter;
+import org.jf.dexlib2.writer.*;
 import org.jf.dexlib2.writer.io.DexDataStore;
 import org.jf.dexlib2.writer.io.FileDataStore;
 import org.jf.util.ExceptionWithContext;
@@ -54,59 +54,69 @@
         MethodProtoReference, FieldReference, MethodReference, PoolClassDef,
         Annotation, Set<? extends Annotation>,
         TypeListPool.Key<? extends Collection<? extends CharSequence>>, Field, PoolMethod,
-        EncodedValue, AnnotationElement> {
+        EncodedValue, AnnotationElement, StringPool, TypePool, ProtoPool, FieldPool, MethodPool, ClassPool,
+        TypeListPool, AnnotationPool, AnnotationSetPool> {
 
-    @Nonnull
-    public static DexPool makeDexPool() {
-        return makeDexPool(Opcodes.forApi(20));
+    private final Markable[] sections = new Markable[] {
+            stringSection, typeSection, protoSection, fieldSection, methodSection, classSection, typeListSection,
+            annotationSection, annotationSetSection
+    };
+
+    public DexPool(Opcodes opcodes) {
+        super(opcodes);
     }
 
-    @Deprecated
-    @Nonnull
-    public static DexPool makeDexPool(int api) {
-        return makeDexPool(Opcodes.forApi(api));
+    @Nonnull @Override protected SectionProvider getSectionProvider() {
+        return new DexPoolSectionProvider();
     }
 
-    @Nonnull
-    public static DexPool makeDexPool(@Nonnull Opcodes opcodes) {
-        StringPool stringPool = new StringPool();
-        TypePool typePool = new TypePool(stringPool);
-        FieldPool fieldPool = new FieldPool(stringPool, typePool);
-        TypeListPool typeListPool = new TypeListPool(typePool);
-        ProtoPool protoPool = new ProtoPool(stringPool, typePool, typeListPool);
-        MethodPool methodPool = new MethodPool(stringPool, typePool, protoPool);
-        AnnotationPool annotationPool = new AnnotationPool(stringPool, typePool, fieldPool, methodPool);
-        AnnotationSetPool annotationSetPool = new AnnotationSetPool(annotationPool);
-        ClassPool classPool = new ClassPool(stringPool, typePool, fieldPool, methodPool, annotationSetPool,
-                typeListPool);
-
-        return new DexPool(opcodes, stringPool, typePool, protoPool, fieldPool, methodPool, classPool, typeListPool,
-                annotationPool, annotationSetPool);
-    }
-
-    private DexPool(Opcodes opcodes, StringPool stringPool, TypePool typePool, ProtoPool protoPool, FieldPool fieldPool,
-                    MethodPool methodPool, ClassPool classPool, TypeListPool typeListPool,
-                    AnnotationPool annotationPool, AnnotationSetPool annotationSetPool) {
-        super(opcodes, stringPool, typePool, protoPool, fieldPool, methodPool,
-                classPool, typeListPool, annotationPool, annotationSetPool);
-    }
-
-    public static void writeTo(@Nonnull DexDataStore dataStore, @Nonnull org.jf.dexlib2.iface.DexFile input) throws IOException {
-        DexPool dexPool = makeDexPool();
+    public static void writeTo(@Nonnull DexDataStore dataStore, @Nonnull org.jf.dexlib2.iface.DexFile input)
+            throws IOException {
+        DexPool dexPool = new DexPool(input.getOpcodes());
         for (ClassDef classDef: input.getClasses()) {
-            ((ClassPool)dexPool.classSection).intern(classDef);
+            dexPool.internClass(classDef);
         }
         dexPool.writeTo(dataStore);
     }
 
     public static void writeTo(@Nonnull String path, @Nonnull org.jf.dexlib2.iface.DexFile input) throws IOException {
-        DexPool dexPool = makeDexPool();
+        DexPool dexPool = new DexPool(input.getOpcodes());
         for (ClassDef classDef: input.getClasses()) {
-            ((ClassPool)dexPool.classSection).intern(classDef);
+            dexPool.internClass(classDef);
         }
         dexPool.writeTo(new FileDataStore(new File(path)));
     }
 
+    /**
+     * Interns a class into this DexPool
+     * @param classDef The class to intern
+     */
+    public void internClass(ClassDef classDef) {
+        classSection.intern(classDef);
+    }
+
+    /**
+     * Creates a marked state that can be returned to by calling reset()
+     *
+     * This is useful to rollback the last added class if it causes a method/field/type overflow
+     */
+    public void mark() {
+        for (Markable section: sections) {
+            section.mark();
+        }
+    }
+
+    /**
+     * Resets to the last marked state
+     *
+     * This is useful to rollback the last added class if it causes a method/field/type overflow
+     */
+    public void reset() {
+        for (Markable section: sections) {
+            section.reset();
+        }
+    }
+
     @Override protected void writeEncodedValue(@Nonnull InternalEncodedValueWriter writer,
                                                @Nonnull EncodedValue encodedValue) throws IOException {
         switch (encodedValue.getValueType()) {
@@ -165,40 +175,74 @@
         }
     }
 
-    public static void internEncodedValue(@Nonnull EncodedValue encodedValue,
-                                          @Nonnull StringPool stringPool,
-                                          @Nonnull TypePool typePool,
-                                          @Nonnull FieldPool fieldPool,
-                                          @Nonnull MethodPool methodPool) {
+    void internEncodedValue(@Nonnull EncodedValue encodedValue) {
         switch (encodedValue.getValueType()) {
             case ValueType.ANNOTATION:
                 AnnotationEncodedValue annotationEncodedValue = (AnnotationEncodedValue)encodedValue;
-                typePool.intern(annotationEncodedValue.getType());
+                typeSection.intern(annotationEncodedValue.getType());
                 for (AnnotationElement element: annotationEncodedValue.getElements()) {
-                    stringPool.intern(element.getName());
-                    internEncodedValue(element.getValue(), stringPool, typePool, fieldPool, methodPool);
+                    stringSection.intern(element.getName());
+                    internEncodedValue(element.getValue());
                 }
                 break;
             case ValueType.ARRAY:
                 for (EncodedValue element: ((ArrayEncodedValue)encodedValue).getValue()) {
-                    internEncodedValue(element, stringPool, typePool, fieldPool, methodPool);
+                    internEncodedValue(element);
                 }
                 break;
             case ValueType.STRING:
-                stringPool.intern(((StringEncodedValue)encodedValue).getValue());
+                stringSection.intern(((StringEncodedValue)encodedValue).getValue());
                 break;
             case ValueType.TYPE:
-                typePool.intern(((TypeEncodedValue)encodedValue).getValue());
+                typeSection.intern(((TypeEncodedValue)encodedValue).getValue());
                 break;
             case ValueType.ENUM:
-                fieldPool.intern(((EnumEncodedValue)encodedValue).getValue());
+                fieldSection.intern(((EnumEncodedValue)encodedValue).getValue());
                 break;
             case ValueType.FIELD:
-                fieldPool.intern(((FieldEncodedValue)encodedValue).getValue());
+                fieldSection.intern(((FieldEncodedValue)encodedValue).getValue());
                 break;
             case ValueType.METHOD:
-                methodPool.intern(((MethodEncodedValue)encodedValue).getValue());
+                methodSection.intern(((MethodEncodedValue)encodedValue).getValue());
                 break;
         }
     }
+
+    protected class DexPoolSectionProvider extends SectionProvider {
+        @Nonnull @Override public StringPool getStringSection() {
+            return new StringPool(DexPool.this);
+        }
+
+        @Nonnull @Override public TypePool getTypeSection() {
+            return new TypePool(DexPool.this);
+        }
+
+        @Nonnull @Override public ProtoPool getProtoSection() {
+            return new ProtoPool(DexPool.this);
+        }
+
+        @Nonnull @Override public FieldPool getFieldSection() {
+            return new FieldPool(DexPool.this);
+        }
+
+        @Nonnull @Override public MethodPool getMethodSection() {
+            return new MethodPool(DexPool.this);
+        }
+
+        @Nonnull @Override public ClassPool getClassSection() {
+            return new ClassPool(DexPool.this);
+        }
+
+        @Nonnull @Override public TypeListPool getTypeListSection() {
+            return new TypeListPool(DexPool.this);
+        }
+
+        @Nonnull @Override public AnnotationPool getAnnotationSection() {
+            return new AnnotationPool(DexPool.this);
+        }
+
+        @Nonnull @Override public AnnotationSetPool getAnnotationSetSection() {
+            return new AnnotationSetPool(DexPool.this);
+        }
+    }
 }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/FieldPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/FieldPool.java
index 3403d12..135d79b 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/FieldPool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/FieldPool.java
@@ -39,20 +39,17 @@
 
 public class FieldPool extends BaseIndexPool<FieldReference>
         implements FieldSection<CharSequence, CharSequence, FieldReference, Field> {
-    @Nonnull private final StringPool stringPool;
-    @Nonnull private final TypePool typePool;
 
-    public FieldPool(@Nonnull StringPool stringPool, @Nonnull TypePool typePool) {
-        this.stringPool = stringPool;
-        this.typePool = typePool;
+    public FieldPool(@Nonnull DexPool dexPool) {
+        super(dexPool);
     }
 
     public void intern(@Nonnull FieldReference field) {
         Integer prev = internedItems.put(field, 0);
         if (prev == null) {
-            typePool.intern(field.getDefiningClass());
-            stringPool.intern(field.getName());
-            typePool.intern(field.getType());
+            dexPool.typeSection.intern(field.getDefiningClass());
+            dexPool.stringSection.intern(field.getName());
+            dexPool.typeSection.intern(field.getType());
         }
     }
 
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/Markable.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/Markable.java
new file mode 100644
index 0000000..8b14574
--- /dev/null
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/Markable.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.writer.pool;
+
+public interface Markable {
+    void mark();
+    void reset();
+}
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/MethodPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/MethodPool.java
index 8103d31..2801abd 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/MethodPool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/MethodPool.java
@@ -39,26 +39,24 @@
 
 public class MethodPool extends BaseIndexPool<MethodReference>
         implements MethodSection<CharSequence, CharSequence, MethodProtoReference, MethodReference, PoolMethod> {
-    @Nonnull private final StringPool stringPool;
-    @Nonnull private final TypePool typePool;
-    @Nonnull private final ProtoPool protoPool;
 
-    public MethodPool(@Nonnull StringPool stringPool, @Nonnull TypePool typePool,
-                      @Nonnull ProtoPool protoPool) {
-        this.stringPool = stringPool;
-        this.typePool = typePool;
-        this.protoPool = protoPool;
+    public MethodPool(@Nonnull DexPool dexPool) {
+        super(dexPool);
     }
 
     public void intern(@Nonnull MethodReference method) {
         Integer prev = internedItems.put(method, 0);
         if (prev == null) {
-            typePool.intern(method.getDefiningClass());
-            protoPool.intern(new PoolMethodProto(method));
-            stringPool.intern(method.getName());
+            dexPool.typeSection.intern(method.getDefiningClass());
+            dexPool.protoSection.intern(new PoolMethodProto(method));
+            dexPool.stringSection.intern(method.getName());
         }
     }
 
+    @Nonnull @Override public MethodReference getMethodReference(@Nonnull PoolMethod poolMethod) {
+        return poolMethod;
+    }
+
     @Nonnull @Override public CharSequence getDefiningClass(@Nonnull MethodReference methodReference) {
         return methodReference.getDefiningClass();
     }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ProtoPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ProtoPool.java
index 523e5f4..1209bd9 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ProtoPool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/ProtoPool.java
@@ -43,23 +43,17 @@
 public class ProtoPool extends BaseIndexPool<MethodProtoReference>
         implements ProtoSection<CharSequence, CharSequence, MethodProtoReference,
         TypeListPool.Key<? extends Collection<? extends CharSequence>>> {
-    @Nonnull private final StringPool stringPool;
-    @Nonnull private final TypePool typePool;
-    @Nonnull private final TypeListPool typeListPool;
 
-    public ProtoPool(@Nonnull StringPool stringPool, @Nonnull TypePool typePool,
-                     @Nonnull TypeListPool typeListPool) {
-        this.stringPool = stringPool;
-        this.typePool = typePool;
-        this.typeListPool = typeListPool;
+    public ProtoPool(@Nonnull DexPool dexPool) {
+        super(dexPool);
     }
 
     public void intern(@Nonnull MethodProtoReference reference) {
         Integer prev = internedItems.put(reference, 0);
         if (prev == null) {
-            stringPool.intern(getShorty(reference));
-            typePool.intern(reference.getReturnType());
-            typeListPool.intern(reference.getParameterTypes());
+            dexPool.stringSection.intern(getShorty(reference));
+            dexPool.typeSection.intern(reference.getReturnType());
+            dexPool.typeListSection.intern(reference.getParameterTypes());
         }
     }
 
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/StringPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/StringPool.java
index 5886b4f..61f1502 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/StringPool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/StringPool.java
@@ -39,6 +39,11 @@
 import javax.annotation.Nullable;
 
 public class StringPool extends StringTypeBasePool implements StringSection<CharSequence, StringReference> {
+
+    public StringPool(@Nonnull DexPool dexPool) {
+        super(dexPool);
+    }
+
     public void intern(@Nonnull CharSequence string) {
         internedItems.put(string.toString(), 0);
     }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/StringTypeBasePool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/StringTypeBasePool.java
index 768e562..54c6cea 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/StringTypeBasePool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/StringTypeBasePool.java
@@ -31,7 +31,6 @@
 
 package org.jf.dexlib2.writer.pool;
 
-import com.google.common.collect.Maps;
 import org.jf.dexlib2.writer.DexWriter;
 import org.jf.dexlib2.writer.NullableIndexSection;
 import org.jf.util.ExceptionWithContext;
@@ -41,8 +40,12 @@
 import java.util.Collection;
 import java.util.Map;
 
-public abstract class StringTypeBasePool implements NullableIndexSection<CharSequence> {
-    @Nonnull protected final Map<String, Integer> internedItems = Maps.newHashMap();
+public abstract class StringTypeBasePool extends BasePool<String, Integer>
+        implements NullableIndexSection<CharSequence>, Markable {
+
+    public StringTypeBasePool(@Nonnull DexPool dexPool) {
+        super(dexPool);
+    }
 
     @Nonnull @Override public Collection<Map.Entry<String, Integer>> getItems() {
         return internedItems.entrySet();
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/TypeListPool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/TypeListPool.java
index 7e0fbe0..038f4d1 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/TypeListPool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/TypeListPool.java
@@ -43,10 +43,10 @@
 
 public class TypeListPool extends BaseNullableOffsetPool<Key<? extends Collection<? extends CharSequence>>>
         implements TypeListSection<CharSequence, Key<? extends Collection<? extends CharSequence>>> {
-    @Nonnull private final TypePool typePool;
 
-    public TypeListPool(@Nonnull TypePool typePool) {
-        this.typePool = typePool;
+
+    public TypeListPool(@Nonnull DexPool dexPool) {
+        super(dexPool);
     }
 
     public void intern(@Nonnull Collection<? extends CharSequence> types) {
@@ -55,7 +55,7 @@
             Integer prev = internedItems.put(key, 0);
             if (prev == null) {
                 for (CharSequence type: types) {
-                    typePool.intern(type);
+                    dexPool.typeSection.intern(type);
                 }
             }
         }
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/TypePool.java b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/TypePool.java
index 13bcd8a..7e43208 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/TypePool.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/writer/pool/TypePool.java
@@ -39,17 +39,17 @@
 
 public class TypePool extends StringTypeBasePool
         implements TypeSection<CharSequence, CharSequence, TypeReference> {
-    @Nonnull private final StringPool stringPool;
 
-    public TypePool(@Nonnull StringPool stringPool) {
-        this.stringPool = stringPool;
+
+    public TypePool(@Nonnull DexPool dexPool) {
+        super(dexPool);
     }
 
     public void intern(@Nonnull CharSequence type) {
         String typeString = type.toString();
         Integer prev = internedItems.put(typeString, 0);
         if (prev == null) {
-            stringPool.intern(typeString);
+            dexPool.stringSection.intern(typeString);
         }
     }
 
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/AccessorTest.java b/dexlib2/src/test/java/org/jf/dexlib2/AccessorTest.java
index 4c8f85b..ff832c2 100644
--- a/dexlib2/src/test/java/org/jf/dexlib2/AccessorTest.java
+++ b/dexlib2/src/test/java/org/jf/dexlib2/AccessorTest.java
@@ -79,7 +79,7 @@
     public void testAccessors() throws IOException {
         URL url = AccessorTest.class.getClassLoader().getResource("accessorTest.dex");
         Assert.assertNotNull(url);
-        DexFile f = DexFileFactory.loadDexFile(url.getFile(), 15, false);
+        DexFile f = DexFileFactory.loadDexFile(url.getFile(), Opcodes.getDefault());
 
         SyntheticAccessorResolver sar = new SyntheticAccessorResolver(f.getOpcodes(), f.getClasses());
 
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/DexEntryFinderTest.java b/dexlib2/src/test/java/org/jf/dexlib2/DexEntryFinderTest.java
new file mode 100644
index 0000000..610d3c7
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/DexEntryFinderTest.java
@@ -0,0 +1,231 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2;
+
+import com.beust.jcommander.internal.Maps;
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.DexFileFactory.DexEntryFinder;
+import org.jf.dexlib2.DexFileFactory.DexFileNotFoundException;
+import org.jf.dexlib2.DexFileFactory.MultipleMatchingDexEntriesException;
+import org.jf.dexlib2.DexFileFactory.UnsupportedFileTypeException;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile;
+import org.jf.dexlib2.dexbacked.DexBackedDexFile.NotADexFile;
+import org.jf.dexlib2.iface.MultiDexContainer;
+import org.junit.Assert;
+import org.junit.Test;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import static org.mockito.Mockito.mock;
+
+public class DexEntryFinderTest {
+
+    @Test
+    public void testNormalStuff() throws Exception {
+        Map<String, DexBackedDexFile> entries = Maps.newHashMap();
+        DexBackedDexFile dexFile1 = mock(DexBackedDexFile.class);
+        entries.put("/system/framework/framework.jar", dexFile1);
+        DexBackedDexFile dexFile2 = mock(DexBackedDexFile.class);
+        entries.put("/system/framework/framework.jar:classes2.dex", dexFile2);
+        DexEntryFinder testFinder = new DexEntryFinder("blah.oat", new TestMultiDexContainer(entries));
+
+        Assert.assertEquals(dexFile1, testFinder.findEntry("/system/framework/framework.jar", true));
+
+        assertEntryNotFound(testFinder, "system/framework/framework.jar", true);
+        assertEntryNotFound(testFinder, "/framework/framework.jar", true);
+        assertEntryNotFound(testFinder, "framework/framework.jar", true);
+        assertEntryNotFound(testFinder, "/framework.jar", true);
+        assertEntryNotFound(testFinder, "framework.jar", true);
+
+        Assert.assertEquals(dexFile1, testFinder.findEntry("system/framework/framework.jar", false));
+        Assert.assertEquals(dexFile1, testFinder.findEntry("/framework/framework.jar", false));
+        Assert.assertEquals(dexFile1, testFinder.findEntry("framework/framework.jar", false));
+        Assert.assertEquals(dexFile1, testFinder.findEntry("/framework.jar", false));
+        Assert.assertEquals(dexFile1, testFinder.findEntry("framework.jar", false));
+
+        assertEntryNotFound(testFinder, "ystem/framework/framework.jar", false);
+        assertEntryNotFound(testFinder, "ssystem/framework/framework.jar", false);
+        assertEntryNotFound(testFinder, "ramework/framework.jar", false);
+        assertEntryNotFound(testFinder, "ramework.jar", false);
+        assertEntryNotFound(testFinder, "framework", false);
+
+        Assert.assertEquals(dexFile2, testFinder.findEntry("/system/framework/framework.jar:classes2.dex", true));
+
+        assertEntryNotFound(testFinder, "system/framework/framework.jar:classes2.dex", true);
+        assertEntryNotFound(testFinder, "framework.jar:classes2.dex", true);
+        assertEntryNotFound(testFinder, "classes2.dex", true);
+
+        Assert.assertEquals(dexFile2, testFinder.findEntry("system/framework/framework.jar:classes2.dex", false));
+        Assert.assertEquals(dexFile2, testFinder.findEntry("/framework/framework.jar:classes2.dex", false));
+        Assert.assertEquals(dexFile2, testFinder.findEntry("framework/framework.jar:classes2.dex", false));
+        Assert.assertEquals(dexFile2, testFinder.findEntry("/framework.jar:classes2.dex", false));
+        Assert.assertEquals(dexFile2, testFinder.findEntry("framework.jar:classes2.dex", false));
+        Assert.assertEquals(dexFile2, testFinder.findEntry(":classes2.dex", false));
+        Assert.assertEquals(dexFile2, testFinder.findEntry("classes2.dex", false));
+
+        assertEntryNotFound(testFinder, "ystem/framework/framework.jar:classes2.dex", false);
+        assertEntryNotFound(testFinder, "ramework.jar:classes2.dex", false);
+        assertEntryNotFound(testFinder, "lasses2.dex", false);
+        assertEntryNotFound(testFinder, "classes2", false);
+    }
+
+    @Test
+    public void testSimilarEntries() throws Exception {
+        Map<String, DexBackedDexFile> entries = Maps.newHashMap();
+        DexBackedDexFile dexFile1 = mock(DexBackedDexFile.class);
+        entries.put("/system/framework/framework.jar", dexFile1);
+        DexBackedDexFile dexFile2 = mock(DexBackedDexFile.class);
+        entries.put("system/framework/framework.jar", dexFile2);
+        DexEntryFinder testFinder = new DexEntryFinder("blah.oat", new TestMultiDexContainer(entries));
+
+        Assert.assertEquals(dexFile1, testFinder.findEntry("/system/framework/framework.jar", true));
+        Assert.assertEquals(dexFile2, testFinder.findEntry("system/framework/framework.jar", true));
+
+        assertMultipleMatchingEntries(testFinder, "/system/framework/framework.jar");
+        assertMultipleMatchingEntries(testFinder, "system/framework/framework.jar");
+
+        assertMultipleMatchingEntries(testFinder, "/framework/framework.jar");
+        assertMultipleMatchingEntries(testFinder, "framework/framework.jar");
+        assertMultipleMatchingEntries(testFinder, "/framework.jar");
+        assertMultipleMatchingEntries(testFinder, "framework.jar");
+    }
+
+    @Test
+    public void testMatchingSuffix() throws Exception {
+        Map<String, DexBackedDexFile> entries = Maps.newHashMap();
+        DexBackedDexFile dexFile1 = mock(DexBackedDexFile.class);
+        entries.put("/system/framework/framework.jar", dexFile1);
+        DexBackedDexFile dexFile2 = mock(DexBackedDexFile.class);
+        entries.put("/framework/framework.jar", dexFile2);
+        DexEntryFinder testFinder = new DexEntryFinder("blah.oat", new TestMultiDexContainer(entries));
+
+        Assert.assertEquals(dexFile1, testFinder.findEntry("/system/framework/framework.jar", true));
+        Assert.assertEquals(dexFile2, testFinder.findEntry("/framework/framework.jar", true));
+
+        Assert.assertEquals(dexFile2, testFinder.findEntry("/framework/framework.jar", false));
+        Assert.assertEquals(dexFile2, testFinder.findEntry("framework/framework.jar", false));
+
+        assertMultipleMatchingEntries(testFinder, "/framework.jar");
+        assertMultipleMatchingEntries(testFinder, "framework.jar");
+    }
+
+    @Test
+    public void testNonDexEntries() throws Exception {
+        Map<String, DexBackedDexFile> entries = Maps.newHashMap();
+        DexBackedDexFile dexFile1 = mock(DexBackedDexFile.class);
+        entries.put("classes.dex", dexFile1);
+        entries.put("/blah/classes.dex", null);
+        DexEntryFinder testFinder = new DexEntryFinder("blah.oat", new TestMultiDexContainer(entries));
+
+        Assert.assertEquals(dexFile1, testFinder.findEntry("classes.dex", true));
+        Assert.assertEquals(dexFile1, testFinder.findEntry("classes.dex", false));
+
+        assertUnsupportedFileType(testFinder, "/blah/classes.dex", true);
+        assertDexFileNotFound(testFinder, "/blah/classes.dex", false);
+    }
+
+    private void assertEntryNotFound(DexEntryFinder finder, String entry, boolean exactMatch) throws IOException {
+        try {
+            finder.findEntry(entry, exactMatch);
+            Assert.fail();
+        } catch (DexFileNotFoundException ex) {
+            // expected exception
+        }
+    }
+
+    private void assertMultipleMatchingEntries(DexEntryFinder finder, String entry) throws IOException {
+        try {
+            finder.findEntry(entry, false);
+            Assert.fail();
+        } catch (MultipleMatchingDexEntriesException ex) {
+            // expected exception
+        }
+    }
+
+    private void assertUnsupportedFileType(DexEntryFinder finder, String entry, boolean exactMatch) throws IOException {
+        try {
+            finder.findEntry(entry, exactMatch);
+            Assert.fail();
+        } catch (UnsupportedFileTypeException ex) {
+            // expected exception
+        }
+    }
+
+    private void assertDexFileNotFound(DexEntryFinder finder, String entry, boolean exactMatch) throws IOException {
+        try {
+            finder.findEntry(entry, exactMatch);
+            Assert.fail();
+        } catch (DexFileNotFoundException ex) {
+            // expected exception
+        }
+    }
+
+    public static class TestMultiDexContainer implements MultiDexContainer<DexBackedDexFile> {
+        @Nonnull private final Map<String, DexBackedDexFile> entries;
+
+        public TestMultiDexContainer(@Nonnull Map<String, DexBackedDexFile> entries) {
+            this.entries = entries;
+        }
+
+        @Nonnull @Override public List<String> getDexEntryNames() throws IOException {
+            List<String> entryNames = Lists.newArrayList();
+
+            for (Entry<String, DexBackedDexFile> entry: entries.entrySet()) {
+                if (entry.getValue() != null) {
+                    entryNames.add(entry.getKey());
+                }
+            }
+
+            return entryNames;
+        }
+
+        @Nullable @Override public DexBackedDexFile getEntry(@Nonnull String entryName) throws IOException {
+            if (entries.containsKey(entryName)) {
+                DexBackedDexFile entry = entries.get(entryName);
+                if (entry == null) {
+                    throw new NotADexFile();
+                }
+                return entry;
+            }
+            return null;
+        }
+
+        @Nonnull @Override public Opcodes getOpcodes() {
+            return Opcodes.getDefault();
+        }
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/analysis/CommonSuperclassTest.java b/dexlib2/src/test/java/org/jf/dexlib2/analysis/CommonSuperclassTest.java
index 3f1ee56..d69dd81 100644
--- a/dexlib2/src/test/java/org/jf/dexlib2/analysis/CommonSuperclassTest.java
+++ b/dexlib2/src/test/java/org/jf/dexlib2/analysis/CommonSuperclassTest.java
@@ -32,8 +32,10 @@
 package org.jf.dexlib2.analysis;
 
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Lists;
 import junit.framework.Assert;
 import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.iface.ClassDef;
 import org.jf.dexlib2.immutable.ImmutableDexFile;
 import org.junit.Test;
 
@@ -51,49 +53,53 @@
     //     fivetwothree
     //   fivethree
 
-    private final ClassPath classPath;
+    private final ClassPath oldClassPath;
+    private final ClassPath newClassPath;
+
 
     public CommonSuperclassTest() throws IOException {
-        classPath = new ClassPath(new DexClassProvider(new ImmutableDexFile(Opcodes.forApi(19),
-                ImmutableSet.of(
-                        TestUtils.makeClassDef("Ljava/lang/Object;", null),
-                        TestUtils.makeClassDef("Ltest/one;", "Ljava/lang/Object;"),
-                        TestUtils.makeClassDef("Ltest/two;", "Ljava/lang/Object;"),
-                        TestUtils.makeClassDef("Ltest/onetwo;", "Ltest/one;"),
-                        TestUtils.makeClassDef("Ltest/onetwothree;", "Ltest/onetwo;"),
-                        TestUtils.makeClassDef("Ltest/onethree;", "Ltest/one;"),
-                        TestUtils.makeClassDef("Ltest/fivetwo;", "Ltest/five;"),
-                        TestUtils.makeClassDef("Ltest/fivetwothree;", "Ltest/fivetwo;"),
-                        TestUtils.makeClassDef("Ltest/fivethree;", "Ltest/five;"),
-                        TestUtils.makeInterfaceDef("Ljava/lang/Cloneable;"),
-                        TestUtils.makeInterfaceDef("Ljava/io/Serializable;"),
+        ImmutableSet<ClassDef> classes = ImmutableSet.of(
+                TestUtils.makeClassDef("Ljava/lang/Object;", null),
+                TestUtils.makeClassDef("Ltest/one;", "Ljava/lang/Object;"),
+                TestUtils.makeClassDef("Ltest/two;", "Ljava/lang/Object;"),
+                TestUtils.makeClassDef("Ltest/onetwo;", "Ltest/one;"),
+                TestUtils.makeClassDef("Ltest/onetwothree;", "Ltest/onetwo;"),
+                TestUtils.makeClassDef("Ltest/onethree;", "Ltest/one;"),
+                TestUtils.makeClassDef("Ltest/fivetwo;", "Ltest/five;"),
+                TestUtils.makeClassDef("Ltest/fivetwothree;", "Ltest/fivetwo;"),
+                TestUtils.makeClassDef("Ltest/fivethree;", "Ltest/five;"),
+                TestUtils.makeInterfaceDef("Ljava/lang/Cloneable;"),
+                TestUtils.makeInterfaceDef("Ljava/io/Serializable;"),
 
-                        // basic class and interface
-                        TestUtils.makeClassDef("Liface/classiface1;", "Ljava/lang/Object;", "Liface/iface1;"),
-                        TestUtils.makeInterfaceDef("Liface/iface1;"),
+                // basic class and interface
+                TestUtils.makeClassDef("Liface/classiface1;", "Ljava/lang/Object;", "Liface/iface1;"),
+                TestUtils.makeInterfaceDef("Liface/iface1;"),
 
-                        // a more complex interface tree
-                        TestUtils.makeInterfaceDef("Liface/base1;"),
-                        // implements undefined interface
-                        TestUtils.makeInterfaceDef("Liface/sub1;", "Liface/base1;", "Liface/base2;"),
-                        // this implements sub1, so that its interfaces can't be fully resolved either
-                        TestUtils.makeInterfaceDef("Liface/sub2;", "Liface/base1;", "Liface/sub1;"),
-                        TestUtils.makeInterfaceDef("Liface/sub3;", "Liface/base1;"),
-                        TestUtils.makeInterfaceDef("Liface/sub4;", "Liface/base1;", "Liface/sub3;"),
-                        TestUtils.makeClassDef("Liface/classsub1;", "Ljava/lang/Object;", "Liface/sub1;"),
-                        TestUtils.makeClassDef("Liface/classsub2;", "Ljava/lang/Object;", "Liface/sub2;"),
-                        TestUtils.makeClassDef("Liface/classsub3;", "Ljava/lang/Object;", "Liface/sub3;",
-                                "Liface/base;"),
-                        TestUtils.makeClassDef("Liface/classsub4;", "Ljava/lang/Object;", "Liface/sub3;",
-                                "Liface/sub4;"),
-                        TestUtils.makeClassDef("Liface/classsubsub4;", "Liface/classsub4;"),
-                        TestUtils.makeClassDef("Liface/classsub1234;", "Ljava/lang/Object;", "Liface/sub1;",
-                                "Liface/sub2;", "Liface/sub3;", "Liface/sub4;")
-        ))));
+                // a more complex interface tree
+                TestUtils.makeInterfaceDef("Liface/base1;"),
+                // implements undefined interface
+                TestUtils.makeInterfaceDef("Liface/sub1;", "Liface/base1;", "Liface/base2;"),
+                // this implements sub1, so that its interfaces can't be fully resolved either
+                TestUtils.makeInterfaceDef("Liface/sub2;", "Liface/base1;", "Liface/sub1;"),
+                TestUtils.makeInterfaceDef("Liface/sub3;", "Liface/base1;"),
+                TestUtils.makeInterfaceDef("Liface/sub4;", "Liface/base1;", "Liface/sub3;"),
+                TestUtils.makeClassDef("Liface/classsub1;", "Ljava/lang/Object;", "Liface/sub1;"),
+                TestUtils.makeClassDef("Liface/classsub2;", "Ljava/lang/Object;", "Liface/sub2;"),
+                TestUtils.makeClassDef("Liface/classsub3;", "Ljava/lang/Object;", "Liface/sub3;",
+                        "Liface/base;"),
+                TestUtils.makeClassDef("Liface/classsub4;", "Ljava/lang/Object;", "Liface/sub3;",
+                        "Liface/sub4;"),
+                TestUtils.makeClassDef("Liface/classsubsub4;", "Liface/classsub4;"),
+                TestUtils.makeClassDef("Liface/classsub1234;", "Ljava/lang/Object;", "Liface/sub1;",
+                        "Liface/sub2;", "Liface/sub3;", "Liface/sub4;"));
+
+        oldClassPath = new ClassPath(new DexClassProvider(new ImmutableDexFile(Opcodes.getDefault(), classes)));
+        newClassPath = new ClassPath(Lists.newArrayList(new DexClassProvider(
+                new ImmutableDexFile(Opcodes.forArtVersion(72), classes))), true, 72);
     }
 
-    public void superclassTest(String commonSuperclass,
-                                      String type1, String type2) {
+    public void superclassTest(ClassPath classPath, String commonSuperclass,
+                               String type1, String type2) {
         TypeProto commonSuperclassProto = classPath.getClass(commonSuperclass);
         TypeProto type1Proto = classPath.getClass(type1);
         TypeProto type2Proto = classPath.getClass(type2);
@@ -102,6 +108,11 @@
         Assert.assertSame(commonSuperclassProto, type2Proto.getCommonSuperclass(type1Proto));
     }
 
+    public void superclassTest(String commonSuperclass, String type1, String type2) {
+        superclassTest(oldClassPath, commonSuperclass, type1, type2);
+        superclassTest(newClassPath, commonSuperclass, type1, type2);
+    }
+
     @Test
     public void testGetCommonSuperclass() throws IOException {
         String object = "Ljava/lang/Object;";
@@ -131,7 +142,11 @@
         // same value, but different object
         Assert.assertEquals(
                 onetwo,
-                classPath.getClass(onetwo).getCommonSuperclass(new ClassProto(classPath, onetwo)).getType());
+                oldClassPath.getClass(onetwo).getCommonSuperclass(new ClassProto(oldClassPath, onetwo)).getType());
+
+        Assert.assertEquals(
+                onetwo,
+                newClassPath.getClass(onetwo).getCommonSuperclass(new ClassProto(newClassPath, onetwo)).getType());
 
         // other object is superclass
         superclassTest(object, object, one);
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/analysis/CustomMethodInlineTableTest.java b/dexlib2/src/test/java/org/jf/dexlib2/analysis/CustomMethodInlineTableTest.java
index 90a6359..70e6a04 100644
--- a/dexlib2/src/test/java/org/jf/dexlib2/analysis/CustomMethodInlineTableTest.java
+++ b/dexlib2/src/test/java/org/jf/dexlib2/analysis/CustomMethodInlineTableTest.java
@@ -51,11 +51,12 @@
 import org.junit.Assert;
 import org.junit.Test;
 
+import java.io.IOException;
 import java.util.List;
 
 public class CustomMethodInlineTableTest {
     @Test
-    public void testCustomMethodInlineTable_Virtual() {
+    public void testCustomMethodInlineTable_Virtual() throws IOException {
         List<ImmutableInstruction> instructions = Lists.newArrayList(
                 new ImmutableInstruction35mi(Opcode.EXECUTE_INLINE, 1, 0, 0, 0, 0, 0, 0),
                 new ImmutableInstruction10x(Opcode.RETURN_VOID));
@@ -67,10 +68,12 @@
         ClassDef classDef = new ImmutableClassDef("Lblah;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
                 null, null, null, null, null, ImmutableList.of(method));
 
-        DexFile dexFile = new ImmutableDexFile(Opcodes.forApi(19), ImmutableList.of(classDef));
+        DexFile dexFile = new ImmutableDexFile(Opcodes.getDefault(), ImmutableList.of(classDef));
 
-        ClassPath classPath = ClassPath.fromClassPath(ImmutableList.<String>of(), ImmutableList.<String>of(), dexFile,
-                15, false);
+        ClassPathResolver resolver = new ClassPathResolver(ImmutableList.<String>of(),
+                ImmutableList.<String>of(), ImmutableList.<String>of(), dexFile);
+        ClassPath classPath = new ClassPath(resolver.getResolvedClassProviders(), false, ClassPath.NOT_ART);
+
         InlineMethodResolver inlineMethodResolver = new CustomInlineMethodResolver(classPath, "Lblah;->blah()V");
         MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, inlineMethodResolver, false);
 
@@ -82,7 +85,7 @@
     }
 
     @Test
-    public void testCustomMethodInlineTable_Static() {
+    public void testCustomMethodInlineTable_Static() throws IOException {
         List<ImmutableInstruction> instructions = Lists.newArrayList(
                 new ImmutableInstruction35mi(Opcode.EXECUTE_INLINE, 1, 0, 0, 0, 0, 0, 0),
                 new ImmutableInstruction10x(Opcode.RETURN_VOID));
@@ -94,10 +97,12 @@
         ClassDef classDef = new ImmutableClassDef("Lblah;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
                 null, null, null, null, ImmutableList.of(method), null);
 
-        DexFile dexFile = new ImmutableDexFile(Opcodes.forApi(19), ImmutableList.of(classDef));
+        DexFile dexFile = new ImmutableDexFile(Opcodes.getDefault(), ImmutableList.of(classDef));
 
-        ClassPath classPath = ClassPath.fromClassPath(ImmutableList.<String>of(), ImmutableList.<String>of(), dexFile,
-                15, false);
+        ClassPathResolver resolver = new ClassPathResolver(ImmutableList.<String>of(),
+                ImmutableList.<String>of(), ImmutableList.<String>of(), dexFile);
+        ClassPath classPath = new ClassPath(resolver.getResolvedClassProviders(), false, ClassPath.NOT_ART);
+
         InlineMethodResolver inlineMethodResolver = new CustomInlineMethodResolver(classPath, "Lblah;->blah()V");
         MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, inlineMethodResolver, false);
 
@@ -109,7 +114,7 @@
     }
 
     @Test
-    public void testCustomMethodInlineTable_Direct() {
+    public void testCustomMethodInlineTable_Direct() throws IOException {
         List<ImmutableInstruction> instructions = Lists.newArrayList(
                 new ImmutableInstruction35mi(Opcode.EXECUTE_INLINE, 1, 0, 0, 0, 0, 0, 0),
                 new ImmutableInstruction10x(Opcode.RETURN_VOID));
@@ -121,10 +126,12 @@
         ClassDef classDef = new ImmutableClassDef("Lblah;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
                 null, null, null, null, ImmutableList.of(method), null);
 
-        DexFile dexFile = new ImmutableDexFile(Opcodes.forApi(19), ImmutableList.of(classDef));
+        DexFile dexFile = new ImmutableDexFile(Opcodes.getDefault(), ImmutableList.of(classDef));
 
-        ClassPath classPath = ClassPath.fromClassPath(ImmutableList.<String>of(), ImmutableList.<String>of(), dexFile,
-                15, false);
+        ClassPathResolver resolver = new ClassPathResolver(ImmutableList.<String>of(),
+                ImmutableList.<String>of(), ImmutableList.<String>of(), dexFile);
+        ClassPath classPath = new ClassPath(resolver.getResolvedClassProviders(), false, ClassPath.NOT_ART);
+
         InlineMethodResolver inlineMethodResolver = new CustomInlineMethodResolver(classPath, "Lblah;->blah()V");
         MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, inlineMethodResolver, false);
 
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/analysis/MethodAnalyzerTest.java b/dexlib2/src/test/java/org/jf/dexlib2/analysis/MethodAnalyzerTest.java
new file mode 100644
index 0000000..215ba17
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/analysis/MethodAnalyzerTest.java
@@ -0,0 +1,260 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.analysis;
+
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.AccessFlags;
+import org.jf.dexlib2.Opcode;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.builder.MethodImplementationBuilder;
+import org.jf.dexlib2.builder.instruction.BuilderInstruction10x;
+import org.jf.dexlib2.builder.instruction.BuilderInstruction12x;
+import org.jf.dexlib2.builder.instruction.BuilderInstruction21t;
+import org.jf.dexlib2.builder.instruction.BuilderInstruction22c;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.DexFile;
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.iface.MethodImplementation;
+import org.jf.dexlib2.immutable.ImmutableClassDef;
+import org.jf.dexlib2.immutable.ImmutableDexFile;
+import org.jf.dexlib2.immutable.ImmutableMethod;
+import org.jf.dexlib2.immutable.ImmutableMethodParameter;
+import org.jf.dexlib2.immutable.reference.ImmutableTypeReference;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+
+import static org.jf.dexlib2.Opcodes.forArtVersion;
+
+public class MethodAnalyzerTest {
+
+    @Test
+    public void testInstanceOfNarrowingEqz_art() throws IOException {
+        MethodImplementationBuilder builder = new MethodImplementationBuilder(2);
+
+        builder.addInstruction(new BuilderInstruction22c(Opcode.INSTANCE_OF, 0, 1,
+                new ImmutableTypeReference("Lmain;")));
+        builder.addInstruction(new BuilderInstruction21t(Opcode.IF_EQZ, 0, builder.getLabel("not_instance_of")));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        builder.addLabel("not_instance_of");
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        MethodImplementation methodImplementation = builder.getMethodImplementation();
+
+        Method method = new ImmutableMethod("Lmain;", "narrowing",
+                Collections.singletonList(new ImmutableMethodParameter("Ljava/lang/Object;", null, null)), "V",
+                AccessFlags.PUBLIC.getValue(), null, methodImplementation);
+        ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
+                null, null, null, Collections.singletonList(method));
+        DexFile dexFile = new ImmutableDexFile(forArtVersion(56), Collections.singletonList(classDef));
+
+        ClassPath classPath = new ClassPath(Lists.newArrayList(new DexClassProvider(dexFile)), true, 56);
+        MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false);
+
+        List<AnalyzedInstruction> analyzedInstructions = methodAnalyzer.getAnalyzedInstructions();
+        Assert.assertEquals("Lmain;", analyzedInstructions.get(2).getPreInstructionRegisterType(1).type.getType());
+
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(3).getPreInstructionRegisterType(1).type.getType());
+    }
+
+    @Test
+    public void testInstanceOfNarrowingEqz_dalvik() throws IOException {
+        MethodImplementationBuilder builder = new MethodImplementationBuilder(2);
+
+        builder.addInstruction(new BuilderInstruction22c(Opcode.INSTANCE_OF, 0, 1,
+                new ImmutableTypeReference("Lmain;")));
+        builder.addInstruction(new BuilderInstruction21t(Opcode.IF_EQZ, 0, builder.getLabel("not_instance_of")));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        builder.addLabel("not_instance_of");
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        MethodImplementation methodImplementation = builder.getMethodImplementation();
+
+        Method method = new ImmutableMethod("Lmain;", "narrowing",
+                Collections.singletonList(new ImmutableMethodParameter("Ljava/lang/Object;", null, null)), "V",
+                AccessFlags.PUBLIC.getValue(), null, methodImplementation);
+        ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
+                null, null, null, Collections.singletonList(method));
+        DexFile dexFile = new ImmutableDexFile(Opcodes.forApi(19), Collections.singletonList(classDef));
+
+        ClassPath classPath = new ClassPath(new DexClassProvider(dexFile));
+        MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false);
+
+        List<AnalyzedInstruction> analyzedInstructions = methodAnalyzer.getAnalyzedInstructions();
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(2).getPreInstructionRegisterType(1).type.getType());
+
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(3).getPreInstructionRegisterType(1).type.getType());
+    }
+
+    @Test
+    public void testInstanceOfNarrowingNez_art() throws IOException {
+        MethodImplementationBuilder builder = new MethodImplementationBuilder(2);
+
+        builder.addInstruction(new BuilderInstruction22c(Opcode.INSTANCE_OF, 0, 1,
+                new ImmutableTypeReference("Lmain;")));
+        builder.addInstruction(new BuilderInstruction21t(Opcode.IF_NEZ, 0, builder.getLabel("instance_of")));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        builder.addLabel("instance_of");
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        MethodImplementation methodImplementation = builder.getMethodImplementation();
+
+        Method method = new ImmutableMethod("Lmain;", "narrowing",
+                Collections.singletonList(new ImmutableMethodParameter("Ljava/lang/Object;", null, null)), "V",
+                AccessFlags.PUBLIC.getValue(), null, methodImplementation);
+        ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
+                null, null, null, Collections.singletonList(method));
+        DexFile dexFile = new ImmutableDexFile(forArtVersion(56), Collections.singletonList(classDef));
+
+        ClassPath classPath = new ClassPath(Lists.newArrayList(new DexClassProvider(dexFile)), true, 56);
+        MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false);
+
+        List<AnalyzedInstruction> analyzedInstructions = methodAnalyzer.getAnalyzedInstructions();
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(2).getPreInstructionRegisterType(1).type.getType());
+
+        Assert.assertEquals("Lmain;", analyzedInstructions.get(3).getPreInstructionRegisterType(1).type.getType());
+    }
+
+    @Test
+    public void testInstanceOfNarrowingNez_dalvik() throws IOException {
+        MethodImplementationBuilder builder = new MethodImplementationBuilder(2);
+
+        builder.addInstruction(new BuilderInstruction22c(Opcode.INSTANCE_OF, 0, 1,
+                new ImmutableTypeReference("Lmain;")));
+        builder.addInstruction(new BuilderInstruction21t(Opcode.IF_NEZ, 0, builder.getLabel("instance_of")));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        builder.addLabel("instance_of");
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        MethodImplementation methodImplementation = builder.getMethodImplementation();
+
+        Method method = new ImmutableMethod("Lmain;", "narrowing",
+                Collections.singletonList(new ImmutableMethodParameter("Ljava/lang/Object;", null, null)), "V",
+                AccessFlags.PUBLIC.getValue(), null, methodImplementation);
+        ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
+                null, null, null, Collections.singletonList(method));
+        DexFile dexFile = new ImmutableDexFile(Opcodes.getDefault(), Collections.singletonList(classDef));
+
+        ClassPath classPath = new ClassPath(new DexClassProvider(dexFile));
+        MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false);
+
+        List<AnalyzedInstruction> analyzedInstructions = methodAnalyzer.getAnalyzedInstructions();
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(2).getPreInstructionRegisterType(1).type.getType());
+
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(3).getPreInstructionRegisterType(1).type.getType());
+    }
+
+    @Test
+    public void testInstanceOfNarrowingAfterMove_art() throws IOException {
+        MethodImplementationBuilder builder = new MethodImplementationBuilder(3);
+
+        builder.addInstruction(new BuilderInstruction12x(Opcode.MOVE_OBJECT, 1, 2));
+        builder.addInstruction(new BuilderInstruction22c(Opcode.INSTANCE_OF, 0, 1,
+                new ImmutableTypeReference("Lmain;")));
+        builder.addInstruction(new BuilderInstruction21t(Opcode.IF_EQZ, 0, builder.getLabel("not_instance_of")));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        builder.addLabel("not_instance_of");
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        MethodImplementation methodImplementation = builder.getMethodImplementation();
+
+        Method method = new ImmutableMethod("Lmain;", "narrowing",
+                Collections.singletonList(new ImmutableMethodParameter("Ljava/lang/Object;", null, null)), "V",
+                AccessFlags.PUBLIC.getValue(), null, methodImplementation);
+        ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
+                null, null, null, Collections.singletonList(method));
+        DexFile dexFile = new ImmutableDexFile(forArtVersion(56), Collections.singletonList(classDef));
+
+        ClassPath classPath = new ClassPath(Lists.newArrayList(new DexClassProvider(dexFile)), true, 56);
+        MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false);
+
+        List<AnalyzedInstruction> analyzedInstructions = methodAnalyzer.getAnalyzedInstructions();
+        Assert.assertEquals("Lmain;", analyzedInstructions.get(3).getPreInstructionRegisterType(1).type.getType());
+        Assert.assertEquals("Lmain;", analyzedInstructions.get(3).getPreInstructionRegisterType(2).type.getType());
+
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(4).getPreInstructionRegisterType(1).type.getType());
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(4).getPreInstructionRegisterType(2).type.getType());
+    }
+
+    @Test
+    public void testInstanceOfNarrowingAfterMove_dalvik() throws IOException {
+        MethodImplementationBuilder builder = new MethodImplementationBuilder(3);
+
+        builder.addInstruction(new BuilderInstruction12x(Opcode.MOVE_OBJECT, 1, 2));
+        builder.addInstruction(new BuilderInstruction22c(Opcode.INSTANCE_OF, 0, 1,
+                new ImmutableTypeReference("Lmain;")));
+        builder.addInstruction(new BuilderInstruction21t(Opcode.IF_EQZ, 0, builder.getLabel("not_instance_of")));
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        builder.addLabel("not_instance_of");
+        builder.addInstruction(new BuilderInstruction10x(Opcode.RETURN_VOID));
+
+        MethodImplementation methodImplementation = builder.getMethodImplementation();
+
+        Method method = new ImmutableMethod("Lmain;", "narrowing",
+                Collections.singletonList(new ImmutableMethodParameter("Ljava/lang/Object;", null, null)), "V",
+                AccessFlags.PUBLIC.getValue(), null, methodImplementation);
+        ClassDef classDef = new ImmutableClassDef("Lmain;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null,
+                null, null, null, Collections.singletonList(method));
+        DexFile dexFile = new ImmutableDexFile(Opcodes.getDefault(), Collections.singletonList(classDef));
+
+        ClassPath classPath = new ClassPath(new DexClassProvider(dexFile));
+        MethodAnalyzer methodAnalyzer = new MethodAnalyzer(classPath, method, null, false);
+
+        List<AnalyzedInstruction> analyzedInstructions = methodAnalyzer.getAnalyzedInstructions();
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(3).getPreInstructionRegisterType(1).type.getType());
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(3).getPreInstructionRegisterType(2).type.getType());
+
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(4).getPreInstructionRegisterType(1).type.getType());
+        Assert.assertEquals("Ljava/lang/Object;",
+                analyzedInstructions.get(4).getPreInstructionRegisterType(2).type.getType());
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/analysis/util/SuperclassChainTest.java b/dexlib2/src/test/java/org/jf/dexlib2/analysis/util/SuperclassChainTest.java
index 84cd284..78bc8a5 100644
--- a/dexlib2/src/test/java/org/jf/dexlib2/analysis/util/SuperclassChainTest.java
+++ b/dexlib2/src/test/java/org/jf/dexlib2/analysis/util/SuperclassChainTest.java
@@ -57,7 +57,7 @@
         ImmutableSet<ClassDef> classes = ImmutableSet.<ClassDef>of(
                 objectClassDef, oneClassDef, twoClassDef, threeClassDef);
 
-        ClassPath classPath = new ClassPath(new DexClassProvider(new ImmutableDexFile(Opcodes.forApi(19), classes)));
+        ClassPath classPath = new ClassPath(new DexClassProvider(new ImmutableDexFile(Opcodes.getDefault(), classes)));
 
         TypeProto objectClassProto = classPath.getClass("Ljava/lang/Object;");
         TypeProto oneClassProto = classPath.getClass("Ltest/one;");
@@ -88,7 +88,7 @@
         ClassDef twoClassDef = TestUtils.makeClassDef("Ltest/two;", "Ltest/one;");
         ClassDef threeClassDef = TestUtils.makeClassDef("Ltest/three;", "Ltest/two;");
         ImmutableSet<ClassDef> classes = ImmutableSet.<ClassDef>of(twoClassDef, threeClassDef);
-        ClassPath classPath = new ClassPath(new DexClassProvider(new ImmutableDexFile(Opcodes.forApi(19), classes)));
+        ClassPath classPath = new ClassPath(new DexClassProvider(new ImmutableDexFile(Opcodes.getDefault(), classes)));
 
         TypeProto unknownClassProto = classPath.getUnknownClass();
         TypeProto oneClassProto = classPath.getClass("Ltest/one;");
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/pool/RollbackTest.java b/dexlib2/src/test/java/org/jf/dexlib2/pool/RollbackTest.java
new file mode 100644
index 0000000..6074de1
--- /dev/null
+++ b/dexlib2/src/test/java/org/jf/dexlib2/pool/RollbackTest.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.dexlib2.pool;
+
+import com.google.common.collect.Lists;
+import org.jf.dexlib2.AccessFlags;
+import org.jf.dexlib2.AnnotationVisibility;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.dexbacked.raw.MapItem;
+import org.jf.dexlib2.dexbacked.raw.RawDexFile;
+import org.jf.dexlib2.iface.ClassDef;
+import org.jf.dexlib2.iface.Field;
+import org.jf.dexlib2.iface.Method;
+import org.jf.dexlib2.iface.MethodParameter;
+import org.jf.dexlib2.immutable.*;
+import org.jf.dexlib2.writer.io.MemoryDataStore;
+import org.jf.dexlib2.writer.pool.DexPool;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.util.List;
+
+public class RollbackTest {
+    @Test
+    public void testRollback() throws IOException {
+        ClassDef class1 = new ImmutableClassDef("Lcls1;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, null,
+                Lists.newArrayList(new ImmutableAnnotation(AnnotationVisibility.RUNTIME, "Lannotation;", null)),
+                Lists.<Field>newArrayList(
+                        new ImmutableField("Lcls1;", "field1", "I", AccessFlags.PUBLIC.getValue(), null, null)
+                ),
+                Lists.<Method>newArrayList(
+                        new ImmutableMethod("Lcls1", "method1",
+                                Lists.<MethodParameter>newArrayList(new ImmutableMethodParameter("L", null, null)), "V",
+                                AccessFlags.PUBLIC.getValue(), null, null))
+                );
+
+        ClassDef class2 = new ImmutableClassDef("Lcls2;", AccessFlags.PUBLIC.getValue(), "Ljava/lang/Object;", null, null,
+                Lists.newArrayList(new ImmutableAnnotation(AnnotationVisibility.RUNTIME, "Lannotation2;", null)),
+                Lists.<Field>newArrayList(
+                        new ImmutableField("Lcls2;", "field2", "D", AccessFlags.PUBLIC.getValue(), null, null)
+                ),
+                Lists.<Method>newArrayList(
+                        new ImmutableMethod("Lcls2;", "method2",
+                                Lists.<MethodParameter>newArrayList(new ImmutableMethodParameter("D", null, null)), "V",
+                                AccessFlags.PUBLIC.getValue(), null, null))
+        );
+
+        RawDexFile dexFile1;
+        {
+            MemoryDataStore dataStore = new MemoryDataStore();
+            DexPool dexPool = new DexPool(Opcodes.getDefault());
+            dexPool.internClass(class1);
+            dexPool.mark();
+            dexPool.internClass(class2);
+            dexPool.reset();
+            dexPool.writeTo(dataStore);
+            dexFile1 = new RawDexFile(Opcodes.getDefault(), dataStore.getData());
+        }
+
+        RawDexFile dexFile2;
+        {
+            MemoryDataStore dataStore = new MemoryDataStore();
+            DexPool dexPool = new DexPool(Opcodes.getDefault());
+            dexPool.internClass(class1);
+            dexPool.writeTo(dataStore);
+            dexFile2 = new RawDexFile(Opcodes.getDefault(), dataStore.getData());
+        }
+
+        List<MapItem> mapItems1 = dexFile1.getMapItems();
+        List<MapItem> mapItems2 = dexFile2.getMapItems();
+        for (int i=0; i<mapItems1.size(); i++) {
+            Assert.assertEquals(mapItems1.get(i).getType(), mapItems2.get(i).getType());
+            Assert.assertEquals(mapItems1.get(i).getItemCount(), mapItems2.get(i).getItemCount());
+        }
+    }
+}
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/writer/DexWriterTest.java b/dexlib2/src/test/java/org/jf/dexlib2/writer/DexWriterTest.java
index 1a0a289..bf55e37 100644
--- a/dexlib2/src/test/java/org/jf/dexlib2/writer/DexWriterTest.java
+++ b/dexlib2/src/test/java/org/jf/dexlib2/writer/DexWriterTest.java
@@ -72,12 +72,12 @@
         MemoryDataStore dataStore = new MemoryDataStore();
 
         try {
-            DexPool.writeTo(dataStore, new ImmutableDexFile(Opcodes.forApi(19), ImmutableSet.of(classDef)));
+            DexPool.writeTo(dataStore, new ImmutableDexFile(Opcodes.getDefault(), ImmutableSet.of(classDef)));
         } catch (IOException ex) {
             throw new RuntimeException(ex);
         }
 
-        DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.forApi(15), dataStore.getData());
+        DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.getDefault(), dataStore.getData());
         ClassDef dbClassDef = Iterables.getFirst(dexFile.getClasses(), null);
         Assert.assertNotNull(dbClassDef);
         Annotation dbAnnotation = Iterables.getFirst(dbClassDef.getAnnotations(), null);
@@ -112,12 +112,12 @@
         MemoryDataStore dataStore = new MemoryDataStore();
 
         try {
-            DexPool.writeTo(dataStore, new ImmutableDexFile(Opcodes.forApi(19), ImmutableSet.of(classDef)));
+            DexPool.writeTo(dataStore, new ImmutableDexFile(Opcodes.getDefault(), ImmutableSet.of(classDef)));
         } catch (IOException ex) {
             throw new RuntimeException(ex);
         }
 
-        DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.forApi(15), dataStore.getData());
+        DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.getDefault(), dataStore.getData());
         ClassDef dbClassDef = Iterables.getFirst(dexFile.getClasses(), null);
         Assert.assertNotNull(dbClassDef);
         Annotation dbAnnotation = Iterables.getFirst(dbClassDef.getAnnotations(), null);
diff --git a/dexlib2/src/test/java/org/jf/dexlib2/writer/JumboStringConversionTest.java b/dexlib2/src/test/java/org/jf/dexlib2/writer/JumboStringConversionTest.java
index c246e0e..340b1fa 100644
--- a/dexlib2/src/test/java/org/jf/dexlib2/writer/JumboStringConversionTest.java
+++ b/dexlib2/src/test/java/org/jf/dexlib2/writer/JumboStringConversionTest.java
@@ -62,7 +62,7 @@
 public class JumboStringConversionTest {
     @Test
     public void testJumboStringConversion() throws IOException {
-        DexBuilder dexBuilder = DexBuilder.makeDexBuilder(Opcodes.forApi(15));
+        DexBuilder dexBuilder = new DexBuilder(Opcodes.getDefault());
 
         MethodImplementationBuilder methodBuilder = new MethodImplementationBuilder(1);
         for (int i=0; i<66000; i++) {
@@ -92,7 +92,7 @@
         MemoryDataStore dexStore = new MemoryDataStore();
         dexBuilder.writeTo(dexStore);
 
-        DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.forApi(15), dexStore.getData());
+        DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.getDefault(), dexStore.getData());
 
         ClassDef classDef = Iterables.getFirst(dexFile.getClasses(), null);
         Assert.assertNotNull(classDef);
@@ -122,7 +122,7 @@
 
     @Test
     public void testJumboStringConversion_NonMethodBuilder() throws IOException {
-        DexBuilder dexBuilder = DexBuilder.makeDexBuilder(Opcodes.forApi(15));
+        DexBuilder dexBuilder = new DexBuilder(Opcodes.getDefault());
 
         final List<Instruction> instructions = Lists.newArrayList();
         for (int i=0; i<66000; i++) {
@@ -189,7 +189,7 @@
         MemoryDataStore dexStore = new MemoryDataStore();
         dexBuilder.writeTo(dexStore);
 
-        DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.forApi(15), dexStore.getData());
+        DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.getDefault(), dexStore.getData());
 
         ClassDef classDef = Iterables.getFirst(dexFile.getClasses(), null);
         Assert.assertNotNull(classDef);
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 5ccda13..6ffa237 100644
--- a/gradle/wrapper/gradle-wrapper.jar
+++ b/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 23bc0f5..8ee9c63 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Fri Jul 08 16:46:58 PDT 2016
+#Wed Sep 28 23:22:26 AEST 2016
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.14-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.1-all.zip
diff --git a/gradlew b/gradlew
index 9d82f78..9aa616c 100755
--- a/gradlew
+++ b/gradlew
@@ -6,12 +6,30 @@
 ##
 ##############################################################################
 
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
 
 APP_NAME="Gradle"
 APP_BASE_NAME=`basename "$0"`
 
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
 # Use the maximum available, or set MAX_FD != -1 to use that value.
 MAX_FD="maximum"
 
@@ -30,6 +48,7 @@
 cygwin=false
 msys=false
 darwin=false
+nonstop=false
 case "`uname`" in
   CYGWIN* )
     cygwin=true
@@ -40,26 +59,11 @@
   MINGW* )
     msys=true
     ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
 esac
 
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-        PRG="$link"
-    else
-        PRG=`dirname "$PRG"`"/$link"
-    fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
 CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
 
 # Determine the Java command to use to start the JVM.
@@ -85,7 +89,7 @@
 fi
 
 # Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
     MAX_FD_LIMIT=`ulimit -H -n`
     if [ $? -eq 0 ] ; then
         if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
@@ -157,4 +161,9 @@
 eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
 JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
 
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]]; then
+  cd "$(dirname "$0")"
+fi
+
 exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/gradlew.bat b/gradlew.bat
index 72d362d..e95643d 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -8,14 +8,14 @@
 @rem Set local scope for the variables with windows NT shell

 if "%OS%"=="Windows_NT" setlocal

 

-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.

-set DEFAULT_JVM_OPTS=

-

 set DIRNAME=%~dp0

 if "%DIRNAME%" == "" set DIRNAME=.

 set APP_BASE_NAME=%~n0

 set APP_HOME=%DIRNAME%

 

+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.

+set DEFAULT_JVM_OPTS=

+

 @rem Find java.exe

 if defined JAVA_HOME goto findJavaFromJavaHome

 

@@ -49,7 +49,6 @@
 @rem Get command-line arguments, handling Windows variants

 

 if not "%OS%" == "Windows_NT" goto win9xME_args

-if "%@eval[2+2]" == "4" goto 4NT_args

 

 :win9xME_args

 @rem Slurp the command line arguments.

@@ -60,11 +59,6 @@
 if "x%~1" == "x" goto execute

 

 set CMD_LINE_ARGS=%*

-goto execute

-

-:4NT_args

-@rem Get arguments from the 4NT Shell from JP Software

-set CMD_LINE_ARGS=%$

 

 :execute

 @rem Setup the command line

diff --git a/smali/Android.mk b/smali/Android.mk
index 016707d..1a8d71c 100644
--- a/smali/Android.mk
+++ b/smali/Android.mk
@@ -42,7 +42,8 @@
 
 LOCAL_STATIC_JAVA_LIBRARIES := \
 	antlr-runtime \
-	dexlib2
+	dexlib2 \
+	jcommander-host
 
 #create a new smali.properties file using the correct version
 $(intermediates)/resources/smali.properties: $(LOCAL_PATH)/../build.gradle
diff --git a/smali/build.gradle b/smali/build.gradle
index 318b5a9..6472f21 100644
--- a/smali/build.gradle
+++ b/smali/build.gradle
@@ -76,8 +76,8 @@
     compile project(':util')
     compile project(':dexlib2')
     compile depends.antlr_runtime
+    compile depends.jcommander
     compile depends.stringtemplate
-    compile depends.commons_cli
 
     testCompile depends.junit
 
@@ -95,7 +95,7 @@
     classifier = 'fat'
 
     manifest {
-        attributes('Main-Class': 'org.jf.smali.main')
+        attributes('Main-Class': 'org.jf.smali.Main')
     }
 
     doLast {
@@ -141,7 +141,8 @@
     dontobfuscate
     dontoptimize
 
-    keep 'public class org.jf.smali.main { public static void main(java.lang.String[]); }'
+    keep 'public class org.jf.smali.Main { public static void main(java.lang.String[]); }'
+    keep 'class com.beust.jcommander.** { *; }'
     keepclassmembers 'enum * { public static **[] values(); public static ** valueOf(java.lang.String); }'
 
     dontwarn 'com.google.common.**'
diff --git a/smali/manifest.txt b/smali/manifest.txt
index b673fc8..0a58e57 100644
--- a/smali/manifest.txt
+++ b/smali/manifest.txt
@@ -1 +1 @@
-Main-Class: org.jf.smali.main
+Main-Class: org.jf.smali.Main
diff --git a/smali/src/main/antlr/smaliParser.g b/smali/src/main/antlr/smaliParser.g
index 29cd141..2d5ecca 100644
--- a/smali/src/main/antlr/smaliParser.g
+++ b/smali/src/main/antlr/smaliParser.g
@@ -263,8 +263,8 @@
       this.allowOdex = allowOdex;
   }
 
-  public void setApiLevel(int apiLevel, boolean experimental) {
-      this.opcodes = new Opcodes(apiLevel, experimental);
+  public void setApiLevel(int apiLevel) {
+      this.opcodes = Opcodes.forApi(apiLevel);
       this.apiLevel = apiLevel;
   }
 
diff --git a/smali/src/main/antlr/smaliTreeWalker.g b/smali/src/main/antlr/smaliTreeWalker.g
index d074579..171756e 100644
--- a/smali/src/main/antlr/smaliTreeWalker.g
+++ b/smali/src/main/antlr/smaliTreeWalker.g
@@ -85,8 +85,8 @@
       this.dexBuilder = dexBuilder;
   }
 
-  public void setApiLevel(int apiLevel, boolean experimental) {
-      this.opcodes = new Opcodes(apiLevel, experimental);
+  public void setApiLevel(int apiLevel) {
+      this.opcodes = Opcodes.forApi(apiLevel);
       this.apiLevel = apiLevel;
   }
 
diff --git a/smali/src/main/java/org/jf/smali/AssembleCommand.java b/smali/src/main/java/org/jf/smali/AssembleCommand.java
new file mode 100644
index 0000000..efde182
--- /dev/null
+++ b/smali/src/main/java/org/jf/smali/AssembleCommand.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import com.beust.jcommander.validators.PositiveInteger;
+import org.jf.util.jcommander.Command;
+import org.jf.util.jcommander.ExtendedParameter;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.util.List;
+
+@Parameters(commandDescription = "Assembles smali files into a dex file.")
+@ExtendedParameters(
+        commandName = "assemble",
+        commandAliases = { "ass", "as", "a" })
+public class AssembleCommand extends Command {
+
+    @Parameter(names = {"-h", "-?", "--help"}, help = true,
+            description = "Show usage information for this command.")
+    private boolean help;
+
+    @Parameter(names = {"-j", "--jobs"},
+            description = "The number of threads to use. Defaults to the number of cores available.",
+            validateWith = PositiveInteger.class)
+    @ExtendedParameter(argumentNames = "n")
+    private int jobs = Runtime.getRuntime().availableProcessors();
+
+    @Parameter(names = {"-a", "--api"},
+            description = "The numeric api level to use while assembling.")
+    @ExtendedParameter(argumentNames = "api")
+    private int apiLevel = 15;
+
+    @Parameter(names = {"-o", "--output"},
+            description = "The name/path of the dex file to write.")
+    @ExtendedParameter(argumentNames = "file")
+    private String output = "out.dex";
+
+    @Parameter(names = "--verbose",
+            description = "Generate verbose error messages.")
+    private boolean verbose = false;
+
+    @Parameter(names = {"--allow-odex-opcodes", "--allow-odex", "--ao"},
+            description = "Allows the odex opcodes that dalvik doesn't reject to be assembled.")
+    private boolean allowOdexOpcodes;
+
+    @Parameter(description = "Assembles the given files. If a directory is specified, it will be " +
+            "recursively searched for any files with a .smali prefix")
+    @ExtendedParameter(argumentNames = "[<file>|<dir>]+")
+    private List<String> input;
+
+    public AssembleCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    @Override public void run() {
+        if (help || input == null || input.isEmpty()) {
+            usage();
+            return;
+        }
+
+        try {
+            Smali.assemble(getOptions(), input);
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+
+    protected SmaliOptions getOptions() {
+        SmaliOptions options = new SmaliOptions();
+
+        options.jobs = jobs;
+        options.apiLevel = apiLevel;
+        options.outputDexFile = output;
+        options.allowOdexOpcodes = allowOdexOpcodes;
+        options.verboseErrors = verbose;
+
+        return options;
+    }
+}
diff --git a/smali/src/main/java/org/jf/smali/HelpCommand.java b/smali/src/main/java/org/jf/smali/HelpCommand.java
new file mode 100644
index 0000000..429a7df
--- /dev/null
+++ b/smali/src/main/java/org/jf/smali/HelpCommand.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.beust.jcommander.Parameters;
+import org.jf.util.ConsoleUtil;
+import org.jf.util.jcommander.*;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+@Parameters(commandDescription = "Shows usage information")
+@ExtendedParameters(
+        commandName = "help",
+        commandAliases = "h")
+public class HelpCommand extends Command {
+
+    @Parameter(description = "If specified, show the detailed usage information for the given commands")
+    @ExtendedParameter(argumentNames = "commands")
+    private List<String> commands;
+
+    public HelpCommand(@Nonnull List<JCommander> commandAncestors) {
+        super(commandAncestors);
+    }
+
+    public void run() {
+        JCommander parentJc = commandAncestors.get(commandAncestors.size() - 1);
+
+        if (commands == null || commands.isEmpty()) {
+            System.out.println(new HelpFormatter()
+                    .width(ConsoleUtil.getConsoleWidth())
+                    .format(commandAncestors));
+        } else {
+            boolean printedHelp = false;
+            for (String cmd : commands) {
+                JCommander command = ExtendedCommands.getSubcommand(parentJc, cmd);
+                if (command == null) {
+                    System.err.println("No such command: " + cmd);
+                } else {
+                    printedHelp = true;
+                    System.out.println(new HelpFormatter()
+                            .width(ConsoleUtil.getConsoleWidth())
+                            .format(((Command)command.getObjects().get(0)).getCommandHierarchy()));
+                }
+            }
+            if (!printedHelp) {
+                System.out.println(new HelpFormatter()
+                        .width(ConsoleUtil.getConsoleWidth())
+                        .format(commandAncestors));
+            }
+        }
+    }
+
+    @Parameters(hidden =  true)
+    @ExtendedParameters(commandName = "hlep")
+    public static class HlepCommand extends HelpCommand {
+        public HlepCommand(@Nonnull List<JCommander> commandAncestors) {
+            super(commandAncestors);
+        }
+    }
+}
diff --git a/smali/src/main/java/org/jf/smali/Main.java b/smali/src/main/java/org/jf/smali/Main.java
new file mode 100644
index 0000000..6b56fdd
--- /dev/null
+++ b/smali/src/main/java/org/jf/smali/Main.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.Parameter;
+import com.google.common.collect.Lists;
+import org.jf.smali.HelpCommand.HlepCommand;
+import org.jf.util.jcommander.Command;
+import org.jf.util.jcommander.ExtendedCommands;
+import org.jf.util.jcommander.ExtendedParameters;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.Properties;
+
+@ExtendedParameters(
+        includeParametersInUsage = true,
+        commandName = "smali",
+        postfixDescription = "See smali help <command> for more information about a specific command")
+public class Main extends Command {
+    public static final String VERSION = loadVersion();
+
+    @Parameter(names = {"-h", "-?", "--help"}, help = true,
+            description = "Show usage information")
+    private boolean help;
+
+    @Parameter(names = {"-v", "--version"}, help = true,
+            description = "Print the version of baksmali and then exit")
+    public boolean version;
+
+    private JCommander jc;
+
+    @Override public void run() {
+    }
+
+    @Override protected JCommander getJCommander() {
+        return jc;
+    }
+
+    public Main() {
+        super(Lists.<JCommander>newArrayList());
+    }
+
+    public static void main(String[] args) {
+        Main main = new Main();
+
+        JCommander jc = new JCommander(main);
+        main.jc = jc;
+        jc.setProgramName("smali");
+        List<JCommander> commandHierarchy = main.getCommandHierarchy();
+
+        ExtendedCommands.addExtendedCommand(jc, new AssembleCommand(commandHierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new HelpCommand(commandHierarchy));
+        ExtendedCommands.addExtendedCommand(jc, new HlepCommand(commandHierarchy));
+
+        jc.parse(args);
+
+        if (main.version) {
+            version();
+        }
+
+        if (jc.getParsedCommand() == null || main.help) {
+            main.usage();
+            return;
+        }
+
+        Command command = (Command)jc.getCommands().get(jc.getParsedCommand()).getObjects().get(0);
+        command.run();
+    }
+
+    protected static void version() {
+        System.out.println("smali " + VERSION + " (http://smali.org)");
+        System.out.println("Copyright (C) 2010 Ben Gruver (JesusFreke@JesusFreke.com)");
+        System.out.println("BSD license (http://www.opensource.org/licenses/bsd-license.php)");
+        System.exit(0);
+    }
+
+    private static String loadVersion() {
+        InputStream propertiesStream = Main.class.getClassLoader().getResourceAsStream("smali.properties");
+        String version = "[unknown version]";
+        if (propertiesStream != null) {
+            Properties properties = new Properties();
+            try {
+                properties.load(propertiesStream);
+                version = properties.getProperty("application.version");
+            } catch (IOException ex) {
+                // ignore
+            }
+        }
+        return version;
+    }
+}
diff --git a/smali/src/main/java/org/jf/smali/Smali.java b/smali/src/main/java/org/jf/smali/Smali.java
new file mode 100644
index 0000000..7f3762a
--- /dev/null
+++ b/smali/src/main/java/org/jf/smali/Smali.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.smali;
+
+import com.google.common.collect.Lists;
+import org.antlr.runtime.CommonTokenStream;
+import org.antlr.runtime.Token;
+import org.antlr.runtime.TokenSource;
+import org.antlr.runtime.tree.CommonTree;
+import org.antlr.runtime.tree.CommonTreeNodeStream;
+import org.jf.dexlib2.Opcodes;
+import org.jf.dexlib2.writer.builder.DexBuilder;
+import org.jf.dexlib2.writer.io.FileDataStore;
+
+import javax.annotation.Nonnull;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Arrays;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.*;
+
+public class Smali {
+
+    /**
+     * Assemble the specified files, using the given options
+     *
+     * @param options a SmaliOptions object with the options to run smali with
+     * @param input The files/directories to process
+     * @return true if assembly completed with no errors, or false if errors were encountered
+     */
+    public static boolean assemble(final SmaliOptions options, String... input) throws IOException {
+        return assemble(options, Arrays.asList(input));
+    }
+
+    /**
+     * Assemble the specified files, using the given options
+     *
+     * @param options a SmaliOptions object with the options to run smali with
+     * @param input The files/directories to process
+     * @return true if assembly completed with no errors, or false if errors were encountered
+     */
+    public static boolean assemble(final SmaliOptions options, List<String> input) throws IOException {
+        LinkedHashSet<File> filesToProcessSet = new LinkedHashSet<File>();
+
+        for (String fileToProcess: input) {
+            File argFile = new File(fileToProcess);
+
+            if (!argFile.exists()) {
+                throw new IllegalArgumentException("Cannot find file or directory \"" + fileToProcess + "\"");
+            }
+
+            if (argFile.isDirectory()) {
+                getSmaliFilesInDir(argFile, filesToProcessSet);
+            } else if (argFile.isFile()) {
+                filesToProcessSet.add(argFile);
+            }
+        }
+
+        boolean errors = false;
+
+        final DexBuilder dexBuilder = new DexBuilder(Opcodes.forApi(options.apiLevel));
+
+        ExecutorService executor = Executors.newFixedThreadPool(options.jobs);
+        List<Future<Boolean>> tasks = Lists.newArrayList();
+
+        for (final File file: filesToProcessSet) {
+            tasks.add(executor.submit(new Callable<Boolean>() {
+                @Override public Boolean call() throws Exception {
+                    return assembleSmaliFile(file, dexBuilder, options);
+                }
+            }));
+        }
+
+        for (Future<Boolean> task: tasks) {
+            while(true) {
+                try {
+                    try {
+                        if (!task.get()) {
+                            errors = true;
+                        }
+                    } catch (ExecutionException ex) {
+                        throw new RuntimeException(ex);
+                    }
+                } catch (InterruptedException ex) {
+                    continue;
+                }
+                break;
+            }
+        }
+
+        executor.shutdown();
+
+        if (errors) {
+            return false;
+        }
+
+        dexBuilder.writeTo(new FileDataStore(new File(options.outputDexFile)));
+
+        return true;
+    }
+
+    private static void getSmaliFilesInDir(@Nonnull File dir, @Nonnull Set<File> smaliFiles) {
+        File[] files = dir.listFiles();
+        if (files != null) {
+            for(File file: files) {
+                if (file.isDirectory()) {
+                    getSmaliFilesInDir(file, smaliFiles);
+                } else if (file.getName().endsWith(".smali")) {
+                    smaliFiles.add(file);
+                }
+            }
+        }
+    }
+
+    private static boolean assembleSmaliFile(File smaliFile, DexBuilder dexBuilder, SmaliOptions options)
+            throws Exception {
+        FileInputStream fis = null;
+        try {
+            fis = new FileInputStream(smaliFile);
+            InputStreamReader reader = new InputStreamReader(fis, "UTF-8");
+
+            LexerErrorInterface lexer = new smaliFlexLexer(reader);
+            ((smaliFlexLexer)lexer).setSourceFile(smaliFile);
+            CommonTokenStream tokens = new CommonTokenStream((TokenSource)lexer);
+
+            if (options.printTokens) {
+                tokens.getTokens();
+
+                for (int i=0; i<tokens.size(); i++) {
+                    Token token = tokens.get(i);
+                    if (token.getChannel() == smaliParser.HIDDEN) {
+                        continue;
+                    }
+
+                    System.out.println(smaliParser.tokenNames[token.getType()] + ": " + token.getText());
+                }
+
+                System.out.flush();
+            }
+
+            smaliParser parser = new smaliParser(tokens);
+            parser.setVerboseErrors(options.verboseErrors);
+            parser.setAllowOdex(options.allowOdexOpcodes);
+            parser.setApiLevel(options.apiLevel);
+
+            smaliParser.smali_file_return result = parser.smali_file();
+
+            if (parser.getNumberOfSyntaxErrors() > 0 || lexer.getNumberOfSyntaxErrors() > 0) {
+                return false;
+            }
+
+            CommonTree t = result.getTree();
+
+            CommonTreeNodeStream treeStream = new CommonTreeNodeStream(t);
+            treeStream.setTokenStream(tokens);
+
+            if (options.printTokens) {
+                System.out.println(t.toStringTree());
+            }
+
+            smaliTreeWalker dexGen = new smaliTreeWalker(treeStream);
+            dexGen.setApiLevel(options.apiLevel);
+
+            dexGen.setVerboseErrors(options.verboseErrors);
+            dexGen.setDexBuilder(dexBuilder);
+            dexGen.smali_file();
+
+            return dexGen.getNumberOfSyntaxErrors() == 0;
+        } finally {
+            if (fis != null) {
+                fis.close();
+            }
+        }
+    }
+}
diff --git a/smali/src/main/java/org/jf/smali/SmaliOptions.java b/smali/src/main/java/org/jf/smali/SmaliOptions.java
index 165c3a8..ac385fe 100644
--- a/smali/src/main/java/org/jf/smali/SmaliOptions.java
+++ b/smali/src/main/java/org/jf/smali/SmaliOptions.java
@@ -36,17 +36,7 @@
     public String outputDexFile = "out.dex";
 
     public int jobs = Runtime.getRuntime().availableProcessors();
-    public boolean allowOdex = false;
+    public boolean allowOdexOpcodes = false;
     public boolean verboseErrors = false;
     public boolean printTokens = false;
-    public boolean experimental = false;
-
-    public boolean listMethods = false;
-    public String methodListFilename = null;
-
-    public boolean listFields = false;
-    public String fieldListFilename = null;
-
-    public boolean listTypes = false;
-    public String typeListFilename = null;
 }
diff --git a/smali/src/main/java/org/jf/smali/SmaliTestUtils.java b/smali/src/main/java/org/jf/smali/SmaliTestUtils.java
index bef0741..a0fe55c 100644
--- a/smali/src/main/java/org/jf/smali/SmaliTestUtils.java
+++ b/smali/src/main/java/org/jf/smali/SmaliTestUtils.java
@@ -50,14 +50,14 @@
 public class SmaliTestUtils {
 
     public static ClassDef compileSmali(String smaliText) throws RecognitionException, IOException {
-        return compileSmali(smaliText, 15, false);
+        return compileSmali(smaliText, 15);
     }
 
-    public static ClassDef compileSmali(String smaliText, int apiLevel, boolean experimental)
+    public static ClassDef compileSmali(String smaliText, int apiLevel)
             throws RecognitionException, IOException {
         CommonTokenStream tokens;
         LexerErrorInterface lexer;
-        DexBuilder dexBuilder = DexBuilder.makeDexBuilder(Opcodes.forApi(apiLevel, experimental));
+        DexBuilder dexBuilder = new DexBuilder(Opcodes.forApi(apiLevel));
 
         Reader reader = new StringReader(smaliText);
 
@@ -67,7 +67,7 @@
         smaliParser parser = new smaliParser(tokens);
         parser.setVerboseErrors(true);
         parser.setAllowOdex(false);
-        parser.setApiLevel(apiLevel, experimental);
+        parser.setApiLevel(apiLevel);
 
         smaliParser.smali_file_return result = parser.smali_file();
 
@@ -81,7 +81,7 @@
         treeStream.setTokenStream(tokens);
 
         smaliTreeWalker dexGen = new smaliTreeWalker(treeStream);
-        dexGen.setApiLevel(apiLevel, experimental);
+        dexGen.setApiLevel(apiLevel);
         dexGen.setVerboseErrors(true);
         dexGen.setDexBuilder(dexBuilder);
         dexGen.smali_file();
@@ -94,7 +94,7 @@
 
         dexBuilder.writeTo(dataStore);
 
-        DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.forApi(apiLevel, experimental), dataStore.getData());
+        DexBackedDexFile dexFile = new DexBackedDexFile(Opcodes.forApi(apiLevel), dataStore.getData());
 
         return Iterables.getFirst(dexFile.getClasses(), null);
     }
diff --git a/smali/src/main/java/org/jf/smali/main.java b/smali/src/main/java/org/jf/smali/main.java
deleted file mode 100644
index e556280..0000000
--- a/smali/src/main/java/org/jf/smali/main.java
+++ /dev/null
@@ -1,491 +0,0 @@
-/*
- * [The "BSD licence"]
- * Copyright (c) 2010 Ben Gruver (JesusFreke)
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package org.jf.smali;
-
-import com.google.common.base.Strings;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Ordering;
-import org.antlr.runtime.CommonTokenStream;
-import org.antlr.runtime.Token;
-import org.antlr.runtime.TokenSource;
-import org.antlr.runtime.tree.CommonTree;
-import org.antlr.runtime.tree.CommonTreeNodeStream;
-import org.apache.commons.cli.*;
-import org.jf.dexlib2.Opcodes;
-import org.jf.dexlib2.writer.builder.DexBuilder;
-import org.jf.dexlib2.writer.io.FileDataStore;
-import org.jf.util.ConsoleUtil;
-import org.jf.util.SmaliHelpFormatter;
-
-import javax.annotation.Nonnull;
-import java.io.*;
-import java.util.*;
-import java.util.concurrent.*;
-
-/**
- * Main class for smali. It recognizes enough options to be able to dispatch
- * to the right "actual" main.
- */
-public class main {
-
-    public static final String VERSION;
-
-    private final static Options basicOptions;
-    private final static Options debugOptions;
-    private final static Options options;
-
-    static {
-        basicOptions = new Options();
-        debugOptions = new Options();
-        options = new Options();
-        buildOptions();
-
-        InputStream templateStream = main.class.getClassLoader().getResourceAsStream("smali.properties");
-        if (templateStream != null) {
-            Properties properties = new Properties();
-            String version = "(unknown)";
-            try {
-                properties.load(templateStream);
-                version = properties.getProperty("application.version");
-            } catch (IOException ex) {
-                // just eat it
-            }
-            VERSION = version;
-        } else {
-            VERSION = "[unknown version]";
-        }
-    }
-
-
-    /**
-     * This class is uninstantiable.
-     */
-    private main() {
-    }
-
-    /**
-     * A more programmatic-friendly entry point for smali
-     *
-     * @param options a SmaliOptions object with the options to run smali with
-     * @param input The files/directories to process
-     * @return true if assembly completed with no errors, or false if errors were encountered
-     */
-    public static boolean run(final SmaliOptions options, String... input) throws IOException {
-        LinkedHashSet<File> filesToProcessSet = new LinkedHashSet<File>();
-
-        for (String fileToProcess: input) {
-            File argFile = new File(fileToProcess);
-
-            if (!argFile.exists()) {
-                throw new IllegalArgumentException("Cannot find file or directory \"" + fileToProcess + "\"");
-            }
-
-            if (argFile.isDirectory()) {
-                getSmaliFilesInDir(argFile, filesToProcessSet);
-            } else if (argFile.isFile()) {
-                filesToProcessSet.add(argFile);
-            }
-        }
-
-        boolean errors = false;
-
-        final DexBuilder dexBuilder = DexBuilder.makeDexBuilder(
-                Opcodes.forApi(options.apiLevel, options.experimental));
-
-        ExecutorService executor = Executors.newFixedThreadPool(options.jobs);
-        List<Future<Boolean>> tasks = Lists.newArrayList();
-
-        for (final File file: filesToProcessSet) {
-            tasks.add(executor.submit(new Callable<Boolean>() {
-                @Override public Boolean call() throws Exception {
-                    return assembleSmaliFile(file, dexBuilder, options);
-                }
-            }));
-        }
-
-        for (Future<Boolean> task: tasks) {
-            while(true) {
-                try {
-                    try {
-                        if (!task.get()) {
-                            errors = true;
-                        }
-                    } catch (ExecutionException ex) {
-                        throw new RuntimeException(ex);
-                    }
-                } catch (InterruptedException ex) {
-                    continue;
-                }
-                break;
-            }
-        }
-
-        executor.shutdown();
-
-        if (errors) {
-            return false;
-        }
-
-        if (options.listMethods) {
-            if (Strings.isNullOrEmpty(options.methodListFilename)) {
-                options.methodListFilename = options.outputDexFile + ".methods";
-            }
-            writeReferences(dexBuilder.getMethodReferences(), options.methodListFilename);
-        }
-
-        if (options.listFields) {
-            if (Strings.isNullOrEmpty(options.fieldListFilename)) {
-                options.fieldListFilename = options.outputDexFile + ".fields";
-            }
-            writeReferences(dexBuilder.getFieldReferences(), options.fieldListFilename);
-        }
-
-        if (options.listTypes) {
-            if (Strings.isNullOrEmpty(options.typeListFilename)) {
-                options.typeListFilename = options.outputDexFile + ".types";
-            }
-            writeReferences(dexBuilder.getTypeReferences(), options.typeListFilename);
-        }
-
-        dexBuilder.writeTo(new FileDataStore(new File(options.outputDexFile)));
-
-        return true;
-    }
-
-    /**
-     * Run!
-     */
-    public static void main(String[] args) {
-        Locale locale = new Locale("en", "US");
-        Locale.setDefault(locale);
-
-        CommandLineParser parser = new PosixParser();
-        CommandLine commandLine;
-
-        try {
-            commandLine = parser.parse(options, args);
-        } catch (ParseException ex) {
-            usage();
-            return;
-        }
-
-        SmaliOptions smaliOptions = new SmaliOptions();
-
-        String[] remainingArgs = commandLine.getArgs();
-
-        Option[] options = commandLine.getOptions();
-
-        for (int i=0; i<options.length; i++) {
-            Option option = options[i];
-            String opt = option.getOpt();
-
-            switch (opt.charAt(0)) {
-                case 'v':
-                    version();
-                    return;
-                case '?':
-                    while (++i < options.length) {
-                        if (options[i].getOpt().charAt(0) == '?') {
-                            usage(true);
-                            return;
-                        }
-                    }
-                    usage(false);
-                    return;
-                case 'o':
-                    smaliOptions.outputDexFile = commandLine.getOptionValue("o");
-                    break;
-                case 'x':
-                    smaliOptions.allowOdex = true;
-                    break;
-                case 'X':
-                    smaliOptions.experimental = true;
-                    break;
-                case 'a':
-                    smaliOptions.apiLevel = Integer.parseInt(commandLine.getOptionValue("a"));
-                    break;
-                case 'j':
-                    smaliOptions.jobs = Integer.parseInt(commandLine.getOptionValue("j"));
-                    break;
-                case 'm':
-                    smaliOptions.listMethods = true;
-                    smaliOptions.methodListFilename = commandLine.getOptionValue("m");
-                    break;
-                case 'f':
-                    smaliOptions.listFields = true;
-                    smaliOptions.fieldListFilename = commandLine.getOptionValue("f");
-                    break;
-                case 't':
-                    smaliOptions.listTypes = true;
-                    smaliOptions.typeListFilename = commandLine.getOptionValue("t");
-                    break;
-                case 'V':
-                    smaliOptions.verboseErrors = true;
-                    break;
-                case 'T':
-                    smaliOptions.printTokens = true;
-                    break;
-                default:
-                    assert false;
-            }
-        }
-
-        if (remainingArgs.length == 0) {
-            usage();
-            return;
-        }
-
-        try {
-            if (!run(smaliOptions, remainingArgs)) {
-                System.exit(1);
-            }
-        } catch (RuntimeException ex) {
-            System.err.println("\nUNEXPECTED TOP-LEVEL EXCEPTION:");
-            ex.printStackTrace();
-            System.exit(2);
-        } catch (Throwable ex) {
-            System.err.println("\nUNEXPECTED TOP-LEVEL ERROR:");
-            ex.printStackTrace();
-            System.exit(3);
-        }
-    }
-
-    private static void writeReferences(List<String> references, String filename) {
-        PrintWriter writer = null;
-        try {
-            writer = new PrintWriter(new BufferedWriter(new FileWriter(filename)));
-
-            for (String reference: Ordering.natural().sortedCopy(references)) {
-                writer.println(reference);
-            }
-        } catch (IOException ex) {
-            throw new RuntimeException(ex);
-        } finally {
-            if (writer != null) {
-                writer.close();
-            }
-        }
-    }
-
-    private static void getSmaliFilesInDir(@Nonnull File dir, @Nonnull Set<File> smaliFiles) {
-        File[] files = dir.listFiles();
-        if (files != null) {
-            for(File file: files) {
-                if (file.isDirectory()) {
-                    getSmaliFilesInDir(file, smaliFiles);
-                } else if (file.getName().endsWith(".smali")) {
-                    smaliFiles.add(file);
-                }
-            }
-        }
-    }
-
-    private static boolean assembleSmaliFile(File smaliFile, DexBuilder dexBuilder, SmaliOptions options)
-            throws Exception {
-        CommonTokenStream tokens;
-
-        LexerErrorInterface lexer;
-
-        FileInputStream fis = new FileInputStream(smaliFile);
-        InputStreamReader reader = new InputStreamReader(fis, "UTF-8");
-
-        lexer = new smaliFlexLexer(reader);
-        ((smaliFlexLexer)lexer).setSourceFile(smaliFile);
-        tokens = new CommonTokenStream((TokenSource)lexer);
-
-        if (options.printTokens) {
-            tokens.getTokens();
-
-            for (int i=0; i<tokens.size(); i++) {
-                Token token = tokens.get(i);
-                if (token.getChannel() == smaliParser.HIDDEN) {
-                    continue;
-                }
-
-                System.out.println(smaliParser.tokenNames[token.getType()] + ": " + token.getText());
-            }
-
-            System.out.flush();
-        }
-
-        smaliParser parser = new smaliParser(tokens);
-        parser.setVerboseErrors(options.verboseErrors);
-        parser.setAllowOdex(options.allowOdex);
-        parser.setApiLevel(options.apiLevel, options.experimental);
-
-        smaliParser.smali_file_return result = parser.smali_file();
-
-        if (parser.getNumberOfSyntaxErrors() > 0 || lexer.getNumberOfSyntaxErrors() > 0) {
-            return false;
-        }
-
-        CommonTree t = result.getTree();
-
-        CommonTreeNodeStream treeStream = new CommonTreeNodeStream(t);
-        treeStream.setTokenStream(tokens);
-
-        if (options.printTokens) {
-            System.out.println(t.toStringTree());
-        }
-
-        smaliTreeWalker dexGen = new smaliTreeWalker(treeStream);
-        dexGen.setApiLevel(options.apiLevel, options.experimental);
-
-        dexGen.setVerboseErrors(options.verboseErrors);
-        dexGen.setDexBuilder(dexBuilder);
-        dexGen.smali_file();
-
-        return dexGen.getNumberOfSyntaxErrors() == 0;
-    }
-
-
-    /**
-     * Prints the usage message.
-     */
-    private static void usage(boolean printDebugOptions) {
-        SmaliHelpFormatter formatter = new SmaliHelpFormatter();
-
-        int consoleWidth = ConsoleUtil.getConsoleWidth();
-        if (consoleWidth <= 0) {
-            consoleWidth = 80;
-        }
-
-        formatter.setWidth(consoleWidth);
-
-        formatter.printHelp("java -jar smali.jar [options] [--] [<smali-file>|folder]*",
-                "assembles a set of smali files into a dex file", basicOptions, printDebugOptions?debugOptions:null);
-    }
-
-    private static void usage() {
-        usage(false);
-    }
-
-    /**
-     * Prints the version message.
-     */
-    private static void version() {
-        System.out.println("smali " + VERSION + " (http://smali.googlecode.com)");
-        System.out.println("Copyright (C) 2010 Ben Gruver (JesusFreke@JesusFreke.com)");
-        System.out.println("BSD license (http://www.opensource.org/licenses/bsd-license.php)");
-        System.exit(0);
-    }
-
-    @SuppressWarnings("AccessStaticViaInstance")
-    private static void buildOptions() {
-        Option versionOption = OptionBuilder.withLongOpt("version")
-                .withDescription("prints the version then exits")
-                .create("v");
-
-        Option helpOption = OptionBuilder.withLongOpt("help")
-                .withDescription("prints the help message then exits. Specify twice for debug options")
-                .create("?");
-
-        Option outputOption = OptionBuilder.withLongOpt("output")
-                .withDescription("the name of the dex file that will be written. The default is out.dex")
-                .hasArg()
-                .withArgName("FILE")
-                .create("o");
-
-        Option allowOdexOption = OptionBuilder.withLongOpt("allow-odex-instructions")
-                .withDescription("allow odex instructions to be compiled into the dex file. Only a few" +
-                        " instructions are supported - the ones that can exist in a dead code path and not" +
-                        " cause dalvik to reject the class")
-                .create("x");
-
-        Option apiLevelOption = OptionBuilder.withLongOpt("api-level")
-                .withDescription("The numeric api-level of the file to generate, e.g. 14 for ICS. If not " +
-                        "specified, it defaults to 15 (ICS).")
-                .hasArg()
-                .withArgName("API_LEVEL")
-                .create("a");
-
-        Option listMethodsOption = OptionBuilder.withLongOpt("list-methods")
-                .withDescription("Lists all the method references to FILE" +
-                        " (<output_dex_filename>.methods by default)")
-                .hasOptionalArg()
-                .withArgName("FILE")
-                .create("m");
-
-        Option listFieldsOption = OptionBuilder.withLongOpt("list-fields")
-                .withDescription("Lists all the field references to FILE" +
-                        " (<output_dex_filename>.fields by default)")
-                .hasOptionalArg()
-                .withArgName("FILE")
-                .create("f");
-
-        Option listClassesOption = OptionBuilder.withLongOpt("list-types")
-                .withDescription("Lists all the type references to FILE" +
-                        " (<output_dex_filename>.types by default)")
-                .hasOptionalArg()
-                .withArgName("FILE")
-                .create("t");
-
-        Option experimentalOption = OptionBuilder.withLongOpt("experimental")
-                .withDescription("enable experimental opcodes to be assembled, even if they " +
-                        " aren't necessarily supported by the Android runtime yet")
-                .create("X");
-
-        Option jobsOption = OptionBuilder.withLongOpt("jobs")
-                .withDescription("The number of threads to use. Defaults to the number of cores available, up to a " +
-                        "maximum of 6")
-                .hasArg()
-                .withArgName("NUM_THREADS")
-                .create("j");
-
-        Option verboseErrorsOption = OptionBuilder.withLongOpt("verbose-errors")
-                .withDescription("Generate verbose error messages")
-                .create("V");
-
-        Option printTokensOption = OptionBuilder.withLongOpt("print-tokens")
-                .withDescription("Print the name and text of each token")
-                .create("T");
-
-        basicOptions.addOption(versionOption);
-        basicOptions.addOption(helpOption);
-        basicOptions.addOption(outputOption);
-        basicOptions.addOption(allowOdexOption);
-        basicOptions.addOption(apiLevelOption);
-        basicOptions.addOption(experimentalOption);
-        basicOptions.addOption(jobsOption);
-        basicOptions.addOption(listMethodsOption);
-        basicOptions.addOption(listFieldsOption);
-        basicOptions.addOption(listClassesOption);
-
-        debugOptions.addOption(verboseErrorsOption);
-        debugOptions.addOption(printTokensOption);
-
-        for (Object option: basicOptions.getOptions()) {
-            options.addOption((Option)option);
-        }
-
-        for (Object option: debugOptions.getOptions()) {
-            options.addOption((Option)option);
-        }
-    }
-}
\ No newline at end of file
diff --git a/smali/src/main/java/org/jf/smali/smaliParser.java b/smali/src/main/java/org/jf/smali/smaliParser.java
index de21548..72ef034 100644
--- a/smali/src/main/java/org/jf/smali/smaliParser.java
+++ b/smali/src/main/java/org/jf/smali/smaliParser.java
@@ -1,4 +1,4 @@
-// $ANTLR 3.5.2 /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g 2016-09-09 13:35:48
+// $ANTLR 3.5.2 smaliParser.g 2017-04-20 15:20:45
 
 package org.jf.smali;
 
@@ -18,61 +18,61 @@
 @SuppressWarnings("all")
 public class smaliParser extends Parser {
 	public static final String[] tokenNames = new String[] {
-		"<invalid>", "<EOR>", "<DOWN>", "<UP>", "ACCESS_SPEC", "ANNOTATION_DIRECTIVE",
-		"ANNOTATION_VISIBILITY", "ARRAY_DATA_DIRECTIVE", "ARRAY_TYPE_PREFIX",
-		"ARROW", "BOOL_LITERAL", "BYTE_LITERAL", "CATCHALL_DIRECTIVE", "CATCH_DIRECTIVE",
-		"CHAR_LITERAL", "CLASS_DESCRIPTOR", "CLASS_DIRECTIVE", "CLOSE_BRACE",
-		"CLOSE_PAREN", "COLON", "COMMA", "DOTDOT", "DOUBLE_LITERAL", "DOUBLE_LITERAL_OR_ID",
-		"END_ANNOTATION_DIRECTIVE", "END_ARRAY_DATA_DIRECTIVE", "END_FIELD_DIRECTIVE",
-		"END_LOCAL_DIRECTIVE", "END_METHOD_DIRECTIVE", "END_PACKED_SWITCH_DIRECTIVE",
-		"END_PARAMETER_DIRECTIVE", "END_SPARSE_SWITCH_DIRECTIVE", "END_SUBANNOTATION_DIRECTIVE",
-		"ENUM_DIRECTIVE", "EPILOGUE_DIRECTIVE", "EQUAL", "FIELD_DIRECTIVE", "FIELD_OFFSET",
-		"FLOAT_LITERAL", "FLOAT_LITERAL_OR_ID", "IMPLEMENTS_DIRECTIVE", "INLINE_INDEX",
-		"INSTRUCTION_FORMAT10t", "INSTRUCTION_FORMAT10x", "INSTRUCTION_FORMAT10x_ODEX",
-		"INSTRUCTION_FORMAT11n", "INSTRUCTION_FORMAT11x", "INSTRUCTION_FORMAT12x",
-		"INSTRUCTION_FORMAT12x_OR_ID", "INSTRUCTION_FORMAT20bc", "INSTRUCTION_FORMAT20t",
-		"INSTRUCTION_FORMAT21c_FIELD", "INSTRUCTION_FORMAT21c_FIELD_ODEX", "INSTRUCTION_FORMAT21c_STRING",
-		"INSTRUCTION_FORMAT21c_TYPE", "INSTRUCTION_FORMAT21ih", "INSTRUCTION_FORMAT21lh",
-		"INSTRUCTION_FORMAT21s", "INSTRUCTION_FORMAT21t", "INSTRUCTION_FORMAT22b",
-		"INSTRUCTION_FORMAT22c_FIELD", "INSTRUCTION_FORMAT22c_FIELD_ODEX", "INSTRUCTION_FORMAT22c_TYPE",
-		"INSTRUCTION_FORMAT22cs_FIELD", "INSTRUCTION_FORMAT22s", "INSTRUCTION_FORMAT22s_OR_ID",
-		"INSTRUCTION_FORMAT22t", "INSTRUCTION_FORMAT22x", "INSTRUCTION_FORMAT23x",
-		"INSTRUCTION_FORMAT30t", "INSTRUCTION_FORMAT31c", "INSTRUCTION_FORMAT31i",
-		"INSTRUCTION_FORMAT31i_OR_ID", "INSTRUCTION_FORMAT31t", "INSTRUCTION_FORMAT32x",
-		"INSTRUCTION_FORMAT35c_METHOD", "INSTRUCTION_FORMAT35c_METHOD_ODEX", "INSTRUCTION_FORMAT35c_TYPE",
-		"INSTRUCTION_FORMAT35mi_METHOD", "INSTRUCTION_FORMAT35ms_METHOD", "INSTRUCTION_FORMAT3rc_METHOD",
-		"INSTRUCTION_FORMAT3rc_METHOD_ODEX", "INSTRUCTION_FORMAT3rc_TYPE", "INSTRUCTION_FORMAT3rmi_METHOD",
-		"INSTRUCTION_FORMAT3rms_METHOD", "INSTRUCTION_FORMAT45cc_METHOD", "INSTRUCTION_FORMAT4rcc_METHOD",
-		"INSTRUCTION_FORMAT51l", "INTEGER_LITERAL", "INVALID_TOKEN", "I_ACCESS_LIST",
-		"I_ANNOTATION", "I_ANNOTATIONS", "I_ANNOTATION_ELEMENT", "I_ARRAY_ELEMENTS",
-		"I_ARRAY_ELEMENT_SIZE", "I_CATCH", "I_CATCHALL", "I_CATCHES", "I_CLASS_DEF",
-		"I_ENCODED_ARRAY", "I_ENCODED_ENUM", "I_ENCODED_FIELD", "I_ENCODED_METHOD",
-		"I_END_LOCAL", "I_EPILOGUE", "I_FIELD", "I_FIELDS", "I_FIELD_INITIAL_VALUE",
-		"I_FIELD_TYPE", "I_IMPLEMENTS", "I_LABEL", "I_LINE", "I_LOCAL", "I_LOCALS",
-		"I_METHOD", "I_METHODS", "I_METHOD_PROTOTYPE", "I_METHOD_RETURN_TYPE",
-		"I_ORDERED_METHOD_ITEMS", "I_PACKED_SWITCH_ELEMENTS", "I_PACKED_SWITCH_START_KEY",
-		"I_PARAMETER", "I_PARAMETERS", "I_PARAMETER_NOT_SPECIFIED", "I_PROLOGUE",
-		"I_REGISTERS", "I_REGISTER_LIST", "I_REGISTER_RANGE", "I_RESTART_LOCAL",
-		"I_SOURCE", "I_SPARSE_SWITCH_ELEMENTS", "I_STATEMENT_ARRAY_DATA", "I_STATEMENT_FORMAT10t",
-		"I_STATEMENT_FORMAT10x", "I_STATEMENT_FORMAT11n", "I_STATEMENT_FORMAT11x",
-		"I_STATEMENT_FORMAT12x", "I_STATEMENT_FORMAT20bc", "I_STATEMENT_FORMAT20t",
-		"I_STATEMENT_FORMAT21c_FIELD", "I_STATEMENT_FORMAT21c_STRING", "I_STATEMENT_FORMAT21c_TYPE",
-		"I_STATEMENT_FORMAT21ih", "I_STATEMENT_FORMAT21lh", "I_STATEMENT_FORMAT21s",
-		"I_STATEMENT_FORMAT21t", "I_STATEMENT_FORMAT22b", "I_STATEMENT_FORMAT22c_FIELD",
-		"I_STATEMENT_FORMAT22c_TYPE", "I_STATEMENT_FORMAT22s", "I_STATEMENT_FORMAT22t",
-		"I_STATEMENT_FORMAT22x", "I_STATEMENT_FORMAT23x", "I_STATEMENT_FORMAT30t",
-		"I_STATEMENT_FORMAT31c", "I_STATEMENT_FORMAT31i", "I_STATEMENT_FORMAT31t",
-		"I_STATEMENT_FORMAT32x", "I_STATEMENT_FORMAT35c_METHOD", "I_STATEMENT_FORMAT35c_TYPE",
-		"I_STATEMENT_FORMAT3rc_METHOD", "I_STATEMENT_FORMAT3rc_TYPE", "I_STATEMENT_FORMAT45cc_METHOD",
-		"I_STATEMENT_FORMAT4rcc_METHOD", "I_STATEMENT_FORMAT51l", "I_STATEMENT_PACKED_SWITCH",
-		"I_STATEMENT_SPARSE_SWITCH", "I_SUBANNOTATION", "I_SUPER", "LINE_COMMENT",
-		"LINE_DIRECTIVE", "LOCALS_DIRECTIVE", "LOCAL_DIRECTIVE", "LONG_LITERAL",
-		"MEMBER_NAME", "METHOD_DIRECTIVE", "NEGATIVE_INTEGER_LITERAL", "NULL_LITERAL",
-		"OPEN_BRACE", "OPEN_PAREN", "PACKED_SWITCH_DIRECTIVE", "PARAMETER_DIRECTIVE",
-		"PARAM_LIST_OR_ID_PRIMITIVE_TYPE", "POSITIVE_INTEGER_LITERAL", "PRIMITIVE_TYPE",
-		"PROLOGUE_DIRECTIVE", "REGISTER", "REGISTERS_DIRECTIVE", "RESTART_LOCAL_DIRECTIVE",
-		"SHORT_LITERAL", "SIMPLE_NAME", "SOURCE_DIRECTIVE", "SPARSE_SWITCH_DIRECTIVE",
-		"STRING_LITERAL", "SUBANNOTATION_DIRECTIVE", "SUPER_DIRECTIVE", "VERIFICATION_ERROR_TYPE",
+		"<invalid>", "<EOR>", "<DOWN>", "<UP>", "ACCESS_SPEC", "ANNOTATION_DIRECTIVE", 
+		"ANNOTATION_VISIBILITY", "ARRAY_DATA_DIRECTIVE", "ARRAY_TYPE_PREFIX", 
+		"ARROW", "BOOL_LITERAL", "BYTE_LITERAL", "CATCHALL_DIRECTIVE", "CATCH_DIRECTIVE", 
+		"CHAR_LITERAL", "CLASS_DESCRIPTOR", "CLASS_DIRECTIVE", "CLOSE_BRACE", 
+		"CLOSE_PAREN", "COLON", "COMMA", "DOTDOT", "DOUBLE_LITERAL", "DOUBLE_LITERAL_OR_ID", 
+		"END_ANNOTATION_DIRECTIVE", "END_ARRAY_DATA_DIRECTIVE", "END_FIELD_DIRECTIVE", 
+		"END_LOCAL_DIRECTIVE", "END_METHOD_DIRECTIVE", "END_PACKED_SWITCH_DIRECTIVE", 
+		"END_PARAMETER_DIRECTIVE", "END_SPARSE_SWITCH_DIRECTIVE", "END_SUBANNOTATION_DIRECTIVE", 
+		"ENUM_DIRECTIVE", "EPILOGUE_DIRECTIVE", "EQUAL", "FIELD_DIRECTIVE", "FIELD_OFFSET", 
+		"FLOAT_LITERAL", "FLOAT_LITERAL_OR_ID", "IMPLEMENTS_DIRECTIVE", "INLINE_INDEX", 
+		"INSTRUCTION_FORMAT10t", "INSTRUCTION_FORMAT10x", "INSTRUCTION_FORMAT10x_ODEX", 
+		"INSTRUCTION_FORMAT11n", "INSTRUCTION_FORMAT11x", "INSTRUCTION_FORMAT12x", 
+		"INSTRUCTION_FORMAT12x_OR_ID", "INSTRUCTION_FORMAT20bc", "INSTRUCTION_FORMAT20t", 
+		"INSTRUCTION_FORMAT21c_FIELD", "INSTRUCTION_FORMAT21c_FIELD_ODEX", "INSTRUCTION_FORMAT21c_STRING", 
+		"INSTRUCTION_FORMAT21c_TYPE", "INSTRUCTION_FORMAT21ih", "INSTRUCTION_FORMAT21lh", 
+		"INSTRUCTION_FORMAT21s", "INSTRUCTION_FORMAT21t", "INSTRUCTION_FORMAT22b", 
+		"INSTRUCTION_FORMAT22c_FIELD", "INSTRUCTION_FORMAT22c_FIELD_ODEX", "INSTRUCTION_FORMAT22c_TYPE", 
+		"INSTRUCTION_FORMAT22cs_FIELD", "INSTRUCTION_FORMAT22s", "INSTRUCTION_FORMAT22s_OR_ID", 
+		"INSTRUCTION_FORMAT22t", "INSTRUCTION_FORMAT22x", "INSTRUCTION_FORMAT23x", 
+		"INSTRUCTION_FORMAT30t", "INSTRUCTION_FORMAT31c", "INSTRUCTION_FORMAT31i", 
+		"INSTRUCTION_FORMAT31i_OR_ID", "INSTRUCTION_FORMAT31t", "INSTRUCTION_FORMAT32x", 
+		"INSTRUCTION_FORMAT35c_METHOD", "INSTRUCTION_FORMAT35c_METHOD_ODEX", "INSTRUCTION_FORMAT35c_TYPE", 
+		"INSTRUCTION_FORMAT35mi_METHOD", "INSTRUCTION_FORMAT35ms_METHOD", "INSTRUCTION_FORMAT3rc_METHOD", 
+		"INSTRUCTION_FORMAT3rc_METHOD_ODEX", "INSTRUCTION_FORMAT3rc_TYPE", "INSTRUCTION_FORMAT3rmi_METHOD", 
+		"INSTRUCTION_FORMAT3rms_METHOD", "INSTRUCTION_FORMAT45cc_METHOD", "INSTRUCTION_FORMAT4rcc_METHOD", 
+		"INSTRUCTION_FORMAT51l", "INTEGER_LITERAL", "INVALID_TOKEN", "I_ACCESS_LIST", 
+		"I_ANNOTATION", "I_ANNOTATIONS", "I_ANNOTATION_ELEMENT", "I_ARRAY_ELEMENTS", 
+		"I_ARRAY_ELEMENT_SIZE", "I_CATCH", "I_CATCHALL", "I_CATCHES", "I_CLASS_DEF", 
+		"I_ENCODED_ARRAY", "I_ENCODED_ENUM", "I_ENCODED_FIELD", "I_ENCODED_METHOD", 
+		"I_END_LOCAL", "I_EPILOGUE", "I_FIELD", "I_FIELDS", "I_FIELD_INITIAL_VALUE", 
+		"I_FIELD_TYPE", "I_IMPLEMENTS", "I_LABEL", "I_LINE", "I_LOCAL", "I_LOCALS", 
+		"I_METHOD", "I_METHODS", "I_METHOD_PROTOTYPE", "I_METHOD_RETURN_TYPE", 
+		"I_ORDERED_METHOD_ITEMS", "I_PACKED_SWITCH_ELEMENTS", "I_PACKED_SWITCH_START_KEY", 
+		"I_PARAMETER", "I_PARAMETERS", "I_PARAMETER_NOT_SPECIFIED", "I_PROLOGUE", 
+		"I_REGISTERS", "I_REGISTER_LIST", "I_REGISTER_RANGE", "I_RESTART_LOCAL", 
+		"I_SOURCE", "I_SPARSE_SWITCH_ELEMENTS", "I_STATEMENT_ARRAY_DATA", "I_STATEMENT_FORMAT10t", 
+		"I_STATEMENT_FORMAT10x", "I_STATEMENT_FORMAT11n", "I_STATEMENT_FORMAT11x", 
+		"I_STATEMENT_FORMAT12x", "I_STATEMENT_FORMAT20bc", "I_STATEMENT_FORMAT20t", 
+		"I_STATEMENT_FORMAT21c_FIELD", "I_STATEMENT_FORMAT21c_STRING", "I_STATEMENT_FORMAT21c_TYPE", 
+		"I_STATEMENT_FORMAT21ih", "I_STATEMENT_FORMAT21lh", "I_STATEMENT_FORMAT21s", 
+		"I_STATEMENT_FORMAT21t", "I_STATEMENT_FORMAT22b", "I_STATEMENT_FORMAT22c_FIELD", 
+		"I_STATEMENT_FORMAT22c_TYPE", "I_STATEMENT_FORMAT22s", "I_STATEMENT_FORMAT22t", 
+		"I_STATEMENT_FORMAT22x", "I_STATEMENT_FORMAT23x", "I_STATEMENT_FORMAT30t", 
+		"I_STATEMENT_FORMAT31c", "I_STATEMENT_FORMAT31i", "I_STATEMENT_FORMAT31t", 
+		"I_STATEMENT_FORMAT32x", "I_STATEMENT_FORMAT35c_METHOD", "I_STATEMENT_FORMAT35c_TYPE", 
+		"I_STATEMENT_FORMAT3rc_METHOD", "I_STATEMENT_FORMAT3rc_TYPE", "I_STATEMENT_FORMAT45cc_METHOD", 
+		"I_STATEMENT_FORMAT4rcc_METHOD", "I_STATEMENT_FORMAT51l", "I_STATEMENT_PACKED_SWITCH", 
+		"I_STATEMENT_SPARSE_SWITCH", "I_SUBANNOTATION", "I_SUPER", "LINE_COMMENT", 
+		"LINE_DIRECTIVE", "LOCALS_DIRECTIVE", "LOCAL_DIRECTIVE", "LONG_LITERAL", 
+		"MEMBER_NAME", "METHOD_DIRECTIVE", "NEGATIVE_INTEGER_LITERAL", "NULL_LITERAL", 
+		"OPEN_BRACE", "OPEN_PAREN", "PACKED_SWITCH_DIRECTIVE", "PARAMETER_DIRECTIVE", 
+		"PARAM_LIST_OR_ID_PRIMITIVE_TYPE", "POSITIVE_INTEGER_LITERAL", "PRIMITIVE_TYPE", 
+		"PROLOGUE_DIRECTIVE", "REGISTER", "REGISTERS_DIRECTIVE", "RESTART_LOCAL_DIRECTIVE", 
+		"SHORT_LITERAL", "SIMPLE_NAME", "SOURCE_DIRECTIVE", "SPARSE_SWITCH_DIRECTIVE", 
+		"STRING_LITERAL", "SUBANNOTATION_DIRECTIVE", "SUPER_DIRECTIVE", "VERIFICATION_ERROR_TYPE", 
 		"VOID_TYPE", "VTABLE_INDEX", "WHITE_SPACE"
 	};
 	public static final int EOF=-1;
@@ -298,7 +298,7 @@
 		return adaptor;
 	}
 	@Override public String[] getTokenNames() { return smaliParser.tokenNames; }
-	@Override public String getGrammarFileName() { return "/ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g"; }
+	@Override public String getGrammarFileName() { return "smaliParser.g"; }
 
 
 	  public static final int ERROR_CHANNEL = 100;
@@ -316,8 +316,8 @@
 	      this.allowOdex = allowOdex;
 	  }
 
-	  public void setApiLevel(int apiLevel, boolean experimental) {
-	      this.opcodes = new Opcodes(apiLevel, experimental);
+	  public void setApiLevel(int apiLevel) {
+	      this.opcodes = Opcodes.forApi(apiLevel);
 	      this.apiLevel = apiLevel;
 	  }
 
@@ -480,7 +480,7 @@
 
 
 	// $ANTLR start "smali_file"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:415:1: smali_file : ({...}? => class_spec |{...}? => super_spec | implements_spec |{...}? => source_spec | method | field | annotation )+ EOF -> ^( I_CLASS_DEF class_spec ( super_spec )? ( implements_spec )* ( source_spec )? ^( I_METHODS ( method )* ) ^( I_FIELDS ( field )* ) ) ;
+	// smaliParser.g:415:1: smali_file : ({...}? => class_spec |{...}? => super_spec | implements_spec |{...}? => source_spec | method | field | annotation )+ EOF -> ^( I_CLASS_DEF class_spec ( super_spec )? ( implements_spec )* ( source_spec )? ^( I_METHODS ( method )* ) ^( I_FIELDS ( field )* ) ) ;
 	public final smaliParser.smali_file_return smali_file() throws RecognitionException {
 		smali_file_stack.push(new smali_file_scope());
 		smaliParser.smali_file_return retval = new smaliParser.smali_file_return();
@@ -509,12 +509,12 @@
 
 		 smali_file_stack.peek().hasClassSpec = smali_file_stack.peek().hasSuperSpec = smali_file_stack.peek().hasSourceSpec = false;
 		    smali_file_stack.peek().classAnnotations = new ArrayList<CommonTree>();
-		
+		  
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:427:3: ( ({...}? => class_spec |{...}? => super_spec | implements_spec |{...}? => source_spec | method | field | annotation )+ EOF -> ^( I_CLASS_DEF class_spec ( super_spec )? ( implements_spec )* ( source_spec )? ^( I_METHODS ( method )* ) ^( I_FIELDS ( field )* ) ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:428:3: ({...}? => class_spec |{...}? => super_spec | implements_spec |{...}? => source_spec | method | field | annotation )+ EOF
+			// smaliParser.g:427:3: ( ({...}? => class_spec |{...}? => super_spec | implements_spec |{...}? => source_spec | method | field | annotation )+ EOF -> ^( I_CLASS_DEF class_spec ( super_spec )? ( implements_spec )* ( source_spec )? ^( I_METHODS ( method )* ) ^( I_FIELDS ( field )* ) ) )
+			// smaliParser.g:428:3: ({...}? => class_spec |{...}? => super_spec | implements_spec |{...}? => source_spec | method | field | annotation )+ EOF
 			{
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:428:3: ({...}? => class_spec |{...}? => super_spec | implements_spec |{...}? => source_spec | method | field | annotation )+
+			// smaliParser.g:428:3: ({...}? => class_spec |{...}? => super_spec | implements_spec |{...}? => source_spec | method | field | annotation )+
 			int cnt1=0;
 			loop1:
 			while (true) {
@@ -544,7 +544,7 @@
 
 				switch (alt1) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:428:5: {...}? => class_spec
+					// smaliParser.g:428:5: {...}? => class_spec
 					{
 					if ( !((!smali_file_stack.peek().hasClassSpec)) ) {
 						throw new FailedPredicateException(input, "smali_file", "!$smali_file::hasClassSpec");
@@ -558,7 +558,7 @@
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:429:5: {...}? => super_spec
+					// smaliParser.g:429:5: {...}? => super_spec
 					{
 					if ( !((!smali_file_stack.peek().hasSuperSpec)) ) {
 						throw new FailedPredicateException(input, "smali_file", "!$smali_file::hasSuperSpec");
@@ -572,7 +572,7 @@
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:430:5: implements_spec
+					// smaliParser.g:430:5: implements_spec
 					{
 					pushFollow(FOLLOW_implements_spec_in_smali_file1094);
 					implements_spec3=implements_spec();
@@ -582,7 +582,7 @@
 					}
 					break;
 				case 4 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:431:5: {...}? => source_spec
+					// smaliParser.g:431:5: {...}? => source_spec
 					{
 					if ( !((!smali_file_stack.peek().hasSourceSpec)) ) {
 						throw new FailedPredicateException(input, "smali_file", "!$smali_file::hasSourceSpec");
@@ -596,7 +596,7 @@
 					}
 					break;
 				case 5 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:432:5: method
+					// smaliParser.g:432:5: method
 					{
 					pushFollow(FOLLOW_method_in_smali_file1111);
 					method5=method();
@@ -606,7 +606,7 @@
 					}
 					break;
 				case 6 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:433:5: field
+					// smaliParser.g:433:5: field
 					{
 					pushFollow(FOLLOW_field_in_smali_file1117);
 					field6=field();
@@ -616,7 +616,7 @@
 					}
 					break;
 				case 7 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:434:5: annotation
+					// smaliParser.g:434:5: annotation
 					{
 					pushFollow(FOLLOW_annotation_in_smali_file1123);
 					annotation7=annotation();
@@ -635,7 +635,7 @@
 				cnt1++;
 			}
 
-			EOF8=(Token)match(input,EOF,FOLLOW_EOF_in_smali_file1134);
+			EOF8=(Token)match(input,EOF,FOLLOW_EOF_in_smali_file1134);  
 			stream_EOF.add(EOF8);
 
 
@@ -648,48 +648,48 @@
 			        throw new SemanticException(input, "The file must contain a .super directive");
 			      }
 			    }
-			
+			  
 			// AST REWRITE
-			// elements: implements_spec, field, class_spec, super_spec, method, source_spec
-			// token labels:
+			// elements: super_spec, method, field, implements_spec, class_spec, source_spec
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 448:3: -> ^( I_CLASS_DEF class_spec ( super_spec )? ( implements_spec )* ( source_spec )? ^( I_METHODS ( method )* ) ^( I_FIELDS ( field )* ) )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:448:6: ^( I_CLASS_DEF class_spec ( super_spec )? ( implements_spec )* ( source_spec )? ^( I_METHODS ( method )* ) ^( I_FIELDS ( field )* ) )
+				// smaliParser.g:448:6: ^( I_CLASS_DEF class_spec ( super_spec )? ( implements_spec )* ( source_spec )? ^( I_METHODS ( method )* ) ^( I_FIELDS ( field )* ) )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_CLASS_DEF, "I_CLASS_DEF"), root_1);
 				adaptor.addChild(root_1, stream_class_spec.nextTree());
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:450:8: ( super_spec )?
+				// smaliParser.g:450:8: ( super_spec )?
 				if ( stream_super_spec.hasNext() ) {
 					adaptor.addChild(root_1, stream_super_spec.nextTree());
 				}
 				stream_super_spec.reset();
 
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:451:8: ( implements_spec )*
+				// smaliParser.g:451:8: ( implements_spec )*
 				while ( stream_implements_spec.hasNext() ) {
 					adaptor.addChild(root_1, stream_implements_spec.nextTree());
 				}
 				stream_implements_spec.reset();
 
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:452:8: ( source_spec )?
+				// smaliParser.g:452:8: ( source_spec )?
 				if ( stream_source_spec.hasNext() ) {
 					adaptor.addChild(root_1, stream_source_spec.nextTree());
 				}
 				stream_source_spec.reset();
 
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:453:8: ^( I_METHODS ( method )* )
+				// smaliParser.g:453:8: ^( I_METHODS ( method )* )
 				{
 				CommonTree root_2 = (CommonTree)adaptor.nil();
 				root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_METHODS, "I_METHODS"), root_2);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:453:20: ( method )*
+				// smaliParser.g:453:20: ( method )*
 				while ( stream_method.hasNext() ) {
 					adaptor.addChild(root_2, stream_method.nextTree());
 				}
@@ -698,11 +698,11 @@
 				adaptor.addChild(root_1, root_2);
 				}
 
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:453:29: ^( I_FIELDS ( field )* )
+				// smaliParser.g:453:29: ^( I_FIELDS ( field )* )
 				{
 				CommonTree root_2 = (CommonTree)adaptor.nil();
 				root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_FIELDS, "I_FIELDS"), root_2);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:453:40: ( field )*
+				// smaliParser.g:453:40: ( field )*
 				while ( stream_field.hasNext() ) {
 					adaptor.addChild(root_2, stream_field.nextTree());
 				}
@@ -751,7 +751,7 @@
 
 
 	// $ANTLR start "class_spec"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:455:1: class_spec returns [String className] : CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR -> CLASS_DESCRIPTOR access_list ;
+	// smaliParser.g:455:1: class_spec returns [String className] : CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR -> CLASS_DESCRIPTOR access_list ;
 	public final smaliParser.class_spec_return class_spec() throws RecognitionException {
 		smaliParser.class_spec_return retval = new smaliParser.class_spec_return();
 		retval.start = input.LT(1);
@@ -769,10 +769,10 @@
 		RewriteRuleSubtreeStream stream_access_list=new RewriteRuleSubtreeStream(adaptor,"rule access_list");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:456:3: ( CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR -> CLASS_DESCRIPTOR access_list )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:456:5: CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR
+			// smaliParser.g:456:3: ( CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR -> CLASS_DESCRIPTOR access_list )
+			// smaliParser.g:456:5: CLASS_DIRECTIVE access_list CLASS_DESCRIPTOR
 			{
-			CLASS_DIRECTIVE9=(Token)match(input,CLASS_DIRECTIVE,FOLLOW_CLASS_DIRECTIVE_in_class_spec1221);
+			CLASS_DIRECTIVE9=(Token)match(input,CLASS_DIRECTIVE,FOLLOW_CLASS_DIRECTIVE_in_class_spec1221);  
 			stream_CLASS_DIRECTIVE.add(CLASS_DIRECTIVE9);
 
 			pushFollow(FOLLOW_access_list_in_class_spec1223);
@@ -780,17 +780,17 @@
 			state._fsp--;
 
 			stream_access_list.add(access_list10.getTree());
-			CLASS_DESCRIPTOR11=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_class_spec1225);
+			CLASS_DESCRIPTOR11=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_class_spec1225);  
 			stream_CLASS_DESCRIPTOR.add(CLASS_DESCRIPTOR11);
 
 			retval.className = (CLASS_DESCRIPTOR11!=null?CLASS_DESCRIPTOR11.getText():null);
 			// AST REWRITE
-			// elements: CLASS_DESCRIPTOR, access_list
-			// token labels:
+			// elements: access_list, CLASS_DESCRIPTOR
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -833,7 +833,7 @@
 
 
 	// $ANTLR start "super_spec"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:458:1: super_spec : SUPER_DIRECTIVE CLASS_DESCRIPTOR -> ^( I_SUPER[$start, \"I_SUPER\"] CLASS_DESCRIPTOR ) ;
+	// smaliParser.g:458:1: super_spec : SUPER_DIRECTIVE CLASS_DESCRIPTOR -> ^( I_SUPER[$start, \"I_SUPER\"] CLASS_DESCRIPTOR ) ;
 	public final smaliParser.super_spec_return super_spec() throws RecognitionException {
 		smaliParser.super_spec_return retval = new smaliParser.super_spec_return();
 		retval.start = input.LT(1);
@@ -849,29 +849,29 @@
 		RewriteRuleTokenStream stream_SUPER_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token SUPER_DIRECTIVE");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:459:3: ( SUPER_DIRECTIVE CLASS_DESCRIPTOR -> ^( I_SUPER[$start, \"I_SUPER\"] CLASS_DESCRIPTOR ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:459:5: SUPER_DIRECTIVE CLASS_DESCRIPTOR
+			// smaliParser.g:459:3: ( SUPER_DIRECTIVE CLASS_DESCRIPTOR -> ^( I_SUPER[$start, \"I_SUPER\"] CLASS_DESCRIPTOR ) )
+			// smaliParser.g:459:5: SUPER_DIRECTIVE CLASS_DESCRIPTOR
 			{
-			SUPER_DIRECTIVE12=(Token)match(input,SUPER_DIRECTIVE,FOLLOW_SUPER_DIRECTIVE_in_super_spec1243);
+			SUPER_DIRECTIVE12=(Token)match(input,SUPER_DIRECTIVE,FOLLOW_SUPER_DIRECTIVE_in_super_spec1243);  
 			stream_SUPER_DIRECTIVE.add(SUPER_DIRECTIVE12);
 
-			CLASS_DESCRIPTOR13=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_super_spec1245);
+			CLASS_DESCRIPTOR13=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_super_spec1245);  
 			stream_CLASS_DESCRIPTOR.add(CLASS_DESCRIPTOR13);
 
 			// AST REWRITE
 			// elements: CLASS_DESCRIPTOR
-			// token labels:
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 459:38: -> ^( I_SUPER[$start, \"I_SUPER\"] CLASS_DESCRIPTOR )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:459:41: ^( I_SUPER[$start, \"I_SUPER\"] CLASS_DESCRIPTOR )
+				// smaliParser.g:459:41: ^( I_SUPER[$start, \"I_SUPER\"] CLASS_DESCRIPTOR )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_SUPER, (retval.start), "I_SUPER"), root_1);
@@ -913,7 +913,7 @@
 
 
 	// $ANTLR start "implements_spec"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:461:1: implements_spec : IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR -> ^( I_IMPLEMENTS[$start, \"I_IMPLEMENTS\"] CLASS_DESCRIPTOR ) ;
+	// smaliParser.g:461:1: implements_spec : IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR -> ^( I_IMPLEMENTS[$start, \"I_IMPLEMENTS\"] CLASS_DESCRIPTOR ) ;
 	public final smaliParser.implements_spec_return implements_spec() throws RecognitionException {
 		smaliParser.implements_spec_return retval = new smaliParser.implements_spec_return();
 		retval.start = input.LT(1);
@@ -929,29 +929,29 @@
 		RewriteRuleTokenStream stream_CLASS_DESCRIPTOR=new RewriteRuleTokenStream(adaptor,"token CLASS_DESCRIPTOR");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:462:3: ( IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR -> ^( I_IMPLEMENTS[$start, \"I_IMPLEMENTS\"] CLASS_DESCRIPTOR ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:462:5: IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR
+			// smaliParser.g:462:3: ( IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR -> ^( I_IMPLEMENTS[$start, \"I_IMPLEMENTS\"] CLASS_DESCRIPTOR ) )
+			// smaliParser.g:462:5: IMPLEMENTS_DIRECTIVE CLASS_DESCRIPTOR
 			{
-			IMPLEMENTS_DIRECTIVE14=(Token)match(input,IMPLEMENTS_DIRECTIVE,FOLLOW_IMPLEMENTS_DIRECTIVE_in_implements_spec1264);
+			IMPLEMENTS_DIRECTIVE14=(Token)match(input,IMPLEMENTS_DIRECTIVE,FOLLOW_IMPLEMENTS_DIRECTIVE_in_implements_spec1264);  
 			stream_IMPLEMENTS_DIRECTIVE.add(IMPLEMENTS_DIRECTIVE14);
 
-			CLASS_DESCRIPTOR15=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_implements_spec1266);
+			CLASS_DESCRIPTOR15=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_implements_spec1266);  
 			stream_CLASS_DESCRIPTOR.add(CLASS_DESCRIPTOR15);
 
 			// AST REWRITE
 			// elements: CLASS_DESCRIPTOR
-			// token labels:
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 462:43: -> ^( I_IMPLEMENTS[$start, \"I_IMPLEMENTS\"] CLASS_DESCRIPTOR )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:462:46: ^( I_IMPLEMENTS[$start, \"I_IMPLEMENTS\"] CLASS_DESCRIPTOR )
+				// smaliParser.g:462:46: ^( I_IMPLEMENTS[$start, \"I_IMPLEMENTS\"] CLASS_DESCRIPTOR )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_IMPLEMENTS, (retval.start), "I_IMPLEMENTS"), root_1);
@@ -993,7 +993,7 @@
 
 
 	// $ANTLR start "source_spec"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:464:1: source_spec : SOURCE_DIRECTIVE STRING_LITERAL -> ^( I_SOURCE[$start, \"I_SOURCE\"] STRING_LITERAL ) ;
+	// smaliParser.g:464:1: source_spec : SOURCE_DIRECTIVE STRING_LITERAL -> ^( I_SOURCE[$start, \"I_SOURCE\"] STRING_LITERAL ) ;
 	public final smaliParser.source_spec_return source_spec() throws RecognitionException {
 		smaliParser.source_spec_return retval = new smaliParser.source_spec_return();
 		retval.start = input.LT(1);
@@ -1009,29 +1009,29 @@
 		RewriteRuleTokenStream stream_STRING_LITERAL=new RewriteRuleTokenStream(adaptor,"token STRING_LITERAL");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:465:3: ( SOURCE_DIRECTIVE STRING_LITERAL -> ^( I_SOURCE[$start, \"I_SOURCE\"] STRING_LITERAL ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:465:5: SOURCE_DIRECTIVE STRING_LITERAL
+			// smaliParser.g:465:3: ( SOURCE_DIRECTIVE STRING_LITERAL -> ^( I_SOURCE[$start, \"I_SOURCE\"] STRING_LITERAL ) )
+			// smaliParser.g:465:5: SOURCE_DIRECTIVE STRING_LITERAL
 			{
-			SOURCE_DIRECTIVE16=(Token)match(input,SOURCE_DIRECTIVE,FOLLOW_SOURCE_DIRECTIVE_in_source_spec1285);
+			SOURCE_DIRECTIVE16=(Token)match(input,SOURCE_DIRECTIVE,FOLLOW_SOURCE_DIRECTIVE_in_source_spec1285);  
 			stream_SOURCE_DIRECTIVE.add(SOURCE_DIRECTIVE16);
 
-			STRING_LITERAL17=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_source_spec1287);
+			STRING_LITERAL17=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_source_spec1287);  
 			stream_STRING_LITERAL.add(STRING_LITERAL17);
 
 			// AST REWRITE
 			// elements: STRING_LITERAL
-			// token labels:
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 465:37: -> ^( I_SOURCE[$start, \"I_SOURCE\"] STRING_LITERAL )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:465:40: ^( I_SOURCE[$start, \"I_SOURCE\"] STRING_LITERAL )
+				// smaliParser.g:465:40: ^( I_SOURCE[$start, \"I_SOURCE\"] STRING_LITERAL )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_SOURCE, (retval.start), "I_SOURCE"), root_1);
@@ -1073,7 +1073,7 @@
 
 
 	// $ANTLR start "access_list"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:467:1: access_list : ( ACCESS_SPEC )* -> ^( I_ACCESS_LIST[$start,\"I_ACCESS_LIST\"] ( ACCESS_SPEC )* ) ;
+	// smaliParser.g:467:1: access_list : ( ACCESS_SPEC )* -> ^( I_ACCESS_LIST[$start,\"I_ACCESS_LIST\"] ( ACCESS_SPEC )* ) ;
 	public final smaliParser.access_list_return access_list() throws RecognitionException {
 		smaliParser.access_list_return retval = new smaliParser.access_list_return();
 		retval.start = input.LT(1);
@@ -1086,10 +1086,10 @@
 		RewriteRuleTokenStream stream_ACCESS_SPEC=new RewriteRuleTokenStream(adaptor,"token ACCESS_SPEC");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:468:3: ( ( ACCESS_SPEC )* -> ^( I_ACCESS_LIST[$start,\"I_ACCESS_LIST\"] ( ACCESS_SPEC )* ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:468:5: ( ACCESS_SPEC )*
+			// smaliParser.g:468:3: ( ( ACCESS_SPEC )* -> ^( I_ACCESS_LIST[$start,\"I_ACCESS_LIST\"] ( ACCESS_SPEC )* ) )
+			// smaliParser.g:468:5: ( ACCESS_SPEC )*
 			{
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:468:5: ( ACCESS_SPEC )*
+			// smaliParser.g:468:5: ( ACCESS_SPEC )*
 			loop2:
 			while (true) {
 				int alt2=2;
@@ -1104,9 +1104,9 @@
 
 				switch (alt2) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:468:5: ACCESS_SPEC
+					// smaliParser.g:468:5: ACCESS_SPEC
 					{
-					ACCESS_SPEC18=(Token)match(input,ACCESS_SPEC,FOLLOW_ACCESS_SPEC_in_access_list1306);
+					ACCESS_SPEC18=(Token)match(input,ACCESS_SPEC,FOLLOW_ACCESS_SPEC_in_access_list1306);  
 					stream_ACCESS_SPEC.add(ACCESS_SPEC18);
 
 					}
@@ -1119,22 +1119,22 @@
 
 			// AST REWRITE
 			// elements: ACCESS_SPEC
-			// token labels:
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 468:18: -> ^( I_ACCESS_LIST[$start,\"I_ACCESS_LIST\"] ( ACCESS_SPEC )* )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:468:21: ^( I_ACCESS_LIST[$start,\"I_ACCESS_LIST\"] ( ACCESS_SPEC )* )
+				// smaliParser.g:468:21: ^( I_ACCESS_LIST[$start,\"I_ACCESS_LIST\"] ( ACCESS_SPEC )* )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ACCESS_LIST, (retval.start), "I_ACCESS_LIST"), root_1);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:468:61: ( ACCESS_SPEC )*
+				// smaliParser.g:468:61: ( ACCESS_SPEC )*
 				while ( stream_ACCESS_SPEC.hasNext() ) {
 					adaptor.addChild(root_1, stream_ACCESS_SPEC.nextNode());
 				}
@@ -1177,7 +1177,7 @@
 
 
 	// $ANTLR start "field"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:475:1: field : FIELD_DIRECTIVE access_list member_name COLON nonvoid_type_descriptor ( EQUAL literal )? ( ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) ) ;
+	// smaliParser.g:475:1: field : FIELD_DIRECTIVE access_list member_name COLON nonvoid_type_descriptor ( EQUAL literal )? ( ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) ) ;
 	public final smaliParser.field_return field() throws RecognitionException {
 		smaliParser.field_return retval = new smaliParser.field_return();
 		retval.start = input.LT(1);
@@ -1210,10 +1210,10 @@
 
 		List<CommonTree> annotations = new ArrayList<CommonTree>();
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:477:3: ( FIELD_DIRECTIVE access_list member_name COLON nonvoid_type_descriptor ( EQUAL literal )? ( ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:477:5: FIELD_DIRECTIVE access_list member_name COLON nonvoid_type_descriptor ( EQUAL literal )? ( ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) )
+			// smaliParser.g:477:3: ( FIELD_DIRECTIVE access_list member_name COLON nonvoid_type_descriptor ( EQUAL literal )? ( ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) ) )
+			// smaliParser.g:477:5: FIELD_DIRECTIVE access_list member_name COLON nonvoid_type_descriptor ( EQUAL literal )? ( ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) )
 			{
-			FIELD_DIRECTIVE19=(Token)match(input,FIELD_DIRECTIVE,FOLLOW_FIELD_DIRECTIVE_in_field1337);
+			FIELD_DIRECTIVE19=(Token)match(input,FIELD_DIRECTIVE,FOLLOW_FIELD_DIRECTIVE_in_field1337);  
 			stream_FIELD_DIRECTIVE.add(FIELD_DIRECTIVE19);
 
 			pushFollow(FOLLOW_access_list_in_field1339);
@@ -1226,7 +1226,7 @@
 			state._fsp--;
 
 			stream_member_name.add(member_name21.getTree());
-			COLON22=(Token)match(input,COLON,FOLLOW_COLON_in_field1343);
+			COLON22=(Token)match(input,COLON,FOLLOW_COLON_in_field1343);  
 			stream_COLON.add(COLON22);
 
 			pushFollow(FOLLOW_nonvoid_type_descriptor_in_field1345);
@@ -1234,7 +1234,7 @@
 			state._fsp--;
 
 			stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor23.getTree());
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:477:75: ( EQUAL literal )?
+			// smaliParser.g:477:75: ( EQUAL literal )?
 			int alt3=2;
 			int LA3_0 = input.LA(1);
 			if ( (LA3_0==EQUAL) ) {
@@ -1242,9 +1242,9 @@
 			}
 			switch (alt3) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:477:76: EQUAL literal
+					// smaliParser.g:477:76: EQUAL literal
 					{
-					EQUAL24=(Token)match(input,EQUAL,FOLLOW_EQUAL_in_field1348);
+					EQUAL24=(Token)match(input,EQUAL,FOLLOW_EQUAL_in_field1348);  
 					stream_EQUAL.add(EQUAL24);
 
 					pushFollow(FOLLOW_literal_in_field1350);
@@ -1257,10 +1257,10 @@
 
 			}
 
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:478:5: ( ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:478:7: ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) )
+			// smaliParser.g:478:5: ( ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) ) )
+			// smaliParser.g:478:7: ({...}? annotation )* ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) )
 			{
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:478:7: ({...}? annotation )*
+			// smaliParser.g:478:7: ({...}? annotation )*
 			loop4:
 			while (true) {
 				int alt4=2;
@@ -1275,7 +1275,7 @@
 
 				switch (alt4) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:478:8: {...}? annotation
+					// smaliParser.g:478:8: {...}? annotation
 					{
 					if ( !((input.LA(1) == ANNOTATION_DIRECTIVE)) ) {
 						throw new FailedPredicateException(input, "field", "input.LA(1) == ANNOTATION_DIRECTIVE");
@@ -1294,7 +1294,7 @@
 				}
 			}
 
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:479:7: ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) )
+			// smaliParser.g:479:7: ( END_FIELD_DIRECTIVE -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) ) )
 			int alt5=2;
 			int LA5_0 = input.LA(1);
 			if ( (LA5_0==END_FIELD_DIRECTIVE) ) {
@@ -1312,31 +1312,31 @@
 
 			switch (alt5) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:479:9: END_FIELD_DIRECTIVE
+					// smaliParser.g:479:9: END_FIELD_DIRECTIVE
 					{
-					END_FIELD_DIRECTIVE27=(Token)match(input,END_FIELD_DIRECTIVE,FOLLOW_END_FIELD_DIRECTIVE_in_field1377);
+					END_FIELD_DIRECTIVE27=(Token)match(input,END_FIELD_DIRECTIVE,FOLLOW_END_FIELD_DIRECTIVE_in_field1377);  
 					stream_END_FIELD_DIRECTIVE.add(END_FIELD_DIRECTIVE27);
 
 					// AST REWRITE
-					// elements: nonvoid_type_descriptor, literal, access_list, member_name, annotation
-					// token labels:
+					// elements: access_list, nonvoid_type_descriptor, annotation, member_name, literal
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 					root_0 = (CommonTree)adaptor.nil();
 					// 480:9: -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) )
 					{
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:480:12: ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) )
+						// smaliParser.g:480:12: ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ( annotation )* ) )
 						{
 						CommonTree root_1 = (CommonTree)adaptor.nil();
 						root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_FIELD, (retval.start), "I_FIELD"), root_1);
 						adaptor.addChild(root_1, stream_member_name.nextTree());
 						adaptor.addChild(root_1, stream_access_list.nextTree());
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:480:65: ^( I_FIELD_TYPE nonvoid_type_descriptor )
+						// smaliParser.g:480:65: ^( I_FIELD_TYPE nonvoid_type_descriptor )
 						{
 						CommonTree root_2 = (CommonTree)adaptor.nil();
 						root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_FIELD_TYPE, "I_FIELD_TYPE"), root_2);
@@ -1344,9 +1344,9 @@
 						adaptor.addChild(root_1, root_2);
 						}
 
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:480:105: ( ^( I_FIELD_INITIAL_VALUE literal ) )?
+						// smaliParser.g:480:105: ( ^( I_FIELD_INITIAL_VALUE literal ) )?
 						if ( stream_literal.hasNext() ) {
-							// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:480:105: ^( I_FIELD_INITIAL_VALUE literal )
+							// smaliParser.g:480:105: ^( I_FIELD_INITIAL_VALUE literal )
 							{
 							CommonTree root_2 = (CommonTree)adaptor.nil();
 							root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_FIELD_INITIAL_VALUE, "I_FIELD_INITIAL_VALUE"), root_2);
@@ -1357,11 +1357,11 @@
 						}
 						stream_literal.reset();
 
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:480:139: ^( I_ANNOTATIONS ( annotation )* )
+						// smaliParser.g:480:139: ^( I_ANNOTATIONS ( annotation )* )
 						{
 						CommonTree root_2 = (CommonTree)adaptor.nil();
 						root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ANNOTATIONS, "I_ANNOTATIONS"), root_2);
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:480:155: ( annotation )*
+						// smaliParser.g:480:155: ( annotation )*
 						while ( stream_annotation.hasNext() ) {
 							adaptor.addChild(root_2, stream_annotation.nextTree());
 						}
@@ -1381,29 +1381,29 @@
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:481:21:
+					// smaliParser.g:481:21: 
 					{
 					smali_file_stack.peek().classAnnotations.addAll(annotations);
 					// AST REWRITE
-					// elements: literal, nonvoid_type_descriptor, member_name, access_list
-					// token labels:
+					// elements: member_name, access_list, literal, nonvoid_type_descriptor
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 					root_0 = (CommonTree)adaptor.nil();
 					// 482:9: -> ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) )
 					{
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:482:12: ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) )
+						// smaliParser.g:482:12: ^( I_FIELD[$start, \"I_FIELD\"] member_name access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) ( ^( I_FIELD_INITIAL_VALUE literal ) )? ^( I_ANNOTATIONS ) )
 						{
 						CommonTree root_1 = (CommonTree)adaptor.nil();
 						root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_FIELD, (retval.start), "I_FIELD"), root_1);
 						adaptor.addChild(root_1, stream_member_name.nextTree());
 						adaptor.addChild(root_1, stream_access_list.nextTree());
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:482:65: ^( I_FIELD_TYPE nonvoid_type_descriptor )
+						// smaliParser.g:482:65: ^( I_FIELD_TYPE nonvoid_type_descriptor )
 						{
 						CommonTree root_2 = (CommonTree)adaptor.nil();
 						root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_FIELD_TYPE, "I_FIELD_TYPE"), root_2);
@@ -1411,9 +1411,9 @@
 						adaptor.addChild(root_1, root_2);
 						}
 
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:482:105: ( ^( I_FIELD_INITIAL_VALUE literal ) )?
+						// smaliParser.g:482:105: ( ^( I_FIELD_INITIAL_VALUE literal ) )?
 						if ( stream_literal.hasNext() ) {
-							// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:482:105: ^( I_FIELD_INITIAL_VALUE literal )
+							// smaliParser.g:482:105: ^( I_FIELD_INITIAL_VALUE literal )
 							{
 							CommonTree root_2 = (CommonTree)adaptor.nil();
 							root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_FIELD_INITIAL_VALUE, "I_FIELD_INITIAL_VALUE"), root_2);
@@ -1424,7 +1424,7 @@
 						}
 						stream_literal.reset();
 
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:482:139: ^( I_ANNOTATIONS )
+						// smaliParser.g:482:139: ^( I_ANNOTATIONS )
 						{
 						CommonTree root_2 = (CommonTree)adaptor.nil();
 						root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ANNOTATIONS, "I_ANNOTATIONS"), root_2);
@@ -1475,7 +1475,7 @@
 
 
 	// $ANTLR start "method"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:486:1: method : METHOD_DIRECTIVE access_list member_name method_prototype statements_and_directives END_METHOD_DIRECTIVE -> ^( I_METHOD[$start, \"I_METHOD\"] member_name method_prototype access_list statements_and_directives ) ;
+	// smaliParser.g:486:1: method : METHOD_DIRECTIVE access_list member_name method_prototype statements_and_directives END_METHOD_DIRECTIVE -> ^( I_METHOD[$start, \"I_METHOD\"] member_name method_prototype access_list statements_and_directives ) ;
 	public final smaliParser.method_return method() throws RecognitionException {
 		smaliParser.method_return retval = new smaliParser.method_return();
 		retval.start = input.LT(1);
@@ -1499,10 +1499,10 @@
 		RewriteRuleSubtreeStream stream_statements_and_directives=new RewriteRuleSubtreeStream(adaptor,"rule statements_and_directives");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:487:3: ( METHOD_DIRECTIVE access_list member_name method_prototype statements_and_directives END_METHOD_DIRECTIVE -> ^( I_METHOD[$start, \"I_METHOD\"] member_name method_prototype access_list statements_and_directives ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:487:5: METHOD_DIRECTIVE access_list member_name method_prototype statements_and_directives END_METHOD_DIRECTIVE
+			// smaliParser.g:487:3: ( METHOD_DIRECTIVE access_list member_name method_prototype statements_and_directives END_METHOD_DIRECTIVE -> ^( I_METHOD[$start, \"I_METHOD\"] member_name method_prototype access_list statements_and_directives ) )
+			// smaliParser.g:487:5: METHOD_DIRECTIVE access_list member_name method_prototype statements_and_directives END_METHOD_DIRECTIVE
 			{
-			METHOD_DIRECTIVE28=(Token)match(input,METHOD_DIRECTIVE,FOLLOW_METHOD_DIRECTIVE_in_method1488);
+			METHOD_DIRECTIVE28=(Token)match(input,METHOD_DIRECTIVE,FOLLOW_METHOD_DIRECTIVE_in_method1488);  
 			stream_METHOD_DIRECTIVE.add(METHOD_DIRECTIVE28);
 
 			pushFollow(FOLLOW_access_list_in_method1490);
@@ -1525,23 +1525,23 @@
 			state._fsp--;
 
 			stream_statements_and_directives.add(statements_and_directives32.getTree());
-			END_METHOD_DIRECTIVE33=(Token)match(input,END_METHOD_DIRECTIVE,FOLLOW_END_METHOD_DIRECTIVE_in_method1502);
+			END_METHOD_DIRECTIVE33=(Token)match(input,END_METHOD_DIRECTIVE,FOLLOW_END_METHOD_DIRECTIVE_in_method1502);  
 			stream_END_METHOD_DIRECTIVE.add(END_METHOD_DIRECTIVE33);
 
 			// AST REWRITE
-			// elements: access_list, member_name, method_prototype, statements_and_directives
-			// token labels:
+			// elements: method_prototype, access_list, member_name, statements_and_directives
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 489:5: -> ^( I_METHOD[$start, \"I_METHOD\"] member_name method_prototype access_list statements_and_directives )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:489:8: ^( I_METHOD[$start, \"I_METHOD\"] member_name method_prototype access_list statements_and_directives )
+				// smaliParser.g:489:8: ^( I_METHOD[$start, \"I_METHOD\"] member_name method_prototype access_list statements_and_directives )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_METHOD, (retval.start), "I_METHOD"), root_1);
@@ -1592,7 +1592,7 @@
 
 
 	// $ANTLR start "statements_and_directives"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:491:1: statements_and_directives : ( ordered_method_item | registers_directive | catch_directive | catchall_directive | parameter_directive | annotation )* -> ( registers_directive )? ^( I_ORDERED_METHOD_ITEMS ( ordered_method_item )* ) ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) ^( I_PARAMETERS ( parameter_directive )* ) ;
+	// smaliParser.g:491:1: statements_and_directives : ( ordered_method_item | registers_directive | catch_directive | catchall_directive | parameter_directive | annotation )* -> ( registers_directive )? ^( I_ORDERED_METHOD_ITEMS ( ordered_method_item )* ) ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) ^( I_PARAMETERS ( parameter_directive )* ) ;
 	public final smaliParser.statements_and_directives_return statements_and_directives() throws RecognitionException {
 		statements_and_directives_stack.push(new statements_and_directives_scope());
 		smaliParser.statements_and_directives_return retval = new smaliParser.statements_and_directives_return();
@@ -1615,14 +1615,14 @@
 		RewriteRuleSubtreeStream stream_parameter_directive=new RewriteRuleSubtreeStream(adaptor,"rule parameter_directive");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:497:3: ( ( ordered_method_item | registers_directive | catch_directive | catchall_directive | parameter_directive | annotation )* -> ( registers_directive )? ^( I_ORDERED_METHOD_ITEMS ( ordered_method_item )* ) ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) ^( I_PARAMETERS ( parameter_directive )* ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:497:5: ( ordered_method_item | registers_directive | catch_directive | catchall_directive | parameter_directive | annotation )*
+			// smaliParser.g:497:3: ( ( ordered_method_item | registers_directive | catch_directive | catchall_directive | parameter_directive | annotation )* -> ( registers_directive )? ^( I_ORDERED_METHOD_ITEMS ( ordered_method_item )* ) ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) ^( I_PARAMETERS ( parameter_directive )* ) )
+			// smaliParser.g:497:5: ( ordered_method_item | registers_directive | catch_directive | catchall_directive | parameter_directive | annotation )*
 			{
 
 			      statements_and_directives_stack.peek().hasRegistersDirective = false;
 			      statements_and_directives_stack.peek().methodAnnotations = new ArrayList<CommonTree>();
-			
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:501:5: ( ordered_method_item | registers_directive | catch_directive | catchall_directive | parameter_directive | annotation )*
+			    
+			// smaliParser.g:501:5: ( ordered_method_item | registers_directive | catch_directive | catchall_directive | parameter_directive | annotation )*
 			loop6:
 			while (true) {
 				int alt6=7;
@@ -1717,7 +1717,7 @@
 				}
 				switch (alt6) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:501:7: ordered_method_item
+					// smaliParser.g:501:7: ordered_method_item
 					{
 					pushFollow(FOLLOW_ordered_method_item_in_statements_and_directives1547);
 					ordered_method_item34=ordered_method_item();
@@ -1727,7 +1727,7 @@
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:502:7: registers_directive
+					// smaliParser.g:502:7: registers_directive
 					{
 					pushFollow(FOLLOW_registers_directive_in_statements_and_directives1555);
 					registers_directive35=registers_directive();
@@ -1737,7 +1737,7 @@
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:503:7: catch_directive
+					// smaliParser.g:503:7: catch_directive
 					{
 					pushFollow(FOLLOW_catch_directive_in_statements_and_directives1563);
 					catch_directive36=catch_directive();
@@ -1747,7 +1747,7 @@
 					}
 					break;
 				case 4 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:504:7: catchall_directive
+					// smaliParser.g:504:7: catchall_directive
 					{
 					pushFollow(FOLLOW_catchall_directive_in_statements_and_directives1571);
 					catchall_directive37=catchall_directive();
@@ -1757,7 +1757,7 @@
 					}
 					break;
 				case 5 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:505:7: parameter_directive
+					// smaliParser.g:505:7: parameter_directive
 					{
 					pushFollow(FOLLOW_parameter_directive_in_statements_and_directives1579);
 					parameter_directive38=parameter_directive();
@@ -1767,7 +1767,7 @@
 					}
 					break;
 				case 6 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:506:7: annotation
+					// smaliParser.g:506:7: annotation
 					{
 					pushFollow(FOLLOW_annotation_in_statements_and_directives1587);
 					annotation39=annotation();
@@ -1784,29 +1784,29 @@
 			}
 
 			// AST REWRITE
-			// elements: parameter_directive, catch_directive, catchall_directive, ordered_method_item, registers_directive
-			// token labels:
+			// elements: ordered_method_item, catch_directive, catchall_directive, parameter_directive, registers_directive
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 508:5: -> ( registers_directive )? ^( I_ORDERED_METHOD_ITEMS ( ordered_method_item )* ) ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) ^( I_PARAMETERS ( parameter_directive )* )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:508:8: ( registers_directive )?
+				// smaliParser.g:508:8: ( registers_directive )?
 				if ( stream_registers_directive.hasNext() ) {
 					adaptor.addChild(root_0, stream_registers_directive.nextTree());
 				}
 				stream_registers_directive.reset();
 
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:509:8: ^( I_ORDERED_METHOD_ITEMS ( ordered_method_item )* )
+				// smaliParser.g:509:8: ^( I_ORDERED_METHOD_ITEMS ( ordered_method_item )* )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ORDERED_METHOD_ITEMS, "I_ORDERED_METHOD_ITEMS"), root_1);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:509:33: ( ordered_method_item )*
+				// smaliParser.g:509:33: ( ordered_method_item )*
 				while ( stream_ordered_method_item.hasNext() ) {
 					adaptor.addChild(root_1, stream_ordered_method_item.nextTree());
 				}
@@ -1815,17 +1815,17 @@
 				adaptor.addChild(root_0, root_1);
 				}
 
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:510:8: ^( I_CATCHES ( catch_directive )* ( catchall_directive )* )
+				// smaliParser.g:510:8: ^( I_CATCHES ( catch_directive )* ( catchall_directive )* )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_CATCHES, "I_CATCHES"), root_1);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:510:20: ( catch_directive )*
+				// smaliParser.g:510:20: ( catch_directive )*
 				while ( stream_catch_directive.hasNext() ) {
 					adaptor.addChild(root_1, stream_catch_directive.nextTree());
 				}
 				stream_catch_directive.reset();
 
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:510:37: ( catchall_directive )*
+				// smaliParser.g:510:37: ( catchall_directive )*
 				while ( stream_catchall_directive.hasNext() ) {
 					adaptor.addChild(root_1, stream_catchall_directive.nextTree());
 				}
@@ -1834,11 +1834,11 @@
 				adaptor.addChild(root_0, root_1);
 				}
 
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:511:8: ^( I_PARAMETERS ( parameter_directive )* )
+				// smaliParser.g:511:8: ^( I_PARAMETERS ( parameter_directive )* )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_PARAMETERS, "I_PARAMETERS"), root_1);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:511:23: ( parameter_directive )*
+				// smaliParser.g:511:23: ( parameter_directive )*
 				while ( stream_parameter_directive.hasNext() ) {
 					adaptor.addChild(root_1, stream_parameter_directive.nextTree());
 				}
@@ -1883,7 +1883,7 @@
 
 
 	// $ANTLR start "ordered_method_item"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:515:1: ordered_method_item : ( label | instruction | debug_directive );
+	// smaliParser.g:515:1: ordered_method_item : ( label | instruction | debug_directive );
 	public final smaliParser.ordered_method_item_return ordered_method_item() throws RecognitionException {
 		smaliParser.ordered_method_item_return retval = new smaliParser.ordered_method_item_return();
 		retval.start = input.LT(1);
@@ -1896,7 +1896,7 @@
 
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:516:3: ( label | instruction | debug_directive )
+			// smaliParser.g:516:3: ( label | instruction | debug_directive )
 			int alt7=3;
 			switch ( input.LA(1) ) {
 			case COLON:
@@ -1975,7 +1975,7 @@
 			}
 			switch (alt7) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:516:5: label
+					// smaliParser.g:516:5: label
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -1989,7 +1989,7 @@
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:517:5: instruction
+					// smaliParser.g:517:5: instruction
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -2003,7 +2003,7 @@
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:518:5: debug_directive
+					// smaliParser.g:518:5: debug_directive
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -2045,7 +2045,7 @@
 
 
 	// $ANTLR start "registers_directive"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:520:1: registers_directive : (directive= REGISTERS_DIRECTIVE regCount= integral_literal -> ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount) |directive= LOCALS_DIRECTIVE regCount2= integral_literal -> ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2) ) ;
+	// smaliParser.g:520:1: registers_directive : (directive= REGISTERS_DIRECTIVE regCount= integral_literal -> ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount) |directive= LOCALS_DIRECTIVE regCount2= integral_literal -> ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2) ) ;
 	public final smaliParser.registers_directive_return registers_directive() throws RecognitionException {
 		smaliParser.registers_directive_return retval = new smaliParser.registers_directive_return();
 		retval.start = input.LT(1);
@@ -2062,10 +2062,10 @@
 		RewriteRuleSubtreeStream stream_integral_literal=new RewriteRuleSubtreeStream(adaptor,"rule integral_literal");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:521:3: ( (directive= REGISTERS_DIRECTIVE regCount= integral_literal -> ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount) |directive= LOCALS_DIRECTIVE regCount2= integral_literal -> ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2) ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:521:5: (directive= REGISTERS_DIRECTIVE regCount= integral_literal -> ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount) |directive= LOCALS_DIRECTIVE regCount2= integral_literal -> ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2) )
+			// smaliParser.g:521:3: ( (directive= REGISTERS_DIRECTIVE regCount= integral_literal -> ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount) |directive= LOCALS_DIRECTIVE regCount2= integral_literal -> ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2) ) )
+			// smaliParser.g:521:5: (directive= REGISTERS_DIRECTIVE regCount= integral_literal -> ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount) |directive= LOCALS_DIRECTIVE regCount2= integral_literal -> ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2) )
 			{
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:521:5: (directive= REGISTERS_DIRECTIVE regCount= integral_literal -> ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount) |directive= LOCALS_DIRECTIVE regCount2= integral_literal -> ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2) )
+			// smaliParser.g:521:5: (directive= REGISTERS_DIRECTIVE regCount= integral_literal -> ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount) |directive= LOCALS_DIRECTIVE regCount2= integral_literal -> ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2) )
 			int alt8=2;
 			int LA8_0 = input.LA(1);
 			if ( (LA8_0==REGISTERS_DIRECTIVE) ) {
@@ -2083,9 +2083,9 @@
 
 			switch (alt8) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:522:7: directive= REGISTERS_DIRECTIVE regCount= integral_literal
+					// smaliParser.g:522:7: directive= REGISTERS_DIRECTIVE regCount= integral_literal
 					{
-					directive=(Token)match(input,REGISTERS_DIRECTIVE,FOLLOW_REGISTERS_DIRECTIVE_in_registers_directive1704);
+					directive=(Token)match(input,REGISTERS_DIRECTIVE,FOLLOW_REGISTERS_DIRECTIVE_in_registers_directive1704);  
 					stream_REGISTERS_DIRECTIVE.add(directive);
 
 					pushFollow(FOLLOW_integral_literal_in_registers_directive1708);
@@ -2095,11 +2095,11 @@
 					stream_integral_literal.add(regCount.getTree());
 					// AST REWRITE
 					// elements: regCount
-					// token labels:
+					// token labels: 
 					// rule labels: regCount, retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_regCount=new RewriteRuleSubtreeStream(adaptor,"rule regCount",regCount!=null?regCount.getTree():null);
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
@@ -2107,7 +2107,7 @@
 					root_0 = (CommonTree)adaptor.nil();
 					// 522:63: -> ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount)
 					{
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:522:66: ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount)
+						// smaliParser.g:522:66: ^( I_REGISTERS[$REGISTERS_DIRECTIVE, \"I_REGISTERS\"] $regCount)
 						{
 						CommonTree root_1 = (CommonTree)adaptor.nil();
 						root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_REGISTERS, directive, "I_REGISTERS"), root_1);
@@ -2123,9 +2123,9 @@
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:523:7: directive= LOCALS_DIRECTIVE regCount2= integral_literal
+					// smaliParser.g:523:7: directive= LOCALS_DIRECTIVE regCount2= integral_literal
 					{
-					directive=(Token)match(input,LOCALS_DIRECTIVE,FOLLOW_LOCALS_DIRECTIVE_in_registers_directive1728);
+					directive=(Token)match(input,LOCALS_DIRECTIVE,FOLLOW_LOCALS_DIRECTIVE_in_registers_directive1728);  
 					stream_LOCALS_DIRECTIVE.add(directive);
 
 					pushFollow(FOLLOW_integral_literal_in_registers_directive1732);
@@ -2135,11 +2135,11 @@
 					stream_integral_literal.add(regCount2.getTree());
 					// AST REWRITE
 					// elements: regCount2
-					// token labels:
+					// token labels: 
 					// rule labels: regCount2, retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_regCount2=new RewriteRuleSubtreeStream(adaptor,"rule regCount2",regCount2!=null?regCount2.getTree():null);
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
@@ -2147,7 +2147,7 @@
 					root_0 = (CommonTree)adaptor.nil();
 					// 523:61: -> ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2)
 					{
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:523:64: ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2)
+						// smaliParser.g:523:64: ^( I_LOCALS[$LOCALS_DIRECTIVE, \"I_LOCALS\"] $regCount2)
 						{
 						CommonTree root_1 = (CommonTree)adaptor.nil();
 						root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_LOCALS, directive, "I_LOCALS"), root_1);
@@ -2170,7 +2170,7 @@
 			        throw new SemanticException(input, directive, "There can only be a single .registers or .locals directive in a method");
 			      }
 			      statements_and_directives_stack.peek().hasRegistersDirective =true;
-			
+			    
 			}
 
 			retval.stop = input.LT(-1);
@@ -2200,7 +2200,7 @@
 
 
 	// $ANTLR start "param_list_or_id"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:532:1: param_list_or_id : ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE )+ ;
+	// smaliParser.g:532:1: param_list_or_id : ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE )+ ;
 	public final smaliParser.param_list_or_id_return param_list_or_id() throws RecognitionException {
 		smaliParser.param_list_or_id_return retval = new smaliParser.param_list_or_id_return();
 		retval.start = input.LT(1);
@@ -2212,13 +2212,13 @@
 		CommonTree PARAM_LIST_OR_ID_PRIMITIVE_TYPE43_tree=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:533:3: ( ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE )+ )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:533:5: ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE )+
+			// smaliParser.g:533:3: ( ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE )+ )
+			// smaliParser.g:533:5: ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE )+
 			{
 			root_0 = (CommonTree)adaptor.nil();
 
 
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:533:5: ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE )+
+			// smaliParser.g:533:5: ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE )+
 			int cnt9=0;
 			loop9:
 			while (true) {
@@ -2230,9 +2230,9 @@
 
 				switch (alt9) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:533:5: PARAM_LIST_OR_ID_PRIMITIVE_TYPE
+					// smaliParser.g:533:5: PARAM_LIST_OR_ID_PRIMITIVE_TYPE
 					{
-					PARAM_LIST_OR_ID_PRIMITIVE_TYPE43=(Token)match(input,PARAM_LIST_OR_ID_PRIMITIVE_TYPE,FOLLOW_PARAM_LIST_OR_ID_PRIMITIVE_TYPE_in_param_list_or_id1764);
+					PARAM_LIST_OR_ID_PRIMITIVE_TYPE43=(Token)match(input,PARAM_LIST_OR_ID_PRIMITIVE_TYPE,FOLLOW_PARAM_LIST_OR_ID_PRIMITIVE_TYPE_in_param_list_or_id1764); 
 					PARAM_LIST_OR_ID_PRIMITIVE_TYPE43_tree = (CommonTree)adaptor.create(PARAM_LIST_OR_ID_PRIMITIVE_TYPE43);
 					adaptor.addChild(root_0, PARAM_LIST_OR_ID_PRIMITIVE_TYPE43_tree);
 
@@ -2276,7 +2276,7 @@
 
 
 	// $ANTLR start "simple_name"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:537:1: simple_name : ( SIMPLE_NAME | ACCESS_SPEC -> SIMPLE_NAME[$ACCESS_SPEC] | VERIFICATION_ERROR_TYPE -> SIMPLE_NAME[$VERIFICATION_ERROR_TYPE] | POSITIVE_INTEGER_LITERAL -> SIMPLE_NAME[$POSITIVE_INTEGER_LITERAL] | NEGATIVE_INTEGER_LITERAL -> SIMPLE_NAME[$NEGATIVE_INTEGER_LITERAL] | FLOAT_LITERAL_OR_ID -> SIMPLE_NAME[$FLOAT_LITERAL_OR_ID] | DOUBLE_LITERAL_OR_ID -> SIMPLE_NAME[$DOUBLE_LITERAL_OR_ID] | BOOL_LITERAL -> SIMPLE_NAME[$BOOL_LITERAL] | NULL_LITERAL -> SIMPLE_NAME[$NULL_LITERAL] | REGISTER -> SIMPLE_NAME[$REGISTER] | param_list_or_id ->| PRIMITIVE_TYPE -> SIMPLE_NAME[$PRIMITIVE_TYPE] | VOID_TYPE -> SIMPLE_NAME[$VOID_TYPE] | ANNOTATION_VISIBILITY -> SIMPLE_NAME[$ANNOTATION_VISIBILITY] | INSTRUCTION_FORMAT10t -> SIMPLE_NAME[$INSTRUCTION_FORMAT10t] | INSTRUCTION_FORMAT10x -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x] | INSTRUCTION_FORMAT10x_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x_ODEX] | INSTRUCTION_FORMAT11x -> SIMPLE_NAME[$INSTRUCTION_FORMAT11x] | INSTRUCTION_FORMAT12x_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT12x_OR_ID] | INSTRUCTION_FORMAT21c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD] | INSTRUCTION_FORMAT21c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD_ODEX] | INSTRUCTION_FORMAT21c_STRING -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_STRING] | INSTRUCTION_FORMAT21c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_TYPE] | INSTRUCTION_FORMAT21t -> SIMPLE_NAME[$INSTRUCTION_FORMAT21t] | INSTRUCTION_FORMAT22c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD] | INSTRUCTION_FORMAT22c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD_ODEX] | INSTRUCTION_FORMAT22c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_TYPE] | INSTRUCTION_FORMAT22cs_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22cs_FIELD] | INSTRUCTION_FORMAT22s_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT22s_OR_ID] | INSTRUCTION_FORMAT22t -> SIMPLE_NAME[$INSTRUCTION_FORMAT22t] | INSTRUCTION_FORMAT23x -> SIMPLE_NAME[$INSTRUCTION_FORMAT23x] | INSTRUCTION_FORMAT31i_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT31i_OR_ID] | INSTRUCTION_FORMAT31t -> SIMPLE_NAME[$INSTRUCTION_FORMAT31t] | INSTRUCTION_FORMAT35c_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD] | INSTRUCTION_FORMAT35c_METHOD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD_ODEX] | INSTRUCTION_FORMAT35c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_TYPE] | INSTRUCTION_FORMAT35mi_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35mi_METHOD] | INSTRUCTION_FORMAT35ms_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35ms_METHOD] | INSTRUCTION_FORMAT45cc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT45cc_METHOD] | INSTRUCTION_FORMAT4rcc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT4rcc_METHOD] | INSTRUCTION_FORMAT51l -> SIMPLE_NAME[$INSTRUCTION_FORMAT51l] );
+	// smaliParser.g:537:1: simple_name : ( SIMPLE_NAME | ACCESS_SPEC -> SIMPLE_NAME[$ACCESS_SPEC] | VERIFICATION_ERROR_TYPE -> SIMPLE_NAME[$VERIFICATION_ERROR_TYPE] | POSITIVE_INTEGER_LITERAL -> SIMPLE_NAME[$POSITIVE_INTEGER_LITERAL] | NEGATIVE_INTEGER_LITERAL -> SIMPLE_NAME[$NEGATIVE_INTEGER_LITERAL] | FLOAT_LITERAL_OR_ID -> SIMPLE_NAME[$FLOAT_LITERAL_OR_ID] | DOUBLE_LITERAL_OR_ID -> SIMPLE_NAME[$DOUBLE_LITERAL_OR_ID] | BOOL_LITERAL -> SIMPLE_NAME[$BOOL_LITERAL] | NULL_LITERAL -> SIMPLE_NAME[$NULL_LITERAL] | REGISTER -> SIMPLE_NAME[$REGISTER] | param_list_or_id ->| PRIMITIVE_TYPE -> SIMPLE_NAME[$PRIMITIVE_TYPE] | VOID_TYPE -> SIMPLE_NAME[$VOID_TYPE] | ANNOTATION_VISIBILITY -> SIMPLE_NAME[$ANNOTATION_VISIBILITY] | INSTRUCTION_FORMAT10t -> SIMPLE_NAME[$INSTRUCTION_FORMAT10t] | INSTRUCTION_FORMAT10x -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x] | INSTRUCTION_FORMAT10x_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x_ODEX] | INSTRUCTION_FORMAT11x -> SIMPLE_NAME[$INSTRUCTION_FORMAT11x] | INSTRUCTION_FORMAT12x_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT12x_OR_ID] | INSTRUCTION_FORMAT21c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD] | INSTRUCTION_FORMAT21c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD_ODEX] | INSTRUCTION_FORMAT21c_STRING -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_STRING] | INSTRUCTION_FORMAT21c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_TYPE] | INSTRUCTION_FORMAT21t -> SIMPLE_NAME[$INSTRUCTION_FORMAT21t] | INSTRUCTION_FORMAT22c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD] | INSTRUCTION_FORMAT22c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD_ODEX] | INSTRUCTION_FORMAT22c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_TYPE] | INSTRUCTION_FORMAT22cs_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22cs_FIELD] | INSTRUCTION_FORMAT22s_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT22s_OR_ID] | INSTRUCTION_FORMAT22t -> SIMPLE_NAME[$INSTRUCTION_FORMAT22t] | INSTRUCTION_FORMAT23x -> SIMPLE_NAME[$INSTRUCTION_FORMAT23x] | INSTRUCTION_FORMAT31i_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT31i_OR_ID] | INSTRUCTION_FORMAT31t -> SIMPLE_NAME[$INSTRUCTION_FORMAT31t] | INSTRUCTION_FORMAT35c_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD] | INSTRUCTION_FORMAT35c_METHOD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD_ODEX] | INSTRUCTION_FORMAT35c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_TYPE] | INSTRUCTION_FORMAT35mi_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35mi_METHOD] | INSTRUCTION_FORMAT35ms_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35ms_METHOD] | INSTRUCTION_FORMAT45cc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT45cc_METHOD] | INSTRUCTION_FORMAT4rcc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT4rcc_METHOD] | INSTRUCTION_FORMAT51l -> SIMPLE_NAME[$INSTRUCTION_FORMAT51l] );
 	public final smaliParser.simple_name_return simple_name() throws RecognitionException {
 		smaliParser.simple_name_return retval = new smaliParser.simple_name_return();
 		retval.start = input.LT(1);
@@ -2407,7 +2407,7 @@
 		RewriteRuleSubtreeStream stream_param_list_or_id=new RewriteRuleSubtreeStream(adaptor,"rule param_list_or_id");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:538:3: ( SIMPLE_NAME | ACCESS_SPEC -> SIMPLE_NAME[$ACCESS_SPEC] | VERIFICATION_ERROR_TYPE -> SIMPLE_NAME[$VERIFICATION_ERROR_TYPE] | POSITIVE_INTEGER_LITERAL -> SIMPLE_NAME[$POSITIVE_INTEGER_LITERAL] | NEGATIVE_INTEGER_LITERAL -> SIMPLE_NAME[$NEGATIVE_INTEGER_LITERAL] | FLOAT_LITERAL_OR_ID -> SIMPLE_NAME[$FLOAT_LITERAL_OR_ID] | DOUBLE_LITERAL_OR_ID -> SIMPLE_NAME[$DOUBLE_LITERAL_OR_ID] | BOOL_LITERAL -> SIMPLE_NAME[$BOOL_LITERAL] | NULL_LITERAL -> SIMPLE_NAME[$NULL_LITERAL] | REGISTER -> SIMPLE_NAME[$REGISTER] | param_list_or_id ->| PRIMITIVE_TYPE -> SIMPLE_NAME[$PRIMITIVE_TYPE] | VOID_TYPE -> SIMPLE_NAME[$VOID_TYPE] | ANNOTATION_VISIBILITY -> SIMPLE_NAME[$ANNOTATION_VISIBILITY] | INSTRUCTION_FORMAT10t -> SIMPLE_NAME[$INSTRUCTION_FORMAT10t] | INSTRUCTION_FORMAT10x -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x] | INSTRUCTION_FORMAT10x_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x_ODEX] | INSTRUCTION_FORMAT11x -> SIMPLE_NAME[$INSTRUCTION_FORMAT11x] | INSTRUCTION_FORMAT12x_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT12x_OR_ID] | INSTRUCTION_FORMAT21c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD] | INSTRUCTION_FORMAT21c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD_ODEX] | INSTRUCTION_FORMAT21c_STRING -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_STRING] | INSTRUCTION_FORMAT21c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_TYPE] | INSTRUCTION_FORMAT21t -> SIMPLE_NAME[$INSTRUCTION_FORMAT21t] | INSTRUCTION_FORMAT22c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD] | INSTRUCTION_FORMAT22c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD_ODEX] | INSTRUCTION_FORMAT22c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_TYPE] | INSTRUCTION_FORMAT22cs_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22cs_FIELD] | INSTRUCTION_FORMAT22s_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT22s_OR_ID] | INSTRUCTION_FORMAT22t -> SIMPLE_NAME[$INSTRUCTION_FORMAT22t] | INSTRUCTION_FORMAT23x -> SIMPLE_NAME[$INSTRUCTION_FORMAT23x] | INSTRUCTION_FORMAT31i_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT31i_OR_ID] | INSTRUCTION_FORMAT31t -> SIMPLE_NAME[$INSTRUCTION_FORMAT31t] | INSTRUCTION_FORMAT35c_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD] | INSTRUCTION_FORMAT35c_METHOD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD_ODEX] | INSTRUCTION_FORMAT35c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_TYPE] | INSTRUCTION_FORMAT35mi_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35mi_METHOD] | INSTRUCTION_FORMAT35ms_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35ms_METHOD] | INSTRUCTION_FORMAT45cc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT45cc_METHOD] | INSTRUCTION_FORMAT4rcc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT4rcc_METHOD] | INSTRUCTION_FORMAT51l -> SIMPLE_NAME[$INSTRUCTION_FORMAT51l] )
+			// smaliParser.g:538:3: ( SIMPLE_NAME | ACCESS_SPEC -> SIMPLE_NAME[$ACCESS_SPEC] | VERIFICATION_ERROR_TYPE -> SIMPLE_NAME[$VERIFICATION_ERROR_TYPE] | POSITIVE_INTEGER_LITERAL -> SIMPLE_NAME[$POSITIVE_INTEGER_LITERAL] | NEGATIVE_INTEGER_LITERAL -> SIMPLE_NAME[$NEGATIVE_INTEGER_LITERAL] | FLOAT_LITERAL_OR_ID -> SIMPLE_NAME[$FLOAT_LITERAL_OR_ID] | DOUBLE_LITERAL_OR_ID -> SIMPLE_NAME[$DOUBLE_LITERAL_OR_ID] | BOOL_LITERAL -> SIMPLE_NAME[$BOOL_LITERAL] | NULL_LITERAL -> SIMPLE_NAME[$NULL_LITERAL] | REGISTER -> SIMPLE_NAME[$REGISTER] | param_list_or_id ->| PRIMITIVE_TYPE -> SIMPLE_NAME[$PRIMITIVE_TYPE] | VOID_TYPE -> SIMPLE_NAME[$VOID_TYPE] | ANNOTATION_VISIBILITY -> SIMPLE_NAME[$ANNOTATION_VISIBILITY] | INSTRUCTION_FORMAT10t -> SIMPLE_NAME[$INSTRUCTION_FORMAT10t] | INSTRUCTION_FORMAT10x -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x] | INSTRUCTION_FORMAT10x_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT10x_ODEX] | INSTRUCTION_FORMAT11x -> SIMPLE_NAME[$INSTRUCTION_FORMAT11x] | INSTRUCTION_FORMAT12x_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT12x_OR_ID] | INSTRUCTION_FORMAT21c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD] | INSTRUCTION_FORMAT21c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_FIELD_ODEX] | INSTRUCTION_FORMAT21c_STRING -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_STRING] | INSTRUCTION_FORMAT21c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT21c_TYPE] | INSTRUCTION_FORMAT21t -> SIMPLE_NAME[$INSTRUCTION_FORMAT21t] | INSTRUCTION_FORMAT22c_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD] | INSTRUCTION_FORMAT22c_FIELD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_FIELD_ODEX] | INSTRUCTION_FORMAT22c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT22c_TYPE] | INSTRUCTION_FORMAT22cs_FIELD -> SIMPLE_NAME[$INSTRUCTION_FORMAT22cs_FIELD] | INSTRUCTION_FORMAT22s_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT22s_OR_ID] | INSTRUCTION_FORMAT22t -> SIMPLE_NAME[$INSTRUCTION_FORMAT22t] | INSTRUCTION_FORMAT23x -> SIMPLE_NAME[$INSTRUCTION_FORMAT23x] | INSTRUCTION_FORMAT31i_OR_ID -> SIMPLE_NAME[$INSTRUCTION_FORMAT31i_OR_ID] | INSTRUCTION_FORMAT31t -> SIMPLE_NAME[$INSTRUCTION_FORMAT31t] | INSTRUCTION_FORMAT35c_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD] | INSTRUCTION_FORMAT35c_METHOD_ODEX -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_METHOD_ODEX] | INSTRUCTION_FORMAT35c_TYPE -> SIMPLE_NAME[$INSTRUCTION_FORMAT35c_TYPE] | INSTRUCTION_FORMAT35mi_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35mi_METHOD] | INSTRUCTION_FORMAT35ms_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT35ms_METHOD] | INSTRUCTION_FORMAT45cc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT45cc_METHOD] | INSTRUCTION_FORMAT4rcc_METHOD -> SIMPLE_NAME[$INSTRUCTION_FORMAT4rcc_METHOD] | INSTRUCTION_FORMAT51l -> SIMPLE_NAME[$INSTRUCTION_FORMAT51l] )
 			int alt10=41;
 			switch ( input.LA(1) ) {
 			case SIMPLE_NAME:
@@ -2622,30 +2622,30 @@
 			}
 			switch (alt10) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:538:5: SIMPLE_NAME
+					// smaliParser.g:538:5: SIMPLE_NAME
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					SIMPLE_NAME44=(Token)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_simple_name1777);
+					SIMPLE_NAME44=(Token)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_simple_name1777); 
 					SIMPLE_NAME44_tree = (CommonTree)adaptor.create(SIMPLE_NAME44);
 					adaptor.addChild(root_0, SIMPLE_NAME44_tree);
 
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:539:5: ACCESS_SPEC
+					// smaliParser.g:539:5: ACCESS_SPEC
 					{
-					ACCESS_SPEC45=(Token)match(input,ACCESS_SPEC,FOLLOW_ACCESS_SPEC_in_simple_name1783);
+					ACCESS_SPEC45=(Token)match(input,ACCESS_SPEC,FOLLOW_ACCESS_SPEC_in_simple_name1783);  
 					stream_ACCESS_SPEC.add(ACCESS_SPEC45);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -2661,18 +2661,18 @@
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:540:5: VERIFICATION_ERROR_TYPE
+					// smaliParser.g:540:5: VERIFICATION_ERROR_TYPE
 					{
-					VERIFICATION_ERROR_TYPE46=(Token)match(input,VERIFICATION_ERROR_TYPE,FOLLOW_VERIFICATION_ERROR_TYPE_in_simple_name1794);
+					VERIFICATION_ERROR_TYPE46=(Token)match(input,VERIFICATION_ERROR_TYPE,FOLLOW_VERIFICATION_ERROR_TYPE_in_simple_name1794);  
 					stream_VERIFICATION_ERROR_TYPE.add(VERIFICATION_ERROR_TYPE46);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -2688,18 +2688,18 @@
 					}
 					break;
 				case 4 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:541:5: POSITIVE_INTEGER_LITERAL
+					// smaliParser.g:541:5: POSITIVE_INTEGER_LITERAL
 					{
-					POSITIVE_INTEGER_LITERAL47=(Token)match(input,POSITIVE_INTEGER_LITERAL,FOLLOW_POSITIVE_INTEGER_LITERAL_in_simple_name1805);
+					POSITIVE_INTEGER_LITERAL47=(Token)match(input,POSITIVE_INTEGER_LITERAL,FOLLOW_POSITIVE_INTEGER_LITERAL_in_simple_name1805);  
 					stream_POSITIVE_INTEGER_LITERAL.add(POSITIVE_INTEGER_LITERAL47);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -2715,18 +2715,18 @@
 					}
 					break;
 				case 5 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:542:5: NEGATIVE_INTEGER_LITERAL
+					// smaliParser.g:542:5: NEGATIVE_INTEGER_LITERAL
 					{
-					NEGATIVE_INTEGER_LITERAL48=(Token)match(input,NEGATIVE_INTEGER_LITERAL,FOLLOW_NEGATIVE_INTEGER_LITERAL_in_simple_name1816);
+					NEGATIVE_INTEGER_LITERAL48=(Token)match(input,NEGATIVE_INTEGER_LITERAL,FOLLOW_NEGATIVE_INTEGER_LITERAL_in_simple_name1816);  
 					stream_NEGATIVE_INTEGER_LITERAL.add(NEGATIVE_INTEGER_LITERAL48);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -2742,18 +2742,18 @@
 					}
 					break;
 				case 6 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:543:5: FLOAT_LITERAL_OR_ID
+					// smaliParser.g:543:5: FLOAT_LITERAL_OR_ID
 					{
-					FLOAT_LITERAL_OR_ID49=(Token)match(input,FLOAT_LITERAL_OR_ID,FOLLOW_FLOAT_LITERAL_OR_ID_in_simple_name1827);
+					FLOAT_LITERAL_OR_ID49=(Token)match(input,FLOAT_LITERAL_OR_ID,FOLLOW_FLOAT_LITERAL_OR_ID_in_simple_name1827);  
 					stream_FLOAT_LITERAL_OR_ID.add(FLOAT_LITERAL_OR_ID49);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -2769,18 +2769,18 @@
 					}
 					break;
 				case 7 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:544:5: DOUBLE_LITERAL_OR_ID
+					// smaliParser.g:544:5: DOUBLE_LITERAL_OR_ID
 					{
-					DOUBLE_LITERAL_OR_ID50=(Token)match(input,DOUBLE_LITERAL_OR_ID,FOLLOW_DOUBLE_LITERAL_OR_ID_in_simple_name1838);
+					DOUBLE_LITERAL_OR_ID50=(Token)match(input,DOUBLE_LITERAL_OR_ID,FOLLOW_DOUBLE_LITERAL_OR_ID_in_simple_name1838);  
 					stream_DOUBLE_LITERAL_OR_ID.add(DOUBLE_LITERAL_OR_ID50);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -2796,18 +2796,18 @@
 					}
 					break;
 				case 8 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:545:5: BOOL_LITERAL
+					// smaliParser.g:545:5: BOOL_LITERAL
 					{
-					BOOL_LITERAL51=(Token)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_simple_name1849);
+					BOOL_LITERAL51=(Token)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_simple_name1849);  
 					stream_BOOL_LITERAL.add(BOOL_LITERAL51);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -2823,18 +2823,18 @@
 					}
 					break;
 				case 9 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:546:5: NULL_LITERAL
+					// smaliParser.g:546:5: NULL_LITERAL
 					{
-					NULL_LITERAL52=(Token)match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_simple_name1860);
+					NULL_LITERAL52=(Token)match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_simple_name1860);  
 					stream_NULL_LITERAL.add(NULL_LITERAL52);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -2850,18 +2850,18 @@
 					}
 					break;
 				case 10 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:547:5: REGISTER
+					// smaliParser.g:547:5: REGISTER
 					{
-					REGISTER53=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_simple_name1871);
+					REGISTER53=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_simple_name1871);  
 					stream_REGISTER.add(REGISTER53);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -2877,7 +2877,7 @@
 					}
 					break;
 				case 11 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:548:5: param_list_or_id
+					// smaliParser.g:548:5: param_list_or_id
 					{
 					pushFollow(FOLLOW_param_list_or_id_in_simple_name1882);
 					param_list_or_id54=param_list_or_id();
@@ -2885,12 +2885,12 @@
 
 					stream_param_list_or_id.add(param_list_or_id54.getTree());
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -2906,18 +2906,18 @@
 					}
 					break;
 				case 12 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:549:5: PRIMITIVE_TYPE
+					// smaliParser.g:549:5: PRIMITIVE_TYPE
 					{
-					PRIMITIVE_TYPE55=(Token)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_simple_name1892);
+					PRIMITIVE_TYPE55=(Token)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_simple_name1892);  
 					stream_PRIMITIVE_TYPE.add(PRIMITIVE_TYPE55);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -2933,18 +2933,18 @@
 					}
 					break;
 				case 13 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:550:5: VOID_TYPE
+					// smaliParser.g:550:5: VOID_TYPE
 					{
-					VOID_TYPE56=(Token)match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_simple_name1903);
+					VOID_TYPE56=(Token)match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_simple_name1903);  
 					stream_VOID_TYPE.add(VOID_TYPE56);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -2960,18 +2960,18 @@
 					}
 					break;
 				case 14 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:551:5: ANNOTATION_VISIBILITY
+					// smaliParser.g:551:5: ANNOTATION_VISIBILITY
 					{
-					ANNOTATION_VISIBILITY57=(Token)match(input,ANNOTATION_VISIBILITY,FOLLOW_ANNOTATION_VISIBILITY_in_simple_name1914);
+					ANNOTATION_VISIBILITY57=(Token)match(input,ANNOTATION_VISIBILITY,FOLLOW_ANNOTATION_VISIBILITY_in_simple_name1914);  
 					stream_ANNOTATION_VISIBILITY.add(ANNOTATION_VISIBILITY57);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -2987,18 +2987,18 @@
 					}
 					break;
 				case 15 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:552:5: INSTRUCTION_FORMAT10t
+					// smaliParser.g:552:5: INSTRUCTION_FORMAT10t
 					{
-					INSTRUCTION_FORMAT10t58=(Token)match(input,INSTRUCTION_FORMAT10t,FOLLOW_INSTRUCTION_FORMAT10t_in_simple_name1925);
+					INSTRUCTION_FORMAT10t58=(Token)match(input,INSTRUCTION_FORMAT10t,FOLLOW_INSTRUCTION_FORMAT10t_in_simple_name1925);  
 					stream_INSTRUCTION_FORMAT10t.add(INSTRUCTION_FORMAT10t58);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3014,18 +3014,18 @@
 					}
 					break;
 				case 16 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:553:5: INSTRUCTION_FORMAT10x
+					// smaliParser.g:553:5: INSTRUCTION_FORMAT10x
 					{
-					INSTRUCTION_FORMAT10x59=(Token)match(input,INSTRUCTION_FORMAT10x,FOLLOW_INSTRUCTION_FORMAT10x_in_simple_name1936);
+					INSTRUCTION_FORMAT10x59=(Token)match(input,INSTRUCTION_FORMAT10x,FOLLOW_INSTRUCTION_FORMAT10x_in_simple_name1936);  
 					stream_INSTRUCTION_FORMAT10x.add(INSTRUCTION_FORMAT10x59);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3041,18 +3041,18 @@
 					}
 					break;
 				case 17 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:554:5: INSTRUCTION_FORMAT10x_ODEX
+					// smaliParser.g:554:5: INSTRUCTION_FORMAT10x_ODEX
 					{
-					INSTRUCTION_FORMAT10x_ODEX60=(Token)match(input,INSTRUCTION_FORMAT10x_ODEX,FOLLOW_INSTRUCTION_FORMAT10x_ODEX_in_simple_name1947);
+					INSTRUCTION_FORMAT10x_ODEX60=(Token)match(input,INSTRUCTION_FORMAT10x_ODEX,FOLLOW_INSTRUCTION_FORMAT10x_ODEX_in_simple_name1947);  
 					stream_INSTRUCTION_FORMAT10x_ODEX.add(INSTRUCTION_FORMAT10x_ODEX60);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3068,18 +3068,18 @@
 					}
 					break;
 				case 18 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:555:5: INSTRUCTION_FORMAT11x
+					// smaliParser.g:555:5: INSTRUCTION_FORMAT11x
 					{
-					INSTRUCTION_FORMAT11x61=(Token)match(input,INSTRUCTION_FORMAT11x,FOLLOW_INSTRUCTION_FORMAT11x_in_simple_name1958);
+					INSTRUCTION_FORMAT11x61=(Token)match(input,INSTRUCTION_FORMAT11x,FOLLOW_INSTRUCTION_FORMAT11x_in_simple_name1958);  
 					stream_INSTRUCTION_FORMAT11x.add(INSTRUCTION_FORMAT11x61);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3095,18 +3095,18 @@
 					}
 					break;
 				case 19 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:556:5: INSTRUCTION_FORMAT12x_OR_ID
+					// smaliParser.g:556:5: INSTRUCTION_FORMAT12x_OR_ID
 					{
-					INSTRUCTION_FORMAT12x_OR_ID62=(Token)match(input,INSTRUCTION_FORMAT12x_OR_ID,FOLLOW_INSTRUCTION_FORMAT12x_OR_ID_in_simple_name1969);
+					INSTRUCTION_FORMAT12x_OR_ID62=(Token)match(input,INSTRUCTION_FORMAT12x_OR_ID,FOLLOW_INSTRUCTION_FORMAT12x_OR_ID_in_simple_name1969);  
 					stream_INSTRUCTION_FORMAT12x_OR_ID.add(INSTRUCTION_FORMAT12x_OR_ID62);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3122,18 +3122,18 @@
 					}
 					break;
 				case 20 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:557:5: INSTRUCTION_FORMAT21c_FIELD
+					// smaliParser.g:557:5: INSTRUCTION_FORMAT21c_FIELD
 					{
-					INSTRUCTION_FORMAT21c_FIELD63=(Token)match(input,INSTRUCTION_FORMAT21c_FIELD,FOLLOW_INSTRUCTION_FORMAT21c_FIELD_in_simple_name1980);
+					INSTRUCTION_FORMAT21c_FIELD63=(Token)match(input,INSTRUCTION_FORMAT21c_FIELD,FOLLOW_INSTRUCTION_FORMAT21c_FIELD_in_simple_name1980);  
 					stream_INSTRUCTION_FORMAT21c_FIELD.add(INSTRUCTION_FORMAT21c_FIELD63);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3149,18 +3149,18 @@
 					}
 					break;
 				case 21 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:558:5: INSTRUCTION_FORMAT21c_FIELD_ODEX
+					// smaliParser.g:558:5: INSTRUCTION_FORMAT21c_FIELD_ODEX
 					{
-					INSTRUCTION_FORMAT21c_FIELD_ODEX64=(Token)match(input,INSTRUCTION_FORMAT21c_FIELD_ODEX,FOLLOW_INSTRUCTION_FORMAT21c_FIELD_ODEX_in_simple_name1991);
+					INSTRUCTION_FORMAT21c_FIELD_ODEX64=(Token)match(input,INSTRUCTION_FORMAT21c_FIELD_ODEX,FOLLOW_INSTRUCTION_FORMAT21c_FIELD_ODEX_in_simple_name1991);  
 					stream_INSTRUCTION_FORMAT21c_FIELD_ODEX.add(INSTRUCTION_FORMAT21c_FIELD_ODEX64);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3176,18 +3176,18 @@
 					}
 					break;
 				case 22 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:559:5: INSTRUCTION_FORMAT21c_STRING
+					// smaliParser.g:559:5: INSTRUCTION_FORMAT21c_STRING
 					{
-					INSTRUCTION_FORMAT21c_STRING65=(Token)match(input,INSTRUCTION_FORMAT21c_STRING,FOLLOW_INSTRUCTION_FORMAT21c_STRING_in_simple_name2002);
+					INSTRUCTION_FORMAT21c_STRING65=(Token)match(input,INSTRUCTION_FORMAT21c_STRING,FOLLOW_INSTRUCTION_FORMAT21c_STRING_in_simple_name2002);  
 					stream_INSTRUCTION_FORMAT21c_STRING.add(INSTRUCTION_FORMAT21c_STRING65);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3203,18 +3203,18 @@
 					}
 					break;
 				case 23 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:560:5: INSTRUCTION_FORMAT21c_TYPE
+					// smaliParser.g:560:5: INSTRUCTION_FORMAT21c_TYPE
 					{
-					INSTRUCTION_FORMAT21c_TYPE66=(Token)match(input,INSTRUCTION_FORMAT21c_TYPE,FOLLOW_INSTRUCTION_FORMAT21c_TYPE_in_simple_name2013);
+					INSTRUCTION_FORMAT21c_TYPE66=(Token)match(input,INSTRUCTION_FORMAT21c_TYPE,FOLLOW_INSTRUCTION_FORMAT21c_TYPE_in_simple_name2013);  
 					stream_INSTRUCTION_FORMAT21c_TYPE.add(INSTRUCTION_FORMAT21c_TYPE66);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3230,18 +3230,18 @@
 					}
 					break;
 				case 24 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:561:5: INSTRUCTION_FORMAT21t
+					// smaliParser.g:561:5: INSTRUCTION_FORMAT21t
 					{
-					INSTRUCTION_FORMAT21t67=(Token)match(input,INSTRUCTION_FORMAT21t,FOLLOW_INSTRUCTION_FORMAT21t_in_simple_name2024);
+					INSTRUCTION_FORMAT21t67=(Token)match(input,INSTRUCTION_FORMAT21t,FOLLOW_INSTRUCTION_FORMAT21t_in_simple_name2024);  
 					stream_INSTRUCTION_FORMAT21t.add(INSTRUCTION_FORMAT21t67);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3257,18 +3257,18 @@
 					}
 					break;
 				case 25 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:562:5: INSTRUCTION_FORMAT22c_FIELD
+					// smaliParser.g:562:5: INSTRUCTION_FORMAT22c_FIELD
 					{
-					INSTRUCTION_FORMAT22c_FIELD68=(Token)match(input,INSTRUCTION_FORMAT22c_FIELD,FOLLOW_INSTRUCTION_FORMAT22c_FIELD_in_simple_name2035);
+					INSTRUCTION_FORMAT22c_FIELD68=(Token)match(input,INSTRUCTION_FORMAT22c_FIELD,FOLLOW_INSTRUCTION_FORMAT22c_FIELD_in_simple_name2035);  
 					stream_INSTRUCTION_FORMAT22c_FIELD.add(INSTRUCTION_FORMAT22c_FIELD68);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3284,18 +3284,18 @@
 					}
 					break;
 				case 26 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:563:5: INSTRUCTION_FORMAT22c_FIELD_ODEX
+					// smaliParser.g:563:5: INSTRUCTION_FORMAT22c_FIELD_ODEX
 					{
-					INSTRUCTION_FORMAT22c_FIELD_ODEX69=(Token)match(input,INSTRUCTION_FORMAT22c_FIELD_ODEX,FOLLOW_INSTRUCTION_FORMAT22c_FIELD_ODEX_in_simple_name2046);
+					INSTRUCTION_FORMAT22c_FIELD_ODEX69=(Token)match(input,INSTRUCTION_FORMAT22c_FIELD_ODEX,FOLLOW_INSTRUCTION_FORMAT22c_FIELD_ODEX_in_simple_name2046);  
 					stream_INSTRUCTION_FORMAT22c_FIELD_ODEX.add(INSTRUCTION_FORMAT22c_FIELD_ODEX69);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3311,18 +3311,18 @@
 					}
 					break;
 				case 27 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:564:5: INSTRUCTION_FORMAT22c_TYPE
+					// smaliParser.g:564:5: INSTRUCTION_FORMAT22c_TYPE
 					{
-					INSTRUCTION_FORMAT22c_TYPE70=(Token)match(input,INSTRUCTION_FORMAT22c_TYPE,FOLLOW_INSTRUCTION_FORMAT22c_TYPE_in_simple_name2057);
+					INSTRUCTION_FORMAT22c_TYPE70=(Token)match(input,INSTRUCTION_FORMAT22c_TYPE,FOLLOW_INSTRUCTION_FORMAT22c_TYPE_in_simple_name2057);  
 					stream_INSTRUCTION_FORMAT22c_TYPE.add(INSTRUCTION_FORMAT22c_TYPE70);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3338,18 +3338,18 @@
 					}
 					break;
 				case 28 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:565:5: INSTRUCTION_FORMAT22cs_FIELD
+					// smaliParser.g:565:5: INSTRUCTION_FORMAT22cs_FIELD
 					{
-					INSTRUCTION_FORMAT22cs_FIELD71=(Token)match(input,INSTRUCTION_FORMAT22cs_FIELD,FOLLOW_INSTRUCTION_FORMAT22cs_FIELD_in_simple_name2068);
+					INSTRUCTION_FORMAT22cs_FIELD71=(Token)match(input,INSTRUCTION_FORMAT22cs_FIELD,FOLLOW_INSTRUCTION_FORMAT22cs_FIELD_in_simple_name2068);  
 					stream_INSTRUCTION_FORMAT22cs_FIELD.add(INSTRUCTION_FORMAT22cs_FIELD71);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3365,18 +3365,18 @@
 					}
 					break;
 				case 29 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:566:5: INSTRUCTION_FORMAT22s_OR_ID
+					// smaliParser.g:566:5: INSTRUCTION_FORMAT22s_OR_ID
 					{
-					INSTRUCTION_FORMAT22s_OR_ID72=(Token)match(input,INSTRUCTION_FORMAT22s_OR_ID,FOLLOW_INSTRUCTION_FORMAT22s_OR_ID_in_simple_name2079);
+					INSTRUCTION_FORMAT22s_OR_ID72=(Token)match(input,INSTRUCTION_FORMAT22s_OR_ID,FOLLOW_INSTRUCTION_FORMAT22s_OR_ID_in_simple_name2079);  
 					stream_INSTRUCTION_FORMAT22s_OR_ID.add(INSTRUCTION_FORMAT22s_OR_ID72);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3392,18 +3392,18 @@
 					}
 					break;
 				case 30 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:567:5: INSTRUCTION_FORMAT22t
+					// smaliParser.g:567:5: INSTRUCTION_FORMAT22t
 					{
-					INSTRUCTION_FORMAT22t73=(Token)match(input,INSTRUCTION_FORMAT22t,FOLLOW_INSTRUCTION_FORMAT22t_in_simple_name2090);
+					INSTRUCTION_FORMAT22t73=(Token)match(input,INSTRUCTION_FORMAT22t,FOLLOW_INSTRUCTION_FORMAT22t_in_simple_name2090);  
 					stream_INSTRUCTION_FORMAT22t.add(INSTRUCTION_FORMAT22t73);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3419,18 +3419,18 @@
 					}
 					break;
 				case 31 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:568:5: INSTRUCTION_FORMAT23x
+					// smaliParser.g:568:5: INSTRUCTION_FORMAT23x
 					{
-					INSTRUCTION_FORMAT23x74=(Token)match(input,INSTRUCTION_FORMAT23x,FOLLOW_INSTRUCTION_FORMAT23x_in_simple_name2101);
+					INSTRUCTION_FORMAT23x74=(Token)match(input,INSTRUCTION_FORMAT23x,FOLLOW_INSTRUCTION_FORMAT23x_in_simple_name2101);  
 					stream_INSTRUCTION_FORMAT23x.add(INSTRUCTION_FORMAT23x74);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3446,18 +3446,18 @@
 					}
 					break;
 				case 32 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:569:5: INSTRUCTION_FORMAT31i_OR_ID
+					// smaliParser.g:569:5: INSTRUCTION_FORMAT31i_OR_ID
 					{
-					INSTRUCTION_FORMAT31i_OR_ID75=(Token)match(input,INSTRUCTION_FORMAT31i_OR_ID,FOLLOW_INSTRUCTION_FORMAT31i_OR_ID_in_simple_name2112);
+					INSTRUCTION_FORMAT31i_OR_ID75=(Token)match(input,INSTRUCTION_FORMAT31i_OR_ID,FOLLOW_INSTRUCTION_FORMAT31i_OR_ID_in_simple_name2112);  
 					stream_INSTRUCTION_FORMAT31i_OR_ID.add(INSTRUCTION_FORMAT31i_OR_ID75);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3473,18 +3473,18 @@
 					}
 					break;
 				case 33 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:570:5: INSTRUCTION_FORMAT31t
+					// smaliParser.g:570:5: INSTRUCTION_FORMAT31t
 					{
-					INSTRUCTION_FORMAT31t76=(Token)match(input,INSTRUCTION_FORMAT31t,FOLLOW_INSTRUCTION_FORMAT31t_in_simple_name2123);
+					INSTRUCTION_FORMAT31t76=(Token)match(input,INSTRUCTION_FORMAT31t,FOLLOW_INSTRUCTION_FORMAT31t_in_simple_name2123);  
 					stream_INSTRUCTION_FORMAT31t.add(INSTRUCTION_FORMAT31t76);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3500,18 +3500,18 @@
 					}
 					break;
 				case 34 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:571:5: INSTRUCTION_FORMAT35c_METHOD
+					// smaliParser.g:571:5: INSTRUCTION_FORMAT35c_METHOD
 					{
-					INSTRUCTION_FORMAT35c_METHOD77=(Token)match(input,INSTRUCTION_FORMAT35c_METHOD,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_in_simple_name2134);
+					INSTRUCTION_FORMAT35c_METHOD77=(Token)match(input,INSTRUCTION_FORMAT35c_METHOD,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_in_simple_name2134);  
 					stream_INSTRUCTION_FORMAT35c_METHOD.add(INSTRUCTION_FORMAT35c_METHOD77);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3527,18 +3527,18 @@
 					}
 					break;
 				case 35 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:572:5: INSTRUCTION_FORMAT35c_METHOD_ODEX
+					// smaliParser.g:572:5: INSTRUCTION_FORMAT35c_METHOD_ODEX
 					{
-					INSTRUCTION_FORMAT35c_METHOD_ODEX78=(Token)match(input,INSTRUCTION_FORMAT35c_METHOD_ODEX,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_ODEX_in_simple_name2145);
+					INSTRUCTION_FORMAT35c_METHOD_ODEX78=(Token)match(input,INSTRUCTION_FORMAT35c_METHOD_ODEX,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_ODEX_in_simple_name2145);  
 					stream_INSTRUCTION_FORMAT35c_METHOD_ODEX.add(INSTRUCTION_FORMAT35c_METHOD_ODEX78);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3554,18 +3554,18 @@
 					}
 					break;
 				case 36 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:573:5: INSTRUCTION_FORMAT35c_TYPE
+					// smaliParser.g:573:5: INSTRUCTION_FORMAT35c_TYPE
 					{
-					INSTRUCTION_FORMAT35c_TYPE79=(Token)match(input,INSTRUCTION_FORMAT35c_TYPE,FOLLOW_INSTRUCTION_FORMAT35c_TYPE_in_simple_name2156);
+					INSTRUCTION_FORMAT35c_TYPE79=(Token)match(input,INSTRUCTION_FORMAT35c_TYPE,FOLLOW_INSTRUCTION_FORMAT35c_TYPE_in_simple_name2156);  
 					stream_INSTRUCTION_FORMAT35c_TYPE.add(INSTRUCTION_FORMAT35c_TYPE79);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3581,18 +3581,18 @@
 					}
 					break;
 				case 37 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:574:5: INSTRUCTION_FORMAT35mi_METHOD
+					// smaliParser.g:574:5: INSTRUCTION_FORMAT35mi_METHOD
 					{
-					INSTRUCTION_FORMAT35mi_METHOD80=(Token)match(input,INSTRUCTION_FORMAT35mi_METHOD,FOLLOW_INSTRUCTION_FORMAT35mi_METHOD_in_simple_name2167);
+					INSTRUCTION_FORMAT35mi_METHOD80=(Token)match(input,INSTRUCTION_FORMAT35mi_METHOD,FOLLOW_INSTRUCTION_FORMAT35mi_METHOD_in_simple_name2167);  
 					stream_INSTRUCTION_FORMAT35mi_METHOD.add(INSTRUCTION_FORMAT35mi_METHOD80);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3608,18 +3608,18 @@
 					}
 					break;
 				case 38 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:575:5: INSTRUCTION_FORMAT35ms_METHOD
+					// smaliParser.g:575:5: INSTRUCTION_FORMAT35ms_METHOD
 					{
-					INSTRUCTION_FORMAT35ms_METHOD81=(Token)match(input,INSTRUCTION_FORMAT35ms_METHOD,FOLLOW_INSTRUCTION_FORMAT35ms_METHOD_in_simple_name2178);
+					INSTRUCTION_FORMAT35ms_METHOD81=(Token)match(input,INSTRUCTION_FORMAT35ms_METHOD,FOLLOW_INSTRUCTION_FORMAT35ms_METHOD_in_simple_name2178);  
 					stream_INSTRUCTION_FORMAT35ms_METHOD.add(INSTRUCTION_FORMAT35ms_METHOD81);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3635,18 +3635,18 @@
 					}
 					break;
 				case 39 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:576:5: INSTRUCTION_FORMAT45cc_METHOD
+					// smaliParser.g:576:5: INSTRUCTION_FORMAT45cc_METHOD
 					{
-					INSTRUCTION_FORMAT45cc_METHOD82=(Token)match(input,INSTRUCTION_FORMAT45cc_METHOD,FOLLOW_INSTRUCTION_FORMAT45cc_METHOD_in_simple_name2189);
+					INSTRUCTION_FORMAT45cc_METHOD82=(Token)match(input,INSTRUCTION_FORMAT45cc_METHOD,FOLLOW_INSTRUCTION_FORMAT45cc_METHOD_in_simple_name2189);  
 					stream_INSTRUCTION_FORMAT45cc_METHOD.add(INSTRUCTION_FORMAT45cc_METHOD82);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3662,18 +3662,18 @@
 					}
 					break;
 				case 40 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:577:5: INSTRUCTION_FORMAT4rcc_METHOD
+					// smaliParser.g:577:5: INSTRUCTION_FORMAT4rcc_METHOD
 					{
-					INSTRUCTION_FORMAT4rcc_METHOD83=(Token)match(input,INSTRUCTION_FORMAT4rcc_METHOD,FOLLOW_INSTRUCTION_FORMAT4rcc_METHOD_in_simple_name2200);
+					INSTRUCTION_FORMAT4rcc_METHOD83=(Token)match(input,INSTRUCTION_FORMAT4rcc_METHOD,FOLLOW_INSTRUCTION_FORMAT4rcc_METHOD_in_simple_name2200);  
 					stream_INSTRUCTION_FORMAT4rcc_METHOD.add(INSTRUCTION_FORMAT4rcc_METHOD83);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3689,18 +3689,18 @@
 					}
 					break;
 				case 41 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:578:5: INSTRUCTION_FORMAT51l
+					// smaliParser.g:578:5: INSTRUCTION_FORMAT51l
 					{
-					INSTRUCTION_FORMAT51l84=(Token)match(input,INSTRUCTION_FORMAT51l,FOLLOW_INSTRUCTION_FORMAT51l_in_simple_name2211);
+					INSTRUCTION_FORMAT51l84=(Token)match(input,INSTRUCTION_FORMAT51l,FOLLOW_INSTRUCTION_FORMAT51l_in_simple_name2211);  
 					stream_INSTRUCTION_FORMAT51l.add(INSTRUCTION_FORMAT51l84);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3744,7 +3744,7 @@
 
 
 	// $ANTLR start "member_name"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:580:1: member_name : ( simple_name | MEMBER_NAME -> SIMPLE_NAME[$MEMBER_NAME] );
+	// smaliParser.g:580:1: member_name : ( simple_name | MEMBER_NAME -> SIMPLE_NAME[$MEMBER_NAME] );
 	public final smaliParser.member_name_return member_name() throws RecognitionException {
 		smaliParser.member_name_return retval = new smaliParser.member_name_return();
 		retval.start = input.LT(1);
@@ -3758,7 +3758,7 @@
 		RewriteRuleTokenStream stream_MEMBER_NAME=new RewriteRuleTokenStream(adaptor,"token MEMBER_NAME");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:581:3: ( simple_name | MEMBER_NAME -> SIMPLE_NAME[$MEMBER_NAME] )
+			// smaliParser.g:581:3: ( simple_name | MEMBER_NAME -> SIMPLE_NAME[$MEMBER_NAME] )
 			int alt11=2;
 			int LA11_0 = input.LA(1);
 			if ( (LA11_0==ACCESS_SPEC||LA11_0==ANNOTATION_VISIBILITY||LA11_0==BOOL_LITERAL||LA11_0==DOUBLE_LITERAL_OR_ID||LA11_0==FLOAT_LITERAL_OR_ID||(LA11_0 >= INSTRUCTION_FORMAT10t && LA11_0 <= INSTRUCTION_FORMAT10x_ODEX)||LA11_0==INSTRUCTION_FORMAT11x||LA11_0==INSTRUCTION_FORMAT12x_OR_ID||(LA11_0 >= INSTRUCTION_FORMAT21c_FIELD && LA11_0 <= INSTRUCTION_FORMAT21c_TYPE)||LA11_0==INSTRUCTION_FORMAT21t||(LA11_0 >= INSTRUCTION_FORMAT22c_FIELD && LA11_0 <= INSTRUCTION_FORMAT22cs_FIELD)||(LA11_0 >= INSTRUCTION_FORMAT22s_OR_ID && LA11_0 <= INSTRUCTION_FORMAT22t)||LA11_0==INSTRUCTION_FORMAT23x||(LA11_0 >= INSTRUCTION_FORMAT31i_OR_ID && LA11_0 <= INSTRUCTION_FORMAT31t)||(LA11_0 >= INSTRUCTION_FORMAT35c_METHOD && LA11_0 <= INSTRUCTION_FORMAT35ms_METHOD)||(LA11_0 >= INSTRUCTION_FORMAT45cc_METHOD && LA11_0 <= INSTRUCTION_FORMAT51l)||(LA11_0 >= NEGATIVE_INTEGER_LITERAL && LA11_0 <= NULL_LITERAL)||(LA11_0 >= PARAM_LIST_OR_ID_PRIMITIVE_TYPE && LA11_0 <= PRIMITIVE_TYPE)||LA11_0==REGISTER||LA11_0==SIMPLE_NAME||(LA11_0 >= VERIFICATION_ERROR_TYPE && LA11_0 <= VOID_TYPE)) ) {
@@ -3776,7 +3776,7 @@
 
 			switch (alt11) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:581:5: simple_name
+					// smaliParser.g:581:5: simple_name
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -3790,18 +3790,18 @@
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:582:5: MEMBER_NAME
+					// smaliParser.g:582:5: MEMBER_NAME
 					{
-					MEMBER_NAME86=(Token)match(input,MEMBER_NAME,FOLLOW_MEMBER_NAME_in_member_name2232);
+					MEMBER_NAME86=(Token)match(input,MEMBER_NAME,FOLLOW_MEMBER_NAME_in_member_name2232);  
 					stream_MEMBER_NAME.add(MEMBER_NAME86);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -3845,7 +3845,7 @@
 
 
 	// $ANTLR start "method_prototype"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:584:1: method_prototype : OPEN_PAREN param_list CLOSE_PAREN type_descriptor -> ^( I_METHOD_PROTOTYPE[$start, \"I_METHOD_PROTOTYPE\"] ^( I_METHOD_RETURN_TYPE type_descriptor ) ( param_list )? ) ;
+	// smaliParser.g:584:1: method_prototype : OPEN_PAREN param_list CLOSE_PAREN type_descriptor -> ^( I_METHOD_PROTOTYPE[$start, \"I_METHOD_PROTOTYPE\"] ^( I_METHOD_RETURN_TYPE type_descriptor ) ( param_list )? ) ;
 	public final smaliParser.method_prototype_return method_prototype() throws RecognitionException {
 		smaliParser.method_prototype_return retval = new smaliParser.method_prototype_return();
 		retval.start = input.LT(1);
@@ -3865,10 +3865,10 @@
 		RewriteRuleSubtreeStream stream_param_list=new RewriteRuleSubtreeStream(adaptor,"rule param_list");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:585:3: ( OPEN_PAREN param_list CLOSE_PAREN type_descriptor -> ^( I_METHOD_PROTOTYPE[$start, \"I_METHOD_PROTOTYPE\"] ^( I_METHOD_RETURN_TYPE type_descriptor ) ( param_list )? ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:585:5: OPEN_PAREN param_list CLOSE_PAREN type_descriptor
+			// smaliParser.g:585:3: ( OPEN_PAREN param_list CLOSE_PAREN type_descriptor -> ^( I_METHOD_PROTOTYPE[$start, \"I_METHOD_PROTOTYPE\"] ^( I_METHOD_RETURN_TYPE type_descriptor ) ( param_list )? ) )
+			// smaliParser.g:585:5: OPEN_PAREN param_list CLOSE_PAREN type_descriptor
 			{
-			OPEN_PAREN87=(Token)match(input,OPEN_PAREN,FOLLOW_OPEN_PAREN_in_method_prototype2247);
+			OPEN_PAREN87=(Token)match(input,OPEN_PAREN,FOLLOW_OPEN_PAREN_in_method_prototype2247);  
 			stream_OPEN_PAREN.add(OPEN_PAREN87);
 
 			pushFollow(FOLLOW_param_list_in_method_prototype2249);
@@ -3876,7 +3876,7 @@
 			state._fsp--;
 
 			stream_param_list.add(param_list88.getTree());
-			CLOSE_PAREN89=(Token)match(input,CLOSE_PAREN,FOLLOW_CLOSE_PAREN_in_method_prototype2251);
+			CLOSE_PAREN89=(Token)match(input,CLOSE_PAREN,FOLLOW_CLOSE_PAREN_in_method_prototype2251);  
 			stream_CLOSE_PAREN.add(CLOSE_PAREN89);
 
 			pushFollow(FOLLOW_type_descriptor_in_method_prototype2253);
@@ -3885,23 +3885,23 @@
 
 			stream_type_descriptor.add(type_descriptor90.getTree());
 			// AST REWRITE
-			// elements: param_list, type_descriptor
-			// token labels:
+			// elements: type_descriptor, param_list
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 586:5: -> ^( I_METHOD_PROTOTYPE[$start, \"I_METHOD_PROTOTYPE\"] ^( I_METHOD_RETURN_TYPE type_descriptor ) ( param_list )? )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:586:8: ^( I_METHOD_PROTOTYPE[$start, \"I_METHOD_PROTOTYPE\"] ^( I_METHOD_RETURN_TYPE type_descriptor ) ( param_list )? )
+				// smaliParser.g:586:8: ^( I_METHOD_PROTOTYPE[$start, \"I_METHOD_PROTOTYPE\"] ^( I_METHOD_RETURN_TYPE type_descriptor ) ( param_list )? )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_METHOD_PROTOTYPE, (retval.start), "I_METHOD_PROTOTYPE"), root_1);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:586:59: ^( I_METHOD_RETURN_TYPE type_descriptor )
+				// smaliParser.g:586:59: ^( I_METHOD_RETURN_TYPE type_descriptor )
 				{
 				CommonTree root_2 = (CommonTree)adaptor.nil();
 				root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_METHOD_RETURN_TYPE, "I_METHOD_RETURN_TYPE"), root_2);
@@ -3909,7 +3909,7 @@
 				adaptor.addChild(root_1, root_2);
 				}
 
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:586:99: ( param_list )?
+				// smaliParser.g:586:99: ( param_list )?
 				if ( stream_param_list.hasNext() ) {
 					adaptor.addChild(root_1, stream_param_list.nextTree());
 				}
@@ -3952,7 +3952,7 @@
 
 
 	// $ANTLR start "param_list_or_id_primitive_type"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:588:1: param_list_or_id_primitive_type : PARAM_LIST_OR_ID_PRIMITIVE_TYPE -> PRIMITIVE_TYPE[$PARAM_LIST_OR_ID_PRIMITIVE_TYPE] ;
+	// smaliParser.g:588:1: param_list_or_id_primitive_type : PARAM_LIST_OR_ID_PRIMITIVE_TYPE -> PRIMITIVE_TYPE[$PARAM_LIST_OR_ID_PRIMITIVE_TYPE] ;
 	public final smaliParser.param_list_or_id_primitive_type_return param_list_or_id_primitive_type() throws RecognitionException {
 		smaliParser.param_list_or_id_primitive_type_return retval = new smaliParser.param_list_or_id_primitive_type_return();
 		retval.start = input.LT(1);
@@ -3965,19 +3965,19 @@
 		RewriteRuleTokenStream stream_PARAM_LIST_OR_ID_PRIMITIVE_TYPE=new RewriteRuleTokenStream(adaptor,"token PARAM_LIST_OR_ID_PRIMITIVE_TYPE");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:589:3: ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE -> PRIMITIVE_TYPE[$PARAM_LIST_OR_ID_PRIMITIVE_TYPE] )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:589:5: PARAM_LIST_OR_ID_PRIMITIVE_TYPE
+			// smaliParser.g:589:3: ( PARAM_LIST_OR_ID_PRIMITIVE_TYPE -> PRIMITIVE_TYPE[$PARAM_LIST_OR_ID_PRIMITIVE_TYPE] )
+			// smaliParser.g:589:5: PARAM_LIST_OR_ID_PRIMITIVE_TYPE
 			{
-			PARAM_LIST_OR_ID_PRIMITIVE_TYPE91=(Token)match(input,PARAM_LIST_OR_ID_PRIMITIVE_TYPE,FOLLOW_PARAM_LIST_OR_ID_PRIMITIVE_TYPE_in_param_list_or_id_primitive_type2283);
+			PARAM_LIST_OR_ID_PRIMITIVE_TYPE91=(Token)match(input,PARAM_LIST_OR_ID_PRIMITIVE_TYPE,FOLLOW_PARAM_LIST_OR_ID_PRIMITIVE_TYPE_in_param_list_or_id_primitive_type2283);  
 			stream_PARAM_LIST_OR_ID_PRIMITIVE_TYPE.add(PARAM_LIST_OR_ID_PRIMITIVE_TYPE91);
 
 			// AST REWRITE
-			// elements:
-			// token labels:
+			// elements: 
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -4019,7 +4019,7 @@
 
 
 	// $ANTLR start "param_list"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:591:1: param_list : ( ( param_list_or_id_primitive_type )+ | ( nonvoid_type_descriptor )* );
+	// smaliParser.g:591:1: param_list : ( ( param_list_or_id_primitive_type )+ | ( nonvoid_type_descriptor )* );
 	public final smaliParser.param_list_return param_list() throws RecognitionException {
 		smaliParser.param_list_return retval = new smaliParser.param_list_return();
 		retval.start = input.LT(1);
@@ -4031,7 +4031,7 @@
 
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:592:3: ( ( param_list_or_id_primitive_type )+ | ( nonvoid_type_descriptor )* )
+			// smaliParser.g:592:3: ( ( param_list_or_id_primitive_type )+ | ( nonvoid_type_descriptor )* )
 			int alt14=2;
 			int LA14_0 = input.LA(1);
 			if ( (LA14_0==PARAM_LIST_OR_ID_PRIMITIVE_TYPE) ) {
@@ -4049,12 +4049,12 @@
 
 			switch (alt14) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:592:5: ( param_list_or_id_primitive_type )+
+					// smaliParser.g:592:5: ( param_list_or_id_primitive_type )+
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:592:5: ( param_list_or_id_primitive_type )+
+					// smaliParser.g:592:5: ( param_list_or_id_primitive_type )+
 					int cnt12=0;
 					loop12:
 					while (true) {
@@ -4066,7 +4066,7 @@
 
 						switch (alt12) {
 						case 1 :
-							// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:592:5: param_list_or_id_primitive_type
+							// smaliParser.g:592:5: param_list_or_id_primitive_type
 							{
 							pushFollow(FOLLOW_param_list_or_id_primitive_type_in_param_list2298);
 							param_list_or_id_primitive_type92=param_list_or_id_primitive_type();
@@ -4088,12 +4088,12 @@
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:593:5: ( nonvoid_type_descriptor )*
+					// smaliParser.g:593:5: ( nonvoid_type_descriptor )*
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:593:5: ( nonvoid_type_descriptor )*
+					// smaliParser.g:593:5: ( nonvoid_type_descriptor )*
 					loop13:
 					while (true) {
 						int alt13=2;
@@ -4104,7 +4104,7 @@
 
 						switch (alt13) {
 						case 1 :
-							// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:593:5: nonvoid_type_descriptor
+							// smaliParser.g:593:5: nonvoid_type_descriptor
 							{
 							pushFollow(FOLLOW_nonvoid_type_descriptor_in_param_list2305);
 							nonvoid_type_descriptor93=nonvoid_type_descriptor();
@@ -4151,7 +4151,7 @@
 
 
 	// $ANTLR start "array_descriptor"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:595:1: array_descriptor : ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) ;
+	// smaliParser.g:595:1: array_descriptor : ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) ;
 	public final smaliParser.array_descriptor_return array_descriptor() throws RecognitionException {
 		smaliParser.array_descriptor_return retval = new smaliParser.array_descriptor_return();
 		retval.start = input.LT(1);
@@ -4165,13 +4165,13 @@
 		CommonTree set95_tree=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:596:3: ( ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:596:5: ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR )
+			// smaliParser.g:596:3: ( ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) )
+			// smaliParser.g:596:5: ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR )
 			{
 			root_0 = (CommonTree)adaptor.nil();
 
 
-			ARRAY_TYPE_PREFIX94=(Token)match(input,ARRAY_TYPE_PREFIX,FOLLOW_ARRAY_TYPE_PREFIX_in_array_descriptor2316);
+			ARRAY_TYPE_PREFIX94=(Token)match(input,ARRAY_TYPE_PREFIX,FOLLOW_ARRAY_TYPE_PREFIX_in_array_descriptor2316); 
 			ARRAY_TYPE_PREFIX94_tree = (CommonTree)adaptor.create(ARRAY_TYPE_PREFIX94);
 			adaptor.addChild(root_0, ARRAY_TYPE_PREFIX94_tree);
 
@@ -4214,7 +4214,7 @@
 
 
 	// $ANTLR start "type_descriptor"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:598:1: type_descriptor : ( VOID_TYPE | PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor );
+	// smaliParser.g:598:1: type_descriptor : ( VOID_TYPE | PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor );
 	public final smaliParser.type_descriptor_return type_descriptor() throws RecognitionException {
 		smaliParser.type_descriptor_return retval = new smaliParser.type_descriptor_return();
 		retval.start = input.LT(1);
@@ -4231,7 +4231,7 @@
 		CommonTree CLASS_DESCRIPTOR98_tree=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:599:3: ( VOID_TYPE | PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor )
+			// smaliParser.g:599:3: ( VOID_TYPE | PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor )
 			int alt15=4;
 			switch ( input.LA(1) ) {
 			case VOID_TYPE:
@@ -4261,43 +4261,43 @@
 			}
 			switch (alt15) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:599:5: VOID_TYPE
+					// smaliParser.g:599:5: VOID_TYPE
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					VOID_TYPE96=(Token)match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_type_descriptor2334);
+					VOID_TYPE96=(Token)match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_type_descriptor2334); 
 					VOID_TYPE96_tree = (CommonTree)adaptor.create(VOID_TYPE96);
 					adaptor.addChild(root_0, VOID_TYPE96_tree);
 
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:600:5: PRIMITIVE_TYPE
+					// smaliParser.g:600:5: PRIMITIVE_TYPE
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					PRIMITIVE_TYPE97=(Token)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_type_descriptor2340);
+					PRIMITIVE_TYPE97=(Token)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_type_descriptor2340); 
 					PRIMITIVE_TYPE97_tree = (CommonTree)adaptor.create(PRIMITIVE_TYPE97);
 					adaptor.addChild(root_0, PRIMITIVE_TYPE97_tree);
 
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:601:5: CLASS_DESCRIPTOR
+					// smaliParser.g:601:5: CLASS_DESCRIPTOR
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					CLASS_DESCRIPTOR98=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_type_descriptor2346);
+					CLASS_DESCRIPTOR98=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_type_descriptor2346); 
 					CLASS_DESCRIPTOR98_tree = (CommonTree)adaptor.create(CLASS_DESCRIPTOR98);
 					adaptor.addChild(root_0, CLASS_DESCRIPTOR98_tree);
 
 					}
 					break;
 				case 4 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:602:5: array_descriptor
+					// smaliParser.g:602:5: array_descriptor
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -4339,7 +4339,7 @@
 
 
 	// $ANTLR start "nonvoid_type_descriptor"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:604:1: nonvoid_type_descriptor : ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor );
+	// smaliParser.g:604:1: nonvoid_type_descriptor : ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor );
 	public final smaliParser.nonvoid_type_descriptor_return nonvoid_type_descriptor() throws RecognitionException {
 		smaliParser.nonvoid_type_descriptor_return retval = new smaliParser.nonvoid_type_descriptor_return();
 		retval.start = input.LT(1);
@@ -4354,7 +4354,7 @@
 		CommonTree CLASS_DESCRIPTOR101_tree=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:605:3: ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor )
+			// smaliParser.g:605:3: ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor )
 			int alt16=3;
 			switch ( input.LA(1) ) {
 			case PRIMITIVE_TYPE:
@@ -4379,31 +4379,31 @@
 			}
 			switch (alt16) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:605:5: PRIMITIVE_TYPE
+					// smaliParser.g:605:5: PRIMITIVE_TYPE
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					PRIMITIVE_TYPE100=(Token)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_nonvoid_type_descriptor2362);
+					PRIMITIVE_TYPE100=(Token)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_nonvoid_type_descriptor2362); 
 					PRIMITIVE_TYPE100_tree = (CommonTree)adaptor.create(PRIMITIVE_TYPE100);
 					adaptor.addChild(root_0, PRIMITIVE_TYPE100_tree);
 
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:606:5: CLASS_DESCRIPTOR
+					// smaliParser.g:606:5: CLASS_DESCRIPTOR
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					CLASS_DESCRIPTOR101=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_nonvoid_type_descriptor2368);
+					CLASS_DESCRIPTOR101=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_nonvoid_type_descriptor2368); 
 					CLASS_DESCRIPTOR101_tree = (CommonTree)adaptor.create(CLASS_DESCRIPTOR101);
 					adaptor.addChild(root_0, CLASS_DESCRIPTOR101_tree);
 
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:607:5: array_descriptor
+					// smaliParser.g:607:5: array_descriptor
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -4445,7 +4445,7 @@
 
 
 	// $ANTLR start "reference_type_descriptor"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:609:1: reference_type_descriptor : ( CLASS_DESCRIPTOR | array_descriptor );
+	// smaliParser.g:609:1: reference_type_descriptor : ( CLASS_DESCRIPTOR | array_descriptor );
 	public final smaliParser.reference_type_descriptor_return reference_type_descriptor() throws RecognitionException {
 		smaliParser.reference_type_descriptor_return retval = new smaliParser.reference_type_descriptor_return();
 		retval.start = input.LT(1);
@@ -4458,7 +4458,7 @@
 		CommonTree CLASS_DESCRIPTOR103_tree=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:610:3: ( CLASS_DESCRIPTOR | array_descriptor )
+			// smaliParser.g:610:3: ( CLASS_DESCRIPTOR | array_descriptor )
 			int alt17=2;
 			int LA17_0 = input.LA(1);
 			if ( (LA17_0==CLASS_DESCRIPTOR) ) {
@@ -4476,19 +4476,19 @@
 
 			switch (alt17) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:610:5: CLASS_DESCRIPTOR
+					// smaliParser.g:610:5: CLASS_DESCRIPTOR
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					CLASS_DESCRIPTOR103=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_reference_type_descriptor2384);
+					CLASS_DESCRIPTOR103=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_reference_type_descriptor2384); 
 					CLASS_DESCRIPTOR103_tree = (CommonTree)adaptor.create(CLASS_DESCRIPTOR103);
 					adaptor.addChild(root_0, CLASS_DESCRIPTOR103_tree);
 
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:611:5: array_descriptor
+					// smaliParser.g:611:5: array_descriptor
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -4530,7 +4530,7 @@
 
 
 	// $ANTLR start "integer_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:613:1: integer_literal : ( POSITIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$POSITIVE_INTEGER_LITERAL] | NEGATIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$NEGATIVE_INTEGER_LITERAL] );
+	// smaliParser.g:613:1: integer_literal : ( POSITIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$POSITIVE_INTEGER_LITERAL] | NEGATIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$NEGATIVE_INTEGER_LITERAL] );
 	public final smaliParser.integer_literal_return integer_literal() throws RecognitionException {
 		smaliParser.integer_literal_return retval = new smaliParser.integer_literal_return();
 		retval.start = input.LT(1);
@@ -4546,7 +4546,7 @@
 		RewriteRuleTokenStream stream_POSITIVE_INTEGER_LITERAL=new RewriteRuleTokenStream(adaptor,"token POSITIVE_INTEGER_LITERAL");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:614:3: ( POSITIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$POSITIVE_INTEGER_LITERAL] | NEGATIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$NEGATIVE_INTEGER_LITERAL] )
+			// smaliParser.g:614:3: ( POSITIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$POSITIVE_INTEGER_LITERAL] | NEGATIVE_INTEGER_LITERAL -> INTEGER_LITERAL[$NEGATIVE_INTEGER_LITERAL] )
 			int alt18=2;
 			int LA18_0 = input.LA(1);
 			if ( (LA18_0==POSITIVE_INTEGER_LITERAL) ) {
@@ -4564,18 +4564,18 @@
 
 			switch (alt18) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:614:5: POSITIVE_INTEGER_LITERAL
+					// smaliParser.g:614:5: POSITIVE_INTEGER_LITERAL
 					{
-					POSITIVE_INTEGER_LITERAL105=(Token)match(input,POSITIVE_INTEGER_LITERAL,FOLLOW_POSITIVE_INTEGER_LITERAL_in_integer_literal2400);
+					POSITIVE_INTEGER_LITERAL105=(Token)match(input,POSITIVE_INTEGER_LITERAL,FOLLOW_POSITIVE_INTEGER_LITERAL_in_integer_literal2400);  
 					stream_POSITIVE_INTEGER_LITERAL.add(POSITIVE_INTEGER_LITERAL105);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -4591,18 +4591,18 @@
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:615:5: NEGATIVE_INTEGER_LITERAL
+					// smaliParser.g:615:5: NEGATIVE_INTEGER_LITERAL
 					{
-					NEGATIVE_INTEGER_LITERAL106=(Token)match(input,NEGATIVE_INTEGER_LITERAL,FOLLOW_NEGATIVE_INTEGER_LITERAL_in_integer_literal2411);
+					NEGATIVE_INTEGER_LITERAL106=(Token)match(input,NEGATIVE_INTEGER_LITERAL,FOLLOW_NEGATIVE_INTEGER_LITERAL_in_integer_literal2411);  
 					stream_NEGATIVE_INTEGER_LITERAL.add(NEGATIVE_INTEGER_LITERAL106);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -4646,7 +4646,7 @@
 
 
 	// $ANTLR start "float_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:617:1: float_literal : ( FLOAT_LITERAL_OR_ID -> FLOAT_LITERAL[$FLOAT_LITERAL_OR_ID] | FLOAT_LITERAL );
+	// smaliParser.g:617:1: float_literal : ( FLOAT_LITERAL_OR_ID -> FLOAT_LITERAL[$FLOAT_LITERAL_OR_ID] | FLOAT_LITERAL );
 	public final smaliParser.float_literal_return float_literal() throws RecognitionException {
 		smaliParser.float_literal_return retval = new smaliParser.float_literal_return();
 		retval.start = input.LT(1);
@@ -4661,7 +4661,7 @@
 		RewriteRuleTokenStream stream_FLOAT_LITERAL_OR_ID=new RewriteRuleTokenStream(adaptor,"token FLOAT_LITERAL_OR_ID");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:618:3: ( FLOAT_LITERAL_OR_ID -> FLOAT_LITERAL[$FLOAT_LITERAL_OR_ID] | FLOAT_LITERAL )
+			// smaliParser.g:618:3: ( FLOAT_LITERAL_OR_ID -> FLOAT_LITERAL[$FLOAT_LITERAL_OR_ID] | FLOAT_LITERAL )
 			int alt19=2;
 			int LA19_0 = input.LA(1);
 			if ( (LA19_0==FLOAT_LITERAL_OR_ID) ) {
@@ -4679,18 +4679,18 @@
 
 			switch (alt19) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:618:5: FLOAT_LITERAL_OR_ID
+					// smaliParser.g:618:5: FLOAT_LITERAL_OR_ID
 					{
-					FLOAT_LITERAL_OR_ID107=(Token)match(input,FLOAT_LITERAL_OR_ID,FOLLOW_FLOAT_LITERAL_OR_ID_in_float_literal2426);
+					FLOAT_LITERAL_OR_ID107=(Token)match(input,FLOAT_LITERAL_OR_ID,FOLLOW_FLOAT_LITERAL_OR_ID_in_float_literal2426);  
 					stream_FLOAT_LITERAL_OR_ID.add(FLOAT_LITERAL_OR_ID107);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -4706,12 +4706,12 @@
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:619:5: FLOAT_LITERAL
+					// smaliParser.g:619:5: FLOAT_LITERAL
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					FLOAT_LITERAL108=(Token)match(input,FLOAT_LITERAL,FOLLOW_FLOAT_LITERAL_in_float_literal2437);
+					FLOAT_LITERAL108=(Token)match(input,FLOAT_LITERAL,FOLLOW_FLOAT_LITERAL_in_float_literal2437); 
 					FLOAT_LITERAL108_tree = (CommonTree)adaptor.create(FLOAT_LITERAL108);
 					adaptor.addChild(root_0, FLOAT_LITERAL108_tree);
 
@@ -4746,7 +4746,7 @@
 
 
 	// $ANTLR start "double_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:621:1: double_literal : ( DOUBLE_LITERAL_OR_ID -> DOUBLE_LITERAL[$DOUBLE_LITERAL_OR_ID] | DOUBLE_LITERAL );
+	// smaliParser.g:621:1: double_literal : ( DOUBLE_LITERAL_OR_ID -> DOUBLE_LITERAL[$DOUBLE_LITERAL_OR_ID] | DOUBLE_LITERAL );
 	public final smaliParser.double_literal_return double_literal() throws RecognitionException {
 		smaliParser.double_literal_return retval = new smaliParser.double_literal_return();
 		retval.start = input.LT(1);
@@ -4761,7 +4761,7 @@
 		RewriteRuleTokenStream stream_DOUBLE_LITERAL_OR_ID=new RewriteRuleTokenStream(adaptor,"token DOUBLE_LITERAL_OR_ID");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:622:3: ( DOUBLE_LITERAL_OR_ID -> DOUBLE_LITERAL[$DOUBLE_LITERAL_OR_ID] | DOUBLE_LITERAL )
+			// smaliParser.g:622:3: ( DOUBLE_LITERAL_OR_ID -> DOUBLE_LITERAL[$DOUBLE_LITERAL_OR_ID] | DOUBLE_LITERAL )
 			int alt20=2;
 			int LA20_0 = input.LA(1);
 			if ( (LA20_0==DOUBLE_LITERAL_OR_ID) ) {
@@ -4779,18 +4779,18 @@
 
 			switch (alt20) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:622:5: DOUBLE_LITERAL_OR_ID
+					// smaliParser.g:622:5: DOUBLE_LITERAL_OR_ID
 					{
-					DOUBLE_LITERAL_OR_ID109=(Token)match(input,DOUBLE_LITERAL_OR_ID,FOLLOW_DOUBLE_LITERAL_OR_ID_in_double_literal2447);
+					DOUBLE_LITERAL_OR_ID109=(Token)match(input,DOUBLE_LITERAL_OR_ID,FOLLOW_DOUBLE_LITERAL_OR_ID_in_double_literal2447);  
 					stream_DOUBLE_LITERAL_OR_ID.add(DOUBLE_LITERAL_OR_ID109);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -4806,12 +4806,12 @@
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:623:5: DOUBLE_LITERAL
+					// smaliParser.g:623:5: DOUBLE_LITERAL
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					DOUBLE_LITERAL110=(Token)match(input,DOUBLE_LITERAL,FOLLOW_DOUBLE_LITERAL_in_double_literal2458);
+					DOUBLE_LITERAL110=(Token)match(input,DOUBLE_LITERAL,FOLLOW_DOUBLE_LITERAL_in_double_literal2458); 
 					DOUBLE_LITERAL110_tree = (CommonTree)adaptor.create(DOUBLE_LITERAL110);
 					adaptor.addChild(root_0, DOUBLE_LITERAL110_tree);
 
@@ -4846,7 +4846,7 @@
 
 
 	// $ANTLR start "literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:625:1: literal : ( LONG_LITERAL | integer_literal | SHORT_LITERAL | BYTE_LITERAL | float_literal | double_literal | CHAR_LITERAL | STRING_LITERAL | BOOL_LITERAL | NULL_LITERAL | array_literal | subannotation | type_field_method_literal | enum_literal );
+	// smaliParser.g:625:1: literal : ( LONG_LITERAL | integer_literal | SHORT_LITERAL | BYTE_LITERAL | float_literal | double_literal | CHAR_LITERAL | STRING_LITERAL | BOOL_LITERAL | NULL_LITERAL | array_literal | subannotation | type_field_method_literal | enum_literal );
 	public final smaliParser.literal_return literal() throws RecognitionException {
 		smaliParser.literal_return retval = new smaliParser.literal_return();
 		retval.start = input.LT(1);
@@ -4877,7 +4877,7 @@
 		CommonTree NULL_LITERAL120_tree=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:626:3: ( LONG_LITERAL | integer_literal | SHORT_LITERAL | BYTE_LITERAL | float_literal | double_literal | CHAR_LITERAL | STRING_LITERAL | BOOL_LITERAL | NULL_LITERAL | array_literal | subannotation | type_field_method_literal | enum_literal )
+			// smaliParser.g:626:3: ( LONG_LITERAL | integer_literal | SHORT_LITERAL | BYTE_LITERAL | float_literal | double_literal | CHAR_LITERAL | STRING_LITERAL | BOOL_LITERAL | NULL_LITERAL | array_literal | subannotation | type_field_method_literal | enum_literal )
 			int alt21=14;
 			switch ( input.LA(1) ) {
 			case LONG_LITERAL:
@@ -5123,19 +5123,19 @@
 			}
 			switch (alt21) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:626:5: LONG_LITERAL
+					// smaliParser.g:626:5: LONG_LITERAL
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					LONG_LITERAL111=(Token)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_literal2468);
+					LONG_LITERAL111=(Token)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_literal2468); 
 					LONG_LITERAL111_tree = (CommonTree)adaptor.create(LONG_LITERAL111);
 					adaptor.addChild(root_0, LONG_LITERAL111_tree);
 
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:627:5: integer_literal
+					// smaliParser.g:627:5: integer_literal
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -5149,31 +5149,31 @@
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:628:5: SHORT_LITERAL
+					// smaliParser.g:628:5: SHORT_LITERAL
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					SHORT_LITERAL113=(Token)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_literal2480);
+					SHORT_LITERAL113=(Token)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_literal2480); 
 					SHORT_LITERAL113_tree = (CommonTree)adaptor.create(SHORT_LITERAL113);
 					adaptor.addChild(root_0, SHORT_LITERAL113_tree);
 
 					}
 					break;
 				case 4 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:629:5: BYTE_LITERAL
+					// smaliParser.g:629:5: BYTE_LITERAL
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					BYTE_LITERAL114=(Token)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_literal2486);
+					BYTE_LITERAL114=(Token)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_literal2486); 
 					BYTE_LITERAL114_tree = (CommonTree)adaptor.create(BYTE_LITERAL114);
 					adaptor.addChild(root_0, BYTE_LITERAL114_tree);
 
 					}
 					break;
 				case 5 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:630:5: float_literal
+					// smaliParser.g:630:5: float_literal
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -5187,7 +5187,7 @@
 					}
 					break;
 				case 6 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:631:5: double_literal
+					// smaliParser.g:631:5: double_literal
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -5201,55 +5201,55 @@
 					}
 					break;
 				case 7 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:632:5: CHAR_LITERAL
+					// smaliParser.g:632:5: CHAR_LITERAL
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					CHAR_LITERAL117=(Token)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_literal2504);
+					CHAR_LITERAL117=(Token)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_literal2504); 
 					CHAR_LITERAL117_tree = (CommonTree)adaptor.create(CHAR_LITERAL117);
 					adaptor.addChild(root_0, CHAR_LITERAL117_tree);
 
 					}
 					break;
 				case 8 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:633:5: STRING_LITERAL
+					// smaliParser.g:633:5: STRING_LITERAL
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					STRING_LITERAL118=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_literal2510);
+					STRING_LITERAL118=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_literal2510); 
 					STRING_LITERAL118_tree = (CommonTree)adaptor.create(STRING_LITERAL118);
 					adaptor.addChild(root_0, STRING_LITERAL118_tree);
 
 					}
 					break;
 				case 9 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:634:5: BOOL_LITERAL
+					// smaliParser.g:634:5: BOOL_LITERAL
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					BOOL_LITERAL119=(Token)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_literal2516);
+					BOOL_LITERAL119=(Token)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_literal2516); 
 					BOOL_LITERAL119_tree = (CommonTree)adaptor.create(BOOL_LITERAL119);
 					adaptor.addChild(root_0, BOOL_LITERAL119_tree);
 
 					}
 					break;
 				case 10 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:635:5: NULL_LITERAL
+					// smaliParser.g:635:5: NULL_LITERAL
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					NULL_LITERAL120=(Token)match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_literal2522);
+					NULL_LITERAL120=(Token)match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_literal2522); 
 					NULL_LITERAL120_tree = (CommonTree)adaptor.create(NULL_LITERAL120);
 					adaptor.addChild(root_0, NULL_LITERAL120_tree);
 
 					}
 					break;
 				case 11 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:636:5: array_literal
+					// smaliParser.g:636:5: array_literal
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -5263,7 +5263,7 @@
 					}
 					break;
 				case 12 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:637:5: subannotation
+					// smaliParser.g:637:5: subannotation
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -5277,7 +5277,7 @@
 					}
 					break;
 				case 13 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:638:5: type_field_method_literal
+					// smaliParser.g:638:5: type_field_method_literal
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -5291,7 +5291,7 @@
 					}
 					break;
 				case 14 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:639:5: enum_literal
+					// smaliParser.g:639:5: enum_literal
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -5334,7 +5334,7 @@
 
 
 	// $ANTLR start "parsed_integer_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:641:1: parsed_integer_literal returns [int value] : integer_literal ;
+	// smaliParser.g:641:1: parsed_integer_literal returns [int value] : integer_literal ;
 	public final smaliParser.parsed_integer_literal_return parsed_integer_literal() throws RecognitionException {
 		smaliParser.parsed_integer_literal_return retval = new smaliParser.parsed_integer_literal_return();
 		retval.start = input.LT(1);
@@ -5345,8 +5345,8 @@
 
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:642:3: ( integer_literal )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:642:5: integer_literal
+			// smaliParser.g:642:3: ( integer_literal )
+			// smaliParser.g:642:5: integer_literal
 			{
 			root_0 = (CommonTree)adaptor.nil();
 
@@ -5357,7 +5357,7 @@
 
 			adaptor.addChild(root_0, integer_literal125.getTree());
 
-			 retval.value = LiteralTools.parseInt((integer_literal125!=null?input.toString(integer_literal125.start,integer_literal125.stop):null));
+			 retval.value = LiteralTools.parseInt((integer_literal125!=null?input.toString(integer_literal125.start,integer_literal125.stop):null)); 
 			}
 
 			retval.stop = input.LT(-1);
@@ -5387,7 +5387,7 @@
 
 
 	// $ANTLR start "integral_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:644:1: integral_literal : ( LONG_LITERAL | integer_literal | SHORT_LITERAL | CHAR_LITERAL | BYTE_LITERAL );
+	// smaliParser.g:644:1: integral_literal : ( LONG_LITERAL | integer_literal | SHORT_LITERAL | CHAR_LITERAL | BYTE_LITERAL );
 	public final smaliParser.integral_literal_return integral_literal() throws RecognitionException {
 		smaliParser.integral_literal_return retval = new smaliParser.integral_literal_return();
 		retval.start = input.LT(1);
@@ -5406,7 +5406,7 @@
 		CommonTree BYTE_LITERAL130_tree=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:645:3: ( LONG_LITERAL | integer_literal | SHORT_LITERAL | CHAR_LITERAL | BYTE_LITERAL )
+			// smaliParser.g:645:3: ( LONG_LITERAL | integer_literal | SHORT_LITERAL | CHAR_LITERAL | BYTE_LITERAL )
 			int alt22=5;
 			switch ( input.LA(1) ) {
 			case LONG_LITERAL:
@@ -5442,19 +5442,19 @@
 			}
 			switch (alt22) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:645:5: LONG_LITERAL
+					// smaliParser.g:645:5: LONG_LITERAL
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					LONG_LITERAL126=(Token)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_integral_literal2571);
+					LONG_LITERAL126=(Token)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_integral_literal2571); 
 					LONG_LITERAL126_tree = (CommonTree)adaptor.create(LONG_LITERAL126);
 					adaptor.addChild(root_0, LONG_LITERAL126_tree);
 
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:646:5: integer_literal
+					// smaliParser.g:646:5: integer_literal
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -5468,36 +5468,36 @@
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:647:5: SHORT_LITERAL
+					// smaliParser.g:647:5: SHORT_LITERAL
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					SHORT_LITERAL128=(Token)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_integral_literal2583);
+					SHORT_LITERAL128=(Token)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_integral_literal2583); 
 					SHORT_LITERAL128_tree = (CommonTree)adaptor.create(SHORT_LITERAL128);
 					adaptor.addChild(root_0, SHORT_LITERAL128_tree);
 
 					}
 					break;
 				case 4 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:648:5: CHAR_LITERAL
+					// smaliParser.g:648:5: CHAR_LITERAL
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					CHAR_LITERAL129=(Token)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_integral_literal2589);
+					CHAR_LITERAL129=(Token)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_integral_literal2589); 
 					CHAR_LITERAL129_tree = (CommonTree)adaptor.create(CHAR_LITERAL129);
 					adaptor.addChild(root_0, CHAR_LITERAL129_tree);
 
 					}
 					break;
 				case 5 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:649:5: BYTE_LITERAL
+					// smaliParser.g:649:5: BYTE_LITERAL
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					BYTE_LITERAL130=(Token)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_integral_literal2595);
+					BYTE_LITERAL130=(Token)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_integral_literal2595); 
 					BYTE_LITERAL130_tree = (CommonTree)adaptor.create(BYTE_LITERAL130);
 					adaptor.addChild(root_0, BYTE_LITERAL130_tree);
 
@@ -5532,7 +5532,7 @@
 
 
 	// $ANTLR start "fixed_32bit_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:651:1: fixed_32bit_literal : ( LONG_LITERAL | integer_literal | SHORT_LITERAL | BYTE_LITERAL | float_literal | CHAR_LITERAL | BOOL_LITERAL );
+	// smaliParser.g:651:1: fixed_32bit_literal : ( LONG_LITERAL | integer_literal | SHORT_LITERAL | BYTE_LITERAL | float_literal | CHAR_LITERAL | BOOL_LITERAL );
 	public final smaliParser.fixed_32bit_literal_return fixed_32bit_literal() throws RecognitionException {
 		smaliParser.fixed_32bit_literal_return retval = new smaliParser.fixed_32bit_literal_return();
 		retval.start = input.LT(1);
@@ -5554,7 +5554,7 @@
 		CommonTree BOOL_LITERAL137_tree=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:652:3: ( LONG_LITERAL | integer_literal | SHORT_LITERAL | BYTE_LITERAL | float_literal | CHAR_LITERAL | BOOL_LITERAL )
+			// smaliParser.g:652:3: ( LONG_LITERAL | integer_literal | SHORT_LITERAL | BYTE_LITERAL | float_literal | CHAR_LITERAL | BOOL_LITERAL )
 			int alt23=7;
 			switch ( input.LA(1) ) {
 			case LONG_LITERAL:
@@ -5601,19 +5601,19 @@
 			}
 			switch (alt23) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:652:5: LONG_LITERAL
+					// smaliParser.g:652:5: LONG_LITERAL
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					LONG_LITERAL131=(Token)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_fixed_32bit_literal2605);
+					LONG_LITERAL131=(Token)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_fixed_32bit_literal2605); 
 					LONG_LITERAL131_tree = (CommonTree)adaptor.create(LONG_LITERAL131);
 					adaptor.addChild(root_0, LONG_LITERAL131_tree);
 
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:653:5: integer_literal
+					// smaliParser.g:653:5: integer_literal
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -5627,31 +5627,31 @@
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:654:5: SHORT_LITERAL
+					// smaliParser.g:654:5: SHORT_LITERAL
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					SHORT_LITERAL133=(Token)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_fixed_32bit_literal2617);
+					SHORT_LITERAL133=(Token)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_fixed_32bit_literal2617); 
 					SHORT_LITERAL133_tree = (CommonTree)adaptor.create(SHORT_LITERAL133);
 					adaptor.addChild(root_0, SHORT_LITERAL133_tree);
 
 					}
 					break;
 				case 4 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:655:5: BYTE_LITERAL
+					// smaliParser.g:655:5: BYTE_LITERAL
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					BYTE_LITERAL134=(Token)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_fixed_32bit_literal2623);
+					BYTE_LITERAL134=(Token)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_fixed_32bit_literal2623); 
 					BYTE_LITERAL134_tree = (CommonTree)adaptor.create(BYTE_LITERAL134);
 					adaptor.addChild(root_0, BYTE_LITERAL134_tree);
 
 					}
 					break;
 				case 5 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:656:5: float_literal
+					// smaliParser.g:656:5: float_literal
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -5665,24 +5665,24 @@
 					}
 					break;
 				case 6 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:657:5: CHAR_LITERAL
+					// smaliParser.g:657:5: CHAR_LITERAL
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					CHAR_LITERAL136=(Token)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_fixed_32bit_literal2635);
+					CHAR_LITERAL136=(Token)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_fixed_32bit_literal2635); 
 					CHAR_LITERAL136_tree = (CommonTree)adaptor.create(CHAR_LITERAL136);
 					adaptor.addChild(root_0, CHAR_LITERAL136_tree);
 
 					}
 					break;
 				case 7 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:658:5: BOOL_LITERAL
+					// smaliParser.g:658:5: BOOL_LITERAL
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					BOOL_LITERAL137=(Token)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_fixed_32bit_literal2641);
+					BOOL_LITERAL137=(Token)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_fixed_32bit_literal2641); 
 					BOOL_LITERAL137_tree = (CommonTree)adaptor.create(BOOL_LITERAL137);
 					adaptor.addChild(root_0, BOOL_LITERAL137_tree);
 
@@ -5717,7 +5717,7 @@
 
 
 	// $ANTLR start "fixed_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:660:1: fixed_literal : ( integer_literal | LONG_LITERAL | SHORT_LITERAL | BYTE_LITERAL | float_literal | double_literal | CHAR_LITERAL | BOOL_LITERAL );
+	// smaliParser.g:660:1: fixed_literal : ( integer_literal | LONG_LITERAL | SHORT_LITERAL | BYTE_LITERAL | float_literal | double_literal | CHAR_LITERAL | BOOL_LITERAL );
 	public final smaliParser.fixed_literal_return fixed_literal() throws RecognitionException {
 		smaliParser.fixed_literal_return retval = new smaliParser.fixed_literal_return();
 		retval.start = input.LT(1);
@@ -5740,7 +5740,7 @@
 		CommonTree BOOL_LITERAL145_tree=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:661:3: ( integer_literal | LONG_LITERAL | SHORT_LITERAL | BYTE_LITERAL | float_literal | double_literal | CHAR_LITERAL | BOOL_LITERAL )
+			// smaliParser.g:661:3: ( integer_literal | LONG_LITERAL | SHORT_LITERAL | BYTE_LITERAL | float_literal | double_literal | CHAR_LITERAL | BOOL_LITERAL )
 			int alt24=8;
 			switch ( input.LA(1) ) {
 			case NEGATIVE_INTEGER_LITERAL:
@@ -5793,7 +5793,7 @@
 			}
 			switch (alt24) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:661:5: integer_literal
+					// smaliParser.g:661:5: integer_literal
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -5807,43 +5807,43 @@
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:662:5: LONG_LITERAL
+					// smaliParser.g:662:5: LONG_LITERAL
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					LONG_LITERAL139=(Token)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_fixed_literal2657);
+					LONG_LITERAL139=(Token)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_fixed_literal2657); 
 					LONG_LITERAL139_tree = (CommonTree)adaptor.create(LONG_LITERAL139);
 					adaptor.addChild(root_0, LONG_LITERAL139_tree);
 
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:663:5: SHORT_LITERAL
+					// smaliParser.g:663:5: SHORT_LITERAL
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					SHORT_LITERAL140=(Token)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_fixed_literal2663);
+					SHORT_LITERAL140=(Token)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_fixed_literal2663); 
 					SHORT_LITERAL140_tree = (CommonTree)adaptor.create(SHORT_LITERAL140);
 					adaptor.addChild(root_0, SHORT_LITERAL140_tree);
 
 					}
 					break;
 				case 4 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:664:5: BYTE_LITERAL
+					// smaliParser.g:664:5: BYTE_LITERAL
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					BYTE_LITERAL141=(Token)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_fixed_literal2669);
+					BYTE_LITERAL141=(Token)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_fixed_literal2669); 
 					BYTE_LITERAL141_tree = (CommonTree)adaptor.create(BYTE_LITERAL141);
 					adaptor.addChild(root_0, BYTE_LITERAL141_tree);
 
 					}
 					break;
 				case 5 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:665:5: float_literal
+					// smaliParser.g:665:5: float_literal
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -5857,7 +5857,7 @@
 					}
 					break;
 				case 6 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:666:5: double_literal
+					// smaliParser.g:666:5: double_literal
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -5871,24 +5871,24 @@
 					}
 					break;
 				case 7 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:667:5: CHAR_LITERAL
+					// smaliParser.g:667:5: CHAR_LITERAL
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					CHAR_LITERAL144=(Token)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_fixed_literal2687);
+					CHAR_LITERAL144=(Token)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_fixed_literal2687); 
 					CHAR_LITERAL144_tree = (CommonTree)adaptor.create(CHAR_LITERAL144);
 					adaptor.addChild(root_0, CHAR_LITERAL144_tree);
 
 					}
 					break;
 				case 8 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:668:5: BOOL_LITERAL
+					// smaliParser.g:668:5: BOOL_LITERAL
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					BOOL_LITERAL145=(Token)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_fixed_literal2693);
+					BOOL_LITERAL145=(Token)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_fixed_literal2693); 
 					BOOL_LITERAL145_tree = (CommonTree)adaptor.create(BOOL_LITERAL145);
 					adaptor.addChild(root_0, BOOL_LITERAL145_tree);
 
@@ -5923,7 +5923,7 @@
 
 
 	// $ANTLR start "array_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:670:1: array_literal : OPEN_BRACE ( literal ( COMMA literal )* |) CLOSE_BRACE -> ^( I_ENCODED_ARRAY[$start, \"I_ENCODED_ARRAY\"] ( literal )* ) ;
+	// smaliParser.g:670:1: array_literal : OPEN_BRACE ( literal ( COMMA literal )* |) CLOSE_BRACE -> ^( I_ENCODED_ARRAY[$start, \"I_ENCODED_ARRAY\"] ( literal )* ) ;
 	public final smaliParser.array_literal_return array_literal() throws RecognitionException {
 		smaliParser.array_literal_return retval = new smaliParser.array_literal_return();
 		retval.start = input.LT(1);
@@ -5945,13 +5945,13 @@
 		RewriteRuleSubtreeStream stream_literal=new RewriteRuleSubtreeStream(adaptor,"rule literal");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:671:3: ( OPEN_BRACE ( literal ( COMMA literal )* |) CLOSE_BRACE -> ^( I_ENCODED_ARRAY[$start, \"I_ENCODED_ARRAY\"] ( literal )* ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:671:5: OPEN_BRACE ( literal ( COMMA literal )* |) CLOSE_BRACE
+			// smaliParser.g:671:3: ( OPEN_BRACE ( literal ( COMMA literal )* |) CLOSE_BRACE -> ^( I_ENCODED_ARRAY[$start, \"I_ENCODED_ARRAY\"] ( literal )* ) )
+			// smaliParser.g:671:5: OPEN_BRACE ( literal ( COMMA literal )* |) CLOSE_BRACE
 			{
-			OPEN_BRACE146=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_array_literal2703);
+			OPEN_BRACE146=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_array_literal2703);  
 			stream_OPEN_BRACE.add(OPEN_BRACE146);
 
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:671:16: ( literal ( COMMA literal )* |)
+			// smaliParser.g:671:16: ( literal ( COMMA literal )* |)
 			int alt26=2;
 			int LA26_0 = input.LA(1);
 			if ( (LA26_0==ACCESS_SPEC||LA26_0==ANNOTATION_VISIBILITY||LA26_0==ARRAY_TYPE_PREFIX||(LA26_0 >= BOOL_LITERAL && LA26_0 <= BYTE_LITERAL)||(LA26_0 >= CHAR_LITERAL && LA26_0 <= CLASS_DESCRIPTOR)||(LA26_0 >= DOUBLE_LITERAL && LA26_0 <= DOUBLE_LITERAL_OR_ID)||LA26_0==ENUM_DIRECTIVE||(LA26_0 >= FLOAT_LITERAL && LA26_0 <= FLOAT_LITERAL_OR_ID)||(LA26_0 >= INSTRUCTION_FORMAT10t && LA26_0 <= INSTRUCTION_FORMAT10x_ODEX)||LA26_0==INSTRUCTION_FORMAT11x||LA26_0==INSTRUCTION_FORMAT12x_OR_ID||(LA26_0 >= INSTRUCTION_FORMAT21c_FIELD && LA26_0 <= INSTRUCTION_FORMAT21c_TYPE)||LA26_0==INSTRUCTION_FORMAT21t||(LA26_0 >= INSTRUCTION_FORMAT22c_FIELD && LA26_0 <= INSTRUCTION_FORMAT22cs_FIELD)||(LA26_0 >= INSTRUCTION_FORMAT22s_OR_ID && LA26_0 <= INSTRUCTION_FORMAT22t)||LA26_0==INSTRUCTION_FORMAT23x||(LA26_0 >= INSTRUCTION_FORMAT31i_OR_ID && LA26_0 <= INSTRUCTION_FORMAT31t)||(LA26_0 >= INSTRUCTION_FORMAT35c_METHOD && LA26_0 <= INSTRUCTION_FORMAT35ms_METHOD)||(LA26_0 >= INSTRUCTION_FORMAT45cc_METHOD && LA26_0 <= INSTRUCTION_FORMAT51l)||(LA26_0 >= LONG_LITERAL && LA26_0 <= MEMBER_NAME)||(LA26_0 >= NEGATIVE_INTEGER_LITERAL && LA26_0 <= OPEN_BRACE)||(LA26_0 >= PARAM_LIST_OR_ID_PRIMITIVE_TYPE && LA26_0 <= PRIMITIVE_TYPE)||LA26_0==REGISTER||(LA26_0 >= SHORT_LITERAL && LA26_0 <= SIMPLE_NAME)||(LA26_0 >= STRING_LITERAL && LA26_0 <= SUBANNOTATION_DIRECTIVE)||(LA26_0 >= VERIFICATION_ERROR_TYPE && LA26_0 <= VOID_TYPE)) ) {
@@ -5969,14 +5969,14 @@
 
 			switch (alt26) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:671:17: literal ( COMMA literal )*
+					// smaliParser.g:671:17: literal ( COMMA literal )*
 					{
 					pushFollow(FOLLOW_literal_in_array_literal2706);
 					literal147=literal();
 					state._fsp--;
 
 					stream_literal.add(literal147.getTree());
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:671:25: ( COMMA literal )*
+					// smaliParser.g:671:25: ( COMMA literal )*
 					loop25:
 					while (true) {
 						int alt25=2;
@@ -5987,9 +5987,9 @@
 
 						switch (alt25) {
 						case 1 :
-							// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:671:26: COMMA literal
+							// smaliParser.g:671:26: COMMA literal
 							{
-							COMMA148=(Token)match(input,COMMA,FOLLOW_COMMA_in_array_literal2709);
+							COMMA148=(Token)match(input,COMMA,FOLLOW_COMMA_in_array_literal2709);  
 							stream_COMMA.add(COMMA148);
 
 							pushFollow(FOLLOW_literal_in_array_literal2711);
@@ -6008,34 +6008,34 @@
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:671:44:
+					// smaliParser.g:671:44: 
 					{
 					}
 					break;
 
 			}
 
-			CLOSE_BRACE150=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_array_literal2719);
+			CLOSE_BRACE150=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_array_literal2719);  
 			stream_CLOSE_BRACE.add(CLOSE_BRACE150);
 
 			// AST REWRITE
 			// elements: literal
-			// token labels:
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 672:5: -> ^( I_ENCODED_ARRAY[$start, \"I_ENCODED_ARRAY\"] ( literal )* )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:672:8: ^( I_ENCODED_ARRAY[$start, \"I_ENCODED_ARRAY\"] ( literal )* )
+				// smaliParser.g:672:8: ^( I_ENCODED_ARRAY[$start, \"I_ENCODED_ARRAY\"] ( literal )* )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ENCODED_ARRAY, (retval.start), "I_ENCODED_ARRAY"), root_1);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:672:53: ( literal )*
+				// smaliParser.g:672:53: ( literal )*
 				while ( stream_literal.hasNext() ) {
 					adaptor.addChild(root_1, stream_literal.nextTree());
 				}
@@ -6078,7 +6078,7 @@
 
 
 	// $ANTLR start "annotation_element"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:674:1: annotation_element : simple_name EQUAL literal -> ^( I_ANNOTATION_ELEMENT[$start, \"I_ANNOTATION_ELEMENT\"] simple_name literal ) ;
+	// smaliParser.g:674:1: annotation_element : simple_name EQUAL literal -> ^( I_ANNOTATION_ELEMENT[$start, \"I_ANNOTATION_ELEMENT\"] simple_name literal ) ;
 	public final smaliParser.annotation_element_return annotation_element() throws RecognitionException {
 		smaliParser.annotation_element_return retval = new smaliParser.annotation_element_return();
 		retval.start = input.LT(1);
@@ -6095,15 +6095,15 @@
 		RewriteRuleSubtreeStream stream_literal=new RewriteRuleSubtreeStream(adaptor,"rule literal");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:675:3: ( simple_name EQUAL literal -> ^( I_ANNOTATION_ELEMENT[$start, \"I_ANNOTATION_ELEMENT\"] simple_name literal ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:675:5: simple_name EQUAL literal
+			// smaliParser.g:675:3: ( simple_name EQUAL literal -> ^( I_ANNOTATION_ELEMENT[$start, \"I_ANNOTATION_ELEMENT\"] simple_name literal ) )
+			// smaliParser.g:675:5: simple_name EQUAL literal
 			{
 			pushFollow(FOLLOW_simple_name_in_annotation_element2743);
 			simple_name151=simple_name();
 			state._fsp--;
 
 			stream_simple_name.add(simple_name151.getTree());
-			EQUAL152=(Token)match(input,EQUAL,FOLLOW_EQUAL_in_annotation_element2745);
+			EQUAL152=(Token)match(input,EQUAL,FOLLOW_EQUAL_in_annotation_element2745);  
 			stream_EQUAL.add(EQUAL152);
 
 			pushFollow(FOLLOW_literal_in_annotation_element2747);
@@ -6113,18 +6113,18 @@
 			stream_literal.add(literal153.getTree());
 			// AST REWRITE
 			// elements: simple_name, literal
-			// token labels:
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 676:5: -> ^( I_ANNOTATION_ELEMENT[$start, \"I_ANNOTATION_ELEMENT\"] simple_name literal )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:676:8: ^( I_ANNOTATION_ELEMENT[$start, \"I_ANNOTATION_ELEMENT\"] simple_name literal )
+				// smaliParser.g:676:8: ^( I_ANNOTATION_ELEMENT[$start, \"I_ANNOTATION_ELEMENT\"] simple_name literal )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ANNOTATION_ELEMENT, (retval.start), "I_ANNOTATION_ELEMENT"), root_1);
@@ -6167,7 +6167,7 @@
 
 
 	// $ANTLR start "annotation"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:678:1: annotation : ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR ( annotation_element )* END_ANNOTATION_DIRECTIVE -> ^( I_ANNOTATION[$start, \"I_ANNOTATION\"] ANNOTATION_VISIBILITY ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) ) ;
+	// smaliParser.g:678:1: annotation : ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR ( annotation_element )* END_ANNOTATION_DIRECTIVE -> ^( I_ANNOTATION[$start, \"I_ANNOTATION\"] ANNOTATION_VISIBILITY ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) ) ;
 	public final smaliParser.annotation_return annotation() throws RecognitionException {
 		smaliParser.annotation_return retval = new smaliParser.annotation_return();
 		retval.start = input.LT(1);
@@ -6191,19 +6191,19 @@
 		RewriteRuleSubtreeStream stream_annotation_element=new RewriteRuleSubtreeStream(adaptor,"rule annotation_element");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:679:3: ( ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR ( annotation_element )* END_ANNOTATION_DIRECTIVE -> ^( I_ANNOTATION[$start, \"I_ANNOTATION\"] ANNOTATION_VISIBILITY ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:679:5: ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR ( annotation_element )* END_ANNOTATION_DIRECTIVE
+			// smaliParser.g:679:3: ( ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR ( annotation_element )* END_ANNOTATION_DIRECTIVE -> ^( I_ANNOTATION[$start, \"I_ANNOTATION\"] ANNOTATION_VISIBILITY ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) ) )
+			// smaliParser.g:679:5: ANNOTATION_DIRECTIVE ANNOTATION_VISIBILITY CLASS_DESCRIPTOR ( annotation_element )* END_ANNOTATION_DIRECTIVE
 			{
-			ANNOTATION_DIRECTIVE154=(Token)match(input,ANNOTATION_DIRECTIVE,FOLLOW_ANNOTATION_DIRECTIVE_in_annotation2772);
+			ANNOTATION_DIRECTIVE154=(Token)match(input,ANNOTATION_DIRECTIVE,FOLLOW_ANNOTATION_DIRECTIVE_in_annotation2772);  
 			stream_ANNOTATION_DIRECTIVE.add(ANNOTATION_DIRECTIVE154);
 
-			ANNOTATION_VISIBILITY155=(Token)match(input,ANNOTATION_VISIBILITY,FOLLOW_ANNOTATION_VISIBILITY_in_annotation2774);
+			ANNOTATION_VISIBILITY155=(Token)match(input,ANNOTATION_VISIBILITY,FOLLOW_ANNOTATION_VISIBILITY_in_annotation2774);  
 			stream_ANNOTATION_VISIBILITY.add(ANNOTATION_VISIBILITY155);
 
-			CLASS_DESCRIPTOR156=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_annotation2776);
+			CLASS_DESCRIPTOR156=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_annotation2776);  
 			stream_CLASS_DESCRIPTOR.add(CLASS_DESCRIPTOR156);
 
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:680:5: ( annotation_element )*
+			// smaliParser.g:680:5: ( annotation_element )*
 			loop27:
 			while (true) {
 				int alt27=2;
@@ -6214,7 +6214,7 @@
 
 				switch (alt27) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:680:5: annotation_element
+					// smaliParser.g:680:5: annotation_element
 					{
 					pushFollow(FOLLOW_annotation_element_in_annotation2782);
 					annotation_element157=annotation_element();
@@ -6229,33 +6229,33 @@
 				}
 			}
 
-			END_ANNOTATION_DIRECTIVE158=(Token)match(input,END_ANNOTATION_DIRECTIVE,FOLLOW_END_ANNOTATION_DIRECTIVE_in_annotation2785);
+			END_ANNOTATION_DIRECTIVE158=(Token)match(input,END_ANNOTATION_DIRECTIVE,FOLLOW_END_ANNOTATION_DIRECTIVE_in_annotation2785);  
 			stream_END_ANNOTATION_DIRECTIVE.add(END_ANNOTATION_DIRECTIVE158);
 
 			// AST REWRITE
-			// elements: CLASS_DESCRIPTOR, ANNOTATION_VISIBILITY, annotation_element
-			// token labels:
+			// elements: CLASS_DESCRIPTOR, annotation_element, ANNOTATION_VISIBILITY
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 681:5: -> ^( I_ANNOTATION[$start, \"I_ANNOTATION\"] ANNOTATION_VISIBILITY ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:681:8: ^( I_ANNOTATION[$start, \"I_ANNOTATION\"] ANNOTATION_VISIBILITY ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) )
+				// smaliParser.g:681:8: ^( I_ANNOTATION[$start, \"I_ANNOTATION\"] ANNOTATION_VISIBILITY ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ANNOTATION, (retval.start), "I_ANNOTATION"), root_1);
 				adaptor.addChild(root_1, stream_ANNOTATION_VISIBILITY.nextNode());
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:681:69: ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* )
+				// smaliParser.g:681:69: ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* )
 				{
 				CommonTree root_2 = (CommonTree)adaptor.nil();
 				root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_SUBANNOTATION, (retval.start), "I_SUBANNOTATION"), root_2);
 				adaptor.addChild(root_2, stream_CLASS_DESCRIPTOR.nextNode());
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:681:131: ( annotation_element )*
+				// smaliParser.g:681:131: ( annotation_element )*
 				while ( stream_annotation_element.hasNext() ) {
 					adaptor.addChild(root_2, stream_annotation_element.nextTree());
 				}
@@ -6301,7 +6301,7 @@
 
 
 	// $ANTLR start "subannotation"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:683:1: subannotation : SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR ( annotation_element )* END_SUBANNOTATION_DIRECTIVE -> ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) ;
+	// smaliParser.g:683:1: subannotation : SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR ( annotation_element )* END_SUBANNOTATION_DIRECTIVE -> ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) ;
 	public final smaliParser.subannotation_return subannotation() throws RecognitionException {
 		smaliParser.subannotation_return retval = new smaliParser.subannotation_return();
 		retval.start = input.LT(1);
@@ -6322,16 +6322,16 @@
 		RewriteRuleSubtreeStream stream_annotation_element=new RewriteRuleSubtreeStream(adaptor,"rule annotation_element");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:684:3: ( SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR ( annotation_element )* END_SUBANNOTATION_DIRECTIVE -> ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:684:5: SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR ( annotation_element )* END_SUBANNOTATION_DIRECTIVE
+			// smaliParser.g:684:3: ( SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR ( annotation_element )* END_SUBANNOTATION_DIRECTIVE -> ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* ) )
+			// smaliParser.g:684:5: SUBANNOTATION_DIRECTIVE CLASS_DESCRIPTOR ( annotation_element )* END_SUBANNOTATION_DIRECTIVE
 			{
-			SUBANNOTATION_DIRECTIVE159=(Token)match(input,SUBANNOTATION_DIRECTIVE,FOLLOW_SUBANNOTATION_DIRECTIVE_in_subannotation2818);
+			SUBANNOTATION_DIRECTIVE159=(Token)match(input,SUBANNOTATION_DIRECTIVE,FOLLOW_SUBANNOTATION_DIRECTIVE_in_subannotation2818);  
 			stream_SUBANNOTATION_DIRECTIVE.add(SUBANNOTATION_DIRECTIVE159);
 
-			CLASS_DESCRIPTOR160=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_subannotation2820);
+			CLASS_DESCRIPTOR160=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_subannotation2820);  
 			stream_CLASS_DESCRIPTOR.add(CLASS_DESCRIPTOR160);
 
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:684:46: ( annotation_element )*
+			// smaliParser.g:684:46: ( annotation_element )*
 			loop28:
 			while (true) {
 				int alt28=2;
@@ -6342,7 +6342,7 @@
 
 				switch (alt28) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:684:46: annotation_element
+					// smaliParser.g:684:46: annotation_element
 					{
 					pushFollow(FOLLOW_annotation_element_in_subannotation2822);
 					annotation_element161=annotation_element();
@@ -6357,28 +6357,28 @@
 				}
 			}
 
-			END_SUBANNOTATION_DIRECTIVE162=(Token)match(input,END_SUBANNOTATION_DIRECTIVE,FOLLOW_END_SUBANNOTATION_DIRECTIVE_in_subannotation2825);
+			END_SUBANNOTATION_DIRECTIVE162=(Token)match(input,END_SUBANNOTATION_DIRECTIVE,FOLLOW_END_SUBANNOTATION_DIRECTIVE_in_subannotation2825);  
 			stream_END_SUBANNOTATION_DIRECTIVE.add(END_SUBANNOTATION_DIRECTIVE162);
 
 			// AST REWRITE
-			// elements: annotation_element, CLASS_DESCRIPTOR
-			// token labels:
+			// elements: CLASS_DESCRIPTOR, annotation_element
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 685:5: -> ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:685:8: ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* )
+				// smaliParser.g:685:8: ^( I_SUBANNOTATION[$start, \"I_SUBANNOTATION\"] CLASS_DESCRIPTOR ( annotation_element )* )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_SUBANNOTATION, (retval.start), "I_SUBANNOTATION"), root_1);
 				adaptor.addChild(root_1, stream_CLASS_DESCRIPTOR.nextNode());
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:685:70: ( annotation_element )*
+				// smaliParser.g:685:70: ( annotation_element )*
 				while ( stream_annotation_element.hasNext() ) {
 					adaptor.addChild(root_1, stream_annotation_element.nextTree());
 				}
@@ -6421,7 +6421,7 @@
 
 
 	// $ANTLR start "enum_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:688:1: enum_literal : ENUM_DIRECTIVE field_reference -> ^( I_ENCODED_ENUM field_reference ) ;
+	// smaliParser.g:688:1: enum_literal : ENUM_DIRECTIVE field_reference -> ^( I_ENCODED_ENUM field_reference ) ;
 	public final smaliParser.enum_literal_return enum_literal() throws RecognitionException {
 		smaliParser.enum_literal_return retval = new smaliParser.enum_literal_return();
 		retval.start = input.LT(1);
@@ -6436,10 +6436,10 @@
 		RewriteRuleSubtreeStream stream_field_reference=new RewriteRuleSubtreeStream(adaptor,"rule field_reference");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:689:3: ( ENUM_DIRECTIVE field_reference -> ^( I_ENCODED_ENUM field_reference ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:689:5: ENUM_DIRECTIVE field_reference
+			// smaliParser.g:689:3: ( ENUM_DIRECTIVE field_reference -> ^( I_ENCODED_ENUM field_reference ) )
+			// smaliParser.g:689:5: ENUM_DIRECTIVE field_reference
 			{
-			ENUM_DIRECTIVE163=(Token)match(input,ENUM_DIRECTIVE,FOLLOW_ENUM_DIRECTIVE_in_enum_literal2852);
+			ENUM_DIRECTIVE163=(Token)match(input,ENUM_DIRECTIVE,FOLLOW_ENUM_DIRECTIVE_in_enum_literal2852);  
 			stream_ENUM_DIRECTIVE.add(ENUM_DIRECTIVE163);
 
 			pushFollow(FOLLOW_field_reference_in_enum_literal2854);
@@ -6449,18 +6449,18 @@
 			stream_field_reference.add(field_reference164.getTree());
 			// AST REWRITE
 			// elements: field_reference
-			// token labels:
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 690:3: -> ^( I_ENCODED_ENUM field_reference )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:690:6: ^( I_ENCODED_ENUM field_reference )
+				// smaliParser.g:690:6: ^( I_ENCODED_ENUM field_reference )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ENCODED_ENUM, "I_ENCODED_ENUM"), root_1);
@@ -6502,7 +6502,7 @@
 
 
 	// $ANTLR start "type_field_method_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:692:1: type_field_method_literal : ( reference_type_descriptor | ( ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) ) | PRIMITIVE_TYPE | VOID_TYPE );
+	// smaliParser.g:692:1: type_field_method_literal : ( reference_type_descriptor | ( ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) ) | PRIMITIVE_TYPE | VOID_TYPE );
 	public final smaliParser.type_field_method_literal_return type_field_method_literal() throws RecognitionException {
 		smaliParser.type_field_method_literal_return retval = new smaliParser.type_field_method_literal_return();
 		retval.start = input.LT(1);
@@ -6532,7 +6532,7 @@
 		RewriteRuleSubtreeStream stream_reference_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule reference_type_descriptor");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:693:3: ( reference_type_descriptor | ( ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) ) | PRIMITIVE_TYPE | VOID_TYPE )
+			// smaliParser.g:693:3: ( reference_type_descriptor | ( ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) ) | PRIMITIVE_TYPE | VOID_TYPE )
 			int alt31=4;
 			switch ( input.LA(1) ) {
 			case CLASS_DESCRIPTOR:
@@ -6700,7 +6700,7 @@
 			}
 			switch (alt31) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:693:5: reference_type_descriptor
+					// smaliParser.g:693:5: reference_type_descriptor
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -6714,12 +6714,12 @@
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:694:5: ( ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) )
+					// smaliParser.g:694:5: ( ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) )
 					{
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:694:5: ( ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) )
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:694:7: ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) )
+					// smaliParser.g:694:5: ( ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) ) )
+					// smaliParser.g:694:7: ( reference_type_descriptor ARROW )? ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) )
 					{
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:694:7: ( reference_type_descriptor ARROW )?
+					// smaliParser.g:694:7: ( reference_type_descriptor ARROW )?
 					int alt29=2;
 					int LA29_0 = input.LA(1);
 					if ( (LA29_0==ARRAY_TYPE_PREFIX||LA29_0==CLASS_DESCRIPTOR) ) {
@@ -6727,14 +6727,14 @@
 					}
 					switch (alt29) {
 						case 1 :
-							// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:694:8: reference_type_descriptor ARROW
+							// smaliParser.g:694:8: reference_type_descriptor ARROW
 							{
 							pushFollow(FOLLOW_reference_type_descriptor_in_type_field_method_literal2883);
 							reference_type_descriptor166=reference_type_descriptor();
 							state._fsp--;
 
 							stream_reference_type_descriptor.add(reference_type_descriptor166.getTree());
-							ARROW167=(Token)match(input,ARROW,FOLLOW_ARROW_in_type_field_method_literal2885);
+							ARROW167=(Token)match(input,ARROW,FOLLOW_ARROW_in_type_field_method_literal2885);  
 							stream_ARROW.add(ARROW167);
 
 							}
@@ -6742,19 +6742,19 @@
 
 					}
 
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:695:7: ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) )
+					// smaliParser.g:695:7: ( member_name COLON nonvoid_type_descriptor -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor ) | member_name method_prototype -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype ) )
 					int alt30=2;
 					alt30 = dfa30.predict(input);
 					switch (alt30) {
 						case 1 :
-							// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:695:9: member_name COLON nonvoid_type_descriptor
+							// smaliParser.g:695:9: member_name COLON nonvoid_type_descriptor
 							{
 							pushFollow(FOLLOW_member_name_in_type_field_method_literal2897);
 							member_name168=member_name();
 							state._fsp--;
 
 							stream_member_name.add(member_name168.getTree());
-							COLON169=(Token)match(input,COLON,FOLLOW_COLON_in_type_field_method_literal2899);
+							COLON169=(Token)match(input,COLON,FOLLOW_COLON_in_type_field_method_literal2899);  
 							stream_COLON.add(COLON169);
 
 							pushFollow(FOLLOW_nonvoid_type_descriptor_in_type_field_method_literal2901);
@@ -6763,23 +6763,23 @@
 
 							stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor170.getTree());
 							// AST REWRITE
-							// elements: member_name, nonvoid_type_descriptor, reference_type_descriptor
-							// token labels:
+							// elements: reference_type_descriptor, member_name, nonvoid_type_descriptor
+							// token labels: 
 							// rule labels: retval
-							// token list labels:
-							// rule list labels:
-							// wildcard labels:
+							// token list labels: 
+							// rule list labels: 
+							// wildcard labels: 
 							retval.tree = root_0;
 							RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 							root_0 = (CommonTree)adaptor.nil();
 							// 695:51: -> ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor )
 							{
-								// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:695:54: ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor )
+								// smaliParser.g:695:54: ^( I_ENCODED_FIELD ( reference_type_descriptor )? member_name nonvoid_type_descriptor )
 								{
 								CommonTree root_1 = (CommonTree)adaptor.nil();
 								root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ENCODED_FIELD, "I_ENCODED_FIELD"), root_1);
-								// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:695:72: ( reference_type_descriptor )?
+								// smaliParser.g:695:72: ( reference_type_descriptor )?
 								if ( stream_reference_type_descriptor.hasNext() ) {
 									adaptor.addChild(root_1, stream_reference_type_descriptor.nextTree());
 								}
@@ -6798,7 +6798,7 @@
 							}
 							break;
 						case 2 :
-							// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:696:9: member_name method_prototype
+							// smaliParser.g:696:9: member_name method_prototype
 							{
 							pushFollow(FOLLOW_member_name_in_type_field_method_literal2924);
 							member_name171=member_name();
@@ -6811,23 +6811,23 @@
 
 							stream_method_prototype.add(method_prototype172.getTree());
 							// AST REWRITE
-							// elements: reference_type_descriptor, method_prototype, member_name
-							// token labels:
+							// elements: member_name, method_prototype, reference_type_descriptor
+							// token labels: 
 							// rule labels: retval
-							// token list labels:
-							// rule list labels:
-							// wildcard labels:
+							// token list labels: 
+							// rule list labels: 
+							// wildcard labels: 
 							retval.tree = root_0;
 							RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 							root_0 = (CommonTree)adaptor.nil();
 							// 696:38: -> ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype )
 							{
-								// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:696:41: ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype )
+								// smaliParser.g:696:41: ^( I_ENCODED_METHOD ( reference_type_descriptor )? member_name method_prototype )
 								{
 								CommonTree root_1 = (CommonTree)adaptor.nil();
 								root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ENCODED_METHOD, "I_ENCODED_METHOD"), root_1);
-								// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:696:60: ( reference_type_descriptor )?
+								// smaliParser.g:696:60: ( reference_type_descriptor )?
 								if ( stream_reference_type_descriptor.hasNext() ) {
 									adaptor.addChild(root_1, stream_reference_type_descriptor.nextTree());
 								}
@@ -6853,24 +6853,24 @@
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:699:5: PRIMITIVE_TYPE
+					// smaliParser.g:699:5: PRIMITIVE_TYPE
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					PRIMITIVE_TYPE173=(Token)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_type_field_method_literal2959);
+					PRIMITIVE_TYPE173=(Token)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_type_field_method_literal2959); 
 					PRIMITIVE_TYPE173_tree = (CommonTree)adaptor.create(PRIMITIVE_TYPE173);
 					adaptor.addChild(root_0, PRIMITIVE_TYPE173_tree);
 
 					}
 					break;
 				case 4 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:700:5: VOID_TYPE
+					// smaliParser.g:700:5: VOID_TYPE
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					VOID_TYPE174=(Token)match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_type_field_method_literal2965);
+					VOID_TYPE174=(Token)match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_type_field_method_literal2965); 
 					VOID_TYPE174_tree = (CommonTree)adaptor.create(VOID_TYPE174);
 					adaptor.addChild(root_0, VOID_TYPE174_tree);
 
@@ -6905,7 +6905,7 @@
 
 
 	// $ANTLR start "method_reference"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:702:1: method_reference : ( reference_type_descriptor ARROW )? member_name method_prototype -> ( reference_type_descriptor )? member_name method_prototype ;
+	// smaliParser.g:702:1: method_reference : ( reference_type_descriptor ARROW )? member_name method_prototype -> ( reference_type_descriptor )? member_name method_prototype ;
 	public final smaliParser.method_reference_return method_reference() throws RecognitionException {
 		smaliParser.method_reference_return retval = new smaliParser.method_reference_return();
 		retval.start = input.LT(1);
@@ -6924,10 +6924,10 @@
 		RewriteRuleSubtreeStream stream_reference_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule reference_type_descriptor");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:703:3: ( ( reference_type_descriptor ARROW )? member_name method_prototype -> ( reference_type_descriptor )? member_name method_prototype )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:703:5: ( reference_type_descriptor ARROW )? member_name method_prototype
+			// smaliParser.g:703:3: ( ( reference_type_descriptor ARROW )? member_name method_prototype -> ( reference_type_descriptor )? member_name method_prototype )
+			// smaliParser.g:703:5: ( reference_type_descriptor ARROW )? member_name method_prototype
 			{
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:703:5: ( reference_type_descriptor ARROW )?
+			// smaliParser.g:703:5: ( reference_type_descriptor ARROW )?
 			int alt32=2;
 			int LA32_0 = input.LA(1);
 			if ( (LA32_0==ARRAY_TYPE_PREFIX||LA32_0==CLASS_DESCRIPTOR) ) {
@@ -6935,14 +6935,14 @@
 			}
 			switch (alt32) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:703:6: reference_type_descriptor ARROW
+					// smaliParser.g:703:6: reference_type_descriptor ARROW
 					{
 					pushFollow(FOLLOW_reference_type_descriptor_in_method_reference2976);
 					reference_type_descriptor175=reference_type_descriptor();
 					state._fsp--;
 
 					stream_reference_type_descriptor.add(reference_type_descriptor175.getTree());
-					ARROW176=(Token)match(input,ARROW,FOLLOW_ARROW_in_method_reference2978);
+					ARROW176=(Token)match(input,ARROW,FOLLOW_ARROW_in_method_reference2978);  
 					stream_ARROW.add(ARROW176);
 
 					}
@@ -6961,19 +6961,19 @@
 
 			stream_method_prototype.add(method_prototype178.getTree());
 			// AST REWRITE
-			// elements: method_prototype, member_name, reference_type_descriptor
-			// token labels:
+			// elements: method_prototype, reference_type_descriptor, member_name
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 704:3: -> ( reference_type_descriptor )? member_name method_prototype
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:704:6: ( reference_type_descriptor )?
+				// smaliParser.g:704:6: ( reference_type_descriptor )?
 				if ( stream_reference_type_descriptor.hasNext() ) {
 					adaptor.addChild(root_0, stream_reference_type_descriptor.nextTree());
 				}
@@ -7015,7 +7015,7 @@
 
 
 	// $ANTLR start "field_reference"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:706:1: field_reference : ( reference_type_descriptor ARROW )? member_name COLON nonvoid_type_descriptor -> ( reference_type_descriptor )? member_name nonvoid_type_descriptor ;
+	// smaliParser.g:706:1: field_reference : ( reference_type_descriptor ARROW )? member_name COLON nonvoid_type_descriptor -> ( reference_type_descriptor )? member_name nonvoid_type_descriptor ;
 	public final smaliParser.field_reference_return field_reference() throws RecognitionException {
 		smaliParser.field_reference_return retval = new smaliParser.field_reference_return();
 		retval.start = input.LT(1);
@@ -7037,10 +7037,10 @@
 		RewriteRuleSubtreeStream stream_reference_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule reference_type_descriptor");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:707:3: ( ( reference_type_descriptor ARROW )? member_name COLON nonvoid_type_descriptor -> ( reference_type_descriptor )? member_name nonvoid_type_descriptor )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:707:5: ( reference_type_descriptor ARROW )? member_name COLON nonvoid_type_descriptor
+			// smaliParser.g:707:3: ( ( reference_type_descriptor ARROW )? member_name COLON nonvoid_type_descriptor -> ( reference_type_descriptor )? member_name nonvoid_type_descriptor )
+			// smaliParser.g:707:5: ( reference_type_descriptor ARROW )? member_name COLON nonvoid_type_descriptor
 			{
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:707:5: ( reference_type_descriptor ARROW )?
+			// smaliParser.g:707:5: ( reference_type_descriptor ARROW )?
 			int alt33=2;
 			int LA33_0 = input.LA(1);
 			if ( (LA33_0==ARRAY_TYPE_PREFIX||LA33_0==CLASS_DESCRIPTOR) ) {
@@ -7048,14 +7048,14 @@
 			}
 			switch (alt33) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:707:6: reference_type_descriptor ARROW
+					// smaliParser.g:707:6: reference_type_descriptor ARROW
 					{
 					pushFollow(FOLLOW_reference_type_descriptor_in_field_reference3006);
 					reference_type_descriptor179=reference_type_descriptor();
 					state._fsp--;
 
 					stream_reference_type_descriptor.add(reference_type_descriptor179.getTree());
-					ARROW180=(Token)match(input,ARROW,FOLLOW_ARROW_in_field_reference3008);
+					ARROW180=(Token)match(input,ARROW,FOLLOW_ARROW_in_field_reference3008);  
 					stream_ARROW.add(ARROW180);
 
 					}
@@ -7068,7 +7068,7 @@
 			state._fsp--;
 
 			stream_member_name.add(member_name181.getTree());
-			COLON182=(Token)match(input,COLON,FOLLOW_COLON_in_field_reference3014);
+			COLON182=(Token)match(input,COLON,FOLLOW_COLON_in_field_reference3014);  
 			stream_COLON.add(COLON182);
 
 			pushFollow(FOLLOW_nonvoid_type_descriptor_in_field_reference3016);
@@ -7077,19 +7077,19 @@
 
 			stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor183.getTree());
 			// AST REWRITE
-			// elements: nonvoid_type_descriptor, member_name, reference_type_descriptor
-			// token labels:
+			// elements: reference_type_descriptor, nonvoid_type_descriptor, member_name
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 708:3: -> ( reference_type_descriptor )? member_name nonvoid_type_descriptor
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:708:6: ( reference_type_descriptor )?
+				// smaliParser.g:708:6: ( reference_type_descriptor )?
 				if ( stream_reference_type_descriptor.hasNext() ) {
 					adaptor.addChild(root_0, stream_reference_type_descriptor.nextTree());
 				}
@@ -7131,7 +7131,7 @@
 
 
 	// $ANTLR start "label"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:710:1: label : COLON simple_name -> ^( I_LABEL[$COLON, \"I_LABEL\"] simple_name ) ;
+	// smaliParser.g:710:1: label : COLON simple_name -> ^( I_LABEL[$COLON, \"I_LABEL\"] simple_name ) ;
 	public final smaliParser.label_return label() throws RecognitionException {
 		smaliParser.label_return retval = new smaliParser.label_return();
 		retval.start = input.LT(1);
@@ -7146,10 +7146,10 @@
 		RewriteRuleSubtreeStream stream_simple_name=new RewriteRuleSubtreeStream(adaptor,"rule simple_name");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:711:3: ( COLON simple_name -> ^( I_LABEL[$COLON, \"I_LABEL\"] simple_name ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:711:5: COLON simple_name
+			// smaliParser.g:711:3: ( COLON simple_name -> ^( I_LABEL[$COLON, \"I_LABEL\"] simple_name ) )
+			// smaliParser.g:711:5: COLON simple_name
 			{
-			COLON184=(Token)match(input,COLON,FOLLOW_COLON_in_label3037);
+			COLON184=(Token)match(input,COLON,FOLLOW_COLON_in_label3037);  
 			stream_COLON.add(COLON184);
 
 			pushFollow(FOLLOW_simple_name_in_label3039);
@@ -7159,18 +7159,18 @@
 			stream_simple_name.add(simple_name185.getTree());
 			// AST REWRITE
 			// elements: simple_name
-			// token labels:
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 711:23: -> ^( I_LABEL[$COLON, \"I_LABEL\"] simple_name )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:711:26: ^( I_LABEL[$COLON, \"I_LABEL\"] simple_name )
+				// smaliParser.g:711:26: ^( I_LABEL[$COLON, \"I_LABEL\"] simple_name )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_LABEL, COLON184, "I_LABEL"), root_1);
@@ -7212,7 +7212,7 @@
 
 
 	// $ANTLR start "label_ref"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:713:1: label_ref : COLON simple_name -> simple_name ;
+	// smaliParser.g:713:1: label_ref : COLON simple_name -> simple_name ;
 	public final smaliParser.label_ref_return label_ref() throws RecognitionException {
 		smaliParser.label_ref_return retval = new smaliParser.label_ref_return();
 		retval.start = input.LT(1);
@@ -7227,10 +7227,10 @@
 		RewriteRuleSubtreeStream stream_simple_name=new RewriteRuleSubtreeStream(adaptor,"rule simple_name");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:714:3: ( COLON simple_name -> simple_name )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:714:5: COLON simple_name
+			// smaliParser.g:714:3: ( COLON simple_name -> simple_name )
+			// smaliParser.g:714:5: COLON simple_name
 			{
-			COLON186=(Token)match(input,COLON,FOLLOW_COLON_in_label_ref3058);
+			COLON186=(Token)match(input,COLON,FOLLOW_COLON_in_label_ref3058);  
 			stream_COLON.add(COLON186);
 
 			pushFollow(FOLLOW_simple_name_in_label_ref3060);
@@ -7240,11 +7240,11 @@
 			stream_simple_name.add(simple_name187.getTree());
 			// AST REWRITE
 			// elements: simple_name
-			// token labels:
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -7286,7 +7286,7 @@
 
 
 	// $ANTLR start "register_list"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:716:1: register_list : ( REGISTER ( COMMA REGISTER )* -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ( REGISTER )* ) | -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ) );
+	// smaliParser.g:716:1: register_list : ( REGISTER ( COMMA REGISTER )* -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ( REGISTER )* ) | -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ) );
 	public final smaliParser.register_list_return register_list() throws RecognitionException {
 		smaliParser.register_list_return retval = new smaliParser.register_list_return();
 		retval.start = input.LT(1);
@@ -7304,7 +7304,7 @@
 		RewriteRuleTokenStream stream_REGISTER=new RewriteRuleTokenStream(adaptor,"token REGISTER");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:717:3: ( REGISTER ( COMMA REGISTER )* -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ( REGISTER )* ) | -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ) )
+			// smaliParser.g:717:3: ( REGISTER ( COMMA REGISTER )* -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ( REGISTER )* ) | -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ) )
 			int alt35=2;
 			int LA35_0 = input.LA(1);
 			if ( (LA35_0==REGISTER) ) {
@@ -7322,12 +7322,12 @@
 
 			switch (alt35) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:717:5: REGISTER ( COMMA REGISTER )*
+					// smaliParser.g:717:5: REGISTER ( COMMA REGISTER )*
 					{
-					REGISTER188=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_register_list3074);
+					REGISTER188=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_register_list3074);  
 					stream_REGISTER.add(REGISTER188);
 
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:717:14: ( COMMA REGISTER )*
+					// smaliParser.g:717:14: ( COMMA REGISTER )*
 					loop34:
 					while (true) {
 						int alt34=2;
@@ -7338,12 +7338,12 @@
 
 						switch (alt34) {
 						case 1 :
-							// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:717:15: COMMA REGISTER
+							// smaliParser.g:717:15: COMMA REGISTER
 							{
-							COMMA189=(Token)match(input,COMMA,FOLLOW_COMMA_in_register_list3077);
+							COMMA189=(Token)match(input,COMMA,FOLLOW_COMMA_in_register_list3077);  
 							stream_COMMA.add(COMMA189);
 
-							REGISTER190=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_register_list3079);
+							REGISTER190=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_register_list3079);  
 							stream_REGISTER.add(REGISTER190);
 
 							}
@@ -7356,22 +7356,22 @@
 
 					// AST REWRITE
 					// elements: REGISTER
-					// token labels:
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 					root_0 = (CommonTree)adaptor.nil();
 					// 717:32: -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ( REGISTER )* )
 					{
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:717:35: ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ( REGISTER )* )
+						// smaliParser.g:717:35: ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] ( REGISTER )* )
 						{
 						CommonTree root_1 = (CommonTree)adaptor.nil();
 						root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_REGISTER_LIST, (retval.start), "I_REGISTER_LIST"), root_1);
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:717:80: ( REGISTER )*
+						// smaliParser.g:717:80: ( REGISTER )*
 						while ( stream_REGISTER.hasNext() ) {
 							adaptor.addChild(root_1, stream_REGISTER.nextNode());
 						}
@@ -7388,22 +7388,22 @@
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:718:5:
+					// smaliParser.g:718:5: 
 					{
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 					root_0 = (CommonTree)adaptor.nil();
 					// 718:5: -> ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] )
 					{
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:718:7: ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] )
+						// smaliParser.g:718:7: ^( I_REGISTER_LIST[$start, \"I_REGISTER_LIST\"] )
 						{
 						CommonTree root_1 = (CommonTree)adaptor.nil();
 						root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_REGISTER_LIST, (retval.start), "I_REGISTER_LIST"), root_1);
@@ -7446,7 +7446,7 @@
 
 
 	// $ANTLR start "register_range"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:720:1: register_range : (startreg= REGISTER ( DOTDOT endreg= REGISTER )? )? -> ^( I_REGISTER_RANGE[$start, \"I_REGISTER_RANGE\"] ( $startreg)? ( $endreg)? ) ;
+	// smaliParser.g:720:1: register_range : (startreg= REGISTER ( DOTDOT endreg= REGISTER )? )? -> ^( I_REGISTER_RANGE[$start, \"I_REGISTER_RANGE\"] ( $startreg)? ( $endreg)? ) ;
 	public final smaliParser.register_range_return register_range() throws RecognitionException {
 		smaliParser.register_range_return retval = new smaliParser.register_range_return();
 		retval.start = input.LT(1);
@@ -7464,10 +7464,10 @@
 		RewriteRuleTokenStream stream_DOTDOT=new RewriteRuleTokenStream(adaptor,"token DOTDOT");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:721:3: ( (startreg= REGISTER ( DOTDOT endreg= REGISTER )? )? -> ^( I_REGISTER_RANGE[$start, \"I_REGISTER_RANGE\"] ( $startreg)? ( $endreg)? ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:721:5: (startreg= REGISTER ( DOTDOT endreg= REGISTER )? )?
+			// smaliParser.g:721:3: ( (startreg= REGISTER ( DOTDOT endreg= REGISTER )? )? -> ^( I_REGISTER_RANGE[$start, \"I_REGISTER_RANGE\"] ( $startreg)? ( $endreg)? ) )
+			// smaliParser.g:721:5: (startreg= REGISTER ( DOTDOT endreg= REGISTER )? )?
 			{
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:721:5: (startreg= REGISTER ( DOTDOT endreg= REGISTER )? )?
+			// smaliParser.g:721:5: (startreg= REGISTER ( DOTDOT endreg= REGISTER )? )?
 			int alt37=2;
 			int LA37_0 = input.LA(1);
 			if ( (LA37_0==REGISTER) ) {
@@ -7475,12 +7475,12 @@
 			}
 			switch (alt37) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:721:6: startreg= REGISTER ( DOTDOT endreg= REGISTER )?
+					// smaliParser.g:721:6: startreg= REGISTER ( DOTDOT endreg= REGISTER )?
 					{
-					startreg=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_register_range3114);
+					startreg=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_register_range3114);  
 					stream_REGISTER.add(startreg);
 
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:721:24: ( DOTDOT endreg= REGISTER )?
+					// smaliParser.g:721:24: ( DOTDOT endreg= REGISTER )?
 					int alt36=2;
 					int LA36_0 = input.LA(1);
 					if ( (LA36_0==DOTDOT) ) {
@@ -7488,12 +7488,12 @@
 					}
 					switch (alt36) {
 						case 1 :
-							// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:721:25: DOTDOT endreg= REGISTER
+							// smaliParser.g:721:25: DOTDOT endreg= REGISTER
 							{
-							DOTDOT191=(Token)match(input,DOTDOT,FOLLOW_DOTDOT_in_register_range3117);
+							DOTDOT191=(Token)match(input,DOTDOT,FOLLOW_DOTDOT_in_register_range3117);  
 							stream_DOTDOT.add(DOTDOT191);
 
-							endreg=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_register_range3121);
+							endreg=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_register_range3121);  
 							stream_REGISTER.add(endreg);
 
 							}
@@ -7507,31 +7507,31 @@
 			}
 
 			// AST REWRITE
-			// elements: endreg, startreg
-			// token labels: endreg, startreg
+			// elements: startreg, endreg
+			// token labels: startreg, endreg
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
-			RewriteRuleTokenStream stream_endreg=new RewriteRuleTokenStream(adaptor,"token endreg",endreg);
 			RewriteRuleTokenStream stream_startreg=new RewriteRuleTokenStream(adaptor,"token startreg",startreg);
+			RewriteRuleTokenStream stream_endreg=new RewriteRuleTokenStream(adaptor,"token endreg",endreg);
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 721:52: -> ^( I_REGISTER_RANGE[$start, \"I_REGISTER_RANGE\"] ( $startreg)? ( $endreg)? )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:721:55: ^( I_REGISTER_RANGE[$start, \"I_REGISTER_RANGE\"] ( $startreg)? ( $endreg)? )
+				// smaliParser.g:721:55: ^( I_REGISTER_RANGE[$start, \"I_REGISTER_RANGE\"] ( $startreg)? ( $endreg)? )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_REGISTER_RANGE, (retval.start), "I_REGISTER_RANGE"), root_1);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:721:103: ( $startreg)?
+				// smaliParser.g:721:103: ( $startreg)?
 				if ( stream_startreg.hasNext() ) {
 					adaptor.addChild(root_1, stream_startreg.nextNode());
 				}
 				stream_startreg.reset();
 
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:721:114: ( $endreg)?
+				// smaliParser.g:721:114: ( $endreg)?
 				if ( stream_endreg.hasNext() ) {
 					adaptor.addChild(root_1, stream_endreg.nextNode());
 				}
@@ -7574,7 +7574,7 @@
 
 
 	// $ANTLR start "verification_error_reference"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:723:1: verification_error_reference : ( CLASS_DESCRIPTOR | field_reference | method_reference );
+	// smaliParser.g:723:1: verification_error_reference : ( CLASS_DESCRIPTOR | field_reference | method_reference );
 	public final smaliParser.verification_error_reference_return verification_error_reference() throws RecognitionException {
 		smaliParser.verification_error_reference_return retval = new smaliParser.verification_error_reference_return();
 		retval.start = input.LT(1);
@@ -7588,24 +7588,24 @@
 		CommonTree CLASS_DESCRIPTOR192_tree=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:724:3: ( CLASS_DESCRIPTOR | field_reference | method_reference )
+			// smaliParser.g:724:3: ( CLASS_DESCRIPTOR | field_reference | method_reference )
 			int alt38=3;
 			alt38 = dfa38.predict(input);
 			switch (alt38) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:724:5: CLASS_DESCRIPTOR
+					// smaliParser.g:724:5: CLASS_DESCRIPTOR
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					CLASS_DESCRIPTOR192=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_verification_error_reference3150);
+					CLASS_DESCRIPTOR192=(Token)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_verification_error_reference3150); 
 					CLASS_DESCRIPTOR192_tree = (CommonTree)adaptor.create(CLASS_DESCRIPTOR192);
 					adaptor.addChild(root_0, CLASS_DESCRIPTOR192_tree);
 
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:724:24: field_reference
+					// smaliParser.g:724:24: field_reference
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -7619,7 +7619,7 @@
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:724:42: method_reference
+					// smaliParser.g:724:42: method_reference
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -7661,7 +7661,7 @@
 
 
 	// $ANTLR start "catch_directive"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:726:1: catch_directive : CATCH_DIRECTIVE nonvoid_type_descriptor OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref -> ^( I_CATCH[$start, \"I_CATCH\"] nonvoid_type_descriptor $from $to $using) ;
+	// smaliParser.g:726:1: catch_directive : CATCH_DIRECTIVE nonvoid_type_descriptor OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref -> ^( I_CATCH[$start, \"I_CATCH\"] nonvoid_type_descriptor $from $to $using) ;
 	public final smaliParser.catch_directive_return catch_directive() throws RecognitionException {
 		smaliParser.catch_directive_return retval = new smaliParser.catch_directive_return();
 		retval.start = input.LT(1);
@@ -7689,10 +7689,10 @@
 		RewriteRuleSubtreeStream stream_nonvoid_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule nonvoid_type_descriptor");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:727:3: ( CATCH_DIRECTIVE nonvoid_type_descriptor OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref -> ^( I_CATCH[$start, \"I_CATCH\"] nonvoid_type_descriptor $from $to $using) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:727:5: CATCH_DIRECTIVE nonvoid_type_descriptor OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref
+			// smaliParser.g:727:3: ( CATCH_DIRECTIVE nonvoid_type_descriptor OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref -> ^( I_CATCH[$start, \"I_CATCH\"] nonvoid_type_descriptor $from $to $using) )
+			// smaliParser.g:727:5: CATCH_DIRECTIVE nonvoid_type_descriptor OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref
 			{
-			CATCH_DIRECTIVE195=(Token)match(input,CATCH_DIRECTIVE,FOLLOW_CATCH_DIRECTIVE_in_catch_directive3168);
+			CATCH_DIRECTIVE195=(Token)match(input,CATCH_DIRECTIVE,FOLLOW_CATCH_DIRECTIVE_in_catch_directive3168);  
 			stream_CATCH_DIRECTIVE.add(CATCH_DIRECTIVE195);
 
 			pushFollow(FOLLOW_nonvoid_type_descriptor_in_catch_directive3170);
@@ -7700,7 +7700,7 @@
 			state._fsp--;
 
 			stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor196.getTree());
-			OPEN_BRACE197=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_catch_directive3172);
+			OPEN_BRACE197=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_catch_directive3172);  
 			stream_OPEN_BRACE.add(OPEN_BRACE197);
 
 			pushFollow(FOLLOW_label_ref_in_catch_directive3176);
@@ -7708,7 +7708,7 @@
 			state._fsp--;
 
 			stream_label_ref.add(from.getTree());
-			DOTDOT198=(Token)match(input,DOTDOT,FOLLOW_DOTDOT_in_catch_directive3178);
+			DOTDOT198=(Token)match(input,DOTDOT,FOLLOW_DOTDOT_in_catch_directive3178);  
 			stream_DOTDOT.add(DOTDOT198);
 
 			pushFollow(FOLLOW_label_ref_in_catch_directive3182);
@@ -7716,7 +7716,7 @@
 			state._fsp--;
 
 			stream_label_ref.add(to.getTree());
-			CLOSE_BRACE199=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_catch_directive3184);
+			CLOSE_BRACE199=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_catch_directive3184);  
 			stream_CLOSE_BRACE.add(CLOSE_BRACE199);
 
 			pushFollow(FOLLOW_label_ref_in_catch_directive3188);
@@ -7725,12 +7725,12 @@
 
 			stream_label_ref.add(using.getTree());
 			// AST REWRITE
-			// elements: using, to, from, nonvoid_type_descriptor
-			// token labels:
+			// elements: from, nonvoid_type_descriptor, using, to
+			// token labels: 
 			// rule labels: using, from, to, retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_using=new RewriteRuleSubtreeStream(adaptor,"rule using",using!=null?using.getTree():null);
 			RewriteRuleSubtreeStream stream_from=new RewriteRuleSubtreeStream(adaptor,"rule from",from!=null?from.getTree():null);
@@ -7740,7 +7740,7 @@
 			root_0 = (CommonTree)adaptor.nil();
 			// 728:5: -> ^( I_CATCH[$start, \"I_CATCH\"] nonvoid_type_descriptor $from $to $using)
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:728:8: ^( I_CATCH[$start, \"I_CATCH\"] nonvoid_type_descriptor $from $to $using)
+				// smaliParser.g:728:8: ^( I_CATCH[$start, \"I_CATCH\"] nonvoid_type_descriptor $from $to $using)
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_CATCH, (retval.start), "I_CATCH"), root_1);
@@ -7785,7 +7785,7 @@
 
 
 	// $ANTLR start "catchall_directive"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:730:1: catchall_directive : CATCHALL_DIRECTIVE OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref -> ^( I_CATCHALL[$start, \"I_CATCHALL\"] $from $to $using) ;
+	// smaliParser.g:730:1: catchall_directive : CATCHALL_DIRECTIVE OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref -> ^( I_CATCHALL[$start, \"I_CATCHALL\"] $from $to $using) ;
 	public final smaliParser.catchall_directive_return catchall_directive() throws RecognitionException {
 		smaliParser.catchall_directive_return retval = new smaliParser.catchall_directive_return();
 		retval.start = input.LT(1);
@@ -7811,13 +7811,13 @@
 		RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:731:3: ( CATCHALL_DIRECTIVE OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref -> ^( I_CATCHALL[$start, \"I_CATCHALL\"] $from $to $using) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:731:5: CATCHALL_DIRECTIVE OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref
+			// smaliParser.g:731:3: ( CATCHALL_DIRECTIVE OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref -> ^( I_CATCHALL[$start, \"I_CATCHALL\"] $from $to $using) )
+			// smaliParser.g:731:5: CATCHALL_DIRECTIVE OPEN_BRACE from= label_ref DOTDOT to= label_ref CLOSE_BRACE using= label_ref
 			{
-			CATCHALL_DIRECTIVE200=(Token)match(input,CATCHALL_DIRECTIVE,FOLLOW_CATCHALL_DIRECTIVE_in_catchall_directive3220);
+			CATCHALL_DIRECTIVE200=(Token)match(input,CATCHALL_DIRECTIVE,FOLLOW_CATCHALL_DIRECTIVE_in_catchall_directive3220);  
 			stream_CATCHALL_DIRECTIVE.add(CATCHALL_DIRECTIVE200);
 
-			OPEN_BRACE201=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_catchall_directive3222);
+			OPEN_BRACE201=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_catchall_directive3222);  
 			stream_OPEN_BRACE.add(OPEN_BRACE201);
 
 			pushFollow(FOLLOW_label_ref_in_catchall_directive3226);
@@ -7825,7 +7825,7 @@
 			state._fsp--;
 
 			stream_label_ref.add(from.getTree());
-			DOTDOT202=(Token)match(input,DOTDOT,FOLLOW_DOTDOT_in_catchall_directive3228);
+			DOTDOT202=(Token)match(input,DOTDOT,FOLLOW_DOTDOT_in_catchall_directive3228);  
 			stream_DOTDOT.add(DOTDOT202);
 
 			pushFollow(FOLLOW_label_ref_in_catchall_directive3232);
@@ -7833,7 +7833,7 @@
 			state._fsp--;
 
 			stream_label_ref.add(to.getTree());
-			CLOSE_BRACE203=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_catchall_directive3234);
+			CLOSE_BRACE203=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_catchall_directive3234);  
 			stream_CLOSE_BRACE.add(CLOSE_BRACE203);
 
 			pushFollow(FOLLOW_label_ref_in_catchall_directive3238);
@@ -7842,12 +7842,12 @@
 
 			stream_label_ref.add(using.getTree());
 			// AST REWRITE
-			// elements: using, from, to
-			// token labels:
+			// elements: using, to, from
+			// token labels: 
 			// rule labels: using, from, to, retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_using=new RewriteRuleSubtreeStream(adaptor,"rule using",using!=null?using.getTree():null);
 			RewriteRuleSubtreeStream stream_from=new RewriteRuleSubtreeStream(adaptor,"rule from",from!=null?from.getTree():null);
@@ -7857,7 +7857,7 @@
 			root_0 = (CommonTree)adaptor.nil();
 			// 732:5: -> ^( I_CATCHALL[$start, \"I_CATCHALL\"] $from $to $using)
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:732:8: ^( I_CATCHALL[$start, \"I_CATCHALL\"] $from $to $using)
+				// smaliParser.g:732:8: ^( I_CATCHALL[$start, \"I_CATCHALL\"] $from $to $using)
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_CATCHALL, (retval.start), "I_CATCHALL"), root_1);
@@ -7901,7 +7901,7 @@
 
 
 	// $ANTLR start "parameter_directive"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:738:1: parameter_directive : PARAMETER_DIRECTIVE REGISTER ( COMMA STRING_LITERAL )? ({...}? annotation )* ( END_PARAMETER_DIRECTIVE -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) ) ) ;
+	// smaliParser.g:738:1: parameter_directive : PARAMETER_DIRECTIVE REGISTER ( COMMA STRING_LITERAL )? ({...}? annotation )* ( END_PARAMETER_DIRECTIVE -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) ) ) ;
 	public final smaliParser.parameter_directive_return parameter_directive() throws RecognitionException {
 		smaliParser.parameter_directive_return retval = new smaliParser.parameter_directive_return();
 		retval.start = input.LT(1);
@@ -7929,16 +7929,16 @@
 
 		List<CommonTree> annotations = new ArrayList<CommonTree>();
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:740:3: ( PARAMETER_DIRECTIVE REGISTER ( COMMA STRING_LITERAL )? ({...}? annotation )* ( END_PARAMETER_DIRECTIVE -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) ) ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:740:5: PARAMETER_DIRECTIVE REGISTER ( COMMA STRING_LITERAL )? ({...}? annotation )* ( END_PARAMETER_DIRECTIVE -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) ) )
+			// smaliParser.g:740:3: ( PARAMETER_DIRECTIVE REGISTER ( COMMA STRING_LITERAL )? ({...}? annotation )* ( END_PARAMETER_DIRECTIVE -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) ) ) )
+			// smaliParser.g:740:5: PARAMETER_DIRECTIVE REGISTER ( COMMA STRING_LITERAL )? ({...}? annotation )* ( END_PARAMETER_DIRECTIVE -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) ) )
 			{
-			PARAMETER_DIRECTIVE204=(Token)match(input,PARAMETER_DIRECTIVE,FOLLOW_PARAMETER_DIRECTIVE_in_parameter_directive3277);
+			PARAMETER_DIRECTIVE204=(Token)match(input,PARAMETER_DIRECTIVE,FOLLOW_PARAMETER_DIRECTIVE_in_parameter_directive3277);  
 			stream_PARAMETER_DIRECTIVE.add(PARAMETER_DIRECTIVE204);
 
-			REGISTER205=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_parameter_directive3279);
+			REGISTER205=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_parameter_directive3279);  
 			stream_REGISTER.add(REGISTER205);
 
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:740:34: ( COMMA STRING_LITERAL )?
+			// smaliParser.g:740:34: ( COMMA STRING_LITERAL )?
 			int alt39=2;
 			int LA39_0 = input.LA(1);
 			if ( (LA39_0==COMMA) ) {
@@ -7946,12 +7946,12 @@
 			}
 			switch (alt39) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:740:35: COMMA STRING_LITERAL
+					// smaliParser.g:740:35: COMMA STRING_LITERAL
 					{
-					COMMA206=(Token)match(input,COMMA,FOLLOW_COMMA_in_parameter_directive3282);
+					COMMA206=(Token)match(input,COMMA,FOLLOW_COMMA_in_parameter_directive3282);  
 					stream_COMMA.add(COMMA206);
 
-					STRING_LITERAL207=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_parameter_directive3284);
+					STRING_LITERAL207=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_parameter_directive3284);  
 					stream_STRING_LITERAL.add(STRING_LITERAL207);
 
 					}
@@ -7959,14 +7959,14 @@
 
 			}
 
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:741:5: ({...}? annotation )*
+			// smaliParser.g:741:5: ({...}? annotation )*
 			loop40:
 			while (true) {
 				int alt40=2;
 				alt40 = dfa40.predict(input);
 				switch (alt40) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:741:6: {...}? annotation
+					// smaliParser.g:741:6: {...}? annotation
 					{
 					if ( !((input.LA(1) == ANNOTATION_DIRECTIVE)) ) {
 						throw new FailedPredicateException(input, "parameter_directive", "input.LA(1) == ANNOTATION_DIRECTIVE");
@@ -7985,7 +7985,7 @@
 				}
 			}
 
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:743:5: ( END_PARAMETER_DIRECTIVE -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) ) )
+			// smaliParser.g:743:5: ( END_PARAMETER_DIRECTIVE -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) ) | -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) ) )
 			int alt41=2;
 			int LA41_0 = input.LA(1);
 			if ( (LA41_0==END_PARAMETER_DIRECTIVE) ) {
@@ -8003,40 +8003,40 @@
 
 			switch (alt41) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:743:7: END_PARAMETER_DIRECTIVE
+					// smaliParser.g:743:7: END_PARAMETER_DIRECTIVE
 					{
-					END_PARAMETER_DIRECTIVE209=(Token)match(input,END_PARAMETER_DIRECTIVE,FOLLOW_END_PARAMETER_DIRECTIVE_in_parameter_directive3308);
+					END_PARAMETER_DIRECTIVE209=(Token)match(input,END_PARAMETER_DIRECTIVE,FOLLOW_END_PARAMETER_DIRECTIVE_in_parameter_directive3308);  
 					stream_END_PARAMETER_DIRECTIVE.add(END_PARAMETER_DIRECTIVE209);
 
 					// AST REWRITE
-					// elements: REGISTER, STRING_LITERAL, annotation
-					// token labels:
+					// elements: STRING_LITERAL, annotation, REGISTER
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 					root_0 = (CommonTree)adaptor.nil();
 					// 744:7: -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) )
 					{
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:744:10: ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) )
+						// smaliParser.g:744:10: ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ( annotation )* ) )
 						{
 						CommonTree root_1 = (CommonTree)adaptor.nil();
 						root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_PARAMETER, (retval.start), "I_PARAMETER"), root_1);
 						adaptor.addChild(root_1, stream_REGISTER.nextNode());
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:744:56: ( STRING_LITERAL )?
+						// smaliParser.g:744:56: ( STRING_LITERAL )?
 						if ( stream_STRING_LITERAL.hasNext() ) {
 							adaptor.addChild(root_1, stream_STRING_LITERAL.nextNode());
 						}
 						stream_STRING_LITERAL.reset();
 
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:744:72: ^( I_ANNOTATIONS ( annotation )* )
+						// smaliParser.g:744:72: ^( I_ANNOTATIONS ( annotation )* )
 						{
 						CommonTree root_2 = (CommonTree)adaptor.nil();
 						root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ANNOTATIONS, "I_ANNOTATIONS"), root_2);
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:744:88: ( annotation )*
+						// smaliParser.g:744:88: ( annotation )*
 						while ( stream_annotation.hasNext() ) {
 							adaptor.addChild(root_2, stream_annotation.nextTree());
 						}
@@ -8056,34 +8056,34 @@
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:745:19:
+					// smaliParser.g:745:19: 
 					{
 					statements_and_directives_stack.peek().methodAnnotations.addAll(annotations);
 					// AST REWRITE
 					// elements: STRING_LITERAL, REGISTER
-					// token labels:
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 					root_0 = (CommonTree)adaptor.nil();
 					// 746:7: -> ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) )
 					{
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:746:10: ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) )
+						// smaliParser.g:746:10: ^( I_PARAMETER[$start, \"I_PARAMETER\"] REGISTER ( STRING_LITERAL )? ^( I_ANNOTATIONS ) )
 						{
 						CommonTree root_1 = (CommonTree)adaptor.nil();
 						root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_PARAMETER, (retval.start), "I_PARAMETER"), root_1);
 						adaptor.addChild(root_1, stream_REGISTER.nextNode());
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:746:56: ( STRING_LITERAL )?
+						// smaliParser.g:746:56: ( STRING_LITERAL )?
 						if ( stream_STRING_LITERAL.hasNext() ) {
 							adaptor.addChild(root_1, stream_STRING_LITERAL.nextNode());
 						}
 						stream_STRING_LITERAL.reset();
 
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:746:72: ^( I_ANNOTATIONS )
+						// smaliParser.g:746:72: ^( I_ANNOTATIONS )
 						{
 						CommonTree root_2 = (CommonTree)adaptor.nil();
 						root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ANNOTATIONS, "I_ANNOTATIONS"), root_2);
@@ -8132,7 +8132,7 @@
 
 
 	// $ANTLR start "debug_directive"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:749:1: debug_directive : ( line_directive | local_directive | end_local_directive | restart_local_directive | prologue_directive | epilogue_directive | source_directive );
+	// smaliParser.g:749:1: debug_directive : ( line_directive | local_directive | end_local_directive | restart_local_directive | prologue_directive | epilogue_directive | source_directive );
 	public final smaliParser.debug_directive_return debug_directive() throws RecognitionException {
 		smaliParser.debug_directive_return retval = new smaliParser.debug_directive_return();
 		retval.start = input.LT(1);
@@ -8149,7 +8149,7 @@
 
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:750:3: ( line_directive | local_directive | end_local_directive | restart_local_directive | prologue_directive | epilogue_directive | source_directive )
+			// smaliParser.g:750:3: ( line_directive | local_directive | end_local_directive | restart_local_directive | prologue_directive | epilogue_directive | source_directive )
 			int alt42=7;
 			switch ( input.LA(1) ) {
 			case LINE_DIRECTIVE:
@@ -8194,7 +8194,7 @@
 			}
 			switch (alt42) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:750:5: line_directive
+					// smaliParser.g:750:5: line_directive
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -8208,7 +8208,7 @@
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:751:5: local_directive
+					// smaliParser.g:751:5: local_directive
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -8222,7 +8222,7 @@
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:752:5: end_local_directive
+					// smaliParser.g:752:5: end_local_directive
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -8236,7 +8236,7 @@
 					}
 					break;
 				case 4 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:753:5: restart_local_directive
+					// smaliParser.g:753:5: restart_local_directive
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -8250,7 +8250,7 @@
 					}
 					break;
 				case 5 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:754:5: prologue_directive
+					// smaliParser.g:754:5: prologue_directive
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -8264,7 +8264,7 @@
 					}
 					break;
 				case 6 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:755:5: epilogue_directive
+					// smaliParser.g:755:5: epilogue_directive
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -8278,7 +8278,7 @@
 					}
 					break;
 				case 7 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:756:5: source_directive
+					// smaliParser.g:756:5: source_directive
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -8320,7 +8320,7 @@
 
 
 	// $ANTLR start "line_directive"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:758:1: line_directive : LINE_DIRECTIVE integral_literal -> ^( I_LINE[$start, \"I_LINE\"] integral_literal ) ;
+	// smaliParser.g:758:1: line_directive : LINE_DIRECTIVE integral_literal -> ^( I_LINE[$start, \"I_LINE\"] integral_literal ) ;
 	public final smaliParser.line_directive_return line_directive() throws RecognitionException {
 		smaliParser.line_directive_return retval = new smaliParser.line_directive_return();
 		retval.start = input.LT(1);
@@ -8335,10 +8335,10 @@
 		RewriteRuleSubtreeStream stream_integral_literal=new RewriteRuleSubtreeStream(adaptor,"rule integral_literal");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:759:3: ( LINE_DIRECTIVE integral_literal -> ^( I_LINE[$start, \"I_LINE\"] integral_literal ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:759:5: LINE_DIRECTIVE integral_literal
+			// smaliParser.g:759:3: ( LINE_DIRECTIVE integral_literal -> ^( I_LINE[$start, \"I_LINE\"] integral_literal ) )
+			// smaliParser.g:759:5: LINE_DIRECTIVE integral_literal
 			{
-			LINE_DIRECTIVE217=(Token)match(input,LINE_DIRECTIVE,FOLLOW_LINE_DIRECTIVE_in_line_directive3427);
+			LINE_DIRECTIVE217=(Token)match(input,LINE_DIRECTIVE,FOLLOW_LINE_DIRECTIVE_in_line_directive3427);  
 			stream_LINE_DIRECTIVE.add(LINE_DIRECTIVE217);
 
 			pushFollow(FOLLOW_integral_literal_in_line_directive3429);
@@ -8348,18 +8348,18 @@
 			stream_integral_literal.add(integral_literal218.getTree());
 			// AST REWRITE
 			// elements: integral_literal
-			// token labels:
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 760:5: -> ^( I_LINE[$start, \"I_LINE\"] integral_literal )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:760:8: ^( I_LINE[$start, \"I_LINE\"] integral_literal )
+				// smaliParser.g:760:8: ^( I_LINE[$start, \"I_LINE\"] integral_literal )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_LINE, (retval.start), "I_LINE"), root_1);
@@ -8401,7 +8401,7 @@
 
 
 	// $ANTLR start "local_directive"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:762:1: local_directive : LOCAL_DIRECTIVE REGISTER ( COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )? )? -> ^( I_LOCAL[$start, \"I_LOCAL\"] REGISTER ( NULL_LITERAL )? ( $name)? ( nonvoid_type_descriptor )? ( $signature)? ) ;
+	// smaliParser.g:762:1: local_directive : LOCAL_DIRECTIVE REGISTER ( COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )? )? -> ^( I_LOCAL[$start, \"I_LOCAL\"] REGISTER ( NULL_LITERAL )? ( $name)? ( nonvoid_type_descriptor )? ( $signature)? ) ;
 	public final smaliParser.local_directive_return local_directive() throws RecognitionException {
 		smaliParser.local_directive_return retval = new smaliParser.local_directive_return();
 		retval.start = input.LT(1);
@@ -8438,16 +8438,16 @@
 		RewriteRuleSubtreeStream stream_nonvoid_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule nonvoid_type_descriptor");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:763:3: ( LOCAL_DIRECTIVE REGISTER ( COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )? )? -> ^( I_LOCAL[$start, \"I_LOCAL\"] REGISTER ( NULL_LITERAL )? ( $name)? ( nonvoid_type_descriptor )? ( $signature)? ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:763:5: LOCAL_DIRECTIVE REGISTER ( COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )? )?
+			// smaliParser.g:763:3: ( LOCAL_DIRECTIVE REGISTER ( COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )? )? -> ^( I_LOCAL[$start, \"I_LOCAL\"] REGISTER ( NULL_LITERAL )? ( $name)? ( nonvoid_type_descriptor )? ( $signature)? ) )
+			// smaliParser.g:763:5: LOCAL_DIRECTIVE REGISTER ( COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )? )?
 			{
-			LOCAL_DIRECTIVE219=(Token)match(input,LOCAL_DIRECTIVE,FOLLOW_LOCAL_DIRECTIVE_in_local_directive3452);
+			LOCAL_DIRECTIVE219=(Token)match(input,LOCAL_DIRECTIVE,FOLLOW_LOCAL_DIRECTIVE_in_local_directive3452);  
 			stream_LOCAL_DIRECTIVE.add(LOCAL_DIRECTIVE219);
 
-			REGISTER220=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_local_directive3454);
+			REGISTER220=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_local_directive3454);  
 			stream_REGISTER.add(REGISTER220);
 
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:763:30: ( COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )? )?
+			// smaliParser.g:763:30: ( COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )? )?
 			int alt46=2;
 			int LA46_0 = input.LA(1);
 			if ( (LA46_0==COMMA) ) {
@@ -8455,12 +8455,12 @@
 			}
 			switch (alt46) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:763:31: COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )?
+					// smaliParser.g:763:31: COMMA ( NULL_LITERAL |name= STRING_LITERAL ) COLON ( VOID_TYPE | nonvoid_type_descriptor ) ( COMMA signature= STRING_LITERAL )?
 					{
-					COMMA221=(Token)match(input,COMMA,FOLLOW_COMMA_in_local_directive3457);
+					COMMA221=(Token)match(input,COMMA,FOLLOW_COMMA_in_local_directive3457);  
 					stream_COMMA.add(COMMA221);
 
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:763:37: ( NULL_LITERAL |name= STRING_LITERAL )
+					// smaliParser.g:763:37: ( NULL_LITERAL |name= STRING_LITERAL )
 					int alt43=2;
 					int LA43_0 = input.LA(1);
 					if ( (LA43_0==NULL_LITERAL) ) {
@@ -8478,17 +8478,17 @@
 
 					switch (alt43) {
 						case 1 :
-							// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:763:38: NULL_LITERAL
+							// smaliParser.g:763:38: NULL_LITERAL
 							{
-							NULL_LITERAL222=(Token)match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_local_directive3460);
+							NULL_LITERAL222=(Token)match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_local_directive3460);  
 							stream_NULL_LITERAL.add(NULL_LITERAL222);
 
 							}
 							break;
 						case 2 :
-							// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:763:53: name= STRING_LITERAL
+							// smaliParser.g:763:53: name= STRING_LITERAL
 							{
-							name=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_local_directive3466);
+							name=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_local_directive3466);  
 							stream_STRING_LITERAL.add(name);
 
 							}
@@ -8496,10 +8496,10 @@
 
 					}
 
-					COLON223=(Token)match(input,COLON,FOLLOW_COLON_in_local_directive3469);
+					COLON223=(Token)match(input,COLON,FOLLOW_COLON_in_local_directive3469);  
 					stream_COLON.add(COLON223);
 
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:763:80: ( VOID_TYPE | nonvoid_type_descriptor )
+					// smaliParser.g:763:80: ( VOID_TYPE | nonvoid_type_descriptor )
 					int alt44=2;
 					int LA44_0 = input.LA(1);
 					if ( (LA44_0==VOID_TYPE) ) {
@@ -8517,15 +8517,15 @@
 
 					switch (alt44) {
 						case 1 :
-							// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:763:81: VOID_TYPE
+							// smaliParser.g:763:81: VOID_TYPE
 							{
-							VOID_TYPE224=(Token)match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_local_directive3472);
+							VOID_TYPE224=(Token)match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_local_directive3472);  
 							stream_VOID_TYPE.add(VOID_TYPE224);
 
 							}
 							break;
 						case 2 :
-							// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:763:93: nonvoid_type_descriptor
+							// smaliParser.g:763:93: nonvoid_type_descriptor
 							{
 							pushFollow(FOLLOW_nonvoid_type_descriptor_in_local_directive3476);
 							nonvoid_type_descriptor225=nonvoid_type_descriptor();
@@ -8537,7 +8537,7 @@
 
 					}
 
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:764:31: ( COMMA signature= STRING_LITERAL )?
+					// smaliParser.g:764:31: ( COMMA signature= STRING_LITERAL )?
 					int alt45=2;
 					int LA45_0 = input.LA(1);
 					if ( (LA45_0==COMMA) ) {
@@ -8545,12 +8545,12 @@
 					}
 					switch (alt45) {
 						case 1 :
-							// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:764:32: COMMA signature= STRING_LITERAL
+							// smaliParser.g:764:32: COMMA signature= STRING_LITERAL
 							{
-							COMMA226=(Token)match(input,COMMA,FOLLOW_COMMA_in_local_directive3510);
+							COMMA226=(Token)match(input,COMMA,FOLLOW_COMMA_in_local_directive3510);  
 							stream_COMMA.add(COMMA226);
 
-							signature=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_local_directive3514);
+							signature=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_local_directive3514);  
 							stream_STRING_LITERAL.add(signature);
 
 							}
@@ -8564,12 +8564,12 @@
 			}
 
 			// AST REWRITE
-			// elements: NULL_LITERAL, REGISTER, name, signature, nonvoid_type_descriptor
+			// elements: name, NULL_LITERAL, nonvoid_type_descriptor, REGISTER, signature
 			// token labels: signature, name
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleTokenStream stream_signature=new RewriteRuleTokenStream(adaptor,"token signature",signature);
 			RewriteRuleTokenStream stream_name=new RewriteRuleTokenStream(adaptor,"token name",name);
@@ -8578,30 +8578,30 @@
 			root_0 = (CommonTree)adaptor.nil();
 			// 765:5: -> ^( I_LOCAL[$start, \"I_LOCAL\"] REGISTER ( NULL_LITERAL )? ( $name)? ( nonvoid_type_descriptor )? ( $signature)? )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:765:8: ^( I_LOCAL[$start, \"I_LOCAL\"] REGISTER ( NULL_LITERAL )? ( $name)? ( nonvoid_type_descriptor )? ( $signature)? )
+				// smaliParser.g:765:8: ^( I_LOCAL[$start, \"I_LOCAL\"] REGISTER ( NULL_LITERAL )? ( $name)? ( nonvoid_type_descriptor )? ( $signature)? )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_LOCAL, (retval.start), "I_LOCAL"), root_1);
 				adaptor.addChild(root_1, stream_REGISTER.nextNode());
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:765:46: ( NULL_LITERAL )?
+				// smaliParser.g:765:46: ( NULL_LITERAL )?
 				if ( stream_NULL_LITERAL.hasNext() ) {
 					adaptor.addChild(root_1, stream_NULL_LITERAL.nextNode());
 				}
 				stream_NULL_LITERAL.reset();
 
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:765:61: ( $name)?
+				// smaliParser.g:765:61: ( $name)?
 				if ( stream_name.hasNext() ) {
 					adaptor.addChild(root_1, stream_name.nextNode());
 				}
 				stream_name.reset();
 
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:765:67: ( nonvoid_type_descriptor )?
+				// smaliParser.g:765:67: ( nonvoid_type_descriptor )?
 				if ( stream_nonvoid_type_descriptor.hasNext() ) {
 					adaptor.addChild(root_1, stream_nonvoid_type_descriptor.nextTree());
 				}
 				stream_nonvoid_type_descriptor.reset();
 
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:765:93: ( $signature)?
+				// smaliParser.g:765:93: ( $signature)?
 				if ( stream_signature.hasNext() ) {
 					adaptor.addChild(root_1, stream_signature.nextNode());
 				}
@@ -8644,7 +8644,7 @@
 
 
 	// $ANTLR start "end_local_directive"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:767:1: end_local_directive : END_LOCAL_DIRECTIVE REGISTER -> ^( I_END_LOCAL[$start, \"I_END_LOCAL\"] REGISTER ) ;
+	// smaliParser.g:767:1: end_local_directive : END_LOCAL_DIRECTIVE REGISTER -> ^( I_END_LOCAL[$start, \"I_END_LOCAL\"] REGISTER ) ;
 	public final smaliParser.end_local_directive_return end_local_directive() throws RecognitionException {
 		smaliParser.end_local_directive_return retval = new smaliParser.end_local_directive_return();
 		retval.start = input.LT(1);
@@ -8660,29 +8660,29 @@
 		RewriteRuleTokenStream stream_END_LOCAL_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token END_LOCAL_DIRECTIVE");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:768:3: ( END_LOCAL_DIRECTIVE REGISTER -> ^( I_END_LOCAL[$start, \"I_END_LOCAL\"] REGISTER ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:768:5: END_LOCAL_DIRECTIVE REGISTER
+			// smaliParser.g:768:3: ( END_LOCAL_DIRECTIVE REGISTER -> ^( I_END_LOCAL[$start, \"I_END_LOCAL\"] REGISTER ) )
+			// smaliParser.g:768:5: END_LOCAL_DIRECTIVE REGISTER
 			{
-			END_LOCAL_DIRECTIVE227=(Token)match(input,END_LOCAL_DIRECTIVE,FOLLOW_END_LOCAL_DIRECTIVE_in_end_local_directive3556);
+			END_LOCAL_DIRECTIVE227=(Token)match(input,END_LOCAL_DIRECTIVE,FOLLOW_END_LOCAL_DIRECTIVE_in_end_local_directive3556);  
 			stream_END_LOCAL_DIRECTIVE.add(END_LOCAL_DIRECTIVE227);
 
-			REGISTER228=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_end_local_directive3558);
+			REGISTER228=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_end_local_directive3558);  
 			stream_REGISTER.add(REGISTER228);
 
 			// AST REWRITE
 			// elements: REGISTER
-			// token labels:
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 769:5: -> ^( I_END_LOCAL[$start, \"I_END_LOCAL\"] REGISTER )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:769:8: ^( I_END_LOCAL[$start, \"I_END_LOCAL\"] REGISTER )
+				// smaliParser.g:769:8: ^( I_END_LOCAL[$start, \"I_END_LOCAL\"] REGISTER )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_END_LOCAL, (retval.start), "I_END_LOCAL"), root_1);
@@ -8724,7 +8724,7 @@
 
 
 	// $ANTLR start "restart_local_directive"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:771:1: restart_local_directive : RESTART_LOCAL_DIRECTIVE REGISTER -> ^( I_RESTART_LOCAL[$start, \"I_RESTART_LOCAL\"] REGISTER ) ;
+	// smaliParser.g:771:1: restart_local_directive : RESTART_LOCAL_DIRECTIVE REGISTER -> ^( I_RESTART_LOCAL[$start, \"I_RESTART_LOCAL\"] REGISTER ) ;
 	public final smaliParser.restart_local_directive_return restart_local_directive() throws RecognitionException {
 		smaliParser.restart_local_directive_return retval = new smaliParser.restart_local_directive_return();
 		retval.start = input.LT(1);
@@ -8740,29 +8740,29 @@
 		RewriteRuleTokenStream stream_RESTART_LOCAL_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token RESTART_LOCAL_DIRECTIVE");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:772:3: ( RESTART_LOCAL_DIRECTIVE REGISTER -> ^( I_RESTART_LOCAL[$start, \"I_RESTART_LOCAL\"] REGISTER ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:772:5: RESTART_LOCAL_DIRECTIVE REGISTER
+			// smaliParser.g:772:3: ( RESTART_LOCAL_DIRECTIVE REGISTER -> ^( I_RESTART_LOCAL[$start, \"I_RESTART_LOCAL\"] REGISTER ) )
+			// smaliParser.g:772:5: RESTART_LOCAL_DIRECTIVE REGISTER
 			{
-			RESTART_LOCAL_DIRECTIVE229=(Token)match(input,RESTART_LOCAL_DIRECTIVE,FOLLOW_RESTART_LOCAL_DIRECTIVE_in_restart_local_directive3581);
+			RESTART_LOCAL_DIRECTIVE229=(Token)match(input,RESTART_LOCAL_DIRECTIVE,FOLLOW_RESTART_LOCAL_DIRECTIVE_in_restart_local_directive3581);  
 			stream_RESTART_LOCAL_DIRECTIVE.add(RESTART_LOCAL_DIRECTIVE229);
 
-			REGISTER230=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_restart_local_directive3583);
+			REGISTER230=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_restart_local_directive3583);  
 			stream_REGISTER.add(REGISTER230);
 
 			// AST REWRITE
 			// elements: REGISTER
-			// token labels:
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 773:5: -> ^( I_RESTART_LOCAL[$start, \"I_RESTART_LOCAL\"] REGISTER )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:773:8: ^( I_RESTART_LOCAL[$start, \"I_RESTART_LOCAL\"] REGISTER )
+				// smaliParser.g:773:8: ^( I_RESTART_LOCAL[$start, \"I_RESTART_LOCAL\"] REGISTER )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_RESTART_LOCAL, (retval.start), "I_RESTART_LOCAL"), root_1);
@@ -8804,7 +8804,7 @@
 
 
 	// $ANTLR start "prologue_directive"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:775:1: prologue_directive : PROLOGUE_DIRECTIVE -> ^( I_PROLOGUE[$start, \"I_PROLOGUE\"] ) ;
+	// smaliParser.g:775:1: prologue_directive : PROLOGUE_DIRECTIVE -> ^( I_PROLOGUE[$start, \"I_PROLOGUE\"] ) ;
 	public final smaliParser.prologue_directive_return prologue_directive() throws RecognitionException {
 		smaliParser.prologue_directive_return retval = new smaliParser.prologue_directive_return();
 		retval.start = input.LT(1);
@@ -8817,26 +8817,26 @@
 		RewriteRuleTokenStream stream_PROLOGUE_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token PROLOGUE_DIRECTIVE");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:776:3: ( PROLOGUE_DIRECTIVE -> ^( I_PROLOGUE[$start, \"I_PROLOGUE\"] ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:776:5: PROLOGUE_DIRECTIVE
+			// smaliParser.g:776:3: ( PROLOGUE_DIRECTIVE -> ^( I_PROLOGUE[$start, \"I_PROLOGUE\"] ) )
+			// smaliParser.g:776:5: PROLOGUE_DIRECTIVE
 			{
-			PROLOGUE_DIRECTIVE231=(Token)match(input,PROLOGUE_DIRECTIVE,FOLLOW_PROLOGUE_DIRECTIVE_in_prologue_directive3606);
+			PROLOGUE_DIRECTIVE231=(Token)match(input,PROLOGUE_DIRECTIVE,FOLLOW_PROLOGUE_DIRECTIVE_in_prologue_directive3606);  
 			stream_PROLOGUE_DIRECTIVE.add(PROLOGUE_DIRECTIVE231);
 
 			// AST REWRITE
-			// elements:
-			// token labels:
+			// elements: 
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 777:5: -> ^( I_PROLOGUE[$start, \"I_PROLOGUE\"] )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:777:8: ^( I_PROLOGUE[$start, \"I_PROLOGUE\"] )
+				// smaliParser.g:777:8: ^( I_PROLOGUE[$start, \"I_PROLOGUE\"] )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_PROLOGUE, (retval.start), "I_PROLOGUE"), root_1);
@@ -8877,7 +8877,7 @@
 
 
 	// $ANTLR start "epilogue_directive"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:779:1: epilogue_directive : EPILOGUE_DIRECTIVE -> ^( I_EPILOGUE[$start, \"I_EPILOGUE\"] ) ;
+	// smaliParser.g:779:1: epilogue_directive : EPILOGUE_DIRECTIVE -> ^( I_EPILOGUE[$start, \"I_EPILOGUE\"] ) ;
 	public final smaliParser.epilogue_directive_return epilogue_directive() throws RecognitionException {
 		smaliParser.epilogue_directive_return retval = new smaliParser.epilogue_directive_return();
 		retval.start = input.LT(1);
@@ -8890,26 +8890,26 @@
 		RewriteRuleTokenStream stream_EPILOGUE_DIRECTIVE=new RewriteRuleTokenStream(adaptor,"token EPILOGUE_DIRECTIVE");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:780:3: ( EPILOGUE_DIRECTIVE -> ^( I_EPILOGUE[$start, \"I_EPILOGUE\"] ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:780:5: EPILOGUE_DIRECTIVE
+			// smaliParser.g:780:3: ( EPILOGUE_DIRECTIVE -> ^( I_EPILOGUE[$start, \"I_EPILOGUE\"] ) )
+			// smaliParser.g:780:5: EPILOGUE_DIRECTIVE
 			{
-			EPILOGUE_DIRECTIVE232=(Token)match(input,EPILOGUE_DIRECTIVE,FOLLOW_EPILOGUE_DIRECTIVE_in_epilogue_directive3627);
+			EPILOGUE_DIRECTIVE232=(Token)match(input,EPILOGUE_DIRECTIVE,FOLLOW_EPILOGUE_DIRECTIVE_in_epilogue_directive3627);  
 			stream_EPILOGUE_DIRECTIVE.add(EPILOGUE_DIRECTIVE232);
 
 			// AST REWRITE
-			// elements:
-			// token labels:
+			// elements: 
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 781:5: -> ^( I_EPILOGUE[$start, \"I_EPILOGUE\"] )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:781:8: ^( I_EPILOGUE[$start, \"I_EPILOGUE\"] )
+				// smaliParser.g:781:8: ^( I_EPILOGUE[$start, \"I_EPILOGUE\"] )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_EPILOGUE, (retval.start), "I_EPILOGUE"), root_1);
@@ -8950,7 +8950,7 @@
 
 
 	// $ANTLR start "source_directive"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:783:1: source_directive : SOURCE_DIRECTIVE ( STRING_LITERAL )? -> ^( I_SOURCE[$start, \"I_SOURCE\"] ( STRING_LITERAL )? ) ;
+	// smaliParser.g:783:1: source_directive : SOURCE_DIRECTIVE ( STRING_LITERAL )? -> ^( I_SOURCE[$start, \"I_SOURCE\"] ( STRING_LITERAL )? ) ;
 	public final smaliParser.source_directive_return source_directive() throws RecognitionException {
 		smaliParser.source_directive_return retval = new smaliParser.source_directive_return();
 		retval.start = input.LT(1);
@@ -8966,13 +8966,13 @@
 		RewriteRuleTokenStream stream_STRING_LITERAL=new RewriteRuleTokenStream(adaptor,"token STRING_LITERAL");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:784:3: ( SOURCE_DIRECTIVE ( STRING_LITERAL )? -> ^( I_SOURCE[$start, \"I_SOURCE\"] ( STRING_LITERAL )? ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:784:5: SOURCE_DIRECTIVE ( STRING_LITERAL )?
+			// smaliParser.g:784:3: ( SOURCE_DIRECTIVE ( STRING_LITERAL )? -> ^( I_SOURCE[$start, \"I_SOURCE\"] ( STRING_LITERAL )? ) )
+			// smaliParser.g:784:5: SOURCE_DIRECTIVE ( STRING_LITERAL )?
 			{
-			SOURCE_DIRECTIVE233=(Token)match(input,SOURCE_DIRECTIVE,FOLLOW_SOURCE_DIRECTIVE_in_source_directive3648);
+			SOURCE_DIRECTIVE233=(Token)match(input,SOURCE_DIRECTIVE,FOLLOW_SOURCE_DIRECTIVE_in_source_directive3648);  
 			stream_SOURCE_DIRECTIVE.add(SOURCE_DIRECTIVE233);
 
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:784:22: ( STRING_LITERAL )?
+			// smaliParser.g:784:22: ( STRING_LITERAL )?
 			int alt47=2;
 			int LA47_0 = input.LA(1);
 			if ( (LA47_0==STRING_LITERAL) ) {
@@ -8980,9 +8980,9 @@
 			}
 			switch (alt47) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:784:22: STRING_LITERAL
+					// smaliParser.g:784:22: STRING_LITERAL
 					{
-					STRING_LITERAL234=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_source_directive3650);
+					STRING_LITERAL234=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_source_directive3650);  
 					stream_STRING_LITERAL.add(STRING_LITERAL234);
 
 					}
@@ -8992,22 +8992,22 @@
 
 			// AST REWRITE
 			// elements: STRING_LITERAL
-			// token labels:
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 785:5: -> ^( I_SOURCE[$start, \"I_SOURCE\"] ( STRING_LITERAL )? )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:785:8: ^( I_SOURCE[$start, \"I_SOURCE\"] ( STRING_LITERAL )? )
+				// smaliParser.g:785:8: ^( I_SOURCE[$start, \"I_SOURCE\"] ( STRING_LITERAL )? )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_SOURCE, (retval.start), "I_SOURCE"), root_1);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:785:39: ( STRING_LITERAL )?
+				// smaliParser.g:785:39: ( STRING_LITERAL )?
 				if ( stream_STRING_LITERAL.hasNext() ) {
 					adaptor.addChild(root_1, stream_STRING_LITERAL.nextNode());
 				}
@@ -9050,7 +9050,7 @@
 
 
 	// $ANTLR start "instruction_format12x"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:787:1: instruction_format12x : ( INSTRUCTION_FORMAT12x | INSTRUCTION_FORMAT12x_OR_ID -> INSTRUCTION_FORMAT12x[$INSTRUCTION_FORMAT12x_OR_ID] );
+	// smaliParser.g:787:1: instruction_format12x : ( INSTRUCTION_FORMAT12x | INSTRUCTION_FORMAT12x_OR_ID -> INSTRUCTION_FORMAT12x[$INSTRUCTION_FORMAT12x_OR_ID] );
 	public final smaliParser.instruction_format12x_return instruction_format12x() throws RecognitionException {
 		smaliParser.instruction_format12x_return retval = new smaliParser.instruction_format12x_return();
 		retval.start = input.LT(1);
@@ -9065,7 +9065,7 @@
 		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT12x_OR_ID=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT12x_OR_ID");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:788:3: ( INSTRUCTION_FORMAT12x | INSTRUCTION_FORMAT12x_OR_ID -> INSTRUCTION_FORMAT12x[$INSTRUCTION_FORMAT12x_OR_ID] )
+			// smaliParser.g:788:3: ( INSTRUCTION_FORMAT12x | INSTRUCTION_FORMAT12x_OR_ID -> INSTRUCTION_FORMAT12x[$INSTRUCTION_FORMAT12x_OR_ID] )
 			int alt48=2;
 			int LA48_0 = input.LA(1);
 			if ( (LA48_0==INSTRUCTION_FORMAT12x) ) {
@@ -9083,30 +9083,30 @@
 
 			switch (alt48) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:788:5: INSTRUCTION_FORMAT12x
+					// smaliParser.g:788:5: INSTRUCTION_FORMAT12x
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					INSTRUCTION_FORMAT12x235=(Token)match(input,INSTRUCTION_FORMAT12x,FOLLOW_INSTRUCTION_FORMAT12x_in_instruction_format12x3675);
+					INSTRUCTION_FORMAT12x235=(Token)match(input,INSTRUCTION_FORMAT12x,FOLLOW_INSTRUCTION_FORMAT12x_in_instruction_format12x3675); 
 					INSTRUCTION_FORMAT12x235_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT12x235);
 					adaptor.addChild(root_0, INSTRUCTION_FORMAT12x235_tree);
 
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:789:5: INSTRUCTION_FORMAT12x_OR_ID
+					// smaliParser.g:789:5: INSTRUCTION_FORMAT12x_OR_ID
 					{
-					INSTRUCTION_FORMAT12x_OR_ID236=(Token)match(input,INSTRUCTION_FORMAT12x_OR_ID,FOLLOW_INSTRUCTION_FORMAT12x_OR_ID_in_instruction_format12x3681);
+					INSTRUCTION_FORMAT12x_OR_ID236=(Token)match(input,INSTRUCTION_FORMAT12x_OR_ID,FOLLOW_INSTRUCTION_FORMAT12x_OR_ID_in_instruction_format12x3681);  
 					stream_INSTRUCTION_FORMAT12x_OR_ID.add(INSTRUCTION_FORMAT12x_OR_ID236);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -9150,7 +9150,7 @@
 
 
 	// $ANTLR start "instruction_format22s"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:791:1: instruction_format22s : ( INSTRUCTION_FORMAT22s | INSTRUCTION_FORMAT22s_OR_ID -> INSTRUCTION_FORMAT22s[$INSTRUCTION_FORMAT22s_OR_ID] );
+	// smaliParser.g:791:1: instruction_format22s : ( INSTRUCTION_FORMAT22s | INSTRUCTION_FORMAT22s_OR_ID -> INSTRUCTION_FORMAT22s[$INSTRUCTION_FORMAT22s_OR_ID] );
 	public final smaliParser.instruction_format22s_return instruction_format22s() throws RecognitionException {
 		smaliParser.instruction_format22s_return retval = new smaliParser.instruction_format22s_return();
 		retval.start = input.LT(1);
@@ -9165,7 +9165,7 @@
 		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT22s_OR_ID=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT22s_OR_ID");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:792:3: ( INSTRUCTION_FORMAT22s | INSTRUCTION_FORMAT22s_OR_ID -> INSTRUCTION_FORMAT22s[$INSTRUCTION_FORMAT22s_OR_ID] )
+			// smaliParser.g:792:3: ( INSTRUCTION_FORMAT22s | INSTRUCTION_FORMAT22s_OR_ID -> INSTRUCTION_FORMAT22s[$INSTRUCTION_FORMAT22s_OR_ID] )
 			int alt49=2;
 			int LA49_0 = input.LA(1);
 			if ( (LA49_0==INSTRUCTION_FORMAT22s) ) {
@@ -9183,30 +9183,30 @@
 
 			switch (alt49) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:792:5: INSTRUCTION_FORMAT22s
+					// smaliParser.g:792:5: INSTRUCTION_FORMAT22s
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					INSTRUCTION_FORMAT22s237=(Token)match(input,INSTRUCTION_FORMAT22s,FOLLOW_INSTRUCTION_FORMAT22s_in_instruction_format22s3696);
+					INSTRUCTION_FORMAT22s237=(Token)match(input,INSTRUCTION_FORMAT22s,FOLLOW_INSTRUCTION_FORMAT22s_in_instruction_format22s3696); 
 					INSTRUCTION_FORMAT22s237_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT22s237);
 					adaptor.addChild(root_0, INSTRUCTION_FORMAT22s237_tree);
 
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:793:5: INSTRUCTION_FORMAT22s_OR_ID
+					// smaliParser.g:793:5: INSTRUCTION_FORMAT22s_OR_ID
 					{
-					INSTRUCTION_FORMAT22s_OR_ID238=(Token)match(input,INSTRUCTION_FORMAT22s_OR_ID,FOLLOW_INSTRUCTION_FORMAT22s_OR_ID_in_instruction_format22s3702);
+					INSTRUCTION_FORMAT22s_OR_ID238=(Token)match(input,INSTRUCTION_FORMAT22s_OR_ID,FOLLOW_INSTRUCTION_FORMAT22s_OR_ID_in_instruction_format22s3702);  
 					stream_INSTRUCTION_FORMAT22s_OR_ID.add(INSTRUCTION_FORMAT22s_OR_ID238);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -9250,7 +9250,7 @@
 
 
 	// $ANTLR start "instruction_format31i"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:795:1: instruction_format31i : ( INSTRUCTION_FORMAT31i | INSTRUCTION_FORMAT31i_OR_ID -> INSTRUCTION_FORMAT31i[$INSTRUCTION_FORMAT31i_OR_ID] );
+	// smaliParser.g:795:1: instruction_format31i : ( INSTRUCTION_FORMAT31i | INSTRUCTION_FORMAT31i_OR_ID -> INSTRUCTION_FORMAT31i[$INSTRUCTION_FORMAT31i_OR_ID] );
 	public final smaliParser.instruction_format31i_return instruction_format31i() throws RecognitionException {
 		smaliParser.instruction_format31i_return retval = new smaliParser.instruction_format31i_return();
 		retval.start = input.LT(1);
@@ -9265,7 +9265,7 @@
 		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT31i_OR_ID=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT31i_OR_ID");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:796:3: ( INSTRUCTION_FORMAT31i | INSTRUCTION_FORMAT31i_OR_ID -> INSTRUCTION_FORMAT31i[$INSTRUCTION_FORMAT31i_OR_ID] )
+			// smaliParser.g:796:3: ( INSTRUCTION_FORMAT31i | INSTRUCTION_FORMAT31i_OR_ID -> INSTRUCTION_FORMAT31i[$INSTRUCTION_FORMAT31i_OR_ID] )
 			int alt50=2;
 			int LA50_0 = input.LA(1);
 			if ( (LA50_0==INSTRUCTION_FORMAT31i) ) {
@@ -9283,30 +9283,30 @@
 
 			switch (alt50) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:796:5: INSTRUCTION_FORMAT31i
+					// smaliParser.g:796:5: INSTRUCTION_FORMAT31i
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
 
-					INSTRUCTION_FORMAT31i239=(Token)match(input,INSTRUCTION_FORMAT31i,FOLLOW_INSTRUCTION_FORMAT31i_in_instruction_format31i3717);
+					INSTRUCTION_FORMAT31i239=(Token)match(input,INSTRUCTION_FORMAT31i,FOLLOW_INSTRUCTION_FORMAT31i_in_instruction_format31i3717); 
 					INSTRUCTION_FORMAT31i239_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT31i239);
 					adaptor.addChild(root_0, INSTRUCTION_FORMAT31i239_tree);
 
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:797:5: INSTRUCTION_FORMAT31i_OR_ID
+					// smaliParser.g:797:5: INSTRUCTION_FORMAT31i_OR_ID
 					{
-					INSTRUCTION_FORMAT31i_OR_ID240=(Token)match(input,INSTRUCTION_FORMAT31i_OR_ID,FOLLOW_INSTRUCTION_FORMAT31i_OR_ID_in_instruction_format31i3723);
+					INSTRUCTION_FORMAT31i_OR_ID240=(Token)match(input,INSTRUCTION_FORMAT31i_OR_ID,FOLLOW_INSTRUCTION_FORMAT31i_OR_ID_in_instruction_format31i3723);  
 					stream_INSTRUCTION_FORMAT31i_OR_ID.add(INSTRUCTION_FORMAT31i_OR_ID240);
 
 					// AST REWRITE
-					// elements:
-					// token labels:
+					// elements: 
+					// token labels: 
 					// rule labels: retval
-					// token list labels:
-					// rule list labels:
-					// wildcard labels:
+					// token list labels: 
+					// rule list labels: 
+					// wildcard labels: 
 					retval.tree = root_0;
 					RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
@@ -9350,7 +9350,7 @@
 
 
 	// $ANTLR start "instruction"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:801:1: instruction : ( insn_format10t | insn_format10x | insn_format10x_odex | insn_format11n | insn_format11x | insn_format12x | insn_format20bc | insn_format20t | insn_format21c_field | insn_format21c_field_odex | insn_format21c_string | insn_format21c_type | insn_format21ih | insn_format21lh | insn_format21s | insn_format21t | insn_format22b | insn_format22c_field | insn_format22c_field_odex | insn_format22c_type | insn_format22cs_field | insn_format22s | insn_format22t | insn_format22x | insn_format23x | insn_format30t | insn_format31c | insn_format31i | insn_format31t | insn_format32x | insn_format35c_method | insn_format35c_type | insn_format35c_method_odex | insn_format35mi_method | insn_format35ms_method | insn_format3rc_method | insn_format3rc_method_odex | insn_format3rc_type | insn_format3rmi_method | insn_format3rms_method | insn_format45cc_method | insn_format4rcc_method | insn_format51l | insn_array_data_directive | insn_packed_switch_directive | insn_sparse_switch_directive );
+	// smaliParser.g:801:1: instruction : ( insn_format10t | insn_format10x | insn_format10x_odex | insn_format11n | insn_format11x | insn_format12x | insn_format20bc | insn_format20t | insn_format21c_field | insn_format21c_field_odex | insn_format21c_string | insn_format21c_type | insn_format21ih | insn_format21lh | insn_format21s | insn_format21t | insn_format22b | insn_format22c_field | insn_format22c_field_odex | insn_format22c_type | insn_format22cs_field | insn_format22s | insn_format22t | insn_format22x | insn_format23x | insn_format30t | insn_format31c | insn_format31i | insn_format31t | insn_format32x | insn_format35c_method | insn_format35c_type | insn_format35c_method_odex | insn_format35mi_method | insn_format35ms_method | insn_format3rc_method | insn_format3rc_method_odex | insn_format3rc_type | insn_format3rmi_method | insn_format3rms_method | insn_format45cc_method | insn_format4rcc_method | insn_format51l | insn_array_data_directive | insn_packed_switch_directive | insn_sparse_switch_directive );
 	public final smaliParser.instruction_return instruction() throws RecognitionException {
 		smaliParser.instruction_return retval = new smaliParser.instruction_return();
 		retval.start = input.LT(1);
@@ -9406,7 +9406,7 @@
 
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:802:3: ( insn_format10t | insn_format10x | insn_format10x_odex | insn_format11n | insn_format11x | insn_format12x | insn_format20bc | insn_format20t | insn_format21c_field | insn_format21c_field_odex | insn_format21c_string | insn_format21c_type | insn_format21ih | insn_format21lh | insn_format21s | insn_format21t | insn_format22b | insn_format22c_field | insn_format22c_field_odex | insn_format22c_type | insn_format22cs_field | insn_format22s | insn_format22t | insn_format22x | insn_format23x | insn_format30t | insn_format31c | insn_format31i | insn_format31t | insn_format32x | insn_format35c_method | insn_format35c_type | insn_format35c_method_odex | insn_format35mi_method | insn_format35ms_method | insn_format3rc_method | insn_format3rc_method_odex | insn_format3rc_type | insn_format3rmi_method | insn_format3rms_method | insn_format45cc_method | insn_format4rcc_method | insn_format51l | insn_array_data_directive | insn_packed_switch_directive | insn_sparse_switch_directive )
+			// smaliParser.g:802:3: ( insn_format10t | insn_format10x | insn_format10x_odex | insn_format11n | insn_format11x | insn_format12x | insn_format20bc | insn_format20t | insn_format21c_field | insn_format21c_field_odex | insn_format21c_string | insn_format21c_type | insn_format21ih | insn_format21lh | insn_format21s | insn_format21t | insn_format22b | insn_format22c_field | insn_format22c_field_odex | insn_format22c_type | insn_format22cs_field | insn_format22s | insn_format22t | insn_format22x | insn_format23x | insn_format30t | insn_format31c | insn_format31i | insn_format31t | insn_format32x | insn_format35c_method | insn_format35c_type | insn_format35c_method_odex | insn_format35mi_method | insn_format35ms_method | insn_format3rc_method | insn_format3rc_method_odex | insn_format3rc_type | insn_format3rmi_method | insn_format3rms_method | insn_format45cc_method | insn_format4rcc_method | insn_format51l | insn_array_data_directive | insn_packed_switch_directive | insn_sparse_switch_directive )
 			int alt51=46;
 			switch ( input.LA(1) ) {
 			case INSTRUCTION_FORMAT10t:
@@ -9649,7 +9649,7 @@
 			}
 			switch (alt51) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:802:5: insn_format10t
+					// smaliParser.g:802:5: insn_format10t
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9663,7 +9663,7 @@
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:803:5: insn_format10x
+					// smaliParser.g:803:5: insn_format10x
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9677,7 +9677,7 @@
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:804:5: insn_format10x_odex
+					// smaliParser.g:804:5: insn_format10x_odex
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9691,7 +9691,7 @@
 					}
 					break;
 				case 4 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:805:5: insn_format11n
+					// smaliParser.g:805:5: insn_format11n
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9705,7 +9705,7 @@
 					}
 					break;
 				case 5 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:806:5: insn_format11x
+					// smaliParser.g:806:5: insn_format11x
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9719,7 +9719,7 @@
 					}
 					break;
 				case 6 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:807:5: insn_format12x
+					// smaliParser.g:807:5: insn_format12x
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9733,7 +9733,7 @@
 					}
 					break;
 				case 7 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:808:5: insn_format20bc
+					// smaliParser.g:808:5: insn_format20bc
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9747,7 +9747,7 @@
 					}
 					break;
 				case 8 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:809:5: insn_format20t
+					// smaliParser.g:809:5: insn_format20t
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9761,7 +9761,7 @@
 					}
 					break;
 				case 9 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:810:5: insn_format21c_field
+					// smaliParser.g:810:5: insn_format21c_field
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9775,7 +9775,7 @@
 					}
 					break;
 				case 10 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:811:5: insn_format21c_field_odex
+					// smaliParser.g:811:5: insn_format21c_field_odex
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9789,7 +9789,7 @@
 					}
 					break;
 				case 11 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:812:5: insn_format21c_string
+					// smaliParser.g:812:5: insn_format21c_string
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9803,7 +9803,7 @@
 					}
 					break;
 				case 12 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:813:5: insn_format21c_type
+					// smaliParser.g:813:5: insn_format21c_type
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9817,7 +9817,7 @@
 					}
 					break;
 				case 13 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:814:5: insn_format21ih
+					// smaliParser.g:814:5: insn_format21ih
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9831,7 +9831,7 @@
 					}
 					break;
 				case 14 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:815:5: insn_format21lh
+					// smaliParser.g:815:5: insn_format21lh
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9845,7 +9845,7 @@
 					}
 					break;
 				case 15 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:816:5: insn_format21s
+					// smaliParser.g:816:5: insn_format21s
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9859,7 +9859,7 @@
 					}
 					break;
 				case 16 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:817:5: insn_format21t
+					// smaliParser.g:817:5: insn_format21t
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9873,7 +9873,7 @@
 					}
 					break;
 				case 17 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:818:5: insn_format22b
+					// smaliParser.g:818:5: insn_format22b
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9887,7 +9887,7 @@
 					}
 					break;
 				case 18 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:819:5: insn_format22c_field
+					// smaliParser.g:819:5: insn_format22c_field
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9901,7 +9901,7 @@
 					}
 					break;
 				case 19 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:820:5: insn_format22c_field_odex
+					// smaliParser.g:820:5: insn_format22c_field_odex
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9915,7 +9915,7 @@
 					}
 					break;
 				case 20 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:821:5: insn_format22c_type
+					// smaliParser.g:821:5: insn_format22c_type
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9929,7 +9929,7 @@
 					}
 					break;
 				case 21 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:822:5: insn_format22cs_field
+					// smaliParser.g:822:5: insn_format22cs_field
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9943,7 +9943,7 @@
 					}
 					break;
 				case 22 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:823:5: insn_format22s
+					// smaliParser.g:823:5: insn_format22s
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9957,7 +9957,7 @@
 					}
 					break;
 				case 23 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:824:5: insn_format22t
+					// smaliParser.g:824:5: insn_format22t
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9971,7 +9971,7 @@
 					}
 					break;
 				case 24 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:825:5: insn_format22x
+					// smaliParser.g:825:5: insn_format22x
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9985,7 +9985,7 @@
 					}
 					break;
 				case 25 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:826:5: insn_format23x
+					// smaliParser.g:826:5: insn_format23x
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -9999,7 +9999,7 @@
 					}
 					break;
 				case 26 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:827:5: insn_format30t
+					// smaliParser.g:827:5: insn_format30t
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -10013,7 +10013,7 @@
 					}
 					break;
 				case 27 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:828:5: insn_format31c
+					// smaliParser.g:828:5: insn_format31c
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -10027,7 +10027,7 @@
 					}
 					break;
 				case 28 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:829:5: insn_format31i
+					// smaliParser.g:829:5: insn_format31i
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -10041,7 +10041,7 @@
 					}
 					break;
 				case 29 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:830:5: insn_format31t
+					// smaliParser.g:830:5: insn_format31t
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -10055,7 +10055,7 @@
 					}
 					break;
 				case 30 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:831:5: insn_format32x
+					// smaliParser.g:831:5: insn_format32x
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -10069,7 +10069,7 @@
 					}
 					break;
 				case 31 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:832:5: insn_format35c_method
+					// smaliParser.g:832:5: insn_format35c_method
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -10083,7 +10083,7 @@
 					}
 					break;
 				case 32 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:833:5: insn_format35c_type
+					// smaliParser.g:833:5: insn_format35c_type
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -10097,7 +10097,7 @@
 					}
 					break;
 				case 33 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:834:5: insn_format35c_method_odex
+					// smaliParser.g:834:5: insn_format35c_method_odex
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -10111,7 +10111,7 @@
 					}
 					break;
 				case 34 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:835:5: insn_format35mi_method
+					// smaliParser.g:835:5: insn_format35mi_method
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -10125,7 +10125,7 @@
 					}
 					break;
 				case 35 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:836:5: insn_format35ms_method
+					// smaliParser.g:836:5: insn_format35ms_method
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -10139,7 +10139,7 @@
 					}
 					break;
 				case 36 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:837:5: insn_format3rc_method
+					// smaliParser.g:837:5: insn_format3rc_method
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -10153,7 +10153,7 @@
 					}
 					break;
 				case 37 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:838:5: insn_format3rc_method_odex
+					// smaliParser.g:838:5: insn_format3rc_method_odex
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -10167,7 +10167,7 @@
 					}
 					break;
 				case 38 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:839:5: insn_format3rc_type
+					// smaliParser.g:839:5: insn_format3rc_type
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -10181,7 +10181,7 @@
 					}
 					break;
 				case 39 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:840:5: insn_format3rmi_method
+					// smaliParser.g:840:5: insn_format3rmi_method
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -10195,7 +10195,7 @@
 					}
 					break;
 				case 40 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:841:5: insn_format3rms_method
+					// smaliParser.g:841:5: insn_format3rms_method
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -10209,7 +10209,7 @@
 					}
 					break;
 				case 41 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:842:5: insn_format45cc_method
+					// smaliParser.g:842:5: insn_format45cc_method
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -10223,7 +10223,7 @@
 					}
 					break;
 				case 42 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:843:5: insn_format4rcc_method
+					// smaliParser.g:843:5: insn_format4rcc_method
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -10237,7 +10237,7 @@
 					}
 					break;
 				case 43 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:844:5: insn_format51l
+					// smaliParser.g:844:5: insn_format51l
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -10251,7 +10251,7 @@
 					}
 					break;
 				case 44 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:845:5: insn_array_data_directive
+					// smaliParser.g:845:5: insn_array_data_directive
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -10265,7 +10265,7 @@
 					}
 					break;
 				case 45 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:846:5: insn_packed_switch_directive
+					// smaliParser.g:846:5: insn_packed_switch_directive
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -10279,7 +10279,7 @@
 					}
 					break;
 				case 46 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:847:5: insn_sparse_switch_directive
+					// smaliParser.g:847:5: insn_sparse_switch_directive
 					{
 					root_0 = (CommonTree)adaptor.nil();
 
@@ -10321,7 +10321,7 @@
 
 
 	// $ANTLR start "insn_format10t"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:849:1: insn_format10t : INSTRUCTION_FORMAT10t label_ref -> ^( I_STATEMENT_FORMAT10t[$start, \"I_STATEMENT_FORMAT10t\"] INSTRUCTION_FORMAT10t label_ref ) ;
+	// smaliParser.g:849:1: insn_format10t : INSTRUCTION_FORMAT10t label_ref -> ^( I_STATEMENT_FORMAT10t[$start, \"I_STATEMENT_FORMAT10t\"] INSTRUCTION_FORMAT10t label_ref ) ;
 	public final smaliParser.insn_format10t_return insn_format10t() throws RecognitionException {
 		smaliParser.insn_format10t_return retval = new smaliParser.insn_format10t_return();
 		retval.start = input.LT(1);
@@ -10336,10 +10336,10 @@
 		RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:850:3: ( INSTRUCTION_FORMAT10t label_ref -> ^( I_STATEMENT_FORMAT10t[$start, \"I_STATEMENT_FORMAT10t\"] INSTRUCTION_FORMAT10t label_ref ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:852:5: INSTRUCTION_FORMAT10t label_ref
+			// smaliParser.g:850:3: ( INSTRUCTION_FORMAT10t label_ref -> ^( I_STATEMENT_FORMAT10t[$start, \"I_STATEMENT_FORMAT10t\"] INSTRUCTION_FORMAT10t label_ref ) )
+			// smaliParser.g:852:5: INSTRUCTION_FORMAT10t label_ref
 			{
-			INSTRUCTION_FORMAT10t287=(Token)match(input,INSTRUCTION_FORMAT10t,FOLLOW_INSTRUCTION_FORMAT10t_in_insn_format10t4030);
+			INSTRUCTION_FORMAT10t287=(Token)match(input,INSTRUCTION_FORMAT10t,FOLLOW_INSTRUCTION_FORMAT10t_in_insn_format10t4030);  
 			stream_INSTRUCTION_FORMAT10t.add(INSTRUCTION_FORMAT10t287);
 
 			pushFollow(FOLLOW_label_ref_in_insn_format10t4032);
@@ -10348,19 +10348,19 @@
 
 			stream_label_ref.add(label_ref288.getTree());
 			// AST REWRITE
-			// elements: label_ref, INSTRUCTION_FORMAT10t
-			// token labels:
+			// elements: INSTRUCTION_FORMAT10t, label_ref
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 853:5: -> ^( I_STATEMENT_FORMAT10t[$start, \"I_STATEMENT_FORMAT10t\"] INSTRUCTION_FORMAT10t label_ref )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:853:8: ^( I_STATEMENT_FORMAT10t[$start, \"I_STATEMENT_FORMAT10t\"] INSTRUCTION_FORMAT10t label_ref )
+				// smaliParser.g:853:8: ^( I_STATEMENT_FORMAT10t[$start, \"I_STATEMENT_FORMAT10t\"] INSTRUCTION_FORMAT10t label_ref )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT10t, (retval.start), "I_STATEMENT_FORMAT10t"), root_1);
@@ -10403,7 +10403,7 @@
 
 
 	// $ANTLR start "insn_format10x"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:855:1: insn_format10x : INSTRUCTION_FORMAT10x -> ^( I_STATEMENT_FORMAT10x[$start, \"I_STATEMENT_FORMAT10x\"] INSTRUCTION_FORMAT10x ) ;
+	// smaliParser.g:855:1: insn_format10x : INSTRUCTION_FORMAT10x -> ^( I_STATEMENT_FORMAT10x[$start, \"I_STATEMENT_FORMAT10x\"] INSTRUCTION_FORMAT10x ) ;
 	public final smaliParser.insn_format10x_return insn_format10x() throws RecognitionException {
 		smaliParser.insn_format10x_return retval = new smaliParser.insn_format10x_return();
 		retval.start = input.LT(1);
@@ -10416,26 +10416,26 @@
 		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT10x=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT10x");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:856:3: ( INSTRUCTION_FORMAT10x -> ^( I_STATEMENT_FORMAT10x[$start, \"I_STATEMENT_FORMAT10x\"] INSTRUCTION_FORMAT10x ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:857:5: INSTRUCTION_FORMAT10x
+			// smaliParser.g:856:3: ( INSTRUCTION_FORMAT10x -> ^( I_STATEMENT_FORMAT10x[$start, \"I_STATEMENT_FORMAT10x\"] INSTRUCTION_FORMAT10x ) )
+			// smaliParser.g:857:5: INSTRUCTION_FORMAT10x
 			{
-			INSTRUCTION_FORMAT10x289=(Token)match(input,INSTRUCTION_FORMAT10x,FOLLOW_INSTRUCTION_FORMAT10x_in_insn_format10x4062);
+			INSTRUCTION_FORMAT10x289=(Token)match(input,INSTRUCTION_FORMAT10x,FOLLOW_INSTRUCTION_FORMAT10x_in_insn_format10x4062);  
 			stream_INSTRUCTION_FORMAT10x.add(INSTRUCTION_FORMAT10x289);
 
 			// AST REWRITE
 			// elements: INSTRUCTION_FORMAT10x
-			// token labels:
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 858:5: -> ^( I_STATEMENT_FORMAT10x[$start, \"I_STATEMENT_FORMAT10x\"] INSTRUCTION_FORMAT10x )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:858:8: ^( I_STATEMENT_FORMAT10x[$start, \"I_STATEMENT_FORMAT10x\"] INSTRUCTION_FORMAT10x )
+				// smaliParser.g:858:8: ^( I_STATEMENT_FORMAT10x[$start, \"I_STATEMENT_FORMAT10x\"] INSTRUCTION_FORMAT10x )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT10x, (retval.start), "I_STATEMENT_FORMAT10x"), root_1);
@@ -10477,7 +10477,7 @@
 
 
 	// $ANTLR start "insn_format10x_odex"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:860:1: insn_format10x_odex : INSTRUCTION_FORMAT10x_ODEX ;
+	// smaliParser.g:860:1: insn_format10x_odex : INSTRUCTION_FORMAT10x_ODEX ;
 	public final smaliParser.insn_format10x_odex_return insn_format10x_odex() throws RecognitionException {
 		smaliParser.insn_format10x_odex_return retval = new smaliParser.insn_format10x_odex_return();
 		retval.start = input.LT(1);
@@ -10489,19 +10489,19 @@
 		CommonTree INSTRUCTION_FORMAT10x_ODEX290_tree=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:861:3: ( INSTRUCTION_FORMAT10x_ODEX )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:862:5: INSTRUCTION_FORMAT10x_ODEX
+			// smaliParser.g:861:3: ( INSTRUCTION_FORMAT10x_ODEX )
+			// smaliParser.g:862:5: INSTRUCTION_FORMAT10x_ODEX
 			{
 			root_0 = (CommonTree)adaptor.nil();
 
 
-			INSTRUCTION_FORMAT10x_ODEX290=(Token)match(input,INSTRUCTION_FORMAT10x_ODEX,FOLLOW_INSTRUCTION_FORMAT10x_ODEX_in_insn_format10x_odex4090);
+			INSTRUCTION_FORMAT10x_ODEX290=(Token)match(input,INSTRUCTION_FORMAT10x_ODEX,FOLLOW_INSTRUCTION_FORMAT10x_ODEX_in_insn_format10x_odex4090); 
 			INSTRUCTION_FORMAT10x_ODEX290_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT10x_ODEX290);
 			adaptor.addChild(root_0, INSTRUCTION_FORMAT10x_ODEX290_tree);
 
 
 			      throwOdexedInstructionException(input, (INSTRUCTION_FORMAT10x_ODEX290!=null?INSTRUCTION_FORMAT10x_ODEX290.getText():null));
-			
+			    
 			}
 
 			retval.stop = input.LT(-1);
@@ -10531,7 +10531,7 @@
 
 
 	// $ANTLR start "insn_format11n"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:867:1: insn_format11n : INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT11n[$start, \"I_STATEMENT_FORMAT11n\"] INSTRUCTION_FORMAT11n REGISTER integral_literal ) ;
+	// smaliParser.g:867:1: insn_format11n : INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT11n[$start, \"I_STATEMENT_FORMAT11n\"] INSTRUCTION_FORMAT11n REGISTER integral_literal ) ;
 	public final smaliParser.insn_format11n_return insn_format11n() throws RecognitionException {
 		smaliParser.insn_format11n_return retval = new smaliParser.insn_format11n_return();
 		retval.start = input.LT(1);
@@ -10552,16 +10552,16 @@
 		RewriteRuleSubtreeStream stream_integral_literal=new RewriteRuleSubtreeStream(adaptor,"rule integral_literal");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:868:3: ( INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT11n[$start, \"I_STATEMENT_FORMAT11n\"] INSTRUCTION_FORMAT11n REGISTER integral_literal ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:869:5: INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal
+			// smaliParser.g:868:3: ( INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT11n[$start, \"I_STATEMENT_FORMAT11n\"] INSTRUCTION_FORMAT11n REGISTER integral_literal ) )
+			// smaliParser.g:869:5: INSTRUCTION_FORMAT11n REGISTER COMMA integral_literal
 			{
-			INSTRUCTION_FORMAT11n291=(Token)match(input,INSTRUCTION_FORMAT11n,FOLLOW_INSTRUCTION_FORMAT11n_in_insn_format11n4111);
+			INSTRUCTION_FORMAT11n291=(Token)match(input,INSTRUCTION_FORMAT11n,FOLLOW_INSTRUCTION_FORMAT11n_in_insn_format11n4111);  
 			stream_INSTRUCTION_FORMAT11n.add(INSTRUCTION_FORMAT11n291);
 
-			REGISTER292=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format11n4113);
+			REGISTER292=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format11n4113);  
 			stream_REGISTER.add(REGISTER292);
 
-			COMMA293=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format11n4115);
+			COMMA293=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format11n4115);  
 			stream_COMMA.add(COMMA293);
 
 			pushFollow(FOLLOW_integral_literal_in_insn_format11n4117);
@@ -10570,19 +10570,19 @@
 
 			stream_integral_literal.add(integral_literal294.getTree());
 			// AST REWRITE
-			// elements: INSTRUCTION_FORMAT11n, integral_literal, REGISTER
-			// token labels:
+			// elements: integral_literal, INSTRUCTION_FORMAT11n, REGISTER
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 870:5: -> ^( I_STATEMENT_FORMAT11n[$start, \"I_STATEMENT_FORMAT11n\"] INSTRUCTION_FORMAT11n REGISTER integral_literal )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:870:8: ^( I_STATEMENT_FORMAT11n[$start, \"I_STATEMENT_FORMAT11n\"] INSTRUCTION_FORMAT11n REGISTER integral_literal )
+				// smaliParser.g:870:8: ^( I_STATEMENT_FORMAT11n[$start, \"I_STATEMENT_FORMAT11n\"] INSTRUCTION_FORMAT11n REGISTER integral_literal )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT11n, (retval.start), "I_STATEMENT_FORMAT11n"), root_1);
@@ -10626,7 +10626,7 @@
 
 
 	// $ANTLR start "insn_format11x"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:872:1: insn_format11x : INSTRUCTION_FORMAT11x REGISTER -> ^( I_STATEMENT_FORMAT11x[$start, \"I_STATEMENT_FORMAT11x\"] INSTRUCTION_FORMAT11x REGISTER ) ;
+	// smaliParser.g:872:1: insn_format11x : INSTRUCTION_FORMAT11x REGISTER -> ^( I_STATEMENT_FORMAT11x[$start, \"I_STATEMENT_FORMAT11x\"] INSTRUCTION_FORMAT11x REGISTER ) ;
 	public final smaliParser.insn_format11x_return insn_format11x() throws RecognitionException {
 		smaliParser.insn_format11x_return retval = new smaliParser.insn_format11x_return();
 		retval.start = input.LT(1);
@@ -10642,29 +10642,29 @@
 		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT11x=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT11x");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:873:3: ( INSTRUCTION_FORMAT11x REGISTER -> ^( I_STATEMENT_FORMAT11x[$start, \"I_STATEMENT_FORMAT11x\"] INSTRUCTION_FORMAT11x REGISTER ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:874:5: INSTRUCTION_FORMAT11x REGISTER
+			// smaliParser.g:873:3: ( INSTRUCTION_FORMAT11x REGISTER -> ^( I_STATEMENT_FORMAT11x[$start, \"I_STATEMENT_FORMAT11x\"] INSTRUCTION_FORMAT11x REGISTER ) )
+			// smaliParser.g:874:5: INSTRUCTION_FORMAT11x REGISTER
 			{
-			INSTRUCTION_FORMAT11x295=(Token)match(input,INSTRUCTION_FORMAT11x,FOLLOW_INSTRUCTION_FORMAT11x_in_insn_format11x4149);
+			INSTRUCTION_FORMAT11x295=(Token)match(input,INSTRUCTION_FORMAT11x,FOLLOW_INSTRUCTION_FORMAT11x_in_insn_format11x4149);  
 			stream_INSTRUCTION_FORMAT11x.add(INSTRUCTION_FORMAT11x295);
 
-			REGISTER296=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format11x4151);
+			REGISTER296=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format11x4151);  
 			stream_REGISTER.add(REGISTER296);
 
 			// AST REWRITE
-			// elements: INSTRUCTION_FORMAT11x, REGISTER
-			// token labels:
+			// elements: REGISTER, INSTRUCTION_FORMAT11x
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 875:5: -> ^( I_STATEMENT_FORMAT11x[$start, \"I_STATEMENT_FORMAT11x\"] INSTRUCTION_FORMAT11x REGISTER )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:875:8: ^( I_STATEMENT_FORMAT11x[$start, \"I_STATEMENT_FORMAT11x\"] INSTRUCTION_FORMAT11x REGISTER )
+				// smaliParser.g:875:8: ^( I_STATEMENT_FORMAT11x[$start, \"I_STATEMENT_FORMAT11x\"] INSTRUCTION_FORMAT11x REGISTER )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT11x, (retval.start), "I_STATEMENT_FORMAT11x"), root_1);
@@ -10707,7 +10707,7 @@
 
 
 	// $ANTLR start "insn_format12x"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:877:1: insn_format12x : instruction_format12x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT12x[$start, \"I_STATEMENT_FORMAT12x\"] instruction_format12x REGISTER REGISTER ) ;
+	// smaliParser.g:877:1: insn_format12x : instruction_format12x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT12x[$start, \"I_STATEMENT_FORMAT12x\"] instruction_format12x REGISTER REGISTER ) ;
 	public final smaliParser.insn_format12x_return insn_format12x() throws RecognitionException {
 		smaliParser.insn_format12x_return retval = new smaliParser.insn_format12x_return();
 		retval.start = input.LT(1);
@@ -10727,37 +10727,37 @@
 		RewriteRuleSubtreeStream stream_instruction_format12x=new RewriteRuleSubtreeStream(adaptor,"rule instruction_format12x");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:878:3: ( instruction_format12x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT12x[$start, \"I_STATEMENT_FORMAT12x\"] instruction_format12x REGISTER REGISTER ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:879:5: instruction_format12x REGISTER COMMA REGISTER
+			// smaliParser.g:878:3: ( instruction_format12x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT12x[$start, \"I_STATEMENT_FORMAT12x\"] instruction_format12x REGISTER REGISTER ) )
+			// smaliParser.g:879:5: instruction_format12x REGISTER COMMA REGISTER
 			{
 			pushFollow(FOLLOW_instruction_format12x_in_insn_format12x4181);
 			instruction_format12x297=instruction_format12x();
 			state._fsp--;
 
 			stream_instruction_format12x.add(instruction_format12x297.getTree());
-			REGISTER298=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format12x4183);
+			REGISTER298=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format12x4183);  
 			stream_REGISTER.add(REGISTER298);
 
-			COMMA299=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format12x4185);
+			COMMA299=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format12x4185);  
 			stream_COMMA.add(COMMA299);
 
-			REGISTER300=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format12x4187);
+			REGISTER300=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format12x4187);  
 			stream_REGISTER.add(REGISTER300);
 
 			// AST REWRITE
 			// elements: REGISTER, instruction_format12x, REGISTER
-			// token labels:
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 880:5: -> ^( I_STATEMENT_FORMAT12x[$start, \"I_STATEMENT_FORMAT12x\"] instruction_format12x REGISTER REGISTER )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:880:8: ^( I_STATEMENT_FORMAT12x[$start, \"I_STATEMENT_FORMAT12x\"] instruction_format12x REGISTER REGISTER )
+				// smaliParser.g:880:8: ^( I_STATEMENT_FORMAT12x[$start, \"I_STATEMENT_FORMAT12x\"] instruction_format12x REGISTER REGISTER )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT12x, (retval.start), "I_STATEMENT_FORMAT12x"), root_1);
@@ -10801,7 +10801,7 @@
 
 
 	// $ANTLR start "insn_format20bc"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:882:1: insn_format20bc : INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference -> ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference ) ;
+	// smaliParser.g:882:1: insn_format20bc : INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference -> ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference ) ;
 	public final smaliParser.insn_format20bc_return insn_format20bc() throws RecognitionException {
 		smaliParser.insn_format20bc_return retval = new smaliParser.insn_format20bc_return();
 		retval.start = input.LT(1);
@@ -10822,16 +10822,16 @@
 		RewriteRuleSubtreeStream stream_verification_error_reference=new RewriteRuleSubtreeStream(adaptor,"rule verification_error_reference");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:883:3: ( INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference -> ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:884:5: INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference
+			// smaliParser.g:883:3: ( INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference -> ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference ) )
+			// smaliParser.g:884:5: INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE COMMA verification_error_reference
 			{
-			INSTRUCTION_FORMAT20bc301=(Token)match(input,INSTRUCTION_FORMAT20bc,FOLLOW_INSTRUCTION_FORMAT20bc_in_insn_format20bc4219);
+			INSTRUCTION_FORMAT20bc301=(Token)match(input,INSTRUCTION_FORMAT20bc,FOLLOW_INSTRUCTION_FORMAT20bc_in_insn_format20bc4219);  
 			stream_INSTRUCTION_FORMAT20bc.add(INSTRUCTION_FORMAT20bc301);
 
-			VERIFICATION_ERROR_TYPE302=(Token)match(input,VERIFICATION_ERROR_TYPE,FOLLOW_VERIFICATION_ERROR_TYPE_in_insn_format20bc4221);
+			VERIFICATION_ERROR_TYPE302=(Token)match(input,VERIFICATION_ERROR_TYPE,FOLLOW_VERIFICATION_ERROR_TYPE_in_insn_format20bc4221);  
 			stream_VERIFICATION_ERROR_TYPE.add(VERIFICATION_ERROR_TYPE302);
 
-			COMMA303=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format20bc4223);
+			COMMA303=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format20bc4223);  
 			stream_COMMA.add(COMMA303);
 
 			pushFollow(FOLLOW_verification_error_reference_in_insn_format20bc4225);
@@ -10843,21 +10843,21 @@
 			      if (!allowOdex || opcodes.getOpcodeByName((INSTRUCTION_FORMAT20bc301!=null?INSTRUCTION_FORMAT20bc301.getText():null)) == null || apiLevel >= 14) {
 			        throwOdexedInstructionException(input, (INSTRUCTION_FORMAT20bc301!=null?INSTRUCTION_FORMAT20bc301.getText():null));
 			      }
-			
+			    
 			// AST REWRITE
-			// elements: INSTRUCTION_FORMAT20bc, verification_error_reference, VERIFICATION_ERROR_TYPE
-			// token labels:
+			// elements: VERIFICATION_ERROR_TYPE, verification_error_reference, INSTRUCTION_FORMAT20bc
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 890:5: -> ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:890:8: ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference )
+				// smaliParser.g:890:8: ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc VERIFICATION_ERROR_TYPE verification_error_reference )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT20bc, "I_STATEMENT_FORMAT20bc"), root_1);
@@ -10901,7 +10901,7 @@
 
 
 	// $ANTLR start "insn_format20t"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:892:1: insn_format20t : INSTRUCTION_FORMAT20t label_ref -> ^( I_STATEMENT_FORMAT20t[$start, \"I_STATEMENT_FORMAT20t\"] INSTRUCTION_FORMAT20t label_ref ) ;
+	// smaliParser.g:892:1: insn_format20t : INSTRUCTION_FORMAT20t label_ref -> ^( I_STATEMENT_FORMAT20t[$start, \"I_STATEMENT_FORMAT20t\"] INSTRUCTION_FORMAT20t label_ref ) ;
 	public final smaliParser.insn_format20t_return insn_format20t() throws RecognitionException {
 		smaliParser.insn_format20t_return retval = new smaliParser.insn_format20t_return();
 		retval.start = input.LT(1);
@@ -10916,10 +10916,10 @@
 		RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:893:3: ( INSTRUCTION_FORMAT20t label_ref -> ^( I_STATEMENT_FORMAT20t[$start, \"I_STATEMENT_FORMAT20t\"] INSTRUCTION_FORMAT20t label_ref ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:894:5: INSTRUCTION_FORMAT20t label_ref
+			// smaliParser.g:893:3: ( INSTRUCTION_FORMAT20t label_ref -> ^( I_STATEMENT_FORMAT20t[$start, \"I_STATEMENT_FORMAT20t\"] INSTRUCTION_FORMAT20t label_ref ) )
+			// smaliParser.g:894:5: INSTRUCTION_FORMAT20t label_ref
 			{
-			INSTRUCTION_FORMAT20t305=(Token)match(input,INSTRUCTION_FORMAT20t,FOLLOW_INSTRUCTION_FORMAT20t_in_insn_format20t4262);
+			INSTRUCTION_FORMAT20t305=(Token)match(input,INSTRUCTION_FORMAT20t,FOLLOW_INSTRUCTION_FORMAT20t_in_insn_format20t4262);  
 			stream_INSTRUCTION_FORMAT20t.add(INSTRUCTION_FORMAT20t305);
 
 			pushFollow(FOLLOW_label_ref_in_insn_format20t4264);
@@ -10928,19 +10928,19 @@
 
 			stream_label_ref.add(label_ref306.getTree());
 			// AST REWRITE
-			// elements: label_ref, INSTRUCTION_FORMAT20t
-			// token labels:
+			// elements: INSTRUCTION_FORMAT20t, label_ref
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 895:5: -> ^( I_STATEMENT_FORMAT20t[$start, \"I_STATEMENT_FORMAT20t\"] INSTRUCTION_FORMAT20t label_ref )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:895:8: ^( I_STATEMENT_FORMAT20t[$start, \"I_STATEMENT_FORMAT20t\"] INSTRUCTION_FORMAT20t label_ref )
+				// smaliParser.g:895:8: ^( I_STATEMENT_FORMAT20t[$start, \"I_STATEMENT_FORMAT20t\"] INSTRUCTION_FORMAT20t label_ref )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT20t, (retval.start), "I_STATEMENT_FORMAT20t"), root_1);
@@ -10983,7 +10983,7 @@
 
 
 	// $ANTLR start "insn_format21c_field"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:897:1: insn_format21c_field : INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD REGISTER field_reference ) ;
+	// smaliParser.g:897:1: insn_format21c_field : INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD REGISTER field_reference ) ;
 	public final smaliParser.insn_format21c_field_return insn_format21c_field() throws RecognitionException {
 		smaliParser.insn_format21c_field_return retval = new smaliParser.insn_format21c_field_return();
 		retval.start = input.LT(1);
@@ -11004,16 +11004,16 @@
 		RewriteRuleSubtreeStream stream_field_reference=new RewriteRuleSubtreeStream(adaptor,"rule field_reference");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:898:3: ( INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD REGISTER field_reference ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:899:5: INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA field_reference
+			// smaliParser.g:898:3: ( INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD REGISTER field_reference ) )
+			// smaliParser.g:899:5: INSTRUCTION_FORMAT21c_FIELD REGISTER COMMA field_reference
 			{
-			INSTRUCTION_FORMAT21c_FIELD307=(Token)match(input,INSTRUCTION_FORMAT21c_FIELD,FOLLOW_INSTRUCTION_FORMAT21c_FIELD_in_insn_format21c_field4294);
+			INSTRUCTION_FORMAT21c_FIELD307=(Token)match(input,INSTRUCTION_FORMAT21c_FIELD,FOLLOW_INSTRUCTION_FORMAT21c_FIELD_in_insn_format21c_field4294);  
 			stream_INSTRUCTION_FORMAT21c_FIELD.add(INSTRUCTION_FORMAT21c_FIELD307);
 
-			REGISTER308=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_field4296);
+			REGISTER308=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_field4296);  
 			stream_REGISTER.add(REGISTER308);
 
-			COMMA309=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21c_field4298);
+			COMMA309=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21c_field4298);  
 			stream_COMMA.add(COMMA309);
 
 			pushFollow(FOLLOW_field_reference_in_insn_format21c_field4300);
@@ -11023,18 +11023,18 @@
 			stream_field_reference.add(field_reference310.getTree());
 			// AST REWRITE
 			// elements: REGISTER, INSTRUCTION_FORMAT21c_FIELD, field_reference
-			// token labels:
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 900:5: -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD REGISTER field_reference )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:900:8: ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD REGISTER field_reference )
+				// smaliParser.g:900:8: ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD REGISTER field_reference )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21c_FIELD, (retval.start), "I_STATEMENT_FORMAT21c_FIELD"), root_1);
@@ -11078,7 +11078,7 @@
 
 
 	// $ANTLR start "insn_format21c_field_odex"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:902:1: insn_format21c_field_odex : INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER field_reference ) ;
+	// smaliParser.g:902:1: insn_format21c_field_odex : INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER field_reference ) ;
 	public final smaliParser.insn_format21c_field_odex_return insn_format21c_field_odex() throws RecognitionException {
 		smaliParser.insn_format21c_field_odex_return retval = new smaliParser.insn_format21c_field_odex_return();
 		retval.start = input.LT(1);
@@ -11099,16 +11099,16 @@
 		RewriteRuleSubtreeStream stream_field_reference=new RewriteRuleSubtreeStream(adaptor,"rule field_reference");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:903:3: ( INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER field_reference ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:904:5: INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA field_reference
+			// smaliParser.g:903:3: ( INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER field_reference ) )
+			// smaliParser.g:904:5: INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER COMMA field_reference
 			{
-			INSTRUCTION_FORMAT21c_FIELD_ODEX311=(Token)match(input,INSTRUCTION_FORMAT21c_FIELD_ODEX,FOLLOW_INSTRUCTION_FORMAT21c_FIELD_ODEX_in_insn_format21c_field_odex4332);
+			INSTRUCTION_FORMAT21c_FIELD_ODEX311=(Token)match(input,INSTRUCTION_FORMAT21c_FIELD_ODEX,FOLLOW_INSTRUCTION_FORMAT21c_FIELD_ODEX_in_insn_format21c_field_odex4332);  
 			stream_INSTRUCTION_FORMAT21c_FIELD_ODEX.add(INSTRUCTION_FORMAT21c_FIELD_ODEX311);
 
-			REGISTER312=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_field_odex4334);
+			REGISTER312=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_field_odex4334);  
 			stream_REGISTER.add(REGISTER312);
 
-			COMMA313=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21c_field_odex4336);
+			COMMA313=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21c_field_odex4336);  
 			stream_COMMA.add(COMMA313);
 
 			pushFollow(FOLLOW_field_reference_in_insn_format21c_field_odex4338);
@@ -11120,21 +11120,21 @@
 			      if (!allowOdex || opcodes.getOpcodeByName((INSTRUCTION_FORMAT21c_FIELD_ODEX311!=null?INSTRUCTION_FORMAT21c_FIELD_ODEX311.getText():null)) == null || apiLevel >= 14) {
 			        throwOdexedInstructionException(input, (INSTRUCTION_FORMAT21c_FIELD_ODEX311!=null?INSTRUCTION_FORMAT21c_FIELD_ODEX311.getText():null));
 			      }
-			
+			    
 			// AST REWRITE
-			// elements: INSTRUCTION_FORMAT21c_FIELD_ODEX, field_reference, REGISTER
-			// token labels:
+			// elements: INSTRUCTION_FORMAT21c_FIELD_ODEX, REGISTER, field_reference
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 910:5: -> ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER field_reference )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:910:8: ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER field_reference )
+				// smaliParser.g:910:8: ^( I_STATEMENT_FORMAT21c_FIELD[$start, \"I_STATEMENT_FORMAT21c_FIELD\"] INSTRUCTION_FORMAT21c_FIELD_ODEX REGISTER field_reference )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21c_FIELD, (retval.start), "I_STATEMENT_FORMAT21c_FIELD"), root_1);
@@ -11178,7 +11178,7 @@
 
 
 	// $ANTLR start "insn_format21c_string"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:912:1: insn_format21c_string : INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL -> ^( I_STATEMENT_FORMAT21c_STRING[$start, \"I_STATEMENT_FORMAT21c_STRING\"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL ) ;
+	// smaliParser.g:912:1: insn_format21c_string : INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL -> ^( I_STATEMENT_FORMAT21c_STRING[$start, \"I_STATEMENT_FORMAT21c_STRING\"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL ) ;
 	public final smaliParser.insn_format21c_string_return insn_format21c_string() throws RecognitionException {
 		smaliParser.insn_format21c_string_return retval = new smaliParser.insn_format21c_string_return();
 		retval.start = input.LT(1);
@@ -11200,35 +11200,35 @@
 		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT21c_STRING=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT21c_STRING");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:913:3: ( INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL -> ^( I_STATEMENT_FORMAT21c_STRING[$start, \"I_STATEMENT_FORMAT21c_STRING\"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:914:5: INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL
+			// smaliParser.g:913:3: ( INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL -> ^( I_STATEMENT_FORMAT21c_STRING[$start, \"I_STATEMENT_FORMAT21c_STRING\"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL ) )
+			// smaliParser.g:914:5: INSTRUCTION_FORMAT21c_STRING REGISTER COMMA STRING_LITERAL
 			{
-			INSTRUCTION_FORMAT21c_STRING315=(Token)match(input,INSTRUCTION_FORMAT21c_STRING,FOLLOW_INSTRUCTION_FORMAT21c_STRING_in_insn_format21c_string4376);
+			INSTRUCTION_FORMAT21c_STRING315=(Token)match(input,INSTRUCTION_FORMAT21c_STRING,FOLLOW_INSTRUCTION_FORMAT21c_STRING_in_insn_format21c_string4376);  
 			stream_INSTRUCTION_FORMAT21c_STRING.add(INSTRUCTION_FORMAT21c_STRING315);
 
-			REGISTER316=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_string4378);
+			REGISTER316=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_string4378);  
 			stream_REGISTER.add(REGISTER316);
 
-			COMMA317=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21c_string4380);
+			COMMA317=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21c_string4380);  
 			stream_COMMA.add(COMMA317);
 
-			STRING_LITERAL318=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_insn_format21c_string4382);
+			STRING_LITERAL318=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_insn_format21c_string4382);  
 			stream_STRING_LITERAL.add(STRING_LITERAL318);
 
 			// AST REWRITE
-			// elements: INSTRUCTION_FORMAT21c_STRING, REGISTER, STRING_LITERAL
-			// token labels:
+			// elements: STRING_LITERAL, REGISTER, INSTRUCTION_FORMAT21c_STRING
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 915:5: -> ^( I_STATEMENT_FORMAT21c_STRING[$start, \"I_STATEMENT_FORMAT21c_STRING\"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:915:8: ^( I_STATEMENT_FORMAT21c_STRING[$start, \"I_STATEMENT_FORMAT21c_STRING\"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL )
+				// smaliParser.g:915:8: ^( I_STATEMENT_FORMAT21c_STRING[$start, \"I_STATEMENT_FORMAT21c_STRING\"] INSTRUCTION_FORMAT21c_STRING REGISTER STRING_LITERAL )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21c_STRING, (retval.start), "I_STATEMENT_FORMAT21c_STRING"), root_1);
@@ -11272,7 +11272,7 @@
 
 
 	// $ANTLR start "insn_format21c_type"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:917:1: insn_format21c_type : INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT21c_TYPE[$start, \"I_STATEMENT_FORMAT21c\"] INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) ;
+	// smaliParser.g:917:1: insn_format21c_type : INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT21c_TYPE[$start, \"I_STATEMENT_FORMAT21c\"] INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) ;
 	public final smaliParser.insn_format21c_type_return insn_format21c_type() throws RecognitionException {
 		smaliParser.insn_format21c_type_return retval = new smaliParser.insn_format21c_type_return();
 		retval.start = input.LT(1);
@@ -11293,16 +11293,16 @@
 		RewriteRuleSubtreeStream stream_nonvoid_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule nonvoid_type_descriptor");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:918:3: ( INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT21c_TYPE[$start, \"I_STATEMENT_FORMAT21c\"] INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:919:5: INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA nonvoid_type_descriptor
+			// smaliParser.g:918:3: ( INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT21c_TYPE[$start, \"I_STATEMENT_FORMAT21c\"] INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) )
+			// smaliParser.g:919:5: INSTRUCTION_FORMAT21c_TYPE REGISTER COMMA nonvoid_type_descriptor
 			{
-			INSTRUCTION_FORMAT21c_TYPE319=(Token)match(input,INSTRUCTION_FORMAT21c_TYPE,FOLLOW_INSTRUCTION_FORMAT21c_TYPE_in_insn_format21c_type4414);
+			INSTRUCTION_FORMAT21c_TYPE319=(Token)match(input,INSTRUCTION_FORMAT21c_TYPE,FOLLOW_INSTRUCTION_FORMAT21c_TYPE_in_insn_format21c_type4414);  
 			stream_INSTRUCTION_FORMAT21c_TYPE.add(INSTRUCTION_FORMAT21c_TYPE319);
 
-			REGISTER320=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_type4416);
+			REGISTER320=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_type4416);  
 			stream_REGISTER.add(REGISTER320);
 
-			COMMA321=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21c_type4418);
+			COMMA321=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21c_type4418);  
 			stream_COMMA.add(COMMA321);
 
 			pushFollow(FOLLOW_nonvoid_type_descriptor_in_insn_format21c_type4420);
@@ -11312,18 +11312,18 @@
 			stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor322.getTree());
 			// AST REWRITE
 			// elements: REGISTER, INSTRUCTION_FORMAT21c_TYPE, nonvoid_type_descriptor
-			// token labels:
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 920:5: -> ^( I_STATEMENT_FORMAT21c_TYPE[$start, \"I_STATEMENT_FORMAT21c\"] INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:920:8: ^( I_STATEMENT_FORMAT21c_TYPE[$start, \"I_STATEMENT_FORMAT21c\"] INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor )
+				// smaliParser.g:920:8: ^( I_STATEMENT_FORMAT21c_TYPE[$start, \"I_STATEMENT_FORMAT21c\"] INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21c_TYPE, (retval.start), "I_STATEMENT_FORMAT21c"), root_1);
@@ -11367,7 +11367,7 @@
 
 
 	// $ANTLR start "insn_format21ih"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:922:1: insn_format21ih : INSTRUCTION_FORMAT21ih REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT21ih[$start, \"I_STATEMENT_FORMAT21ih\"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) ;
+	// smaliParser.g:922:1: insn_format21ih : INSTRUCTION_FORMAT21ih REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT21ih[$start, \"I_STATEMENT_FORMAT21ih\"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) ;
 	public final smaliParser.insn_format21ih_return insn_format21ih() throws RecognitionException {
 		smaliParser.insn_format21ih_return retval = new smaliParser.insn_format21ih_return();
 		retval.start = input.LT(1);
@@ -11388,16 +11388,16 @@
 		RewriteRuleSubtreeStream stream_fixed_32bit_literal=new RewriteRuleSubtreeStream(adaptor,"rule fixed_32bit_literal");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:923:3: ( INSTRUCTION_FORMAT21ih REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT21ih[$start, \"I_STATEMENT_FORMAT21ih\"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:924:5: INSTRUCTION_FORMAT21ih REGISTER COMMA fixed_32bit_literal
+			// smaliParser.g:923:3: ( INSTRUCTION_FORMAT21ih REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT21ih[$start, \"I_STATEMENT_FORMAT21ih\"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) )
+			// smaliParser.g:924:5: INSTRUCTION_FORMAT21ih REGISTER COMMA fixed_32bit_literal
 			{
-			INSTRUCTION_FORMAT21ih323=(Token)match(input,INSTRUCTION_FORMAT21ih,FOLLOW_INSTRUCTION_FORMAT21ih_in_insn_format21ih4452);
+			INSTRUCTION_FORMAT21ih323=(Token)match(input,INSTRUCTION_FORMAT21ih,FOLLOW_INSTRUCTION_FORMAT21ih_in_insn_format21ih4452);  
 			stream_INSTRUCTION_FORMAT21ih.add(INSTRUCTION_FORMAT21ih323);
 
-			REGISTER324=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21ih4454);
+			REGISTER324=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21ih4454);  
 			stream_REGISTER.add(REGISTER324);
 
-			COMMA325=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21ih4456);
+			COMMA325=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21ih4456);  
 			stream_COMMA.add(COMMA325);
 
 			pushFollow(FOLLOW_fixed_32bit_literal_in_insn_format21ih4458);
@@ -11406,19 +11406,19 @@
 
 			stream_fixed_32bit_literal.add(fixed_32bit_literal326.getTree());
 			// AST REWRITE
-			// elements: fixed_32bit_literal, INSTRUCTION_FORMAT21ih, REGISTER
-			// token labels:
+			// elements: REGISTER, INSTRUCTION_FORMAT21ih, fixed_32bit_literal
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 925:5: -> ^( I_STATEMENT_FORMAT21ih[$start, \"I_STATEMENT_FORMAT21ih\"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:925:8: ^( I_STATEMENT_FORMAT21ih[$start, \"I_STATEMENT_FORMAT21ih\"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal )
+				// smaliParser.g:925:8: ^( I_STATEMENT_FORMAT21ih[$start, \"I_STATEMENT_FORMAT21ih\"] INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21ih, (retval.start), "I_STATEMENT_FORMAT21ih"), root_1);
@@ -11462,7 +11462,7 @@
 
 
 	// $ANTLR start "insn_format21lh"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:927:1: insn_format21lh : INSTRUCTION_FORMAT21lh REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT21lh[$start, \"I_STATEMENT_FORMAT21lh\"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal ) ;
+	// smaliParser.g:927:1: insn_format21lh : INSTRUCTION_FORMAT21lh REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT21lh[$start, \"I_STATEMENT_FORMAT21lh\"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal ) ;
 	public final smaliParser.insn_format21lh_return insn_format21lh() throws RecognitionException {
 		smaliParser.insn_format21lh_return retval = new smaliParser.insn_format21lh_return();
 		retval.start = input.LT(1);
@@ -11483,16 +11483,16 @@
 		RewriteRuleSubtreeStream stream_fixed_32bit_literal=new RewriteRuleSubtreeStream(adaptor,"rule fixed_32bit_literal");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:928:3: ( INSTRUCTION_FORMAT21lh REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT21lh[$start, \"I_STATEMENT_FORMAT21lh\"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:929:5: INSTRUCTION_FORMAT21lh REGISTER COMMA fixed_32bit_literal
+			// smaliParser.g:928:3: ( INSTRUCTION_FORMAT21lh REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT21lh[$start, \"I_STATEMENT_FORMAT21lh\"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal ) )
+			// smaliParser.g:929:5: INSTRUCTION_FORMAT21lh REGISTER COMMA fixed_32bit_literal
 			{
-			INSTRUCTION_FORMAT21lh327=(Token)match(input,INSTRUCTION_FORMAT21lh,FOLLOW_INSTRUCTION_FORMAT21lh_in_insn_format21lh4490);
+			INSTRUCTION_FORMAT21lh327=(Token)match(input,INSTRUCTION_FORMAT21lh,FOLLOW_INSTRUCTION_FORMAT21lh_in_insn_format21lh4490);  
 			stream_INSTRUCTION_FORMAT21lh.add(INSTRUCTION_FORMAT21lh327);
 
-			REGISTER328=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21lh4492);
+			REGISTER328=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21lh4492);  
 			stream_REGISTER.add(REGISTER328);
 
-			COMMA329=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21lh4494);
+			COMMA329=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21lh4494);  
 			stream_COMMA.add(COMMA329);
 
 			pushFollow(FOLLOW_fixed_32bit_literal_in_insn_format21lh4496);
@@ -11501,19 +11501,19 @@
 
 			stream_fixed_32bit_literal.add(fixed_32bit_literal330.getTree());
 			// AST REWRITE
-			// elements: fixed_32bit_literal, INSTRUCTION_FORMAT21lh, REGISTER
-			// token labels:
+			// elements: INSTRUCTION_FORMAT21lh, fixed_32bit_literal, REGISTER
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 930:5: -> ^( I_STATEMENT_FORMAT21lh[$start, \"I_STATEMENT_FORMAT21lh\"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:930:8: ^( I_STATEMENT_FORMAT21lh[$start, \"I_STATEMENT_FORMAT21lh\"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal )
+				// smaliParser.g:930:8: ^( I_STATEMENT_FORMAT21lh[$start, \"I_STATEMENT_FORMAT21lh\"] INSTRUCTION_FORMAT21lh REGISTER fixed_32bit_literal )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21lh, (retval.start), "I_STATEMENT_FORMAT21lh"), root_1);
@@ -11557,7 +11557,7 @@
 
 
 	// $ANTLR start "insn_format21s"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:932:1: insn_format21s : INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT21s[$start, \"I_STATEMENT_FORMAT21s\"] INSTRUCTION_FORMAT21s REGISTER integral_literal ) ;
+	// smaliParser.g:932:1: insn_format21s : INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT21s[$start, \"I_STATEMENT_FORMAT21s\"] INSTRUCTION_FORMAT21s REGISTER integral_literal ) ;
 	public final smaliParser.insn_format21s_return insn_format21s() throws RecognitionException {
 		smaliParser.insn_format21s_return retval = new smaliParser.insn_format21s_return();
 		retval.start = input.LT(1);
@@ -11578,16 +11578,16 @@
 		RewriteRuleSubtreeStream stream_integral_literal=new RewriteRuleSubtreeStream(adaptor,"rule integral_literal");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:933:3: ( INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT21s[$start, \"I_STATEMENT_FORMAT21s\"] INSTRUCTION_FORMAT21s REGISTER integral_literal ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:934:5: INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal
+			// smaliParser.g:933:3: ( INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT21s[$start, \"I_STATEMENT_FORMAT21s\"] INSTRUCTION_FORMAT21s REGISTER integral_literal ) )
+			// smaliParser.g:934:5: INSTRUCTION_FORMAT21s REGISTER COMMA integral_literal
 			{
-			INSTRUCTION_FORMAT21s331=(Token)match(input,INSTRUCTION_FORMAT21s,FOLLOW_INSTRUCTION_FORMAT21s_in_insn_format21s4528);
+			INSTRUCTION_FORMAT21s331=(Token)match(input,INSTRUCTION_FORMAT21s,FOLLOW_INSTRUCTION_FORMAT21s_in_insn_format21s4528);  
 			stream_INSTRUCTION_FORMAT21s.add(INSTRUCTION_FORMAT21s331);
 
-			REGISTER332=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21s4530);
+			REGISTER332=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21s4530);  
 			stream_REGISTER.add(REGISTER332);
 
-			COMMA333=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21s4532);
+			COMMA333=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21s4532);  
 			stream_COMMA.add(COMMA333);
 
 			pushFollow(FOLLOW_integral_literal_in_insn_format21s4534);
@@ -11596,19 +11596,19 @@
 
 			stream_integral_literal.add(integral_literal334.getTree());
 			// AST REWRITE
-			// elements: REGISTER, integral_literal, INSTRUCTION_FORMAT21s
-			// token labels:
+			// elements: integral_literal, REGISTER, INSTRUCTION_FORMAT21s
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 935:5: -> ^( I_STATEMENT_FORMAT21s[$start, \"I_STATEMENT_FORMAT21s\"] INSTRUCTION_FORMAT21s REGISTER integral_literal )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:935:8: ^( I_STATEMENT_FORMAT21s[$start, \"I_STATEMENT_FORMAT21s\"] INSTRUCTION_FORMAT21s REGISTER integral_literal )
+				// smaliParser.g:935:8: ^( I_STATEMENT_FORMAT21s[$start, \"I_STATEMENT_FORMAT21s\"] INSTRUCTION_FORMAT21s REGISTER integral_literal )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21s, (retval.start), "I_STATEMENT_FORMAT21s"), root_1);
@@ -11652,7 +11652,7 @@
 
 
 	// $ANTLR start "insn_format21t"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:937:1: insn_format21t : INSTRUCTION_FORMAT21t REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT21t[$start, \"I_STATEMENT_FORMAT21t\"] INSTRUCTION_FORMAT21t REGISTER label_ref ) ;
+	// smaliParser.g:937:1: insn_format21t : INSTRUCTION_FORMAT21t REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT21t[$start, \"I_STATEMENT_FORMAT21t\"] INSTRUCTION_FORMAT21t REGISTER label_ref ) ;
 	public final smaliParser.insn_format21t_return insn_format21t() throws RecognitionException {
 		smaliParser.insn_format21t_return retval = new smaliParser.insn_format21t_return();
 		retval.start = input.LT(1);
@@ -11673,16 +11673,16 @@
 		RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:938:3: ( INSTRUCTION_FORMAT21t REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT21t[$start, \"I_STATEMENT_FORMAT21t\"] INSTRUCTION_FORMAT21t REGISTER label_ref ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:939:5: INSTRUCTION_FORMAT21t REGISTER COMMA label_ref
+			// smaliParser.g:938:3: ( INSTRUCTION_FORMAT21t REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT21t[$start, \"I_STATEMENT_FORMAT21t\"] INSTRUCTION_FORMAT21t REGISTER label_ref ) )
+			// smaliParser.g:939:5: INSTRUCTION_FORMAT21t REGISTER COMMA label_ref
 			{
-			INSTRUCTION_FORMAT21t335=(Token)match(input,INSTRUCTION_FORMAT21t,FOLLOW_INSTRUCTION_FORMAT21t_in_insn_format21t4566);
+			INSTRUCTION_FORMAT21t335=(Token)match(input,INSTRUCTION_FORMAT21t,FOLLOW_INSTRUCTION_FORMAT21t_in_insn_format21t4566);  
 			stream_INSTRUCTION_FORMAT21t.add(INSTRUCTION_FORMAT21t335);
 
-			REGISTER336=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21t4568);
+			REGISTER336=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21t4568);  
 			stream_REGISTER.add(REGISTER336);
 
-			COMMA337=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21t4570);
+			COMMA337=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format21t4570);  
 			stream_COMMA.add(COMMA337);
 
 			pushFollow(FOLLOW_label_ref_in_insn_format21t4572);
@@ -11691,19 +11691,19 @@
 
 			stream_label_ref.add(label_ref338.getTree());
 			// AST REWRITE
-			// elements: label_ref, REGISTER, INSTRUCTION_FORMAT21t
-			// token labels:
+			// elements: INSTRUCTION_FORMAT21t, label_ref, REGISTER
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 940:5: -> ^( I_STATEMENT_FORMAT21t[$start, \"I_STATEMENT_FORMAT21t\"] INSTRUCTION_FORMAT21t REGISTER label_ref )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:940:8: ^( I_STATEMENT_FORMAT21t[$start, \"I_STATEMENT_FORMAT21t\"] INSTRUCTION_FORMAT21t REGISTER label_ref )
+				// smaliParser.g:940:8: ^( I_STATEMENT_FORMAT21t[$start, \"I_STATEMENT_FORMAT21t\"] INSTRUCTION_FORMAT21t REGISTER label_ref )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT21t, (retval.start), "I_STATEMENT_FORMAT21t"), root_1);
@@ -11747,7 +11747,7 @@
 
 
 	// $ANTLR start "insn_format22b"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:942:1: insn_format22b : INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT22b[$start, \"I_STATEMENT_FORMAT22b\"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal ) ;
+	// smaliParser.g:942:1: insn_format22b : INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT22b[$start, \"I_STATEMENT_FORMAT22b\"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal ) ;
 	public final smaliParser.insn_format22b_return insn_format22b() throws RecognitionException {
 		smaliParser.insn_format22b_return retval = new smaliParser.insn_format22b_return();
 		retval.start = input.LT(1);
@@ -11772,22 +11772,22 @@
 		RewriteRuleSubtreeStream stream_integral_literal=new RewriteRuleSubtreeStream(adaptor,"rule integral_literal");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:943:3: ( INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT22b[$start, \"I_STATEMENT_FORMAT22b\"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:944:5: INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal
+			// smaliParser.g:943:3: ( INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT22b[$start, \"I_STATEMENT_FORMAT22b\"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal ) )
+			// smaliParser.g:944:5: INSTRUCTION_FORMAT22b REGISTER COMMA REGISTER COMMA integral_literal
 			{
-			INSTRUCTION_FORMAT22b339=(Token)match(input,INSTRUCTION_FORMAT22b,FOLLOW_INSTRUCTION_FORMAT22b_in_insn_format22b4604);
+			INSTRUCTION_FORMAT22b339=(Token)match(input,INSTRUCTION_FORMAT22b,FOLLOW_INSTRUCTION_FORMAT22b_in_insn_format22b4604);  
 			stream_INSTRUCTION_FORMAT22b.add(INSTRUCTION_FORMAT22b339);
 
-			REGISTER340=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22b4606);
+			REGISTER340=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22b4606);  
 			stream_REGISTER.add(REGISTER340);
 
-			COMMA341=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22b4608);
+			COMMA341=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22b4608);  
 			stream_COMMA.add(COMMA341);
 
-			REGISTER342=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22b4610);
+			REGISTER342=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22b4610);  
 			stream_REGISTER.add(REGISTER342);
 
-			COMMA343=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22b4612);
+			COMMA343=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22b4612);  
 			stream_COMMA.add(COMMA343);
 
 			pushFollow(FOLLOW_integral_literal_in_insn_format22b4614);
@@ -11796,19 +11796,19 @@
 
 			stream_integral_literal.add(integral_literal344.getTree());
 			// AST REWRITE
-			// elements: INSTRUCTION_FORMAT22b, REGISTER, integral_literal, REGISTER
-			// token labels:
+			// elements: REGISTER, REGISTER, integral_literal, INSTRUCTION_FORMAT22b
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 945:5: -> ^( I_STATEMENT_FORMAT22b[$start, \"I_STATEMENT_FORMAT22b\"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:945:8: ^( I_STATEMENT_FORMAT22b[$start, \"I_STATEMENT_FORMAT22b\"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal )
+				// smaliParser.g:945:8: ^( I_STATEMENT_FORMAT22b[$start, \"I_STATEMENT_FORMAT22b\"] INSTRUCTION_FORMAT22b REGISTER REGISTER integral_literal )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT22b, (retval.start), "I_STATEMENT_FORMAT22b"), root_1);
@@ -11853,7 +11853,7 @@
 
 
 	// $ANTLR start "insn_format22c_field"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:947:1: insn_format22c_field : INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER field_reference ) ;
+	// smaliParser.g:947:1: insn_format22c_field : INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER field_reference ) ;
 	public final smaliParser.insn_format22c_field_return insn_format22c_field() throws RecognitionException {
 		smaliParser.insn_format22c_field_return retval = new smaliParser.insn_format22c_field_return();
 		retval.start = input.LT(1);
@@ -11878,22 +11878,22 @@
 		RewriteRuleSubtreeStream stream_field_reference=new RewriteRuleSubtreeStream(adaptor,"rule field_reference");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:948:3: ( INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER field_reference ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:949:5: INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA field_reference
+			// smaliParser.g:948:3: ( INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER field_reference ) )
+			// smaliParser.g:949:5: INSTRUCTION_FORMAT22c_FIELD REGISTER COMMA REGISTER COMMA field_reference
 			{
-			INSTRUCTION_FORMAT22c_FIELD345=(Token)match(input,INSTRUCTION_FORMAT22c_FIELD,FOLLOW_INSTRUCTION_FORMAT22c_FIELD_in_insn_format22c_field4648);
+			INSTRUCTION_FORMAT22c_FIELD345=(Token)match(input,INSTRUCTION_FORMAT22c_FIELD,FOLLOW_INSTRUCTION_FORMAT22c_FIELD_in_insn_format22c_field4648);  
 			stream_INSTRUCTION_FORMAT22c_FIELD.add(INSTRUCTION_FORMAT22c_FIELD345);
 
-			REGISTER346=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field4650);
+			REGISTER346=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field4650);  
 			stream_REGISTER.add(REGISTER346);
 
-			COMMA347=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_field4652);
+			COMMA347=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_field4652);  
 			stream_COMMA.add(COMMA347);
 
-			REGISTER348=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field4654);
+			REGISTER348=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field4654);  
 			stream_REGISTER.add(REGISTER348);
 
-			COMMA349=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_field4656);
+			COMMA349=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_field4656);  
 			stream_COMMA.add(COMMA349);
 
 			pushFollow(FOLLOW_field_reference_in_insn_format22c_field4658);
@@ -11902,19 +11902,19 @@
 
 			stream_field_reference.add(field_reference350.getTree());
 			// AST REWRITE
-			// elements: REGISTER, INSTRUCTION_FORMAT22c_FIELD, REGISTER, field_reference
-			// token labels:
+			// elements: INSTRUCTION_FORMAT22c_FIELD, REGISTER, field_reference, REGISTER
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 950:5: -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER field_reference )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:950:8: ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER field_reference )
+				// smaliParser.g:950:8: ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD REGISTER REGISTER field_reference )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT22c_FIELD, (retval.start), "I_STATEMENT_FORMAT22c_FIELD"), root_1);
@@ -11959,7 +11959,7 @@
 
 
 	// $ANTLR start "insn_format22c_field_odex"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:952:1: insn_format22c_field_odex : INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER field_reference ) ;
+	// smaliParser.g:952:1: insn_format22c_field_odex : INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER field_reference ) ;
 	public final smaliParser.insn_format22c_field_odex_return insn_format22c_field_odex() throws RecognitionException {
 		smaliParser.insn_format22c_field_odex_return retval = new smaliParser.insn_format22c_field_odex_return();
 		retval.start = input.LT(1);
@@ -11984,22 +11984,22 @@
 		RewriteRuleSubtreeStream stream_field_reference=new RewriteRuleSubtreeStream(adaptor,"rule field_reference");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:953:3: ( INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER field_reference ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:954:5: INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA field_reference
+			// smaliParser.g:953:3: ( INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA field_reference -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER field_reference ) )
+			// smaliParser.g:954:5: INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER COMMA REGISTER COMMA field_reference
 			{
-			INSTRUCTION_FORMAT22c_FIELD_ODEX351=(Token)match(input,INSTRUCTION_FORMAT22c_FIELD_ODEX,FOLLOW_INSTRUCTION_FORMAT22c_FIELD_ODEX_in_insn_format22c_field_odex4692);
+			INSTRUCTION_FORMAT22c_FIELD_ODEX351=(Token)match(input,INSTRUCTION_FORMAT22c_FIELD_ODEX,FOLLOW_INSTRUCTION_FORMAT22c_FIELD_ODEX_in_insn_format22c_field_odex4692);  
 			stream_INSTRUCTION_FORMAT22c_FIELD_ODEX.add(INSTRUCTION_FORMAT22c_FIELD_ODEX351);
 
-			REGISTER352=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field_odex4694);
+			REGISTER352=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field_odex4694);  
 			stream_REGISTER.add(REGISTER352);
 
-			COMMA353=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_field_odex4696);
+			COMMA353=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_field_odex4696);  
 			stream_COMMA.add(COMMA353);
 
-			REGISTER354=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field_odex4698);
+			REGISTER354=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field_odex4698);  
 			stream_REGISTER.add(REGISTER354);
 
-			COMMA355=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_field_odex4700);
+			COMMA355=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_field_odex4700);  
 			stream_COMMA.add(COMMA355);
 
 			pushFollow(FOLLOW_field_reference_in_insn_format22c_field_odex4702);
@@ -12011,21 +12011,21 @@
 			      if (!allowOdex || opcodes.getOpcodeByName((INSTRUCTION_FORMAT22c_FIELD_ODEX351!=null?INSTRUCTION_FORMAT22c_FIELD_ODEX351.getText():null)) == null || apiLevel >= 14) {
 			        throwOdexedInstructionException(input, (INSTRUCTION_FORMAT22c_FIELD_ODEX351!=null?INSTRUCTION_FORMAT22c_FIELD_ODEX351.getText():null));
 			      }
-			
+			    
 			// AST REWRITE
-			// elements: REGISTER, REGISTER, field_reference, INSTRUCTION_FORMAT22c_FIELD_ODEX
-			// token labels:
+			// elements: INSTRUCTION_FORMAT22c_FIELD_ODEX, field_reference, REGISTER, REGISTER
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 960:5: -> ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER field_reference )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:960:8: ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER field_reference )
+				// smaliParser.g:960:8: ^( I_STATEMENT_FORMAT22c_FIELD[$start, \"I_STATEMENT_FORMAT22c_FIELD\"] INSTRUCTION_FORMAT22c_FIELD_ODEX REGISTER REGISTER field_reference )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT22c_FIELD, (retval.start), "I_STATEMENT_FORMAT22c_FIELD"), root_1);
@@ -12070,7 +12070,7 @@
 
 
 	// $ANTLR start "insn_format22c_type"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:962:1: insn_format22c_type : INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT22c_TYPE[$start, \"I_STATEMENT_FORMAT22c_TYPE\"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor ) ;
+	// smaliParser.g:962:1: insn_format22c_type : INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT22c_TYPE[$start, \"I_STATEMENT_FORMAT22c_TYPE\"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor ) ;
 	public final smaliParser.insn_format22c_type_return insn_format22c_type() throws RecognitionException {
 		smaliParser.insn_format22c_type_return retval = new smaliParser.insn_format22c_type_return();
 		retval.start = input.LT(1);
@@ -12095,22 +12095,22 @@
 		RewriteRuleSubtreeStream stream_nonvoid_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule nonvoid_type_descriptor");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:963:3: ( INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT22c_TYPE[$start, \"I_STATEMENT_FORMAT22c_TYPE\"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:964:5: INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor
+			// smaliParser.g:963:3: ( INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT22c_TYPE[$start, \"I_STATEMENT_FORMAT22c_TYPE\"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor ) )
+			// smaliParser.g:964:5: INSTRUCTION_FORMAT22c_TYPE REGISTER COMMA REGISTER COMMA nonvoid_type_descriptor
 			{
-			INSTRUCTION_FORMAT22c_TYPE357=(Token)match(input,INSTRUCTION_FORMAT22c_TYPE,FOLLOW_INSTRUCTION_FORMAT22c_TYPE_in_insn_format22c_type4742);
+			INSTRUCTION_FORMAT22c_TYPE357=(Token)match(input,INSTRUCTION_FORMAT22c_TYPE,FOLLOW_INSTRUCTION_FORMAT22c_TYPE_in_insn_format22c_type4742);  
 			stream_INSTRUCTION_FORMAT22c_TYPE.add(INSTRUCTION_FORMAT22c_TYPE357);
 
-			REGISTER358=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_type4744);
+			REGISTER358=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_type4744);  
 			stream_REGISTER.add(REGISTER358);
 
-			COMMA359=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_type4746);
+			COMMA359=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_type4746);  
 			stream_COMMA.add(COMMA359);
 
-			REGISTER360=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_type4748);
+			REGISTER360=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_type4748);  
 			stream_REGISTER.add(REGISTER360);
 
-			COMMA361=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_type4750);
+			COMMA361=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22c_type4750);  
 			stream_COMMA.add(COMMA361);
 
 			pushFollow(FOLLOW_nonvoid_type_descriptor_in_insn_format22c_type4752);
@@ -12119,19 +12119,19 @@
 
 			stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor362.getTree());
 			// AST REWRITE
-			// elements: nonvoid_type_descriptor, REGISTER, INSTRUCTION_FORMAT22c_TYPE, REGISTER
-			// token labels:
+			// elements: REGISTER, REGISTER, nonvoid_type_descriptor, INSTRUCTION_FORMAT22c_TYPE
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 965:5: -> ^( I_STATEMENT_FORMAT22c_TYPE[$start, \"I_STATEMENT_FORMAT22c_TYPE\"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:965:8: ^( I_STATEMENT_FORMAT22c_TYPE[$start, \"I_STATEMENT_FORMAT22c_TYPE\"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor )
+				// smaliParser.g:965:8: ^( I_STATEMENT_FORMAT22c_TYPE[$start, \"I_STATEMENT_FORMAT22c_TYPE\"] INSTRUCTION_FORMAT22c_TYPE REGISTER REGISTER nonvoid_type_descriptor )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT22c_TYPE, (retval.start), "I_STATEMENT_FORMAT22c_TYPE"), root_1);
@@ -12176,7 +12176,7 @@
 
 
 	// $ANTLR start "insn_format22cs_field"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:967:1: insn_format22cs_field : INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET ;
+	// smaliParser.g:967:1: insn_format22cs_field : INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET ;
 	public final smaliParser.insn_format22cs_field_return insn_format22cs_field() throws RecognitionException {
 		smaliParser.insn_format22cs_field_return retval = new smaliParser.insn_format22cs_field_return();
 		retval.start = input.LT(1);
@@ -12198,39 +12198,39 @@
 		CommonTree FIELD_OFFSET368_tree=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:968:3: ( INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:969:5: INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET
+			// smaliParser.g:968:3: ( INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET )
+			// smaliParser.g:969:5: INSTRUCTION_FORMAT22cs_FIELD REGISTER COMMA REGISTER COMMA FIELD_OFFSET
 			{
 			root_0 = (CommonTree)adaptor.nil();
 
 
-			INSTRUCTION_FORMAT22cs_FIELD363=(Token)match(input,INSTRUCTION_FORMAT22cs_FIELD,FOLLOW_INSTRUCTION_FORMAT22cs_FIELD_in_insn_format22cs_field4786);
+			INSTRUCTION_FORMAT22cs_FIELD363=(Token)match(input,INSTRUCTION_FORMAT22cs_FIELD,FOLLOW_INSTRUCTION_FORMAT22cs_FIELD_in_insn_format22cs_field4786); 
 			INSTRUCTION_FORMAT22cs_FIELD363_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT22cs_FIELD363);
 			adaptor.addChild(root_0, INSTRUCTION_FORMAT22cs_FIELD363_tree);
 
-			REGISTER364=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22cs_field4788);
+			REGISTER364=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22cs_field4788); 
 			REGISTER364_tree = (CommonTree)adaptor.create(REGISTER364);
 			adaptor.addChild(root_0, REGISTER364_tree);
 
-			COMMA365=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22cs_field4790);
+			COMMA365=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22cs_field4790); 
 			COMMA365_tree = (CommonTree)adaptor.create(COMMA365);
 			adaptor.addChild(root_0, COMMA365_tree);
 
-			REGISTER366=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22cs_field4792);
+			REGISTER366=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22cs_field4792); 
 			REGISTER366_tree = (CommonTree)adaptor.create(REGISTER366);
 			adaptor.addChild(root_0, REGISTER366_tree);
 
-			COMMA367=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22cs_field4794);
+			COMMA367=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22cs_field4794); 
 			COMMA367_tree = (CommonTree)adaptor.create(COMMA367);
 			adaptor.addChild(root_0, COMMA367_tree);
 
-			FIELD_OFFSET368=(Token)match(input,FIELD_OFFSET,FOLLOW_FIELD_OFFSET_in_insn_format22cs_field4796);
+			FIELD_OFFSET368=(Token)match(input,FIELD_OFFSET,FOLLOW_FIELD_OFFSET_in_insn_format22cs_field4796); 
 			FIELD_OFFSET368_tree = (CommonTree)adaptor.create(FIELD_OFFSET368);
 			adaptor.addChild(root_0, FIELD_OFFSET368_tree);
 
 
 			      throwOdexedInstructionException(input, (INSTRUCTION_FORMAT22cs_FIELD363!=null?INSTRUCTION_FORMAT22cs_FIELD363.getText():null));
-			
+			    
 			}
 
 			retval.stop = input.LT(-1);
@@ -12260,7 +12260,7 @@
 
 
 	// $ANTLR start "insn_format22s"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:974:1: insn_format22s : instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT22s[$start, \"I_STATEMENT_FORMAT22s\"] instruction_format22s REGISTER REGISTER integral_literal ) ;
+	// smaliParser.g:974:1: insn_format22s : instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT22s[$start, \"I_STATEMENT_FORMAT22s\"] instruction_format22s REGISTER REGISTER integral_literal ) ;
 	public final smaliParser.insn_format22s_return insn_format22s() throws RecognitionException {
 		smaliParser.insn_format22s_return retval = new smaliParser.insn_format22s_return();
 		retval.start = input.LT(1);
@@ -12284,24 +12284,24 @@
 		RewriteRuleSubtreeStream stream_integral_literal=new RewriteRuleSubtreeStream(adaptor,"rule integral_literal");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:975:3: ( instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT22s[$start, \"I_STATEMENT_FORMAT22s\"] instruction_format22s REGISTER REGISTER integral_literal ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:976:5: instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal
+			// smaliParser.g:975:3: ( instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal -> ^( I_STATEMENT_FORMAT22s[$start, \"I_STATEMENT_FORMAT22s\"] instruction_format22s REGISTER REGISTER integral_literal ) )
+			// smaliParser.g:976:5: instruction_format22s REGISTER COMMA REGISTER COMMA integral_literal
 			{
 			pushFollow(FOLLOW_instruction_format22s_in_insn_format22s4817);
 			instruction_format22s369=instruction_format22s();
 			state._fsp--;
 
 			stream_instruction_format22s.add(instruction_format22s369.getTree());
-			REGISTER370=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22s4819);
+			REGISTER370=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22s4819);  
 			stream_REGISTER.add(REGISTER370);
 
-			COMMA371=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22s4821);
+			COMMA371=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22s4821);  
 			stream_COMMA.add(COMMA371);
 
-			REGISTER372=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22s4823);
+			REGISTER372=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22s4823);  
 			stream_REGISTER.add(REGISTER372);
 
-			COMMA373=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22s4825);
+			COMMA373=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22s4825);  
 			stream_COMMA.add(COMMA373);
 
 			pushFollow(FOLLOW_integral_literal_in_insn_format22s4827);
@@ -12310,19 +12310,19 @@
 
 			stream_integral_literal.add(integral_literal374.getTree());
 			// AST REWRITE
-			// elements: instruction_format22s, integral_literal, REGISTER, REGISTER
-			// token labels:
+			// elements: REGISTER, REGISTER, instruction_format22s, integral_literal
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 977:5: -> ^( I_STATEMENT_FORMAT22s[$start, \"I_STATEMENT_FORMAT22s\"] instruction_format22s REGISTER REGISTER integral_literal )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:977:8: ^( I_STATEMENT_FORMAT22s[$start, \"I_STATEMENT_FORMAT22s\"] instruction_format22s REGISTER REGISTER integral_literal )
+				// smaliParser.g:977:8: ^( I_STATEMENT_FORMAT22s[$start, \"I_STATEMENT_FORMAT22s\"] instruction_format22s REGISTER REGISTER integral_literal )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT22s, (retval.start), "I_STATEMENT_FORMAT22s"), root_1);
@@ -12367,7 +12367,7 @@
 
 
 	// $ANTLR start "insn_format22t"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:979:1: insn_format22t : INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT22t[$start, \"I_STATEMENT_FFORMAT22t\"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref ) ;
+	// smaliParser.g:979:1: insn_format22t : INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT22t[$start, \"I_STATEMENT_FFORMAT22t\"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref ) ;
 	public final smaliParser.insn_format22t_return insn_format22t() throws RecognitionException {
 		smaliParser.insn_format22t_return retval = new smaliParser.insn_format22t_return();
 		retval.start = input.LT(1);
@@ -12392,22 +12392,22 @@
 		RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:980:3: ( INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT22t[$start, \"I_STATEMENT_FFORMAT22t\"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:981:5: INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref
+			// smaliParser.g:980:3: ( INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT22t[$start, \"I_STATEMENT_FFORMAT22t\"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref ) )
+			// smaliParser.g:981:5: INSTRUCTION_FORMAT22t REGISTER COMMA REGISTER COMMA label_ref
 			{
-			INSTRUCTION_FORMAT22t375=(Token)match(input,INSTRUCTION_FORMAT22t,FOLLOW_INSTRUCTION_FORMAT22t_in_insn_format22t4861);
+			INSTRUCTION_FORMAT22t375=(Token)match(input,INSTRUCTION_FORMAT22t,FOLLOW_INSTRUCTION_FORMAT22t_in_insn_format22t4861);  
 			stream_INSTRUCTION_FORMAT22t.add(INSTRUCTION_FORMAT22t375);
 
-			REGISTER376=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22t4863);
+			REGISTER376=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22t4863);  
 			stream_REGISTER.add(REGISTER376);
 
-			COMMA377=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22t4865);
+			COMMA377=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22t4865);  
 			stream_COMMA.add(COMMA377);
 
-			REGISTER378=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22t4867);
+			REGISTER378=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22t4867);  
 			stream_REGISTER.add(REGISTER378);
 
-			COMMA379=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22t4869);
+			COMMA379=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22t4869);  
 			stream_COMMA.add(COMMA379);
 
 			pushFollow(FOLLOW_label_ref_in_insn_format22t4871);
@@ -12416,19 +12416,19 @@
 
 			stream_label_ref.add(label_ref380.getTree());
 			// AST REWRITE
-			// elements: INSTRUCTION_FORMAT22t, REGISTER, label_ref, REGISTER
-			// token labels:
+			// elements: REGISTER, INSTRUCTION_FORMAT22t, REGISTER, label_ref
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 982:5: -> ^( I_STATEMENT_FORMAT22t[$start, \"I_STATEMENT_FFORMAT22t\"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:982:8: ^( I_STATEMENT_FORMAT22t[$start, \"I_STATEMENT_FFORMAT22t\"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref )
+				// smaliParser.g:982:8: ^( I_STATEMENT_FORMAT22t[$start, \"I_STATEMENT_FFORMAT22t\"] INSTRUCTION_FORMAT22t REGISTER REGISTER label_ref )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT22t, (retval.start), "I_STATEMENT_FFORMAT22t"), root_1);
@@ -12473,7 +12473,7 @@
 
 
 	// $ANTLR start "insn_format22x"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:984:1: insn_format22x : INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT22x[$start, \"I_STATEMENT_FORMAT22x\"] INSTRUCTION_FORMAT22x REGISTER REGISTER ) ;
+	// smaliParser.g:984:1: insn_format22x : INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT22x[$start, \"I_STATEMENT_FORMAT22x\"] INSTRUCTION_FORMAT22x REGISTER REGISTER ) ;
 	public final smaliParser.insn_format22x_return insn_format22x() throws RecognitionException {
 		smaliParser.insn_format22x_return retval = new smaliParser.insn_format22x_return();
 		retval.start = input.LT(1);
@@ -12494,35 +12494,35 @@
 		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT22x=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT22x");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:985:3: ( INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT22x[$start, \"I_STATEMENT_FORMAT22x\"] INSTRUCTION_FORMAT22x REGISTER REGISTER ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:986:5: INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER
+			// smaliParser.g:985:3: ( INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT22x[$start, \"I_STATEMENT_FORMAT22x\"] INSTRUCTION_FORMAT22x REGISTER REGISTER ) )
+			// smaliParser.g:986:5: INSTRUCTION_FORMAT22x REGISTER COMMA REGISTER
 			{
-			INSTRUCTION_FORMAT22x381=(Token)match(input,INSTRUCTION_FORMAT22x,FOLLOW_INSTRUCTION_FORMAT22x_in_insn_format22x4905);
+			INSTRUCTION_FORMAT22x381=(Token)match(input,INSTRUCTION_FORMAT22x,FOLLOW_INSTRUCTION_FORMAT22x_in_insn_format22x4905);  
 			stream_INSTRUCTION_FORMAT22x.add(INSTRUCTION_FORMAT22x381);
 
-			REGISTER382=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22x4907);
+			REGISTER382=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22x4907);  
 			stream_REGISTER.add(REGISTER382);
 
-			COMMA383=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22x4909);
+			COMMA383=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format22x4909);  
 			stream_COMMA.add(COMMA383);
 
-			REGISTER384=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22x4911);
+			REGISTER384=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22x4911);  
 			stream_REGISTER.add(REGISTER384);
 
 			// AST REWRITE
-			// elements: REGISTER, INSTRUCTION_FORMAT22x, REGISTER
-			// token labels:
+			// elements: REGISTER, REGISTER, INSTRUCTION_FORMAT22x
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 987:5: -> ^( I_STATEMENT_FORMAT22x[$start, \"I_STATEMENT_FORMAT22x\"] INSTRUCTION_FORMAT22x REGISTER REGISTER )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:987:8: ^( I_STATEMENT_FORMAT22x[$start, \"I_STATEMENT_FORMAT22x\"] INSTRUCTION_FORMAT22x REGISTER REGISTER )
+				// smaliParser.g:987:8: ^( I_STATEMENT_FORMAT22x[$start, \"I_STATEMENT_FORMAT22x\"] INSTRUCTION_FORMAT22x REGISTER REGISTER )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT22x, (retval.start), "I_STATEMENT_FORMAT22x"), root_1);
@@ -12566,7 +12566,7 @@
 
 
 	// $ANTLR start "insn_format23x"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:989:1: insn_format23x : INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT23x[$start, \"I_STATEMENT_FORMAT23x\"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER ) ;
+	// smaliParser.g:989:1: insn_format23x : INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT23x[$start, \"I_STATEMENT_FORMAT23x\"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER ) ;
 	public final smaliParser.insn_format23x_return insn_format23x() throws RecognitionException {
 		smaliParser.insn_format23x_return retval = new smaliParser.insn_format23x_return();
 		retval.start = input.LT(1);
@@ -12591,41 +12591,41 @@
 		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT23x=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT23x");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:990:3: ( INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT23x[$start, \"I_STATEMENT_FORMAT23x\"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:991:5: INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER
+			// smaliParser.g:990:3: ( INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT23x[$start, \"I_STATEMENT_FORMAT23x\"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER ) )
+			// smaliParser.g:991:5: INSTRUCTION_FORMAT23x REGISTER COMMA REGISTER COMMA REGISTER
 			{
-			INSTRUCTION_FORMAT23x385=(Token)match(input,INSTRUCTION_FORMAT23x,FOLLOW_INSTRUCTION_FORMAT23x_in_insn_format23x4943);
+			INSTRUCTION_FORMAT23x385=(Token)match(input,INSTRUCTION_FORMAT23x,FOLLOW_INSTRUCTION_FORMAT23x_in_insn_format23x4943);  
 			stream_INSTRUCTION_FORMAT23x.add(INSTRUCTION_FORMAT23x385);
 
-			REGISTER386=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x4945);
+			REGISTER386=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x4945);  
 			stream_REGISTER.add(REGISTER386);
 
-			COMMA387=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format23x4947);
+			COMMA387=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format23x4947);  
 			stream_COMMA.add(COMMA387);
 
-			REGISTER388=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x4949);
+			REGISTER388=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x4949);  
 			stream_REGISTER.add(REGISTER388);
 
-			COMMA389=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format23x4951);
+			COMMA389=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format23x4951);  
 			stream_COMMA.add(COMMA389);
 
-			REGISTER390=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x4953);
+			REGISTER390=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x4953);  
 			stream_REGISTER.add(REGISTER390);
 
 			// AST REWRITE
-			// elements: REGISTER, INSTRUCTION_FORMAT23x, REGISTER, REGISTER
-			// token labels:
+			// elements: REGISTER, REGISTER, INSTRUCTION_FORMAT23x, REGISTER
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 992:5: -> ^( I_STATEMENT_FORMAT23x[$start, \"I_STATEMENT_FORMAT23x\"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:992:8: ^( I_STATEMENT_FORMAT23x[$start, \"I_STATEMENT_FORMAT23x\"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER )
+				// smaliParser.g:992:8: ^( I_STATEMENT_FORMAT23x[$start, \"I_STATEMENT_FORMAT23x\"] INSTRUCTION_FORMAT23x REGISTER REGISTER REGISTER )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT23x, (retval.start), "I_STATEMENT_FORMAT23x"), root_1);
@@ -12670,7 +12670,7 @@
 
 
 	// $ANTLR start "insn_format30t"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:994:1: insn_format30t : INSTRUCTION_FORMAT30t label_ref -> ^( I_STATEMENT_FORMAT30t[$start, \"I_STATEMENT_FORMAT30t\"] INSTRUCTION_FORMAT30t label_ref ) ;
+	// smaliParser.g:994:1: insn_format30t : INSTRUCTION_FORMAT30t label_ref -> ^( I_STATEMENT_FORMAT30t[$start, \"I_STATEMENT_FORMAT30t\"] INSTRUCTION_FORMAT30t label_ref ) ;
 	public final smaliParser.insn_format30t_return insn_format30t() throws RecognitionException {
 		smaliParser.insn_format30t_return retval = new smaliParser.insn_format30t_return();
 		retval.start = input.LT(1);
@@ -12685,10 +12685,10 @@
 		RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:995:3: ( INSTRUCTION_FORMAT30t label_ref -> ^( I_STATEMENT_FORMAT30t[$start, \"I_STATEMENT_FORMAT30t\"] INSTRUCTION_FORMAT30t label_ref ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:996:5: INSTRUCTION_FORMAT30t label_ref
+			// smaliParser.g:995:3: ( INSTRUCTION_FORMAT30t label_ref -> ^( I_STATEMENT_FORMAT30t[$start, \"I_STATEMENT_FORMAT30t\"] INSTRUCTION_FORMAT30t label_ref ) )
+			// smaliParser.g:996:5: INSTRUCTION_FORMAT30t label_ref
 			{
-			INSTRUCTION_FORMAT30t391=(Token)match(input,INSTRUCTION_FORMAT30t,FOLLOW_INSTRUCTION_FORMAT30t_in_insn_format30t4987);
+			INSTRUCTION_FORMAT30t391=(Token)match(input,INSTRUCTION_FORMAT30t,FOLLOW_INSTRUCTION_FORMAT30t_in_insn_format30t4987);  
 			stream_INSTRUCTION_FORMAT30t.add(INSTRUCTION_FORMAT30t391);
 
 			pushFollow(FOLLOW_label_ref_in_insn_format30t4989);
@@ -12697,19 +12697,19 @@
 
 			stream_label_ref.add(label_ref392.getTree());
 			// AST REWRITE
-			// elements: label_ref, INSTRUCTION_FORMAT30t
-			// token labels:
+			// elements: INSTRUCTION_FORMAT30t, label_ref
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 997:5: -> ^( I_STATEMENT_FORMAT30t[$start, \"I_STATEMENT_FORMAT30t\"] INSTRUCTION_FORMAT30t label_ref )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:997:8: ^( I_STATEMENT_FORMAT30t[$start, \"I_STATEMENT_FORMAT30t\"] INSTRUCTION_FORMAT30t label_ref )
+				// smaliParser.g:997:8: ^( I_STATEMENT_FORMAT30t[$start, \"I_STATEMENT_FORMAT30t\"] INSTRUCTION_FORMAT30t label_ref )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT30t, (retval.start), "I_STATEMENT_FORMAT30t"), root_1);
@@ -12752,7 +12752,7 @@
 
 
 	// $ANTLR start "insn_format31c"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:999:1: insn_format31c : INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL -> ^( I_STATEMENT_FORMAT31c[$start, \"I_STATEMENT_FORMAT31c\"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL ) ;
+	// smaliParser.g:999:1: insn_format31c : INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL -> ^( I_STATEMENT_FORMAT31c[$start, \"I_STATEMENT_FORMAT31c\"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL ) ;
 	public final smaliParser.insn_format31c_return insn_format31c() throws RecognitionException {
 		smaliParser.insn_format31c_return retval = new smaliParser.insn_format31c_return();
 		retval.start = input.LT(1);
@@ -12774,35 +12774,35 @@
 		RewriteRuleTokenStream stream_STRING_LITERAL=new RewriteRuleTokenStream(adaptor,"token STRING_LITERAL");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1000:3: ( INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL -> ^( I_STATEMENT_FORMAT31c[$start, \"I_STATEMENT_FORMAT31c\"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1001:5: INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL
+			// smaliParser.g:1000:3: ( INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL -> ^( I_STATEMENT_FORMAT31c[$start, \"I_STATEMENT_FORMAT31c\"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL ) )
+			// smaliParser.g:1001:5: INSTRUCTION_FORMAT31c REGISTER COMMA STRING_LITERAL
 			{
-			INSTRUCTION_FORMAT31c393=(Token)match(input,INSTRUCTION_FORMAT31c,FOLLOW_INSTRUCTION_FORMAT31c_in_insn_format31c5019);
+			INSTRUCTION_FORMAT31c393=(Token)match(input,INSTRUCTION_FORMAT31c,FOLLOW_INSTRUCTION_FORMAT31c_in_insn_format31c5019);  
 			stream_INSTRUCTION_FORMAT31c.add(INSTRUCTION_FORMAT31c393);
 
-			REGISTER394=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31c5021);
+			REGISTER394=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31c5021);  
 			stream_REGISTER.add(REGISTER394);
 
-			COMMA395=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format31c5023);
+			COMMA395=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format31c5023);  
 			stream_COMMA.add(COMMA395);
 
-			STRING_LITERAL396=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_insn_format31c5025);
+			STRING_LITERAL396=(Token)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_insn_format31c5025);  
 			stream_STRING_LITERAL.add(STRING_LITERAL396);
 
 			// AST REWRITE
-			// elements: STRING_LITERAL, INSTRUCTION_FORMAT31c, REGISTER
-			// token labels:
+			// elements: REGISTER, STRING_LITERAL, INSTRUCTION_FORMAT31c
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 1002:5: -> ^( I_STATEMENT_FORMAT31c[$start, \"I_STATEMENT_FORMAT31c\"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1002:7: ^( I_STATEMENT_FORMAT31c[$start, \"I_STATEMENT_FORMAT31c\"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL )
+				// smaliParser.g:1002:7: ^( I_STATEMENT_FORMAT31c[$start, \"I_STATEMENT_FORMAT31c\"] INSTRUCTION_FORMAT31c REGISTER STRING_LITERAL )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT31c, (retval.start), "I_STATEMENT_FORMAT31c"), root_1);
@@ -12846,7 +12846,7 @@
 
 
 	// $ANTLR start "insn_format31i"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1004:1: insn_format31i : instruction_format31i REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT31i[$start, \"I_STATEMENT_FORMAT31i\"] instruction_format31i REGISTER fixed_32bit_literal ) ;
+	// smaliParser.g:1004:1: insn_format31i : instruction_format31i REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT31i[$start, \"I_STATEMENT_FORMAT31i\"] instruction_format31i REGISTER fixed_32bit_literal ) ;
 	public final smaliParser.insn_format31i_return insn_format31i() throws RecognitionException {
 		smaliParser.insn_format31i_return retval = new smaliParser.insn_format31i_return();
 		retval.start = input.LT(1);
@@ -12866,18 +12866,18 @@
 		RewriteRuleSubtreeStream stream_instruction_format31i=new RewriteRuleSubtreeStream(adaptor,"rule instruction_format31i");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1005:3: ( instruction_format31i REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT31i[$start, \"I_STATEMENT_FORMAT31i\"] instruction_format31i REGISTER fixed_32bit_literal ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1006:5: instruction_format31i REGISTER COMMA fixed_32bit_literal
+			// smaliParser.g:1005:3: ( instruction_format31i REGISTER COMMA fixed_32bit_literal -> ^( I_STATEMENT_FORMAT31i[$start, \"I_STATEMENT_FORMAT31i\"] instruction_format31i REGISTER fixed_32bit_literal ) )
+			// smaliParser.g:1006:5: instruction_format31i REGISTER COMMA fixed_32bit_literal
 			{
 			pushFollow(FOLLOW_instruction_format31i_in_insn_format31i5056);
 			instruction_format31i397=instruction_format31i();
 			state._fsp--;
 
 			stream_instruction_format31i.add(instruction_format31i397.getTree());
-			REGISTER398=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31i5058);
+			REGISTER398=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31i5058);  
 			stream_REGISTER.add(REGISTER398);
 
-			COMMA399=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format31i5060);
+			COMMA399=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format31i5060);  
 			stream_COMMA.add(COMMA399);
 
 			pushFollow(FOLLOW_fixed_32bit_literal_in_insn_format31i5062);
@@ -12886,19 +12886,19 @@
 
 			stream_fixed_32bit_literal.add(fixed_32bit_literal400.getTree());
 			// AST REWRITE
-			// elements: REGISTER, instruction_format31i, fixed_32bit_literal
-			// token labels:
+			// elements: instruction_format31i, REGISTER, fixed_32bit_literal
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 1007:5: -> ^( I_STATEMENT_FORMAT31i[$start, \"I_STATEMENT_FORMAT31i\"] instruction_format31i REGISTER fixed_32bit_literal )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1007:8: ^( I_STATEMENT_FORMAT31i[$start, \"I_STATEMENT_FORMAT31i\"] instruction_format31i REGISTER fixed_32bit_literal )
+				// smaliParser.g:1007:8: ^( I_STATEMENT_FORMAT31i[$start, \"I_STATEMENT_FORMAT31i\"] instruction_format31i REGISTER fixed_32bit_literal )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT31i, (retval.start), "I_STATEMENT_FORMAT31i"), root_1);
@@ -12942,7 +12942,7 @@
 
 
 	// $ANTLR start "insn_format31t"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1009:1: insn_format31t : INSTRUCTION_FORMAT31t REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT31t[$start, \"I_STATEMENT_FORMAT31t\"] INSTRUCTION_FORMAT31t REGISTER label_ref ) ;
+	// smaliParser.g:1009:1: insn_format31t : INSTRUCTION_FORMAT31t REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT31t[$start, \"I_STATEMENT_FORMAT31t\"] INSTRUCTION_FORMAT31t REGISTER label_ref ) ;
 	public final smaliParser.insn_format31t_return insn_format31t() throws RecognitionException {
 		smaliParser.insn_format31t_return retval = new smaliParser.insn_format31t_return();
 		retval.start = input.LT(1);
@@ -12963,16 +12963,16 @@
 		RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1010:3: ( INSTRUCTION_FORMAT31t REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT31t[$start, \"I_STATEMENT_FORMAT31t\"] INSTRUCTION_FORMAT31t REGISTER label_ref ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1011:5: INSTRUCTION_FORMAT31t REGISTER COMMA label_ref
+			// smaliParser.g:1010:3: ( INSTRUCTION_FORMAT31t REGISTER COMMA label_ref -> ^( I_STATEMENT_FORMAT31t[$start, \"I_STATEMENT_FORMAT31t\"] INSTRUCTION_FORMAT31t REGISTER label_ref ) )
+			// smaliParser.g:1011:5: INSTRUCTION_FORMAT31t REGISTER COMMA label_ref
 			{
-			INSTRUCTION_FORMAT31t401=(Token)match(input,INSTRUCTION_FORMAT31t,FOLLOW_INSTRUCTION_FORMAT31t_in_insn_format31t5094);
+			INSTRUCTION_FORMAT31t401=(Token)match(input,INSTRUCTION_FORMAT31t,FOLLOW_INSTRUCTION_FORMAT31t_in_insn_format31t5094);  
 			stream_INSTRUCTION_FORMAT31t.add(INSTRUCTION_FORMAT31t401);
 
-			REGISTER402=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31t5096);
+			REGISTER402=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31t5096);  
 			stream_REGISTER.add(REGISTER402);
 
-			COMMA403=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format31t5098);
+			COMMA403=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format31t5098);  
 			stream_COMMA.add(COMMA403);
 
 			pushFollow(FOLLOW_label_ref_in_insn_format31t5100);
@@ -12981,19 +12981,19 @@
 
 			stream_label_ref.add(label_ref404.getTree());
 			// AST REWRITE
-			// elements: label_ref, REGISTER, INSTRUCTION_FORMAT31t
-			// token labels:
+			// elements: INSTRUCTION_FORMAT31t, REGISTER, label_ref
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 1012:5: -> ^( I_STATEMENT_FORMAT31t[$start, \"I_STATEMENT_FORMAT31t\"] INSTRUCTION_FORMAT31t REGISTER label_ref )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1012:8: ^( I_STATEMENT_FORMAT31t[$start, \"I_STATEMENT_FORMAT31t\"] INSTRUCTION_FORMAT31t REGISTER label_ref )
+				// smaliParser.g:1012:8: ^( I_STATEMENT_FORMAT31t[$start, \"I_STATEMENT_FORMAT31t\"] INSTRUCTION_FORMAT31t REGISTER label_ref )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT31t, (retval.start), "I_STATEMENT_FORMAT31t"), root_1);
@@ -13037,7 +13037,7 @@
 
 
 	// $ANTLR start "insn_format32x"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1014:1: insn_format32x : INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT32x[$start, \"I_STATEMENT_FORMAT32x\"] INSTRUCTION_FORMAT32x REGISTER REGISTER ) ;
+	// smaliParser.g:1014:1: insn_format32x : INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT32x[$start, \"I_STATEMENT_FORMAT32x\"] INSTRUCTION_FORMAT32x REGISTER REGISTER ) ;
 	public final smaliParser.insn_format32x_return insn_format32x() throws RecognitionException {
 		smaliParser.insn_format32x_return retval = new smaliParser.insn_format32x_return();
 		retval.start = input.LT(1);
@@ -13058,35 +13058,35 @@
 		RewriteRuleTokenStream stream_INSTRUCTION_FORMAT32x=new RewriteRuleTokenStream(adaptor,"token INSTRUCTION_FORMAT32x");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1015:3: ( INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT32x[$start, \"I_STATEMENT_FORMAT32x\"] INSTRUCTION_FORMAT32x REGISTER REGISTER ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1016:5: INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER
+			// smaliParser.g:1015:3: ( INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER -> ^( I_STATEMENT_FORMAT32x[$start, \"I_STATEMENT_FORMAT32x\"] INSTRUCTION_FORMAT32x REGISTER REGISTER ) )
+			// smaliParser.g:1016:5: INSTRUCTION_FORMAT32x REGISTER COMMA REGISTER
 			{
-			INSTRUCTION_FORMAT32x405=(Token)match(input,INSTRUCTION_FORMAT32x,FOLLOW_INSTRUCTION_FORMAT32x_in_insn_format32x5132);
+			INSTRUCTION_FORMAT32x405=(Token)match(input,INSTRUCTION_FORMAT32x,FOLLOW_INSTRUCTION_FORMAT32x_in_insn_format32x5132);  
 			stream_INSTRUCTION_FORMAT32x.add(INSTRUCTION_FORMAT32x405);
 
-			REGISTER406=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format32x5134);
+			REGISTER406=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format32x5134);  
 			stream_REGISTER.add(REGISTER406);
 
-			COMMA407=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format32x5136);
+			COMMA407=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format32x5136);  
 			stream_COMMA.add(COMMA407);
 
-			REGISTER408=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format32x5138);
+			REGISTER408=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format32x5138);  
 			stream_REGISTER.add(REGISTER408);
 
 			// AST REWRITE
-			// elements: REGISTER, INSTRUCTION_FORMAT32x, REGISTER
-			// token labels:
+			// elements: INSTRUCTION_FORMAT32x, REGISTER, REGISTER
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 1017:5: -> ^( I_STATEMENT_FORMAT32x[$start, \"I_STATEMENT_FORMAT32x\"] INSTRUCTION_FORMAT32x REGISTER REGISTER )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1017:8: ^( I_STATEMENT_FORMAT32x[$start, \"I_STATEMENT_FORMAT32x\"] INSTRUCTION_FORMAT32x REGISTER REGISTER )
+				// smaliParser.g:1017:8: ^( I_STATEMENT_FORMAT32x[$start, \"I_STATEMENT_FORMAT32x\"] INSTRUCTION_FORMAT32x REGISTER REGISTER )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT32x, (retval.start), "I_STATEMENT_FORMAT32x"), root_1);
@@ -13130,7 +13130,7 @@
 
 
 	// $ANTLR start "insn_format35c_method"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1019:1: insn_format35c_method : INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference -> ^( I_STATEMENT_FORMAT35c_METHOD[$start, \"I_STATEMENT_FORMAT35c_METHOD\"] INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) ;
+	// smaliParser.g:1019:1: insn_format35c_method : INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference -> ^( I_STATEMENT_FORMAT35c_METHOD[$start, \"I_STATEMENT_FORMAT35c_METHOD\"] INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) ;
 	public final smaliParser.insn_format35c_method_return insn_format35c_method() throws RecognitionException {
 		smaliParser.insn_format35c_method_return retval = new smaliParser.insn_format35c_method_return();
 		retval.start = input.LT(1);
@@ -13156,13 +13156,13 @@
 		RewriteRuleSubtreeStream stream_register_list=new RewriteRuleSubtreeStream(adaptor,"rule register_list");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1020:3: ( INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference -> ^( I_STATEMENT_FORMAT35c_METHOD[$start, \"I_STATEMENT_FORMAT35c_METHOD\"] INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1021:5: INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference
+			// smaliParser.g:1020:3: ( INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference -> ^( I_STATEMENT_FORMAT35c_METHOD[$start, \"I_STATEMENT_FORMAT35c_METHOD\"] INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) )
+			// smaliParser.g:1021:5: INSTRUCTION_FORMAT35c_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference
 			{
-			INSTRUCTION_FORMAT35c_METHOD409=(Token)match(input,INSTRUCTION_FORMAT35c_METHOD,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_in_insn_format35c_method5170);
+			INSTRUCTION_FORMAT35c_METHOD409=(Token)match(input,INSTRUCTION_FORMAT35c_METHOD,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_in_insn_format35c_method5170);  
 			stream_INSTRUCTION_FORMAT35c_METHOD.add(INSTRUCTION_FORMAT35c_METHOD409);
 
-			OPEN_BRACE410=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35c_method5172);
+			OPEN_BRACE410=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35c_method5172);  
 			stream_OPEN_BRACE.add(OPEN_BRACE410);
 
 			pushFollow(FOLLOW_register_list_in_insn_format35c_method5174);
@@ -13170,10 +13170,10 @@
 			state._fsp--;
 
 			stream_register_list.add(register_list411.getTree());
-			CLOSE_BRACE412=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35c_method5176);
+			CLOSE_BRACE412=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35c_method5176);  
 			stream_CLOSE_BRACE.add(CLOSE_BRACE412);
 
-			COMMA413=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35c_method5178);
+			COMMA413=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35c_method5178);  
 			stream_COMMA.add(COMMA413);
 
 			pushFollow(FOLLOW_method_reference_in_insn_format35c_method5180);
@@ -13182,19 +13182,19 @@
 
 			stream_method_reference.add(method_reference414.getTree());
 			// AST REWRITE
-			// elements: INSTRUCTION_FORMAT35c_METHOD, method_reference, register_list
-			// token labels:
+			// elements: INSTRUCTION_FORMAT35c_METHOD, register_list, method_reference
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 1022:5: -> ^( I_STATEMENT_FORMAT35c_METHOD[$start, \"I_STATEMENT_FORMAT35c_METHOD\"] INSTRUCTION_FORMAT35c_METHOD register_list method_reference )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1022:8: ^( I_STATEMENT_FORMAT35c_METHOD[$start, \"I_STATEMENT_FORMAT35c_METHOD\"] INSTRUCTION_FORMAT35c_METHOD register_list method_reference )
+				// smaliParser.g:1022:8: ^( I_STATEMENT_FORMAT35c_METHOD[$start, \"I_STATEMENT_FORMAT35c_METHOD\"] INSTRUCTION_FORMAT35c_METHOD register_list method_reference )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT35c_METHOD, (retval.start), "I_STATEMENT_FORMAT35c_METHOD"), root_1);
@@ -13238,7 +13238,7 @@
 
 
 	// $ANTLR start "insn_format35c_type"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1024:1: insn_format35c_type : INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT35c_TYPE[$start, \"I_STATEMENT_FORMAT35c_TYPE\"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) ;
+	// smaliParser.g:1024:1: insn_format35c_type : INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT35c_TYPE[$start, \"I_STATEMENT_FORMAT35c_TYPE\"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) ;
 	public final smaliParser.insn_format35c_type_return insn_format35c_type() throws RecognitionException {
 		smaliParser.insn_format35c_type_return retval = new smaliParser.insn_format35c_type_return();
 		retval.start = input.LT(1);
@@ -13264,13 +13264,13 @@
 		RewriteRuleSubtreeStream stream_nonvoid_type_descriptor=new RewriteRuleSubtreeStream(adaptor,"rule nonvoid_type_descriptor");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1025:3: ( INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT35c_TYPE[$start, \"I_STATEMENT_FORMAT35c_TYPE\"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1026:5: INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor
+			// smaliParser.g:1025:3: ( INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT35c_TYPE[$start, \"I_STATEMENT_FORMAT35c_TYPE\"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) )
+			// smaliParser.g:1026:5: INSTRUCTION_FORMAT35c_TYPE OPEN_BRACE register_list CLOSE_BRACE COMMA nonvoid_type_descriptor
 			{
-			INSTRUCTION_FORMAT35c_TYPE415=(Token)match(input,INSTRUCTION_FORMAT35c_TYPE,FOLLOW_INSTRUCTION_FORMAT35c_TYPE_in_insn_format35c_type5212);
+			INSTRUCTION_FORMAT35c_TYPE415=(Token)match(input,INSTRUCTION_FORMAT35c_TYPE,FOLLOW_INSTRUCTION_FORMAT35c_TYPE_in_insn_format35c_type5212);  
 			stream_INSTRUCTION_FORMAT35c_TYPE.add(INSTRUCTION_FORMAT35c_TYPE415);
 
-			OPEN_BRACE416=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35c_type5214);
+			OPEN_BRACE416=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35c_type5214);  
 			stream_OPEN_BRACE.add(OPEN_BRACE416);
 
 			pushFollow(FOLLOW_register_list_in_insn_format35c_type5216);
@@ -13278,10 +13278,10 @@
 			state._fsp--;
 
 			stream_register_list.add(register_list417.getTree());
-			CLOSE_BRACE418=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35c_type5218);
+			CLOSE_BRACE418=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35c_type5218);  
 			stream_CLOSE_BRACE.add(CLOSE_BRACE418);
 
-			COMMA419=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35c_type5220);
+			COMMA419=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35c_type5220);  
 			stream_COMMA.add(COMMA419);
 
 			pushFollow(FOLLOW_nonvoid_type_descriptor_in_insn_format35c_type5222);
@@ -13290,19 +13290,19 @@
 
 			stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor420.getTree());
 			// AST REWRITE
-			// elements: nonvoid_type_descriptor, INSTRUCTION_FORMAT35c_TYPE, register_list
-			// token labels:
+			// elements: register_list, INSTRUCTION_FORMAT35c_TYPE, nonvoid_type_descriptor
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 1027:5: -> ^( I_STATEMENT_FORMAT35c_TYPE[$start, \"I_STATEMENT_FORMAT35c_TYPE\"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1027:8: ^( I_STATEMENT_FORMAT35c_TYPE[$start, \"I_STATEMENT_FORMAT35c_TYPE\"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor )
+				// smaliParser.g:1027:8: ^( I_STATEMENT_FORMAT35c_TYPE[$start, \"I_STATEMENT_FORMAT35c_TYPE\"] INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT35c_TYPE, (retval.start), "I_STATEMENT_FORMAT35c_TYPE"), root_1);
@@ -13346,7 +13346,7 @@
 
 
 	// $ANTLR start "insn_format35c_method_odex"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1029:1: insn_format35c_method_odex : INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference ;
+	// smaliParser.g:1029:1: insn_format35c_method_odex : INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference ;
 	public final smaliParser.insn_format35c_method_odex_return insn_format35c_method_odex() throws RecognitionException {
 		smaliParser.insn_format35c_method_odex_return retval = new smaliParser.insn_format35c_method_odex_return();
 		retval.start = input.LT(1);
@@ -13366,17 +13366,17 @@
 		CommonTree COMMA425_tree=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1030:3: ( INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1031:5: INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference
+			// smaliParser.g:1030:3: ( INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference )
+			// smaliParser.g:1031:5: INSTRUCTION_FORMAT35c_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference
 			{
 			root_0 = (CommonTree)adaptor.nil();
 
 
-			INSTRUCTION_FORMAT35c_METHOD_ODEX421=(Token)match(input,INSTRUCTION_FORMAT35c_METHOD_ODEX,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_ODEX_in_insn_format35c_method_odex5254);
+			INSTRUCTION_FORMAT35c_METHOD_ODEX421=(Token)match(input,INSTRUCTION_FORMAT35c_METHOD_ODEX,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_ODEX_in_insn_format35c_method_odex5254); 
 			INSTRUCTION_FORMAT35c_METHOD_ODEX421_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT35c_METHOD_ODEX421);
 			adaptor.addChild(root_0, INSTRUCTION_FORMAT35c_METHOD_ODEX421_tree);
 
-			OPEN_BRACE422=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35c_method_odex5256);
+			OPEN_BRACE422=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35c_method_odex5256); 
 			OPEN_BRACE422_tree = (CommonTree)adaptor.create(OPEN_BRACE422);
 			adaptor.addChild(root_0, OPEN_BRACE422_tree);
 
@@ -13386,11 +13386,11 @@
 
 			adaptor.addChild(root_0, register_list423.getTree());
 
-			CLOSE_BRACE424=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35c_method_odex5260);
+			CLOSE_BRACE424=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35c_method_odex5260); 
 			CLOSE_BRACE424_tree = (CommonTree)adaptor.create(CLOSE_BRACE424);
 			adaptor.addChild(root_0, CLOSE_BRACE424_tree);
 
-			COMMA425=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35c_method_odex5262);
+			COMMA425=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35c_method_odex5262); 
 			COMMA425_tree = (CommonTree)adaptor.create(COMMA425);
 			adaptor.addChild(root_0, COMMA425_tree);
 
@@ -13402,7 +13402,7 @@
 
 
 			      throwOdexedInstructionException(input, (INSTRUCTION_FORMAT35c_METHOD_ODEX421!=null?INSTRUCTION_FORMAT35c_METHOD_ODEX421.getText():null));
-			
+			    
 			}
 
 			retval.stop = input.LT(-1);
@@ -13432,7 +13432,7 @@
 
 
 	// $ANTLR start "insn_format35mi_method"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1036:1: insn_format35mi_method : INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX ;
+	// smaliParser.g:1036:1: insn_format35mi_method : INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX ;
 	public final smaliParser.insn_format35mi_method_return insn_format35mi_method() throws RecognitionException {
 		smaliParser.insn_format35mi_method_return retval = new smaliParser.insn_format35mi_method_return();
 		retval.start = input.LT(1);
@@ -13453,17 +13453,17 @@
 		CommonTree INLINE_INDEX432_tree=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1037:3: ( INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1038:5: INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX
+			// smaliParser.g:1037:3: ( INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX )
+			// smaliParser.g:1038:5: INSTRUCTION_FORMAT35mi_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA INLINE_INDEX
 			{
 			root_0 = (CommonTree)adaptor.nil();
 
 
-			INSTRUCTION_FORMAT35mi_METHOD427=(Token)match(input,INSTRUCTION_FORMAT35mi_METHOD,FOLLOW_INSTRUCTION_FORMAT35mi_METHOD_in_insn_format35mi_method5285);
+			INSTRUCTION_FORMAT35mi_METHOD427=(Token)match(input,INSTRUCTION_FORMAT35mi_METHOD,FOLLOW_INSTRUCTION_FORMAT35mi_METHOD_in_insn_format35mi_method5285); 
 			INSTRUCTION_FORMAT35mi_METHOD427_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT35mi_METHOD427);
 			adaptor.addChild(root_0, INSTRUCTION_FORMAT35mi_METHOD427_tree);
 
-			OPEN_BRACE428=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35mi_method5287);
+			OPEN_BRACE428=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35mi_method5287); 
 			OPEN_BRACE428_tree = (CommonTree)adaptor.create(OPEN_BRACE428);
 			adaptor.addChild(root_0, OPEN_BRACE428_tree);
 
@@ -13473,21 +13473,21 @@
 
 			adaptor.addChild(root_0, register_list429.getTree());
 
-			CLOSE_BRACE430=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35mi_method5291);
+			CLOSE_BRACE430=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35mi_method5291); 
 			CLOSE_BRACE430_tree = (CommonTree)adaptor.create(CLOSE_BRACE430);
 			adaptor.addChild(root_0, CLOSE_BRACE430_tree);
 
-			COMMA431=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35mi_method5293);
+			COMMA431=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35mi_method5293); 
 			COMMA431_tree = (CommonTree)adaptor.create(COMMA431);
 			adaptor.addChild(root_0, COMMA431_tree);
 
-			INLINE_INDEX432=(Token)match(input,INLINE_INDEX,FOLLOW_INLINE_INDEX_in_insn_format35mi_method5295);
+			INLINE_INDEX432=(Token)match(input,INLINE_INDEX,FOLLOW_INLINE_INDEX_in_insn_format35mi_method5295); 
 			INLINE_INDEX432_tree = (CommonTree)adaptor.create(INLINE_INDEX432);
 			adaptor.addChild(root_0, INLINE_INDEX432_tree);
 
 
 			      throwOdexedInstructionException(input, (INSTRUCTION_FORMAT35mi_METHOD427!=null?INSTRUCTION_FORMAT35mi_METHOD427.getText():null));
-			
+			    
 			}
 
 			retval.stop = input.LT(-1);
@@ -13517,7 +13517,7 @@
 
 
 	// $ANTLR start "insn_format35ms_method"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1043:1: insn_format35ms_method : INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX ;
+	// smaliParser.g:1043:1: insn_format35ms_method : INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX ;
 	public final smaliParser.insn_format35ms_method_return insn_format35ms_method() throws RecognitionException {
 		smaliParser.insn_format35ms_method_return retval = new smaliParser.insn_format35ms_method_return();
 		retval.start = input.LT(1);
@@ -13538,17 +13538,17 @@
 		CommonTree VTABLE_INDEX438_tree=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1044:3: ( INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1045:5: INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX
+			// smaliParser.g:1044:3: ( INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX )
+			// smaliParser.g:1045:5: INSTRUCTION_FORMAT35ms_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA VTABLE_INDEX
 			{
 			root_0 = (CommonTree)adaptor.nil();
 
 
-			INSTRUCTION_FORMAT35ms_METHOD433=(Token)match(input,INSTRUCTION_FORMAT35ms_METHOD,FOLLOW_INSTRUCTION_FORMAT35ms_METHOD_in_insn_format35ms_method5316);
+			INSTRUCTION_FORMAT35ms_METHOD433=(Token)match(input,INSTRUCTION_FORMAT35ms_METHOD,FOLLOW_INSTRUCTION_FORMAT35ms_METHOD_in_insn_format35ms_method5316); 
 			INSTRUCTION_FORMAT35ms_METHOD433_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT35ms_METHOD433);
 			adaptor.addChild(root_0, INSTRUCTION_FORMAT35ms_METHOD433_tree);
 
-			OPEN_BRACE434=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35ms_method5318);
+			OPEN_BRACE434=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format35ms_method5318); 
 			OPEN_BRACE434_tree = (CommonTree)adaptor.create(OPEN_BRACE434);
 			adaptor.addChild(root_0, OPEN_BRACE434_tree);
 
@@ -13558,21 +13558,21 @@
 
 			adaptor.addChild(root_0, register_list435.getTree());
 
-			CLOSE_BRACE436=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35ms_method5322);
+			CLOSE_BRACE436=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format35ms_method5322); 
 			CLOSE_BRACE436_tree = (CommonTree)adaptor.create(CLOSE_BRACE436);
 			adaptor.addChild(root_0, CLOSE_BRACE436_tree);
 
-			COMMA437=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35ms_method5324);
+			COMMA437=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format35ms_method5324); 
 			COMMA437_tree = (CommonTree)adaptor.create(COMMA437);
 			adaptor.addChild(root_0, COMMA437_tree);
 
-			VTABLE_INDEX438=(Token)match(input,VTABLE_INDEX,FOLLOW_VTABLE_INDEX_in_insn_format35ms_method5326);
+			VTABLE_INDEX438=(Token)match(input,VTABLE_INDEX,FOLLOW_VTABLE_INDEX_in_insn_format35ms_method5326); 
 			VTABLE_INDEX438_tree = (CommonTree)adaptor.create(VTABLE_INDEX438);
 			adaptor.addChild(root_0, VTABLE_INDEX438_tree);
 
 
 			      throwOdexedInstructionException(input, (INSTRUCTION_FORMAT35ms_METHOD433!=null?INSTRUCTION_FORMAT35ms_METHOD433.getText():null));
-			
+			    
 			}
 
 			retval.stop = input.LT(-1);
@@ -13602,7 +13602,7 @@
 
 
 	// $ANTLR start "insn_format3rc_method"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1050:1: insn_format3rc_method : INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference -> ^( I_STATEMENT_FORMAT3rc_METHOD[$start, \"I_STATEMENT_FORMAT3rc_METHOD\"] INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) ;
+	// smaliParser.g:1050:1: insn_format3rc_method : INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference -> ^( I_STATEMENT_FORMAT3rc_METHOD[$start, \"I_STATEMENT_FORMAT3rc_METHOD\"] INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) ;
 	public final smaliParser.insn_format3rc_method_return insn_format3rc_method() throws RecognitionException {
 		smaliParser.insn_format3rc_method_return retval = new smaliParser.insn_format3rc_method_return();
 		retval.start = input.LT(1);
@@ -13628,13 +13628,13 @@
 		RewriteRuleSubtreeStream stream_register_range=new RewriteRuleSubtreeStream(adaptor,"rule register_range");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1051:3: ( INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference -> ^( I_STATEMENT_FORMAT3rc_METHOD[$start, \"I_STATEMENT_FORMAT3rc_METHOD\"] INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1052:5: INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference
+			// smaliParser.g:1051:3: ( INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference -> ^( I_STATEMENT_FORMAT3rc_METHOD[$start, \"I_STATEMENT_FORMAT3rc_METHOD\"] INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) )
+			// smaliParser.g:1052:5: INSTRUCTION_FORMAT3rc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference
 			{
-			INSTRUCTION_FORMAT3rc_METHOD439=(Token)match(input,INSTRUCTION_FORMAT3rc_METHOD,FOLLOW_INSTRUCTION_FORMAT3rc_METHOD_in_insn_format3rc_method5347);
+			INSTRUCTION_FORMAT3rc_METHOD439=(Token)match(input,INSTRUCTION_FORMAT3rc_METHOD,FOLLOW_INSTRUCTION_FORMAT3rc_METHOD_in_insn_format3rc_method5347);  
 			stream_INSTRUCTION_FORMAT3rc_METHOD.add(INSTRUCTION_FORMAT3rc_METHOD439);
 
-			OPEN_BRACE440=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rc_method5349);
+			OPEN_BRACE440=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rc_method5349);  
 			stream_OPEN_BRACE.add(OPEN_BRACE440);
 
 			pushFollow(FOLLOW_register_range_in_insn_format3rc_method5351);
@@ -13642,10 +13642,10 @@
 			state._fsp--;
 
 			stream_register_range.add(register_range441.getTree());
-			CLOSE_BRACE442=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rc_method5353);
+			CLOSE_BRACE442=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rc_method5353);  
 			stream_CLOSE_BRACE.add(CLOSE_BRACE442);
 
-			COMMA443=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rc_method5355);
+			COMMA443=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rc_method5355);  
 			stream_COMMA.add(COMMA443);
 
 			pushFollow(FOLLOW_method_reference_in_insn_format3rc_method5357);
@@ -13654,19 +13654,19 @@
 
 			stream_method_reference.add(method_reference444.getTree());
 			// AST REWRITE
-			// elements: method_reference, INSTRUCTION_FORMAT3rc_METHOD, register_range
-			// token labels:
+			// elements: register_range, INSTRUCTION_FORMAT3rc_METHOD, method_reference
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 1053:5: -> ^( I_STATEMENT_FORMAT3rc_METHOD[$start, \"I_STATEMENT_FORMAT3rc_METHOD\"] INSTRUCTION_FORMAT3rc_METHOD register_range method_reference )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1053:8: ^( I_STATEMENT_FORMAT3rc_METHOD[$start, \"I_STATEMENT_FORMAT3rc_METHOD\"] INSTRUCTION_FORMAT3rc_METHOD register_range method_reference )
+				// smaliParser.g:1053:8: ^( I_STATEMENT_FORMAT3rc_METHOD[$start, \"I_STATEMENT_FORMAT3rc_METHOD\"] INSTRUCTION_FORMAT3rc_METHOD register_range method_reference )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT3rc_METHOD, (retval.start), "I_STATEMENT_FORMAT3rc_METHOD"), root_1);
@@ -13710,7 +13710,7 @@
 
 
 	// $ANTLR start "insn_format3rc_method_odex"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1055:1: insn_format3rc_method_odex : INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference ;
+	// smaliParser.g:1055:1: insn_format3rc_method_odex : INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference ;
 	public final smaliParser.insn_format3rc_method_odex_return insn_format3rc_method_odex() throws RecognitionException {
 		smaliParser.insn_format3rc_method_odex_return retval = new smaliParser.insn_format3rc_method_odex_return();
 		retval.start = input.LT(1);
@@ -13730,17 +13730,17 @@
 		CommonTree COMMA449_tree=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1056:3: ( INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1057:5: INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference
+			// smaliParser.g:1056:3: ( INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference )
+			// smaliParser.g:1057:5: INSTRUCTION_FORMAT3rc_METHOD_ODEX OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference
 			{
 			root_0 = (CommonTree)adaptor.nil();
 
 
-			INSTRUCTION_FORMAT3rc_METHOD_ODEX445=(Token)match(input,INSTRUCTION_FORMAT3rc_METHOD_ODEX,FOLLOW_INSTRUCTION_FORMAT3rc_METHOD_ODEX_in_insn_format3rc_method_odex5389);
+			INSTRUCTION_FORMAT3rc_METHOD_ODEX445=(Token)match(input,INSTRUCTION_FORMAT3rc_METHOD_ODEX,FOLLOW_INSTRUCTION_FORMAT3rc_METHOD_ODEX_in_insn_format3rc_method_odex5389); 
 			INSTRUCTION_FORMAT3rc_METHOD_ODEX445_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT3rc_METHOD_ODEX445);
 			adaptor.addChild(root_0, INSTRUCTION_FORMAT3rc_METHOD_ODEX445_tree);
 
-			OPEN_BRACE446=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rc_method_odex5391);
+			OPEN_BRACE446=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rc_method_odex5391); 
 			OPEN_BRACE446_tree = (CommonTree)adaptor.create(OPEN_BRACE446);
 			adaptor.addChild(root_0, OPEN_BRACE446_tree);
 
@@ -13750,11 +13750,11 @@
 
 			adaptor.addChild(root_0, register_list447.getTree());
 
-			CLOSE_BRACE448=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rc_method_odex5395);
+			CLOSE_BRACE448=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rc_method_odex5395); 
 			CLOSE_BRACE448_tree = (CommonTree)adaptor.create(CLOSE_BRACE448);
 			adaptor.addChild(root_0, CLOSE_BRACE448_tree);
 
-			COMMA449=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rc_method_odex5397);
+			COMMA449=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rc_method_odex5397); 
 			COMMA449_tree = (CommonTree)adaptor.create(COMMA449);
 			adaptor.addChild(root_0, COMMA449_tree);
 
@@ -13766,7 +13766,7 @@
 
 
 			      throwOdexedInstructionException(input, (INSTRUCTION_FORMAT3rc_METHOD_ODEX445!=null?INSTRUCTION_FORMAT3rc_METHOD_ODEX445.getText():null));
-			
+			    
 			}
 
 			retval.stop = input.LT(-1);
@@ -13796,7 +13796,7 @@
 
 
 	// $ANTLR start "insn_format3rc_type"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1062:1: insn_format3rc_type : INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT3rc_TYPE[$start, \"I_STATEMENT_FORMAT3rc_TYPE\"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) ;
+	// smaliParser.g:1062:1: insn_format3rc_type : INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT3rc_TYPE[$start, \"I_STATEMENT_FORMAT3rc_TYPE\"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) ;
 	public final smaliParser.insn_format3rc_type_return insn_format3rc_type() throws RecognitionException {
 		smaliParser.insn_format3rc_type_return retval = new smaliParser.insn_format3rc_type_return();
 		retval.start = input.LT(1);
@@ -13822,13 +13822,13 @@
 		RewriteRuleSubtreeStream stream_register_range=new RewriteRuleSubtreeStream(adaptor,"rule register_range");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1063:3: ( INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT3rc_TYPE[$start, \"I_STATEMENT_FORMAT3rc_TYPE\"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1064:5: INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor
+			// smaliParser.g:1063:3: ( INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor -> ^( I_STATEMENT_FORMAT3rc_TYPE[$start, \"I_STATEMENT_FORMAT3rc_TYPE\"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) )
+			// smaliParser.g:1064:5: INSTRUCTION_FORMAT3rc_TYPE OPEN_BRACE register_range CLOSE_BRACE COMMA nonvoid_type_descriptor
 			{
-			INSTRUCTION_FORMAT3rc_TYPE451=(Token)match(input,INSTRUCTION_FORMAT3rc_TYPE,FOLLOW_INSTRUCTION_FORMAT3rc_TYPE_in_insn_format3rc_type5420);
+			INSTRUCTION_FORMAT3rc_TYPE451=(Token)match(input,INSTRUCTION_FORMAT3rc_TYPE,FOLLOW_INSTRUCTION_FORMAT3rc_TYPE_in_insn_format3rc_type5420);  
 			stream_INSTRUCTION_FORMAT3rc_TYPE.add(INSTRUCTION_FORMAT3rc_TYPE451);
 
-			OPEN_BRACE452=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rc_type5422);
+			OPEN_BRACE452=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rc_type5422);  
 			stream_OPEN_BRACE.add(OPEN_BRACE452);
 
 			pushFollow(FOLLOW_register_range_in_insn_format3rc_type5424);
@@ -13836,10 +13836,10 @@
 			state._fsp--;
 
 			stream_register_range.add(register_range453.getTree());
-			CLOSE_BRACE454=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rc_type5426);
+			CLOSE_BRACE454=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rc_type5426);  
 			stream_CLOSE_BRACE.add(CLOSE_BRACE454);
 
-			COMMA455=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rc_type5428);
+			COMMA455=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rc_type5428);  
 			stream_COMMA.add(COMMA455);
 
 			pushFollow(FOLLOW_nonvoid_type_descriptor_in_insn_format3rc_type5430);
@@ -13848,19 +13848,19 @@
 
 			stream_nonvoid_type_descriptor.add(nonvoid_type_descriptor456.getTree());
 			// AST REWRITE
-			// elements: nonvoid_type_descriptor, register_range, INSTRUCTION_FORMAT3rc_TYPE
-			// token labels:
+			// elements: nonvoid_type_descriptor, INSTRUCTION_FORMAT3rc_TYPE, register_range
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 1065:5: -> ^( I_STATEMENT_FORMAT3rc_TYPE[$start, \"I_STATEMENT_FORMAT3rc_TYPE\"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1065:8: ^( I_STATEMENT_FORMAT3rc_TYPE[$start, \"I_STATEMENT_FORMAT3rc_TYPE\"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor )
+				// smaliParser.g:1065:8: ^( I_STATEMENT_FORMAT3rc_TYPE[$start, \"I_STATEMENT_FORMAT3rc_TYPE\"] INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT3rc_TYPE, (retval.start), "I_STATEMENT_FORMAT3rc_TYPE"), root_1);
@@ -13904,7 +13904,7 @@
 
 
 	// $ANTLR start "insn_format3rmi_method"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1067:1: insn_format3rmi_method : INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX ;
+	// smaliParser.g:1067:1: insn_format3rmi_method : INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX ;
 	public final smaliParser.insn_format3rmi_method_return insn_format3rmi_method() throws RecognitionException {
 		smaliParser.insn_format3rmi_method_return retval = new smaliParser.insn_format3rmi_method_return();
 		retval.start = input.LT(1);
@@ -13925,17 +13925,17 @@
 		CommonTree INLINE_INDEX462_tree=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1068:3: ( INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1069:5: INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX
+			// smaliParser.g:1068:3: ( INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX )
+			// smaliParser.g:1069:5: INSTRUCTION_FORMAT3rmi_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA INLINE_INDEX
 			{
 			root_0 = (CommonTree)adaptor.nil();
 
 
-			INSTRUCTION_FORMAT3rmi_METHOD457=(Token)match(input,INSTRUCTION_FORMAT3rmi_METHOD,FOLLOW_INSTRUCTION_FORMAT3rmi_METHOD_in_insn_format3rmi_method5462);
+			INSTRUCTION_FORMAT3rmi_METHOD457=(Token)match(input,INSTRUCTION_FORMAT3rmi_METHOD,FOLLOW_INSTRUCTION_FORMAT3rmi_METHOD_in_insn_format3rmi_method5462); 
 			INSTRUCTION_FORMAT3rmi_METHOD457_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT3rmi_METHOD457);
 			adaptor.addChild(root_0, INSTRUCTION_FORMAT3rmi_METHOD457_tree);
 
-			OPEN_BRACE458=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rmi_method5464);
+			OPEN_BRACE458=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rmi_method5464); 
 			OPEN_BRACE458_tree = (CommonTree)adaptor.create(OPEN_BRACE458);
 			adaptor.addChild(root_0, OPEN_BRACE458_tree);
 
@@ -13945,21 +13945,21 @@
 
 			adaptor.addChild(root_0, register_range459.getTree());
 
-			CLOSE_BRACE460=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rmi_method5468);
+			CLOSE_BRACE460=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rmi_method5468); 
 			CLOSE_BRACE460_tree = (CommonTree)adaptor.create(CLOSE_BRACE460);
 			adaptor.addChild(root_0, CLOSE_BRACE460_tree);
 
-			COMMA461=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rmi_method5470);
+			COMMA461=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rmi_method5470); 
 			COMMA461_tree = (CommonTree)adaptor.create(COMMA461);
 			adaptor.addChild(root_0, COMMA461_tree);
 
-			INLINE_INDEX462=(Token)match(input,INLINE_INDEX,FOLLOW_INLINE_INDEX_in_insn_format3rmi_method5472);
+			INLINE_INDEX462=(Token)match(input,INLINE_INDEX,FOLLOW_INLINE_INDEX_in_insn_format3rmi_method5472); 
 			INLINE_INDEX462_tree = (CommonTree)adaptor.create(INLINE_INDEX462);
 			adaptor.addChild(root_0, INLINE_INDEX462_tree);
 
 
 			      throwOdexedInstructionException(input, (INSTRUCTION_FORMAT3rmi_METHOD457!=null?INSTRUCTION_FORMAT3rmi_METHOD457.getText():null));
-			
+			    
 			}
 
 			retval.stop = input.LT(-1);
@@ -13989,7 +13989,7 @@
 
 
 	// $ANTLR start "insn_format3rms_method"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1074:1: insn_format3rms_method : INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX ;
+	// smaliParser.g:1074:1: insn_format3rms_method : INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX ;
 	public final smaliParser.insn_format3rms_method_return insn_format3rms_method() throws RecognitionException {
 		smaliParser.insn_format3rms_method_return retval = new smaliParser.insn_format3rms_method_return();
 		retval.start = input.LT(1);
@@ -14010,17 +14010,17 @@
 		CommonTree VTABLE_INDEX468_tree=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1075:3: ( INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1076:5: INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX
+			// smaliParser.g:1075:3: ( INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX )
+			// smaliParser.g:1076:5: INSTRUCTION_FORMAT3rms_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA VTABLE_INDEX
 			{
 			root_0 = (CommonTree)adaptor.nil();
 
 
-			INSTRUCTION_FORMAT3rms_METHOD463=(Token)match(input,INSTRUCTION_FORMAT3rms_METHOD,FOLLOW_INSTRUCTION_FORMAT3rms_METHOD_in_insn_format3rms_method5493);
+			INSTRUCTION_FORMAT3rms_METHOD463=(Token)match(input,INSTRUCTION_FORMAT3rms_METHOD,FOLLOW_INSTRUCTION_FORMAT3rms_METHOD_in_insn_format3rms_method5493); 
 			INSTRUCTION_FORMAT3rms_METHOD463_tree = (CommonTree)adaptor.create(INSTRUCTION_FORMAT3rms_METHOD463);
 			adaptor.addChild(root_0, INSTRUCTION_FORMAT3rms_METHOD463_tree);
 
-			OPEN_BRACE464=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rms_method5495);
+			OPEN_BRACE464=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format3rms_method5495); 
 			OPEN_BRACE464_tree = (CommonTree)adaptor.create(OPEN_BRACE464);
 			adaptor.addChild(root_0, OPEN_BRACE464_tree);
 
@@ -14030,21 +14030,21 @@
 
 			adaptor.addChild(root_0, register_range465.getTree());
 
-			CLOSE_BRACE466=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rms_method5499);
+			CLOSE_BRACE466=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format3rms_method5499); 
 			CLOSE_BRACE466_tree = (CommonTree)adaptor.create(CLOSE_BRACE466);
 			adaptor.addChild(root_0, CLOSE_BRACE466_tree);
 
-			COMMA467=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rms_method5501);
+			COMMA467=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format3rms_method5501); 
 			COMMA467_tree = (CommonTree)adaptor.create(COMMA467);
 			adaptor.addChild(root_0, COMMA467_tree);
 
-			VTABLE_INDEX468=(Token)match(input,VTABLE_INDEX,FOLLOW_VTABLE_INDEX_in_insn_format3rms_method5503);
+			VTABLE_INDEX468=(Token)match(input,VTABLE_INDEX,FOLLOW_VTABLE_INDEX_in_insn_format3rms_method5503); 
 			VTABLE_INDEX468_tree = (CommonTree)adaptor.create(VTABLE_INDEX468);
 			adaptor.addChild(root_0, VTABLE_INDEX468_tree);
 
 
 			      throwOdexedInstructionException(input, (INSTRUCTION_FORMAT3rms_METHOD463!=null?INSTRUCTION_FORMAT3rms_METHOD463.getText():null));
-			
+			    
 			}
 
 			retval.stop = input.LT(-1);
@@ -14074,7 +14074,7 @@
 
 
 	// $ANTLR start "insn_format45cc_method"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1081:1: insn_format45cc_method : INSTRUCTION_FORMAT45cc_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference COMMA method_prototype -> ^( I_STATEMENT_FORMAT45cc_METHOD[$start, \"I_STATEMENT_FORMAT45cc_METHOD\"] INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) ;
+	// smaliParser.g:1081:1: insn_format45cc_method : INSTRUCTION_FORMAT45cc_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference COMMA method_prototype -> ^( I_STATEMENT_FORMAT45cc_METHOD[$start, \"I_STATEMENT_FORMAT45cc_METHOD\"] INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) ;
 	public final smaliParser.insn_format45cc_method_return insn_format45cc_method() throws RecognitionException {
 		smaliParser.insn_format45cc_method_return retval = new smaliParser.insn_format45cc_method_return();
 		retval.start = input.LT(1);
@@ -14104,13 +14104,13 @@
 		RewriteRuleSubtreeStream stream_register_list=new RewriteRuleSubtreeStream(adaptor,"rule register_list");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1082:3: ( INSTRUCTION_FORMAT45cc_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference COMMA method_prototype -> ^( I_STATEMENT_FORMAT45cc_METHOD[$start, \"I_STATEMENT_FORMAT45cc_METHOD\"] INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1083:5: INSTRUCTION_FORMAT45cc_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference COMMA method_prototype
+			// smaliParser.g:1082:3: ( INSTRUCTION_FORMAT45cc_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference COMMA method_prototype -> ^( I_STATEMENT_FORMAT45cc_METHOD[$start, \"I_STATEMENT_FORMAT45cc_METHOD\"] INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) )
+			// smaliParser.g:1083:5: INSTRUCTION_FORMAT45cc_METHOD OPEN_BRACE register_list CLOSE_BRACE COMMA method_reference COMMA method_prototype
 			{
-			INSTRUCTION_FORMAT45cc_METHOD469=(Token)match(input,INSTRUCTION_FORMAT45cc_METHOD,FOLLOW_INSTRUCTION_FORMAT45cc_METHOD_in_insn_format45cc_method5524);
+			INSTRUCTION_FORMAT45cc_METHOD469=(Token)match(input,INSTRUCTION_FORMAT45cc_METHOD,FOLLOW_INSTRUCTION_FORMAT45cc_METHOD_in_insn_format45cc_method5524);  
 			stream_INSTRUCTION_FORMAT45cc_METHOD.add(INSTRUCTION_FORMAT45cc_METHOD469);
 
-			OPEN_BRACE470=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format45cc_method5526);
+			OPEN_BRACE470=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format45cc_method5526);  
 			stream_OPEN_BRACE.add(OPEN_BRACE470);
 
 			pushFollow(FOLLOW_register_list_in_insn_format45cc_method5528);
@@ -14118,10 +14118,10 @@
 			state._fsp--;
 
 			stream_register_list.add(register_list471.getTree());
-			CLOSE_BRACE472=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format45cc_method5530);
+			CLOSE_BRACE472=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format45cc_method5530);  
 			stream_CLOSE_BRACE.add(CLOSE_BRACE472);
 
-			COMMA473=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format45cc_method5532);
+			COMMA473=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format45cc_method5532);  
 			stream_COMMA.add(COMMA473);
 
 			pushFollow(FOLLOW_method_reference_in_insn_format45cc_method5534);
@@ -14129,7 +14129,7 @@
 			state._fsp--;
 
 			stream_method_reference.add(method_reference474.getTree());
-			COMMA475=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format45cc_method5536);
+			COMMA475=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format45cc_method5536);  
 			stream_COMMA.add(COMMA475);
 
 			pushFollow(FOLLOW_method_prototype_in_insn_format45cc_method5538);
@@ -14138,19 +14138,19 @@
 
 			stream_method_prototype.add(method_prototype476.getTree());
 			// AST REWRITE
-			// elements: INSTRUCTION_FORMAT45cc_METHOD, method_prototype, register_list, method_reference
-			// token labels:
+			// elements: method_reference, method_prototype, INSTRUCTION_FORMAT45cc_METHOD, register_list
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 1084:5: -> ^( I_STATEMENT_FORMAT45cc_METHOD[$start, \"I_STATEMENT_FORMAT45cc_METHOD\"] INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1084:8: ^( I_STATEMENT_FORMAT45cc_METHOD[$start, \"I_STATEMENT_FORMAT45cc_METHOD\"] INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype )
+				// smaliParser.g:1084:8: ^( I_STATEMENT_FORMAT45cc_METHOD[$start, \"I_STATEMENT_FORMAT45cc_METHOD\"] INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT45cc_METHOD, (retval.start), "I_STATEMENT_FORMAT45cc_METHOD"), root_1);
@@ -14195,7 +14195,7 @@
 
 
 	// $ANTLR start "insn_format4rcc_method"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1086:1: insn_format4rcc_method : INSTRUCTION_FORMAT4rcc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference COMMA method_prototype -> ^( I_STATEMENT_FORMAT4rcc_METHOD[$start, \"I_STATEMENT_FORMAT4rcc_METHOD\"] INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) ;
+	// smaliParser.g:1086:1: insn_format4rcc_method : INSTRUCTION_FORMAT4rcc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference COMMA method_prototype -> ^( I_STATEMENT_FORMAT4rcc_METHOD[$start, \"I_STATEMENT_FORMAT4rcc_METHOD\"] INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) ;
 	public final smaliParser.insn_format4rcc_method_return insn_format4rcc_method() throws RecognitionException {
 		smaliParser.insn_format4rcc_method_return retval = new smaliParser.insn_format4rcc_method_return();
 		retval.start = input.LT(1);
@@ -14225,13 +14225,13 @@
 		RewriteRuleSubtreeStream stream_register_range=new RewriteRuleSubtreeStream(adaptor,"rule register_range");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1087:3: ( INSTRUCTION_FORMAT4rcc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference COMMA method_prototype -> ^( I_STATEMENT_FORMAT4rcc_METHOD[$start, \"I_STATEMENT_FORMAT4rcc_METHOD\"] INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1088:5: INSTRUCTION_FORMAT4rcc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference COMMA method_prototype
+			// smaliParser.g:1087:3: ( INSTRUCTION_FORMAT4rcc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference COMMA method_prototype -> ^( I_STATEMENT_FORMAT4rcc_METHOD[$start, \"I_STATEMENT_FORMAT4rcc_METHOD\"] INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) )
+			// smaliParser.g:1088:5: INSTRUCTION_FORMAT4rcc_METHOD OPEN_BRACE register_range CLOSE_BRACE COMMA method_reference COMMA method_prototype
 			{
-			INSTRUCTION_FORMAT4rcc_METHOD477=(Token)match(input,INSTRUCTION_FORMAT4rcc_METHOD,FOLLOW_INSTRUCTION_FORMAT4rcc_METHOD_in_insn_format4rcc_method5572);
+			INSTRUCTION_FORMAT4rcc_METHOD477=(Token)match(input,INSTRUCTION_FORMAT4rcc_METHOD,FOLLOW_INSTRUCTION_FORMAT4rcc_METHOD_in_insn_format4rcc_method5572);  
 			stream_INSTRUCTION_FORMAT4rcc_METHOD.add(INSTRUCTION_FORMAT4rcc_METHOD477);
 
-			OPEN_BRACE478=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format4rcc_method5574);
+			OPEN_BRACE478=(Token)match(input,OPEN_BRACE,FOLLOW_OPEN_BRACE_in_insn_format4rcc_method5574);  
 			stream_OPEN_BRACE.add(OPEN_BRACE478);
 
 			pushFollow(FOLLOW_register_range_in_insn_format4rcc_method5576);
@@ -14239,10 +14239,10 @@
 			state._fsp--;
 
 			stream_register_range.add(register_range479.getTree());
-			CLOSE_BRACE480=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format4rcc_method5578);
+			CLOSE_BRACE480=(Token)match(input,CLOSE_BRACE,FOLLOW_CLOSE_BRACE_in_insn_format4rcc_method5578);  
 			stream_CLOSE_BRACE.add(CLOSE_BRACE480);
 
-			COMMA481=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format4rcc_method5580);
+			COMMA481=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format4rcc_method5580);  
 			stream_COMMA.add(COMMA481);
 
 			pushFollow(FOLLOW_method_reference_in_insn_format4rcc_method5582);
@@ -14250,7 +14250,7 @@
 			state._fsp--;
 
 			stream_method_reference.add(method_reference482.getTree());
-			COMMA483=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format4rcc_method5584);
+			COMMA483=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format4rcc_method5584);  
 			stream_COMMA.add(COMMA483);
 
 			pushFollow(FOLLOW_method_prototype_in_insn_format4rcc_method5586);
@@ -14259,19 +14259,19 @@
 
 			stream_method_prototype.add(method_prototype484.getTree());
 			// AST REWRITE
-			// elements: method_reference, INSTRUCTION_FORMAT4rcc_METHOD, register_range, method_prototype
-			// token labels:
+			// elements: register_range, INSTRUCTION_FORMAT4rcc_METHOD, method_reference, method_prototype
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 1089:5: -> ^( I_STATEMENT_FORMAT4rcc_METHOD[$start, \"I_STATEMENT_FORMAT4rcc_METHOD\"] INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1089:8: ^( I_STATEMENT_FORMAT4rcc_METHOD[$start, \"I_STATEMENT_FORMAT4rcc_METHOD\"] INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype )
+				// smaliParser.g:1089:8: ^( I_STATEMENT_FORMAT4rcc_METHOD[$start, \"I_STATEMENT_FORMAT4rcc_METHOD\"] INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT4rcc_METHOD, (retval.start), "I_STATEMENT_FORMAT4rcc_METHOD"), root_1);
@@ -14316,7 +14316,7 @@
 
 
 	// $ANTLR start "insn_format51l"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1091:1: insn_format51l : INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal -> ^( I_STATEMENT_FORMAT51l[$start, \"I_STATEMENT_FORMAT51l\"] INSTRUCTION_FORMAT51l REGISTER fixed_literal ) ;
+	// smaliParser.g:1091:1: insn_format51l : INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal -> ^( I_STATEMENT_FORMAT51l[$start, \"I_STATEMENT_FORMAT51l\"] INSTRUCTION_FORMAT51l REGISTER fixed_literal ) ;
 	public final smaliParser.insn_format51l_return insn_format51l() throws RecognitionException {
 		smaliParser.insn_format51l_return retval = new smaliParser.insn_format51l_return();
 		retval.start = input.LT(1);
@@ -14337,16 +14337,16 @@
 		RewriteRuleSubtreeStream stream_fixed_literal=new RewriteRuleSubtreeStream(adaptor,"rule fixed_literal");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1092:3: ( INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal -> ^( I_STATEMENT_FORMAT51l[$start, \"I_STATEMENT_FORMAT51l\"] INSTRUCTION_FORMAT51l REGISTER fixed_literal ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1093:5: INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal
+			// smaliParser.g:1092:3: ( INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal -> ^( I_STATEMENT_FORMAT51l[$start, \"I_STATEMENT_FORMAT51l\"] INSTRUCTION_FORMAT51l REGISTER fixed_literal ) )
+			// smaliParser.g:1093:5: INSTRUCTION_FORMAT51l REGISTER COMMA fixed_literal
 			{
-			INSTRUCTION_FORMAT51l485=(Token)match(input,INSTRUCTION_FORMAT51l,FOLLOW_INSTRUCTION_FORMAT51l_in_insn_format51l5620);
+			INSTRUCTION_FORMAT51l485=(Token)match(input,INSTRUCTION_FORMAT51l,FOLLOW_INSTRUCTION_FORMAT51l_in_insn_format51l5620);  
 			stream_INSTRUCTION_FORMAT51l.add(INSTRUCTION_FORMAT51l485);
 
-			REGISTER486=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format51l5622);
+			REGISTER486=(Token)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format51l5622);  
 			stream_REGISTER.add(REGISTER486);
 
-			COMMA487=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format51l5624);
+			COMMA487=(Token)match(input,COMMA,FOLLOW_COMMA_in_insn_format51l5624);  
 			stream_COMMA.add(COMMA487);
 
 			pushFollow(FOLLOW_fixed_literal_in_insn_format51l5626);
@@ -14355,19 +14355,19 @@
 
 			stream_fixed_literal.add(fixed_literal488.getTree());
 			// AST REWRITE
-			// elements: INSTRUCTION_FORMAT51l, REGISTER, fixed_literal
-			// token labels:
+			// elements: REGISTER, INSTRUCTION_FORMAT51l, fixed_literal
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 1094:5: -> ^( I_STATEMENT_FORMAT51l[$start, \"I_STATEMENT_FORMAT51l\"] INSTRUCTION_FORMAT51l REGISTER fixed_literal )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1094:8: ^( I_STATEMENT_FORMAT51l[$start, \"I_STATEMENT_FORMAT51l\"] INSTRUCTION_FORMAT51l REGISTER fixed_literal )
+				// smaliParser.g:1094:8: ^( I_STATEMENT_FORMAT51l[$start, \"I_STATEMENT_FORMAT51l\"] INSTRUCTION_FORMAT51l REGISTER fixed_literal )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_FORMAT51l, (retval.start), "I_STATEMENT_FORMAT51l"), root_1);
@@ -14411,7 +14411,7 @@
 
 
 	// $ANTLR start "insn_array_data_directive"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1096:1: insn_array_data_directive : ARRAY_DATA_DIRECTIVE parsed_integer_literal ( fixed_literal )* END_ARRAY_DATA_DIRECTIVE -> ^( I_STATEMENT_ARRAY_DATA[$start, \"I_STATEMENT_ARRAY_DATA\"] ^( I_ARRAY_ELEMENT_SIZE parsed_integer_literal ) ^( I_ARRAY_ELEMENTS ( fixed_literal )* ) ) ;
+	// smaliParser.g:1096:1: insn_array_data_directive : ARRAY_DATA_DIRECTIVE parsed_integer_literal ( fixed_literal )* END_ARRAY_DATA_DIRECTIVE -> ^( I_STATEMENT_ARRAY_DATA[$start, \"I_STATEMENT_ARRAY_DATA\"] ^( I_ARRAY_ELEMENT_SIZE parsed_integer_literal ) ^( I_ARRAY_ELEMENTS ( fixed_literal )* ) ) ;
 	public final smaliParser.insn_array_data_directive_return insn_array_data_directive() throws RecognitionException {
 		smaliParser.insn_array_data_directive_return retval = new smaliParser.insn_array_data_directive_return();
 		retval.start = input.LT(1);
@@ -14431,10 +14431,10 @@
 		RewriteRuleSubtreeStream stream_fixed_literal=new RewriteRuleSubtreeStream(adaptor,"rule fixed_literal");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1097:3: ( ARRAY_DATA_DIRECTIVE parsed_integer_literal ( fixed_literal )* END_ARRAY_DATA_DIRECTIVE -> ^( I_STATEMENT_ARRAY_DATA[$start, \"I_STATEMENT_ARRAY_DATA\"] ^( I_ARRAY_ELEMENT_SIZE parsed_integer_literal ) ^( I_ARRAY_ELEMENTS ( fixed_literal )* ) ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1097:5: ARRAY_DATA_DIRECTIVE parsed_integer_literal ( fixed_literal )* END_ARRAY_DATA_DIRECTIVE
+			// smaliParser.g:1097:3: ( ARRAY_DATA_DIRECTIVE parsed_integer_literal ( fixed_literal )* END_ARRAY_DATA_DIRECTIVE -> ^( I_STATEMENT_ARRAY_DATA[$start, \"I_STATEMENT_ARRAY_DATA\"] ^( I_ARRAY_ELEMENT_SIZE parsed_integer_literal ) ^( I_ARRAY_ELEMENTS ( fixed_literal )* ) ) )
+			// smaliParser.g:1097:5: ARRAY_DATA_DIRECTIVE parsed_integer_literal ( fixed_literal )* END_ARRAY_DATA_DIRECTIVE
 			{
-			ARRAY_DATA_DIRECTIVE489=(Token)match(input,ARRAY_DATA_DIRECTIVE,FOLLOW_ARRAY_DATA_DIRECTIVE_in_insn_array_data_directive5653);
+			ARRAY_DATA_DIRECTIVE489=(Token)match(input,ARRAY_DATA_DIRECTIVE,FOLLOW_ARRAY_DATA_DIRECTIVE_in_insn_array_data_directive5653);  
 			stream_ARRAY_DATA_DIRECTIVE.add(ARRAY_DATA_DIRECTIVE489);
 
 			pushFollow(FOLLOW_parsed_integer_literal_in_insn_array_data_directive5659);
@@ -14447,8 +14447,8 @@
 			        if (elementWidth != 4 && elementWidth != 8 && elementWidth != 1 && elementWidth != 2) {
 			            throw new SemanticException(input, (retval.start), "Invalid element width: %d. Must be 1, 2, 4 or 8", elementWidth);
 			        }
-			
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1105:5: ( fixed_literal )*
+			    
+			// smaliParser.g:1105:5: ( fixed_literal )*
 			loop52:
 			while (true) {
 				int alt52=2;
@@ -14459,7 +14459,7 @@
 
 				switch (alt52) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1105:5: fixed_literal
+					// smaliParser.g:1105:5: fixed_literal
 					{
 					pushFollow(FOLLOW_fixed_literal_in_insn_array_data_directive5671);
 					fixed_literal491=fixed_literal();
@@ -14474,27 +14474,27 @@
 				}
 			}
 
-			END_ARRAY_DATA_DIRECTIVE492=(Token)match(input,END_ARRAY_DATA_DIRECTIVE,FOLLOW_END_ARRAY_DATA_DIRECTIVE_in_insn_array_data_directive5674);
+			END_ARRAY_DATA_DIRECTIVE492=(Token)match(input,END_ARRAY_DATA_DIRECTIVE,FOLLOW_END_ARRAY_DATA_DIRECTIVE_in_insn_array_data_directive5674);  
 			stream_END_ARRAY_DATA_DIRECTIVE.add(END_ARRAY_DATA_DIRECTIVE492);
 
 			// AST REWRITE
 			// elements: parsed_integer_literal, fixed_literal
-			// token labels:
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 1107:5: -> ^( I_STATEMENT_ARRAY_DATA[$start, \"I_STATEMENT_ARRAY_DATA\"] ^( I_ARRAY_ELEMENT_SIZE parsed_integer_literal ) ^( I_ARRAY_ELEMENTS ( fixed_literal )* ) )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1107:8: ^( I_STATEMENT_ARRAY_DATA[$start, \"I_STATEMENT_ARRAY_DATA\"] ^( I_ARRAY_ELEMENT_SIZE parsed_integer_literal ) ^( I_ARRAY_ELEMENTS ( fixed_literal )* ) )
+				// smaliParser.g:1107:8: ^( I_STATEMENT_ARRAY_DATA[$start, \"I_STATEMENT_ARRAY_DATA\"] ^( I_ARRAY_ELEMENT_SIZE parsed_integer_literal ) ^( I_ARRAY_ELEMENTS ( fixed_literal )* ) )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_ARRAY_DATA, (retval.start), "I_STATEMENT_ARRAY_DATA"), root_1);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1107:67: ^( I_ARRAY_ELEMENT_SIZE parsed_integer_literal )
+				// smaliParser.g:1107:67: ^( I_ARRAY_ELEMENT_SIZE parsed_integer_literal )
 				{
 				CommonTree root_2 = (CommonTree)adaptor.nil();
 				root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ARRAY_ELEMENT_SIZE, "I_ARRAY_ELEMENT_SIZE"), root_2);
@@ -14502,11 +14502,11 @@
 				adaptor.addChild(root_1, root_2);
 				}
 
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1108:8: ^( I_ARRAY_ELEMENTS ( fixed_literal )* )
+				// smaliParser.g:1108:8: ^( I_ARRAY_ELEMENTS ( fixed_literal )* )
 				{
 				CommonTree root_2 = (CommonTree)adaptor.nil();
 				root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_ARRAY_ELEMENTS, "I_ARRAY_ELEMENTS"), root_2);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1108:27: ( fixed_literal )*
+				// smaliParser.g:1108:27: ( fixed_literal )*
 				while ( stream_fixed_literal.hasNext() ) {
 					adaptor.addChild(root_2, stream_fixed_literal.nextTree());
 				}
@@ -14552,7 +14552,7 @@
 
 
 	// $ANTLR start "insn_packed_switch_directive"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1110:1: insn_packed_switch_directive : PACKED_SWITCH_DIRECTIVE fixed_32bit_literal ( label_ref )* END_PACKED_SWITCH_DIRECTIVE -> ^( I_STATEMENT_PACKED_SWITCH[$start, \"I_STATEMENT_PACKED_SWITCH\"] ^( I_PACKED_SWITCH_START_KEY[$start, \"I_PACKED_SWITCH_START_KEY\"] fixed_32bit_literal ) ^( I_PACKED_SWITCH_ELEMENTS[$start, \"I_PACKED_SWITCH_ELEMENTS\"] ( label_ref )* ) ) ;
+	// smaliParser.g:1110:1: insn_packed_switch_directive : PACKED_SWITCH_DIRECTIVE fixed_32bit_literal ( label_ref )* END_PACKED_SWITCH_DIRECTIVE -> ^( I_STATEMENT_PACKED_SWITCH[$start, \"I_STATEMENT_PACKED_SWITCH\"] ^( I_PACKED_SWITCH_START_KEY[$start, \"I_PACKED_SWITCH_START_KEY\"] fixed_32bit_literal ) ^( I_PACKED_SWITCH_ELEMENTS[$start, \"I_PACKED_SWITCH_ELEMENTS\"] ( label_ref )* ) ) ;
 	public final smaliParser.insn_packed_switch_directive_return insn_packed_switch_directive() throws RecognitionException {
 		smaliParser.insn_packed_switch_directive_return retval = new smaliParser.insn_packed_switch_directive_return();
 		retval.start = input.LT(1);
@@ -14572,10 +14572,10 @@
 		RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1111:5: ( PACKED_SWITCH_DIRECTIVE fixed_32bit_literal ( label_ref )* END_PACKED_SWITCH_DIRECTIVE -> ^( I_STATEMENT_PACKED_SWITCH[$start, \"I_STATEMENT_PACKED_SWITCH\"] ^( I_PACKED_SWITCH_START_KEY[$start, \"I_PACKED_SWITCH_START_KEY\"] fixed_32bit_literal ) ^( I_PACKED_SWITCH_ELEMENTS[$start, \"I_PACKED_SWITCH_ELEMENTS\"] ( label_ref )* ) ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1111:9: PACKED_SWITCH_DIRECTIVE fixed_32bit_literal ( label_ref )* END_PACKED_SWITCH_DIRECTIVE
+			// smaliParser.g:1111:5: ( PACKED_SWITCH_DIRECTIVE fixed_32bit_literal ( label_ref )* END_PACKED_SWITCH_DIRECTIVE -> ^( I_STATEMENT_PACKED_SWITCH[$start, \"I_STATEMENT_PACKED_SWITCH\"] ^( I_PACKED_SWITCH_START_KEY[$start, \"I_PACKED_SWITCH_START_KEY\"] fixed_32bit_literal ) ^( I_PACKED_SWITCH_ELEMENTS[$start, \"I_PACKED_SWITCH_ELEMENTS\"] ( label_ref )* ) ) )
+			// smaliParser.g:1111:9: PACKED_SWITCH_DIRECTIVE fixed_32bit_literal ( label_ref )* END_PACKED_SWITCH_DIRECTIVE
 			{
-			PACKED_SWITCH_DIRECTIVE493=(Token)match(input,PACKED_SWITCH_DIRECTIVE,FOLLOW_PACKED_SWITCH_DIRECTIVE_in_insn_packed_switch_directive5720);
+			PACKED_SWITCH_DIRECTIVE493=(Token)match(input,PACKED_SWITCH_DIRECTIVE,FOLLOW_PACKED_SWITCH_DIRECTIVE_in_insn_packed_switch_directive5720);  
 			stream_PACKED_SWITCH_DIRECTIVE.add(PACKED_SWITCH_DIRECTIVE493);
 
 			pushFollow(FOLLOW_fixed_32bit_literal_in_insn_packed_switch_directive5726);
@@ -14583,7 +14583,7 @@
 			state._fsp--;
 
 			stream_fixed_32bit_literal.add(fixed_32bit_literal494.getTree());
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1113:5: ( label_ref )*
+			// smaliParser.g:1113:5: ( label_ref )*
 			loop53:
 			while (true) {
 				int alt53=2;
@@ -14594,7 +14594,7 @@
 
 				switch (alt53) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1113:5: label_ref
+					// smaliParser.g:1113:5: label_ref
 					{
 					pushFollow(FOLLOW_label_ref_in_insn_packed_switch_directive5732);
 					label_ref495=label_ref();
@@ -14609,27 +14609,27 @@
 				}
 			}
 
-			END_PACKED_SWITCH_DIRECTIVE496=(Token)match(input,END_PACKED_SWITCH_DIRECTIVE,FOLLOW_END_PACKED_SWITCH_DIRECTIVE_in_insn_packed_switch_directive5739);
+			END_PACKED_SWITCH_DIRECTIVE496=(Token)match(input,END_PACKED_SWITCH_DIRECTIVE,FOLLOW_END_PACKED_SWITCH_DIRECTIVE_in_insn_packed_switch_directive5739);  
 			stream_END_PACKED_SWITCH_DIRECTIVE.add(END_PACKED_SWITCH_DIRECTIVE496);
 
 			// AST REWRITE
-			// elements: label_ref, fixed_32bit_literal
-			// token labels:
+			// elements: fixed_32bit_literal, label_ref
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 1115:5: -> ^( I_STATEMENT_PACKED_SWITCH[$start, \"I_STATEMENT_PACKED_SWITCH\"] ^( I_PACKED_SWITCH_START_KEY[$start, \"I_PACKED_SWITCH_START_KEY\"] fixed_32bit_literal ) ^( I_PACKED_SWITCH_ELEMENTS[$start, \"I_PACKED_SWITCH_ELEMENTS\"] ( label_ref )* ) )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1115:8: ^( I_STATEMENT_PACKED_SWITCH[$start, \"I_STATEMENT_PACKED_SWITCH\"] ^( I_PACKED_SWITCH_START_KEY[$start, \"I_PACKED_SWITCH_START_KEY\"] fixed_32bit_literal ) ^( I_PACKED_SWITCH_ELEMENTS[$start, \"I_PACKED_SWITCH_ELEMENTS\"] ( label_ref )* ) )
+				// smaliParser.g:1115:8: ^( I_STATEMENT_PACKED_SWITCH[$start, \"I_STATEMENT_PACKED_SWITCH\"] ^( I_PACKED_SWITCH_START_KEY[$start, \"I_PACKED_SWITCH_START_KEY\"] fixed_32bit_literal ) ^( I_PACKED_SWITCH_ELEMENTS[$start, \"I_PACKED_SWITCH_ELEMENTS\"] ( label_ref )* ) )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_PACKED_SWITCH, (retval.start), "I_STATEMENT_PACKED_SWITCH"), root_1);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1116:10: ^( I_PACKED_SWITCH_START_KEY[$start, \"I_PACKED_SWITCH_START_KEY\"] fixed_32bit_literal )
+				// smaliParser.g:1116:10: ^( I_PACKED_SWITCH_START_KEY[$start, \"I_PACKED_SWITCH_START_KEY\"] fixed_32bit_literal )
 				{
 				CommonTree root_2 = (CommonTree)adaptor.nil();
 				root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_PACKED_SWITCH_START_KEY, (retval.start), "I_PACKED_SWITCH_START_KEY"), root_2);
@@ -14637,11 +14637,11 @@
 				adaptor.addChild(root_1, root_2);
 				}
 
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1117:10: ^( I_PACKED_SWITCH_ELEMENTS[$start, \"I_PACKED_SWITCH_ELEMENTS\"] ( label_ref )* )
+				// smaliParser.g:1117:10: ^( I_PACKED_SWITCH_ELEMENTS[$start, \"I_PACKED_SWITCH_ELEMENTS\"] ( label_ref )* )
 				{
 				CommonTree root_2 = (CommonTree)adaptor.nil();
 				root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_PACKED_SWITCH_ELEMENTS, (retval.start), "I_PACKED_SWITCH_ELEMENTS"), root_2);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1118:11: ( label_ref )*
+				// smaliParser.g:1118:11: ( label_ref )*
 				while ( stream_label_ref.hasNext() ) {
 					adaptor.addChild(root_2, stream_label_ref.nextTree());
 				}
@@ -14687,7 +14687,7 @@
 
 
 	// $ANTLR start "insn_sparse_switch_directive"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1121:1: insn_sparse_switch_directive : SPARSE_SWITCH_DIRECTIVE ( fixed_32bit_literal ARROW label_ref )* END_SPARSE_SWITCH_DIRECTIVE -> ^( I_STATEMENT_SPARSE_SWITCH[$start, \"I_STATEMENT_SPARSE_SWITCH\"] ^( I_SPARSE_SWITCH_ELEMENTS[$start, \"I_SPARSE_SWITCH_ELEMENTS\"] ( fixed_32bit_literal label_ref )* ) ) ;
+	// smaliParser.g:1121:1: insn_sparse_switch_directive : SPARSE_SWITCH_DIRECTIVE ( fixed_32bit_literal ARROW label_ref )* END_SPARSE_SWITCH_DIRECTIVE -> ^( I_STATEMENT_SPARSE_SWITCH[$start, \"I_STATEMENT_SPARSE_SWITCH\"] ^( I_SPARSE_SWITCH_ELEMENTS[$start, \"I_SPARSE_SWITCH_ELEMENTS\"] ( fixed_32bit_literal label_ref )* ) ) ;
 	public final smaliParser.insn_sparse_switch_directive_return insn_sparse_switch_directive() throws RecognitionException {
 		smaliParser.insn_sparse_switch_directive_return retval = new smaliParser.insn_sparse_switch_directive_return();
 		retval.start = input.LT(1);
@@ -14710,13 +14710,13 @@
 		RewriteRuleSubtreeStream stream_label_ref=new RewriteRuleSubtreeStream(adaptor,"rule label_ref");
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1122:3: ( SPARSE_SWITCH_DIRECTIVE ( fixed_32bit_literal ARROW label_ref )* END_SPARSE_SWITCH_DIRECTIVE -> ^( I_STATEMENT_SPARSE_SWITCH[$start, \"I_STATEMENT_SPARSE_SWITCH\"] ^( I_SPARSE_SWITCH_ELEMENTS[$start, \"I_SPARSE_SWITCH_ELEMENTS\"] ( fixed_32bit_literal label_ref )* ) ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1122:7: SPARSE_SWITCH_DIRECTIVE ( fixed_32bit_literal ARROW label_ref )* END_SPARSE_SWITCH_DIRECTIVE
+			// smaliParser.g:1122:3: ( SPARSE_SWITCH_DIRECTIVE ( fixed_32bit_literal ARROW label_ref )* END_SPARSE_SWITCH_DIRECTIVE -> ^( I_STATEMENT_SPARSE_SWITCH[$start, \"I_STATEMENT_SPARSE_SWITCH\"] ^( I_SPARSE_SWITCH_ELEMENTS[$start, \"I_SPARSE_SWITCH_ELEMENTS\"] ( fixed_32bit_literal label_ref )* ) ) )
+			// smaliParser.g:1122:7: SPARSE_SWITCH_DIRECTIVE ( fixed_32bit_literal ARROW label_ref )* END_SPARSE_SWITCH_DIRECTIVE
 			{
-			SPARSE_SWITCH_DIRECTIVE497=(Token)match(input,SPARSE_SWITCH_DIRECTIVE,FOLLOW_SPARSE_SWITCH_DIRECTIVE_in_insn_sparse_switch_directive5813);
+			SPARSE_SWITCH_DIRECTIVE497=(Token)match(input,SPARSE_SWITCH_DIRECTIVE,FOLLOW_SPARSE_SWITCH_DIRECTIVE_in_insn_sparse_switch_directive5813);  
 			stream_SPARSE_SWITCH_DIRECTIVE.add(SPARSE_SWITCH_DIRECTIVE497);
 
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1123:5: ( fixed_32bit_literal ARROW label_ref )*
+			// smaliParser.g:1123:5: ( fixed_32bit_literal ARROW label_ref )*
 			loop54:
 			while (true) {
 				int alt54=2;
@@ -14727,14 +14727,14 @@
 
 				switch (alt54) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1123:6: fixed_32bit_literal ARROW label_ref
+					// smaliParser.g:1123:6: fixed_32bit_literal ARROW label_ref
 					{
 					pushFollow(FOLLOW_fixed_32bit_literal_in_insn_sparse_switch_directive5820);
 					fixed_32bit_literal498=fixed_32bit_literal();
 					state._fsp--;
 
 					stream_fixed_32bit_literal.add(fixed_32bit_literal498.getTree());
-					ARROW499=(Token)match(input,ARROW,FOLLOW_ARROW_in_insn_sparse_switch_directive5822);
+					ARROW499=(Token)match(input,ARROW,FOLLOW_ARROW_in_insn_sparse_switch_directive5822);  
 					stream_ARROW.add(ARROW499);
 
 					pushFollow(FOLLOW_label_ref_in_insn_sparse_switch_directive5824);
@@ -14750,37 +14750,37 @@
 				}
 			}
 
-			END_SPARSE_SWITCH_DIRECTIVE501=(Token)match(input,END_SPARSE_SWITCH_DIRECTIVE,FOLLOW_END_SPARSE_SWITCH_DIRECTIVE_in_insn_sparse_switch_directive5832);
+			END_SPARSE_SWITCH_DIRECTIVE501=(Token)match(input,END_SPARSE_SWITCH_DIRECTIVE,FOLLOW_END_SPARSE_SWITCH_DIRECTIVE_in_insn_sparse_switch_directive5832);  
 			stream_END_SPARSE_SWITCH_DIRECTIVE.add(END_SPARSE_SWITCH_DIRECTIVE501);
 
 			// AST REWRITE
-			// elements: label_ref, fixed_32bit_literal
-			// token labels:
+			// elements: fixed_32bit_literal, label_ref
+			// token labels: 
 			// rule labels: retval
-			// token list labels:
-			// rule list labels:
-			// wildcard labels:
+			// token list labels: 
+			// rule list labels: 
+			// wildcard labels: 
 			retval.tree = root_0;
 			RewriteRuleSubtreeStream stream_retval=new RewriteRuleSubtreeStream(adaptor,"rule retval",retval!=null?retval.getTree():null);
 
 			root_0 = (CommonTree)adaptor.nil();
 			// 1125:5: -> ^( I_STATEMENT_SPARSE_SWITCH[$start, \"I_STATEMENT_SPARSE_SWITCH\"] ^( I_SPARSE_SWITCH_ELEMENTS[$start, \"I_SPARSE_SWITCH_ELEMENTS\"] ( fixed_32bit_literal label_ref )* ) )
 			{
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1125:8: ^( I_STATEMENT_SPARSE_SWITCH[$start, \"I_STATEMENT_SPARSE_SWITCH\"] ^( I_SPARSE_SWITCH_ELEMENTS[$start, \"I_SPARSE_SWITCH_ELEMENTS\"] ( fixed_32bit_literal label_ref )* ) )
+				// smaliParser.g:1125:8: ^( I_STATEMENT_SPARSE_SWITCH[$start, \"I_STATEMENT_SPARSE_SWITCH\"] ^( I_SPARSE_SWITCH_ELEMENTS[$start, \"I_SPARSE_SWITCH_ELEMENTS\"] ( fixed_32bit_literal label_ref )* ) )
 				{
 				CommonTree root_1 = (CommonTree)adaptor.nil();
 				root_1 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_STATEMENT_SPARSE_SWITCH, (retval.start), "I_STATEMENT_SPARSE_SWITCH"), root_1);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1126:8: ^( I_SPARSE_SWITCH_ELEMENTS[$start, \"I_SPARSE_SWITCH_ELEMENTS\"] ( fixed_32bit_literal label_ref )* )
+				// smaliParser.g:1126:8: ^( I_SPARSE_SWITCH_ELEMENTS[$start, \"I_SPARSE_SWITCH_ELEMENTS\"] ( fixed_32bit_literal label_ref )* )
 				{
 				CommonTree root_2 = (CommonTree)adaptor.nil();
 				root_2 = (CommonTree)adaptor.becomeRoot((CommonTree)adaptor.create(I_SPARSE_SWITCH_ELEMENTS, (retval.start), "I_SPARSE_SWITCH_ELEMENTS"), root_2);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliParser.g:1126:71: ( fixed_32bit_literal label_ref )*
-				while ( stream_label_ref.hasNext()||stream_fixed_32bit_literal.hasNext() ) {
+				// smaliParser.g:1126:71: ( fixed_32bit_literal label_ref )*
+				while ( stream_fixed_32bit_literal.hasNext()||stream_label_ref.hasNext() ) {
 					adaptor.addChild(root_2, stream_fixed_32bit_literal.nextTree());
 					adaptor.addChild(root_2, stream_label_ref.nextTree());
 				}
-				stream_label_ref.reset();
 				stream_fixed_32bit_literal.reset();
+				stream_label_ref.reset();
 
 				adaptor.addChild(root_1, root_2);
 				}
@@ -15154,15 +15154,15 @@
 			TokenStream input = (TokenStream)_input;
 			int _s = s;
 			switch ( s ) {
-					case 0 :
+					case 0 : 
 						int LA40_65 = input.LA(1);
-						
+						 
 						int index40_65 = input.index();
 						input.rewind();
 						s = -1;
 						if ( ((input.LA(1) == ANNOTATION_DIRECTIVE)) ) {s = 66;}
 						else if ( (true) ) {s = 1;}
-						
+						 
 						input.seek(index40_65);
 						if ( s>=0 ) return s;
 						break;
diff --git a/smali/src/main/java/org/jf/smali/smaliTreeWalker.java b/smali/src/main/java/org/jf/smali/smaliTreeWalker.java
index 667c370..30b93c4 100644
--- a/smali/src/main/java/org/jf/smali/smaliTreeWalker.java
+++ b/smali/src/main/java/org/jf/smali/smaliTreeWalker.java
@@ -1,4 +1,4 @@
-// $ANTLR 3.5.2 /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g 2016-09-09 13:35:49
+// $ANTLR 3.5.2 smaliTreeWalker.g 2017-04-20 15:20:46
 
 package org.jf.smali;
 
@@ -49,61 +49,61 @@
 @SuppressWarnings("all")
 public class smaliTreeWalker extends TreeParser {
 	public static final String[] tokenNames = new String[] {
-		"<invalid>", "<EOR>", "<DOWN>", "<UP>", "ACCESS_SPEC", "ANNOTATION_DIRECTIVE",
-		"ANNOTATION_VISIBILITY", "ARRAY_DATA_DIRECTIVE", "ARRAY_TYPE_PREFIX",
-		"ARROW", "BOOL_LITERAL", "BYTE_LITERAL", "CATCHALL_DIRECTIVE", "CATCH_DIRECTIVE",
-		"CHAR_LITERAL", "CLASS_DESCRIPTOR", "CLASS_DIRECTIVE", "CLOSE_BRACE",
-		"CLOSE_PAREN", "COLON", "COMMA", "DOTDOT", "DOUBLE_LITERAL", "DOUBLE_LITERAL_OR_ID",
-		"END_ANNOTATION_DIRECTIVE", "END_ARRAY_DATA_DIRECTIVE", "END_FIELD_DIRECTIVE",
-		"END_LOCAL_DIRECTIVE", "END_METHOD_DIRECTIVE", "END_PACKED_SWITCH_DIRECTIVE",
-		"END_PARAMETER_DIRECTIVE", "END_SPARSE_SWITCH_DIRECTIVE", "END_SUBANNOTATION_DIRECTIVE",
-		"ENUM_DIRECTIVE", "EPILOGUE_DIRECTIVE", "EQUAL", "FIELD_DIRECTIVE", "FIELD_OFFSET",
-		"FLOAT_LITERAL", "FLOAT_LITERAL_OR_ID", "IMPLEMENTS_DIRECTIVE", "INLINE_INDEX",
-		"INSTRUCTION_FORMAT10t", "INSTRUCTION_FORMAT10x", "INSTRUCTION_FORMAT10x_ODEX",
-		"INSTRUCTION_FORMAT11n", "INSTRUCTION_FORMAT11x", "INSTRUCTION_FORMAT12x",
-		"INSTRUCTION_FORMAT12x_OR_ID", "INSTRUCTION_FORMAT20bc", "INSTRUCTION_FORMAT20t",
-		"INSTRUCTION_FORMAT21c_FIELD", "INSTRUCTION_FORMAT21c_FIELD_ODEX", "INSTRUCTION_FORMAT21c_STRING",
-		"INSTRUCTION_FORMAT21c_TYPE", "INSTRUCTION_FORMAT21ih", "INSTRUCTION_FORMAT21lh",
-		"INSTRUCTION_FORMAT21s", "INSTRUCTION_FORMAT21t", "INSTRUCTION_FORMAT22b",
-		"INSTRUCTION_FORMAT22c_FIELD", "INSTRUCTION_FORMAT22c_FIELD_ODEX", "INSTRUCTION_FORMAT22c_TYPE",
-		"INSTRUCTION_FORMAT22cs_FIELD", "INSTRUCTION_FORMAT22s", "INSTRUCTION_FORMAT22s_OR_ID",
-		"INSTRUCTION_FORMAT22t", "INSTRUCTION_FORMAT22x", "INSTRUCTION_FORMAT23x",
-		"INSTRUCTION_FORMAT30t", "INSTRUCTION_FORMAT31c", "INSTRUCTION_FORMAT31i",
-		"INSTRUCTION_FORMAT31i_OR_ID", "INSTRUCTION_FORMAT31t", "INSTRUCTION_FORMAT32x",
-		"INSTRUCTION_FORMAT35c_METHOD", "INSTRUCTION_FORMAT35c_METHOD_ODEX", "INSTRUCTION_FORMAT35c_TYPE",
-		"INSTRUCTION_FORMAT35mi_METHOD", "INSTRUCTION_FORMAT35ms_METHOD", "INSTRUCTION_FORMAT3rc_METHOD",
-		"INSTRUCTION_FORMAT3rc_METHOD_ODEX", "INSTRUCTION_FORMAT3rc_TYPE", "INSTRUCTION_FORMAT3rmi_METHOD",
-		"INSTRUCTION_FORMAT3rms_METHOD", "INSTRUCTION_FORMAT45cc_METHOD", "INSTRUCTION_FORMAT4rcc_METHOD",
-		"INSTRUCTION_FORMAT51l", "INTEGER_LITERAL", "INVALID_TOKEN", "I_ACCESS_LIST",
-		"I_ANNOTATION", "I_ANNOTATIONS", "I_ANNOTATION_ELEMENT", "I_ARRAY_ELEMENTS",
-		"I_ARRAY_ELEMENT_SIZE", "I_CATCH", "I_CATCHALL", "I_CATCHES", "I_CLASS_DEF",
-		"I_ENCODED_ARRAY", "I_ENCODED_ENUM", "I_ENCODED_FIELD", "I_ENCODED_METHOD",
-		"I_END_LOCAL", "I_EPILOGUE", "I_FIELD", "I_FIELDS", "I_FIELD_INITIAL_VALUE",
-		"I_FIELD_TYPE", "I_IMPLEMENTS", "I_LABEL", "I_LINE", "I_LOCAL", "I_LOCALS",
-		"I_METHOD", "I_METHODS", "I_METHOD_PROTOTYPE", "I_METHOD_RETURN_TYPE",
-		"I_ORDERED_METHOD_ITEMS", "I_PACKED_SWITCH_ELEMENTS", "I_PACKED_SWITCH_START_KEY",
-		"I_PARAMETER", "I_PARAMETERS", "I_PARAMETER_NOT_SPECIFIED", "I_PROLOGUE",
-		"I_REGISTERS", "I_REGISTER_LIST", "I_REGISTER_RANGE", "I_RESTART_LOCAL",
-		"I_SOURCE", "I_SPARSE_SWITCH_ELEMENTS", "I_STATEMENT_ARRAY_DATA", "I_STATEMENT_FORMAT10t",
-		"I_STATEMENT_FORMAT10x", "I_STATEMENT_FORMAT11n", "I_STATEMENT_FORMAT11x",
-		"I_STATEMENT_FORMAT12x", "I_STATEMENT_FORMAT20bc", "I_STATEMENT_FORMAT20t",
-		"I_STATEMENT_FORMAT21c_FIELD", "I_STATEMENT_FORMAT21c_STRING", "I_STATEMENT_FORMAT21c_TYPE",
-		"I_STATEMENT_FORMAT21ih", "I_STATEMENT_FORMAT21lh", "I_STATEMENT_FORMAT21s",
-		"I_STATEMENT_FORMAT21t", "I_STATEMENT_FORMAT22b", "I_STATEMENT_FORMAT22c_FIELD",
-		"I_STATEMENT_FORMAT22c_TYPE", "I_STATEMENT_FORMAT22s", "I_STATEMENT_FORMAT22t",
-		"I_STATEMENT_FORMAT22x", "I_STATEMENT_FORMAT23x", "I_STATEMENT_FORMAT30t",
-		"I_STATEMENT_FORMAT31c", "I_STATEMENT_FORMAT31i", "I_STATEMENT_FORMAT31t",
-		"I_STATEMENT_FORMAT32x", "I_STATEMENT_FORMAT35c_METHOD", "I_STATEMENT_FORMAT35c_TYPE",
-		"I_STATEMENT_FORMAT3rc_METHOD", "I_STATEMENT_FORMAT3rc_TYPE", "I_STATEMENT_FORMAT45cc_METHOD",
-		"I_STATEMENT_FORMAT4rcc_METHOD", "I_STATEMENT_FORMAT51l", "I_STATEMENT_PACKED_SWITCH",
-		"I_STATEMENT_SPARSE_SWITCH", "I_SUBANNOTATION", "I_SUPER", "LINE_COMMENT",
-		"LINE_DIRECTIVE", "LOCALS_DIRECTIVE", "LOCAL_DIRECTIVE", "LONG_LITERAL",
-		"MEMBER_NAME", "METHOD_DIRECTIVE", "NEGATIVE_INTEGER_LITERAL", "NULL_LITERAL",
-		"OPEN_BRACE", "OPEN_PAREN", "PACKED_SWITCH_DIRECTIVE", "PARAMETER_DIRECTIVE",
-		"PARAM_LIST_OR_ID_PRIMITIVE_TYPE", "POSITIVE_INTEGER_LITERAL", "PRIMITIVE_TYPE",
-		"PROLOGUE_DIRECTIVE", "REGISTER", "REGISTERS_DIRECTIVE", "RESTART_LOCAL_DIRECTIVE",
-		"SHORT_LITERAL", "SIMPLE_NAME", "SOURCE_DIRECTIVE", "SPARSE_SWITCH_DIRECTIVE",
-		"STRING_LITERAL", "SUBANNOTATION_DIRECTIVE", "SUPER_DIRECTIVE", "VERIFICATION_ERROR_TYPE",
+		"<invalid>", "<EOR>", "<DOWN>", "<UP>", "ACCESS_SPEC", "ANNOTATION_DIRECTIVE", 
+		"ANNOTATION_VISIBILITY", "ARRAY_DATA_DIRECTIVE", "ARRAY_TYPE_PREFIX", 
+		"ARROW", "BOOL_LITERAL", "BYTE_LITERAL", "CATCHALL_DIRECTIVE", "CATCH_DIRECTIVE", 
+		"CHAR_LITERAL", "CLASS_DESCRIPTOR", "CLASS_DIRECTIVE", "CLOSE_BRACE", 
+		"CLOSE_PAREN", "COLON", "COMMA", "DOTDOT", "DOUBLE_LITERAL", "DOUBLE_LITERAL_OR_ID", 
+		"END_ANNOTATION_DIRECTIVE", "END_ARRAY_DATA_DIRECTIVE", "END_FIELD_DIRECTIVE", 
+		"END_LOCAL_DIRECTIVE", "END_METHOD_DIRECTIVE", "END_PACKED_SWITCH_DIRECTIVE", 
+		"END_PARAMETER_DIRECTIVE", "END_SPARSE_SWITCH_DIRECTIVE", "END_SUBANNOTATION_DIRECTIVE", 
+		"ENUM_DIRECTIVE", "EPILOGUE_DIRECTIVE", "EQUAL", "FIELD_DIRECTIVE", "FIELD_OFFSET", 
+		"FLOAT_LITERAL", "FLOAT_LITERAL_OR_ID", "IMPLEMENTS_DIRECTIVE", "INLINE_INDEX", 
+		"INSTRUCTION_FORMAT10t", "INSTRUCTION_FORMAT10x", "INSTRUCTION_FORMAT10x_ODEX", 
+		"INSTRUCTION_FORMAT11n", "INSTRUCTION_FORMAT11x", "INSTRUCTION_FORMAT12x", 
+		"INSTRUCTION_FORMAT12x_OR_ID", "INSTRUCTION_FORMAT20bc", "INSTRUCTION_FORMAT20t", 
+		"INSTRUCTION_FORMAT21c_FIELD", "INSTRUCTION_FORMAT21c_FIELD_ODEX", "INSTRUCTION_FORMAT21c_STRING", 
+		"INSTRUCTION_FORMAT21c_TYPE", "INSTRUCTION_FORMAT21ih", "INSTRUCTION_FORMAT21lh", 
+		"INSTRUCTION_FORMAT21s", "INSTRUCTION_FORMAT21t", "INSTRUCTION_FORMAT22b", 
+		"INSTRUCTION_FORMAT22c_FIELD", "INSTRUCTION_FORMAT22c_FIELD_ODEX", "INSTRUCTION_FORMAT22c_TYPE", 
+		"INSTRUCTION_FORMAT22cs_FIELD", "INSTRUCTION_FORMAT22s", "INSTRUCTION_FORMAT22s_OR_ID", 
+		"INSTRUCTION_FORMAT22t", "INSTRUCTION_FORMAT22x", "INSTRUCTION_FORMAT23x", 
+		"INSTRUCTION_FORMAT30t", "INSTRUCTION_FORMAT31c", "INSTRUCTION_FORMAT31i", 
+		"INSTRUCTION_FORMAT31i_OR_ID", "INSTRUCTION_FORMAT31t", "INSTRUCTION_FORMAT32x", 
+		"INSTRUCTION_FORMAT35c_METHOD", "INSTRUCTION_FORMAT35c_METHOD_ODEX", "INSTRUCTION_FORMAT35c_TYPE", 
+		"INSTRUCTION_FORMAT35mi_METHOD", "INSTRUCTION_FORMAT35ms_METHOD", "INSTRUCTION_FORMAT3rc_METHOD", 
+		"INSTRUCTION_FORMAT3rc_METHOD_ODEX", "INSTRUCTION_FORMAT3rc_TYPE", "INSTRUCTION_FORMAT3rmi_METHOD", 
+		"INSTRUCTION_FORMAT3rms_METHOD", "INSTRUCTION_FORMAT45cc_METHOD", "INSTRUCTION_FORMAT4rcc_METHOD", 
+		"INSTRUCTION_FORMAT51l", "INTEGER_LITERAL", "INVALID_TOKEN", "I_ACCESS_LIST", 
+		"I_ANNOTATION", "I_ANNOTATIONS", "I_ANNOTATION_ELEMENT", "I_ARRAY_ELEMENTS", 
+		"I_ARRAY_ELEMENT_SIZE", "I_CATCH", "I_CATCHALL", "I_CATCHES", "I_CLASS_DEF", 
+		"I_ENCODED_ARRAY", "I_ENCODED_ENUM", "I_ENCODED_FIELD", "I_ENCODED_METHOD", 
+		"I_END_LOCAL", "I_EPILOGUE", "I_FIELD", "I_FIELDS", "I_FIELD_INITIAL_VALUE", 
+		"I_FIELD_TYPE", "I_IMPLEMENTS", "I_LABEL", "I_LINE", "I_LOCAL", "I_LOCALS", 
+		"I_METHOD", "I_METHODS", "I_METHOD_PROTOTYPE", "I_METHOD_RETURN_TYPE", 
+		"I_ORDERED_METHOD_ITEMS", "I_PACKED_SWITCH_ELEMENTS", "I_PACKED_SWITCH_START_KEY", 
+		"I_PARAMETER", "I_PARAMETERS", "I_PARAMETER_NOT_SPECIFIED", "I_PROLOGUE", 
+		"I_REGISTERS", "I_REGISTER_LIST", "I_REGISTER_RANGE", "I_RESTART_LOCAL", 
+		"I_SOURCE", "I_SPARSE_SWITCH_ELEMENTS", "I_STATEMENT_ARRAY_DATA", "I_STATEMENT_FORMAT10t", 
+		"I_STATEMENT_FORMAT10x", "I_STATEMENT_FORMAT11n", "I_STATEMENT_FORMAT11x", 
+		"I_STATEMENT_FORMAT12x", "I_STATEMENT_FORMAT20bc", "I_STATEMENT_FORMAT20t", 
+		"I_STATEMENT_FORMAT21c_FIELD", "I_STATEMENT_FORMAT21c_STRING", "I_STATEMENT_FORMAT21c_TYPE", 
+		"I_STATEMENT_FORMAT21ih", "I_STATEMENT_FORMAT21lh", "I_STATEMENT_FORMAT21s", 
+		"I_STATEMENT_FORMAT21t", "I_STATEMENT_FORMAT22b", "I_STATEMENT_FORMAT22c_FIELD", 
+		"I_STATEMENT_FORMAT22c_TYPE", "I_STATEMENT_FORMAT22s", "I_STATEMENT_FORMAT22t", 
+		"I_STATEMENT_FORMAT22x", "I_STATEMENT_FORMAT23x", "I_STATEMENT_FORMAT30t", 
+		"I_STATEMENT_FORMAT31c", "I_STATEMENT_FORMAT31i", "I_STATEMENT_FORMAT31t", 
+		"I_STATEMENT_FORMAT32x", "I_STATEMENT_FORMAT35c_METHOD", "I_STATEMENT_FORMAT35c_TYPE", 
+		"I_STATEMENT_FORMAT3rc_METHOD", "I_STATEMENT_FORMAT3rc_TYPE", "I_STATEMENT_FORMAT45cc_METHOD", 
+		"I_STATEMENT_FORMAT4rcc_METHOD", "I_STATEMENT_FORMAT51l", "I_STATEMENT_PACKED_SWITCH", 
+		"I_STATEMENT_SPARSE_SWITCH", "I_SUBANNOTATION", "I_SUPER", "LINE_COMMENT", 
+		"LINE_DIRECTIVE", "LOCALS_DIRECTIVE", "LOCAL_DIRECTIVE", "LONG_LITERAL", 
+		"MEMBER_NAME", "METHOD_DIRECTIVE", "NEGATIVE_INTEGER_LITERAL", "NULL_LITERAL", 
+		"OPEN_BRACE", "OPEN_PAREN", "PACKED_SWITCH_DIRECTIVE", "PARAMETER_DIRECTIVE", 
+		"PARAM_LIST_OR_ID_PRIMITIVE_TYPE", "POSITIVE_INTEGER_LITERAL", "PRIMITIVE_TYPE", 
+		"PROLOGUE_DIRECTIVE", "REGISTER", "REGISTERS_DIRECTIVE", "RESTART_LOCAL_DIRECTIVE", 
+		"SHORT_LITERAL", "SIMPLE_NAME", "SOURCE_DIRECTIVE", "SPARSE_SWITCH_DIRECTIVE", 
+		"STRING_LITERAL", "SUBANNOTATION_DIRECTIVE", "SUPER_DIRECTIVE", "VERIFICATION_ERROR_TYPE", 
 		"VOID_TYPE", "VTABLE_INDEX", "WHITE_SPACE"
 	};
 	public static final int EOF=-1;
@@ -321,7 +321,7 @@
 	}
 
 	@Override public String[] getTokenNames() { return smaliTreeWalker.tokenNames; }
-	@Override public String getGrammarFileName() { return "/ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g"; }
+	@Override public String getGrammarFileName() { return "smaliTreeWalker.g"; }
 
 
 	  public String classType;
@@ -334,8 +334,8 @@
 	      this.dexBuilder = dexBuilder;
 	  }
 
-	  public void setApiLevel(int apiLevel, boolean experimental) {
-	      this.opcodes = new Opcodes(apiLevel, experimental);
+	  public void setApiLevel(int apiLevel) {
+	      this.opcodes = Opcodes.forApi(apiLevel);
 	      this.apiLevel = apiLevel;
 	  }
 
@@ -408,7 +408,7 @@
 
 
 	// $ANTLR start "smali_file"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:160:1: smali_file returns [ClassDef classDef] : ^( I_CLASS_DEF header methods fields annotations ) ;
+	// smaliTreeWalker.g:160:1: smali_file returns [ClassDef classDef] : ^( I_CLASS_DEF header methods fields annotations ) ;
 	public final ClassDef smali_file() throws RecognitionException {
 		ClassDef classDef = null;
 
@@ -419,11 +419,11 @@
 		List<BuilderMethod> methods4 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:161:3: ( ^( I_CLASS_DEF header methods fields annotations ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:161:5: ^( I_CLASS_DEF header methods fields annotations )
+			// smaliTreeWalker.g:161:3: ( ^( I_CLASS_DEF header methods fields annotations ) )
+			// smaliTreeWalker.g:161:5: ^( I_CLASS_DEF header methods fields annotations )
 			{
-			match(input,I_CLASS_DEF,FOLLOW_I_CLASS_DEF_in_smali_file52);
-			match(input, Token.DOWN, null);
+			match(input,I_CLASS_DEF,FOLLOW_I_CLASS_DEF_in_smali_file52); 
+			match(input, Token.DOWN, null); 
 			pushFollow(FOLLOW_header_in_smali_file54);
 			header1=header();
 			state._fsp--;
@@ -440,12 +440,12 @@
 			annotations2=annotations();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			    classDef = dexBuilder.internClassDef((header1!=null?((smaliTreeWalker.header_return)header1).classType:null), (header1!=null?((smaliTreeWalker.header_return)header1).accessFlags:0), (header1!=null?((smaliTreeWalker.header_return)header1).superType:null),
 			            (header1!=null?((smaliTreeWalker.header_return)header1).implementsList:null), (header1!=null?((smaliTreeWalker.header_return)header1).sourceSpec:null), annotations2, fields3, methods4);
-			
+			  
 			}
 
 		}
@@ -455,7 +455,7 @@
 			      ex.printStackTrace(System.err);
 			    }
 			    reportError(new SemanticException(input, ex));
-			
+			  
 		}
 
 		finally {
@@ -476,7 +476,7 @@
 
 
 	// $ANTLR start "header"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:174:1: header returns [String classType, int accessFlags, String superType, List<String> implementsList, String sourceSpec] : class_spec ( super_spec )? implements_list source_spec ;
+	// smaliTreeWalker.g:174:1: header returns [String classType, int accessFlags, String superType, List<String> implementsList, String sourceSpec] : class_spec ( super_spec )? implements_list source_spec ;
 	public final smaliTreeWalker.header_return header() throws RecognitionException {
 		smaliTreeWalker.header_return retval = new smaliTreeWalker.header_return();
 		retval.start = input.LT(1);
@@ -487,14 +487,14 @@
 		String source_spec8 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:175:3: ( class_spec ( super_spec )? implements_list source_spec )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:175:3: class_spec ( super_spec )? implements_list source_spec
+			// smaliTreeWalker.g:175:3: ( class_spec ( super_spec )? implements_list source_spec )
+			// smaliTreeWalker.g:175:3: class_spec ( super_spec )? implements_list source_spec
 			{
 			pushFollow(FOLLOW_class_spec_in_header85);
 			class_spec5=class_spec();
 			state._fsp--;
 
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:175:14: ( super_spec )?
+			// smaliTreeWalker.g:175:14: ( super_spec )?
 			int alt1=2;
 			int LA1_0 = input.LA(1);
 			if ( (LA1_0==I_SUPER) ) {
@@ -502,7 +502,7 @@
 			}
 			switch (alt1) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:175:14: super_spec
+					// smaliTreeWalker.g:175:14: super_spec
 					{
 					pushFollow(FOLLOW_super_spec_in_header87);
 					super_spec6=super_spec();
@@ -528,7 +528,7 @@
 			    retval.superType = super_spec6;
 			    retval.implementsList = implements_list7;
 			    retval.sourceSpec = source_spec8;
-			
+			  
 			}
 
 		}
@@ -551,7 +551,7 @@
 
 
 	// $ANTLR start "class_spec"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:186:1: class_spec returns [String type, int accessFlags] : CLASS_DESCRIPTOR access_list ;
+	// smaliTreeWalker.g:186:1: class_spec returns [String type, int accessFlags] : CLASS_DESCRIPTOR access_list ;
 	public final smaliTreeWalker.class_spec_return class_spec() throws RecognitionException {
 		smaliTreeWalker.class_spec_return retval = new smaliTreeWalker.class_spec_return();
 		retval.start = input.LT(1);
@@ -560,10 +560,10 @@
 		int access_list10 =0;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:187:3: ( CLASS_DESCRIPTOR access_list )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:187:5: CLASS_DESCRIPTOR access_list
+			// smaliTreeWalker.g:187:3: ( CLASS_DESCRIPTOR access_list )
+			// smaliTreeWalker.g:187:5: CLASS_DESCRIPTOR access_list
 			{
-			CLASS_DESCRIPTOR9=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_class_spec110);
+			CLASS_DESCRIPTOR9=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_class_spec110); 
 			pushFollow(FOLLOW_access_list_in_class_spec112);
 			access_list10=access_list();
 			state._fsp--;
@@ -571,7 +571,7 @@
 
 			    retval.type = (CLASS_DESCRIPTOR9!=null?CLASS_DESCRIPTOR9.getText():null);
 			    retval.accessFlags = access_list10;
-			
+			  
 			}
 
 		}
@@ -589,7 +589,7 @@
 
 
 	// $ANTLR start "super_spec"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:193:1: super_spec returns [String type] : ^( I_SUPER CLASS_DESCRIPTOR ) ;
+	// smaliTreeWalker.g:193:1: super_spec returns [String type] : ^( I_SUPER CLASS_DESCRIPTOR ) ;
 	public final String super_spec() throws RecognitionException {
 		String type = null;
 
@@ -597,17 +597,17 @@
 		CommonTree CLASS_DESCRIPTOR11=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:194:3: ( ^( I_SUPER CLASS_DESCRIPTOR ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:194:5: ^( I_SUPER CLASS_DESCRIPTOR )
+			// smaliTreeWalker.g:194:3: ( ^( I_SUPER CLASS_DESCRIPTOR ) )
+			// smaliTreeWalker.g:194:5: ^( I_SUPER CLASS_DESCRIPTOR )
 			{
-			match(input,I_SUPER,FOLLOW_I_SUPER_in_super_spec130);
-			match(input, Token.DOWN, null);
-			CLASS_DESCRIPTOR11=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_super_spec132);
-			match(input, Token.UP, null);
+			match(input,I_SUPER,FOLLOW_I_SUPER_in_super_spec130); 
+			match(input, Token.DOWN, null); 
+			CLASS_DESCRIPTOR11=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_super_spec132); 
+			match(input, Token.UP, null); 
 
 
 			    type = (CLASS_DESCRIPTOR11!=null?CLASS_DESCRIPTOR11.getText():null);
-			
+			  
 			}
 
 		}
@@ -625,7 +625,7 @@
 
 
 	// $ANTLR start "implements_spec"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:200:1: implements_spec returns [String type] : ^( I_IMPLEMENTS CLASS_DESCRIPTOR ) ;
+	// smaliTreeWalker.g:200:1: implements_spec returns [String type] : ^( I_IMPLEMENTS CLASS_DESCRIPTOR ) ;
 	public final String implements_spec() throws RecognitionException {
 		String type = null;
 
@@ -633,17 +633,17 @@
 		CommonTree CLASS_DESCRIPTOR12=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:201:3: ( ^( I_IMPLEMENTS CLASS_DESCRIPTOR ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:201:5: ^( I_IMPLEMENTS CLASS_DESCRIPTOR )
+			// smaliTreeWalker.g:201:3: ( ^( I_IMPLEMENTS CLASS_DESCRIPTOR ) )
+			// smaliTreeWalker.g:201:5: ^( I_IMPLEMENTS CLASS_DESCRIPTOR )
 			{
-			match(input,I_IMPLEMENTS,FOLLOW_I_IMPLEMENTS_in_implements_spec152);
-			match(input, Token.DOWN, null);
-			CLASS_DESCRIPTOR12=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_implements_spec154);
-			match(input, Token.UP, null);
+			match(input,I_IMPLEMENTS,FOLLOW_I_IMPLEMENTS_in_implements_spec152); 
+			match(input, Token.DOWN, null); 
+			CLASS_DESCRIPTOR12=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_implements_spec154); 
+			match(input, Token.UP, null); 
 
 
 			    type = (CLASS_DESCRIPTOR12!=null?CLASS_DESCRIPTOR12.getText():null);
-			
+			  
 			}
 
 		}
@@ -661,20 +661,20 @@
 
 
 	// $ANTLR start "implements_list"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:206:1: implements_list returns [List<String> implementsList] : ( implements_spec )* ;
+	// smaliTreeWalker.g:206:1: implements_list returns [List<String> implementsList] : ( implements_spec )* ;
 	public final List<String> implements_list() throws RecognitionException {
 		List<String> implementsList = null;
 
 
 		String implements_spec13 =null;
 
-		 List<String> typeList;
+		 List<String> typeList; 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:208:3: ( ( implements_spec )* )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:208:5: ( implements_spec )*
+			// smaliTreeWalker.g:208:3: ( ( implements_spec )* )
+			// smaliTreeWalker.g:208:5: ( implements_spec )*
 			{
 			typeList = Lists.newArrayList();
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:209:5: ( implements_spec )*
+			// smaliTreeWalker.g:209:5: ( implements_spec )*
 			loop2:
 			while (true) {
 				int alt2=2;
@@ -685,7 +685,7 @@
 
 				switch (alt2) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:209:6: implements_spec
+					// smaliTreeWalker.g:209:6: implements_spec
 					{
 					pushFollow(FOLLOW_implements_spec_in_implements_list184);
 					implements_spec13=implements_spec();
@@ -706,7 +706,7 @@
 			    } else {
 			      implementsList = null;
 			    }
-			
+			  
 			}
 
 		}
@@ -724,7 +724,7 @@
 
 
 	// $ANTLR start "source_spec"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:218:1: source_spec returns [String source] : ( ^( I_SOURCE string_literal ) |);
+	// smaliTreeWalker.g:218:1: source_spec returns [String source] : ( ^( I_SOURCE string_literal ) |);
 	public final String source_spec() throws RecognitionException {
 		String source = null;
 
@@ -732,7 +732,7 @@
 		String string_literal14 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:219:3: ( ^( I_SOURCE string_literal ) |)
+			// smaliTreeWalker.g:219:3: ( ^( I_SOURCE string_literal ) |)
 			int alt3=2;
 			int LA3_0 = input.LA(1);
 			if ( (LA3_0==I_SOURCE) ) {
@@ -750,22 +750,22 @@
 
 			switch (alt3) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:219:5: ^( I_SOURCE string_literal )
+					// smaliTreeWalker.g:219:5: ^( I_SOURCE string_literal )
 					{
 					source = null;
-					match(input,I_SOURCE,FOLLOW_I_SOURCE_in_source_spec213);
-					match(input, Token.DOWN, null);
+					match(input,I_SOURCE,FOLLOW_I_SOURCE_in_source_spec213); 
+					match(input, Token.DOWN, null); 
 					pushFollow(FOLLOW_string_literal_in_source_spec215);
 					string_literal14=string_literal();
 					state._fsp--;
 
 					source = string_literal14;
-					match(input, Token.UP, null);
+					match(input, Token.UP, null); 
 
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:221:16:
+					// smaliTreeWalker.g:221:16: 
 					{
 					}
 					break;
@@ -786,7 +786,7 @@
 
 
 	// $ANTLR start "access_list"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:223:1: access_list returns [int value] : ^( I_ACCESS_LIST ( ACCESS_SPEC )* ) ;
+	// smaliTreeWalker.g:223:1: access_list returns [int value] : ^( I_ACCESS_LIST ( ACCESS_SPEC )* ) ;
 	public final int access_list() throws RecognitionException {
 		int value = 0;
 
@@ -795,15 +795,15 @@
 
 
 		    value = 0;
-		
+		  
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:228:3: ( ^( I_ACCESS_LIST ( ACCESS_SPEC )* ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:228:5: ^( I_ACCESS_LIST ( ACCESS_SPEC )* )
+			// smaliTreeWalker.g:228:3: ( ^( I_ACCESS_LIST ( ACCESS_SPEC )* ) )
+			// smaliTreeWalker.g:228:5: ^( I_ACCESS_LIST ( ACCESS_SPEC )* )
 			{
-			match(input,I_ACCESS_LIST,FOLLOW_I_ACCESS_LIST_in_access_list248);
+			match(input,I_ACCESS_LIST,FOLLOW_I_ACCESS_LIST_in_access_list248); 
 			if ( input.LA(1)==Token.DOWN ) {
-				match(input, Token.DOWN, null);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:229:7: ( ACCESS_SPEC )*
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:229:7: ( ACCESS_SPEC )*
 				loop4:
 				while (true) {
 					int alt4=2;
@@ -814,12 +814,12 @@
 
 					switch (alt4) {
 					case 1 :
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:230:9: ACCESS_SPEC
+						// smaliTreeWalker.g:230:9: ACCESS_SPEC
 						{
-						ACCESS_SPEC15=(CommonTree)match(input,ACCESS_SPEC,FOLLOW_ACCESS_SPEC_in_access_list266);
+						ACCESS_SPEC15=(CommonTree)match(input,ACCESS_SPEC,FOLLOW_ACCESS_SPEC_in_access_list266); 
 
 						          value |= AccessFlags.getAccessFlag(ACCESS_SPEC15.getText()).getValue();
-						
+						        
 						}
 						break;
 
@@ -828,7 +828,7 @@
 					}
 				}
 
-				match(input, Token.UP, null);
+				match(input, Token.UP, null); 
 			}
 
 			}
@@ -848,7 +848,7 @@
 
 
 	// $ANTLR start "fields"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:237:1: fields returns [List<BuilderField> fields] : ^( I_FIELDS ( field )* ) ;
+	// smaliTreeWalker.g:237:1: fields returns [List<BuilderField> fields] : ^( I_FIELDS ( field )* ) ;
 	public final List<BuilderField> fields() throws RecognitionException {
 		List<BuilderField> fields = null;
 
@@ -857,13 +857,13 @@
 
 		fields = Lists.newArrayList();
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:239:3: ( ^( I_FIELDS ( field )* ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:239:5: ^( I_FIELDS ( field )* )
+			// smaliTreeWalker.g:239:3: ( ^( I_FIELDS ( field )* ) )
+			// smaliTreeWalker.g:239:5: ^( I_FIELDS ( field )* )
 			{
-			match(input,I_FIELDS,FOLLOW_I_FIELDS_in_fields308);
+			match(input,I_FIELDS,FOLLOW_I_FIELDS_in_fields308); 
 			if ( input.LA(1)==Token.DOWN ) {
-				match(input, Token.DOWN, null);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:240:7: ( field )*
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:240:7: ( field )*
 				loop5:
 				while (true) {
 					int alt5=2;
@@ -874,7 +874,7 @@
 
 					switch (alt5) {
 					case 1 :
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:240:8: field
+						// smaliTreeWalker.g:240:8: field
 						{
 						pushFollow(FOLLOW_field_in_fields317);
 						field16=field();
@@ -882,7 +882,7 @@
 
 
 						        fields.add(field16);
-						
+						      
 						}
 						break;
 
@@ -891,7 +891,7 @@
 					}
 				}
 
-				match(input, Token.UP, null);
+				match(input, Token.UP, null); 
 			}
 
 			}
@@ -911,7 +911,7 @@
 
 
 	// $ANTLR start "methods"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:245:1: methods returns [List<BuilderMethod> methods] : ^( I_METHODS ( method )* ) ;
+	// smaliTreeWalker.g:245:1: methods returns [List<BuilderMethod> methods] : ^( I_METHODS ( method )* ) ;
 	public final List<BuilderMethod> methods() throws RecognitionException {
 		List<BuilderMethod> methods = null;
 
@@ -920,13 +920,13 @@
 
 		methods = Lists.newArrayList();
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:247:3: ( ^( I_METHODS ( method )* ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:247:5: ^( I_METHODS ( method )* )
+			// smaliTreeWalker.g:247:3: ( ^( I_METHODS ( method )* ) )
+			// smaliTreeWalker.g:247:5: ^( I_METHODS ( method )* )
 			{
-			match(input,I_METHODS,FOLLOW_I_METHODS_in_methods349);
+			match(input,I_METHODS,FOLLOW_I_METHODS_in_methods349); 
 			if ( input.LA(1)==Token.DOWN ) {
-				match(input, Token.DOWN, null);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:248:7: ( method )*
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:248:7: ( method )*
 				loop6:
 				while (true) {
 					int alt6=2;
@@ -937,7 +937,7 @@
 
 					switch (alt6) {
 					case 1 :
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:248:8: method
+						// smaliTreeWalker.g:248:8: method
 						{
 						pushFollow(FOLLOW_method_in_methods358);
 						method17=method();
@@ -945,7 +945,7 @@
 
 
 						        methods.add(method17);
-						
+						      
 						}
 						break;
 
@@ -954,7 +954,7 @@
 					}
 				}
 
-				match(input, Token.UP, null);
+				match(input, Token.UP, null); 
 			}
 
 			}
@@ -974,7 +974,7 @@
 
 
 	// $ANTLR start "field"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:253:1: field returns [BuilderField field] : ^( I_FIELD SIMPLE_NAME access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) field_initial_value ( annotations )? ) ;
+	// smaliTreeWalker.g:253:1: field returns [BuilderField field] : ^( I_FIELD SIMPLE_NAME access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) field_initial_value ( annotations )? ) ;
 	public final BuilderField field() throws RecognitionException {
 		BuilderField field = null;
 
@@ -986,29 +986,29 @@
 		Set<Annotation> annotations22 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:254:3: ( ^( I_FIELD SIMPLE_NAME access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) field_initial_value ( annotations )? ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:254:4: ^( I_FIELD SIMPLE_NAME access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) field_initial_value ( annotations )? )
+			// smaliTreeWalker.g:254:3: ( ^( I_FIELD SIMPLE_NAME access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) field_initial_value ( annotations )? ) )
+			// smaliTreeWalker.g:254:4: ^( I_FIELD SIMPLE_NAME access_list ^( I_FIELD_TYPE nonvoid_type_descriptor ) field_initial_value ( annotations )? )
 			{
-			match(input,I_FIELD,FOLLOW_I_FIELD_in_field383);
-			match(input, Token.DOWN, null);
-			SIMPLE_NAME20=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_field385);
+			match(input,I_FIELD,FOLLOW_I_FIELD_in_field383); 
+			match(input, Token.DOWN, null); 
+			SIMPLE_NAME20=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_field385); 
 			pushFollow(FOLLOW_access_list_in_field387);
 			access_list18=access_list();
 			state._fsp--;
 
-			match(input,I_FIELD_TYPE,FOLLOW_I_FIELD_TYPE_in_field390);
-			match(input, Token.DOWN, null);
+			match(input,I_FIELD_TYPE,FOLLOW_I_FIELD_TYPE_in_field390); 
+			match(input, Token.DOWN, null); 
 			pushFollow(FOLLOW_nonvoid_type_descriptor_in_field392);
 			nonvoid_type_descriptor21=nonvoid_type_descriptor();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 			pushFollow(FOLLOW_field_initial_value_in_field395);
 			field_initial_value19=field_initial_value();
 			state._fsp--;
 
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:254:98: ( annotations )?
+			// smaliTreeWalker.g:254:98: ( annotations )?
 			int alt7=2;
 			int LA7_0 = input.LA(1);
 			if ( (LA7_0==I_ANNOTATIONS) ) {
@@ -1016,7 +1016,7 @@
 			}
 			switch (alt7) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:254:98: annotations
+					// smaliTreeWalker.g:254:98: annotations
 					{
 					pushFollow(FOLLOW_annotations_in_field397);
 					annotations22=annotations();
@@ -1027,7 +1027,7 @@
 
 			}
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			    int accessFlags = access_list18;
@@ -1039,7 +1039,7 @@
 
 			    field = dexBuilder.internField(classType, (SIMPLE_NAME20!=null?SIMPLE_NAME20.getText():null), (nonvoid_type_descriptor21!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor21).type:null), access_list18,
 			            field_initial_value19, annotations22);
-			
+			  
 			}
 
 		}
@@ -1057,7 +1057,7 @@
 
 
 	// $ANTLR start "field_initial_value"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:268:1: field_initial_value returns [EncodedValue encodedValue] : ( ^( I_FIELD_INITIAL_VALUE literal ) |);
+	// smaliTreeWalker.g:268:1: field_initial_value returns [EncodedValue encodedValue] : ( ^( I_FIELD_INITIAL_VALUE literal ) |);
 	public final EncodedValue field_initial_value() throws RecognitionException {
 		EncodedValue encodedValue = null;
 
@@ -1065,7 +1065,7 @@
 		EncodedValue literal23 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:269:3: ( ^( I_FIELD_INITIAL_VALUE literal ) |)
+			// smaliTreeWalker.g:269:3: ( ^( I_FIELD_INITIAL_VALUE literal ) |)
 			int alt8=2;
 			int LA8_0 = input.LA(1);
 			if ( (LA8_0==I_FIELD_INITIAL_VALUE) ) {
@@ -1083,21 +1083,21 @@
 
 			switch (alt8) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:269:5: ^( I_FIELD_INITIAL_VALUE literal )
+					// smaliTreeWalker.g:269:5: ^( I_FIELD_INITIAL_VALUE literal )
 					{
-					match(input,I_FIELD_INITIAL_VALUE,FOLLOW_I_FIELD_INITIAL_VALUE_in_field_initial_value418);
-					match(input, Token.DOWN, null);
+					match(input,I_FIELD_INITIAL_VALUE,FOLLOW_I_FIELD_INITIAL_VALUE_in_field_initial_value418); 
+					match(input, Token.DOWN, null); 
 					pushFollow(FOLLOW_literal_in_field_initial_value420);
 					literal23=literal();
 					state._fsp--;
 
-					match(input, Token.UP, null);
+					match(input, Token.UP, null); 
 
 					encodedValue = literal23;
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:270:16:
+					// smaliTreeWalker.g:270:16: 
 					{
 					}
 					break;
@@ -1118,7 +1118,7 @@
 
 
 	// $ANTLR start "literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:272:1: literal returns [EncodedValue encodedValue] : ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | string_literal | bool_literal | NULL_LITERAL | type_descriptor | array_literal | subannotation | field_literal | method_literal | enum_literal );
+	// smaliTreeWalker.g:272:1: literal returns [EncodedValue encodedValue] : ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | string_literal | bool_literal | NULL_LITERAL | type_descriptor | array_literal | subannotation | field_literal | method_literal | enum_literal );
 	public final EncodedValue literal() throws RecognitionException {
 		EncodedValue encodedValue = null;
 
@@ -1140,7 +1140,7 @@
 		FieldReference enum_literal38 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:273:3: ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | string_literal | bool_literal | NULL_LITERAL | type_descriptor | array_literal | subannotation | field_literal | method_literal | enum_literal )
+			// smaliTreeWalker.g:273:3: ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | string_literal | bool_literal | NULL_LITERAL | type_descriptor | array_literal | subannotation | field_literal | method_literal | enum_literal )
 			int alt9=16;
 			switch ( input.LA(1) ) {
 			case INTEGER_LITERAL:
@@ -1233,160 +1233,160 @@
 			}
 			switch (alt9) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:273:5: integer_literal
+					// smaliTreeWalker.g:273:5: integer_literal
 					{
 					pushFollow(FOLLOW_integer_literal_in_literal442);
 					integer_literal24=integer_literal();
 					state._fsp--;
 
-					 encodedValue = new ImmutableIntEncodedValue(integer_literal24);
+					 encodedValue = new ImmutableIntEncodedValue(integer_literal24); 
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:274:5: long_literal
+					// smaliTreeWalker.g:274:5: long_literal
 					{
 					pushFollow(FOLLOW_long_literal_in_literal450);
 					long_literal25=long_literal();
 					state._fsp--;
 
-					 encodedValue = new ImmutableLongEncodedValue(long_literal25);
+					 encodedValue = new ImmutableLongEncodedValue(long_literal25); 
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:275:5: short_literal
+					// smaliTreeWalker.g:275:5: short_literal
 					{
 					pushFollow(FOLLOW_short_literal_in_literal458);
 					short_literal26=short_literal();
 					state._fsp--;
 
-					 encodedValue = new ImmutableShortEncodedValue(short_literal26);
+					 encodedValue = new ImmutableShortEncodedValue(short_literal26); 
 					}
 					break;
 				case 4 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:276:5: byte_literal
+					// smaliTreeWalker.g:276:5: byte_literal
 					{
 					pushFollow(FOLLOW_byte_literal_in_literal466);
 					byte_literal27=byte_literal();
 					state._fsp--;
 
-					 encodedValue = new ImmutableByteEncodedValue(byte_literal27);
+					 encodedValue = new ImmutableByteEncodedValue(byte_literal27); 
 					}
 					break;
 				case 5 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:277:5: float_literal
+					// smaliTreeWalker.g:277:5: float_literal
 					{
 					pushFollow(FOLLOW_float_literal_in_literal474);
 					float_literal28=float_literal();
 					state._fsp--;
 
-					 encodedValue = new ImmutableFloatEncodedValue(float_literal28);
+					 encodedValue = new ImmutableFloatEncodedValue(float_literal28); 
 					}
 					break;
 				case 6 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:278:5: double_literal
+					// smaliTreeWalker.g:278:5: double_literal
 					{
 					pushFollow(FOLLOW_double_literal_in_literal482);
 					double_literal29=double_literal();
 					state._fsp--;
 
-					 encodedValue = new ImmutableDoubleEncodedValue(double_literal29);
+					 encodedValue = new ImmutableDoubleEncodedValue(double_literal29); 
 					}
 					break;
 				case 7 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:279:5: char_literal
+					// smaliTreeWalker.g:279:5: char_literal
 					{
 					pushFollow(FOLLOW_char_literal_in_literal490);
 					char_literal30=char_literal();
 					state._fsp--;
 
-					 encodedValue = new ImmutableCharEncodedValue(char_literal30);
+					 encodedValue = new ImmutableCharEncodedValue(char_literal30); 
 					}
 					break;
 				case 8 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:280:5: string_literal
+					// smaliTreeWalker.g:280:5: string_literal
 					{
 					pushFollow(FOLLOW_string_literal_in_literal498);
 					string_literal31=string_literal();
 					state._fsp--;
 
-					 encodedValue = new ImmutableStringEncodedValue(string_literal31);
+					 encodedValue = new ImmutableStringEncodedValue(string_literal31); 
 					}
 					break;
 				case 9 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:281:5: bool_literal
+					// smaliTreeWalker.g:281:5: bool_literal
 					{
 					pushFollow(FOLLOW_bool_literal_in_literal506);
 					bool_literal32=bool_literal();
 					state._fsp--;
 
-					 encodedValue = ImmutableBooleanEncodedValue.forBoolean(bool_literal32);
+					 encodedValue = ImmutableBooleanEncodedValue.forBoolean(bool_literal32); 
 					}
 					break;
 				case 10 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:282:5: NULL_LITERAL
+					// smaliTreeWalker.g:282:5: NULL_LITERAL
 					{
-					match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_literal514);
-					 encodedValue = ImmutableNullEncodedValue.INSTANCE;
+					match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_literal514); 
+					 encodedValue = ImmutableNullEncodedValue.INSTANCE; 
 					}
 					break;
 				case 11 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:283:5: type_descriptor
+					// smaliTreeWalker.g:283:5: type_descriptor
 					{
 					pushFollow(FOLLOW_type_descriptor_in_literal522);
 					type_descriptor33=type_descriptor();
 					state._fsp--;
 
-					 encodedValue = new ImmutableTypeEncodedValue(type_descriptor33);
+					 encodedValue = new ImmutableTypeEncodedValue(type_descriptor33); 
 					}
 					break;
 				case 12 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:284:5: array_literal
+					// smaliTreeWalker.g:284:5: array_literal
 					{
 					pushFollow(FOLLOW_array_literal_in_literal530);
 					array_literal34=array_literal();
 					state._fsp--;
 
-					 encodedValue = new ImmutableArrayEncodedValue(array_literal34);
+					 encodedValue = new ImmutableArrayEncodedValue(array_literal34); 
 					}
 					break;
 				case 13 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:285:5: subannotation
+					// smaliTreeWalker.g:285:5: subannotation
 					{
 					pushFollow(FOLLOW_subannotation_in_literal538);
 					subannotation35=subannotation();
 					state._fsp--;
 
-					 encodedValue = new ImmutableAnnotationEncodedValue((subannotation35!=null?((smaliTreeWalker.subannotation_return)subannotation35).annotationType:null), (subannotation35!=null?((smaliTreeWalker.subannotation_return)subannotation35).elements:null));
+					 encodedValue = new ImmutableAnnotationEncodedValue((subannotation35!=null?((smaliTreeWalker.subannotation_return)subannotation35).annotationType:null), (subannotation35!=null?((smaliTreeWalker.subannotation_return)subannotation35).elements:null)); 
 					}
 					break;
 				case 14 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:286:5: field_literal
+					// smaliTreeWalker.g:286:5: field_literal
 					{
 					pushFollow(FOLLOW_field_literal_in_literal546);
 					field_literal36=field_literal();
 					state._fsp--;
 
-					 encodedValue = new ImmutableFieldEncodedValue(field_literal36);
+					 encodedValue = new ImmutableFieldEncodedValue(field_literal36); 
 					}
 					break;
 				case 15 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:287:5: method_literal
+					// smaliTreeWalker.g:287:5: method_literal
 					{
 					pushFollow(FOLLOW_method_literal_in_literal554);
 					method_literal37=method_literal();
 					state._fsp--;
 
-					 encodedValue = new ImmutableMethodEncodedValue(method_literal37);
+					 encodedValue = new ImmutableMethodEncodedValue(method_literal37); 
 					}
 					break;
 				case 16 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:288:5: enum_literal
+					// smaliTreeWalker.g:288:5: enum_literal
 					{
 					pushFollow(FOLLOW_enum_literal_in_literal562);
 					enum_literal38=enum_literal();
 					state._fsp--;
 
-					 encodedValue = new ImmutableEnumEncodedValue(enum_literal38);
+					 encodedValue = new ImmutableEnumEncodedValue(enum_literal38); 
 					}
 					break;
 
@@ -1406,7 +1406,7 @@
 
 
 	// $ANTLR start "fixed_64bit_literal_number"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:291:1: fixed_64bit_literal_number returns [Number value] : ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | bool_literal );
+	// smaliTreeWalker.g:291:1: fixed_64bit_literal_number returns [Number value] : ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | bool_literal );
 	public final Number fixed_64bit_literal_number() throws RecognitionException {
 		Number value = null;
 
@@ -1421,7 +1421,7 @@
 		boolean bool_literal46 =false;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:292:3: ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | bool_literal )
+			// smaliTreeWalker.g:292:3: ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | bool_literal )
 			int alt10=8;
 			switch ( input.LA(1) ) {
 			case INTEGER_LITERAL:
@@ -1471,83 +1471,83 @@
 			}
 			switch (alt10) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:292:5: integer_literal
+					// smaliTreeWalker.g:292:5: integer_literal
 					{
 					pushFollow(FOLLOW_integer_literal_in_fixed_64bit_literal_number578);
 					integer_literal39=integer_literal();
 					state._fsp--;
 
-					 value = integer_literal39;
+					 value = integer_literal39; 
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:293:5: long_literal
+					// smaliTreeWalker.g:293:5: long_literal
 					{
 					pushFollow(FOLLOW_long_literal_in_fixed_64bit_literal_number586);
 					long_literal40=long_literal();
 					state._fsp--;
 
-					 value = long_literal40;
+					 value = long_literal40; 
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:294:5: short_literal
+					// smaliTreeWalker.g:294:5: short_literal
 					{
 					pushFollow(FOLLOW_short_literal_in_fixed_64bit_literal_number594);
 					short_literal41=short_literal();
 					state._fsp--;
 
-					 value = short_literal41;
+					 value = short_literal41; 
 					}
 					break;
 				case 4 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:295:5: byte_literal
+					// smaliTreeWalker.g:295:5: byte_literal
 					{
 					pushFollow(FOLLOW_byte_literal_in_fixed_64bit_literal_number602);
 					byte_literal42=byte_literal();
 					state._fsp--;
 
-					 value = byte_literal42;
+					 value = byte_literal42; 
 					}
 					break;
 				case 5 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:296:5: float_literal
+					// smaliTreeWalker.g:296:5: float_literal
 					{
 					pushFollow(FOLLOW_float_literal_in_fixed_64bit_literal_number610);
 					float_literal43=float_literal();
 					state._fsp--;
 
-					 value = Float.floatToRawIntBits(float_literal43);
+					 value = Float.floatToRawIntBits(float_literal43); 
 					}
 					break;
 				case 6 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:297:5: double_literal
+					// smaliTreeWalker.g:297:5: double_literal
 					{
 					pushFollow(FOLLOW_double_literal_in_fixed_64bit_literal_number618);
 					double_literal44=double_literal();
 					state._fsp--;
 
-					 value = Double.doubleToRawLongBits(double_literal44);
+					 value = Double.doubleToRawLongBits(double_literal44); 
 					}
 					break;
 				case 7 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:298:5: char_literal
+					// smaliTreeWalker.g:298:5: char_literal
 					{
 					pushFollow(FOLLOW_char_literal_in_fixed_64bit_literal_number626);
 					char_literal45=char_literal();
 					state._fsp--;
 
-					 value = (int)char_literal45;
+					 value = (int)char_literal45; 
 					}
 					break;
 				case 8 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:299:5: bool_literal
+					// smaliTreeWalker.g:299:5: bool_literal
 					{
 					pushFollow(FOLLOW_bool_literal_in_fixed_64bit_literal_number634);
 					bool_literal46=bool_literal();
 					state._fsp--;
 
-					 value = bool_literal46?1:0;
+					 value = bool_literal46?1:0; 
 					}
 					break;
 
@@ -1567,7 +1567,7 @@
 
 
 	// $ANTLR start "fixed_64bit_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:301:1: fixed_64bit_literal returns [long value] : ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | bool_literal );
+	// smaliTreeWalker.g:301:1: fixed_64bit_literal returns [long value] : ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | bool_literal );
 	public final long fixed_64bit_literal() throws RecognitionException {
 		long value = 0;
 
@@ -1582,7 +1582,7 @@
 		boolean bool_literal54 =false;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:302:3: ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | bool_literal )
+			// smaliTreeWalker.g:302:3: ( integer_literal | long_literal | short_literal | byte_literal | float_literal | double_literal | char_literal | bool_literal )
 			int alt11=8;
 			switch ( input.LA(1) ) {
 			case INTEGER_LITERAL:
@@ -1632,83 +1632,83 @@
 			}
 			switch (alt11) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:302:5: integer_literal
+					// smaliTreeWalker.g:302:5: integer_literal
 					{
 					pushFollow(FOLLOW_integer_literal_in_fixed_64bit_literal649);
 					integer_literal47=integer_literal();
 					state._fsp--;
 
-					 value = integer_literal47;
+					 value = integer_literal47; 
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:303:5: long_literal
+					// smaliTreeWalker.g:303:5: long_literal
 					{
 					pushFollow(FOLLOW_long_literal_in_fixed_64bit_literal657);
 					long_literal48=long_literal();
 					state._fsp--;
 
-					 value = long_literal48;
+					 value = long_literal48; 
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:304:5: short_literal
+					// smaliTreeWalker.g:304:5: short_literal
 					{
 					pushFollow(FOLLOW_short_literal_in_fixed_64bit_literal665);
 					short_literal49=short_literal();
 					state._fsp--;
 
-					 value = short_literal49;
+					 value = short_literal49; 
 					}
 					break;
 				case 4 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:305:5: byte_literal
+					// smaliTreeWalker.g:305:5: byte_literal
 					{
 					pushFollow(FOLLOW_byte_literal_in_fixed_64bit_literal673);
 					byte_literal50=byte_literal();
 					state._fsp--;
 
-					 value = byte_literal50;
+					 value = byte_literal50; 
 					}
 					break;
 				case 5 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:306:5: float_literal
+					// smaliTreeWalker.g:306:5: float_literal
 					{
 					pushFollow(FOLLOW_float_literal_in_fixed_64bit_literal681);
 					float_literal51=float_literal();
 					state._fsp--;
 
-					 value = Float.floatToRawIntBits(float_literal51);
+					 value = Float.floatToRawIntBits(float_literal51); 
 					}
 					break;
 				case 6 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:307:5: double_literal
+					// smaliTreeWalker.g:307:5: double_literal
 					{
 					pushFollow(FOLLOW_double_literal_in_fixed_64bit_literal689);
 					double_literal52=double_literal();
 					state._fsp--;
 
-					 value = Double.doubleToRawLongBits(double_literal52);
+					 value = Double.doubleToRawLongBits(double_literal52); 
 					}
 					break;
 				case 7 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:308:5: char_literal
+					// smaliTreeWalker.g:308:5: char_literal
 					{
 					pushFollow(FOLLOW_char_literal_in_fixed_64bit_literal697);
 					char_literal53=char_literal();
 					state._fsp--;
 
-					 value = char_literal53;
+					 value = char_literal53; 
 					}
 					break;
 				case 8 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:309:5: bool_literal
+					// smaliTreeWalker.g:309:5: bool_literal
 					{
 					pushFollow(FOLLOW_bool_literal_in_fixed_64bit_literal705);
 					bool_literal54=bool_literal();
 					state._fsp--;
 
-					 value = bool_literal54?1:0;
+					 value = bool_literal54?1:0; 
 					}
 					break;
 
@@ -1728,7 +1728,7 @@
 
 
 	// $ANTLR start "fixed_32bit_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:313:1: fixed_32bit_literal returns [int value] : ( integer_literal | long_literal | short_literal | byte_literal | float_literal | char_literal | bool_literal );
+	// smaliTreeWalker.g:313:1: fixed_32bit_literal returns [int value] : ( integer_literal | long_literal | short_literal | byte_literal | float_literal | char_literal | bool_literal );
 	public final int fixed_32bit_literal() throws RecognitionException {
 		int value = 0;
 
@@ -1742,7 +1742,7 @@
 		boolean bool_literal61 =false;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:314:3: ( integer_literal | long_literal | short_literal | byte_literal | float_literal | char_literal | bool_literal )
+			// smaliTreeWalker.g:314:3: ( integer_literal | long_literal | short_literal | byte_literal | float_literal | char_literal | bool_literal )
 			int alt12=7;
 			switch ( input.LA(1) ) {
 			case INTEGER_LITERAL:
@@ -1787,73 +1787,73 @@
 			}
 			switch (alt12) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:314:5: integer_literal
+					// smaliTreeWalker.g:314:5: integer_literal
 					{
 					pushFollow(FOLLOW_integer_literal_in_fixed_32bit_literal722);
 					integer_literal55=integer_literal();
 					state._fsp--;
 
-					 value = integer_literal55;
+					 value = integer_literal55; 
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:315:5: long_literal
+					// smaliTreeWalker.g:315:5: long_literal
 					{
 					pushFollow(FOLLOW_long_literal_in_fixed_32bit_literal730);
 					long_literal56=long_literal();
 					state._fsp--;
 
-					 LiteralTools.checkInt(long_literal56); value = (int)long_literal56;
+					 LiteralTools.checkInt(long_literal56); value = (int)long_literal56; 
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:316:5: short_literal
+					// smaliTreeWalker.g:316:5: short_literal
 					{
 					pushFollow(FOLLOW_short_literal_in_fixed_32bit_literal738);
 					short_literal57=short_literal();
 					state._fsp--;
 
-					 value = short_literal57;
+					 value = short_literal57; 
 					}
 					break;
 				case 4 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:317:5: byte_literal
+					// smaliTreeWalker.g:317:5: byte_literal
 					{
 					pushFollow(FOLLOW_byte_literal_in_fixed_32bit_literal746);
 					byte_literal58=byte_literal();
 					state._fsp--;
 
-					 value = byte_literal58;
+					 value = byte_literal58; 
 					}
 					break;
 				case 5 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:318:5: float_literal
+					// smaliTreeWalker.g:318:5: float_literal
 					{
 					pushFollow(FOLLOW_float_literal_in_fixed_32bit_literal754);
 					float_literal59=float_literal();
 					state._fsp--;
 
-					 value = Float.floatToRawIntBits(float_literal59);
+					 value = Float.floatToRawIntBits(float_literal59); 
 					}
 					break;
 				case 6 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:319:5: char_literal
+					// smaliTreeWalker.g:319:5: char_literal
 					{
 					pushFollow(FOLLOW_char_literal_in_fixed_32bit_literal762);
 					char_literal60=char_literal();
 					state._fsp--;
 
-					 value = char_literal60;
+					 value = char_literal60; 
 					}
 					break;
 				case 7 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:320:5: bool_literal
+					// smaliTreeWalker.g:320:5: bool_literal
 					{
 					pushFollow(FOLLOW_bool_literal_in_fixed_32bit_literal770);
 					bool_literal61=bool_literal();
 					state._fsp--;
 
-					 value = bool_literal61?1:0;
+					 value = bool_literal61?1:0; 
 					}
 					break;
 
@@ -1873,7 +1873,7 @@
 
 
 	// $ANTLR start "array_elements"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:322:1: array_elements returns [List<Number> elements] : ^( I_ARRAY_ELEMENTS ( fixed_64bit_literal_number )* ) ;
+	// smaliTreeWalker.g:322:1: array_elements returns [List<Number> elements] : ^( I_ARRAY_ELEMENTS ( fixed_64bit_literal_number )* ) ;
 	public final List<Number> array_elements() throws RecognitionException {
 		List<Number> elements = null;
 
@@ -1881,14 +1881,14 @@
 		Number fixed_64bit_literal_number62 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:323:3: ( ^( I_ARRAY_ELEMENTS ( fixed_64bit_literal_number )* ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:323:5: ^( I_ARRAY_ELEMENTS ( fixed_64bit_literal_number )* )
+			// smaliTreeWalker.g:323:3: ( ^( I_ARRAY_ELEMENTS ( fixed_64bit_literal_number )* ) )
+			// smaliTreeWalker.g:323:5: ^( I_ARRAY_ELEMENTS ( fixed_64bit_literal_number )* )
 			{
 			elements = Lists.newArrayList();
-			match(input,I_ARRAY_ELEMENTS,FOLLOW_I_ARRAY_ELEMENTS_in_array_elements792);
+			match(input,I_ARRAY_ELEMENTS,FOLLOW_I_ARRAY_ELEMENTS_in_array_elements792); 
 			if ( input.LA(1)==Token.DOWN ) {
-				match(input, Token.DOWN, null);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:325:7: ( fixed_64bit_literal_number )*
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:325:7: ( fixed_64bit_literal_number )*
 				loop13:
 				while (true) {
 					int alt13=2;
@@ -1899,7 +1899,7 @@
 
 					switch (alt13) {
 					case 1 :
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:325:8: fixed_64bit_literal_number
+						// smaliTreeWalker.g:325:8: fixed_64bit_literal_number
 						{
 						pushFollow(FOLLOW_fixed_64bit_literal_number_in_array_elements801);
 						fixed_64bit_literal_number62=fixed_64bit_literal_number();
@@ -1907,7 +1907,7 @@
 
 
 						        elements.add(fixed_64bit_literal_number62);
-						
+						      
 						}
 						break;
 
@@ -1916,7 +1916,7 @@
 					}
 				}
 
-				match(input, Token.UP, null);
+				match(input, Token.UP, null); 
 			}
 
 			}
@@ -1936,7 +1936,7 @@
 
 
 	// $ANTLR start "packed_switch_elements"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:330:1: packed_switch_elements returns [List<Label> elements] : ^( I_PACKED_SWITCH_ELEMENTS ( label_ref )* ) ;
+	// smaliTreeWalker.g:330:1: packed_switch_elements returns [List<Label> elements] : ^( I_PACKED_SWITCH_ELEMENTS ( label_ref )* ) ;
 	public final List<Label> packed_switch_elements() throws RecognitionException {
 		List<Label> elements = null;
 
@@ -1945,13 +1945,13 @@
 
 		elements = Lists.newArrayList();
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:332:3: ( ^( I_PACKED_SWITCH_ELEMENTS ( label_ref )* ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:333:5: ^( I_PACKED_SWITCH_ELEMENTS ( label_ref )* )
+			// smaliTreeWalker.g:332:3: ( ^( I_PACKED_SWITCH_ELEMENTS ( label_ref )* ) )
+			// smaliTreeWalker.g:333:5: ^( I_PACKED_SWITCH_ELEMENTS ( label_ref )* )
 			{
-			match(input,I_PACKED_SWITCH_ELEMENTS,FOLLOW_I_PACKED_SWITCH_ELEMENTS_in_packed_switch_elements837);
+			match(input,I_PACKED_SWITCH_ELEMENTS,FOLLOW_I_PACKED_SWITCH_ELEMENTS_in_packed_switch_elements837); 
 			if ( input.LA(1)==Token.DOWN ) {
-				match(input, Token.DOWN, null);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:334:7: ( label_ref )*
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:334:7: ( label_ref )*
 				loop14:
 				while (true) {
 					int alt14=2;
@@ -1962,13 +1962,13 @@
 
 					switch (alt14) {
 					case 1 :
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:334:8: label_ref
+						// smaliTreeWalker.g:334:8: label_ref
 						{
 						pushFollow(FOLLOW_label_ref_in_packed_switch_elements846);
 						label_ref63=label_ref();
 						state._fsp--;
 
-						 elements.add(label_ref63);
+						 elements.add(label_ref63); 
 						}
 						break;
 
@@ -1977,7 +1977,7 @@
 					}
 				}
 
-				match(input, Token.UP, null);
+				match(input, Token.UP, null); 
 			}
 
 			}
@@ -1997,7 +1997,7 @@
 
 
 	// $ANTLR start "sparse_switch_elements"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:337:1: sparse_switch_elements returns [List<SwitchLabelElement> elements] : ^( I_SPARSE_SWITCH_ELEMENTS ( fixed_32bit_literal label_ref )* ) ;
+	// smaliTreeWalker.g:337:1: sparse_switch_elements returns [List<SwitchLabelElement> elements] : ^( I_SPARSE_SWITCH_ELEMENTS ( fixed_32bit_literal label_ref )* ) ;
 	public final List<SwitchLabelElement> sparse_switch_elements() throws RecognitionException {
 		List<SwitchLabelElement> elements = null;
 
@@ -2007,13 +2007,13 @@
 
 		elements = Lists.newArrayList();
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:339:3: ( ^( I_SPARSE_SWITCH_ELEMENTS ( fixed_32bit_literal label_ref )* ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:340:5: ^( I_SPARSE_SWITCH_ELEMENTS ( fixed_32bit_literal label_ref )* )
+			// smaliTreeWalker.g:339:3: ( ^( I_SPARSE_SWITCH_ELEMENTS ( fixed_32bit_literal label_ref )* ) )
+			// smaliTreeWalker.g:340:5: ^( I_SPARSE_SWITCH_ELEMENTS ( fixed_32bit_literal label_ref )* )
 			{
-			match(input,I_SPARSE_SWITCH_ELEMENTS,FOLLOW_I_SPARSE_SWITCH_ELEMENTS_in_sparse_switch_elements881);
+			match(input,I_SPARSE_SWITCH_ELEMENTS,FOLLOW_I_SPARSE_SWITCH_ELEMENTS_in_sparse_switch_elements881); 
 			if ( input.LA(1)==Token.DOWN ) {
-				match(input, Token.DOWN, null);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:341:8: ( fixed_32bit_literal label_ref )*
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:341:8: ( fixed_32bit_literal label_ref )*
 				loop15:
 				while (true) {
 					int alt15=2;
@@ -2024,7 +2024,7 @@
 
 					switch (alt15) {
 					case 1 :
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:341:9: fixed_32bit_literal label_ref
+						// smaliTreeWalker.g:341:9: fixed_32bit_literal label_ref
 						{
 						pushFollow(FOLLOW_fixed_32bit_literal_in_sparse_switch_elements891);
 						fixed_32bit_literal64=fixed_32bit_literal();
@@ -2036,7 +2036,7 @@
 
 
 						         elements.add(new SwitchLabelElement(fixed_32bit_literal64, label_ref65));
-						
+						       
 						}
 						break;
 
@@ -2045,7 +2045,7 @@
 					}
 				}
 
-				match(input, Token.UP, null);
+				match(input, Token.UP, null); 
 			}
 
 			}
@@ -2073,7 +2073,7 @@
 
 
 	// $ANTLR start "method"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:347:1: method returns [BuilderMethod ret] : ^( I_METHOD method_name_and_prototype access_list ( ( registers_directive ) |) ordered_method_items catches parameters[$method_name_and_prototype.parameters] annotations ) ;
+	// smaliTreeWalker.g:347:1: method returns [BuilderMethod ret] : ^( I_METHOD method_name_and_prototype access_list ( ( registers_directive ) |) ordered_method_items catches parameters[$method_name_and_prototype.parameters] annotations ) ;
 	public final BuilderMethod method() throws RecognitionException {
 		method_stack.push(new method_scope());
 		BuilderMethod ret = null;
@@ -2091,13 +2091,13 @@
 		    method_stack.peek().methodParameterRegisters = 0;
 		    int accessFlags = 0;
 		    method_stack.peek().isStatic = false;
-		
+		  
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:362:3: ( ^( I_METHOD method_name_and_prototype access_list ( ( registers_directive ) |) ordered_method_items catches parameters[$method_name_and_prototype.parameters] annotations ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:363:5: ^( I_METHOD method_name_and_prototype access_list ( ( registers_directive ) |) ordered_method_items catches parameters[$method_name_and_prototype.parameters] annotations )
+			// smaliTreeWalker.g:362:3: ( ^( I_METHOD method_name_and_prototype access_list ( ( registers_directive ) |) ordered_method_items catches parameters[$method_name_and_prototype.parameters] annotations ) )
+			// smaliTreeWalker.g:363:5: ^( I_METHOD method_name_and_prototype access_list ( ( registers_directive ) |) ordered_method_items catches parameters[$method_name_and_prototype.parameters] annotations )
 			{
-			I_METHOD70=(CommonTree)match(input,I_METHOD,FOLLOW_I_METHOD_in_method945);
-			match(input, Token.DOWN, null);
+			I_METHOD70=(CommonTree)match(input,I_METHOD,FOLLOW_I_METHOD_in_method945); 
+			match(input, Token.DOWN, null); 
 			pushFollow(FOLLOW_method_name_and_prototype_in_method953);
 			method_name_and_prototype67=method_name_and_prototype();
 			state._fsp--;
@@ -2111,8 +2111,8 @@
 			        method_stack.peek().isStatic = AccessFlags.STATIC.isSet(accessFlags);
 			        method_stack.peek().methodParameterRegisters =
 			                MethodUtil.getParameterRegisterCount((method_name_and_prototype67!=null?((smaliTreeWalker.method_name_and_prototype_return)method_name_and_prototype67).parameters:null), method_stack.peek().isStatic);
-			
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:372:7: ( ( registers_directive ) |)
+			      
+			// smaliTreeWalker.g:372:7: ( ( registers_directive ) |)
 			int alt16=2;
 			int LA16_0 = input.LA(1);
 			if ( (LA16_0==I_LOCALS||LA16_0==I_REGISTERS) ) {
@@ -2130,10 +2130,10 @@
 
 			switch (alt16) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:373:9: ( registers_directive )
+					// smaliTreeWalker.g:373:9: ( registers_directive )
 					{
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:373:9: ( registers_directive )
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:373:10: registers_directive
+					// smaliTreeWalker.g:373:9: ( registers_directive )
+					// smaliTreeWalker.g:373:10: registers_directive
 					{
 					pushFollow(FOLLOW_registers_directive_in_method988);
 					registers_directive68=registers_directive();
@@ -2148,17 +2148,17 @@
 
 					          method_stack.peek().methodBuilder = new MethodImplementationBuilder(method_stack.peek().totalMethodRegisters);
 
-					
+					        
 					}
 
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:386:9:
+					// smaliTreeWalker.g:386:9: 
 					{
 
 					          method_stack.peek().methodBuilder = new MethodImplementationBuilder(0);
-					
+					        
 					}
 					break;
 
@@ -2180,7 +2180,7 @@
 			annotations71=annotations();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			    MethodImplementation methodImplementation = null;
@@ -2253,7 +2253,7 @@
 			            accessFlags,
 			            annotations71,
 			            methodImplementation);
-			
+			  
 			}
 
 		}
@@ -2277,7 +2277,7 @@
 
 
 	// $ANTLR start "method_prototype"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:468:1: method_prototype returns [List<String> parameters, String returnType] : ^( I_METHOD_PROTOTYPE ^( I_METHOD_RETURN_TYPE type_descriptor ) method_type_list ) ;
+	// smaliTreeWalker.g:468:1: method_prototype returns [List<String> parameters, String returnType] : ^( I_METHOD_PROTOTYPE ^( I_METHOD_RETURN_TYPE type_descriptor ) method_type_list ) ;
 	public final smaliTreeWalker.method_prototype_return method_prototype() throws RecognitionException {
 		smaliTreeWalker.method_prototype_return retval = new smaliTreeWalker.method_prototype_return();
 		retval.start = input.LT(1);
@@ -2286,29 +2286,29 @@
 		List<String> method_type_list73 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:469:3: ( ^( I_METHOD_PROTOTYPE ^( I_METHOD_RETURN_TYPE type_descriptor ) method_type_list ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:469:5: ^( I_METHOD_PROTOTYPE ^( I_METHOD_RETURN_TYPE type_descriptor ) method_type_list )
+			// smaliTreeWalker.g:469:3: ( ^( I_METHOD_PROTOTYPE ^( I_METHOD_RETURN_TYPE type_descriptor ) method_type_list ) )
+			// smaliTreeWalker.g:469:5: ^( I_METHOD_PROTOTYPE ^( I_METHOD_RETURN_TYPE type_descriptor ) method_type_list )
 			{
-			match(input,I_METHOD_PROTOTYPE,FOLLOW_I_METHOD_PROTOTYPE_in_method_prototype1094);
-			match(input, Token.DOWN, null);
-			match(input,I_METHOD_RETURN_TYPE,FOLLOW_I_METHOD_RETURN_TYPE_in_method_prototype1097);
-			match(input, Token.DOWN, null);
+			match(input,I_METHOD_PROTOTYPE,FOLLOW_I_METHOD_PROTOTYPE_in_method_prototype1094); 
+			match(input, Token.DOWN, null); 
+			match(input,I_METHOD_RETURN_TYPE,FOLLOW_I_METHOD_RETURN_TYPE_in_method_prototype1097); 
+			match(input, Token.DOWN, null); 
 			pushFollow(FOLLOW_type_descriptor_in_method_prototype1099);
 			type_descriptor72=type_descriptor();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 			pushFollow(FOLLOW_method_type_list_in_method_prototype1102);
 			method_type_list73=method_type_list();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			    retval.returnType = type_descriptor72;
 			    retval.parameters = method_type_list73;
-			
+			  
 			}
 
 		}
@@ -2332,7 +2332,7 @@
 
 
 	// $ANTLR start "method_name_and_prototype"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:475:1: method_name_and_prototype returns [String name, List<SmaliMethodParameter> parameters, String returnType] : SIMPLE_NAME method_prototype ;
+	// smaliTreeWalker.g:475:1: method_name_and_prototype returns [String name, List<SmaliMethodParameter> parameters, String returnType] : SIMPLE_NAME method_prototype ;
 	public final smaliTreeWalker.method_name_and_prototype_return method_name_and_prototype() throws RecognitionException {
 		smaliTreeWalker.method_name_and_prototype_return retval = new smaliTreeWalker.method_name_and_prototype_return();
 		retval.start = input.LT(1);
@@ -2341,10 +2341,10 @@
 		TreeRuleReturnScope method_prototype75 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:476:3: ( SIMPLE_NAME method_prototype )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:476:5: SIMPLE_NAME method_prototype
+			// smaliTreeWalker.g:476:3: ( SIMPLE_NAME method_prototype )
+			// smaliTreeWalker.g:476:5: SIMPLE_NAME method_prototype
 			{
-			SIMPLE_NAME74=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_method_name_and_prototype1120);
+			SIMPLE_NAME74=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_method_name_and_prototype1120); 
 			pushFollow(FOLLOW_method_prototype_in_method_name_and_prototype1122);
 			method_prototype75=method_prototype();
 			state._fsp--;
@@ -2362,7 +2362,7 @@
 			        }
 			    }
 			    retval.returnType = (method_prototype75!=null?((smaliTreeWalker.method_prototype_return)method_prototype75).returnType:null);
-			
+			  
 			}
 
 		}
@@ -2380,7 +2380,7 @@
 
 
 	// $ANTLR start "method_type_list"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:492:1: method_type_list returns [List<String> types] : ( nonvoid_type_descriptor )* ;
+	// smaliTreeWalker.g:492:1: method_type_list returns [List<String> types] : ( nonvoid_type_descriptor )* ;
 	public final List<String> method_type_list() throws RecognitionException {
 		List<String> types = null;
 
@@ -2389,12 +2389,12 @@
 
 
 		    types = Lists.newArrayList();
-		
+		  
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:497:3: ( ( nonvoid_type_descriptor )* )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:497:5: ( nonvoid_type_descriptor )*
+			// smaliTreeWalker.g:497:3: ( ( nonvoid_type_descriptor )* )
+			// smaliTreeWalker.g:497:5: ( nonvoid_type_descriptor )*
 			{
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:497:5: ( nonvoid_type_descriptor )*
+			// smaliTreeWalker.g:497:5: ( nonvoid_type_descriptor )*
 			loop17:
 			while (true) {
 				int alt17=2;
@@ -2405,7 +2405,7 @@
 
 				switch (alt17) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:498:7: nonvoid_type_descriptor
+					// smaliTreeWalker.g:498:7: nonvoid_type_descriptor
 					{
 					pushFollow(FOLLOW_nonvoid_type_descriptor_in_method_type_list1156);
 					nonvoid_type_descriptor76=nonvoid_type_descriptor();
@@ -2413,7 +2413,7 @@
 
 
 					        types.add((nonvoid_type_descriptor76!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor76).type:null));
-					
+					      
 					}
 					break;
 
@@ -2439,7 +2439,7 @@
 
 
 	// $ANTLR start "method_reference"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:505:1: method_reference returns [ImmutableMethodReference methodReference] : ( reference_type_descriptor )? SIMPLE_NAME method_prototype ;
+	// smaliTreeWalker.g:505:1: method_reference returns [ImmutableMethodReference methodReference] : ( reference_type_descriptor )? SIMPLE_NAME method_prototype ;
 	public final ImmutableMethodReference method_reference() throws RecognitionException {
 		ImmutableMethodReference methodReference = null;
 
@@ -2449,10 +2449,10 @@
 		TreeRuleReturnScope method_prototype79 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:506:3: ( ( reference_type_descriptor )? SIMPLE_NAME method_prototype )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:506:5: ( reference_type_descriptor )? SIMPLE_NAME method_prototype
+			// smaliTreeWalker.g:506:3: ( ( reference_type_descriptor )? SIMPLE_NAME method_prototype )
+			// smaliTreeWalker.g:506:5: ( reference_type_descriptor )? SIMPLE_NAME method_prototype
 			{
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:506:5: ( reference_type_descriptor )?
+			// smaliTreeWalker.g:506:5: ( reference_type_descriptor )?
 			int alt18=2;
 			int LA18_0 = input.LA(1);
 			if ( (LA18_0==ARRAY_TYPE_PREFIX||LA18_0==CLASS_DESCRIPTOR) ) {
@@ -2460,7 +2460,7 @@
 			}
 			switch (alt18) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:506:5: reference_type_descriptor
+					// smaliTreeWalker.g:506:5: reference_type_descriptor
 					{
 					pushFollow(FOLLOW_reference_type_descriptor_in_method_reference1185);
 					reference_type_descriptor77=reference_type_descriptor();
@@ -2471,7 +2471,7 @@
 
 			}
 
-			SIMPLE_NAME78=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_method_reference1188);
+			SIMPLE_NAME78=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_method_reference1188); 
 			pushFollow(FOLLOW_method_prototype_in_method_reference1190);
 			method_prototype79=method_prototype();
 			state._fsp--;
@@ -2485,7 +2485,7 @@
 			    }
 			    methodReference = new ImmutableMethodReference(type, (SIMPLE_NAME78!=null?SIMPLE_NAME78.getText():null),
 			             (method_prototype79!=null?((smaliTreeWalker.method_prototype_return)method_prototype79).parameters:null), (method_prototype79!=null?((smaliTreeWalker.method_prototype_return)method_prototype79).returnType:null));
-			
+			  
 			}
 
 		}
@@ -2503,7 +2503,7 @@
 
 
 	// $ANTLR start "field_reference"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:518:1: field_reference returns [ImmutableFieldReference fieldReference] : ( reference_type_descriptor )? SIMPLE_NAME nonvoid_type_descriptor ;
+	// smaliTreeWalker.g:518:1: field_reference returns [ImmutableFieldReference fieldReference] : ( reference_type_descriptor )? SIMPLE_NAME nonvoid_type_descriptor ;
 	public final ImmutableFieldReference field_reference() throws RecognitionException {
 		ImmutableFieldReference fieldReference = null;
 
@@ -2513,10 +2513,10 @@
 		TreeRuleReturnScope nonvoid_type_descriptor82 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:519:3: ( ( reference_type_descriptor )? SIMPLE_NAME nonvoid_type_descriptor )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:519:5: ( reference_type_descriptor )? SIMPLE_NAME nonvoid_type_descriptor
+			// smaliTreeWalker.g:519:3: ( ( reference_type_descriptor )? SIMPLE_NAME nonvoid_type_descriptor )
+			// smaliTreeWalker.g:519:5: ( reference_type_descriptor )? SIMPLE_NAME nonvoid_type_descriptor
 			{
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:519:5: ( reference_type_descriptor )?
+			// smaliTreeWalker.g:519:5: ( reference_type_descriptor )?
 			int alt19=2;
 			int LA19_0 = input.LA(1);
 			if ( (LA19_0==ARRAY_TYPE_PREFIX||LA19_0==CLASS_DESCRIPTOR) ) {
@@ -2524,7 +2524,7 @@
 			}
 			switch (alt19) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:519:5: reference_type_descriptor
+					// smaliTreeWalker.g:519:5: reference_type_descriptor
 					{
 					pushFollow(FOLLOW_reference_type_descriptor_in_field_reference1207);
 					reference_type_descriptor80=reference_type_descriptor();
@@ -2535,7 +2535,7 @@
 
 			}
 
-			SIMPLE_NAME81=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_field_reference1210);
+			SIMPLE_NAME81=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_field_reference1210); 
 			pushFollow(FOLLOW_nonvoid_type_descriptor_in_field_reference1212);
 			nonvoid_type_descriptor82=nonvoid_type_descriptor();
 			state._fsp--;
@@ -2549,7 +2549,7 @@
 			    }
 			    fieldReference = new ImmutableFieldReference(type, (SIMPLE_NAME81!=null?SIMPLE_NAME81.getText():null),
 			            (nonvoid_type_descriptor82!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor82).type:null));
-			
+			  
 			}
 
 		}
@@ -2572,7 +2572,7 @@
 
 
 	// $ANTLR start "registers_directive"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:531:1: registers_directive returns [boolean isLocalsDirective, int registers] : ^( ( I_REGISTERS | I_LOCALS ) short_integral_literal ) ;
+	// smaliTreeWalker.g:531:1: registers_directive returns [boolean isLocalsDirective, int registers] : ^( ( I_REGISTERS | I_LOCALS ) short_integral_literal ) ;
 	public final smaliTreeWalker.registers_directive_return registers_directive() throws RecognitionException {
 		smaliTreeWalker.registers_directive_return retval = new smaliTreeWalker.registers_directive_return();
 		retval.start = input.LT(1);
@@ -2580,11 +2580,11 @@
 		short short_integral_literal83 =0;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:532:3: ( ^( ( I_REGISTERS | I_LOCALS ) short_integral_literal ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:532:5: ^( ( I_REGISTERS | I_LOCALS ) short_integral_literal )
+			// smaliTreeWalker.g:532:3: ( ^( ( I_REGISTERS | I_LOCALS ) short_integral_literal ) )
+			// smaliTreeWalker.g:532:5: ^( ( I_REGISTERS | I_LOCALS ) short_integral_literal )
 			{
 			retval.registers = 0;
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:533:7: ( I_REGISTERS | I_LOCALS )
+			// smaliTreeWalker.g:533:7: ( I_REGISTERS | I_LOCALS )
 			int alt20=2;
 			int LA20_0 = input.LA(1);
 			if ( (LA20_0==I_REGISTERS) ) {
@@ -2602,29 +2602,29 @@
 
 			switch (alt20) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:533:9: I_REGISTERS
+					// smaliTreeWalker.g:533:9: I_REGISTERS
 					{
-					match(input,I_REGISTERS,FOLLOW_I_REGISTERS_in_registers_directive1238);
+					match(input,I_REGISTERS,FOLLOW_I_REGISTERS_in_registers_directive1238); 
 					retval.isLocalsDirective = false;
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:534:9: I_LOCALS
+					// smaliTreeWalker.g:534:9: I_LOCALS
 					{
-					match(input,I_LOCALS,FOLLOW_I_LOCALS_in_registers_directive1250);
+					match(input,I_LOCALS,FOLLOW_I_LOCALS_in_registers_directive1250); 
 					retval.isLocalsDirective = true;
 					}
 					break;
 
 			}
 
-			match(input, Token.DOWN, null);
+			match(input, Token.DOWN, null); 
 			pushFollow(FOLLOW_short_integral_literal_in_registers_directive1268);
 			short_integral_literal83=short_integral_literal();
 			state._fsp--;
 
 			retval.registers = short_integral_literal83 & 0xFFFF;
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 			}
 
@@ -2643,22 +2643,22 @@
 
 
 	// $ANTLR start "label_def"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:539:1: label_def : ^( I_LABEL SIMPLE_NAME ) ;
+	// smaliTreeWalker.g:539:1: label_def : ^( I_LABEL SIMPLE_NAME ) ;
 	public final void label_def() throws RecognitionException {
 		CommonTree SIMPLE_NAME84=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:540:3: ( ^( I_LABEL SIMPLE_NAME ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:540:5: ^( I_LABEL SIMPLE_NAME )
+			// smaliTreeWalker.g:540:3: ( ^( I_LABEL SIMPLE_NAME ) )
+			// smaliTreeWalker.g:540:5: ^( I_LABEL SIMPLE_NAME )
 			{
-			match(input,I_LABEL,FOLLOW_I_LABEL_in_label_def1288);
-			match(input, Token.DOWN, null);
-			SIMPLE_NAME84=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_label_def1290);
-			match(input, Token.UP, null);
+			match(input,I_LABEL,FOLLOW_I_LABEL_in_label_def1288); 
+			match(input, Token.DOWN, null); 
+			SIMPLE_NAME84=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_label_def1290); 
+			match(input, Token.UP, null); 
 
 
 			    method_stack.peek().methodBuilder.addLabel((SIMPLE_NAME84!=null?SIMPLE_NAME84.getText():null));
-			
+			  
 			}
 
 		}
@@ -2675,20 +2675,20 @@
 
 
 	// $ANTLR start "catches"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:545:1: catches returns [List<BuilderTryBlock> tryBlocks] : ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) ;
+	// smaliTreeWalker.g:545:1: catches returns [List<BuilderTryBlock> tryBlocks] : ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) ;
 	public final List<BuilderTryBlock> catches() throws RecognitionException {
 		List<BuilderTryBlock> tryBlocks = null;
 
 
 		tryBlocks = Lists.newArrayList();
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:547:3: ( ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:547:5: ^( I_CATCHES ( catch_directive )* ( catchall_directive )* )
+			// smaliTreeWalker.g:547:3: ( ^( I_CATCHES ( catch_directive )* ( catchall_directive )* ) )
+			// smaliTreeWalker.g:547:5: ^( I_CATCHES ( catch_directive )* ( catchall_directive )* )
 			{
-			match(input,I_CATCHES,FOLLOW_I_CATCHES_in_catches1316);
+			match(input,I_CATCHES,FOLLOW_I_CATCHES_in_catches1316); 
 			if ( input.LA(1)==Token.DOWN ) {
-				match(input, Token.DOWN, null);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:547:17: ( catch_directive )*
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:547:17: ( catch_directive )*
 				loop21:
 				while (true) {
 					int alt21=2;
@@ -2699,7 +2699,7 @@
 
 					switch (alt21) {
 					case 1 :
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:547:17: catch_directive
+						// smaliTreeWalker.g:547:17: catch_directive
 						{
 						pushFollow(FOLLOW_catch_directive_in_catches1318);
 						catch_directive();
@@ -2713,7 +2713,7 @@
 					}
 				}
 
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:547:34: ( catchall_directive )*
+				// smaliTreeWalker.g:547:34: ( catchall_directive )*
 				loop22:
 				while (true) {
 					int alt22=2;
@@ -2724,7 +2724,7 @@
 
 					switch (alt22) {
 					case 1 :
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:547:34: catchall_directive
+						// smaliTreeWalker.g:547:34: catchall_directive
 						{
 						pushFollow(FOLLOW_catchall_directive_in_catches1321);
 						catchall_directive();
@@ -2738,7 +2738,7 @@
 					}
 				}
 
-				match(input, Token.UP, null);
+				match(input, Token.UP, null); 
 			}
 
 			}
@@ -2758,7 +2758,7 @@
 
 
 	// $ANTLR start "catch_directive"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:549:1: catch_directive : ^( I_CATCH nonvoid_type_descriptor from= label_ref to= label_ref using= label_ref ) ;
+	// smaliTreeWalker.g:549:1: catch_directive : ^( I_CATCH nonvoid_type_descriptor from= label_ref to= label_ref using= label_ref ) ;
 	public final void catch_directive() throws RecognitionException {
 		Label from =null;
 		Label to =null;
@@ -2766,11 +2766,11 @@
 		TreeRuleReturnScope nonvoid_type_descriptor85 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:550:3: ( ^( I_CATCH nonvoid_type_descriptor from= label_ref to= label_ref using= label_ref ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:550:5: ^( I_CATCH nonvoid_type_descriptor from= label_ref to= label_ref using= label_ref )
+			// smaliTreeWalker.g:550:3: ( ^( I_CATCH nonvoid_type_descriptor from= label_ref to= label_ref using= label_ref ) )
+			// smaliTreeWalker.g:550:5: ^( I_CATCH nonvoid_type_descriptor from= label_ref to= label_ref using= label_ref )
 			{
-			match(input,I_CATCH,FOLLOW_I_CATCH_in_catch_directive1334);
-			match(input, Token.DOWN, null);
+			match(input,I_CATCH,FOLLOW_I_CATCH_in_catch_directive1334); 
+			match(input, Token.DOWN, null); 
 			pushFollow(FOLLOW_nonvoid_type_descriptor_in_catch_directive1336);
 			nonvoid_type_descriptor85=nonvoid_type_descriptor();
 			state._fsp--;
@@ -2787,12 +2787,12 @@
 			using=label_ref();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			    method_stack.peek().methodBuilder.addCatch(dexBuilder.internTypeReference((nonvoid_type_descriptor85!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor85).type:null)),
 			        from, to, using);
-			
+			  
 			}
 
 		}
@@ -2809,18 +2809,18 @@
 
 
 	// $ANTLR start "catchall_directive"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:556:1: catchall_directive : ^( I_CATCHALL from= label_ref to= label_ref using= label_ref ) ;
+	// smaliTreeWalker.g:556:1: catchall_directive : ^( I_CATCHALL from= label_ref to= label_ref using= label_ref ) ;
 	public final void catchall_directive() throws RecognitionException {
 		Label from =null;
 		Label to =null;
 		Label using =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:557:3: ( ^( I_CATCHALL from= label_ref to= label_ref using= label_ref ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:557:5: ^( I_CATCHALL from= label_ref to= label_ref using= label_ref )
+			// smaliTreeWalker.g:557:3: ( ^( I_CATCHALL from= label_ref to= label_ref using= label_ref ) )
+			// smaliTreeWalker.g:557:5: ^( I_CATCHALL from= label_ref to= label_ref using= label_ref )
 			{
-			match(input,I_CATCHALL,FOLLOW_I_CATCHALL_in_catchall_directive1364);
-			match(input, Token.DOWN, null);
+			match(input,I_CATCHALL,FOLLOW_I_CATCHALL_in_catchall_directive1364); 
+			match(input, Token.DOWN, null); 
 			pushFollow(FOLLOW_label_ref_in_catchall_directive1368);
 			from=label_ref();
 			state._fsp--;
@@ -2833,11 +2833,11 @@
 			using=label_ref();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			    method_stack.peek().methodBuilder.addCatch(from, to, using);
-			
+			  
 			}
 
 		}
@@ -2854,16 +2854,16 @@
 
 
 	// $ANTLR start "parameters"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:562:1: parameters[List<SmaliMethodParameter> parameters] : ^( I_PARAMETERS ( parameter[parameters] )* ) ;
+	// smaliTreeWalker.g:562:1: parameters[List<SmaliMethodParameter> parameters] : ^( I_PARAMETERS ( parameter[parameters] )* ) ;
 	public final void parameters(List<SmaliMethodParameter> parameters) throws RecognitionException {
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:563:3: ( ^( I_PARAMETERS ( parameter[parameters] )* ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:563:5: ^( I_PARAMETERS ( parameter[parameters] )* )
+			// smaliTreeWalker.g:563:3: ( ^( I_PARAMETERS ( parameter[parameters] )* ) )
+			// smaliTreeWalker.g:563:5: ^( I_PARAMETERS ( parameter[parameters] )* )
 			{
-			match(input,I_PARAMETERS,FOLLOW_I_PARAMETERS_in_parameters1393);
+			match(input,I_PARAMETERS,FOLLOW_I_PARAMETERS_in_parameters1393); 
 			if ( input.LA(1)==Token.DOWN ) {
-				match(input, Token.DOWN, null);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:563:20: ( parameter[parameters] )*
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:563:20: ( parameter[parameters] )*
 				loop23:
 				while (true) {
 					int alt23=2;
@@ -2874,7 +2874,7 @@
 
 					switch (alt23) {
 					case 1 :
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:563:21: parameter[parameters]
+						// smaliTreeWalker.g:563:21: parameter[parameters]
 						{
 						pushFollow(FOLLOW_parameter_in_parameters1396);
 						parameter(parameters);
@@ -2888,7 +2888,7 @@
 					}
 				}
 
-				match(input, Token.UP, null);
+				match(input, Token.UP, null); 
 			}
 
 			}
@@ -2907,7 +2907,7 @@
 
 
 	// $ANTLR start "parameter"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:565:1: parameter[List<SmaliMethodParameter> parameters] : ^( I_PARAMETER REGISTER ( string_literal )? annotations ) ;
+	// smaliTreeWalker.g:565:1: parameter[List<SmaliMethodParameter> parameters] : ^( I_PARAMETER REGISTER ( string_literal )? annotations ) ;
 	public final void parameter(List<SmaliMethodParameter> parameters) throws RecognitionException {
 		CommonTree REGISTER86=null;
 		CommonTree I_PARAMETER87=null;
@@ -2915,13 +2915,13 @@
 		Set<Annotation> annotations89 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:566:3: ( ^( I_PARAMETER REGISTER ( string_literal )? annotations ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:566:5: ^( I_PARAMETER REGISTER ( string_literal )? annotations )
+			// smaliTreeWalker.g:566:3: ( ^( I_PARAMETER REGISTER ( string_literal )? annotations ) )
+			// smaliTreeWalker.g:566:5: ^( I_PARAMETER REGISTER ( string_literal )? annotations )
 			{
-			I_PARAMETER87=(CommonTree)match(input,I_PARAMETER,FOLLOW_I_PARAMETER_in_parameter1412);
-			match(input, Token.DOWN, null);
-			REGISTER86=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_parameter1414);
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:566:28: ( string_literal )?
+			I_PARAMETER87=(CommonTree)match(input,I_PARAMETER,FOLLOW_I_PARAMETER_in_parameter1412); 
+			match(input, Token.DOWN, null); 
+			REGISTER86=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_parameter1414); 
+			// smaliTreeWalker.g:566:28: ( string_literal )?
 			int alt24=2;
 			int LA24_0 = input.LA(1);
 			if ( (LA24_0==STRING_LITERAL) ) {
@@ -2929,7 +2929,7 @@
 			}
 			switch (alt24) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:566:28: string_literal
+					// smaliTreeWalker.g:566:28: string_literal
 					{
 					pushFollow(FOLLOW_string_literal_in_parameter1416);
 					string_literal88=string_literal();
@@ -2944,7 +2944,7 @@
 			annotations89=annotations();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			        final int registerNumber = parseRegister_short((REGISTER86!=null?REGISTER86.getText():null));
@@ -2976,7 +2976,7 @@
 			        if (annotations89 != null && annotations89.size() > 0) {
 			            methodParameter.annotations = annotations89;
 			        }
-			
+			    
 			}
 
 		}
@@ -2993,10 +2993,10 @@
 
 
 	// $ANTLR start "debug_directive"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:599:1: debug_directive : ( line | local | end_local | restart_local | prologue | epilogue | source );
+	// smaliTreeWalker.g:599:1: debug_directive : ( line | local | end_local | restart_local | prologue | epilogue | source );
 	public final void debug_directive() throws RecognitionException {
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:600:3: ( line | local | end_local | restart_local | prologue | epilogue | source )
+			// smaliTreeWalker.g:600:3: ( line | local | end_local | restart_local | prologue | epilogue | source )
 			int alt25=7;
 			switch ( input.LA(1) ) {
 			case I_LINE:
@@ -3041,7 +3041,7 @@
 			}
 			switch (alt25) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:600:5: line
+					// smaliTreeWalker.g:600:5: line
 					{
 					pushFollow(FOLLOW_line_in_debug_directive1436);
 					line();
@@ -3050,7 +3050,7 @@
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:601:5: local
+					// smaliTreeWalker.g:601:5: local
 					{
 					pushFollow(FOLLOW_local_in_debug_directive1442);
 					local();
@@ -3059,7 +3059,7 @@
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:602:5: end_local
+					// smaliTreeWalker.g:602:5: end_local
 					{
 					pushFollow(FOLLOW_end_local_in_debug_directive1448);
 					end_local();
@@ -3068,7 +3068,7 @@
 					}
 					break;
 				case 4 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:603:5: restart_local
+					// smaliTreeWalker.g:603:5: restart_local
 					{
 					pushFollow(FOLLOW_restart_local_in_debug_directive1454);
 					restart_local();
@@ -3077,7 +3077,7 @@
 					}
 					break;
 				case 5 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:604:5: prologue
+					// smaliTreeWalker.g:604:5: prologue
 					{
 					pushFollow(FOLLOW_prologue_in_debug_directive1460);
 					prologue();
@@ -3086,7 +3086,7 @@
 					}
 					break;
 				case 6 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:605:5: epilogue
+					// smaliTreeWalker.g:605:5: epilogue
 					{
 					pushFollow(FOLLOW_epilogue_in_debug_directive1466);
 					epilogue();
@@ -3095,7 +3095,7 @@
 					}
 					break;
 				case 7 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:606:5: source
+					// smaliTreeWalker.g:606:5: source
 					{
 					pushFollow(FOLLOW_source_in_debug_directive1472);
 					source();
@@ -3119,25 +3119,25 @@
 
 
 	// $ANTLR start "line"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:608:1: line : ^( I_LINE integral_literal ) ;
+	// smaliTreeWalker.g:608:1: line : ^( I_LINE integral_literal ) ;
 	public final void line() throws RecognitionException {
 		int integral_literal90 =0;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:609:3: ( ^( I_LINE integral_literal ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:609:5: ^( I_LINE integral_literal )
+			// smaliTreeWalker.g:609:3: ( ^( I_LINE integral_literal ) )
+			// smaliTreeWalker.g:609:5: ^( I_LINE integral_literal )
 			{
-			match(input,I_LINE,FOLLOW_I_LINE_in_line1483);
-			match(input, Token.DOWN, null);
+			match(input,I_LINE,FOLLOW_I_LINE_in_line1483); 
+			match(input, Token.DOWN, null); 
 			pushFollow(FOLLOW_integral_literal_in_line1485);
 			integral_literal90=integral_literal();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			        method_stack.peek().methodBuilder.addLineNumber(integral_literal90);
-			
+			    
 			}
 
 		}
@@ -3154,7 +3154,7 @@
 
 
 	// $ANTLR start "local"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:614:1: local : ^( I_LOCAL REGISTER ( ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )? )? ) ;
+	// smaliTreeWalker.g:614:1: local : ^( I_LOCAL REGISTER ( ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )? )? ) ;
 	public final void local() throws RecognitionException {
 		CommonTree REGISTER91=null;
 		String name =null;
@@ -3162,13 +3162,13 @@
 		TreeRuleReturnScope nonvoid_type_descriptor92 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:615:3: ( ^( I_LOCAL REGISTER ( ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )? )? ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:615:5: ^( I_LOCAL REGISTER ( ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )? )? )
+			// smaliTreeWalker.g:615:3: ( ^( I_LOCAL REGISTER ( ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )? )? ) )
+			// smaliTreeWalker.g:615:5: ^( I_LOCAL REGISTER ( ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )? )? )
 			{
-			match(input,I_LOCAL,FOLLOW_I_LOCAL_in_local1503);
-			match(input, Token.DOWN, null);
-			REGISTER91=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_local1505);
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:615:24: ( ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )? )?
+			match(input,I_LOCAL,FOLLOW_I_LOCAL_in_local1503); 
+			match(input, Token.DOWN, null); 
+			REGISTER91=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_local1505); 
+			// smaliTreeWalker.g:615:24: ( ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )? )?
 			int alt29=2;
 			int LA29_0 = input.LA(1);
 			if ( (LA29_0==NULL_LITERAL||LA29_0==STRING_LITERAL) ) {
@@ -3176,9 +3176,9 @@
 			}
 			switch (alt29) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:615:25: ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )?
+					// smaliTreeWalker.g:615:25: ( NULL_LITERAL |name= string_literal ) ( nonvoid_type_descriptor )? (signature= string_literal )?
 					{
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:615:25: ( NULL_LITERAL |name= string_literal )
+					// smaliTreeWalker.g:615:25: ( NULL_LITERAL |name= string_literal )
 					int alt26=2;
 					int LA26_0 = input.LA(1);
 					if ( (LA26_0==NULL_LITERAL) ) {
@@ -3196,13 +3196,13 @@
 
 					switch (alt26) {
 						case 1 :
-							// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:615:26: NULL_LITERAL
+							// smaliTreeWalker.g:615:26: NULL_LITERAL
 							{
-							match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_local1509);
+							match(input,NULL_LITERAL,FOLLOW_NULL_LITERAL_in_local1509); 
 							}
 							break;
 						case 2 :
-							// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:615:41: name= string_literal
+							// smaliTreeWalker.g:615:41: name= string_literal
 							{
 							pushFollow(FOLLOW_string_literal_in_local1515);
 							name=string_literal();
@@ -3213,7 +3213,7 @@
 
 					}
 
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:615:62: ( nonvoid_type_descriptor )?
+					// smaliTreeWalker.g:615:62: ( nonvoid_type_descriptor )?
 					int alt27=2;
 					int LA27_0 = input.LA(1);
 					if ( (LA27_0==ARRAY_TYPE_PREFIX||LA27_0==CLASS_DESCRIPTOR||LA27_0==PRIMITIVE_TYPE) ) {
@@ -3221,7 +3221,7 @@
 					}
 					switch (alt27) {
 						case 1 :
-							// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:615:62: nonvoid_type_descriptor
+							// smaliTreeWalker.g:615:62: nonvoid_type_descriptor
 							{
 							pushFollow(FOLLOW_nonvoid_type_descriptor_in_local1518);
 							nonvoid_type_descriptor92=nonvoid_type_descriptor();
@@ -3232,7 +3232,7 @@
 
 					}
 
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:615:96: (signature= string_literal )?
+					// smaliTreeWalker.g:615:96: (signature= string_literal )?
 					int alt28=2;
 					int LA28_0 = input.LA(1);
 					if ( (LA28_0==STRING_LITERAL) ) {
@@ -3240,7 +3240,7 @@
 					}
 					switch (alt28) {
 						case 1 :
-							// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:615:96: signature= string_literal
+							// smaliTreeWalker.g:615:96: signature= string_literal
 							{
 							pushFollow(FOLLOW_string_literal_in_local1523);
 							signature=string_literal();
@@ -3256,7 +3256,7 @@
 
 			}
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      int registerNumber = parseRegister_short((REGISTER91!=null?REGISTER91.getText():null));
@@ -3264,7 +3264,7 @@
 			              dexBuilder.internNullableStringReference(name),
 			              dexBuilder.internNullableTypeReference((nonvoid_type_descriptor92!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor92).type:null)),
 			              dexBuilder.internNullableStringReference(signature));
-			
+			    
 			}
 
 		}
@@ -3281,23 +3281,23 @@
 
 
 	// $ANTLR start "end_local"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:624:1: end_local : ^( I_END_LOCAL REGISTER ) ;
+	// smaliTreeWalker.g:624:1: end_local : ^( I_END_LOCAL REGISTER ) ;
 	public final void end_local() throws RecognitionException {
 		CommonTree REGISTER93=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:625:3: ( ^( I_END_LOCAL REGISTER ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:625:5: ^( I_END_LOCAL REGISTER )
+			// smaliTreeWalker.g:625:3: ( ^( I_END_LOCAL REGISTER ) )
+			// smaliTreeWalker.g:625:5: ^( I_END_LOCAL REGISTER )
 			{
-			match(input,I_END_LOCAL,FOLLOW_I_END_LOCAL_in_end_local1544);
-			match(input, Token.DOWN, null);
-			REGISTER93=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_end_local1546);
-			match(input, Token.UP, null);
+			match(input,I_END_LOCAL,FOLLOW_I_END_LOCAL_in_end_local1544); 
+			match(input, Token.DOWN, null); 
+			REGISTER93=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_end_local1546); 
+			match(input, Token.UP, null); 
 
 
 			      int registerNumber = parseRegister_short((REGISTER93!=null?REGISTER93.getText():null));
 			      method_stack.peek().methodBuilder.addEndLocal(registerNumber);
-			
+			    
 			}
 
 		}
@@ -3314,23 +3314,23 @@
 
 
 	// $ANTLR start "restart_local"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:631:1: restart_local : ^( I_RESTART_LOCAL REGISTER ) ;
+	// smaliTreeWalker.g:631:1: restart_local : ^( I_RESTART_LOCAL REGISTER ) ;
 	public final void restart_local() throws RecognitionException {
 		CommonTree REGISTER94=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:632:3: ( ^( I_RESTART_LOCAL REGISTER ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:632:5: ^( I_RESTART_LOCAL REGISTER )
+			// smaliTreeWalker.g:632:3: ( ^( I_RESTART_LOCAL REGISTER ) )
+			// smaliTreeWalker.g:632:5: ^( I_RESTART_LOCAL REGISTER )
 			{
-			match(input,I_RESTART_LOCAL,FOLLOW_I_RESTART_LOCAL_in_restart_local1564);
-			match(input, Token.DOWN, null);
-			REGISTER94=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_restart_local1566);
-			match(input, Token.UP, null);
+			match(input,I_RESTART_LOCAL,FOLLOW_I_RESTART_LOCAL_in_restart_local1564); 
+			match(input, Token.DOWN, null); 
+			REGISTER94=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_restart_local1566); 
+			match(input, Token.UP, null); 
 
 
 			      int registerNumber = parseRegister_short((REGISTER94!=null?REGISTER94.getText():null));
 			      method_stack.peek().methodBuilder.addRestartLocal(registerNumber);
-			
+			    
 			}
 
 		}
@@ -3347,16 +3347,16 @@
 
 
 	// $ANTLR start "prologue"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:638:1: prologue : I_PROLOGUE ;
+	// smaliTreeWalker.g:638:1: prologue : I_PROLOGUE ;
 	public final void prologue() throws RecognitionException {
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:639:3: ( I_PROLOGUE )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:639:5: I_PROLOGUE
+			// smaliTreeWalker.g:639:3: ( I_PROLOGUE )
+			// smaliTreeWalker.g:639:5: I_PROLOGUE
 			{
-			match(input,I_PROLOGUE,FOLLOW_I_PROLOGUE_in_prologue1583);
+			match(input,I_PROLOGUE,FOLLOW_I_PROLOGUE_in_prologue1583); 
 
 			      method_stack.peek().methodBuilder.addPrologue();
-			
+			    
 			}
 
 		}
@@ -3373,16 +3373,16 @@
 
 
 	// $ANTLR start "epilogue"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:644:1: epilogue : I_EPILOGUE ;
+	// smaliTreeWalker.g:644:1: epilogue : I_EPILOGUE ;
 	public final void epilogue() throws RecognitionException {
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:645:3: ( I_EPILOGUE )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:645:5: I_EPILOGUE
+			// smaliTreeWalker.g:645:3: ( I_EPILOGUE )
+			// smaliTreeWalker.g:645:5: I_EPILOGUE
 			{
-			match(input,I_EPILOGUE,FOLLOW_I_EPILOGUE_in_epilogue1599);
+			match(input,I_EPILOGUE,FOLLOW_I_EPILOGUE_in_epilogue1599); 
 
 			      method_stack.peek().methodBuilder.addEpilogue();
-			
+			    
 			}
 
 		}
@@ -3399,18 +3399,18 @@
 
 
 	// $ANTLR start "source"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:650:1: source : ^( I_SOURCE ( string_literal )? ) ;
+	// smaliTreeWalker.g:650:1: source : ^( I_SOURCE ( string_literal )? ) ;
 	public final void source() throws RecognitionException {
 		String string_literal95 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:651:3: ( ^( I_SOURCE ( string_literal )? ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:651:5: ^( I_SOURCE ( string_literal )? )
+			// smaliTreeWalker.g:651:3: ( ^( I_SOURCE ( string_literal )? ) )
+			// smaliTreeWalker.g:651:5: ^( I_SOURCE ( string_literal )? )
 			{
-			match(input,I_SOURCE,FOLLOW_I_SOURCE_in_source1616);
+			match(input,I_SOURCE,FOLLOW_I_SOURCE_in_source1616); 
 			if ( input.LA(1)==Token.DOWN ) {
-				match(input, Token.DOWN, null);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:651:16: ( string_literal )?
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:651:16: ( string_literal )?
 				int alt30=2;
 				int LA30_0 = input.LA(1);
 				if ( (LA30_0==STRING_LITERAL) ) {
@@ -3418,7 +3418,7 @@
 				}
 				switch (alt30) {
 					case 1 :
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:651:16: string_literal
+						// smaliTreeWalker.g:651:16: string_literal
 						{
 						pushFollow(FOLLOW_string_literal_in_source1618);
 						string_literal95=string_literal();
@@ -3429,12 +3429,12 @@
 
 				}
 
-				match(input, Token.UP, null);
+				match(input, Token.UP, null); 
 			}
 
 
 			      method_stack.peek().methodBuilder.addSetSourceFile(dexBuilder.internNullableStringReference(string_literal95));
-			
+			    
 			}
 
 		}
@@ -3451,16 +3451,16 @@
 
 
 	// $ANTLR start "ordered_method_items"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:656:1: ordered_method_items : ^( I_ORDERED_METHOD_ITEMS ( label_def | instruction | debug_directive )* ) ;
+	// smaliTreeWalker.g:656:1: ordered_method_items : ^( I_ORDERED_METHOD_ITEMS ( label_def | instruction | debug_directive )* ) ;
 	public final void ordered_method_items() throws RecognitionException {
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:657:3: ( ^( I_ORDERED_METHOD_ITEMS ( label_def | instruction | debug_directive )* ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:657:5: ^( I_ORDERED_METHOD_ITEMS ( label_def | instruction | debug_directive )* )
+			// smaliTreeWalker.g:657:3: ( ^( I_ORDERED_METHOD_ITEMS ( label_def | instruction | debug_directive )* ) )
+			// smaliTreeWalker.g:657:5: ^( I_ORDERED_METHOD_ITEMS ( label_def | instruction | debug_directive )* )
 			{
-			match(input,I_ORDERED_METHOD_ITEMS,FOLLOW_I_ORDERED_METHOD_ITEMS_in_ordered_method_items1637);
+			match(input,I_ORDERED_METHOD_ITEMS,FOLLOW_I_ORDERED_METHOD_ITEMS_in_ordered_method_items1637); 
 			if ( input.LA(1)==Token.DOWN ) {
-				match(input, Token.DOWN, null);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:657:30: ( label_def | instruction | debug_directive )*
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:657:30: ( label_def | instruction | debug_directive )*
 				loop31:
 				while (true) {
 					int alt31=4;
@@ -3524,7 +3524,7 @@
 					}
 					switch (alt31) {
 					case 1 :
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:657:31: label_def
+						// smaliTreeWalker.g:657:31: label_def
 						{
 						pushFollow(FOLLOW_label_def_in_ordered_method_items1640);
 						label_def();
@@ -3533,7 +3533,7 @@
 						}
 						break;
 					case 2 :
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:657:43: instruction
+						// smaliTreeWalker.g:657:43: instruction
 						{
 						pushFollow(FOLLOW_instruction_in_ordered_method_items1644);
 						instruction();
@@ -3542,7 +3542,7 @@
 						}
 						break;
 					case 3 :
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:657:57: debug_directive
+						// smaliTreeWalker.g:657:57: debug_directive
 						{
 						pushFollow(FOLLOW_debug_directive_in_ordered_method_items1648);
 						debug_directive();
@@ -3556,7 +3556,7 @@
 					}
 				}
 
-				match(input, Token.UP, null);
+				match(input, Token.UP, null); 
 			}
 
 			}
@@ -3575,7 +3575,7 @@
 
 
 	// $ANTLR start "label_ref"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:659:1: label_ref returns [Label label] : SIMPLE_NAME ;
+	// smaliTreeWalker.g:659:1: label_ref returns [Label label] : SIMPLE_NAME ;
 	public final Label label_ref() throws RecognitionException {
 		Label label = null;
 
@@ -3583,11 +3583,11 @@
 		CommonTree SIMPLE_NAME96=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:660:3: ( SIMPLE_NAME )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:660:5: SIMPLE_NAME
+			// smaliTreeWalker.g:660:3: ( SIMPLE_NAME )
+			// smaliTreeWalker.g:660:5: SIMPLE_NAME
 			{
-			SIMPLE_NAME96=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_label_ref1664);
-			 label = method_stack.peek().methodBuilder.getLabel((SIMPLE_NAME96!=null?SIMPLE_NAME96.getText():null));
+			SIMPLE_NAME96=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_label_ref1664); 
+			 label = method_stack.peek().methodBuilder.getLabel((SIMPLE_NAME96!=null?SIMPLE_NAME96.getText():null)); 
 			}
 
 		}
@@ -3610,7 +3610,7 @@
 
 
 	// $ANTLR start "register_list"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:662:1: register_list returns [byte[] registers, byte registerCount] : ^( I_REGISTER_LIST ( REGISTER )* ) ;
+	// smaliTreeWalker.g:662:1: register_list returns [byte[] registers, byte registerCount] : ^( I_REGISTER_LIST ( REGISTER )* ) ;
 	public final smaliTreeWalker.register_list_return register_list() throws RecognitionException {
 		smaliTreeWalker.register_list_return retval = new smaliTreeWalker.register_list_return();
 		retval.start = input.LT(1);
@@ -3621,15 +3621,15 @@
 
 		    retval.registers = new byte[5];
 		    retval.registerCount = 0;
-		
+		  
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:668:3: ( ^( I_REGISTER_LIST ( REGISTER )* ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:668:5: ^( I_REGISTER_LIST ( REGISTER )* )
+			// smaliTreeWalker.g:668:3: ( ^( I_REGISTER_LIST ( REGISTER )* ) )
+			// smaliTreeWalker.g:668:5: ^( I_REGISTER_LIST ( REGISTER )* )
 			{
-			I_REGISTER_LIST97=(CommonTree)match(input,I_REGISTER_LIST,FOLLOW_I_REGISTER_LIST_in_register_list1689);
+			I_REGISTER_LIST97=(CommonTree)match(input,I_REGISTER_LIST,FOLLOW_I_REGISTER_LIST_in_register_list1689); 
 			if ( input.LA(1)==Token.DOWN ) {
-				match(input, Token.DOWN, null);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:669:7: ( REGISTER )*
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:669:7: ( REGISTER )*
 				loop32:
 				while (true) {
 					int alt32=2;
@@ -3640,16 +3640,16 @@
 
 					switch (alt32) {
 					case 1 :
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:669:8: REGISTER
+						// smaliTreeWalker.g:669:8: REGISTER
 						{
-						REGISTER98=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_register_list1698);
+						REGISTER98=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_register_list1698); 
 
 						        if (retval.registerCount == 5) {
 						          throw new SemanticException(input, I_REGISTER_LIST97, "A list of registers can only have a maximum of 5 " +
 						                  "registers. Use the <op>/range alternate opcode instead.");
 						        }
 						        retval.registers[retval.registerCount++] = parseRegister_nibble((REGISTER98!=null?REGISTER98.getText():null));
-						
+						      
 						}
 						break;
 
@@ -3658,7 +3658,7 @@
 					}
 				}
 
-				match(input, Token.UP, null);
+				match(input, Token.UP, null); 
 			}
 
 			}
@@ -3683,7 +3683,7 @@
 
 
 	// $ANTLR start "register_range"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:678:1: register_range returns [int startRegister, int endRegister] : ^( I_REGISTER_RANGE (startReg= REGISTER (endReg= REGISTER )? )? ) ;
+	// smaliTreeWalker.g:678:1: register_range returns [int startRegister, int endRegister] : ^( I_REGISTER_RANGE (startReg= REGISTER (endReg= REGISTER )? )? ) ;
 	public final smaliTreeWalker.register_range_return register_range() throws RecognitionException {
 		smaliTreeWalker.register_range_return retval = new smaliTreeWalker.register_range_return();
 		retval.start = input.LT(1);
@@ -3693,13 +3693,13 @@
 		CommonTree I_REGISTER_RANGE99=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:679:3: ( ^( I_REGISTER_RANGE (startReg= REGISTER (endReg= REGISTER )? )? ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:679:5: ^( I_REGISTER_RANGE (startReg= REGISTER (endReg= REGISTER )? )? )
+			// smaliTreeWalker.g:679:3: ( ^( I_REGISTER_RANGE (startReg= REGISTER (endReg= REGISTER )? )? ) )
+			// smaliTreeWalker.g:679:5: ^( I_REGISTER_RANGE (startReg= REGISTER (endReg= REGISTER )? )? )
 			{
-			I_REGISTER_RANGE99=(CommonTree)match(input,I_REGISTER_RANGE,FOLLOW_I_REGISTER_RANGE_in_register_range1723);
+			I_REGISTER_RANGE99=(CommonTree)match(input,I_REGISTER_RANGE,FOLLOW_I_REGISTER_RANGE_in_register_range1723); 
 			if ( input.LA(1)==Token.DOWN ) {
-				match(input, Token.DOWN, null);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:679:24: (startReg= REGISTER (endReg= REGISTER )? )?
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:679:24: (startReg= REGISTER (endReg= REGISTER )? )?
 				int alt34=2;
 				int LA34_0 = input.LA(1);
 				if ( (LA34_0==REGISTER) ) {
@@ -3707,10 +3707,10 @@
 				}
 				switch (alt34) {
 					case 1 :
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:679:25: startReg= REGISTER (endReg= REGISTER )?
+						// smaliTreeWalker.g:679:25: startReg= REGISTER (endReg= REGISTER )?
 						{
-						startReg=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_register_range1728);
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:679:49: (endReg= REGISTER )?
+						startReg=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_register_range1728); 
+						// smaliTreeWalker.g:679:49: (endReg= REGISTER )?
 						int alt33=2;
 						int LA33_0 = input.LA(1);
 						if ( (LA33_0==REGISTER) ) {
@@ -3718,9 +3718,9 @@
 						}
 						switch (alt33) {
 							case 1 :
-								// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:679:49: endReg= REGISTER
+								// smaliTreeWalker.g:679:49: endReg= REGISTER
 								{
-								endReg=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_register_range1732);
+								endReg=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_register_range1732); 
 								}
 								break;
 
@@ -3731,7 +3731,7 @@
 
 				}
 
-				match(input, Token.UP, null);
+				match(input, Token.UP, null); 
 			}
 
 
@@ -3751,7 +3751,7 @@
 			                    throw new SemanticException(input, I_REGISTER_RANGE99, "A register range must have the lower register listed first");
 			                }
 			            }
-			
+			    
 			}
 
 		}
@@ -3769,7 +3769,7 @@
 
 
 	// $ANTLR start "verification_error_reference"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:699:1: verification_error_reference returns [ImmutableReference reference] : ( CLASS_DESCRIPTOR | field_reference | method_reference );
+	// smaliTreeWalker.g:699:1: verification_error_reference returns [ImmutableReference reference] : ( CLASS_DESCRIPTOR | field_reference | method_reference );
 	public final ImmutableReference verification_error_reference() throws RecognitionException {
 		ImmutableReference reference = null;
 
@@ -3779,7 +3779,7 @@
 		ImmutableMethodReference method_reference102 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:700:3: ( CLASS_DESCRIPTOR | field_reference | method_reference )
+			// smaliTreeWalker.g:700:3: ( CLASS_DESCRIPTOR | field_reference | method_reference )
 			int alt35=3;
 			switch ( input.LA(1) ) {
 			case CLASS_DESCRIPTOR:
@@ -3960,16 +3960,16 @@
 			}
 			switch (alt35) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:700:5: CLASS_DESCRIPTOR
+					// smaliTreeWalker.g:700:5: CLASS_DESCRIPTOR
 					{
-					CLASS_DESCRIPTOR100=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_verification_error_reference1755);
+					CLASS_DESCRIPTOR100=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_verification_error_reference1755); 
 
 					    reference = new ImmutableTypeReference((CLASS_DESCRIPTOR100!=null?CLASS_DESCRIPTOR100.getText():null));
-					
+					  
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:704:5: field_reference
+					// smaliTreeWalker.g:704:5: field_reference
 					{
 					pushFollow(FOLLOW_field_reference_in_verification_error_reference1765);
 					field_reference101=field_reference();
@@ -3977,11 +3977,11 @@
 
 
 					    reference = field_reference101;
-					
+					  
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:708:5: method_reference
+					// smaliTreeWalker.g:708:5: method_reference
 					{
 					pushFollow(FOLLOW_method_reference_in_verification_error_reference1775);
 					method_reference102=method_reference();
@@ -3989,7 +3989,7 @@
 
 
 					    reference = method_reference102;
-					
+					  
 					}
 					break;
 
@@ -4009,7 +4009,7 @@
 
 
 	// $ANTLR start "verification_error_type"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:713:1: verification_error_type returns [int verificationError] : VERIFICATION_ERROR_TYPE ;
+	// smaliTreeWalker.g:713:1: verification_error_type returns [int verificationError] : VERIFICATION_ERROR_TYPE ;
 	public final int verification_error_type() throws RecognitionException {
 		int verificationError = 0;
 
@@ -4017,13 +4017,13 @@
 		CommonTree VERIFICATION_ERROR_TYPE103=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:714:3: ( VERIFICATION_ERROR_TYPE )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:714:5: VERIFICATION_ERROR_TYPE
+			// smaliTreeWalker.g:714:3: ( VERIFICATION_ERROR_TYPE )
+			// smaliTreeWalker.g:714:5: VERIFICATION_ERROR_TYPE
 			{
-			VERIFICATION_ERROR_TYPE103=(CommonTree)match(input,VERIFICATION_ERROR_TYPE,FOLLOW_VERIFICATION_ERROR_TYPE_in_verification_error_type1792);
+			VERIFICATION_ERROR_TYPE103=(CommonTree)match(input,VERIFICATION_ERROR_TYPE,FOLLOW_VERIFICATION_ERROR_TYPE_in_verification_error_type1792); 
 
 			    verificationError = VerificationError.getVerificationError((VERIFICATION_ERROR_TYPE103!=null?VERIFICATION_ERROR_TYPE103.getText():null));
-			
+			  
 			}
 
 		}
@@ -4044,13 +4044,13 @@
 
 
 	// $ANTLR start "instruction"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:719:1: instruction : ( insn_format10t | insn_format10x | insn_format11n | insn_format11x | insn_format12x | insn_format20bc | insn_format20t | insn_format21c_field | insn_format21c_string | insn_format21c_type | insn_format21ih | insn_format21lh | insn_format21s | insn_format21t | insn_format22b | insn_format22c_field | insn_format22c_type | insn_format22s | insn_format22t | insn_format22x | insn_format23x | insn_format30t | insn_format31c | insn_format31i | insn_format31t | insn_format32x | insn_format35c_method | insn_format35c_type | insn_format3rc_method | insn_format3rc_type | insn_format45cc_method | insn_format4rcc_method | insn_format51l_type | insn_array_data_directive | insn_packed_switch_directive | insn_sparse_switch_directive );
+	// smaliTreeWalker.g:719:1: instruction : ( insn_format10t | insn_format10x | insn_format11n | insn_format11x | insn_format12x | insn_format20bc | insn_format20t | insn_format21c_field | insn_format21c_string | insn_format21c_type | insn_format21ih | insn_format21lh | insn_format21s | insn_format21t | insn_format22b | insn_format22c_field | insn_format22c_type | insn_format22s | insn_format22t | insn_format22x | insn_format23x | insn_format30t | insn_format31c | insn_format31i | insn_format31t | insn_format32x | insn_format35c_method | insn_format35c_type | insn_format3rc_method | insn_format3rc_type | insn_format45cc_method | insn_format4rcc_method | insn_format51l_type | insn_array_data_directive | insn_packed_switch_directive | insn_sparse_switch_directive );
 	public final smaliTreeWalker.instruction_return instruction() throws RecognitionException {
 		smaliTreeWalker.instruction_return retval = new smaliTreeWalker.instruction_return();
 		retval.start = input.LT(1);
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:720:3: ( insn_format10t | insn_format10x | insn_format11n | insn_format11x | insn_format12x | insn_format20bc | insn_format20t | insn_format21c_field | insn_format21c_string | insn_format21c_type | insn_format21ih | insn_format21lh | insn_format21s | insn_format21t | insn_format22b | insn_format22c_field | insn_format22c_type | insn_format22s | insn_format22t | insn_format22x | insn_format23x | insn_format30t | insn_format31c | insn_format31i | insn_format31t | insn_format32x | insn_format35c_method | insn_format35c_type | insn_format3rc_method | insn_format3rc_type | insn_format45cc_method | insn_format4rcc_method | insn_format51l_type | insn_array_data_directive | insn_packed_switch_directive | insn_sparse_switch_directive )
+			// smaliTreeWalker.g:720:3: ( insn_format10t | insn_format10x | insn_format11n | insn_format11x | insn_format12x | insn_format20bc | insn_format20t | insn_format21c_field | insn_format21c_string | insn_format21c_type | insn_format21ih | insn_format21lh | insn_format21s | insn_format21t | insn_format22b | insn_format22c_field | insn_format22c_type | insn_format22s | insn_format22t | insn_format22x | insn_format23x | insn_format30t | insn_format31c | insn_format31i | insn_format31t | insn_format32x | insn_format35c_method | insn_format35c_type | insn_format3rc_method | insn_format3rc_type | insn_format45cc_method | insn_format4rcc_method | insn_format51l_type | insn_array_data_directive | insn_packed_switch_directive | insn_sparse_switch_directive )
 			int alt36=36;
 			switch ( input.LA(1) ) {
 			case I_STATEMENT_FORMAT10t:
@@ -4240,7 +4240,7 @@
 			}
 			switch (alt36) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:720:5: insn_format10t
+					// smaliTreeWalker.g:720:5: insn_format10t
 					{
 					pushFollow(FOLLOW_insn_format10t_in_instruction1806);
 					insn_format10t();
@@ -4249,7 +4249,7 @@
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:721:5: insn_format10x
+					// smaliTreeWalker.g:721:5: insn_format10x
 					{
 					pushFollow(FOLLOW_insn_format10x_in_instruction1812);
 					insn_format10x();
@@ -4258,7 +4258,7 @@
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:722:5: insn_format11n
+					// smaliTreeWalker.g:722:5: insn_format11n
 					{
 					pushFollow(FOLLOW_insn_format11n_in_instruction1818);
 					insn_format11n();
@@ -4267,7 +4267,7 @@
 					}
 					break;
 				case 4 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:723:5: insn_format11x
+					// smaliTreeWalker.g:723:5: insn_format11x
 					{
 					pushFollow(FOLLOW_insn_format11x_in_instruction1824);
 					insn_format11x();
@@ -4276,7 +4276,7 @@
 					}
 					break;
 				case 5 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:724:5: insn_format12x
+					// smaliTreeWalker.g:724:5: insn_format12x
 					{
 					pushFollow(FOLLOW_insn_format12x_in_instruction1830);
 					insn_format12x();
@@ -4285,7 +4285,7 @@
 					}
 					break;
 				case 6 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:725:5: insn_format20bc
+					// smaliTreeWalker.g:725:5: insn_format20bc
 					{
 					pushFollow(FOLLOW_insn_format20bc_in_instruction1836);
 					insn_format20bc();
@@ -4294,7 +4294,7 @@
 					}
 					break;
 				case 7 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:726:5: insn_format20t
+					// smaliTreeWalker.g:726:5: insn_format20t
 					{
 					pushFollow(FOLLOW_insn_format20t_in_instruction1842);
 					insn_format20t();
@@ -4303,7 +4303,7 @@
 					}
 					break;
 				case 8 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:727:5: insn_format21c_field
+					// smaliTreeWalker.g:727:5: insn_format21c_field
 					{
 					pushFollow(FOLLOW_insn_format21c_field_in_instruction1848);
 					insn_format21c_field();
@@ -4312,7 +4312,7 @@
 					}
 					break;
 				case 9 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:728:5: insn_format21c_string
+					// smaliTreeWalker.g:728:5: insn_format21c_string
 					{
 					pushFollow(FOLLOW_insn_format21c_string_in_instruction1854);
 					insn_format21c_string();
@@ -4321,7 +4321,7 @@
 					}
 					break;
 				case 10 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:729:5: insn_format21c_type
+					// smaliTreeWalker.g:729:5: insn_format21c_type
 					{
 					pushFollow(FOLLOW_insn_format21c_type_in_instruction1860);
 					insn_format21c_type();
@@ -4330,7 +4330,7 @@
 					}
 					break;
 				case 11 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:730:5: insn_format21ih
+					// smaliTreeWalker.g:730:5: insn_format21ih
 					{
 					pushFollow(FOLLOW_insn_format21ih_in_instruction1866);
 					insn_format21ih();
@@ -4339,7 +4339,7 @@
 					}
 					break;
 				case 12 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:731:5: insn_format21lh
+					// smaliTreeWalker.g:731:5: insn_format21lh
 					{
 					pushFollow(FOLLOW_insn_format21lh_in_instruction1872);
 					insn_format21lh();
@@ -4348,7 +4348,7 @@
 					}
 					break;
 				case 13 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:732:5: insn_format21s
+					// smaliTreeWalker.g:732:5: insn_format21s
 					{
 					pushFollow(FOLLOW_insn_format21s_in_instruction1878);
 					insn_format21s();
@@ -4357,7 +4357,7 @@
 					}
 					break;
 				case 14 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:733:5: insn_format21t
+					// smaliTreeWalker.g:733:5: insn_format21t
 					{
 					pushFollow(FOLLOW_insn_format21t_in_instruction1884);
 					insn_format21t();
@@ -4366,7 +4366,7 @@
 					}
 					break;
 				case 15 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:734:5: insn_format22b
+					// smaliTreeWalker.g:734:5: insn_format22b
 					{
 					pushFollow(FOLLOW_insn_format22b_in_instruction1890);
 					insn_format22b();
@@ -4375,7 +4375,7 @@
 					}
 					break;
 				case 16 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:735:5: insn_format22c_field
+					// smaliTreeWalker.g:735:5: insn_format22c_field
 					{
 					pushFollow(FOLLOW_insn_format22c_field_in_instruction1896);
 					insn_format22c_field();
@@ -4384,7 +4384,7 @@
 					}
 					break;
 				case 17 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:736:5: insn_format22c_type
+					// smaliTreeWalker.g:736:5: insn_format22c_type
 					{
 					pushFollow(FOLLOW_insn_format22c_type_in_instruction1902);
 					insn_format22c_type();
@@ -4393,7 +4393,7 @@
 					}
 					break;
 				case 18 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:737:5: insn_format22s
+					// smaliTreeWalker.g:737:5: insn_format22s
 					{
 					pushFollow(FOLLOW_insn_format22s_in_instruction1908);
 					insn_format22s();
@@ -4402,7 +4402,7 @@
 					}
 					break;
 				case 19 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:738:5: insn_format22t
+					// smaliTreeWalker.g:738:5: insn_format22t
 					{
 					pushFollow(FOLLOW_insn_format22t_in_instruction1914);
 					insn_format22t();
@@ -4411,7 +4411,7 @@
 					}
 					break;
 				case 20 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:739:5: insn_format22x
+					// smaliTreeWalker.g:739:5: insn_format22x
 					{
 					pushFollow(FOLLOW_insn_format22x_in_instruction1920);
 					insn_format22x();
@@ -4420,7 +4420,7 @@
 					}
 					break;
 				case 21 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:740:5: insn_format23x
+					// smaliTreeWalker.g:740:5: insn_format23x
 					{
 					pushFollow(FOLLOW_insn_format23x_in_instruction1926);
 					insn_format23x();
@@ -4429,7 +4429,7 @@
 					}
 					break;
 				case 22 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:741:5: insn_format30t
+					// smaliTreeWalker.g:741:5: insn_format30t
 					{
 					pushFollow(FOLLOW_insn_format30t_in_instruction1932);
 					insn_format30t();
@@ -4438,7 +4438,7 @@
 					}
 					break;
 				case 23 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:742:5: insn_format31c
+					// smaliTreeWalker.g:742:5: insn_format31c
 					{
 					pushFollow(FOLLOW_insn_format31c_in_instruction1938);
 					insn_format31c();
@@ -4447,7 +4447,7 @@
 					}
 					break;
 				case 24 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:743:5: insn_format31i
+					// smaliTreeWalker.g:743:5: insn_format31i
 					{
 					pushFollow(FOLLOW_insn_format31i_in_instruction1944);
 					insn_format31i();
@@ -4456,7 +4456,7 @@
 					}
 					break;
 				case 25 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:744:5: insn_format31t
+					// smaliTreeWalker.g:744:5: insn_format31t
 					{
 					pushFollow(FOLLOW_insn_format31t_in_instruction1950);
 					insn_format31t();
@@ -4465,7 +4465,7 @@
 					}
 					break;
 				case 26 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:745:5: insn_format32x
+					// smaliTreeWalker.g:745:5: insn_format32x
 					{
 					pushFollow(FOLLOW_insn_format32x_in_instruction1956);
 					insn_format32x();
@@ -4474,7 +4474,7 @@
 					}
 					break;
 				case 27 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:746:5: insn_format35c_method
+					// smaliTreeWalker.g:746:5: insn_format35c_method
 					{
 					pushFollow(FOLLOW_insn_format35c_method_in_instruction1962);
 					insn_format35c_method();
@@ -4483,7 +4483,7 @@
 					}
 					break;
 				case 28 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:747:5: insn_format35c_type
+					// smaliTreeWalker.g:747:5: insn_format35c_type
 					{
 					pushFollow(FOLLOW_insn_format35c_type_in_instruction1968);
 					insn_format35c_type();
@@ -4492,7 +4492,7 @@
 					}
 					break;
 				case 29 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:748:5: insn_format3rc_method
+					// smaliTreeWalker.g:748:5: insn_format3rc_method
 					{
 					pushFollow(FOLLOW_insn_format3rc_method_in_instruction1974);
 					insn_format3rc_method();
@@ -4501,7 +4501,7 @@
 					}
 					break;
 				case 30 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:749:5: insn_format3rc_type
+					// smaliTreeWalker.g:749:5: insn_format3rc_type
 					{
 					pushFollow(FOLLOW_insn_format3rc_type_in_instruction1980);
 					insn_format3rc_type();
@@ -4510,7 +4510,7 @@
 					}
 					break;
 				case 31 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:750:5: insn_format45cc_method
+					// smaliTreeWalker.g:750:5: insn_format45cc_method
 					{
 					pushFollow(FOLLOW_insn_format45cc_method_in_instruction1986);
 					insn_format45cc_method();
@@ -4519,7 +4519,7 @@
 					}
 					break;
 				case 32 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:751:5: insn_format4rcc_method
+					// smaliTreeWalker.g:751:5: insn_format4rcc_method
 					{
 					pushFollow(FOLLOW_insn_format4rcc_method_in_instruction1992);
 					insn_format4rcc_method();
@@ -4528,7 +4528,7 @@
 					}
 					break;
 				case 33 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:752:5: insn_format51l_type
+					// smaliTreeWalker.g:752:5: insn_format51l_type
 					{
 					pushFollow(FOLLOW_insn_format51l_type_in_instruction1998);
 					insn_format51l_type();
@@ -4537,7 +4537,7 @@
 					}
 					break;
 				case 34 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:753:5: insn_array_data_directive
+					// smaliTreeWalker.g:753:5: insn_array_data_directive
 					{
 					pushFollow(FOLLOW_insn_array_data_directive_in_instruction2004);
 					insn_array_data_directive();
@@ -4546,7 +4546,7 @@
 					}
 					break;
 				case 35 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:754:5: insn_packed_switch_directive
+					// smaliTreeWalker.g:754:5: insn_packed_switch_directive
 					{
 					pushFollow(FOLLOW_insn_packed_switch_directive_in_instruction2010);
 					insn_packed_switch_directive();
@@ -4555,7 +4555,7 @@
 					}
 					break;
 				case 36 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:755:5: insn_sparse_switch_directive
+					// smaliTreeWalker.g:755:5: insn_sparse_switch_directive
 					{
 					pushFollow(FOLLOW_insn_sparse_switch_directive_in_instruction2016);
 					insn_sparse_switch_directive();
@@ -4570,7 +4570,7 @@
 
 			    reportError(new SemanticException(input, ((CommonTree)retval.start), ex.getMessage()));
 			    recover(input, null);
-			
+			  
 		}
 
 		finally {
@@ -4583,28 +4583,28 @@
 
 
 	// $ANTLR start "insn_format10t"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:761:1: insn_format10t : ^( I_STATEMENT_FORMAT10t INSTRUCTION_FORMAT10t label_ref ) ;
+	// smaliTreeWalker.g:761:1: insn_format10t : ^( I_STATEMENT_FORMAT10t INSTRUCTION_FORMAT10t label_ref ) ;
 	public final void insn_format10t() throws RecognitionException {
 		CommonTree INSTRUCTION_FORMAT10t104=null;
 		Label label_ref105 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:762:3: ( ^( I_STATEMENT_FORMAT10t INSTRUCTION_FORMAT10t label_ref ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:763:5: ^( I_STATEMENT_FORMAT10t INSTRUCTION_FORMAT10t label_ref )
+			// smaliTreeWalker.g:762:3: ( ^( I_STATEMENT_FORMAT10t INSTRUCTION_FORMAT10t label_ref ) )
+			// smaliTreeWalker.g:763:5: ^( I_STATEMENT_FORMAT10t INSTRUCTION_FORMAT10t label_ref )
 			{
-			match(input,I_STATEMENT_FORMAT10t,FOLLOW_I_STATEMENT_FORMAT10t_in_insn_format10t2040);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT10t104=(CommonTree)match(input,INSTRUCTION_FORMAT10t,FOLLOW_INSTRUCTION_FORMAT10t_in_insn_format10t2042);
+			match(input,I_STATEMENT_FORMAT10t,FOLLOW_I_STATEMENT_FORMAT10t_in_insn_format10t2040); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT10t104=(CommonTree)match(input,INSTRUCTION_FORMAT10t,FOLLOW_INSTRUCTION_FORMAT10t_in_insn_format10t2042); 
 			pushFollow(FOLLOW_label_ref_in_insn_format10t2044);
 			label_ref105=label_ref();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT10t104!=null?INSTRUCTION_FORMAT10t104.getText():null));
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction10t(opcode, label_ref105));
-			
+			    
 			}
 
 		}
@@ -4621,23 +4621,23 @@
 
 
 	// $ANTLR start "insn_format10x"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:769:1: insn_format10x : ^( I_STATEMENT_FORMAT10x INSTRUCTION_FORMAT10x ) ;
+	// smaliTreeWalker.g:769:1: insn_format10x : ^( I_STATEMENT_FORMAT10x INSTRUCTION_FORMAT10x ) ;
 	public final void insn_format10x() throws RecognitionException {
 		CommonTree INSTRUCTION_FORMAT10x106=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:770:3: ( ^( I_STATEMENT_FORMAT10x INSTRUCTION_FORMAT10x ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:771:5: ^( I_STATEMENT_FORMAT10x INSTRUCTION_FORMAT10x )
+			// smaliTreeWalker.g:770:3: ( ^( I_STATEMENT_FORMAT10x INSTRUCTION_FORMAT10x ) )
+			// smaliTreeWalker.g:771:5: ^( I_STATEMENT_FORMAT10x INSTRUCTION_FORMAT10x )
 			{
-			match(input,I_STATEMENT_FORMAT10x,FOLLOW_I_STATEMENT_FORMAT10x_in_insn_format10x2067);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT10x106=(CommonTree)match(input,INSTRUCTION_FORMAT10x,FOLLOW_INSTRUCTION_FORMAT10x_in_insn_format10x2069);
-			match(input, Token.UP, null);
+			match(input,I_STATEMENT_FORMAT10x,FOLLOW_I_STATEMENT_FORMAT10x_in_insn_format10x2067); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT10x106=(CommonTree)match(input,INSTRUCTION_FORMAT10x,FOLLOW_INSTRUCTION_FORMAT10x_in_insn_format10x2069); 
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT10x106!=null?INSTRUCTION_FORMAT10x106.getText():null));
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction10x(opcode));
-			
+			    
 			}
 
 		}
@@ -4654,25 +4654,25 @@
 
 
 	// $ANTLR start "insn_format11n"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:777:1: insn_format11n : ^( I_STATEMENT_FORMAT11n INSTRUCTION_FORMAT11n REGISTER short_integral_literal ) ;
+	// smaliTreeWalker.g:777:1: insn_format11n : ^( I_STATEMENT_FORMAT11n INSTRUCTION_FORMAT11n REGISTER short_integral_literal ) ;
 	public final void insn_format11n() throws RecognitionException {
 		CommonTree INSTRUCTION_FORMAT11n107=null;
 		CommonTree REGISTER108=null;
 		short short_integral_literal109 =0;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:778:3: ( ^( I_STATEMENT_FORMAT11n INSTRUCTION_FORMAT11n REGISTER short_integral_literal ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:779:5: ^( I_STATEMENT_FORMAT11n INSTRUCTION_FORMAT11n REGISTER short_integral_literal )
+			// smaliTreeWalker.g:778:3: ( ^( I_STATEMENT_FORMAT11n INSTRUCTION_FORMAT11n REGISTER short_integral_literal ) )
+			// smaliTreeWalker.g:779:5: ^( I_STATEMENT_FORMAT11n INSTRUCTION_FORMAT11n REGISTER short_integral_literal )
 			{
-			match(input,I_STATEMENT_FORMAT11n,FOLLOW_I_STATEMENT_FORMAT11n_in_insn_format11n2092);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT11n107=(CommonTree)match(input,INSTRUCTION_FORMAT11n,FOLLOW_INSTRUCTION_FORMAT11n_in_insn_format11n2094);
-			REGISTER108=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format11n2096);
+			match(input,I_STATEMENT_FORMAT11n,FOLLOW_I_STATEMENT_FORMAT11n_in_insn_format11n2092); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT11n107=(CommonTree)match(input,INSTRUCTION_FORMAT11n,FOLLOW_INSTRUCTION_FORMAT11n_in_insn_format11n2094); 
+			REGISTER108=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format11n2096); 
 			pushFollow(FOLLOW_short_integral_literal_in_insn_format11n2098);
 			short_integral_literal109=short_integral_literal();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT11n107!=null?INSTRUCTION_FORMAT11n107.getText():null));
@@ -4682,7 +4682,7 @@
 			      LiteralTools.checkNibble(litB);
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction11n(opcode, regA, litB));
-			
+			    
 			}
 
 		}
@@ -4699,27 +4699,27 @@
 
 
 	// $ANTLR start "insn_format11x"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:790:1: insn_format11x : ^( I_STATEMENT_FORMAT11x INSTRUCTION_FORMAT11x REGISTER ) ;
+	// smaliTreeWalker.g:790:1: insn_format11x : ^( I_STATEMENT_FORMAT11x INSTRUCTION_FORMAT11x REGISTER ) ;
 	public final void insn_format11x() throws RecognitionException {
 		CommonTree INSTRUCTION_FORMAT11x110=null;
 		CommonTree REGISTER111=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:791:3: ( ^( I_STATEMENT_FORMAT11x INSTRUCTION_FORMAT11x REGISTER ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:792:5: ^( I_STATEMENT_FORMAT11x INSTRUCTION_FORMAT11x REGISTER )
+			// smaliTreeWalker.g:791:3: ( ^( I_STATEMENT_FORMAT11x INSTRUCTION_FORMAT11x REGISTER ) )
+			// smaliTreeWalker.g:792:5: ^( I_STATEMENT_FORMAT11x INSTRUCTION_FORMAT11x REGISTER )
 			{
-			match(input,I_STATEMENT_FORMAT11x,FOLLOW_I_STATEMENT_FORMAT11x_in_insn_format11x2121);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT11x110=(CommonTree)match(input,INSTRUCTION_FORMAT11x,FOLLOW_INSTRUCTION_FORMAT11x_in_insn_format11x2123);
-			REGISTER111=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format11x2125);
-			match(input, Token.UP, null);
+			match(input,I_STATEMENT_FORMAT11x,FOLLOW_I_STATEMENT_FORMAT11x_in_insn_format11x2121); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT11x110=(CommonTree)match(input,INSTRUCTION_FORMAT11x,FOLLOW_INSTRUCTION_FORMAT11x_in_insn_format11x2123); 
+			REGISTER111=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format11x2125); 
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT11x110!=null?INSTRUCTION_FORMAT11x110.getText():null));
 			      short regA = parseRegister_byte((REGISTER111!=null?REGISTER111.getText():null));
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction11x(opcode, regA));
-			
+			    
 			}
 
 		}
@@ -4736,22 +4736,22 @@
 
 
 	// $ANTLR start "insn_format12x"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:800:1: insn_format12x : ^( I_STATEMENT_FORMAT12x INSTRUCTION_FORMAT12x registerA= REGISTER registerB= REGISTER ) ;
+	// smaliTreeWalker.g:800:1: insn_format12x : ^( I_STATEMENT_FORMAT12x INSTRUCTION_FORMAT12x registerA= REGISTER registerB= REGISTER ) ;
 	public final void insn_format12x() throws RecognitionException {
 		CommonTree registerA=null;
 		CommonTree registerB=null;
 		CommonTree INSTRUCTION_FORMAT12x112=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:801:3: ( ^( I_STATEMENT_FORMAT12x INSTRUCTION_FORMAT12x registerA= REGISTER registerB= REGISTER ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:802:5: ^( I_STATEMENT_FORMAT12x INSTRUCTION_FORMAT12x registerA= REGISTER registerB= REGISTER )
+			// smaliTreeWalker.g:801:3: ( ^( I_STATEMENT_FORMAT12x INSTRUCTION_FORMAT12x registerA= REGISTER registerB= REGISTER ) )
+			// smaliTreeWalker.g:802:5: ^( I_STATEMENT_FORMAT12x INSTRUCTION_FORMAT12x registerA= REGISTER registerB= REGISTER )
 			{
-			match(input,I_STATEMENT_FORMAT12x,FOLLOW_I_STATEMENT_FORMAT12x_in_insn_format12x2148);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT12x112=(CommonTree)match(input,INSTRUCTION_FORMAT12x,FOLLOW_INSTRUCTION_FORMAT12x_in_insn_format12x2150);
-			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format12x2154);
-			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format12x2158);
-			match(input, Token.UP, null);
+			match(input,I_STATEMENT_FORMAT12x,FOLLOW_I_STATEMENT_FORMAT12x_in_insn_format12x2148); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT12x112=(CommonTree)match(input,INSTRUCTION_FORMAT12x,FOLLOW_INSTRUCTION_FORMAT12x_in_insn_format12x2150); 
+			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format12x2154); 
+			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format12x2158); 
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT12x112!=null?INSTRUCTION_FORMAT12x112.getText():null));
@@ -4759,7 +4759,7 @@
 			      byte regB = parseRegister_nibble((registerB!=null?registerB.getText():null));
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction12x(opcode, regA, regB));
-			
+			    
 			}
 
 		}
@@ -4776,19 +4776,19 @@
 
 
 	// $ANTLR start "insn_format20bc"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:811:1: insn_format20bc : ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc verification_error_type verification_error_reference ) ;
+	// smaliTreeWalker.g:811:1: insn_format20bc : ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc verification_error_type verification_error_reference ) ;
 	public final void insn_format20bc() throws RecognitionException {
 		CommonTree INSTRUCTION_FORMAT20bc113=null;
 		int verification_error_type114 =0;
 		ImmutableReference verification_error_reference115 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:812:3: ( ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc verification_error_type verification_error_reference ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:813:5: ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc verification_error_type verification_error_reference )
+			// smaliTreeWalker.g:812:3: ( ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc verification_error_type verification_error_reference ) )
+			// smaliTreeWalker.g:813:5: ^( I_STATEMENT_FORMAT20bc INSTRUCTION_FORMAT20bc verification_error_type verification_error_reference )
 			{
-			match(input,I_STATEMENT_FORMAT20bc,FOLLOW_I_STATEMENT_FORMAT20bc_in_insn_format20bc2181);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT20bc113=(CommonTree)match(input,INSTRUCTION_FORMAT20bc,FOLLOW_INSTRUCTION_FORMAT20bc_in_insn_format20bc2183);
+			match(input,I_STATEMENT_FORMAT20bc,FOLLOW_I_STATEMENT_FORMAT20bc_in_insn_format20bc2181); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT20bc113=(CommonTree)match(input,INSTRUCTION_FORMAT20bc,FOLLOW_INSTRUCTION_FORMAT20bc_in_insn_format20bc2183); 
 			pushFollow(FOLLOW_verification_error_type_in_insn_format20bc2185);
 			verification_error_type114=verification_error_type();
 			state._fsp--;
@@ -4797,7 +4797,7 @@
 			verification_error_reference115=verification_error_reference();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT20bc113!=null?INSTRUCTION_FORMAT20bc113.getText():null));
@@ -4807,7 +4807,7 @@
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction20bc(opcode, verificationError,
 			              dexBuilder.internReference(referencedItem)));
-			
+			    
 			}
 
 		}
@@ -4824,28 +4824,28 @@
 
 
 	// $ANTLR start "insn_format20t"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:824:1: insn_format20t : ^( I_STATEMENT_FORMAT20t INSTRUCTION_FORMAT20t label_ref ) ;
+	// smaliTreeWalker.g:824:1: insn_format20t : ^( I_STATEMENT_FORMAT20t INSTRUCTION_FORMAT20t label_ref ) ;
 	public final void insn_format20t() throws RecognitionException {
 		CommonTree INSTRUCTION_FORMAT20t116=null;
 		Label label_ref117 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:825:3: ( ^( I_STATEMENT_FORMAT20t INSTRUCTION_FORMAT20t label_ref ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:826:5: ^( I_STATEMENT_FORMAT20t INSTRUCTION_FORMAT20t label_ref )
+			// smaliTreeWalker.g:825:3: ( ^( I_STATEMENT_FORMAT20t INSTRUCTION_FORMAT20t label_ref ) )
+			// smaliTreeWalker.g:826:5: ^( I_STATEMENT_FORMAT20t INSTRUCTION_FORMAT20t label_ref )
 			{
-			match(input,I_STATEMENT_FORMAT20t,FOLLOW_I_STATEMENT_FORMAT20t_in_insn_format20t2210);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT20t116=(CommonTree)match(input,INSTRUCTION_FORMAT20t,FOLLOW_INSTRUCTION_FORMAT20t_in_insn_format20t2212);
+			match(input,I_STATEMENT_FORMAT20t,FOLLOW_I_STATEMENT_FORMAT20t_in_insn_format20t2210); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT20t116=(CommonTree)match(input,INSTRUCTION_FORMAT20t,FOLLOW_INSTRUCTION_FORMAT20t_in_insn_format20t2212); 
 			pushFollow(FOLLOW_label_ref_in_insn_format20t2214);
 			label_ref117=label_ref();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT20t116!=null?INSTRUCTION_FORMAT20t116.getText():null));
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction20t(opcode, label_ref117));
-			
+			    
 			}
 
 		}
@@ -4862,18 +4862,18 @@
 
 
 	// $ANTLR start "insn_format21c_field"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:832:1: insn_format21c_field : ^( I_STATEMENT_FORMAT21c_FIELD inst= ( INSTRUCTION_FORMAT21c_FIELD | INSTRUCTION_FORMAT21c_FIELD_ODEX ) REGISTER field_reference ) ;
+	// smaliTreeWalker.g:832:1: insn_format21c_field : ^( I_STATEMENT_FORMAT21c_FIELD inst= ( INSTRUCTION_FORMAT21c_FIELD | INSTRUCTION_FORMAT21c_FIELD_ODEX ) REGISTER field_reference ) ;
 	public final void insn_format21c_field() throws RecognitionException {
 		CommonTree inst=null;
 		CommonTree REGISTER118=null;
 		ImmutableFieldReference field_reference119 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:833:3: ( ^( I_STATEMENT_FORMAT21c_FIELD inst= ( INSTRUCTION_FORMAT21c_FIELD | INSTRUCTION_FORMAT21c_FIELD_ODEX ) REGISTER field_reference ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:834:5: ^( I_STATEMENT_FORMAT21c_FIELD inst= ( INSTRUCTION_FORMAT21c_FIELD | INSTRUCTION_FORMAT21c_FIELD_ODEX ) REGISTER field_reference )
+			// smaliTreeWalker.g:833:3: ( ^( I_STATEMENT_FORMAT21c_FIELD inst= ( INSTRUCTION_FORMAT21c_FIELD | INSTRUCTION_FORMAT21c_FIELD_ODEX ) REGISTER field_reference ) )
+			// smaliTreeWalker.g:834:5: ^( I_STATEMENT_FORMAT21c_FIELD inst= ( INSTRUCTION_FORMAT21c_FIELD | INSTRUCTION_FORMAT21c_FIELD_ODEX ) REGISTER field_reference )
 			{
-			match(input,I_STATEMENT_FORMAT21c_FIELD,FOLLOW_I_STATEMENT_FORMAT21c_FIELD_in_insn_format21c_field2237);
-			match(input, Token.DOWN, null);
+			match(input,I_STATEMENT_FORMAT21c_FIELD,FOLLOW_I_STATEMENT_FORMAT21c_FIELD_in_insn_format21c_field2237); 
+			match(input, Token.DOWN, null); 
 			inst=(CommonTree)input.LT(1);
 			if ( (input.LA(1) >= INSTRUCTION_FORMAT21c_FIELD && input.LA(1) <= INSTRUCTION_FORMAT21c_FIELD_ODEX) ) {
 				input.consume();
@@ -4883,12 +4883,12 @@
 				MismatchedSetException mse = new MismatchedSetException(null,input);
 				throw mse;
 			}
-			REGISTER118=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_field2249);
+			REGISTER118=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_field2249); 
 			pushFollow(FOLLOW_field_reference_in_insn_format21c_field2251);
 			field_reference119=field_reference();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((inst!=null?inst.getText():null));
@@ -4898,7 +4898,7 @@
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction21c(opcode, regA,
 			              dexBuilder.internFieldReference(fieldReference)));
-			
+			    
 			}
 
 		}
@@ -4915,25 +4915,25 @@
 
 
 	// $ANTLR start "insn_format21c_string"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:845:1: insn_format21c_string : ^( I_STATEMENT_FORMAT21c_STRING INSTRUCTION_FORMAT21c_STRING REGISTER string_literal ) ;
+	// smaliTreeWalker.g:845:1: insn_format21c_string : ^( I_STATEMENT_FORMAT21c_STRING INSTRUCTION_FORMAT21c_STRING REGISTER string_literal ) ;
 	public final void insn_format21c_string() throws RecognitionException {
 		CommonTree INSTRUCTION_FORMAT21c_STRING120=null;
 		CommonTree REGISTER121=null;
 		String string_literal122 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:846:3: ( ^( I_STATEMENT_FORMAT21c_STRING INSTRUCTION_FORMAT21c_STRING REGISTER string_literal ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:847:5: ^( I_STATEMENT_FORMAT21c_STRING INSTRUCTION_FORMAT21c_STRING REGISTER string_literal )
+			// smaliTreeWalker.g:846:3: ( ^( I_STATEMENT_FORMAT21c_STRING INSTRUCTION_FORMAT21c_STRING REGISTER string_literal ) )
+			// smaliTreeWalker.g:847:5: ^( I_STATEMENT_FORMAT21c_STRING INSTRUCTION_FORMAT21c_STRING REGISTER string_literal )
 			{
-			match(input,I_STATEMENT_FORMAT21c_STRING,FOLLOW_I_STATEMENT_FORMAT21c_STRING_in_insn_format21c_string2274);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT21c_STRING120=(CommonTree)match(input,INSTRUCTION_FORMAT21c_STRING,FOLLOW_INSTRUCTION_FORMAT21c_STRING_in_insn_format21c_string2276);
-			REGISTER121=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_string2278);
+			match(input,I_STATEMENT_FORMAT21c_STRING,FOLLOW_I_STATEMENT_FORMAT21c_STRING_in_insn_format21c_string2274); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT21c_STRING120=(CommonTree)match(input,INSTRUCTION_FORMAT21c_STRING,FOLLOW_INSTRUCTION_FORMAT21c_STRING_in_insn_format21c_string2276); 
+			REGISTER121=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_string2278); 
 			pushFollow(FOLLOW_string_literal_in_insn_format21c_string2280);
 			string_literal122=string_literal();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT21c_STRING120!=null?INSTRUCTION_FORMAT21c_STRING120.getText():null));
@@ -4941,7 +4941,7 @@
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction21c(opcode, regA,
 			              dexBuilder.internStringReference(string_literal122)));
-			
+			    
 			}
 
 		}
@@ -4958,25 +4958,25 @@
 
 
 	// $ANTLR start "insn_format21c_type"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:856:1: insn_format21c_type : ^( I_STATEMENT_FORMAT21c_TYPE INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) ;
+	// smaliTreeWalker.g:856:1: insn_format21c_type : ^( I_STATEMENT_FORMAT21c_TYPE INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) ;
 	public final void insn_format21c_type() throws RecognitionException {
 		CommonTree INSTRUCTION_FORMAT21c_TYPE123=null;
 		CommonTree REGISTER124=null;
 		TreeRuleReturnScope nonvoid_type_descriptor125 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:857:3: ( ^( I_STATEMENT_FORMAT21c_TYPE INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:858:5: ^( I_STATEMENT_FORMAT21c_TYPE INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor )
+			// smaliTreeWalker.g:857:3: ( ^( I_STATEMENT_FORMAT21c_TYPE INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor ) )
+			// smaliTreeWalker.g:858:5: ^( I_STATEMENT_FORMAT21c_TYPE INSTRUCTION_FORMAT21c_TYPE REGISTER nonvoid_type_descriptor )
 			{
-			match(input,I_STATEMENT_FORMAT21c_TYPE,FOLLOW_I_STATEMENT_FORMAT21c_TYPE_in_insn_format21c_type2303);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT21c_TYPE123=(CommonTree)match(input,INSTRUCTION_FORMAT21c_TYPE,FOLLOW_INSTRUCTION_FORMAT21c_TYPE_in_insn_format21c_type2305);
-			REGISTER124=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_type2307);
+			match(input,I_STATEMENT_FORMAT21c_TYPE,FOLLOW_I_STATEMENT_FORMAT21c_TYPE_in_insn_format21c_type2303); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT21c_TYPE123=(CommonTree)match(input,INSTRUCTION_FORMAT21c_TYPE,FOLLOW_INSTRUCTION_FORMAT21c_TYPE_in_insn_format21c_type2305); 
+			REGISTER124=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21c_type2307); 
 			pushFollow(FOLLOW_nonvoid_type_descriptor_in_insn_format21c_type2309);
 			nonvoid_type_descriptor125=nonvoid_type_descriptor();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT21c_TYPE123!=null?INSTRUCTION_FORMAT21c_TYPE123.getText():null));
@@ -4984,7 +4984,7 @@
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction21c(opcode, regA,
 			              dexBuilder.internTypeReference((nonvoid_type_descriptor125!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor125).type:null))));
-			
+			    
 			}
 
 		}
@@ -5001,25 +5001,25 @@
 
 
 	// $ANTLR start "insn_format21ih"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:867:1: insn_format21ih : ^( I_STATEMENT_FORMAT21ih INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) ;
+	// smaliTreeWalker.g:867:1: insn_format21ih : ^( I_STATEMENT_FORMAT21ih INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) ;
 	public final void insn_format21ih() throws RecognitionException {
 		CommonTree INSTRUCTION_FORMAT21ih126=null;
 		CommonTree REGISTER127=null;
 		int fixed_32bit_literal128 =0;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:868:3: ( ^( I_STATEMENT_FORMAT21ih INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:869:5: ^( I_STATEMENT_FORMAT21ih INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal )
+			// smaliTreeWalker.g:868:3: ( ^( I_STATEMENT_FORMAT21ih INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal ) )
+			// smaliTreeWalker.g:869:5: ^( I_STATEMENT_FORMAT21ih INSTRUCTION_FORMAT21ih REGISTER fixed_32bit_literal )
 			{
-			match(input,I_STATEMENT_FORMAT21ih,FOLLOW_I_STATEMENT_FORMAT21ih_in_insn_format21ih2332);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT21ih126=(CommonTree)match(input,INSTRUCTION_FORMAT21ih,FOLLOW_INSTRUCTION_FORMAT21ih_in_insn_format21ih2334);
-			REGISTER127=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21ih2336);
+			match(input,I_STATEMENT_FORMAT21ih,FOLLOW_I_STATEMENT_FORMAT21ih_in_insn_format21ih2332); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT21ih126=(CommonTree)match(input,INSTRUCTION_FORMAT21ih,FOLLOW_INSTRUCTION_FORMAT21ih_in_insn_format21ih2334); 
+			REGISTER127=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21ih2336); 
 			pushFollow(FOLLOW_fixed_32bit_literal_in_insn_format21ih2338);
 			fixed_32bit_literal128=fixed_32bit_literal();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT21ih126!=null?INSTRUCTION_FORMAT21ih126.getText():null));
@@ -5028,7 +5028,7 @@
 			      int litB = fixed_32bit_literal128;
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction21ih(opcode, regA, litB));
-			
+			    
 			}
 
 		}
@@ -5045,25 +5045,25 @@
 
 
 	// $ANTLR start "insn_format21lh"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:879:1: insn_format21lh : ^( I_STATEMENT_FORMAT21lh INSTRUCTION_FORMAT21lh REGISTER fixed_64bit_literal ) ;
+	// smaliTreeWalker.g:879:1: insn_format21lh : ^( I_STATEMENT_FORMAT21lh INSTRUCTION_FORMAT21lh REGISTER fixed_64bit_literal ) ;
 	public final void insn_format21lh() throws RecognitionException {
 		CommonTree INSTRUCTION_FORMAT21lh129=null;
 		CommonTree REGISTER130=null;
 		long fixed_64bit_literal131 =0;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:880:3: ( ^( I_STATEMENT_FORMAT21lh INSTRUCTION_FORMAT21lh REGISTER fixed_64bit_literal ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:881:5: ^( I_STATEMENT_FORMAT21lh INSTRUCTION_FORMAT21lh REGISTER fixed_64bit_literal )
+			// smaliTreeWalker.g:880:3: ( ^( I_STATEMENT_FORMAT21lh INSTRUCTION_FORMAT21lh REGISTER fixed_64bit_literal ) )
+			// smaliTreeWalker.g:881:5: ^( I_STATEMENT_FORMAT21lh INSTRUCTION_FORMAT21lh REGISTER fixed_64bit_literal )
 			{
-			match(input,I_STATEMENT_FORMAT21lh,FOLLOW_I_STATEMENT_FORMAT21lh_in_insn_format21lh2361);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT21lh129=(CommonTree)match(input,INSTRUCTION_FORMAT21lh,FOLLOW_INSTRUCTION_FORMAT21lh_in_insn_format21lh2363);
-			REGISTER130=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21lh2365);
+			match(input,I_STATEMENT_FORMAT21lh,FOLLOW_I_STATEMENT_FORMAT21lh_in_insn_format21lh2361); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT21lh129=(CommonTree)match(input,INSTRUCTION_FORMAT21lh,FOLLOW_INSTRUCTION_FORMAT21lh_in_insn_format21lh2363); 
+			REGISTER130=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21lh2365); 
 			pushFollow(FOLLOW_fixed_64bit_literal_in_insn_format21lh2367);
 			fixed_64bit_literal131=fixed_64bit_literal();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT21lh129!=null?INSTRUCTION_FORMAT21lh129.getText():null));
@@ -5072,7 +5072,7 @@
 			      long litB = fixed_64bit_literal131;
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction21lh(opcode, regA, litB));
-			
+			    
 			}
 
 		}
@@ -5089,25 +5089,25 @@
 
 
 	// $ANTLR start "insn_format21s"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:891:1: insn_format21s : ^( I_STATEMENT_FORMAT21s INSTRUCTION_FORMAT21s REGISTER short_integral_literal ) ;
+	// smaliTreeWalker.g:891:1: insn_format21s : ^( I_STATEMENT_FORMAT21s INSTRUCTION_FORMAT21s REGISTER short_integral_literal ) ;
 	public final void insn_format21s() throws RecognitionException {
 		CommonTree INSTRUCTION_FORMAT21s132=null;
 		CommonTree REGISTER133=null;
 		short short_integral_literal134 =0;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:892:3: ( ^( I_STATEMENT_FORMAT21s INSTRUCTION_FORMAT21s REGISTER short_integral_literal ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:893:5: ^( I_STATEMENT_FORMAT21s INSTRUCTION_FORMAT21s REGISTER short_integral_literal )
+			// smaliTreeWalker.g:892:3: ( ^( I_STATEMENT_FORMAT21s INSTRUCTION_FORMAT21s REGISTER short_integral_literal ) )
+			// smaliTreeWalker.g:893:5: ^( I_STATEMENT_FORMAT21s INSTRUCTION_FORMAT21s REGISTER short_integral_literal )
 			{
-			match(input,I_STATEMENT_FORMAT21s,FOLLOW_I_STATEMENT_FORMAT21s_in_insn_format21s2390);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT21s132=(CommonTree)match(input,INSTRUCTION_FORMAT21s,FOLLOW_INSTRUCTION_FORMAT21s_in_insn_format21s2392);
-			REGISTER133=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21s2394);
+			match(input,I_STATEMENT_FORMAT21s,FOLLOW_I_STATEMENT_FORMAT21s_in_insn_format21s2390); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT21s132=(CommonTree)match(input,INSTRUCTION_FORMAT21s,FOLLOW_INSTRUCTION_FORMAT21s_in_insn_format21s2392); 
+			REGISTER133=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21s2394); 
 			pushFollow(FOLLOW_short_integral_literal_in_insn_format21s2396);
 			short_integral_literal134=short_integral_literal();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT21s132!=null?INSTRUCTION_FORMAT21s132.getText():null));
@@ -5116,7 +5116,7 @@
 			      short litB = short_integral_literal134;
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction21s(opcode, regA, litB));
-			
+			    
 			}
 
 		}
@@ -5133,32 +5133,32 @@
 
 
 	// $ANTLR start "insn_format21t"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:903:1: insn_format21t : ^( I_STATEMENT_FORMAT21t INSTRUCTION_FORMAT21t REGISTER label_ref ) ;
+	// smaliTreeWalker.g:903:1: insn_format21t : ^( I_STATEMENT_FORMAT21t INSTRUCTION_FORMAT21t REGISTER label_ref ) ;
 	public final void insn_format21t() throws RecognitionException {
 		CommonTree INSTRUCTION_FORMAT21t135=null;
 		CommonTree REGISTER136=null;
 		Label label_ref137 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:904:3: ( ^( I_STATEMENT_FORMAT21t INSTRUCTION_FORMAT21t REGISTER label_ref ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:905:5: ^( I_STATEMENT_FORMAT21t INSTRUCTION_FORMAT21t REGISTER label_ref )
+			// smaliTreeWalker.g:904:3: ( ^( I_STATEMENT_FORMAT21t INSTRUCTION_FORMAT21t REGISTER label_ref ) )
+			// smaliTreeWalker.g:905:5: ^( I_STATEMENT_FORMAT21t INSTRUCTION_FORMAT21t REGISTER label_ref )
 			{
-			match(input,I_STATEMENT_FORMAT21t,FOLLOW_I_STATEMENT_FORMAT21t_in_insn_format21t2419);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT21t135=(CommonTree)match(input,INSTRUCTION_FORMAT21t,FOLLOW_INSTRUCTION_FORMAT21t_in_insn_format21t2421);
-			REGISTER136=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21t2423);
+			match(input,I_STATEMENT_FORMAT21t,FOLLOW_I_STATEMENT_FORMAT21t_in_insn_format21t2419); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT21t135=(CommonTree)match(input,INSTRUCTION_FORMAT21t,FOLLOW_INSTRUCTION_FORMAT21t_in_insn_format21t2421); 
+			REGISTER136=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format21t2423); 
 			pushFollow(FOLLOW_label_ref_in_insn_format21t2425);
 			label_ref137=label_ref();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT21t135!=null?INSTRUCTION_FORMAT21t135.getText():null));
 			      short regA = parseRegister_byte((REGISTER136!=null?REGISTER136.getText():null));
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction21t(opcode, regA, label_ref137));
-			
+			    
 			}
 
 		}
@@ -5175,7 +5175,7 @@
 
 
 	// $ANTLR start "insn_format22b"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:913:1: insn_format22b : ^( I_STATEMENT_FORMAT22b INSTRUCTION_FORMAT22b registerA= REGISTER registerB= REGISTER short_integral_literal ) ;
+	// smaliTreeWalker.g:913:1: insn_format22b : ^( I_STATEMENT_FORMAT22b INSTRUCTION_FORMAT22b registerA= REGISTER registerB= REGISTER short_integral_literal ) ;
 	public final void insn_format22b() throws RecognitionException {
 		CommonTree registerA=null;
 		CommonTree registerB=null;
@@ -5183,19 +5183,19 @@
 		short short_integral_literal139 =0;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:914:3: ( ^( I_STATEMENT_FORMAT22b INSTRUCTION_FORMAT22b registerA= REGISTER registerB= REGISTER short_integral_literal ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:915:5: ^( I_STATEMENT_FORMAT22b INSTRUCTION_FORMAT22b registerA= REGISTER registerB= REGISTER short_integral_literal )
+			// smaliTreeWalker.g:914:3: ( ^( I_STATEMENT_FORMAT22b INSTRUCTION_FORMAT22b registerA= REGISTER registerB= REGISTER short_integral_literal ) )
+			// smaliTreeWalker.g:915:5: ^( I_STATEMENT_FORMAT22b INSTRUCTION_FORMAT22b registerA= REGISTER registerB= REGISTER short_integral_literal )
 			{
-			match(input,I_STATEMENT_FORMAT22b,FOLLOW_I_STATEMENT_FORMAT22b_in_insn_format22b2448);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT22b138=(CommonTree)match(input,INSTRUCTION_FORMAT22b,FOLLOW_INSTRUCTION_FORMAT22b_in_insn_format22b2450);
-			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22b2454);
-			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22b2458);
+			match(input,I_STATEMENT_FORMAT22b,FOLLOW_I_STATEMENT_FORMAT22b_in_insn_format22b2448); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT22b138=(CommonTree)match(input,INSTRUCTION_FORMAT22b,FOLLOW_INSTRUCTION_FORMAT22b_in_insn_format22b2450); 
+			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22b2454); 
+			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22b2458); 
 			pushFollow(FOLLOW_short_integral_literal_in_insn_format22b2460);
 			short_integral_literal139=short_integral_literal();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT22b138!=null?INSTRUCTION_FORMAT22b138.getText():null));
@@ -5206,7 +5206,7 @@
 			      LiteralTools.checkByte(litC);
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction22b(opcode, regA, regB, litC));
-			
+			    
 			}
 
 		}
@@ -5223,7 +5223,7 @@
 
 
 	// $ANTLR start "insn_format22c_field"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:927:1: insn_format22c_field : ^( I_STATEMENT_FORMAT22c_FIELD inst= ( INSTRUCTION_FORMAT22c_FIELD | INSTRUCTION_FORMAT22c_FIELD_ODEX ) registerA= REGISTER registerB= REGISTER field_reference ) ;
+	// smaliTreeWalker.g:927:1: insn_format22c_field : ^( I_STATEMENT_FORMAT22c_FIELD inst= ( INSTRUCTION_FORMAT22c_FIELD | INSTRUCTION_FORMAT22c_FIELD_ODEX ) registerA= REGISTER registerB= REGISTER field_reference ) ;
 	public final void insn_format22c_field() throws RecognitionException {
 		CommonTree inst=null;
 		CommonTree registerA=null;
@@ -5231,11 +5231,11 @@
 		ImmutableFieldReference field_reference140 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:928:3: ( ^( I_STATEMENT_FORMAT22c_FIELD inst= ( INSTRUCTION_FORMAT22c_FIELD | INSTRUCTION_FORMAT22c_FIELD_ODEX ) registerA= REGISTER registerB= REGISTER field_reference ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:929:5: ^( I_STATEMENT_FORMAT22c_FIELD inst= ( INSTRUCTION_FORMAT22c_FIELD | INSTRUCTION_FORMAT22c_FIELD_ODEX ) registerA= REGISTER registerB= REGISTER field_reference )
+			// smaliTreeWalker.g:928:3: ( ^( I_STATEMENT_FORMAT22c_FIELD inst= ( INSTRUCTION_FORMAT22c_FIELD | INSTRUCTION_FORMAT22c_FIELD_ODEX ) registerA= REGISTER registerB= REGISTER field_reference ) )
+			// smaliTreeWalker.g:929:5: ^( I_STATEMENT_FORMAT22c_FIELD inst= ( INSTRUCTION_FORMAT22c_FIELD | INSTRUCTION_FORMAT22c_FIELD_ODEX ) registerA= REGISTER registerB= REGISTER field_reference )
 			{
-			match(input,I_STATEMENT_FORMAT22c_FIELD,FOLLOW_I_STATEMENT_FORMAT22c_FIELD_in_insn_format22c_field2483);
-			match(input, Token.DOWN, null);
+			match(input,I_STATEMENT_FORMAT22c_FIELD,FOLLOW_I_STATEMENT_FORMAT22c_FIELD_in_insn_format22c_field2483); 
+			match(input, Token.DOWN, null); 
 			inst=(CommonTree)input.LT(1);
 			if ( (input.LA(1) >= INSTRUCTION_FORMAT22c_FIELD && input.LA(1) <= INSTRUCTION_FORMAT22c_FIELD_ODEX) ) {
 				input.consume();
@@ -5245,13 +5245,13 @@
 				MismatchedSetException mse = new MismatchedSetException(null,input);
 				throw mse;
 			}
-			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field2497);
-			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field2501);
+			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field2497); 
+			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_field2501); 
 			pushFollow(FOLLOW_field_reference_in_insn_format22c_field2503);
 			field_reference140=field_reference();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((inst!=null?inst.getText():null));
@@ -5262,7 +5262,7 @@
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction22c(opcode, regA, regB,
 			              dexBuilder.internFieldReference(fieldReference)));
-			
+			    
 			}
 
 		}
@@ -5279,7 +5279,7 @@
 
 
 	// $ANTLR start "insn_format22c_type"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:941:1: insn_format22c_type : ^( I_STATEMENT_FORMAT22c_TYPE INSTRUCTION_FORMAT22c_TYPE registerA= REGISTER registerB= REGISTER nonvoid_type_descriptor ) ;
+	// smaliTreeWalker.g:941:1: insn_format22c_type : ^( I_STATEMENT_FORMAT22c_TYPE INSTRUCTION_FORMAT22c_TYPE registerA= REGISTER registerB= REGISTER nonvoid_type_descriptor ) ;
 	public final void insn_format22c_type() throws RecognitionException {
 		CommonTree registerA=null;
 		CommonTree registerB=null;
@@ -5287,19 +5287,19 @@
 		TreeRuleReturnScope nonvoid_type_descriptor142 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:942:3: ( ^( I_STATEMENT_FORMAT22c_TYPE INSTRUCTION_FORMAT22c_TYPE registerA= REGISTER registerB= REGISTER nonvoid_type_descriptor ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:943:5: ^( I_STATEMENT_FORMAT22c_TYPE INSTRUCTION_FORMAT22c_TYPE registerA= REGISTER registerB= REGISTER nonvoid_type_descriptor )
+			// smaliTreeWalker.g:942:3: ( ^( I_STATEMENT_FORMAT22c_TYPE INSTRUCTION_FORMAT22c_TYPE registerA= REGISTER registerB= REGISTER nonvoid_type_descriptor ) )
+			// smaliTreeWalker.g:943:5: ^( I_STATEMENT_FORMAT22c_TYPE INSTRUCTION_FORMAT22c_TYPE registerA= REGISTER registerB= REGISTER nonvoid_type_descriptor )
 			{
-			match(input,I_STATEMENT_FORMAT22c_TYPE,FOLLOW_I_STATEMENT_FORMAT22c_TYPE_in_insn_format22c_type2526);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT22c_TYPE141=(CommonTree)match(input,INSTRUCTION_FORMAT22c_TYPE,FOLLOW_INSTRUCTION_FORMAT22c_TYPE_in_insn_format22c_type2528);
-			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_type2532);
-			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_type2536);
+			match(input,I_STATEMENT_FORMAT22c_TYPE,FOLLOW_I_STATEMENT_FORMAT22c_TYPE_in_insn_format22c_type2526); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT22c_TYPE141=(CommonTree)match(input,INSTRUCTION_FORMAT22c_TYPE,FOLLOW_INSTRUCTION_FORMAT22c_TYPE_in_insn_format22c_type2528); 
+			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_type2532); 
+			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22c_type2536); 
 			pushFollow(FOLLOW_nonvoid_type_descriptor_in_insn_format22c_type2538);
 			nonvoid_type_descriptor142=nonvoid_type_descriptor();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT22c_TYPE141!=null?INSTRUCTION_FORMAT22c_TYPE141.getText():null));
@@ -5308,7 +5308,7 @@
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction22c(opcode, regA, regB,
 			              dexBuilder.internTypeReference((nonvoid_type_descriptor142!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor142).type:null))));
-			
+			    
 			}
 
 		}
@@ -5325,7 +5325,7 @@
 
 
 	// $ANTLR start "insn_format22s"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:953:1: insn_format22s : ^( I_STATEMENT_FORMAT22s INSTRUCTION_FORMAT22s registerA= REGISTER registerB= REGISTER short_integral_literal ) ;
+	// smaliTreeWalker.g:953:1: insn_format22s : ^( I_STATEMENT_FORMAT22s INSTRUCTION_FORMAT22s registerA= REGISTER registerB= REGISTER short_integral_literal ) ;
 	public final void insn_format22s() throws RecognitionException {
 		CommonTree registerA=null;
 		CommonTree registerB=null;
@@ -5333,19 +5333,19 @@
 		short short_integral_literal144 =0;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:954:3: ( ^( I_STATEMENT_FORMAT22s INSTRUCTION_FORMAT22s registerA= REGISTER registerB= REGISTER short_integral_literal ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:955:5: ^( I_STATEMENT_FORMAT22s INSTRUCTION_FORMAT22s registerA= REGISTER registerB= REGISTER short_integral_literal )
+			// smaliTreeWalker.g:954:3: ( ^( I_STATEMENT_FORMAT22s INSTRUCTION_FORMAT22s registerA= REGISTER registerB= REGISTER short_integral_literal ) )
+			// smaliTreeWalker.g:955:5: ^( I_STATEMENT_FORMAT22s INSTRUCTION_FORMAT22s registerA= REGISTER registerB= REGISTER short_integral_literal )
 			{
-			match(input,I_STATEMENT_FORMAT22s,FOLLOW_I_STATEMENT_FORMAT22s_in_insn_format22s2561);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT22s143=(CommonTree)match(input,INSTRUCTION_FORMAT22s,FOLLOW_INSTRUCTION_FORMAT22s_in_insn_format22s2563);
-			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22s2567);
-			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22s2571);
+			match(input,I_STATEMENT_FORMAT22s,FOLLOW_I_STATEMENT_FORMAT22s_in_insn_format22s2561); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT22s143=(CommonTree)match(input,INSTRUCTION_FORMAT22s,FOLLOW_INSTRUCTION_FORMAT22s_in_insn_format22s2563); 
+			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22s2567); 
+			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22s2571); 
 			pushFollow(FOLLOW_short_integral_literal_in_insn_format22s2573);
 			short_integral_literal144=short_integral_literal();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT22s143!=null?INSTRUCTION_FORMAT22s143.getText():null));
@@ -5355,7 +5355,7 @@
 			      short litC = short_integral_literal144;
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction22s(opcode, regA, regB, litC));
-			
+			    
 			}
 
 		}
@@ -5372,7 +5372,7 @@
 
 
 	// $ANTLR start "insn_format22t"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:966:1: insn_format22t : ^( I_STATEMENT_FORMAT22t INSTRUCTION_FORMAT22t registerA= REGISTER registerB= REGISTER label_ref ) ;
+	// smaliTreeWalker.g:966:1: insn_format22t : ^( I_STATEMENT_FORMAT22t INSTRUCTION_FORMAT22t registerA= REGISTER registerB= REGISTER label_ref ) ;
 	public final void insn_format22t() throws RecognitionException {
 		CommonTree registerA=null;
 		CommonTree registerB=null;
@@ -5380,19 +5380,19 @@
 		Label label_ref146 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:967:3: ( ^( I_STATEMENT_FORMAT22t INSTRUCTION_FORMAT22t registerA= REGISTER registerB= REGISTER label_ref ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:968:5: ^( I_STATEMENT_FORMAT22t INSTRUCTION_FORMAT22t registerA= REGISTER registerB= REGISTER label_ref )
+			// smaliTreeWalker.g:967:3: ( ^( I_STATEMENT_FORMAT22t INSTRUCTION_FORMAT22t registerA= REGISTER registerB= REGISTER label_ref ) )
+			// smaliTreeWalker.g:968:5: ^( I_STATEMENT_FORMAT22t INSTRUCTION_FORMAT22t registerA= REGISTER registerB= REGISTER label_ref )
 			{
-			match(input,I_STATEMENT_FORMAT22t,FOLLOW_I_STATEMENT_FORMAT22t_in_insn_format22t2596);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT22t145=(CommonTree)match(input,INSTRUCTION_FORMAT22t,FOLLOW_INSTRUCTION_FORMAT22t_in_insn_format22t2598);
-			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22t2602);
-			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22t2606);
+			match(input,I_STATEMENT_FORMAT22t,FOLLOW_I_STATEMENT_FORMAT22t_in_insn_format22t2596); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT22t145=(CommonTree)match(input,INSTRUCTION_FORMAT22t,FOLLOW_INSTRUCTION_FORMAT22t_in_insn_format22t2598); 
+			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22t2602); 
+			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22t2606); 
 			pushFollow(FOLLOW_label_ref_in_insn_format22t2608);
 			label_ref146=label_ref();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT22t145!=null?INSTRUCTION_FORMAT22t145.getText():null));
@@ -5400,7 +5400,7 @@
 			      byte regB = parseRegister_nibble((registerB!=null?registerB.getText():null));
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction22t(opcode, regA, regB, label_ref146));
-			
+			    
 			}
 
 		}
@@ -5417,22 +5417,22 @@
 
 
 	// $ANTLR start "insn_format22x"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:977:1: insn_format22x : ^( I_STATEMENT_FORMAT22x INSTRUCTION_FORMAT22x registerA= REGISTER registerB= REGISTER ) ;
+	// smaliTreeWalker.g:977:1: insn_format22x : ^( I_STATEMENT_FORMAT22x INSTRUCTION_FORMAT22x registerA= REGISTER registerB= REGISTER ) ;
 	public final void insn_format22x() throws RecognitionException {
 		CommonTree registerA=null;
 		CommonTree registerB=null;
 		CommonTree INSTRUCTION_FORMAT22x147=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:978:3: ( ^( I_STATEMENT_FORMAT22x INSTRUCTION_FORMAT22x registerA= REGISTER registerB= REGISTER ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:979:5: ^( I_STATEMENT_FORMAT22x INSTRUCTION_FORMAT22x registerA= REGISTER registerB= REGISTER )
+			// smaliTreeWalker.g:978:3: ( ^( I_STATEMENT_FORMAT22x INSTRUCTION_FORMAT22x registerA= REGISTER registerB= REGISTER ) )
+			// smaliTreeWalker.g:979:5: ^( I_STATEMENT_FORMAT22x INSTRUCTION_FORMAT22x registerA= REGISTER registerB= REGISTER )
 			{
-			match(input,I_STATEMENT_FORMAT22x,FOLLOW_I_STATEMENT_FORMAT22x_in_insn_format22x2631);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT22x147=(CommonTree)match(input,INSTRUCTION_FORMAT22x,FOLLOW_INSTRUCTION_FORMAT22x_in_insn_format22x2633);
-			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22x2637);
-			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22x2641);
-			match(input, Token.UP, null);
+			match(input,I_STATEMENT_FORMAT22x,FOLLOW_I_STATEMENT_FORMAT22x_in_insn_format22x2631); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT22x147=(CommonTree)match(input,INSTRUCTION_FORMAT22x,FOLLOW_INSTRUCTION_FORMAT22x_in_insn_format22x2633); 
+			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22x2637); 
+			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format22x2641); 
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT22x147!=null?INSTRUCTION_FORMAT22x147.getText():null));
@@ -5440,7 +5440,7 @@
 			      int regB = parseRegister_short((registerB!=null?registerB.getText():null));
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction22x(opcode, regA, regB));
-			
+			    
 			}
 
 		}
@@ -5457,7 +5457,7 @@
 
 
 	// $ANTLR start "insn_format23x"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:988:1: insn_format23x : ^( I_STATEMENT_FORMAT23x INSTRUCTION_FORMAT23x registerA= REGISTER registerB= REGISTER registerC= REGISTER ) ;
+	// smaliTreeWalker.g:988:1: insn_format23x : ^( I_STATEMENT_FORMAT23x INSTRUCTION_FORMAT23x registerA= REGISTER registerB= REGISTER registerC= REGISTER ) ;
 	public final void insn_format23x() throws RecognitionException {
 		CommonTree registerA=null;
 		CommonTree registerB=null;
@@ -5465,16 +5465,16 @@
 		CommonTree INSTRUCTION_FORMAT23x148=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:989:3: ( ^( I_STATEMENT_FORMAT23x INSTRUCTION_FORMAT23x registerA= REGISTER registerB= REGISTER registerC= REGISTER ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:990:5: ^( I_STATEMENT_FORMAT23x INSTRUCTION_FORMAT23x registerA= REGISTER registerB= REGISTER registerC= REGISTER )
+			// smaliTreeWalker.g:989:3: ( ^( I_STATEMENT_FORMAT23x INSTRUCTION_FORMAT23x registerA= REGISTER registerB= REGISTER registerC= REGISTER ) )
+			// smaliTreeWalker.g:990:5: ^( I_STATEMENT_FORMAT23x INSTRUCTION_FORMAT23x registerA= REGISTER registerB= REGISTER registerC= REGISTER )
 			{
-			match(input,I_STATEMENT_FORMAT23x,FOLLOW_I_STATEMENT_FORMAT23x_in_insn_format23x2664);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT23x148=(CommonTree)match(input,INSTRUCTION_FORMAT23x,FOLLOW_INSTRUCTION_FORMAT23x_in_insn_format23x2666);
-			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x2670);
-			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x2674);
-			registerC=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x2678);
-			match(input, Token.UP, null);
+			match(input,I_STATEMENT_FORMAT23x,FOLLOW_I_STATEMENT_FORMAT23x_in_insn_format23x2664); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT23x148=(CommonTree)match(input,INSTRUCTION_FORMAT23x,FOLLOW_INSTRUCTION_FORMAT23x_in_insn_format23x2666); 
+			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x2670); 
+			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x2674); 
+			registerC=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format23x2678); 
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT23x148!=null?INSTRUCTION_FORMAT23x148.getText():null));
@@ -5483,7 +5483,7 @@
 			      short regC = parseRegister_byte((registerC!=null?registerC.getText():null));
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction23x(opcode, regA, regB, regC));
-			
+			    
 			}
 
 		}
@@ -5500,29 +5500,29 @@
 
 
 	// $ANTLR start "insn_format30t"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1000:1: insn_format30t : ^( I_STATEMENT_FORMAT30t INSTRUCTION_FORMAT30t label_ref ) ;
+	// smaliTreeWalker.g:1000:1: insn_format30t : ^( I_STATEMENT_FORMAT30t INSTRUCTION_FORMAT30t label_ref ) ;
 	public final void insn_format30t() throws RecognitionException {
 		CommonTree INSTRUCTION_FORMAT30t149=null;
 		Label label_ref150 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1001:3: ( ^( I_STATEMENT_FORMAT30t INSTRUCTION_FORMAT30t label_ref ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1002:5: ^( I_STATEMENT_FORMAT30t INSTRUCTION_FORMAT30t label_ref )
+			// smaliTreeWalker.g:1001:3: ( ^( I_STATEMENT_FORMAT30t INSTRUCTION_FORMAT30t label_ref ) )
+			// smaliTreeWalker.g:1002:5: ^( I_STATEMENT_FORMAT30t INSTRUCTION_FORMAT30t label_ref )
 			{
-			match(input,I_STATEMENT_FORMAT30t,FOLLOW_I_STATEMENT_FORMAT30t_in_insn_format30t2701);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT30t149=(CommonTree)match(input,INSTRUCTION_FORMAT30t,FOLLOW_INSTRUCTION_FORMAT30t_in_insn_format30t2703);
+			match(input,I_STATEMENT_FORMAT30t,FOLLOW_I_STATEMENT_FORMAT30t_in_insn_format30t2701); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT30t149=(CommonTree)match(input,INSTRUCTION_FORMAT30t,FOLLOW_INSTRUCTION_FORMAT30t_in_insn_format30t2703); 
 			pushFollow(FOLLOW_label_ref_in_insn_format30t2705);
 			label_ref150=label_ref();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT30t149!=null?INSTRUCTION_FORMAT30t149.getText():null));
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction30t(opcode, label_ref150));
-			
+			    
 			}
 
 		}
@@ -5539,25 +5539,25 @@
 
 
 	// $ANTLR start "insn_format31c"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1009:1: insn_format31c : ^( I_STATEMENT_FORMAT31c INSTRUCTION_FORMAT31c REGISTER string_literal ) ;
+	// smaliTreeWalker.g:1009:1: insn_format31c : ^( I_STATEMENT_FORMAT31c INSTRUCTION_FORMAT31c REGISTER string_literal ) ;
 	public final void insn_format31c() throws RecognitionException {
 		CommonTree INSTRUCTION_FORMAT31c151=null;
 		CommonTree REGISTER152=null;
 		String string_literal153 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1010:3: ( ^( I_STATEMENT_FORMAT31c INSTRUCTION_FORMAT31c REGISTER string_literal ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1011:5: ^( I_STATEMENT_FORMAT31c INSTRUCTION_FORMAT31c REGISTER string_literal )
+			// smaliTreeWalker.g:1010:3: ( ^( I_STATEMENT_FORMAT31c INSTRUCTION_FORMAT31c REGISTER string_literal ) )
+			// smaliTreeWalker.g:1011:5: ^( I_STATEMENT_FORMAT31c INSTRUCTION_FORMAT31c REGISTER string_literal )
 			{
-			match(input,I_STATEMENT_FORMAT31c,FOLLOW_I_STATEMENT_FORMAT31c_in_insn_format31c2728);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT31c151=(CommonTree)match(input,INSTRUCTION_FORMAT31c,FOLLOW_INSTRUCTION_FORMAT31c_in_insn_format31c2730);
-			REGISTER152=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31c2732);
+			match(input,I_STATEMENT_FORMAT31c,FOLLOW_I_STATEMENT_FORMAT31c_in_insn_format31c2728); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT31c151=(CommonTree)match(input,INSTRUCTION_FORMAT31c,FOLLOW_INSTRUCTION_FORMAT31c_in_insn_format31c2730); 
+			REGISTER152=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31c2732); 
 			pushFollow(FOLLOW_string_literal_in_insn_format31c2734);
 			string_literal153=string_literal();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT31c151!=null?INSTRUCTION_FORMAT31c151.getText():null));
@@ -5565,7 +5565,7 @@
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction31c(opcode, regA,
 			              dexBuilder.internStringReference(string_literal153)));
-			
+			    
 			}
 
 		}
@@ -5582,25 +5582,25 @@
 
 
 	// $ANTLR start "insn_format31i"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1020:1: insn_format31i : ^( I_STATEMENT_FORMAT31i INSTRUCTION_FORMAT31i REGISTER fixed_32bit_literal ) ;
+	// smaliTreeWalker.g:1020:1: insn_format31i : ^( I_STATEMENT_FORMAT31i INSTRUCTION_FORMAT31i REGISTER fixed_32bit_literal ) ;
 	public final void insn_format31i() throws RecognitionException {
 		CommonTree INSTRUCTION_FORMAT31i154=null;
 		CommonTree REGISTER155=null;
 		int fixed_32bit_literal156 =0;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1021:3: ( ^( I_STATEMENT_FORMAT31i INSTRUCTION_FORMAT31i REGISTER fixed_32bit_literal ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1022:5: ^( I_STATEMENT_FORMAT31i INSTRUCTION_FORMAT31i REGISTER fixed_32bit_literal )
+			// smaliTreeWalker.g:1021:3: ( ^( I_STATEMENT_FORMAT31i INSTRUCTION_FORMAT31i REGISTER fixed_32bit_literal ) )
+			// smaliTreeWalker.g:1022:5: ^( I_STATEMENT_FORMAT31i INSTRUCTION_FORMAT31i REGISTER fixed_32bit_literal )
 			{
-			match(input,I_STATEMENT_FORMAT31i,FOLLOW_I_STATEMENT_FORMAT31i_in_insn_format31i2757);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT31i154=(CommonTree)match(input,INSTRUCTION_FORMAT31i,FOLLOW_INSTRUCTION_FORMAT31i_in_insn_format31i2759);
-			REGISTER155=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31i2761);
+			match(input,I_STATEMENT_FORMAT31i,FOLLOW_I_STATEMENT_FORMAT31i_in_insn_format31i2757); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT31i154=(CommonTree)match(input,INSTRUCTION_FORMAT31i,FOLLOW_INSTRUCTION_FORMAT31i_in_insn_format31i2759); 
+			REGISTER155=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31i2761); 
 			pushFollow(FOLLOW_fixed_32bit_literal_in_insn_format31i2763);
 			fixed_32bit_literal156=fixed_32bit_literal();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT31i154!=null?INSTRUCTION_FORMAT31i154.getText():null));
@@ -5609,7 +5609,7 @@
 			      int litB = fixed_32bit_literal156;
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction31i(opcode, regA, litB));
-			
+			    
 			}
 
 		}
@@ -5626,25 +5626,25 @@
 
 
 	// $ANTLR start "insn_format31t"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1032:1: insn_format31t : ^( I_STATEMENT_FORMAT31t INSTRUCTION_FORMAT31t REGISTER label_ref ) ;
+	// smaliTreeWalker.g:1032:1: insn_format31t : ^( I_STATEMENT_FORMAT31t INSTRUCTION_FORMAT31t REGISTER label_ref ) ;
 	public final void insn_format31t() throws RecognitionException {
 		CommonTree INSTRUCTION_FORMAT31t157=null;
 		CommonTree REGISTER158=null;
 		Label label_ref159 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1033:3: ( ^( I_STATEMENT_FORMAT31t INSTRUCTION_FORMAT31t REGISTER label_ref ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1034:5: ^( I_STATEMENT_FORMAT31t INSTRUCTION_FORMAT31t REGISTER label_ref )
+			// smaliTreeWalker.g:1033:3: ( ^( I_STATEMENT_FORMAT31t INSTRUCTION_FORMAT31t REGISTER label_ref ) )
+			// smaliTreeWalker.g:1034:5: ^( I_STATEMENT_FORMAT31t INSTRUCTION_FORMAT31t REGISTER label_ref )
 			{
-			match(input,I_STATEMENT_FORMAT31t,FOLLOW_I_STATEMENT_FORMAT31t_in_insn_format31t2786);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT31t157=(CommonTree)match(input,INSTRUCTION_FORMAT31t,FOLLOW_INSTRUCTION_FORMAT31t_in_insn_format31t2788);
-			REGISTER158=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31t2790);
+			match(input,I_STATEMENT_FORMAT31t,FOLLOW_I_STATEMENT_FORMAT31t_in_insn_format31t2786); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT31t157=(CommonTree)match(input,INSTRUCTION_FORMAT31t,FOLLOW_INSTRUCTION_FORMAT31t_in_insn_format31t2788); 
+			REGISTER158=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format31t2790); 
 			pushFollow(FOLLOW_label_ref_in_insn_format31t2792);
 			label_ref159=label_ref();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT31t157!=null?INSTRUCTION_FORMAT31t157.getText():null));
@@ -5652,7 +5652,7 @@
 			      short regA = parseRegister_byte((REGISTER158!=null?REGISTER158.getText():null));
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction31t(opcode, regA, label_ref159));
-			
+			    
 			}
 
 		}
@@ -5669,22 +5669,22 @@
 
 
 	// $ANTLR start "insn_format32x"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1043:1: insn_format32x : ^( I_STATEMENT_FORMAT32x INSTRUCTION_FORMAT32x registerA= REGISTER registerB= REGISTER ) ;
+	// smaliTreeWalker.g:1043:1: insn_format32x : ^( I_STATEMENT_FORMAT32x INSTRUCTION_FORMAT32x registerA= REGISTER registerB= REGISTER ) ;
 	public final void insn_format32x() throws RecognitionException {
 		CommonTree registerA=null;
 		CommonTree registerB=null;
 		CommonTree INSTRUCTION_FORMAT32x160=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1044:3: ( ^( I_STATEMENT_FORMAT32x INSTRUCTION_FORMAT32x registerA= REGISTER registerB= REGISTER ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1045:5: ^( I_STATEMENT_FORMAT32x INSTRUCTION_FORMAT32x registerA= REGISTER registerB= REGISTER )
+			// smaliTreeWalker.g:1044:3: ( ^( I_STATEMENT_FORMAT32x INSTRUCTION_FORMAT32x registerA= REGISTER registerB= REGISTER ) )
+			// smaliTreeWalker.g:1045:5: ^( I_STATEMENT_FORMAT32x INSTRUCTION_FORMAT32x registerA= REGISTER registerB= REGISTER )
 			{
-			match(input,I_STATEMENT_FORMAT32x,FOLLOW_I_STATEMENT_FORMAT32x_in_insn_format32x2815);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT32x160=(CommonTree)match(input,INSTRUCTION_FORMAT32x,FOLLOW_INSTRUCTION_FORMAT32x_in_insn_format32x2817);
-			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format32x2821);
-			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format32x2825);
-			match(input, Token.UP, null);
+			match(input,I_STATEMENT_FORMAT32x,FOLLOW_I_STATEMENT_FORMAT32x_in_insn_format32x2815); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT32x160=(CommonTree)match(input,INSTRUCTION_FORMAT32x,FOLLOW_INSTRUCTION_FORMAT32x_in_insn_format32x2817); 
+			registerA=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format32x2821); 
+			registerB=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format32x2825); 
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT32x160!=null?INSTRUCTION_FORMAT32x160.getText():null));
@@ -5692,7 +5692,7 @@
 			      int regB = parseRegister_short((registerB!=null?registerB.getText():null));
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction32x(opcode, regA, regB));
-			
+			    
 			}
 
 		}
@@ -5709,19 +5709,19 @@
 
 
 	// $ANTLR start "insn_format35c_method"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1054:1: insn_format35c_method : ^( I_STATEMENT_FORMAT35c_METHOD INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) ;
+	// smaliTreeWalker.g:1054:1: insn_format35c_method : ^( I_STATEMENT_FORMAT35c_METHOD INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) ;
 	public final void insn_format35c_method() throws RecognitionException {
 		CommonTree INSTRUCTION_FORMAT35c_METHOD161=null;
 		TreeRuleReturnScope register_list162 =null;
 		ImmutableMethodReference method_reference163 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1055:3: ( ^( I_STATEMENT_FORMAT35c_METHOD INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1056:5: ^( I_STATEMENT_FORMAT35c_METHOD INSTRUCTION_FORMAT35c_METHOD register_list method_reference )
+			// smaliTreeWalker.g:1055:3: ( ^( I_STATEMENT_FORMAT35c_METHOD INSTRUCTION_FORMAT35c_METHOD register_list method_reference ) )
+			// smaliTreeWalker.g:1056:5: ^( I_STATEMENT_FORMAT35c_METHOD INSTRUCTION_FORMAT35c_METHOD register_list method_reference )
 			{
-			match(input,I_STATEMENT_FORMAT35c_METHOD,FOLLOW_I_STATEMENT_FORMAT35c_METHOD_in_insn_format35c_method2848);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT35c_METHOD161=(CommonTree)match(input,INSTRUCTION_FORMAT35c_METHOD,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_in_insn_format35c_method2850);
+			match(input,I_STATEMENT_FORMAT35c_METHOD,FOLLOW_I_STATEMENT_FORMAT35c_METHOD_in_insn_format35c_method2848); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT35c_METHOD161=(CommonTree)match(input,INSTRUCTION_FORMAT35c_METHOD,FOLLOW_INSTRUCTION_FORMAT35c_METHOD_in_insn_format35c_method2850); 
 			pushFollow(FOLLOW_register_list_in_insn_format35c_method2852);
 			register_list162=register_list();
 			state._fsp--;
@@ -5730,7 +5730,7 @@
 			method_reference163=method_reference();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT35c_METHOD161!=null?INSTRUCTION_FORMAT35c_METHOD161.getText():null));
@@ -5743,7 +5743,7 @@
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction35c(opcode, registerCount, registers[0], registers[1],
 			              registers[2], registers[3], registers[4], dexBuilder.internMethodReference(methodReference)));
-			
+			    
 			}
 
 		}
@@ -5760,19 +5760,19 @@
 
 
 	// $ANTLR start "insn_format35c_type"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1070:1: insn_format35c_type : ^( I_STATEMENT_FORMAT35c_TYPE INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) ;
+	// smaliTreeWalker.g:1070:1: insn_format35c_type : ^( I_STATEMENT_FORMAT35c_TYPE INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) ;
 	public final void insn_format35c_type() throws RecognitionException {
 		CommonTree INSTRUCTION_FORMAT35c_TYPE164=null;
 		TreeRuleReturnScope register_list165 =null;
 		TreeRuleReturnScope nonvoid_type_descriptor166 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1071:3: ( ^( I_STATEMENT_FORMAT35c_TYPE INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1072:5: ^( I_STATEMENT_FORMAT35c_TYPE INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor )
+			// smaliTreeWalker.g:1071:3: ( ^( I_STATEMENT_FORMAT35c_TYPE INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor ) )
+			// smaliTreeWalker.g:1072:5: ^( I_STATEMENT_FORMAT35c_TYPE INSTRUCTION_FORMAT35c_TYPE register_list nonvoid_type_descriptor )
 			{
-			match(input,I_STATEMENT_FORMAT35c_TYPE,FOLLOW_I_STATEMENT_FORMAT35c_TYPE_in_insn_format35c_type2877);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT35c_TYPE164=(CommonTree)match(input,INSTRUCTION_FORMAT35c_TYPE,FOLLOW_INSTRUCTION_FORMAT35c_TYPE_in_insn_format35c_type2879);
+			match(input,I_STATEMENT_FORMAT35c_TYPE,FOLLOW_I_STATEMENT_FORMAT35c_TYPE_in_insn_format35c_type2877); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT35c_TYPE164=(CommonTree)match(input,INSTRUCTION_FORMAT35c_TYPE,FOLLOW_INSTRUCTION_FORMAT35c_TYPE_in_insn_format35c_type2879); 
 			pushFollow(FOLLOW_register_list_in_insn_format35c_type2881);
 			register_list165=register_list();
 			state._fsp--;
@@ -5781,7 +5781,7 @@
 			nonvoid_type_descriptor166=nonvoid_type_descriptor();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT35c_TYPE164!=null?INSTRUCTION_FORMAT35c_TYPE164.getText():null));
@@ -5792,7 +5792,7 @@
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction35c(opcode, registerCount, registers[0], registers[1],
 			              registers[2], registers[3], registers[4], dexBuilder.internTypeReference((nonvoid_type_descriptor166!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor166).type:null))));
-			
+			    
 			}
 
 		}
@@ -5809,19 +5809,19 @@
 
 
 	// $ANTLR start "insn_format3rc_method"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1084:1: insn_format3rc_method : ^( I_STATEMENT_FORMAT3rc_METHOD INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) ;
+	// smaliTreeWalker.g:1084:1: insn_format3rc_method : ^( I_STATEMENT_FORMAT3rc_METHOD INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) ;
 	public final void insn_format3rc_method() throws RecognitionException {
 		CommonTree INSTRUCTION_FORMAT3rc_METHOD167=null;
 		TreeRuleReturnScope register_range168 =null;
 		ImmutableMethodReference method_reference169 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1085:3: ( ^( I_STATEMENT_FORMAT3rc_METHOD INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1086:5: ^( I_STATEMENT_FORMAT3rc_METHOD INSTRUCTION_FORMAT3rc_METHOD register_range method_reference )
+			// smaliTreeWalker.g:1085:3: ( ^( I_STATEMENT_FORMAT3rc_METHOD INSTRUCTION_FORMAT3rc_METHOD register_range method_reference ) )
+			// smaliTreeWalker.g:1086:5: ^( I_STATEMENT_FORMAT3rc_METHOD INSTRUCTION_FORMAT3rc_METHOD register_range method_reference )
 			{
-			match(input,I_STATEMENT_FORMAT3rc_METHOD,FOLLOW_I_STATEMENT_FORMAT3rc_METHOD_in_insn_format3rc_method2906);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT3rc_METHOD167=(CommonTree)match(input,INSTRUCTION_FORMAT3rc_METHOD,FOLLOW_INSTRUCTION_FORMAT3rc_METHOD_in_insn_format3rc_method2908);
+			match(input,I_STATEMENT_FORMAT3rc_METHOD,FOLLOW_I_STATEMENT_FORMAT3rc_METHOD_in_insn_format3rc_method2906); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT3rc_METHOD167=(CommonTree)match(input,INSTRUCTION_FORMAT3rc_METHOD,FOLLOW_INSTRUCTION_FORMAT3rc_METHOD_in_insn_format3rc_method2908); 
 			pushFollow(FOLLOW_register_range_in_insn_format3rc_method2910);
 			register_range168=register_range();
 			state._fsp--;
@@ -5830,7 +5830,7 @@
 			method_reference169=method_reference();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT3rc_METHOD167!=null?INSTRUCTION_FORMAT3rc_METHOD167.getText():null));
@@ -5843,7 +5843,7 @@
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction3rc(opcode, startRegister, registerCount,
 			              dexBuilder.internMethodReference(methodReference)));
-			
+			    
 			}
 
 		}
@@ -5860,19 +5860,19 @@
 
 
 	// $ANTLR start "insn_format3rc_type"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1100:1: insn_format3rc_type : ^( I_STATEMENT_FORMAT3rc_TYPE INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) ;
+	// smaliTreeWalker.g:1100:1: insn_format3rc_type : ^( I_STATEMENT_FORMAT3rc_TYPE INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) ;
 	public final void insn_format3rc_type() throws RecognitionException {
 		CommonTree INSTRUCTION_FORMAT3rc_TYPE170=null;
 		TreeRuleReturnScope register_range171 =null;
 		TreeRuleReturnScope nonvoid_type_descriptor172 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1101:3: ( ^( I_STATEMENT_FORMAT3rc_TYPE INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1102:5: ^( I_STATEMENT_FORMAT3rc_TYPE INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor )
+			// smaliTreeWalker.g:1101:3: ( ^( I_STATEMENT_FORMAT3rc_TYPE INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor ) )
+			// smaliTreeWalker.g:1102:5: ^( I_STATEMENT_FORMAT3rc_TYPE INSTRUCTION_FORMAT3rc_TYPE register_range nonvoid_type_descriptor )
 			{
-			match(input,I_STATEMENT_FORMAT3rc_TYPE,FOLLOW_I_STATEMENT_FORMAT3rc_TYPE_in_insn_format3rc_type2935);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT3rc_TYPE170=(CommonTree)match(input,INSTRUCTION_FORMAT3rc_TYPE,FOLLOW_INSTRUCTION_FORMAT3rc_TYPE_in_insn_format3rc_type2937);
+			match(input,I_STATEMENT_FORMAT3rc_TYPE,FOLLOW_I_STATEMENT_FORMAT3rc_TYPE_in_insn_format3rc_type2935); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT3rc_TYPE170=(CommonTree)match(input,INSTRUCTION_FORMAT3rc_TYPE,FOLLOW_INSTRUCTION_FORMAT3rc_TYPE_in_insn_format3rc_type2937); 
 			pushFollow(FOLLOW_register_range_in_insn_format3rc_type2939);
 			register_range171=register_range();
 			state._fsp--;
@@ -5881,7 +5881,7 @@
 			nonvoid_type_descriptor172=nonvoid_type_descriptor();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT3rc_TYPE170!=null?INSTRUCTION_FORMAT3rc_TYPE170.getText():null));
@@ -5892,7 +5892,7 @@
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction3rc(opcode, startRegister, registerCount,
 			              dexBuilder.internTypeReference((nonvoid_type_descriptor172!=null?((smaliTreeWalker.nonvoid_type_descriptor_return)nonvoid_type_descriptor172).type:null))));
-			
+			    
 			}
 
 		}
@@ -5909,7 +5909,7 @@
 
 
 	// $ANTLR start "insn_format45cc_method"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1114:1: insn_format45cc_method : ^( I_STATEMENT_FORMAT45cc_METHOD INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) ;
+	// smaliTreeWalker.g:1114:1: insn_format45cc_method : ^( I_STATEMENT_FORMAT45cc_METHOD INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) ;
 	public final void insn_format45cc_method() throws RecognitionException {
 		CommonTree INSTRUCTION_FORMAT45cc_METHOD173=null;
 		TreeRuleReturnScope register_list174 =null;
@@ -5917,12 +5917,12 @@
 		TreeRuleReturnScope method_prototype176 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1115:3: ( ^( I_STATEMENT_FORMAT45cc_METHOD INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1116:5: ^( I_STATEMENT_FORMAT45cc_METHOD INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype )
+			// smaliTreeWalker.g:1115:3: ( ^( I_STATEMENT_FORMAT45cc_METHOD INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype ) )
+			// smaliTreeWalker.g:1116:5: ^( I_STATEMENT_FORMAT45cc_METHOD INSTRUCTION_FORMAT45cc_METHOD register_list method_reference method_prototype )
 			{
-			match(input,I_STATEMENT_FORMAT45cc_METHOD,FOLLOW_I_STATEMENT_FORMAT45cc_METHOD_in_insn_format45cc_method2964);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT45cc_METHOD173=(CommonTree)match(input,INSTRUCTION_FORMAT45cc_METHOD,FOLLOW_INSTRUCTION_FORMAT45cc_METHOD_in_insn_format45cc_method2966);
+			match(input,I_STATEMENT_FORMAT45cc_METHOD,FOLLOW_I_STATEMENT_FORMAT45cc_METHOD_in_insn_format45cc_method2964); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT45cc_METHOD173=(CommonTree)match(input,INSTRUCTION_FORMAT45cc_METHOD,FOLLOW_INSTRUCTION_FORMAT45cc_METHOD_in_insn_format45cc_method2966); 
 			pushFollow(FOLLOW_register_list_in_insn_format45cc_method2968);
 			register_list174=register_list();
 			state._fsp--;
@@ -5935,7 +5935,7 @@
 			method_prototype176=method_prototype();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT45cc_METHOD173!=null?INSTRUCTION_FORMAT45cc_METHOD173.getText():null));
@@ -5953,7 +5953,7 @@
 			              registers[2], registers[3], registers[4],
 			              dexBuilder.internMethodReference(methodReference),
 			              dexBuilder.internMethodProtoReference(methodProtoReference)));
-			
+			    
 			}
 
 		}
@@ -5970,7 +5970,7 @@
 
 
 	// $ANTLR start "insn_format4rcc_method"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1135:1: insn_format4rcc_method : ^( I_STATEMENT_FORMAT4rcc_METHOD INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) ;
+	// smaliTreeWalker.g:1135:1: insn_format4rcc_method : ^( I_STATEMENT_FORMAT4rcc_METHOD INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) ;
 	public final void insn_format4rcc_method() throws RecognitionException {
 		CommonTree INSTRUCTION_FORMAT4rcc_METHOD177=null;
 		TreeRuleReturnScope register_range178 =null;
@@ -5978,12 +5978,12 @@
 		TreeRuleReturnScope method_prototype180 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1136:3: ( ^( I_STATEMENT_FORMAT4rcc_METHOD INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1137:5: ^( I_STATEMENT_FORMAT4rcc_METHOD INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype )
+			// smaliTreeWalker.g:1136:3: ( ^( I_STATEMENT_FORMAT4rcc_METHOD INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype ) )
+			// smaliTreeWalker.g:1137:5: ^( I_STATEMENT_FORMAT4rcc_METHOD INSTRUCTION_FORMAT4rcc_METHOD register_range method_reference method_prototype )
 			{
-			match(input,I_STATEMENT_FORMAT4rcc_METHOD,FOLLOW_I_STATEMENT_FORMAT4rcc_METHOD_in_insn_format4rcc_method2995);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT4rcc_METHOD177=(CommonTree)match(input,INSTRUCTION_FORMAT4rcc_METHOD,FOLLOW_INSTRUCTION_FORMAT4rcc_METHOD_in_insn_format4rcc_method2997);
+			match(input,I_STATEMENT_FORMAT4rcc_METHOD,FOLLOW_I_STATEMENT_FORMAT4rcc_METHOD_in_insn_format4rcc_method2995); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT4rcc_METHOD177=(CommonTree)match(input,INSTRUCTION_FORMAT4rcc_METHOD,FOLLOW_INSTRUCTION_FORMAT4rcc_METHOD_in_insn_format4rcc_method2997); 
 			pushFollow(FOLLOW_register_range_in_insn_format4rcc_method2999);
 			register_range178=register_range();
 			state._fsp--;
@@ -5996,7 +5996,7 @@
 			method_prototype180=method_prototype();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT4rcc_METHOD177!=null?INSTRUCTION_FORMAT4rcc_METHOD177.getText():null));
@@ -6013,7 +6013,7 @@
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction4rcc(opcode, startRegister, registerCount,
 			              dexBuilder.internMethodReference(methodReference),
 			              dexBuilder.internMethodProtoReference(methodProtoReference)));
-			
+			    
 			}
 
 		}
@@ -6030,25 +6030,25 @@
 
 
 	// $ANTLR start "insn_format51l_type"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1155:1: insn_format51l_type : ^( I_STATEMENT_FORMAT51l INSTRUCTION_FORMAT51l REGISTER fixed_64bit_literal ) ;
+	// smaliTreeWalker.g:1155:1: insn_format51l_type : ^( I_STATEMENT_FORMAT51l INSTRUCTION_FORMAT51l REGISTER fixed_64bit_literal ) ;
 	public final void insn_format51l_type() throws RecognitionException {
 		CommonTree INSTRUCTION_FORMAT51l181=null;
 		CommonTree REGISTER182=null;
 		long fixed_64bit_literal183 =0;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1156:3: ( ^( I_STATEMENT_FORMAT51l INSTRUCTION_FORMAT51l REGISTER fixed_64bit_literal ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1157:5: ^( I_STATEMENT_FORMAT51l INSTRUCTION_FORMAT51l REGISTER fixed_64bit_literal )
+			// smaliTreeWalker.g:1156:3: ( ^( I_STATEMENT_FORMAT51l INSTRUCTION_FORMAT51l REGISTER fixed_64bit_literal ) )
+			// smaliTreeWalker.g:1157:5: ^( I_STATEMENT_FORMAT51l INSTRUCTION_FORMAT51l REGISTER fixed_64bit_literal )
 			{
-			match(input,I_STATEMENT_FORMAT51l,FOLLOW_I_STATEMENT_FORMAT51l_in_insn_format51l_type3026);
-			match(input, Token.DOWN, null);
-			INSTRUCTION_FORMAT51l181=(CommonTree)match(input,INSTRUCTION_FORMAT51l,FOLLOW_INSTRUCTION_FORMAT51l_in_insn_format51l_type3028);
-			REGISTER182=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format51l_type3030);
+			match(input,I_STATEMENT_FORMAT51l,FOLLOW_I_STATEMENT_FORMAT51l_in_insn_format51l_type3026); 
+			match(input, Token.DOWN, null); 
+			INSTRUCTION_FORMAT51l181=(CommonTree)match(input,INSTRUCTION_FORMAT51l,FOLLOW_INSTRUCTION_FORMAT51l_in_insn_format51l_type3028); 
+			REGISTER182=(CommonTree)match(input,REGISTER,FOLLOW_REGISTER_in_insn_format51l_type3030); 
 			pushFollow(FOLLOW_fixed_64bit_literal_in_insn_format51l_type3032);
 			fixed_64bit_literal183=fixed_64bit_literal();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      Opcode opcode = opcodes.getOpcodeByName((INSTRUCTION_FORMAT51l181!=null?INSTRUCTION_FORMAT51l181.getText():null));
@@ -6057,7 +6057,7 @@
 			      long litB = fixed_64bit_literal183;
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderInstruction51l(opcode, regA, litB));
-			
+			    
 			}
 
 		}
@@ -6074,37 +6074,37 @@
 
 
 	// $ANTLR start "insn_array_data_directive"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1167:1: insn_array_data_directive : ^( I_STATEMENT_ARRAY_DATA ^( I_ARRAY_ELEMENT_SIZE short_integral_literal ) array_elements ) ;
+	// smaliTreeWalker.g:1167:1: insn_array_data_directive : ^( I_STATEMENT_ARRAY_DATA ^( I_ARRAY_ELEMENT_SIZE short_integral_literal ) array_elements ) ;
 	public final void insn_array_data_directive() throws RecognitionException {
 		short short_integral_literal184 =0;
 		List<Number> array_elements185 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1168:3: ( ^( I_STATEMENT_ARRAY_DATA ^( I_ARRAY_ELEMENT_SIZE short_integral_literal ) array_elements ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1169:5: ^( I_STATEMENT_ARRAY_DATA ^( I_ARRAY_ELEMENT_SIZE short_integral_literal ) array_elements )
+			// smaliTreeWalker.g:1168:3: ( ^( I_STATEMENT_ARRAY_DATA ^( I_ARRAY_ELEMENT_SIZE short_integral_literal ) array_elements ) )
+			// smaliTreeWalker.g:1169:5: ^( I_STATEMENT_ARRAY_DATA ^( I_ARRAY_ELEMENT_SIZE short_integral_literal ) array_elements )
 			{
-			match(input,I_STATEMENT_ARRAY_DATA,FOLLOW_I_STATEMENT_ARRAY_DATA_in_insn_array_data_directive3055);
-			match(input, Token.DOWN, null);
-			match(input,I_ARRAY_ELEMENT_SIZE,FOLLOW_I_ARRAY_ELEMENT_SIZE_in_insn_array_data_directive3058);
-			match(input, Token.DOWN, null);
+			match(input,I_STATEMENT_ARRAY_DATA,FOLLOW_I_STATEMENT_ARRAY_DATA_in_insn_array_data_directive3055); 
+			match(input, Token.DOWN, null); 
+			match(input,I_ARRAY_ELEMENT_SIZE,FOLLOW_I_ARRAY_ELEMENT_SIZE_in_insn_array_data_directive3058); 
+			match(input, Token.DOWN, null); 
 			pushFollow(FOLLOW_short_integral_literal_in_insn_array_data_directive3060);
 			short_integral_literal184=short_integral_literal();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 			pushFollow(FOLLOW_array_elements_in_insn_array_data_directive3063);
 			array_elements185=array_elements();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      int elementWidth = short_integral_literal184;
 			      List<Number> elements = array_elements185;
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderArrayPayload(elementWidth, array_elements185));
-			
+			    
 			}
 
 		}
@@ -6121,36 +6121,36 @@
 
 
 	// $ANTLR start "insn_packed_switch_directive"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1177:1: insn_packed_switch_directive : ^( I_STATEMENT_PACKED_SWITCH ^( I_PACKED_SWITCH_START_KEY fixed_32bit_literal ) packed_switch_elements ) ;
+	// smaliTreeWalker.g:1177:1: insn_packed_switch_directive : ^( I_STATEMENT_PACKED_SWITCH ^( I_PACKED_SWITCH_START_KEY fixed_32bit_literal ) packed_switch_elements ) ;
 	public final void insn_packed_switch_directive() throws RecognitionException {
 		int fixed_32bit_literal186 =0;
 		List<Label> packed_switch_elements187 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1178:3: ( ^( I_STATEMENT_PACKED_SWITCH ^( I_PACKED_SWITCH_START_KEY fixed_32bit_literal ) packed_switch_elements ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1179:5: ^( I_STATEMENT_PACKED_SWITCH ^( I_PACKED_SWITCH_START_KEY fixed_32bit_literal ) packed_switch_elements )
+			// smaliTreeWalker.g:1178:3: ( ^( I_STATEMENT_PACKED_SWITCH ^( I_PACKED_SWITCH_START_KEY fixed_32bit_literal ) packed_switch_elements ) )
+			// smaliTreeWalker.g:1179:5: ^( I_STATEMENT_PACKED_SWITCH ^( I_PACKED_SWITCH_START_KEY fixed_32bit_literal ) packed_switch_elements )
 			{
-			match(input,I_STATEMENT_PACKED_SWITCH,FOLLOW_I_STATEMENT_PACKED_SWITCH_in_insn_packed_switch_directive3085);
-			match(input, Token.DOWN, null);
-			match(input,I_PACKED_SWITCH_START_KEY,FOLLOW_I_PACKED_SWITCH_START_KEY_in_insn_packed_switch_directive3088);
-			match(input, Token.DOWN, null);
+			match(input,I_STATEMENT_PACKED_SWITCH,FOLLOW_I_STATEMENT_PACKED_SWITCH_in_insn_packed_switch_directive3085); 
+			match(input, Token.DOWN, null); 
+			match(input,I_PACKED_SWITCH_START_KEY,FOLLOW_I_PACKED_SWITCH_START_KEY_in_insn_packed_switch_directive3088); 
+			match(input, Token.DOWN, null); 
 			pushFollow(FOLLOW_fixed_32bit_literal_in_insn_packed_switch_directive3090);
 			fixed_32bit_literal186=fixed_32bit_literal();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 			pushFollow(FOLLOW_packed_switch_elements_in_insn_packed_switch_directive3093);
 			packed_switch_elements187=packed_switch_elements();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			        int startKey = fixed_32bit_literal186;
 			        method_stack.peek().methodBuilder.addInstruction(new BuilderPackedSwitchPayload(startKey,
 			            packed_switch_elements187));
-			
+			      
 			}
 
 		}
@@ -6167,25 +6167,25 @@
 
 
 	// $ANTLR start "insn_sparse_switch_directive"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1186:1: insn_sparse_switch_directive : ^( I_STATEMENT_SPARSE_SWITCH sparse_switch_elements ) ;
+	// smaliTreeWalker.g:1186:1: insn_sparse_switch_directive : ^( I_STATEMENT_SPARSE_SWITCH sparse_switch_elements ) ;
 	public final void insn_sparse_switch_directive() throws RecognitionException {
 		List<SwitchLabelElement> sparse_switch_elements188 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1187:3: ( ^( I_STATEMENT_SPARSE_SWITCH sparse_switch_elements ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1188:5: ^( I_STATEMENT_SPARSE_SWITCH sparse_switch_elements )
+			// smaliTreeWalker.g:1187:3: ( ^( I_STATEMENT_SPARSE_SWITCH sparse_switch_elements ) )
+			// smaliTreeWalker.g:1188:5: ^( I_STATEMENT_SPARSE_SWITCH sparse_switch_elements )
 			{
-			match(input,I_STATEMENT_SPARSE_SWITCH,FOLLOW_I_STATEMENT_SPARSE_SWITCH_in_insn_sparse_switch_directive3117);
-			match(input, Token.DOWN, null);
+			match(input,I_STATEMENT_SPARSE_SWITCH,FOLLOW_I_STATEMENT_SPARSE_SWITCH_in_insn_sparse_switch_directive3117); 
+			match(input, Token.DOWN, null); 
 			pushFollow(FOLLOW_sparse_switch_elements_in_insn_sparse_switch_directive3119);
 			sparse_switch_elements188=sparse_switch_elements();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      method_stack.peek().methodBuilder.addInstruction(new BuilderSparseSwitchPayload(sparse_switch_elements188));
-			
+			    
 			}
 
 		}
@@ -6202,7 +6202,7 @@
 
 
 	// $ANTLR start "array_descriptor"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1193:1: array_descriptor returns [String type] : ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) ;
+	// smaliTreeWalker.g:1193:1: array_descriptor returns [String type] : ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) ;
 	public final String array_descriptor() throws RecognitionException {
 		String type = null;
 
@@ -6212,11 +6212,11 @@
 		CommonTree CLASS_DESCRIPTOR191=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1194:3: ( ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1194:5: ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR )
+			// smaliTreeWalker.g:1194:3: ( ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR ) )
+			// smaliTreeWalker.g:1194:5: ARRAY_TYPE_PREFIX ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR )
 			{
-			ARRAY_TYPE_PREFIX189=(CommonTree)match(input,ARRAY_TYPE_PREFIX,FOLLOW_ARRAY_TYPE_PREFIX_in_array_descriptor3140);
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1194:23: ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR )
+			ARRAY_TYPE_PREFIX189=(CommonTree)match(input,ARRAY_TYPE_PREFIX,FOLLOW_ARRAY_TYPE_PREFIX_in_array_descriptor3140); 
+			// smaliTreeWalker.g:1194:23: ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR )
 			int alt37=2;
 			int LA37_0 = input.LA(1);
 			if ( (LA37_0==PRIMITIVE_TYPE) ) {
@@ -6234,17 +6234,17 @@
 
 			switch (alt37) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1194:25: PRIMITIVE_TYPE
+					// smaliTreeWalker.g:1194:25: PRIMITIVE_TYPE
 					{
-					PRIMITIVE_TYPE190=(CommonTree)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_array_descriptor3144);
-					 type = (ARRAY_TYPE_PREFIX189!=null?ARRAY_TYPE_PREFIX189.getText():null) + (PRIMITIVE_TYPE190!=null?PRIMITIVE_TYPE190.getText():null);
+					PRIMITIVE_TYPE190=(CommonTree)match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_array_descriptor3144); 
+					 type = (ARRAY_TYPE_PREFIX189!=null?ARRAY_TYPE_PREFIX189.getText():null) + (PRIMITIVE_TYPE190!=null?PRIMITIVE_TYPE190.getText():null); 
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1195:25: CLASS_DESCRIPTOR
+					// smaliTreeWalker.g:1195:25: CLASS_DESCRIPTOR
 					{
-					CLASS_DESCRIPTOR191=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_array_descriptor3172);
-					 type = (ARRAY_TYPE_PREFIX189!=null?ARRAY_TYPE_PREFIX189.getText():null) + (CLASS_DESCRIPTOR191!=null?CLASS_DESCRIPTOR191.getText():null);
+					CLASS_DESCRIPTOR191=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_array_descriptor3172); 
+					 type = (ARRAY_TYPE_PREFIX189!=null?ARRAY_TYPE_PREFIX189.getText():null) + (CLASS_DESCRIPTOR191!=null?CLASS_DESCRIPTOR191.getText():null); 
 					}
 					break;
 
@@ -6271,7 +6271,7 @@
 
 
 	// $ANTLR start "nonvoid_type_descriptor"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1197:1: nonvoid_type_descriptor returns [String type] : ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor ) ;
+	// smaliTreeWalker.g:1197:1: nonvoid_type_descriptor returns [String type] : ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor ) ;
 	public final smaliTreeWalker.nonvoid_type_descriptor_return nonvoid_type_descriptor() throws RecognitionException {
 		smaliTreeWalker.nonvoid_type_descriptor_return retval = new smaliTreeWalker.nonvoid_type_descriptor_return();
 		retval.start = input.LT(1);
@@ -6279,10 +6279,10 @@
 		String array_descriptor192 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1198:3: ( ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1198:5: ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor )
+			// smaliTreeWalker.g:1198:3: ( ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor ) )
+			// smaliTreeWalker.g:1198:5: ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor )
 			{
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1198:5: ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor )
+			// smaliTreeWalker.g:1198:5: ( PRIMITIVE_TYPE | CLASS_DESCRIPTOR | array_descriptor )
 			int alt38=3;
 			switch ( input.LA(1) ) {
 			case PRIMITIVE_TYPE:
@@ -6307,27 +6307,27 @@
 			}
 			switch (alt38) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1198:6: PRIMITIVE_TYPE
+					// smaliTreeWalker.g:1198:6: PRIMITIVE_TYPE
 					{
-					match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_nonvoid_type_descriptor3190);
-					 retval.type = input.getTokenStream().toString(input.getTreeAdaptor().getTokenStartIndex(retval.start),input.getTreeAdaptor().getTokenStopIndex(retval.start));
+					match(input,PRIMITIVE_TYPE,FOLLOW_PRIMITIVE_TYPE_in_nonvoid_type_descriptor3190); 
+					 retval.type = input.getTokenStream().toString(input.getTreeAdaptor().getTokenStartIndex(retval.start),input.getTreeAdaptor().getTokenStopIndex(retval.start)); 
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1199:5: CLASS_DESCRIPTOR
+					// smaliTreeWalker.g:1199:5: CLASS_DESCRIPTOR
 					{
-					match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_nonvoid_type_descriptor3198);
-					 retval.type = input.getTokenStream().toString(input.getTreeAdaptor().getTokenStartIndex(retval.start),input.getTreeAdaptor().getTokenStopIndex(retval.start));
+					match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_nonvoid_type_descriptor3198); 
+					 retval.type = input.getTokenStream().toString(input.getTreeAdaptor().getTokenStartIndex(retval.start),input.getTreeAdaptor().getTokenStopIndex(retval.start)); 
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1200:5: array_descriptor
+					// smaliTreeWalker.g:1200:5: array_descriptor
 					{
 					pushFollow(FOLLOW_array_descriptor_in_nonvoid_type_descriptor3206);
 					array_descriptor192=array_descriptor();
 					state._fsp--;
 
-					 retval.type = array_descriptor192;
+					 retval.type = array_descriptor192; 
 					}
 					break;
 
@@ -6354,7 +6354,7 @@
 
 
 	// $ANTLR start "reference_type_descriptor"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1203:1: reference_type_descriptor returns [String type] : ( CLASS_DESCRIPTOR | array_descriptor ) ;
+	// smaliTreeWalker.g:1203:1: reference_type_descriptor returns [String type] : ( CLASS_DESCRIPTOR | array_descriptor ) ;
 	public final smaliTreeWalker.reference_type_descriptor_return reference_type_descriptor() throws RecognitionException {
 		smaliTreeWalker.reference_type_descriptor_return retval = new smaliTreeWalker.reference_type_descriptor_return();
 		retval.start = input.LT(1);
@@ -6362,10 +6362,10 @@
 		String array_descriptor193 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1204:3: ( ( CLASS_DESCRIPTOR | array_descriptor ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1204:5: ( CLASS_DESCRIPTOR | array_descriptor )
+			// smaliTreeWalker.g:1204:3: ( ( CLASS_DESCRIPTOR | array_descriptor ) )
+			// smaliTreeWalker.g:1204:5: ( CLASS_DESCRIPTOR | array_descriptor )
 			{
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1204:5: ( CLASS_DESCRIPTOR | array_descriptor )
+			// smaliTreeWalker.g:1204:5: ( CLASS_DESCRIPTOR | array_descriptor )
 			int alt39=2;
 			int LA39_0 = input.LA(1);
 			if ( (LA39_0==CLASS_DESCRIPTOR) ) {
@@ -6383,20 +6383,20 @@
 
 			switch (alt39) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1204:6: CLASS_DESCRIPTOR
+					// smaliTreeWalker.g:1204:6: CLASS_DESCRIPTOR
 					{
-					match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_reference_type_descriptor3227);
-					 retval.type = input.getTokenStream().toString(input.getTreeAdaptor().getTokenStartIndex(retval.start),input.getTreeAdaptor().getTokenStopIndex(retval.start));
+					match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_reference_type_descriptor3227); 
+					 retval.type = input.getTokenStream().toString(input.getTreeAdaptor().getTokenStartIndex(retval.start),input.getTreeAdaptor().getTokenStopIndex(retval.start)); 
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1205:5: array_descriptor
+					// smaliTreeWalker.g:1205:5: array_descriptor
 					{
 					pushFollow(FOLLOW_array_descriptor_in_reference_type_descriptor3235);
 					array_descriptor193=array_descriptor();
 					state._fsp--;
 
-					 retval.type = array_descriptor193;
+					 retval.type = array_descriptor193; 
 					}
 					break;
 
@@ -6419,7 +6419,7 @@
 
 
 	// $ANTLR start "type_descriptor"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1208:1: type_descriptor returns [String type] : ( VOID_TYPE | nonvoid_type_descriptor );
+	// smaliTreeWalker.g:1208:1: type_descriptor returns [String type] : ( VOID_TYPE | nonvoid_type_descriptor );
 	public final String type_descriptor() throws RecognitionException {
 		String type = null;
 
@@ -6427,7 +6427,7 @@
 		TreeRuleReturnScope nonvoid_type_descriptor194 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1209:3: ( VOID_TYPE | nonvoid_type_descriptor )
+			// smaliTreeWalker.g:1209:3: ( VOID_TYPE | nonvoid_type_descriptor )
 			int alt40=2;
 			int LA40_0 = input.LA(1);
 			if ( (LA40_0==VOID_TYPE) ) {
@@ -6445,14 +6445,14 @@
 
 			switch (alt40) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1209:5: VOID_TYPE
+					// smaliTreeWalker.g:1209:5: VOID_TYPE
 					{
-					match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_type_descriptor3255);
+					match(input,VOID_TYPE,FOLLOW_VOID_TYPE_in_type_descriptor3255); 
 					type = "V";
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1210:5: nonvoid_type_descriptor
+					// smaliTreeWalker.g:1210:5: nonvoid_type_descriptor
 					{
 					pushFollow(FOLLOW_nonvoid_type_descriptor_in_type_descriptor3263);
 					nonvoid_type_descriptor194=nonvoid_type_descriptor();
@@ -6478,7 +6478,7 @@
 
 
 	// $ANTLR start "short_integral_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1213:1: short_integral_literal returns [short value] : ( long_literal | integer_literal | short_literal | char_literal | byte_literal );
+	// smaliTreeWalker.g:1213:1: short_integral_literal returns [short value] : ( long_literal | integer_literal | short_literal | char_literal | byte_literal );
 	public final short short_integral_literal() throws RecognitionException {
 		short value = 0;
 
@@ -6490,7 +6490,7 @@
 		byte byte_literal199 =0;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1214:3: ( long_literal | integer_literal | short_literal | char_literal | byte_literal )
+			// smaliTreeWalker.g:1214:3: ( long_literal | integer_literal | short_literal | char_literal | byte_literal )
 			int alt41=5;
 			switch ( input.LA(1) ) {
 			case LONG_LITERAL:
@@ -6525,7 +6525,7 @@
 			}
 			switch (alt41) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1214:5: long_literal
+					// smaliTreeWalker.g:1214:5: long_literal
 					{
 					pushFollow(FOLLOW_long_literal_in_short_integral_literal3281);
 					long_literal195=long_literal();
@@ -6534,11 +6534,11 @@
 
 					      LiteralTools.checkShort(long_literal195);
 					      value = (short)long_literal195;
-					
+					    
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1219:5: integer_literal
+					// smaliTreeWalker.g:1219:5: integer_literal
 					{
 					pushFollow(FOLLOW_integer_literal_in_short_integral_literal3293);
 					integer_literal196=integer_literal();
@@ -6547,11 +6547,11 @@
 
 					      LiteralTools.checkShort(integer_literal196);
 					      value = (short)integer_literal196;
-					
+					    
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1224:5: short_literal
+					// smaliTreeWalker.g:1224:5: short_literal
 					{
 					pushFollow(FOLLOW_short_literal_in_short_integral_literal3305);
 					short_literal197=short_literal();
@@ -6561,7 +6561,7 @@
 					}
 					break;
 				case 4 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1225:5: char_literal
+					// smaliTreeWalker.g:1225:5: char_literal
 					{
 					pushFollow(FOLLOW_char_literal_in_short_integral_literal3313);
 					char_literal198=char_literal();
@@ -6571,7 +6571,7 @@
 					}
 					break;
 				case 5 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1226:5: byte_literal
+					// smaliTreeWalker.g:1226:5: byte_literal
 					{
 					pushFollow(FOLLOW_byte_literal_in_short_integral_literal3321);
 					byte_literal199=byte_literal();
@@ -6597,7 +6597,7 @@
 
 
 	// $ANTLR start "integral_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1228:1: integral_literal returns [int value] : ( long_literal | integer_literal | short_literal | byte_literal );
+	// smaliTreeWalker.g:1228:1: integral_literal returns [int value] : ( long_literal | integer_literal | short_literal | byte_literal );
 	public final int integral_literal() throws RecognitionException {
 		int value = 0;
 
@@ -6608,7 +6608,7 @@
 		byte byte_literal203 =0;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1229:3: ( long_literal | integer_literal | short_literal | byte_literal )
+			// smaliTreeWalker.g:1229:3: ( long_literal | integer_literal | short_literal | byte_literal )
 			int alt42=4;
 			switch ( input.LA(1) ) {
 			case LONG_LITERAL:
@@ -6638,7 +6638,7 @@
 			}
 			switch (alt42) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1229:5: long_literal
+					// smaliTreeWalker.g:1229:5: long_literal
 					{
 					pushFollow(FOLLOW_long_literal_in_integral_literal3336);
 					long_literal200=long_literal();
@@ -6647,11 +6647,11 @@
 
 					      LiteralTools.checkInt(long_literal200);
 					      value = (int)long_literal200;
-					
+					    
 					}
 					break;
 				case 2 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1234:5: integer_literal
+					// smaliTreeWalker.g:1234:5: integer_literal
 					{
 					pushFollow(FOLLOW_integer_literal_in_integral_literal3348);
 					integer_literal201=integer_literal();
@@ -6661,7 +6661,7 @@
 					}
 					break;
 				case 3 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1235:5: short_literal
+					// smaliTreeWalker.g:1235:5: short_literal
 					{
 					pushFollow(FOLLOW_short_literal_in_integral_literal3356);
 					short_literal202=short_literal();
@@ -6671,7 +6671,7 @@
 					}
 					break;
 				case 4 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1236:5: byte_literal
+					// smaliTreeWalker.g:1236:5: byte_literal
 					{
 					pushFollow(FOLLOW_byte_literal_in_integral_literal3364);
 					byte_literal203=byte_literal();
@@ -6697,7 +6697,7 @@
 
 
 	// $ANTLR start "integer_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1239:1: integer_literal returns [int value] : INTEGER_LITERAL ;
+	// smaliTreeWalker.g:1239:1: integer_literal returns [int value] : INTEGER_LITERAL ;
 	public final int integer_literal() throws RecognitionException {
 		int value = 0;
 
@@ -6705,11 +6705,11 @@
 		CommonTree INTEGER_LITERAL204=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1240:3: ( INTEGER_LITERAL )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1240:5: INTEGER_LITERAL
+			// smaliTreeWalker.g:1240:3: ( INTEGER_LITERAL )
+			// smaliTreeWalker.g:1240:5: INTEGER_LITERAL
 			{
-			INTEGER_LITERAL204=(CommonTree)match(input,INTEGER_LITERAL,FOLLOW_INTEGER_LITERAL_in_integer_literal3380);
-			 value = LiteralTools.parseInt((INTEGER_LITERAL204!=null?INTEGER_LITERAL204.getText():null));
+			INTEGER_LITERAL204=(CommonTree)match(input,INTEGER_LITERAL,FOLLOW_INTEGER_LITERAL_in_integer_literal3380); 
+			 value = LiteralTools.parseInt((INTEGER_LITERAL204!=null?INTEGER_LITERAL204.getText():null)); 
 			}
 
 		}
@@ -6727,7 +6727,7 @@
 
 
 	// $ANTLR start "long_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1242:1: long_literal returns [long value] : LONG_LITERAL ;
+	// smaliTreeWalker.g:1242:1: long_literal returns [long value] : LONG_LITERAL ;
 	public final long long_literal() throws RecognitionException {
 		long value = 0;
 
@@ -6735,11 +6735,11 @@
 		CommonTree LONG_LITERAL205=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1243:3: ( LONG_LITERAL )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1243:5: LONG_LITERAL
+			// smaliTreeWalker.g:1243:3: ( LONG_LITERAL )
+			// smaliTreeWalker.g:1243:5: LONG_LITERAL
 			{
-			LONG_LITERAL205=(CommonTree)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_long_literal3395);
-			 value = LiteralTools.parseLong((LONG_LITERAL205!=null?LONG_LITERAL205.getText():null));
+			LONG_LITERAL205=(CommonTree)match(input,LONG_LITERAL,FOLLOW_LONG_LITERAL_in_long_literal3395); 
+			 value = LiteralTools.parseLong((LONG_LITERAL205!=null?LONG_LITERAL205.getText():null)); 
 			}
 
 		}
@@ -6757,7 +6757,7 @@
 
 
 	// $ANTLR start "short_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1245:1: short_literal returns [short value] : SHORT_LITERAL ;
+	// smaliTreeWalker.g:1245:1: short_literal returns [short value] : SHORT_LITERAL ;
 	public final short short_literal() throws RecognitionException {
 		short value = 0;
 
@@ -6765,11 +6765,11 @@
 		CommonTree SHORT_LITERAL206=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1246:3: ( SHORT_LITERAL )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1246:5: SHORT_LITERAL
+			// smaliTreeWalker.g:1246:3: ( SHORT_LITERAL )
+			// smaliTreeWalker.g:1246:5: SHORT_LITERAL
 			{
-			SHORT_LITERAL206=(CommonTree)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_short_literal3410);
-			 value = LiteralTools.parseShort((SHORT_LITERAL206!=null?SHORT_LITERAL206.getText():null));
+			SHORT_LITERAL206=(CommonTree)match(input,SHORT_LITERAL,FOLLOW_SHORT_LITERAL_in_short_literal3410); 
+			 value = LiteralTools.parseShort((SHORT_LITERAL206!=null?SHORT_LITERAL206.getText():null)); 
 			}
 
 		}
@@ -6787,7 +6787,7 @@
 
 
 	// $ANTLR start "byte_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1248:1: byte_literal returns [byte value] : BYTE_LITERAL ;
+	// smaliTreeWalker.g:1248:1: byte_literal returns [byte value] : BYTE_LITERAL ;
 	public final byte byte_literal() throws RecognitionException {
 		byte value = 0;
 
@@ -6795,11 +6795,11 @@
 		CommonTree BYTE_LITERAL207=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1249:3: ( BYTE_LITERAL )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1249:5: BYTE_LITERAL
+			// smaliTreeWalker.g:1249:3: ( BYTE_LITERAL )
+			// smaliTreeWalker.g:1249:5: BYTE_LITERAL
 			{
-			BYTE_LITERAL207=(CommonTree)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_byte_literal3425);
-			 value = LiteralTools.parseByte((BYTE_LITERAL207!=null?BYTE_LITERAL207.getText():null));
+			BYTE_LITERAL207=(CommonTree)match(input,BYTE_LITERAL,FOLLOW_BYTE_LITERAL_in_byte_literal3425); 
+			 value = LiteralTools.parseByte((BYTE_LITERAL207!=null?BYTE_LITERAL207.getText():null)); 
 			}
 
 		}
@@ -6817,7 +6817,7 @@
 
 
 	// $ANTLR start "float_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1251:1: float_literal returns [float value] : FLOAT_LITERAL ;
+	// smaliTreeWalker.g:1251:1: float_literal returns [float value] : FLOAT_LITERAL ;
 	public final float float_literal() throws RecognitionException {
 		float value = 0.0f;
 
@@ -6825,11 +6825,11 @@
 		CommonTree FLOAT_LITERAL208=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1252:3: ( FLOAT_LITERAL )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1252:5: FLOAT_LITERAL
+			// smaliTreeWalker.g:1252:3: ( FLOAT_LITERAL )
+			// smaliTreeWalker.g:1252:5: FLOAT_LITERAL
 			{
-			FLOAT_LITERAL208=(CommonTree)match(input,FLOAT_LITERAL,FOLLOW_FLOAT_LITERAL_in_float_literal3440);
-			 value = LiteralTools.parseFloat((FLOAT_LITERAL208!=null?FLOAT_LITERAL208.getText():null));
+			FLOAT_LITERAL208=(CommonTree)match(input,FLOAT_LITERAL,FOLLOW_FLOAT_LITERAL_in_float_literal3440); 
+			 value = LiteralTools.parseFloat((FLOAT_LITERAL208!=null?FLOAT_LITERAL208.getText():null)); 
 			}
 
 		}
@@ -6847,7 +6847,7 @@
 
 
 	// $ANTLR start "double_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1254:1: double_literal returns [double value] : DOUBLE_LITERAL ;
+	// smaliTreeWalker.g:1254:1: double_literal returns [double value] : DOUBLE_LITERAL ;
 	public final double double_literal() throws RecognitionException {
 		double value = 0.0;
 
@@ -6855,11 +6855,11 @@
 		CommonTree DOUBLE_LITERAL209=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1255:3: ( DOUBLE_LITERAL )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1255:5: DOUBLE_LITERAL
+			// smaliTreeWalker.g:1255:3: ( DOUBLE_LITERAL )
+			// smaliTreeWalker.g:1255:5: DOUBLE_LITERAL
 			{
-			DOUBLE_LITERAL209=(CommonTree)match(input,DOUBLE_LITERAL,FOLLOW_DOUBLE_LITERAL_in_double_literal3455);
-			 value = LiteralTools.parseDouble((DOUBLE_LITERAL209!=null?DOUBLE_LITERAL209.getText():null));
+			DOUBLE_LITERAL209=(CommonTree)match(input,DOUBLE_LITERAL,FOLLOW_DOUBLE_LITERAL_in_double_literal3455); 
+			 value = LiteralTools.parseDouble((DOUBLE_LITERAL209!=null?DOUBLE_LITERAL209.getText():null)); 
 			}
 
 		}
@@ -6877,7 +6877,7 @@
 
 
 	// $ANTLR start "char_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1257:1: char_literal returns [char value] : CHAR_LITERAL ;
+	// smaliTreeWalker.g:1257:1: char_literal returns [char value] : CHAR_LITERAL ;
 	public final char char_literal() throws RecognitionException {
 		char value = 0;
 
@@ -6885,11 +6885,11 @@
 		CommonTree CHAR_LITERAL210=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1258:3: ( CHAR_LITERAL )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1258:5: CHAR_LITERAL
+			// smaliTreeWalker.g:1258:3: ( CHAR_LITERAL )
+			// smaliTreeWalker.g:1258:5: CHAR_LITERAL
 			{
-			CHAR_LITERAL210=(CommonTree)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_char_literal3470);
-			 value = (CHAR_LITERAL210!=null?CHAR_LITERAL210.getText():null).charAt(1);
+			CHAR_LITERAL210=(CommonTree)match(input,CHAR_LITERAL,FOLLOW_CHAR_LITERAL_in_char_literal3470); 
+			 value = (CHAR_LITERAL210!=null?CHAR_LITERAL210.getText():null).charAt(1); 
 			}
 
 		}
@@ -6907,7 +6907,7 @@
 
 
 	// $ANTLR start "string_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1260:1: string_literal returns [String value] : STRING_LITERAL ;
+	// smaliTreeWalker.g:1260:1: string_literal returns [String value] : STRING_LITERAL ;
 	public final String string_literal() throws RecognitionException {
 		String value = null;
 
@@ -6915,14 +6915,14 @@
 		CommonTree STRING_LITERAL211=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1261:3: ( STRING_LITERAL )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1261:5: STRING_LITERAL
+			// smaliTreeWalker.g:1261:3: ( STRING_LITERAL )
+			// smaliTreeWalker.g:1261:5: STRING_LITERAL
 			{
-			STRING_LITERAL211=(CommonTree)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_string_literal3485);
+			STRING_LITERAL211=(CommonTree)match(input,STRING_LITERAL,FOLLOW_STRING_LITERAL_in_string_literal3485); 
 
 			      value = (STRING_LITERAL211!=null?STRING_LITERAL211.getText():null);
 			      value = value.substring(1,value.length()-1);
-			
+			    
 			}
 
 		}
@@ -6940,7 +6940,7 @@
 
 
 	// $ANTLR start "bool_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1267:1: bool_literal returns [boolean value] : BOOL_LITERAL ;
+	// smaliTreeWalker.g:1267:1: bool_literal returns [boolean value] : BOOL_LITERAL ;
 	public final boolean bool_literal() throws RecognitionException {
 		boolean value = false;
 
@@ -6948,11 +6948,11 @@
 		CommonTree BOOL_LITERAL212=null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1268:3: ( BOOL_LITERAL )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1268:5: BOOL_LITERAL
+			// smaliTreeWalker.g:1268:3: ( BOOL_LITERAL )
+			// smaliTreeWalker.g:1268:5: BOOL_LITERAL
 			{
-			BOOL_LITERAL212=(CommonTree)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_bool_literal3504);
-			 value = Boolean.parseBoolean((BOOL_LITERAL212!=null?BOOL_LITERAL212.getText():null));
+			BOOL_LITERAL212=(CommonTree)match(input,BOOL_LITERAL,FOLLOW_BOOL_LITERAL_in_bool_literal3504); 
+			 value = Boolean.parseBoolean((BOOL_LITERAL212!=null?BOOL_LITERAL212.getText():null)); 
 			}
 
 		}
@@ -6970,7 +6970,7 @@
 
 
 	// $ANTLR start "array_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1270:1: array_literal returns [List<EncodedValue> elements] : ^( I_ENCODED_ARRAY ( literal )* ) ;
+	// smaliTreeWalker.g:1270:1: array_literal returns [List<EncodedValue> elements] : ^( I_ENCODED_ARRAY ( literal )* ) ;
 	public final List<EncodedValue> array_literal() throws RecognitionException {
 		List<EncodedValue> elements = null;
 
@@ -6978,14 +6978,14 @@
 		EncodedValue literal213 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1271:3: ( ^( I_ENCODED_ARRAY ( literal )* ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1271:5: ^( I_ENCODED_ARRAY ( literal )* )
+			// smaliTreeWalker.g:1271:3: ( ^( I_ENCODED_ARRAY ( literal )* ) )
+			// smaliTreeWalker.g:1271:5: ^( I_ENCODED_ARRAY ( literal )* )
 			{
 			elements = Lists.newArrayList();
-			match(input,I_ENCODED_ARRAY,FOLLOW_I_ENCODED_ARRAY_in_array_literal3526);
+			match(input,I_ENCODED_ARRAY,FOLLOW_I_ENCODED_ARRAY_in_array_literal3526); 
 			if ( input.LA(1)==Token.DOWN ) {
-				match(input, Token.DOWN, null);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1272:23: ( literal )*
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:1272:23: ( literal )*
 				loop43:
 				while (true) {
 					int alt43=2;
@@ -6996,7 +6996,7 @@
 
 					switch (alt43) {
 					case 1 :
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1272:24: literal
+						// smaliTreeWalker.g:1272:24: literal
 						{
 						pushFollow(FOLLOW_literal_in_array_literal3529);
 						literal213=literal();
@@ -7011,7 +7011,7 @@
 					}
 				}
 
-				match(input, Token.UP, null);
+				match(input, Token.UP, null); 
 			}
 
 			}
@@ -7031,7 +7031,7 @@
 
 
 	// $ANTLR start "annotations"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1274:1: annotations returns [Set<Annotation> annotations] : ^( I_ANNOTATIONS ( annotation )* ) ;
+	// smaliTreeWalker.g:1274:1: annotations returns [Set<Annotation> annotations] : ^( I_ANNOTATIONS ( annotation )* ) ;
 	public final Set<Annotation> annotations() throws RecognitionException {
 		Set<Annotation> annotations = null;
 
@@ -7039,14 +7039,14 @@
 		Annotation annotation214 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1275:3: ( ^( I_ANNOTATIONS ( annotation )* ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1275:5: ^( I_ANNOTATIONS ( annotation )* )
+			// smaliTreeWalker.g:1275:3: ( ^( I_ANNOTATIONS ( annotation )* ) )
+			// smaliTreeWalker.g:1275:5: ^( I_ANNOTATIONS ( annotation )* )
 			{
 			HashMap<String, Annotation> annotationMap = Maps.newHashMap();
-			match(input,I_ANNOTATIONS,FOLLOW_I_ANNOTATIONS_in_annotations3554);
+			match(input,I_ANNOTATIONS,FOLLOW_I_ANNOTATIONS_in_annotations3554); 
 			if ( input.LA(1)==Token.DOWN ) {
-				match(input, Token.DOWN, null);
-				// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1276:21: ( annotation )*
+				match(input, Token.DOWN, null); 
+				// smaliTreeWalker.g:1276:21: ( annotation )*
 				loop44:
 				while (true) {
 					int alt44=2;
@@ -7057,7 +7057,7 @@
 
 					switch (alt44) {
 					case 1 :
-						// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1276:22: annotation
+						// smaliTreeWalker.g:1276:22: annotation
 						{
 						pushFollow(FOLLOW_annotation_in_annotations3557);
 						annotation214=annotation();
@@ -7069,7 +7069,7 @@
 						        if (old != null) {
 						            throw new SemanticException(input, "Multiple annotations of type %s", anno.getType());
 						        }
-						
+						    
 						}
 						break;
 
@@ -7078,14 +7078,14 @@
 					}
 				}
 
-				match(input, Token.UP, null);
+				match(input, Token.UP, null); 
 			}
 
 
 			      if (annotationMap.size() > 0) {
 			        annotations = ImmutableSet.copyOf(annotationMap.values());
 			      }
-			
+			    
 			}
 
 		}
@@ -7103,7 +7103,7 @@
 
 
 	// $ANTLR start "annotation"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1290:1: annotation returns [Annotation annotation] : ^( I_ANNOTATION ANNOTATION_VISIBILITY subannotation ) ;
+	// smaliTreeWalker.g:1290:1: annotation returns [Annotation annotation] : ^( I_ANNOTATION ANNOTATION_VISIBILITY subannotation ) ;
 	public final Annotation annotation() throws RecognitionException {
 		Annotation annotation = null;
 
@@ -7112,22 +7112,22 @@
 		TreeRuleReturnScope subannotation216 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1291:3: ( ^( I_ANNOTATION ANNOTATION_VISIBILITY subannotation ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1291:5: ^( I_ANNOTATION ANNOTATION_VISIBILITY subannotation )
+			// smaliTreeWalker.g:1291:3: ( ^( I_ANNOTATION ANNOTATION_VISIBILITY subannotation ) )
+			// smaliTreeWalker.g:1291:5: ^( I_ANNOTATION ANNOTATION_VISIBILITY subannotation )
 			{
-			match(input,I_ANNOTATION,FOLLOW_I_ANNOTATION_in_annotation3586);
-			match(input, Token.DOWN, null);
-			ANNOTATION_VISIBILITY215=(CommonTree)match(input,ANNOTATION_VISIBILITY,FOLLOW_ANNOTATION_VISIBILITY_in_annotation3588);
+			match(input,I_ANNOTATION,FOLLOW_I_ANNOTATION_in_annotation3586); 
+			match(input, Token.DOWN, null); 
+			ANNOTATION_VISIBILITY215=(CommonTree)match(input,ANNOTATION_VISIBILITY,FOLLOW_ANNOTATION_VISIBILITY_in_annotation3588); 
 			pushFollow(FOLLOW_subannotation_in_annotation3590);
 			subannotation216=subannotation();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      int visibility = AnnotationVisibility.getVisibility((ANNOTATION_VISIBILITY215!=null?ANNOTATION_VISIBILITY215.getText():null));
 			      annotation = new ImmutableAnnotation(visibility, (subannotation216!=null?((smaliTreeWalker.subannotation_return)subannotation216).annotationType:null), (subannotation216!=null?((smaliTreeWalker.subannotation_return)subannotation216).elements:null));
-			
+			    
 			}
 
 		}
@@ -7145,7 +7145,7 @@
 
 
 	// $ANTLR start "annotation_element"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1297:1: annotation_element returns [AnnotationElement element] : ^( I_ANNOTATION_ELEMENT SIMPLE_NAME literal ) ;
+	// smaliTreeWalker.g:1297:1: annotation_element returns [AnnotationElement element] : ^( I_ANNOTATION_ELEMENT SIMPLE_NAME literal ) ;
 	public final AnnotationElement annotation_element() throws RecognitionException {
 		AnnotationElement element = null;
 
@@ -7154,21 +7154,21 @@
 		EncodedValue literal218 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1298:3: ( ^( I_ANNOTATION_ELEMENT SIMPLE_NAME literal ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1298:5: ^( I_ANNOTATION_ELEMENT SIMPLE_NAME literal )
+			// smaliTreeWalker.g:1298:3: ( ^( I_ANNOTATION_ELEMENT SIMPLE_NAME literal ) )
+			// smaliTreeWalker.g:1298:5: ^( I_ANNOTATION_ELEMENT SIMPLE_NAME literal )
 			{
-			match(input,I_ANNOTATION_ELEMENT,FOLLOW_I_ANNOTATION_ELEMENT_in_annotation_element3611);
-			match(input, Token.DOWN, null);
-			SIMPLE_NAME217=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_annotation_element3613);
+			match(input,I_ANNOTATION_ELEMENT,FOLLOW_I_ANNOTATION_ELEMENT_in_annotation_element3611); 
+			match(input, Token.DOWN, null); 
+			SIMPLE_NAME217=(CommonTree)match(input,SIMPLE_NAME,FOLLOW_SIMPLE_NAME_in_annotation_element3613); 
 			pushFollow(FOLLOW_literal_in_annotation_element3615);
 			literal218=literal();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      element = new ImmutableAnnotationElement((SIMPLE_NAME217!=null?SIMPLE_NAME217.getText():null), literal218);
-			
+			    
 			}
 
 		}
@@ -7191,7 +7191,7 @@
 
 
 	// $ANTLR start "subannotation"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1303:1: subannotation returns [String annotationType, List<AnnotationElement> elements] : ^( I_SUBANNOTATION CLASS_DESCRIPTOR ( annotation_element )* ) ;
+	// smaliTreeWalker.g:1303:1: subannotation returns [String annotationType, List<AnnotationElement> elements] : ^( I_SUBANNOTATION CLASS_DESCRIPTOR ( annotation_element )* ) ;
 	public final smaliTreeWalker.subannotation_return subannotation() throws RecognitionException {
 		smaliTreeWalker.subannotation_return retval = new smaliTreeWalker.subannotation_return();
 		retval.start = input.LT(1);
@@ -7200,14 +7200,14 @@
 		AnnotationElement annotation_element219 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1304:3: ( ^( I_SUBANNOTATION CLASS_DESCRIPTOR ( annotation_element )* ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1304:5: ^( I_SUBANNOTATION CLASS_DESCRIPTOR ( annotation_element )* )
+			// smaliTreeWalker.g:1304:3: ( ^( I_SUBANNOTATION CLASS_DESCRIPTOR ( annotation_element )* ) )
+			// smaliTreeWalker.g:1304:5: ^( I_SUBANNOTATION CLASS_DESCRIPTOR ( annotation_element )* )
 			{
 			ArrayList<AnnotationElement> elements = Lists.newArrayList();
-			match(input,I_SUBANNOTATION,FOLLOW_I_SUBANNOTATION_in_subannotation3642);
-			match(input, Token.DOWN, null);
-			CLASS_DESCRIPTOR220=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_subannotation3652);
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1307:9: ( annotation_element )*
+			match(input,I_SUBANNOTATION,FOLLOW_I_SUBANNOTATION_in_subannotation3642); 
+			match(input, Token.DOWN, null); 
+			CLASS_DESCRIPTOR220=(CommonTree)match(input,CLASS_DESCRIPTOR,FOLLOW_CLASS_DESCRIPTOR_in_subannotation3652); 
+			// smaliTreeWalker.g:1307:9: ( annotation_element )*
 			loop45:
 			while (true) {
 				int alt45=2;
@@ -7218,7 +7218,7 @@
 
 				switch (alt45) {
 				case 1 :
-					// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1307:10: annotation_element
+					// smaliTreeWalker.g:1307:10: annotation_element
 					{
 					pushFollow(FOLLOW_annotation_element_in_subannotation3663);
 					annotation_element219=annotation_element();
@@ -7226,7 +7226,7 @@
 
 
 					           elements.add(annotation_element219);
-					
+					        
 					}
 					break;
 
@@ -7235,12 +7235,12 @@
 				}
 			}
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      retval.annotationType = (CLASS_DESCRIPTOR220!=null?CLASS_DESCRIPTOR220.getText():null);
 			      retval.elements = elements;
-			
+			    
 			}
 
 		}
@@ -7258,7 +7258,7 @@
 
 
 	// $ANTLR start "field_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1317:1: field_literal returns [FieldReference value] : ^( I_ENCODED_FIELD field_reference ) ;
+	// smaliTreeWalker.g:1317:1: field_literal returns [FieldReference value] : ^( I_ENCODED_FIELD field_reference ) ;
 	public final FieldReference field_literal() throws RecognitionException {
 		FieldReference value = null;
 
@@ -7266,20 +7266,20 @@
 		ImmutableFieldReference field_reference221 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1318:3: ( ^( I_ENCODED_FIELD field_reference ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1318:5: ^( I_ENCODED_FIELD field_reference )
+			// smaliTreeWalker.g:1318:3: ( ^( I_ENCODED_FIELD field_reference ) )
+			// smaliTreeWalker.g:1318:5: ^( I_ENCODED_FIELD field_reference )
 			{
-			match(input,I_ENCODED_FIELD,FOLLOW_I_ENCODED_FIELD_in_field_literal3702);
-			match(input, Token.DOWN, null);
+			match(input,I_ENCODED_FIELD,FOLLOW_I_ENCODED_FIELD_in_field_literal3702); 
+			match(input, Token.DOWN, null); 
 			pushFollow(FOLLOW_field_reference_in_field_literal3704);
 			field_reference221=field_reference();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      value = field_reference221;
-			
+			    
 			}
 
 		}
@@ -7297,7 +7297,7 @@
 
 
 	// $ANTLR start "method_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1323:1: method_literal returns [MethodReference value] : ^( I_ENCODED_METHOD method_reference ) ;
+	// smaliTreeWalker.g:1323:1: method_literal returns [MethodReference value] : ^( I_ENCODED_METHOD method_reference ) ;
 	public final MethodReference method_literal() throws RecognitionException {
 		MethodReference value = null;
 
@@ -7305,20 +7305,20 @@
 		ImmutableMethodReference method_reference222 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1324:3: ( ^( I_ENCODED_METHOD method_reference ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1324:5: ^( I_ENCODED_METHOD method_reference )
+			// smaliTreeWalker.g:1324:3: ( ^( I_ENCODED_METHOD method_reference ) )
+			// smaliTreeWalker.g:1324:5: ^( I_ENCODED_METHOD method_reference )
 			{
-			match(input,I_ENCODED_METHOD,FOLLOW_I_ENCODED_METHOD_in_method_literal3725);
-			match(input, Token.DOWN, null);
+			match(input,I_ENCODED_METHOD,FOLLOW_I_ENCODED_METHOD_in_method_literal3725); 
+			match(input, Token.DOWN, null); 
 			pushFollow(FOLLOW_method_reference_in_method_literal3727);
 			method_reference222=method_reference();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      value = method_reference222;
-			
+			    
 			}
 
 		}
@@ -7336,7 +7336,7 @@
 
 
 	// $ANTLR start "enum_literal"
-	// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1329:1: enum_literal returns [FieldReference value] : ^( I_ENCODED_ENUM field_reference ) ;
+	// smaliTreeWalker.g:1329:1: enum_literal returns [FieldReference value] : ^( I_ENCODED_ENUM field_reference ) ;
 	public final FieldReference enum_literal() throws RecognitionException {
 		FieldReference value = null;
 
@@ -7344,20 +7344,20 @@
 		ImmutableFieldReference field_reference223 =null;
 
 		try {
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1330:3: ( ^( I_ENCODED_ENUM field_reference ) )
-			// /ssd2/floating/external/smali/smali/src/main/antlr/smaliTreeWalker.g:1330:5: ^( I_ENCODED_ENUM field_reference )
+			// smaliTreeWalker.g:1330:3: ( ^( I_ENCODED_ENUM field_reference ) )
+			// smaliTreeWalker.g:1330:5: ^( I_ENCODED_ENUM field_reference )
 			{
-			match(input,I_ENCODED_ENUM,FOLLOW_I_ENCODED_ENUM_in_enum_literal3748);
-			match(input, Token.DOWN, null);
+			match(input,I_ENCODED_ENUM,FOLLOW_I_ENCODED_ENUM_in_enum_literal3748); 
+			match(input, Token.DOWN, null); 
 			pushFollow(FOLLOW_field_reference_in_enum_literal3750);
 			field_reference223=field_reference();
 			state._fsp--;
 
-			match(input, Token.UP, null);
+			match(input, Token.UP, null); 
 
 
 			      value = field_reference223;
-			
+			    
 			}
 
 		}
diff --git a/smalidea/build.gradle b/smalidea/build.gradle
index 8cba19d..5720976 100644
--- a/smalidea/build.gradle
+++ b/smalidea/build.gradle
@@ -34,9 +34,13 @@
         maven {
             url "https://plugins.gradle.org/m2/"
         }
+        maven {
+            url 'http://dl.bintray.com/jetbrains/intellij-plugin-service'
+        }
+
     }
     dependencies {
-        classpath 'gradle.plugin.org.jetbrains:gradle-intellij-plugin:0.0.40'
+        classpath "gradle.plugin.org.jetbrains:gradle-intellij-plugin:0.1.10"
     }
 }
 
@@ -44,7 +48,8 @@
 apply plugin: 'idea'
 apply plugin: 'antlr'
 
-version = '0.03'
+
+version = '0.05'
 
 if (!('release' in gradle.startParameter.taskNames)) {
     def versionSuffix
@@ -86,14 +91,12 @@
 
 def sandboxDir = "${buildDir}/sandbox"
 
-// We don't want to use the org.jetbrains.intellij plugin when generating the idea project files,
-// so that idea classes aren't included as project dependencies, since they will already exist
-// in the plugin sdk defined for the project
 if (!('idea' in gradle.startParameter.taskNames)) {
+
     apply plugin: 'org.jetbrains.intellij'
 
     intellij {
-        version 'IC-15.0.6'
+        version 'IC-2016.3.5'
         pluginName 'smalidea'
 
         updateSinceUntilBuild false
@@ -106,8 +109,8 @@
     task ideaDirs() {
         project.afterEvaluate {
             if (intellij != null) {
-                println "IDEA Plugin jdk: ${intellij.ideaDirectory}"
-                println "sources: ${project.configurations['intellij-sources'].files[0]}"
+                println "IDEA Plugin jdk: ${intellij.ideaDependency.classes}"
+                println "sources: ${intellij.ideaDependency.getSources()}"
             }
         }
     }
@@ -115,13 +118,8 @@
     dependencies {
         compile files("${System.properties['java.home']}/../lib/tools.jar")
     }
-} else {
-    // If we're running the idea task, let's make sure nothing else is being run, since
-    // we have to use a special configuration for the idea task
-    if (gradle.startParameter.taskNames.size() > 1) {
-        throw new InvalidUserDataException("The idea task must be run by itself.")
-    }
 
+} else {
     project(':') {
         idea {
             project {
@@ -209,13 +207,15 @@
 }
 
 task extractTokens(type: org.gradle.api.tasks.Copy, dependsOn: ':smali:build') {
-    def allArtifacts = configurations.default.resolvedConfiguration.resolvedArtifacts
-    def smaliArtifact = allArtifacts.find { it.moduleVersion.id.name.equals('smali') }
+    project.afterEvaluate {
+        def allArtifacts = configurations.default.resolvedConfiguration.resolvedArtifacts
+        def smaliArtifact = allArtifacts.find { it.moduleVersion.id.name.equals('smali') }
 
-    from(zipTree(smaliArtifact.file)) {
-        include '**/*.tokens'
+        from(zipTree(smaliArtifact.file)) {
+            include '**/*.tokens'
+        }
+        into "${buildDir}/tokens"
     }
-    into "${buildDir}/tokens"
 }
 
 generateGrammarSource {
@@ -225,7 +225,6 @@
     outputDirectory(file("${buildDir}/generated-src/antlr/main/org/jf/smalidea"))
 }
 generateGrammarSource.dependsOn(extractTokens)
-
 ideaModule.dependsOn(generateGrammarSource)
 
 task release(dependsOn: 'buildPlugin') {
diff --git a/smalidea/src/main/java/org/jf/smalidea/debugging/SmaliCodeFragmentFactory.java b/smalidea/src/main/java/org/jf/smalidea/debugging/SmaliCodeFragmentFactory.java
index 5e2dd0c..82a190b 100644
--- a/smalidea/src/main/java/org/jf/smalidea/debugging/SmaliCodeFragmentFactory.java
+++ b/smalidea/src/main/java/org/jf/smalidea/debugging/SmaliCodeFragmentFactory.java
@@ -61,6 +61,7 @@
 import org.jf.smalidea.util.NameUtils;
 import org.jf.smalidea.util.PsiUtil;
 
+import javax.annotation.Nullable;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.util.List;
@@ -274,9 +275,14 @@
         return originalContext;
     }
 
+    @Nullable
     public static Value evaluateRegister(EvaluationContext context, final SmaliMethod smaliMethod,
                                          final int registerNum, final String type) throws EvaluateException {
 
+        if (registerNum >= smaliMethod.getRegisterCount()) {
+            return null;
+        }
+
         final StackFrameProxy frameProxy = context.getSuspendContext().getFrameProxy();
         if (frameProxy == null) {
             return null;
@@ -304,12 +310,21 @@
             for (SmaliInstruction instruction: smaliMethod.getInstructions()) {
                 methodSize += instruction.getInstructionSize();
             }
-            Location endLocation = method.locationOfCodeIndex((methodSize/2) - 1);
+            Location endLocation = null;
+            for (int endCodeIndex = (methodSize/2) - 1; endCodeIndex >= 0; endCodeIndex--) {
+                endLocation = method.locationOfCodeIndex(endCodeIndex);
+                if (endLocation != null) {
+                    break;
+                }
+            }
+            if (endLocation == null) {
+                return null;
+            }
 
             LocalVariable localVariable = localVariableConstructor.newInstance(vm,
                     method,
                     mapRegister(frameProxy.getStackFrame().virtualMachine(), smaliMethod, registerNum),
-                    method.locationOfCodeIndex(0),
+                    method.location(),
                     endLocation,
                     String.format("v%d", registerNum), type, null);
 
diff --git a/smalidea/src/main/java/org/jf/smalidea/debugging/SmaliPositionManager.java b/smalidea/src/main/java/org/jf/smalidea/debugging/SmaliPositionManager.java
index 781a856..9c0abbe 100644
--- a/smalidea/src/main/java/org/jf/smalidea/debugging/SmaliPositionManager.java
+++ b/smalidea/src/main/java/org/jf/smalidea/debugging/SmaliPositionManager.java
@@ -38,6 +38,7 @@
 import com.intellij.debugger.requests.ClassPrepareRequestor;
 import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.util.Computable;
+import com.intellij.psi.PsiFile;
 import com.intellij.psi.search.GlobalSearchScope;
 import com.sun.jdi.Location;
 import com.sun.jdi.ReferenceType;
@@ -60,10 +61,16 @@
         this.debugProcess = debugProcess;
     }
 
-    public SourcePosition getSourcePosition(String declaringType, String methodName, String methodSignature,
+    public SourcePosition getSourcePosition(final String declaringType, String methodName, String methodSignature,
                                             int codeIndex) throws NoDataException {
-        Collection<SmaliClass> classes = SmaliClassNameIndex.INSTANCE.get(declaringType,
-                debugProcess.getProject(), GlobalSearchScope.projectScope(debugProcess.getProject()));
+
+        Collection<SmaliClass> classes = ApplicationManager.getApplication().runReadAction(
+                new Computable<Collection<SmaliClass>>() {
+                    @Override public Collection<SmaliClass> compute() {
+                        return SmaliClassNameIndex.INSTANCE.get(declaringType, debugProcess.getProject(),
+                                GlobalSearchScope.projectScope(debugProcess.getProject()));
+                    }
+                });
 
         if (classes.size() > 0) {
             SmaliClass smaliClass = classes.iterator().next();
@@ -116,7 +123,13 @@
     @Override @NotNull
     public List<Location> locationsOfLine(@NotNull final ReferenceType type,
                                           @NotNull final SourcePosition position) throws NoDataException {
-        if (!(position.getElementAt().getContainingFile() instanceof SmaliFile)) {
+        PsiFile containingFile = ApplicationManager.getApplication().runReadAction(new Computable<PsiFile>() {
+            @Override public PsiFile compute() {
+                return position.getElementAt().getContainingFile();
+            }
+        });
+
+        if (!(containingFile instanceof SmaliFile)) {
             throw NoDataException.INSTANCE;
         }
 
@@ -125,6 +138,8 @@
         ApplicationManager.getApplication().runReadAction(new Runnable() {
             @Override
             public void run() {
+
+
                 String typeName = type.name();
                 Collection<SmaliClass> classes = SmaliClassNameIndex.INSTANCE.get(typeName, debugProcess.getProject(),
                         GlobalSearchScope.projectScope(debugProcess.getProject()));
diff --git a/smalidea/src/main/java/org/jf/smalidea/debugging/value/LazyStringReference.java b/smalidea/src/main/java/org/jf/smalidea/debugging/value/LazyStringReference.java
index 88fd007..2b52e2b 100644
--- a/smalidea/src/main/java/org/jf/smalidea/debugging/value/LazyStringReference.java
+++ b/smalidea/src/main/java/org/jf/smalidea/debugging/value/LazyStringReference.java
@@ -32,6 +32,8 @@
 package org.jf.smalidea.debugging.value;
 
 import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiSubstitutor;
+import com.sun.jdi.ObjectReference;
 import com.sun.jdi.StringReference;
 import org.jf.smalidea.psi.impl.SmaliMethod;
 
@@ -41,6 +43,11 @@
     }
 
     public String value() {
+        ObjectReference objectReference = getValue();
+        if (!(objectReference instanceof StringReference)) {
+            throw new IllegalStateException(String.format("Expecting type String, but got %s. method=%s, register=%d",
+                    objectReference.type().name(), this.method.getSignature(PsiSubstitutor.EMPTY), registerNumber));
+        }
         return getValue().value();
     }
 }
diff --git a/smalidea/src/main/java/org/jf/smalidea/debugging/value/LazyValue.java b/smalidea/src/main/java/org/jf/smalidea/debugging/value/LazyValue.java
index 0eeb010..f17df6d 100644
--- a/smalidea/src/main/java/org/jf/smalidea/debugging/value/LazyValue.java
+++ b/smalidea/src/main/java/org/jf/smalidea/debugging/value/LazyValue.java
@@ -48,10 +48,10 @@
 import javax.annotation.Nullable;
 
 public class LazyValue<T extends Value> implements Value {
-    private final int registerNumber;
-    private final Project project;
-    private final SmaliMethod method;
-    private final String type;
+    protected final int registerNumber;
+    protected final Project project;
+    protected final SmaliMethod method;
+    protected final String type;
 
     private EvaluationContext evaluationContext;
     private Value value;
diff --git a/smalidea/src/main/java/org/jf/smalidea/dexlib/instruction/SmalideaPackedSwitchPayload.java b/smalidea/src/main/java/org/jf/smalidea/dexlib/instruction/SmalideaPackedSwitchPayload.java
index 9d2a0fc..6056da3 100644
--- a/smalidea/src/main/java/org/jf/smalidea/dexlib/instruction/SmalideaPackedSwitchPayload.java
+++ b/smalidea/src/main/java/org/jf/smalidea/dexlib/instruction/SmalideaPackedSwitchPayload.java
@@ -86,7 +86,7 @@
                         return 0;
                     }
 
-                    return label.getOffset() - baseOffset;
+                    return (label.getOffset() - baseOffset) / 2;
                 }
             });
         }
diff --git a/smalidea/src/main/java/org/jf/smalidea/dexlib/instruction/SmalideaSparseSwitchPayload.java b/smalidea/src/main/java/org/jf/smalidea/dexlib/instruction/SmalideaSparseSwitchPayload.java
index 15eaea2..832c880 100644
--- a/smalidea/src/main/java/org/jf/smalidea/dexlib/instruction/SmalideaSparseSwitchPayload.java
+++ b/smalidea/src/main/java/org/jf/smalidea/dexlib/instruction/SmalideaSparseSwitchPayload.java
@@ -79,7 +79,7 @@
                             return 0;
                         }
 
-                        return label.getOffset() - baseOffset;
+                        return (label.getOffset() - baseOffset) / 2;
                     }
                 };
             }
diff --git a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliAnnotation.java b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliAnnotation.java
index e36313b..ac3dd81 100644
--- a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliAnnotation.java
+++ b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliAnnotation.java
@@ -106,7 +106,7 @@
     }
 
     @Nullable @Override public PsiAnnotationOwner getOwner() {
-        return (PsiAnnotationOwner)getStubOrPsiParent();
+        return (PsiAnnotationOwner)getParentByStub();
     }
 
     @Nullable @Override public PsiMetaData getMetaData() {
diff --git a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliField.java b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliField.java
index 7bef4e9..579401c 100644
--- a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliField.java
+++ b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliField.java
@@ -88,7 +88,7 @@
     }
 
     @Nullable @Override public PsiClass getContainingClass() {
-        return (PsiClass)getStubOrPsiParent();
+        return (PsiClass)getParentByStub();
     }
 
     @NotNull @Override public PsiType getType() {
diff --git a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliImplementsList.java b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliImplementsList.java
index 8992ab0..fb4a788 100644
--- a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliImplementsList.java
+++ b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliImplementsList.java
@@ -56,7 +56,7 @@
     }
 
     @NotNull private SmaliClassTypeElement[] getImplementsElements() {
-        SmaliClass smaliClass = (SmaliClass)getStubOrPsiParent();
+        SmaliClass smaliClass = (SmaliClass)getParentByStub();
         assert smaliClass != null;
 
         SmaliImplementsStatement[] implementsStatements = smaliClass.getImplementsStatements();
diff --git a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliInstruction.java b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliInstruction.java
index 8cb2d77..ecbdbb3 100644
--- a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliInstruction.java
+++ b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliInstruction.java
@@ -76,7 +76,7 @@
             assert instructionNode != null;
 
             // TODO: put a project level Opcodes instance with the appropriate api level somewhere
-            opcode = new Opcodes(15, false).getOpcodeByName(instructionNode.getText());
+            opcode = Opcodes.getDefault().getOpcodeByName(instructionNode.getText());
             if (opcode == null) {
                 if (instructionNode.getText().equals(".packed-switch")) {
                     return Opcode.PACKED_SWITCH_PAYLOAD;
diff --git a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliMethod.java b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliMethod.java
index 085585b..8ba618b 100644
--- a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliMethod.java
+++ b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliMethod.java
@@ -259,7 +259,7 @@
     }
 
     @Nullable @Override public SmaliClass getContainingClass() {
-        PsiElement parent = getStubOrPsiParent();
+        PsiElement parent = getParentByStub();
         if (parent instanceof SmaliClass) {
             return (SmaliClass) parent;
         }
diff --git a/smalidea/src/main/java/org/jf/smalidea/psi/index/SmaliClassFinder.java b/smalidea/src/main/java/org/jf/smalidea/psi/index/SmaliClassFinder.java
index 0ebb1ee..87b2aff 100644
--- a/smalidea/src/main/java/org/jf/smalidea/psi/index/SmaliClassFinder.java
+++ b/smalidea/src/main/java/org/jf/smalidea/psi/index/SmaliClassFinder.java
@@ -31,6 +31,7 @@
 
 package org.jf.smalidea.psi.index;
 
+import com.intellij.openapi.project.Project;
 import com.intellij.psi.PsiClass;
 import com.intellij.psi.PsiElementFinder;
 import com.intellij.psi.search.GlobalSearchScope;
@@ -40,9 +41,16 @@
 import java.util.Collection;
 
 public class SmaliClassFinder extends PsiElementFinder {
+
+    private final Project project;
+
+    public SmaliClassFinder(Project project) {
+        this.project = project;
+    }
+
     @Override
     public PsiClass findClass(@NotNull String qualifiedName, @NotNull GlobalSearchScope scope) {
-        Collection<SmaliClass> classes = SmaliClassNameIndex.INSTANCE.get(qualifiedName, scope.getProject(), scope);
+        Collection<SmaliClass> classes = SmaliClassNameIndex.INSTANCE.get(qualifiedName, project, scope);
         if (classes != null && classes.size() == 1) {
             return classes.iterator().next();
         }
diff --git a/smalidea/src/main/resources/META-INF/plugin.xml b/smalidea/src/main/resources/META-INF/plugin.xml
index 8ae92da..91326cf 100644
--- a/smalidea/src/main/resources/META-INF/plugin.xml
+++ b/smalidea/src/main/resources/META-INF/plugin.xml
@@ -1,7 +1,7 @@
 <idea-plugin version="2">
   <id>org.jf.smalidea</id>
   <name>Smalidea</name>
-  <version>0.02</version>
+  <version>0.04</version>
   <vendor email="jesusfreke@jesusfreke.com" url="http://smali.org">JesusFreke</vendor>
 
   <description><![CDATA[
diff --git a/util/build.gradle b/util/build.gradle
index 407ef71..23d6a3a 100644
--- a/util/build.gradle
+++ b/util/build.gradle
@@ -30,9 +30,9 @@
  */
 
 dependencies {
-    compile depends.commons_cli
     compile depends.findbugs
     compile depends.guava
+    compile depends.jcommander
     testCompile depends.junit
 }
 
diff --git a/util/src/main/java/org/jf/util/OldWrappedIndentingWriter.java b/util/src/main/java/org/jf/util/OldWrappedIndentingWriter.java
new file mode 100644
index 0000000..f457717
--- /dev/null
+++ b/util/src/main/java/org/jf/util/OldWrappedIndentingWriter.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright 2013, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util;
+
+import java.io.FilterWriter;
+import java.io.IOException;
+import java.io.Writer;
+
+/**
+ * Writer that wraps another writer and passes width-limited and
+ * optionally-prefixed output to its subordinate. When lines are
+ * wrapped they are automatically indented based on the start of the
+ * line.
+ */
+public final class OldWrappedIndentingWriter extends FilterWriter {
+    /** null-ok; optional prefix for every line */
+    private final String prefix;
+
+    /** &gt; 0; the maximum output width */
+    private final int width;
+
+    /** &gt; 0; the maximum indent */
+    private final int maxIndent;
+
+    /** &gt;= 0; current output column (zero-based) */
+    private int column;
+
+    /** whether indent spaces are currently being collected */
+    private boolean collectingIndent;
+
+    /** &gt;= 0; current indent amount */
+    private int indent;
+
+    /**
+     * Constructs an instance.
+     *
+     * @param out non-null; writer to send final output to
+     * @param width &gt;= 0; the maximum output width (not including
+     * <code>prefix</code>), or <code>0</code> for no maximum
+     * @param prefix non-null; the prefix for each line
+     */
+    public OldWrappedIndentingWriter(Writer out, int width, String prefix) {
+        super(out);
+
+        if (out == null) {
+            throw new NullPointerException("out == null");
+        }
+
+        if (width < 0) {
+            throw new IllegalArgumentException("width < 0");
+        }
+
+        if (prefix == null) {
+            throw new NullPointerException("prefix == null");
+        }
+
+        this.width = (width != 0) ? width : Integer.MAX_VALUE;
+        this.maxIndent = width >> 1;
+        this.prefix = (prefix.length() == 0) ? null : prefix;
+
+        bol();
+    }
+
+    /**
+     * Constructs a no-prefix instance.
+     *
+     * @param out non-null; writer to send final output to
+     * @param width &gt;= 0; the maximum output width (not including
+     * <code>prefix</code>), or <code>0</code> for no maximum
+     */
+    public OldWrappedIndentingWriter(Writer out, int width) {
+        this(out, width, "");
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void write(int c) throws IOException {
+        synchronized (lock) {
+            if (collectingIndent) {
+                if (c == ' ') {
+                    indent++;
+                    if (indent >= maxIndent) {
+                        indent = maxIndent;
+                        collectingIndent = false;
+                    }
+                } else {
+                    collectingIndent = false;
+                }
+            }
+
+            if ((column == width) && (c != '\n')) {
+                out.write('\n');
+                column = 0;
+                /*
+                 * Note: No else, so this should fall through to the next
+                 * if statement.
+                 */
+            }
+
+            if (column == 0) {
+                if (prefix != null) {
+                    out.write(prefix);
+                }
+
+                if (!collectingIndent) {
+                    for (int i = 0; i < indent; i++) {
+                        out.write(' ');
+                    }
+                    column = indent;
+                }
+            }
+
+            out.write(c);
+
+            if (c == '\n') {
+                bol();
+            } else {
+                column++;
+            }
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void write(char[] cbuf, int off, int len) throws IOException {
+        synchronized (lock) {
+            while (len > 0) {
+                write(cbuf[off]);
+                off++;
+                len--;
+            }
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void write(String str, int off, int len) throws IOException {
+        synchronized (lock) {
+            while (len > 0) {
+                write(str.charAt(off));
+                off++;
+                len--;
+            }
+        }
+    }
+
+    /**
+     * Indicates that output is at the beginning of a line.
+     */
+    private void bol() {
+        column = 0;
+        collectingIndent = (maxIndent != 0);
+        indent = 0;
+    }
+}
diff --git a/util/src/main/java/org/jf/util/PathUtil.java b/util/src/main/java/org/jf/util/PathUtil.java
index 91eb758..9ba9f30 100644
--- a/util/src/main/java/org/jf/util/PathUtil.java
+++ b/util/src/main/java/org/jf/util/PathUtil.java
@@ -28,9 +28,12 @@
 
 package org.jf.util;
 
+import com.google.common.collect.Lists;
+
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.List;
 
 public class PathUtil {
     private PathUtil() {
@@ -44,19 +47,9 @@
         return new File(getRelativeFileInternal(baseFile.getCanonicalFile(), fileToRelativize.getCanonicalFile()));
     }
 
-    public static String getRelativePath(String basePath, String pathToRelativize) throws IOException {
-        File baseFile = new File(basePath);
-        if (baseFile.isFile()) {
-            baseFile = baseFile.getParentFile();
-        }
-
-        return getRelativeFileInternal(baseFile.getCanonicalFile(),
-                new File(pathToRelativize).getCanonicalFile());
-    }
-
     static String getRelativeFileInternal(File canonicalBaseFile, File canonicalFileToRelativize) {
-        ArrayList<String> basePath = getPathComponents(canonicalBaseFile);
-        ArrayList<String> pathToRelativize = getPathComponents(canonicalFileToRelativize);
+        List<String> basePath = getPathComponents(canonicalBaseFile);
+        List<String> pathToRelativize = getPathComponents(canonicalFileToRelativize);
 
         //if the roots aren't the same (i.e. different drives on a windows machine), we can't construct a relative
         //path from one to the other, so just return the canonical file
@@ -105,21 +98,21 @@
         return sb.toString();
     }
 
-    private static ArrayList<String> getPathComponents(File file) {
+    private static List<String> getPathComponents(File file) {
         ArrayList<String> path = new ArrayList<String>();
 
         while (file != null) {
             File parentFile = file.getParentFile();
 
             if (parentFile == null) {
-                path.add(0, file.getPath());
+                path.add(file.getPath());
             } else {
-                path.add(0, file.getName());
+                path.add(file.getName());
             }
 
             file = parentFile;
         }
 
-        return path;
+        return Lists.reverse(path);
     }
 }
diff --git a/util/src/main/java/org/jf/util/SmaliHelpFormatter.java b/util/src/main/java/org/jf/util/SmaliHelpFormatter.java
deleted file mode 100644
index 3d0137e..0000000
--- a/util/src/main/java/org/jf/util/SmaliHelpFormatter.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * [The "BSD licence"]
- * Copyright (c) 2010 Ben Gruver (JesusFreke)
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The name of the author may not be used to endorse or promote products
- *    derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
- * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-package org.jf.util;
-
-import org.apache.commons.cli.HelpFormatter;
-import org.apache.commons.cli.Options;
-
-import java.io.PrintWriter;
-
-public class SmaliHelpFormatter extends HelpFormatter {
-    public void printHelp(String cmdLineSyntax, String header, Options options, Options debugOptions) {
-        super.printHelp(cmdLineSyntax, header, options, "");
-        if (debugOptions != null) {
-            System.out.println();
-            System.out.println("Debug Options:");
-            PrintWriter pw = new PrintWriter(System.out);
-            super.printOptions(pw, getWidth(), debugOptions, getLeftPadding(), getDescPadding());
-            pw.flush();
-        }
-    }
-}
diff --git a/util/src/main/java/org/jf/util/StringWrapper.java b/util/src/main/java/org/jf/util/StringWrapper.java
index 9180830..304c297 100644
--- a/util/src/main/java/org/jf/util/StringWrapper.java
+++ b/util/src/main/java/org/jf/util/StringWrapper.java
@@ -33,9 +33,92 @@
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
+import java.io.PrintStream;
+import java.text.BreakIterator;
+import java.util.Iterator;
 
 public class StringWrapper {
     /**
+     * Splits the given string into lines of maximum width maxWidth. The splitting is done using the current locale's
+     * rules for splitting lines.
+     *
+     * @param string The string to split
+     * @param maxWidth The maximum length of any line
+     * @return An iterable of Strings containing the wrapped lines
+     */
+    public static Iterable<String> wrapStringOnBreaks(@Nonnull final String string, final int maxWidth) {
+        // TODO: should we strip any trailing newlines?
+        final BreakIterator breakIterator = BreakIterator.getLineInstance();
+        breakIterator.setText(string);
+
+        return new Iterable<String>() {
+            @Override
+            public Iterator<String> iterator() {
+                return new Iterator<String>() {
+                    private int currentLineStart = 0;
+                    private boolean nextLineSet = false;
+                    private String nextLine;
+
+                    @Override
+                    public boolean hasNext() {
+                        if (!nextLineSet) {
+                            calculateNext();
+                        }
+                        return nextLine != null;
+                    }
+
+                    private void calculateNext() {
+                        int lineEnd = currentLineStart;
+                        while (true) {
+                            lineEnd = breakIterator.following(lineEnd);
+                            if (lineEnd == BreakIterator.DONE) {
+                                lineEnd = breakIterator.last();
+                                if (lineEnd <= currentLineStart) {
+                                    nextLine = null;
+                                    nextLineSet = true;
+                                    return;
+                                }
+                                break;
+                            }
+
+                            if (lineEnd - currentLineStart > maxWidth) {
+                                lineEnd = breakIterator.preceding(lineEnd);
+                                if (lineEnd <= currentLineStart) {
+                                    lineEnd = currentLineStart + maxWidth;
+                                }
+                                break;
+                            }
+
+                            if (string.charAt(lineEnd-1) == '\n') {
+                                nextLine = string.substring(currentLineStart, lineEnd-1);
+                                nextLineSet = true;
+                                currentLineStart = lineEnd;
+                                return;
+                            }
+                        }
+                        nextLine = string.substring(currentLineStart, lineEnd);
+                        nextLineSet = true;
+                        currentLineStart = lineEnd;
+                    }
+
+                    @Override
+                    public String next() {
+                        String ret = nextLine;
+                        nextLine = null;
+                        nextLineSet = false;
+                        return ret;
+                    }
+
+                    @Override
+                    public void remove() {
+                        throw new UnsupportedOperationException();
+                    }
+                };
+            }
+        };
+    }
+
+    /**
      * Splits the given string into lines using on any embedded newlines, and wrapping the text as needed to conform to
      * the given maximum line width.
      *
@@ -103,4 +186,14 @@
         System.arraycopy(arr, 0, newArr, 0, arr.length);
         return newArr;
     }
+
+    public static void printWrappedString(@Nonnull PrintStream stream, @Nonnull String string) {
+        printWrappedString(stream, string, ConsoleUtil.getConsoleWidth());
+    }
+
+    public static void printWrappedString(@Nonnull PrintStream stream, @Nonnull String string, int maxWidth) {
+        for (String str: wrapStringOnBreaks(string, maxWidth)) {
+            stream.println(str);
+        }
+    }
 }
diff --git a/util/src/main/java/org/jf/util/WrappedIndentingWriter.java b/util/src/main/java/org/jf/util/WrappedIndentingWriter.java
index eb1acda..df4575b 100644
--- a/util/src/main/java/org/jf/util/WrappedIndentingWriter.java
+++ b/util/src/main/java/org/jf/util/WrappedIndentingWriter.java
@@ -1,18 +1,18 @@
 /*
- * Copyright 2013, Google Inc.
+ * Copyright 2016, Google Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
  * met:
  *
- *     * Redistributions of source code must retain the above copyright
+ * Redistributions of source code must retain the above copyright
  * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
+ * Redistributions in binary form must reproduce the above
  * copyright notice, this list of conditions and the following disclaimer
  * in the documentation and/or other materials provided with the
  * distribution.
- *     * Neither the name of Google Inc. nor the names of its
+ * Neither the name of Google Inc. nor the names of its
  * contributors may be used to endorse or promote products derived from
  * this software without specific prior written permission.
  *
@@ -31,154 +31,94 @@
 
 package org.jf.util;
 
+import com.google.common.collect.Lists;
+
 import java.io.FilterWriter;
 import java.io.IOException;
 import java.io.Writer;
+import java.util.List;
 
-/**
- * Writer that wraps another writer and passes width-limited and
- * optionally-prefixed output to its subordinate. When lines are
- * wrapped they are automatically indented based on the start of the
- * line.
- */
-public final class WrappedIndentingWriter extends FilterWriter {
-    /** null-ok; optional prefix for every line */
-    private final String prefix;
+public class WrappedIndentingWriter extends FilterWriter {
 
-    /** &gt; 0; the maximum output width */
-    private final int width;
-
-    /** &gt; 0; the maximum indent */
     private final int maxIndent;
+    private final int maxWidth;
 
-    /** &gt;= 0; current output column (zero-based) */
-    private int column;
+    private int currentIndent = 0;
+    private final StringBuilder line = new StringBuilder();
 
-    /** whether indent spaces are currently being collected */
-    private boolean collectingIndent;
-
-    /** &gt;= 0; current indent amount */
-    private int indent;
-
-    /**
-     * Constructs an instance.
-     *
-     * @param out non-null; writer to send final output to
-     * @param width &gt;= 0; the maximum output width (not including
-     * <code>prefix</code>), or <code>0</code> for no maximum
-     * @param prefix non-null; the prefix for each line
-     */
-    public WrappedIndentingWriter(Writer out, int width, String prefix) {
+    public WrappedIndentingWriter(Writer out, int maxIndent, int maxWidth) {
         super(out);
-
-        if (out == null) {
-            throw new NullPointerException("out == null");
-        }
-
-        if (width < 0) {
-            throw new IllegalArgumentException("width < 0");
-        }
-
-        if (prefix == null) {
-            throw new NullPointerException("prefix == null");
-        }
-
-        this.width = (width != 0) ? width : Integer.MAX_VALUE;
-        this.maxIndent = width >> 1;
-        this.prefix = (prefix.length() == 0) ? null : prefix;
-
-        bol();
+        this.maxIndent = maxIndent;
+        this.maxWidth = maxWidth;
     }
 
-    /**
-     * Constructs a no-prefix instance.
-     *
-     * @param out non-null; writer to send final output to
-     * @param width &gt;= 0; the maximum output width (not including
-     * <code>prefix</code>), or <code>0</code> for no maximum
-     */
-    public WrappedIndentingWriter(Writer out, int width) {
-        this(out, width, "");
+    private void writeIndent() throws IOException {
+        for (int i=0; i<getIndent(); i++) {
+            write(' ');
+        }
     }
 
-    /** {@inheritDoc} */
-    @Override
-    public void write(int c) throws IOException {
-        synchronized (lock) {
-            if (collectingIndent) {
-                if (c == ' ') {
-                    indent++;
-                    if (indent >= maxIndent) {
-                        indent = maxIndent;
-                        collectingIndent = false;
-                    }
-                } else {
-                    collectingIndent = false;
-                }
+    private int getIndent() {
+        if (currentIndent < 0) {
+            return 0;
+        }
+        if (currentIndent > maxIndent) {
+            return maxIndent;
+        }
+        return currentIndent;
+    }
+
+    public void indent(int indent) {
+        currentIndent += indent;
+    }
+
+    public void deindent(int indent) {
+        currentIndent -= indent;
+    }
+
+    private void wrapLine() throws IOException {
+        List<String> wrapped = Lists.newArrayList(StringWrapper.wrapStringOnBreaks(line.toString(), maxWidth));
+        out.write(wrapped.get(0), 0, wrapped.get(0).length());
+        out.write('\n');
+
+        line.replace(0, line.length(), "");
+        writeIndent();
+        for (int i=1; i<wrapped.size(); i++) {
+            if (i > 1) {
+                write('\n');
             }
+            write(wrapped.get(i));
+        }
+    }
 
-            if ((column == width) && (c != '\n')) {
-                out.write('\n');
-                column = 0;
-                /*
-                 * Note: No else, so this should fall through to the next
-                 * if statement.
-                 */
-            }
-
-            if (column == 0) {
-                if (prefix != null) {
-                    out.write(prefix);
-                }
-
-                if (!collectingIndent) {
-                    for (int i = 0; i < indent; i++) {
-                        out.write(' ');
-                    }
-                    column = indent;
-                }
-            }
-
+    @Override public void write(int c) throws IOException {
+        if (c == '\n') {
+            out.write(line.toString());
             out.write(c);
-
-            if (c == '\n') {
-                bol();
-            } else {
-                column++;
+            line.replace(0, line.length(), "");
+            writeIndent();
+        } else {
+            line.append((char)c);
+            if (line.length() > maxWidth) {
+                wrapLine();
             }
         }
     }
 
-    /** {@inheritDoc} */
-    @Override
-    public void write(char[] cbuf, int off, int len) throws IOException {
-        synchronized (lock) {
-            while (len > 0) {
-                write(cbuf[off]);
-                off++;
-                len--;
-            }
+    @Override public void write(char[] cbuf, int off, int len) throws IOException {
+        for (int i=0; i<len; i++) {
+            write(cbuf[i+off]);
         }
     }
 
-    /** {@inheritDoc} */
-    @Override
-    public void write(String str, int off, int len) throws IOException {
-        synchronized (lock) {
-            while (len > 0) {
-                write(str.charAt(off));
-                off++;
-                len--;
-            }
+    @Override public void write(String str, int off, int len) throws IOException {
+        for (int i=0; i<len; i++) {
+            write(str.charAt(i+off));
         }
     }
 
-    /**
-     * Indicates that output is at the beginning of a line.
-     */
-    private void bol() {
-        column = 0;
-        collectingIndent = (maxIndent != 0);
-        indent = 0;
+    @Override public void flush() throws IOException {
+        out.write(line.toString());
+        line.replace(0, line.length(), "");
     }
 }
diff --git a/util/src/main/java/org/jf/util/jcommander/ColonParameterSplitter.java b/util/src/main/java/org/jf/util/jcommander/ColonParameterSplitter.java
new file mode 100644
index 0000000..eb628af
--- /dev/null
+++ b/util/src/main/java/org/jf/util/jcommander/ColonParameterSplitter.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util.jcommander;
+
+import com.beust.jcommander.converters.IParameterSplitter;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * A JCommander parameter splitter that splits a parameter value by colon
+ */
+public class ColonParameterSplitter implements IParameterSplitter {
+    @Override
+    public List<String> split(String value) {
+        return Arrays.asList(value.split(":"));
+    }
+}
diff --git a/util/src/main/java/org/jf/util/jcommander/Command.java b/util/src/main/java/org/jf/util/jcommander/Command.java
new file mode 100644
index 0000000..8fac0fa
--- /dev/null
+++ b/util/src/main/java/org/jf/util/jcommander/Command.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util.jcommander;
+
+import com.beust.jcommander.JCommander;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import org.jf.util.ConsoleUtil;
+
+import javax.annotation.Nonnull;
+import java.util.List;
+
+public abstract class Command {
+
+    @Nonnull
+    protected final List<JCommander> commandAncestors;
+
+    public Command(@Nonnull List<JCommander> commandAncestors) {
+        this.commandAncestors = commandAncestors;
+    }
+
+    public void usage() {
+        System.out.println(new HelpFormatter()
+                .width(ConsoleUtil.getConsoleWidth())
+                .format(getCommandHierarchy()));
+    }
+
+    protected void setupCommand(JCommander jc) {
+    }
+
+    protected JCommander getJCommander() {
+        JCommander parentJc = Iterables.getLast(commandAncestors);
+        return parentJc.getCommands().get(this.getClass().getAnnotation(ExtendedParameters.class).commandName());
+    }
+
+    public List<JCommander> getCommandHierarchy() {
+        List<JCommander> commandHierarchy = Lists.newArrayList(commandAncestors);
+        commandHierarchy.add(getJCommander());
+        return commandHierarchy;
+    }
+
+    public abstract void run();
+}
diff --git a/util/src/main/java/org/jf/util/jcommander/ExtendedCommands.java b/util/src/main/java/org/jf/util/jcommander/ExtendedCommands.java
new file mode 100644
index 0000000..209d94e
--- /dev/null
+++ b/util/src/main/java/org/jf/util/jcommander/ExtendedCommands.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util.jcommander;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.ParameterDescription;
+import com.beust.jcommander.Parameterized;
+import com.beust.jcommander.Parameters;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+import java.lang.reflect.Field;
+
+/**
+ * Utilities related to "extended" commands - JCommander commands with additional information
+ */
+public class ExtendedCommands {
+
+    @Nonnull
+    private static ExtendedParameters getExtendedParameters(Object command) {
+        ExtendedParameters anno = command.getClass().getAnnotation(ExtendedParameters.class);
+        if (anno == null) {
+            throw new IllegalStateException("All extended commands should have an ExtendedParameters annotation: " +
+                    command.getClass().getCanonicalName());
+        }
+        return anno;
+    }
+
+    @Nonnull
+    public static String commandName(JCommander jc) {
+        return getExtendedParameters(jc.getObjects().get(0)).commandName();
+    }
+
+    @Nonnull
+    public static String commandName(Object command) {
+        return getExtendedParameters(command).commandName();
+    }
+
+    @Nonnull
+    public static String[] commandAliases(JCommander jc) {
+        return commandAliases(jc.getObjects().get(0));
+    }
+
+    @Nonnull
+    public static String[] commandAliases(Object command) {
+        return getExtendedParameters(command).commandAliases();
+    }
+
+    public static boolean includeParametersInUsage(JCommander jc) {
+        return includeParametersInUsage(jc.getObjects().get(0));
+    }
+
+    public static boolean includeParametersInUsage(Object command) {
+        return getExtendedParameters(command).includeParametersInUsage();
+    }
+
+    @Nonnull
+    public static String postfixDescription(JCommander jc) {
+        return postfixDescription(jc.getObjects().get(0));
+    }
+
+    @Nonnull
+    public static String postfixDescription(Object command) {
+        return getExtendedParameters(command).postfixDescription();
+    }
+
+    public static void addExtendedCommand(JCommander jc, Command command) {
+        jc.addCommand(commandName(command), command, commandAliases(command));
+        command.setupCommand(command.getJCommander());
+    }
+
+    @Nonnull
+    public static String[] parameterArgumentNames(ParameterDescription parameterDescription) {
+        Parameterized parameterized = parameterDescription.getParameterized();
+
+        Class cls = parameterDescription.getObject().getClass();
+        Field field = null;
+        while (cls != Object.class) {
+            try {
+                field = cls.getDeclaredField(parameterized.getName());
+            } catch (NoSuchFieldException ex) {
+                cls = cls.getSuperclass();
+                continue;
+            }
+            break;
+        }
+
+        assert field != null;
+        ExtendedParameter extendedParameter = field.getAnnotation(ExtendedParameter.class);
+        if (extendedParameter != null) {
+            return extendedParameter.argumentNames();
+        }
+
+        return new String[0];
+    }
+
+    @Nullable
+    public static JCommander getSubcommand(JCommander jc, String commandName) {
+        if (jc.getCommands().containsKey(commandName)) {
+            return jc.getCommands().get(commandName);
+        } else {
+            for (JCommander command : jc.getCommands().values()) {
+                for (String alias: commandAliases(command)) {
+                    if (commandName.equals(alias)) {
+                        return command;
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
+    @Nullable
+    public static String getCommandDescription(@Nonnull JCommander jc) {
+        Parameters parameters = jc.getObjects().get(0).getClass().getAnnotation(Parameters.class);
+        if (parameters == null) {
+            return null;
+        }
+        return parameters.commandDescription();
+    }
+}
diff --git a/util/src/main/java/org/jf/util/jcommander/ExtendedParameter.java b/util/src/main/java/org/jf/util/jcommander/ExtendedParameter.java
new file mode 100644
index 0000000..81f78c2
--- /dev/null
+++ b/util/src/main/java/org/jf/util/jcommander/ExtendedParameter.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util.jcommander;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ExtendedParameter {
+    String[] argumentNames();
+}
diff --git a/util/src/main/java/org/jf/util/jcommander/ExtendedParameters.java b/util/src/main/java/org/jf/util/jcommander/ExtendedParameters.java
new file mode 100644
index 0000000..965d2b2
--- /dev/null
+++ b/util/src/main/java/org/jf/util/jcommander/ExtendedParameters.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util.jcommander;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ExtendedParameters {
+    boolean includeParametersInUsage() default false;
+    String commandName();
+    String[] commandAliases() default { };
+    String postfixDescription() default "";
+}
diff --git a/util/src/main/java/org/jf/util/jcommander/HelpFormatter.java b/util/src/main/java/org/jf/util/jcommander/HelpFormatter.java
new file mode 100644
index 0000000..e807d5f
--- /dev/null
+++ b/util/src/main/java/org/jf/util/jcommander/HelpFormatter.java
@@ -0,0 +1,316 @@
+/*
+ * Copyright 2016, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package org.jf.util.jcommander;
+
+import com.beust.jcommander.JCommander;
+import com.beust.jcommander.ParameterDescription;
+import com.beust.jcommander.Parameters;
+import com.beust.jcommander.internal.Lists;
+import com.google.common.base.Joiner;
+import com.google.common.collect.Iterables;
+import org.jf.util.WrappedIndentingWriter;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class HelpFormatter {
+
+    private int width = 80;
+
+    @Nonnull
+    public HelpFormatter width(int width) {
+        this.width = width;
+        return this;
+    }
+
+    @Nonnull
+    private static ExtendedParameters getExtendedParameters(JCommander jc) {
+        ExtendedParameters anno = jc.getObjects().get(0).getClass().getAnnotation(ExtendedParameters.class);
+        if (anno == null) {
+            throw new IllegalStateException("All commands should have an ExtendedParameters annotation");
+        }
+        return anno;
+    }
+
+    @Nonnull
+    private static List<String> getCommandAliases(JCommander jc) {
+        return Lists.newArrayList(getExtendedParameters(jc).commandAliases());
+    }
+
+    private static boolean includeParametersInUsage(@Nonnull JCommander jc) {
+        return getExtendedParameters(jc).includeParametersInUsage();
+    }
+
+    @Nonnull
+    private static String getPostfixDescription(@Nonnull JCommander jc) {
+        return getExtendedParameters(jc).postfixDescription();
+    }
+
+    private int getParameterArity(ParameterDescription param) {
+        if (param.getParameter().arity() > 0) {
+            return param.getParameter().arity();
+        }
+        Class<?> type = param.getParameterized().getType();
+        if ((type == boolean.class || type == Boolean.class)) {
+            return 0;
+        }
+        return 1;
+    }
+
+    private List<ParameterDescription> getSortedParameters(JCommander jc) {
+        List<ParameterDescription> parameters = Lists.newArrayList(jc.getParameters());
+
+        final Pattern pattern = Pattern.compile("^-*(.*)$");
+
+        Collections.sort(parameters, new Comparator<ParameterDescription>() {
+            @Override public int compare(ParameterDescription o1, ParameterDescription o2) {
+                String s1;
+                Matcher matcher = pattern.matcher(o1.getParameter().names()[0]);
+                if (matcher.matches()) {
+                    s1 = matcher.group(1);
+                } else {
+                    throw new IllegalStateException();
+                }
+
+                String s2;
+                matcher = pattern.matcher(o2.getParameter().names()[0]);
+                if (matcher.matches()) {
+                    s2 = matcher.group(1);
+                } else {
+                    throw new IllegalStateException();
+                }
+
+                return s1.compareTo(s2);
+            }
+        });
+        return parameters;
+    }
+
+    @Nonnull
+    public String format(@Nonnull JCommander... jc) {
+        return format(Arrays.asList(jc));
+    }
+
+    @Nonnull
+    public String format(@Nonnull List<JCommander> commandHierarchy) {
+        try {
+            StringWriter stringWriter = new StringWriter();
+            WrappedIndentingWriter writer = new WrappedIndentingWriter(stringWriter, width - 5, width);
+
+            JCommander leafJc = Iterables.getLast(commandHierarchy);
+
+            writer.write("usage:");
+            writer.indent(2);
+
+            for (JCommander jc: commandHierarchy) {
+                writer.write(" ");
+                writer.write(ExtendedCommands.commandName(jc));
+            }
+
+            if (includeParametersInUsage(leafJc)) {
+                for (ParameterDescription param : leafJc.getParameters()) {
+                    if (!param.getParameter().hidden()) {
+                        writer.write(" [");
+                        writer.write(param.getParameter().getParameter().names()[0]);
+                        writer.write("]");
+                    }
+                }
+            } else {
+                if (!leafJc.getParameters().isEmpty()) {
+                    writer.write(" [<options>]");
+                }
+            }
+
+            if (!leafJc.getCommands().isEmpty()) {
+                writer.write(" [<command [<args>]]");
+            }
+
+            if (leafJc.getMainParameter() != null) {
+                String[] argumentNames = ExtendedCommands.parameterArgumentNames(leafJc.getMainParameter());
+                if (argumentNames.length == 0) {
+                    writer.write(" <args>");
+                } else {
+                    String argumentName = argumentNames[0];
+                    boolean writeAngleBrackets = !argumentName.startsWith("<") && !argumentName.startsWith("[");
+                    writer.write(" ");
+                    if (writeAngleBrackets) {
+                        writer.write("<");
+                    }
+                    writer.write(argumentNames[0]);
+                    if (writeAngleBrackets) {
+                        writer.write(">");
+                    }
+                }
+            }
+
+            writer.deindent(2);
+
+            String commandDescription = ExtendedCommands.getCommandDescription(leafJc);
+            if (commandDescription != null) {
+                writer.write("\n");
+                writer.write(commandDescription);
+            }
+
+            if (!leafJc.getParameters().isEmpty() || leafJc.getMainParameter() != null) {
+                writer.write("\n\nOptions:");
+                writer.indent(2);
+                for (ParameterDescription param : getSortedParameters(leafJc)) {
+                    if (!param.getParameter().hidden()) {
+                        writer.write("\n");
+                        writer.indent(4);
+                        if (!param.getNames().isEmpty()) {
+                            writer.write(Joiner.on(',').join(param.getParameter().names()));
+                        }
+                        if (getParameterArity(param) > 0) {
+                            String[] argumentNames = ExtendedCommands.parameterArgumentNames(param);
+                            for (int i = 0; i < getParameterArity(param); i++) {
+                                writer.write(" ");
+                                if (i < argumentNames.length) {
+                                    writer.write("<");
+                                    writer.write(argumentNames[i]);
+                                    writer.write(">");
+                                } else {
+                                    writer.write("<arg>");
+                                }
+                            }
+                        }
+                        if (param.getDescription() != null && !param.getDescription().isEmpty()) {
+                            writer.write(" - ");
+                            writer.write(param.getDescription());
+                        }
+                        if (param.getDefault() != null) {
+                            String defaultValue = null;
+                            if (param.getParameterized().getType() == Boolean.class ||
+                                    param.getParameterized().getType() == Boolean.TYPE) {
+                                if ((Boolean)param.getDefault()) {
+                                    defaultValue = "True";
+                                }
+                            } else if (List.class.isAssignableFrom(param.getParameterized().getType())) {
+                                if (!((List)param.getDefault()).isEmpty()) {
+                                    defaultValue = param.getDefault().toString();
+                                }
+                            } else {
+                                defaultValue = param.getDefault().toString();
+                            }
+                            if (defaultValue != null) {
+                                writer.write(" (default: ");
+                                writer.write(defaultValue);
+                                writer.write(")");
+                            }
+                        }
+                        writer.deindent(4);
+                    }
+                }
+
+                if (leafJc.getMainParameter() != null) {
+                    String[] argumentNames = ExtendedCommands.parameterArgumentNames(leafJc.getMainParameter());
+                    writer.write("\n");
+                    writer.indent(4);
+                    if (argumentNames.length > 0) {
+                        writer.write("<");
+                        writer.write(argumentNames[0]);
+                        writer.write(">");
+                    } else {
+                        writer.write("<args>");
+                    }
+
+                    if (leafJc.getMainParameterDescription() != null) {
+                        writer.write(" - ");
+                        writer.write(leafJc.getMainParameterDescription());
+                    }
+                    writer.deindent(4);
+                }
+                writer.deindent(2);
+            }
+
+            if (!leafJc.getCommands().isEmpty()) {
+                writer.write("\n\nCommands:");
+                writer.indent(2);
+
+
+                List<Entry<String, JCommander>> entryList = Lists.newArrayList(leafJc.getCommands().entrySet());
+                Collections.sort(entryList, new Comparator<Entry<String, JCommander>>() {
+                    @Override public int compare(Entry<String, JCommander> o1, Entry<String, JCommander> o2) {
+                        return o1.getKey().compareTo(o2.getKey());
+                    }
+                });
+
+                for (Entry<String, JCommander> entry : entryList) {
+                    String commandName = entry.getKey();
+                    JCommander command = entry.getValue();
+
+                    Object arg = command.getObjects().get(0);
+                    Parameters parametersAnno = arg.getClass().getAnnotation(Parameters.class);
+                    if (!parametersAnno.hidden()) {
+                        writer.write("\n");
+                        writer.indent(4);
+                        writer.write(commandName);
+                        List<String> aliases = getCommandAliases(command);
+                        if (!aliases.isEmpty()) {
+                            writer.write("(");
+                            writer.write(Joiner.on(',').join(aliases));
+                            writer.write(")");
+                        }
+
+                        String commandDesc = leafJc.getCommandDescription(commandName);
+                        if (commandDesc != null) {
+                            writer.write(" - ");
+                            writer.write(commandDesc);
+                        }
+                        writer.deindent(4);
+                    }
+                }
+                writer.deindent(2);
+            }
+
+            String postfixDescription = getPostfixDescription(leafJc);
+            if (!postfixDescription.isEmpty()) {
+                writer.write("\n\n");
+                writer.write(postfixDescription);
+            }
+
+            writer.flush();
+
+            return stringWriter.getBuffer().toString();
+        } catch (IOException ex) {
+            throw new RuntimeException(ex);
+        }
+    }
+}
diff --git a/util/src/test/java/org/jf/util/StringWrapperTest.java b/util/src/test/java/org/jf/util/StringWrapperTest.java
index 64dca33..94c7914 100644
--- a/util/src/test/java/org/jf/util/StringWrapperTest.java
+++ b/util/src/test/java/org/jf/util/StringWrapperTest.java
@@ -31,11 +31,35 @@
 
 package org.jf.util;
 
+import com.google.common.collect.Lists;
 import org.junit.Assert;
 import org.junit.Test;
 
+import java.util.List;
+
 public class StringWrapperTest {
     @Test
+    public void testWrapStringByWords() {
+        validateResult2(new String[]{"abc", "abcdef", "abcdef"},
+                "abc\nabcdefabcdef", 6);
+
+        validateResult2(new String[]{"abc", "abcdef", " ", "abcdef"},
+                "abc\nabcdef abcdef", 6);
+
+        validateResult2(new String[]{"abc", "abcde ", "fabcde", "f"},
+                "abc\nabcde fabcdef", 6);
+
+        validateResult2(new String[]{"abc def ghi ", "kjl mon pqr ", "stu vwx yz"},
+                "abc def ghi kjl mon pqr stu vwx yz", 14);
+
+        validateResult2(new String[]{"abcdefg", "hikjlmo", "npqrstu", "vwxyz"},
+                "abcdefghikjlmonpqrstuvwxyz", 7);
+
+        validateResult2(new String[]{"abc", "defhig"},
+                "abc\ndefhig", 20);
+    }
+
+    @Test
     public void testWrapString() {
         validateResult(
                 new String[]{"abc", "abcdef", "abcdef"},
@@ -115,4 +139,15 @@
             Assert.assertEquals(expected[i], actual[i]);
         }
     }
+
+    public static void validateResult2(String[] expected, String textToWrap, int maxWidth) {
+        List<String> result = Lists.newArrayList(StringWrapper.wrapStringOnBreaks(textToWrap, maxWidth));
+
+        Assert.assertEquals(expected.length, result.size());
+        int i;
+        for (i=0; i<result.size(); i++) {
+            Assert.assertTrue(i < expected.length);
+            Assert.assertEquals(expected[i], result.get(i));
+        }
+    }
 }