diff --git a/src/_zkapauthorizer/_storage_client.py b/src/_zkapauthorizer/_storage_client.py
index fae88f4a79e23ec83784974c9a45db7e55f60012..3973164db6257f2d5d8b4bc1f4bc94c0b609db97 100644
--- a/src/_zkapauthorizer/_storage_client.py
+++ b/src/_zkapauthorizer/_storage_client.py
@@ -127,19 +127,33 @@ class ZKAPAuthorizerStorageClient(object):
             storage_index,
         )
 
+    @inlineCallbacks
     def add_lease(
             self,
             storage_index,
             renew_secret,
             cancel_secret,
     ):
-        return self._rref.callRemote(
-            "add_lease",
-            self._get_encoded_passes(add_lease_message(storage_index), 1),
+        share_sizes = (yield self._rref.callRemote(
+            "share_sizes",
             storage_index,
-            renew_secret,
-            cancel_secret,
-        )
+            None,
+        )).values()
+        num_passes = required_passes(BYTES_PER_PASS, share_sizes)
+        # print("Adding lease to {!r} with sizes {} with {} passes".format(
+        #     storage_index,
+        #     share_sizes,
+        #     num_passes,
+        # ))
+        returnValue((
+            yield self._rref.callRemote(
+                "add_lease",
+                self._get_encoded_passes(add_lease_message(storage_index), num_passes),
+                storage_index,
+                renew_secret,
+                cancel_secret,
+            )
+        ))
 
     def renew_lease(
             self,
diff --git a/src/_zkapauthorizer/tests/test_storage_protocol.py b/src/_zkapauthorizer/tests/test_storage_protocol.py
index f567d320928009eb74d5b3e45efb30d9eff954cf..c045a03f37d7418c1adb1e7862c0b27e61853939 100644
--- a/src/_zkapauthorizer/tests/test_storage_protocol.py
+++ b/src/_zkapauthorizer/tests/test_storage_protocol.py
@@ -252,10 +252,10 @@ class ShareTests(TestCase):
         storage_index=storage_indexes(),
         renew_secrets=tuples(lease_renew_secrets(), lease_renew_secrets()),
         cancel_secret=lease_cancel_secrets(),
-        sharenum=sharenums(),
+        sharenums=sharenum_sets(),
         size=sizes(),
     )
-    def test_add_lease(self, storage_index, renew_secrets, cancel_secret, sharenum, size):
+    def test_add_lease(self, storage_index, renew_secrets, cancel_secret, sharenums, size):
         """
         A lease can be added to an existing immutable share.
         """
@@ -274,7 +274,7 @@ class ShareTests(TestCase):
             storage_index,
             add_lease_secret,
             cancel_secret,
-            {sharenum},
+            sharenums,
             size,
             canary=self.canary,
         )
@@ -293,10 +293,10 @@ class ShareTests(TestCase):
         storage_index=storage_indexes(),
         renew_secret=lease_renew_secrets(),
         cancel_secret=lease_cancel_secrets(),
-        sharenum=sharenums(),
+        sharenums=sharenum_sets(),
         size=sizes(),
     )
-    def test_renew_lease(self, storage_index, renew_secret, cancel_secret, sharenum, size):
+    def test_renew_lease(self, storage_index, renew_secret, cancel_secret, sharenums, size):
         """
         A lease on an immutable share can be updated to expire at a later time.
         """
@@ -315,7 +315,7 @@ class ShareTests(TestCase):
             storage_index,
             renew_secret,
             cancel_secret,
-            {sharenum},
+            sharenums,
             size,
             canary=self.canary,
         )
@@ -328,13 +328,10 @@ class ShareTests(TestCase):
             ),
         )
 
-        # Based on Tahoe-LAFS' hard-coded renew time.
-        RENEW_INTERVAL = 60 * 60 * 24 * 31
-
         [lease] = self.anonymous_storage_server.get_leases(storage_index)
         self.assertThat(
             lease.get_expiration_time(),
-            Equals(int(now + RENEW_INTERVAL)),
+            Equals(int(now + self.server.LEASE_PERIOD.total_seconds())),
         )
 
     @given(