diff --git a/changes/annotations_fix b/changes/annotations_fix
index d3cd7f343ef1d671c5ece2ec44b349dcdaac89eb..b259a306d2c9c30e2cc61d5b9558b30f64213cdf 100644
--- a/changes/annotations_fix
+++ b/changes/annotations_fix
@@ -4,5 +4,7 @@
       Previously we would ignore such annotations at first, but cache
       them to disk anyway.  Bugfix on 0.2.0.8-alpha. Found by piebeer.
 
-
+  o Minor bugfixes
+    - Enforce multiplicity rules when parsing annotations.  Bugfix on
+      0.2.0.8-alpha. Found by piebeer.
 
diff --git a/src/or/routerparse.c b/src/or/routerparse.c
index da08e466442280d49de55d2b5803b5c1fd922519..3d8ca143172ebbc63651bcb12fd076ccce9eb57e 100644
--- a/src/or/routerparse.c
+++ b/src/or/routerparse.c
@@ -3181,6 +3181,9 @@ tokenize_string(memarea_t *area,
     end = start+strlen(start);
   for (i = 0; i < _NIL; ++i)
     counts[i] = 0;
+
+  SMARTLIST_FOREACH(out, const directory_token_t *, t, ++counts[t->tp]);
+
   while (*s < end && (!tok || tok->tp != _EOF)) {
     tok = get_next_token(area, s, end, table);
     if (tok->tp == _ERR) {