diff --git a/src/_zkapauthorizer/model.py b/src/_zkapauthorizer/model.py
index c8d2a3258efcfa9d074308de9a9aa79723a27459..331ec04a990f526cd651abd15e3e3c0cb2a14739 100644
--- a/src/_zkapauthorizer/model.py
+++ b/src/_zkapauthorizer/model.py
@@ -460,7 +460,12 @@ class Voucher(object):
 
     @classmethod
     def from_json_v1(cls, values):
-        return cls(**values)
+        return cls(
+            number=values[u"number"],
+            created=None if values[u"created"] is None else parse_datetime(values[u"created"]),
+            redeemed=values[u"redeemed"],
+            token_count=values[u"token_count"],
+        )
 
 
     def to_json(self):
@@ -476,5 +481,6 @@ class Voucher(object):
             u"number": self.number,
             u"created": None if self.created is None else self.created.isoformat(),
             u"redeemed": self.redeemed,
+            u"token_count": self.token_count,
             u"version": 1,
         }
diff --git a/src/_zkapauthorizer/tests/strategies.py b/src/_zkapauthorizer/tests/strategies.py
index c9c7ec226b7df5be6a4065850fa3fe07edd2280a..6b21896d9a0c70d15766044cff5cd9ef68064d3d 100644
--- a/src/_zkapauthorizer/tests/strategies.py
+++ b/src/_zkapauthorizer/tests/strategies.py
@@ -25,6 +25,8 @@ import attr
 from hypothesis.strategies import (
     one_of,
     just,
+    none,
+    booleans,
     binary,
     characters,
     text,
@@ -35,6 +37,7 @@ from hypothesis.strategies import (
     dictionaries,
     fixed_dictionaries,
     builds,
+    datetimes,
 )
 
 from twisted.web.test.requesthelper import (
@@ -52,7 +55,8 @@ from allmydata.client import (
 from ..model import (
     Pass,
     RandomToken,
-    UnblindedToken
+    UnblindedToken,
+    Voucher,
 )
 
 
@@ -216,6 +220,16 @@ def vouchers():
     )
 
 
+def voucher_objects():
+    return builds(
+        Voucher,
+        number=vouchers(),
+        created=one_of(none(), datetimes()),
+        redeemed=booleans(),
+        token_count=one_of(none(), integers(min_value=1)),
+    )
+
+
 def random_tokens():
     """
     Build random tokens as unicode strings.
diff --git a/src/_zkapauthorizer/tests/test_model.py b/src/_zkapauthorizer/tests/test_model.py
index f53bd5b35fc0066a764c252856f71726e2776dff..925f464fe664fe85d0a18ef0b16bd98f65d59ccc 100644
--- a/src/_zkapauthorizer/tests/test_model.py
+++ b/src/_zkapauthorizer/tests/test_model.py
@@ -72,6 +72,7 @@ from ..model import (
 from .strategies import (
     tahoe_configs,
     vouchers,
+    voucher_objects,
     random_tokens,
     unblinded_tokens,
 )
@@ -261,15 +262,14 @@ class VoucherTests(TestCase):
     """
     Tests for ``Voucher``.
     """
-    @given(vouchers())
-    def test_json_roundtrip(self, voucher):
+    @given(voucher_objects())
+    def test_json_roundtrip(self, reference):
         """
         ``Voucher.to_json . Voucher.from_json → id``
         """
-        ref = Voucher(voucher)
         self.assertThat(
-            Voucher.from_json(ref.to_json()),
-            Equals(ref),
+            Voucher.from_json(reference.to_json()),
+            Equals(reference),
         )