diff --git a/src/_zkapauthorizer/_storage_client.py b/src/_zkapauthorizer/_storage_client.py
index a9cced29fa16c610492e53c1f9622ed9eadd6610..656679768f898ae67a4a63ea2bac01f88bf9ec80 100644
--- a/src/_zkapauthorizer/_storage_client.py
+++ b/src/_zkapauthorizer/_storage_client.py
@@ -66,7 +66,6 @@ from .storage_common import (
     required_passes,
     allocate_buckets_message,
     add_lease_message,
-    renew_lease_message,
     slot_testv_and_readv_and_writev_message,
     has_writes,
     get_required_new_passes_for_mutable_write,
@@ -403,33 +402,6 @@ class ZKAPAuthorizerStorageClient(object):
         )
         returnValue(result)
 
-    @inline_callbacks
-    @with_rref
-    def renew_lease(
-            self,
-            rref,
-            storage_index,
-            renew_secret,
-    ):
-        share_sizes = (yield rref.callRemote(
-            "share_sizes",
-            storage_index,
-            None,
-        )).values()
-        num_passes = required_passes(self._pass_value, share_sizes)
-
-        result = yield call_with_passes(
-            lambda passes: rref.callRemote(
-                "renew_lease",
-                _encode_passes(passes),
-                storage_index,
-                renew_secret,
-            ),
-            num_passes,
-            partial(self._get_passes, renew_lease_message(storage_index).encode("utf-8")),
-        )
-        returnValue(result)
-
     @with_rref
     def stat_shares(self, rref, storage_indexes):
         return rref.callRemote(
diff --git a/src/_zkapauthorizer/_storage_server.py b/src/_zkapauthorizer/_storage_server.py
index ffe74b8e024cd51e81d3d7ef25257e776ac42f15..a7a5616f35ee934868c5a3ae3b33c1953bbbb98a 100644
--- a/src/_zkapauthorizer/_storage_server.py
+++ b/src/_zkapauthorizer/_storage_server.py
@@ -103,7 +103,6 @@ from .storage_common import (
     required_passes,
     allocate_buckets_message,
     add_lease_message,
-    renew_lease_message,
     slot_testv_and_readv_and_writev_message,
     has_writes,
     get_required_new_passes_for_mutable_write,
@@ -302,24 +301,6 @@ class ZKAPAuthorizerStorageServer(Referenceable):
         )
         return self._original.remote_add_lease(storage_index, *a, **kw)
 
-    def remote_renew_lease(self, passes, storage_index, *a, **kw):
-        """
-        Pass-through after a pass check to ensure clients can only extend the
-        duration of share storage if they present valid passes.
-        """
-        valid_passes = _ValidationResult.validate_passes(
-            renew_lease_message(storage_index),
-            passes,
-            self._signing_key,
-        )
-        check_pass_quantity_for_lease(
-            self._pass_value,
-            storage_index,
-            valid_passes,
-            self._original,
-        )
-        return self._original.remote_renew_lease(storage_index, *a, **kw)
-
     def remote_advise_corrupt_share(self, *a, **kw):
         """
         Pass-through without a pass check to let clients inform us of possible
diff --git a/src/_zkapauthorizer/foolscap.py b/src/_zkapauthorizer/foolscap.py
index 1478d76136278b53f46135bfbf8516b196e83f30..b8f12425e72f3c3e80df6350f59f16a6c93bb635 100644
--- a/src/_zkapauthorizer/foolscap.py
+++ b/src/_zkapauthorizer/foolscap.py
@@ -141,21 +141,6 @@ def add_arguments(schema, kwargs):
     return modified_schema
 
 
-def remoteinterface_hasattr(ri, name):
-    """
-    :param InterfaceClass ri: A ``RemoteInterface`` to inspect.
-    :param str name: The name of an attribute.
-
-    :return bool: ``True`` if and only if ``ri`` has the attribute named by
-        ``name``, ``False`` otherwise.
-    """
-    try:
-        ri[name]
-    except KeyError:
-        return False
-    return True
-
-
 class RIPrivacyPassAuthorizedStorageServer(RemoteInterface):
     """
     An object which can store and retrieve shares, subject to pass-based
@@ -176,14 +161,6 @@ class RIPrivacyPassAuthorizedStorageServer(RemoteInterface):
 
     add_lease = add_passes(RIStorageServer["add_lease"])
 
-    if remoteinterface_hasattr(RIStorageServer, "renew_lease"):
-        # Tahoe-LAFS 1.16.0 drops renew_lease from the interface.  Do likewise
-        # here, if we discover we have a version of Tahoe that has done so.
-        # If Tahoe has dropped this method then nothing in Tahoe is going to
-        # use it so it is fine if we don't define it.  We also do not use it
-        # ourselves.
-        renew_lease = add_passes(RIStorageServer["renew_lease"])
-
     get_buckets = RIStorageServer["get_buckets"]
 
     def share_sizes(
diff --git a/src/_zkapauthorizer/storage_common.py b/src/_zkapauthorizer/storage_common.py
index 487c164aa7f5cce69a2e9a66d5cbbfaa475ecd4e..829d5a17e3facf46a12fa2685e788d012e086622 100644
--- a/src/_zkapauthorizer/storage_common.py
+++ b/src/_zkapauthorizer/storage_common.py
@@ -70,7 +70,6 @@ def _message_maker(label):
 # construction for different Tahoe-LAFS storage operations.
 allocate_buckets_message = _message_maker(u"allocate_buckets")
 add_lease_message = _message_maker(u"add_lease")
-renew_lease_message = _message_maker(u"renew_lease")
 slot_testv_and_readv_and_writev_message = _message_maker(u"slot_testv_and_readv_and_writev")
 
 # The number of bytes we're willing to store for a lease period for each pass
diff --git a/src/_zkapauthorizer/tests/test_storage_protocol.py b/src/_zkapauthorizer/tests/test_storage_protocol.py
index bad75149a0da939fd6692c903915fe2e126fc4b9..f8d57a446e68d4d2a3758c5941df3fdf286d9e96 100644
--- a/src/_zkapauthorizer/tests/test_storage_protocol.py
+++ b/src/_zkapauthorizer/tests/test_storage_protocol.py
@@ -25,7 +25,6 @@ from fixtures import (
 )
 from testtools import (
     TestCase,
-    skipIf,
 )
 from testtools.matchers import (
     Always,
@@ -76,7 +75,6 @@ from challenge_bypass_ristretto import (
     random_signing_key,
 )
 
-from allmydata import __version__ as allmydata_version
 from allmydata.storage.common import (
     storage_index_to_dir,
 )
@@ -547,53 +545,6 @@ class ShareTests(TestCase):
         leases = list(self.anonymous_storage_server.get_leases(storage_index))
         self.assertThat(leases, HasLength(2))
 
-    @skipIf(allmydata_version >= "1.16.", "Tahoe-LAFS 1.16.0 removed renew_lease")
-    @given(
-        storage_index=storage_indexes(),
-        renew_secret=lease_renew_secrets(),
-        cancel_secret=lease_cancel_secrets(),
-        sharenums=sharenum_sets(),
-        size=sizes(),
-    )
-    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.
-        """
-        # Hypothesis causes our storage server to be used many times.  Clean
-        # up between iterations.
-        cleanup_storage_server(self.anonymous_storage_server)
-
-        # Take control of time (in this hacky, fragile way) so we can verify
-        # the expiration time gets bumped by the renewal.
-        now = 1000000000.5
-        self.useFixture(MonkeyPatch("time.time", lambda: now))
-
-        # Create a share we can toy with.
-        write_toy_shares(
-            self.anonymous_storage_server,
-            storage_index,
-            renew_secret,
-            cancel_secret,
-            sharenums,
-            size,
-            canary=self.canary,
-        )
-
-        now += 100000
-        self.assertThat(
-            self.client.renew_lease(
-                storage_index,
-                renew_secret,
-            ),
-            succeeded(Always()),
-        )
-
-        [lease] = self.anonymous_storage_server.get_leases(storage_index)
-        self.assertThat(
-            lease.get_expiration_time(),
-            Equals(int(now + self.server.LEASE_PERIOD.total_seconds())),
-        )
-
     def _stat_shares_immutable_test(self, storage_index, sharenum, size, clock, leases, write_shares):
         # Hypothesis causes our storage server to be used many times.  Clean
         # up between iterations.
diff --git a/src/_zkapauthorizer/tests/test_storage_server.py b/src/_zkapauthorizer/tests/test_storage_server.py
index e5f0e770244838551d03315799ffc6a02d20d704..1adab62a8b9e6e6605424f2a2ee78dc75f2f87bd 100644
--- a/src/_zkapauthorizer/tests/test_storage_server.py
+++ b/src/_zkapauthorizer/tests/test_storage_server.py
@@ -97,7 +97,6 @@ from ..storage_common import (
     required_passes,
     allocate_buckets_message,
     add_lease_message,
-    renew_lease_message,
     slot_testv_and_readv_and_writev_message,
     get_implied_data_length,
     get_required_new_passes_for_mutable_write,
@@ -541,40 +540,6 @@ class PassValidationTests(TestCase):
             add_lease_message,
         )
 
-    @given(
-        storage_index=storage_indexes(),
-        secrets=tuples(
-            lease_renew_secrets(),
-            lease_cancel_secrets(),
-        ),
-        sharenums=sharenum_sets(),
-        allocated_size=sizes(),
-    )
-    def test_renew_lease_fails_without_passes(self, storage_index, secrets, sharenums, allocated_size):
-        """
-        If ``remote_renew_lease`` is invoked without supplying enough passes to
-        cover the storage for all shares on the given storage index, the
-        operation fails with ``MorePassesRequired``.
-        """
-        renew_secret, cancel_secret = secrets
-        def renew_lease(storage_server, passes):
-            return storage_server.doRemoteCall(
-                "renew_lease", (
-                    passes,
-                    storage_index,
-                    renew_secret,
-                ),
-                {},
-            )
-        return self._test_lease_operation_fails_without_passes(
-            storage_index,
-            secrets,
-            sharenums,
-            allocated_size,
-            renew_lease,
-            renew_lease_message,
-        )
-
     @given(
         slot=storage_indexes(),
         secrets=tuples(