diff --git a/src/Tahoe/Directory.hs b/src/Tahoe/Directory.hs
index f661cded842dfaac0bc3968d9fb12899df079bf3..27451c23940ddcf8e1c63206664e06c528df115c 100644
--- a/src/Tahoe/Directory.hs
+++ b/src/Tahoe/Directory.hs
@@ -8,6 +8,7 @@ import Tahoe.Directory.Internal.Capability (
     ConfidentialShowable (..),
     DirectoryCapability (..),
     pReadCHK,
+    pReadSDMF,
     pVerifyCHK,
  )
 import Tahoe.Directory.Internal.Parsing (parse, serialize)
diff --git a/src/Tahoe/Directory/Internal/Capability.hs b/src/Tahoe/Directory/Internal/Capability.hs
index efdc0d30bf0c5ce793334178cd7ab2755d235663..87737f1b270cdcc33048c7bbbdf94dd79689d6a3 100644
--- a/src/Tahoe/Directory/Internal/Capability.hs
+++ b/src/Tahoe/Directory/Internal/Capability.hs
@@ -5,6 +5,8 @@ module Tahoe.Directory.Internal.Capability where
 import qualified Data.Text as T
 import Data.Void (Void)
 import qualified Tahoe.CHK.Capability as CHK
+import qualified Tahoe.SDMF as SDMF
+
 import Text.Megaparsec (Parsec, getInput, setInput)
 
 {- | Something which contains confidential information and can be rendered as
@@ -19,7 +21,7 @@ class ConfidentialShowable s where
 {- | A wrapper around some other capability type which signals that the
  plaintext is an encoded list of files.
 -}
-newtype DirectoryCapability a = DirectoryCapability a
+newtype DirectoryCapability a = DirectoryCapability a deriving (Eq, Ord, Show)
 
 instance ConfidentialShowable (DirectoryCapability CHK.Verifier) where
     confidentiallyShow (DirectoryCapability a) =
@@ -54,3 +56,10 @@ pReadCHK = do
     setInput $ T.replace "URI:DIR2-CHK:" "URI:CHK:" s
     v <- CHK.pReader
     pure $ DirectoryCapability v
+
+pReadSDMF :: Parser (DirectoryCapability SDMF.Reader)
+pReadSDMF = do
+    s <- getInput
+    setInput $ T.replace "URI:DIR2-RO:" "URI:SSK-RO:" s
+    v <- SDMF.pReader
+    pure $ DirectoryCapability v