diff --git a/nixos/modules/tests/exercise-storage.py b/nixos/modules/tests/exercise-storage.py
index d56232a4919e415c3331b7c8fc105016ca260b46..cc09a43f27dcbae136ea0173b2f76f93805bfe2b 100755
--- a/nixos/modules/tests/exercise-storage.py
+++ b/nixos/modules/tests/exercise-storage.py
@@ -12,6 +12,7 @@ from subprocess import check_output
 from io import BytesIO
 
 import requests
+import hyperlink
 
 def main():
     (clientDir,) = argv[1:]
@@ -19,28 +20,62 @@ def main():
     someData = urandom(2 ** 16)
 
     api_root = get_api_root(clientDir)
-    cap = put(api_root, someData)
-    dataReadBack = get(api_root, cap)
 
+    exercise_immutable(api_root, someData)
+    exercise_mkdir(api_root)
+
+def exercise_immutable(api_root, someData):
+    cap = tahoe_put(api_root, someData)
+    dataReadBack = tahoe_get(api_root, cap)
     assert someData == dataReadBack
+    return cap
 
+def exercise_mkdir(api_root):
+    cap = tahoe_mkdir(api_root)
+    info = tahoe_stat(api_root, cap)
+    assert info
 
 def get_api_root(path):
     with open(path + u"/node.url") as f:
-        return f.read().strip()
-
+        return hyperlink.URL.from_text(f.read().strip())
 
-def put(api_root, data):
-    response = requests.put(api_root + u"uri", BytesIO(data))
+def tahoe_put(api_root, data, **kwargs):
+    response = requests.put(
+        api_root.child(u"uri").to_uri(),
+        BytesIO(data),
+    )
     response.raise_for_status()
     return response.text
 
-
-def get(api_root, cap):
-    response = requests.get(api_root + u"uri/" + cap, stream=True)
+def tahoe_get(api_root, cap):
+    response = requests.get(
+        api_root.child(u"uri", cap).to_uri(),
+        stream=True,
+    )
     response.raise_for_status()
     return response.raw.read()
 
+def tahoe_mkdir(api_root):
+    response = requests.post(
+        api_root.child(u"uri").replace(query={u"t": u"mkdir", u"format": u"mdmf"}).to_uri(),
+    )
+    response.raise_for_status()
+    return response.text
+
+def tahoe_link(api_root, dir_cap, name, subject_cap):
+    response = requests.post(
+        api_root.child(u"uri", dir_cap, name).replace(query={u"t": u"uri"}).to_uri(),
+        BytesIO(subject_cap),
+    )
+    response.raise_for_status()
+    return response.text
+
+def tahoe_stat(api_root, cap):
+    response = requests.get(
+        api_root.child(u"uri", cap).replace(query={u"t": u"json"}).to_uri(),
+    )
+    response.raise_for_status()
+    return response.json
 
 if __name__ == u'__main__':
     main()
diff --git a/nixos/modules/tests/private-storage.nix b/nixos/modules/tests/private-storage.nix
index e4d541989804992036b324eecd817c91920f62e9..cc2fa798f3654a0d249c8c21a9c9499a0740fc43 100644
--- a/nixos/modules/tests/private-storage.nix
+++ b/nixos/modules/tests/private-storage.nix
@@ -53,7 +53,7 @@ import <nixpkgs/nixos/tests/make-test.nix> {
           # plugin.
           pspkgs.privatestorage
           # Support for the tests we'll run.
-          (pkgs.python3.withPackages (ps: [ ps.requests ]))
+          (pkgs.python3.withPackages (ps: [ ps.requests ps.hyperlink ]))
         ];
       } // networkConfig;
 
diff --git a/nixos/pkgs/zkapauthorizer-repo.nix b/nixos/pkgs/zkapauthorizer-repo.nix
index e85e99405a6e7003c4ba968053a5662a4f73f689..727827b61af700bbc96b6ae35d672925d96a3f75 100644
--- a/nixos/pkgs/zkapauthorizer-repo.nix
+++ b/nixos/pkgs/zkapauthorizer-repo.nix
@@ -4,6 +4,6 @@ in
   pkgs.fetchFromGitHub {
     owner = "PrivateStorageio";
     repo = "ZKAPAuthorizer";
-    rev = "996f0acdb46dc0f2ef14a06ae0012771b43c087c";
-    sha256 = "09kkzq6pd61xwaq6dlfl25rqbi7ssdzkvknhsx59cyanxpk66rcd";
+    rev = "ede17a6e2e53d56978dcd5962322987c15d59634";
+    sha256 = "1i1cmj6mnmr3i1md7qks57xqdp1blhr375jsxds29glk9b8wp757";
   }
\ No newline at end of file