diff --git a/.gitignore b/.gitignore
index 3ab234f023eeef7ac5bb003d96d0ca1d21596b4a..db2ee3a2f3fa54431b73adf65233086e9cde2441 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@
 src/test_suite
 lib/hush
 examples/dns
+examples/base64
 TAGS
 *.swp
 *.swo
diff --git a/examples/Makefile b/examples/Makefile
index dc4a0f3085e8c137baca56ea79000c8b104605f9..d2c76cf4f931017629d8d675c857b9d188e1df8e 100644
--- a/examples/Makefile
+++ b/examples/Makefile
@@ -1,13 +1,15 @@
 
 OUTPUTS := dns.o \
-	   dns
+	   dns \
+	   base64.o \
+	   base64
 
 TOPLEVEL := ../
 
 include ../common.mk
 
 
-all: dns
+all: dns base64
 
 dns: LDFLAGS:=-L../src -lhammer $(LDFLAGS)
 dns: dns.o rr.o dns_common.o
@@ -17,4 +19,10 @@ dns.o: ../src/hammer.h dns_common.h
 
 rr.o: ../src/hammer.h rr.h dns_common.h
 
-dns_common.o: ../src/hammer.h dns_common.h
\ No newline at end of file
+dns_common.o: ../src/hammer.h dns_common.h
+
+base64: LDFLAGS:=-L../src -lhammer $(LDFLAGS)
+base64: base64.o
+	$(call hush, "Linking $@") $(CC) -o $@ $^ $(LDFLAGS)
+
+base64.o: ../src/hammer.h
diff --git a/examples/base64.c b/examples/base64.c
new file mode 100644
index 0000000000000000000000000000000000000000..beb2484f9dcbbf2add81c2295572731ca06fa487
--- /dev/null
+++ b/examples/base64.c
@@ -0,0 +1,54 @@
+#include "../src/hammer.h"
+
+const HParser* document = NULL;
+
+void init_parser(void)
+{
+    // CORE
+    const HParser *digit = h_ch_range(0x30, 0x39);
+    const HParser *alpha = h_choice(h_ch_range(0x41, 0x5a), h_ch_range(0x61, 0x7a), NULL);
+
+    // AUX.
+    const HParser *plus = h_ch('+');
+    const HParser *slash = h_ch('/');
+    const HParser *equals = h_ch('=');
+
+    const HParser *bsfdig = h_choice(alpha, digit, plus, slash, NULL);
+    const HParser *bsfdig_4bit = h_choice(
+        h_ch('A'), h_ch('E'), h_ch('I'), h_ch('M'), h_ch('Q'), h_ch('U'),
+        h_ch('Y'), h_ch('c'), h_ch('g'), h_ch('k'), h_ch('o'), h_ch('s'),
+        h_ch('w'), h_ch('0'), h_ch('4'), h_ch('8'), NULL);
+    const HParser *bsfdig_2bit = h_choice(h_ch('A'), h_ch('Q'), h_ch('g'), h_ch('w'), NULL);
+    const HParser *base64_2 = h_sequence(bsfdig, bsfdig, bsfdig_4bit, equals, NULL);
+    const HParser *base64_1 = h_sequence(bsfdig, bsfdig_2bit, equals, equals, NULL);
+    const HParser *base64 = h_choice(base64_2, base64_1, NULL);
+        // why does this parse "A=="?!
+        // why does this parse "aaA=" but not "aA=="?!
+
+    document = base64;
+}
+
+
+#include <stdio.h>
+
+int main(int argc, char **argv)
+{
+    uint8_t input[102400];
+    size_t inputsize;
+    const HParseResult *result;
+
+    init_parser();
+
+    inputsize = fread(input, 1, sizeof(input), stdin);
+    fprintf(stderr, "inputsize=%lu\ninput=", inputsize);
+    fwrite(input, 1, inputsize, stderr);
+    result = h_parse(document, input, inputsize);
+
+    if(result) {
+        fprintf(stderr, "parsed=%lld bytes\n", result->bit_length/8);
+        h_pprint(stdout, result->ast, 0, 0);
+        return 0;
+    } else {
+        return 1;
+    }
+}