diff --git a/jni/Example.java b/jni/Example.java
new file mode 100644
index 0000000000000000000000000000000000000000..5871d798248eff8beb40c07a3dd1d5a4072b1486
--- /dev/null
+++ b/jni/Example.java
@@ -0,0 +1,49 @@
+/**
+* Example JHammer usage
+*/
+public class Example
+{
+
+private HParser initParser()
+{
+    HParser digit = Hammer.chRange(0x30, 0x39);
+    HParser alpha = Hammer.choice({Hammer.chRange(0x41, 0x5a), Hammer.chRange(0x61, 0x7a)});
+    
+    HParser plus = Hammer.ch('+');
+    HParser slash = Hammer.ch('/');
+    HParser equals = Hammer.ch('=');
+    HParser bsfdig = Hammer.choice({alpha, digit, plus, slash});
+
+    byte[] AEIMQUYcgkosw048 = "AEIMQUYcgkosw048".getBytes();
+    HParser bsfdig_4bit = Hammer.in(AEIMQUYcgkosw048, AEIMQUYcgkosw048.length);
+    byte[] AQgw = "AQgw".getBytes();
+    HParser bsfdig_2bit = Hammer.in(AQgw, AQgw.length);
+    HParser base64_3 = Hammer.repeatN(bsfdig, 4);
+    HParser base64_2 = Hammer.sequence({bsfdig, bsfdig, bsfdig_4bit, equals});
+    HParser base64_1 = Hammer.sequence({bsfdig, bsfdig_2bit, equals, equals});
+    HParser base64 = Hammer.sequence({  Hammer.many(base64_3),
+                                        Hammer.optional(Hammer.choice({base64_2, base64_1}))
+                                    });
+
+    return Hammer.sequence({Hammer.whitespace(base64), Hammer.whitespace(Hammer.endP()}});
+}
+
+public static void main(String args[])
+{
+    byte[] input = "RXMgaXN0IFNwYXJnZWx6ZWl0IQo=".getBytes();
+    int length = input.length;
+    HParsedResult result = Hammer.parse(initParser(), input, length);
+    if(result == null)
+    {
+        System.out.println("FAIL");
+    }
+    else
+    {
+        System.out.println("PASS");
+        //TODO: Pretty print
+    }
+}
+
+
+
+}
diff --git a/jni/com/upstandinghackers/hammer/Hammer.java b/jni/com/upstandinghackers/hammer/Hammer.java
index 08b75b1efcab93d945a20ebdb8bbb5c82c58a143..e7ad571b9b19d9a26aab1dba26d28a79b7e79792 100644
--- a/jni/com/upstandinghackers/hammer/Hammer.java
+++ b/jni/com/upstandinghackers/hammer/Hammer.java
@@ -16,51 +16,50 @@ public class Hammer
         TT_SEQUENCE(16),
         TT_ERR(32),
         TT_USER(64),
-        TT_MAX(128);
 
         private int value;
         public int getValue() { return this.value; }
         private HTokenType(int value) { this.value = value; }
     }
 
-    public static native HParseResult hParse(HParser parser, byte[] input, int length);
-    public static native HParser hToken(byte[] str, int length);
-    public static native HParser hCh(byte c);
-    public static native HParser hChRange(byte from, byte to);
-    public static native HParser hIntRange(HParser p, int lower, int upper);
-    public static native HParser hBits(int len, boolean sign);
-    public static native HParser hInt64();
-    public static native HParser hInt32();
-    public static native HParser hInt16();
-    public static native HParser hInt8();
-    public static native HParser hUInt64();
-    public static native HParser hUInt32();
-    public static native HParser hUInt16();
-    public static native HParser hUInt8();
-    public static native HParser hWhitespace(HParser p);
-    public static native HParser hLeft(HParser p, HParser q);
-    public static native HParser hRight(HParser p, HParser q);
-    public static native HParser hMiddle(HParser p, HParser x, HParser q);
-    public static native HParser hAction(HParser p, HAction a);
-    public static native HParser hIn(byte[] charset, int length);
-    public static native HParser hEndP();
-    public static native HParser hNothingP();
-    public static native HParser hSequence(HParser[] parsers);
-    public static native HParser hChoice(HParser[] parsers);
-    public static native HParser hButNot(HParser p1, HParser p2);
-    public static native HParser hDifference(HParser p1, HParser p2);
-    public static native HParser hXor(HParser p1, HParser p2);
-    public static native HParser hMany(HParser p);
-    public static native HParser hMany1(HParser p);
-    public static native HParser hRepeatN(HParser p, int n);
-    public static native HParser hOptional(HParser p);
-    public static native HParser hIgnore(HParser p);
-    public static native HParser hSepBy(HParser p, HParser sep);
-    public static native HParser hSepBy1(HParser p, HParser sep);
-    public static native HParser hEpsilonP();
-    public static native HParser hLengthValue(HParser length, HParser value);
-    public static native HParser hAttrBool(HParser p, HPredicate pred);
-    public static native HParser hAnd(HParser p);
-    public static native HParser hNot(HParser p);
-    public static native HParser hIndirect();
+    public static native HParseResult parse(HParser parser, byte[] input, int length);
+    public static native HParser token(byte[] str, int length);
+    public static native HParser ch(byte c);
+    public static native HParser chRange(byte from, byte to);
+    public static native HParser intRange(HParser p, int lower, int upper);
+    public static native HParser bits(int len, boolean sign);
+    public static native HParser int64();
+    public static native HParser int32();
+    public static native HParser int16();
+    public static native HParser int8();
+    public static native HParser uInt64();
+    public static native HParser uInt32();
+    public static native HParser uInt16();
+    public static native HParser uInt8();
+    public static native HParser whitespace(HParser p);
+    public static native HParser left(HParser p, HParser q);
+    public static native HParser right(HParser p, HParser q);
+    public static native HParser middle(HParser p, HParser x, HParser q);
+    public static native HParser action(HParser p, HAction a);
+    public static native HParser in(byte[] charset, int length);
+    public static native HParser endP();
+    public static native HParser nothingP();
+    public static native HParser sequence(HParser[] parsers);
+    public static native HParser choice(HParser[] parsers);
+    public static native HParser butNot(HParser p1, HParser p2);
+    public static native HParser difference(HParser p1, HParser p2);
+    public static native HParser xor(HParser p1, HParser p2);
+    public static native HParser many(HParser p);
+    public static native HParser many1(HParser p);
+    public static native HParser repeatN(HParser p, int n);
+    public static native HParser optional(HParser p);
+    public static native HParser ignore(HParser p);
+    public static native HParser sepBy(HParser p, HParser sep);
+    public static native HParser sepBy1(HParser p, HParser sep);
+    public static native HParser epsilonP();
+    public static native HParser lengthValue(HParser length, HParser value);
+    public static native HParser attrBool(HParser p, HPredicate pred);
+    public static native HParser and(HParser p);
+    public static native HParser not(HParser p);
+    public static native HParser indirect();
 }