Repository: TBD54566975/ssi-service
Pull request #419 (2023-05-10 00:18:18)

uptake latest ssi sdk and add applicant to credential application
- uptake latest ssi sdk
- add applicant id to credential response building

codecov-commenter: ## [Codecov](https://app.codecov.io/gh/TBD54566975/ssi-service/pull/419?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975) Report
> Merging [#419](https://app.codecov.io/gh/TBD54566975/ssi-service/pull/419?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975) (ff21039) into [main](https://app.codecov.io/gh/TBD54566975/ssi-service/commit/faa7a9ad62798d1b32692548c0bd109460ae8b94?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975) (faa7a9a) will **decrease** coverage by `0.04%`.
> The diff coverage is `44.23%`.

```diff
@@            Coverage Diff             @@
##             main     #419      +/-   ##
==========================================
- Coverage   20.87%   20.83%   -0.04%     
==========================================
  Files          48       48              
  Lines        5437     5437              
==========================================
- Hits         1135     1133       -2     
- Misses       4124     4126       +2     
  Partials      178      178              
```


| [Impacted Files](https://app.codecov.io/gh/TBD54566975/ssi-service/pull/419?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975) | Coverage Δ | |
|---|---|---|
| [internal/did/access.go](https://app.codecov.io/gh/TBD54566975/ssi-service/pull/419?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975#diff-aW50ZXJuYWwvZGlkL2FjY2Vzcy5nbw==) | `0.00% <0.00%> (ø)` | |
| [pkg/authorizationserver/oauth2\_auth.go](https://app.codecov.io/gh/TBD54566975/ssi-service/pull/419?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975#diff-cGtnL2F1dGhvcml6YXRpb25zZXJ2ZXIvb2F1dGgyX2F1dGguZ28=) | `61.40% <ø> (ø)` | |
| [pkg/server/router/did.go](https://app.codecov.io/gh/TBD54566975/ssi-service/pull/419?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975#diff-cGtnL3NlcnZlci9yb3V0ZXIvZGlkLmdv) | `4.67% <ø> (ø)` | |
| [pkg/service/credential/service.go](https://app.codecov.io/gh/TBD54566975/ssi-service/pull/419?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975#diff-cGtnL3NlcnZpY2UvY3JlZGVudGlhbC9zZXJ2aWNlLmdv) | `0.00% <0.00%> (ø)` | |
| [pkg/service/did/handler.go](https://app.codecov.io/gh/TBD54566975/ssi-service/pull/419?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975#diff-cGtnL3NlcnZpY2UvZGlkL2hhbmRsZXIuZ28=) | `0.00% <0.00%> (ø)` | |
| [pkg/service/did/key.go](https://app.codecov.io/gh/TBD54566975/ssi-service/pull/419?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975#diff-cGtnL3NlcnZpY2UvZGlkL2tleS5nbw==) | `0.00% <0.00%> (ø)` | |
| [pkg/service/did/resolution/resolver.go](https://app.codecov.io/gh/TBD54566975/ssi-service/pull/419?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975#diff-cGtnL3NlcnZpY2UvZGlkL3Jlc29sdXRpb24vcmVzb2x2ZXIuZ28=) | `0.00% <0.00%> (ø)` | |
| [pkg/service/did/resolution/universal.go](https://app.codecov.io/gh/TBD54566975/ssi-service/pull/419?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975#diff-cGtnL3NlcnZpY2UvZGlkL3Jlc29sdXRpb24vdW5pdmVyc2FsLmdv) | `0.00% <0.00%> (ø)` | |
| [pkg/service/did/service.go](https://app.codecov.io/gh/TBD54566975/ssi-service/pull/419?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975#diff-cGtnL3NlcnZpY2UvZGlkL3NlcnZpY2UuZ28=) | `0.00% <0.00%> (ø)` | |
| [pkg/service/did/web.go](https://app.codecov.io/gh/TBD54566975/ssi-service/pull/419?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975#diff-cGtnL3NlcnZpY2UvZGlkL3dlYi5nbw==) | `0.00% <0.00%> (ø)` | |
| ... and [4 more](https://app.codecov.io/gh/TBD54566975/ssi-service/pull/419?src=pr&el=tree-more&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975) | |



Patch:
diff --git a/go.mod b/go.mod
index b0d5b9b..bc8507b 100644
--- a/go.mod
+++ b/go.mod
@@ -4,7 +4,7 @@ go 1.20
 
 require (
 	github.com/BurntSushi/toml v1.2.1
-	github.com/TBD54566975/ssi-sdk v0.0.3-alpha.0.20230420000447-6d87cd195314
+	github.com/TBD54566975/ssi-sdk v0.0.3-alpha.0.20230509223354-6d90443e0f37
 	github.com/alicebob/miniredis/v2 v2.30.2
 	github.com/ardanlabs/conf v1.5.0
 	github.com/benbjohnson/clock v1.3.3
@@ -47,10 +47,10 @@ require (
 	github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302 // indirect
 	github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df // indirect
 	github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 // indirect
-	github.com/bits-and-blooms/bitset v1.6.0 // indirect
+	github.com/bits-and-blooms/bitset v1.7.0 // indirect
 	github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect
-	github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 // indirect
 	github.com/cespare/xxhash/v2 v2.2.0 // indirect
+	github.com/cloudflare/circl v1.3.3 // indirect
 	github.com/cristalhq/jwt/v4 v4.0.2 // indirect
 	github.com/dave/jennifer v1.4.0 // indirect
 	github.com/davecgh/go-spew v1.1.1 // indirect
@@ -63,7 +63,7 @@ require (
 	github.com/fsnotify/fsnotify v1.4.9 // indirect
 	github.com/go-logr/logr v1.2.4 // indirect
 	github.com/go-logr/stdr v1.2.2 // indirect
-	github.com/go-playground/validator/v10 v10.12.0 // indirect
+	github.com/go-playground/validator/v10 v10.13.0 // indirect
 	github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect
 	github.com/golang/mock v1.6.0 // indirect
 	github.com/golang/protobuf v1.5.2 // indirect
@@ -73,12 +73,15 @@ require (
 	github.com/hashicorp/go-cleanhttp v0.5.1 // indirect
 	github.com/hashicorp/go-retryablehttp v0.6.8 // indirect
 	github.com/hashicorp/hcl v1.0.0 // indirect
-	github.com/hyperledger/aries-framework-go v0.2.0 // indirect
-	github.com/hyperledger/aries-framework-go/spi v0.0.0-20221025204933-b807371b6f1e // indirect
+	github.com/hyperledger/aries-framework-go v0.3.1 // indirect
+	github.com/hyperledger/aries-framework-go/component/kmscrypto v0.0.0-20230427134832-0c9969493bd3 // indirect
+	github.com/hyperledger/aries-framework-go/component/log v0.0.0-20230427134832-0c9969493bd3 // indirect
+	github.com/hyperledger/aries-framework-go/component/models v0.0.0-20230501135648-a9a7ad029347 // indirect
+	github.com/hyperledger/aries-framework-go/spi v0.0.0-20230427134832-0c9969493bd3 // indirect
 	github.com/inconshreveable/mousetrap v1.0.0 // indirect
 	github.com/kilic/bls12-381 v0.1.1-0.20210503002446-7b7597926c69 // indirect
 	github.com/klauspost/cpuid/v2 v2.0.9 // indirect
-	github.com/leodido/go-urn v1.2.2 // indirect
+	github.com/leodido/go-urn v1.2.3 // indirect
 	github.com/lestrrat-go/backoff/v2 v2.0.8 // indirect
 	github.com/lestrrat-go/blackmagic v1.0.1 // indirect
 	github.com/lestrrat-go/httpcc v1.0.1 // indirect
@@ -93,7 +96,7 @@ require (
 	github.com/multiformats/go-base32 v0.1.0 // indirect
 	github.com/multiformats/go-base36 v0.2.0 // indirect
 	github.com/multiformats/go-multibase v0.2.0 // indirect
-	github.com/multiformats/go-multicodec v0.8.1 // indirect
+	github.com/multiformats/go-multicodec v0.9.0 // indirect
 	github.com/multiformats/go-multihash v0.2.1 // indirect
 	github.com/multiformats/go-varint v0.0.7 // indirect
 	github.com/ory/go-acc v0.2.6 // indirect
@@ -121,8 +124,8 @@ require (
 	golang.org/x/mod v0.8.0 // indirect
 	golang.org/x/net v0.9.0 // indirect
 	golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d // indirect
-	golang.org/x/sys v0.7.0 // indirect
-	golang.org/x/term v0.7.0 // indirect
+	golang.org/x/sys v0.8.0 // indirect
+	golang.org/x/term v0.8.0 // indirect
 	golang.org/x/text v0.9.0 // indirect
 	golang.org/x/tools v0.6.0 // indirect
 	google.golang.org/appengine v1.6.5 // indirect
diff --git a/go.sum b/go.sum
index 1953860..0705182 100644
--- a/go.sum
+++ b/go.sum
@@ -27,8 +27,8 @@ github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbt
 github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
 github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
 github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
-github.com/TBD54566975/ssi-sdk v0.0.3-alpha.0.20230420000447-6d87cd195314 h1:UJOrdjU6FwwpYe/1vOjCop/3vE8IaHEwM2iaF1738JU=
-github.com/TBD54566975/ssi-sdk v0.0.3-alpha.0.20230420000447-6d87cd195314/go.mod h1:7FXpy1tc6eGLx39H4J5KlZ7MNre1isAbyKab4JtuCPs=
+github.com/TBD54566975/ssi-sdk v0.0.3-alpha.0.20230509223354-6d90443e0f37 h1:Fn+4f+6VaWtO5vHC+3PcdnIA8q3T321lcYEm5c3w4II=
+github.com/TBD54566975/ssi-sdk v0.0.3-alpha.0.20230509223354-6d90443e0f37/go.mod h1:O4iANflxGCX0NbjHOhthq0X0il2ZYNMYlUnjEa0rsC0=
 github.com/ajg/form v0.0.0-20160822230020-523a5da1a92f/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY=
 github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
@@ -55,8 +55,8 @@ github.com/benbjohnson/clock v1.3.3 h1:g+rSsSaAzhHJYcIQE78hJ3AhyjjtQvleKDjlhdBnI
 github.com/benbjohnson/clock v1.3.3/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
-github.com/bits-and-blooms/bitset v1.6.0 h1:FVfaUsleKAUTJnaN9Fd1YFFi1S8vAX5xeXnXHFYOojM=
-github.com/bits-and-blooms/bitset v1.6.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
+github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo=
+github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
 github.com/bmatcuk/doublestar/v2 v2.0.3/go.mod h1:QMmcs3H2AUQICWhfzLXz+IYln8lRQmTZRptLie8RgRw=
 github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
 github.com/bsm/ginkgo/v2 v2.5.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w=
@@ -66,7 +66,6 @@ github.com/bsm/gomega v1.26.0 h1:LhQm+AFcgV2M0WyKroMASzAzCAJVpAxQXv4SaI9a69Y=
 github.com/btcsuite/btcd/btcec/v2 v2.3.2 h1:5n0X6hX0Zk+6omWcihdYvdAlGf2DfasC0GMf7DClJ3U=
 github.com/btcsuite/btcd/btcec/v2 v2.3.2/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04=
 github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 h1:KdUfX2zKommPRa+PD0sWZUyXe9w277ABlgELO7H04IM=
-github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
 github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce h1:YtWJF7RHm2pYCvA5t0RPmAaLUhREsKuKd+SLhxFbFeQ=
 github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
 github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
@@ -83,6 +82,8 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P
 github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
 github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs=
+github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA=
 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
 github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
 github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
@@ -235,8 +236,8 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o
 github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
 github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
 github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
-github.com/go-playground/validator/v10 v10.12.0 h1:E4gtWgxWxp8YSxExrQFv5BpCahla0PVF2oTTEYaWQGI=
-github.com/go-playground/validator/v10 v10.12.0/go.mod h1:hCAPuzYvKdP33pxWa+2+6AIKXEKqjIUyqsNCtbsSJrA=
+github.com/go-playground/validator/v10 v10.13.0 h1:cFRQdfaSMCOSfGCCLB20MHvuoHb/s5G8L5pu2ppK5AQ=
+github.com/go-playground/validator/v10 v10.13.0/go.mod h1:dwu7+CG8/CtBiJFZDz4e+5Upb6OLw04gtBYw0mcG/z4=
 github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
 github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
 github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
@@ -587,10 +588,17 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ
 github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
-github.com/hyperledger/aries-framework-go v0.2.0 h1:N654d2MJBmm9IFMJ4VQi5h9suKh+04cvAfRTI3o/05o=
-github.com/hyperledger/aries-framework-go v0.2.0/go.mod h1:qrOxEGVsu8M2RahaJgM8nz9AcAHjR/dKd1JIJ3ieJhY=
-github.com/hyperledger/aries-framework-go/spi v0.0.0-20221025204933-b807371b6f1e h1:SxbXlF39661T9w/L9PhVdtbJfJ51Pm4JYEEW6XfZHEQ=
-github.com/hyperledger/aries-framework-go/spi v0.0.0-20221025204933-b807371b6f1e/go.mod h1:oryUyWb23l/a3tAP9KW+GBbfcfqp9tZD4y5hSkFrkqI=
+github.com/hyperledger/aries-framework-go v0.3.1 h1:44hOqFdVtXPRmfxK1dHds1g1mouJFNeP1D/PBjDxRv8=
+github.com/hyperledger/aries-framework-go v0.3.1/go.mod h1:SorUysWEBw+uyXhY5RAtg2iyNkWTIIPM8+Slkt1Spno=
+github.com/hyperledger/aries-framework-go/component/kmscrypto v0.0.0-20230427134832-0c9969493bd3 h1:PCbDSujjQ6oTEnAHgtThNmbS7SPAYEDBlKOnZFE+Ujw=
+github.com/hyperledger/aries-framework-go/component/kmscrypto v0.0.0-20230427134832-0c9969493bd3/go.mod h1:aEk0vHBmZsAdDfXaI12Kg5ipZGiB3qNqgbPt/e/Hm2s=
+github.com/hyperledger/aries-framework-go/component/log v0.0.0-20230427134832-0c9969493bd3 h1:x5qFQraTX86z9GCwF28IxfnPm6QH5YgHaX+4x97Jwvw=
+github.com/hyperledger/aries-framework-go/component/log v0.0.0-20230427134832-0c9969493bd3/go.mod h1:CvYs4l8X2NrrF93weLOu5RTOIJeVdoZITtjEflyuTyM=
+github.com/hyperledger/aries-framework-go/component/models v0.0.0-20230501135648-a9a7ad029347 h1:oPGUCpmnm7yxsVllcMQnHF3uc3hy4jfrSCh7nvzXA00=
+github.com/hyperledger/aries-framework-go/component/models v0.0.0-20230501135648-a9a7ad029347/go.mod h1:nF8fHsYY+GZl74AFAQaKAhYWOOSaLVzW/TZ0Sq/6axI=
+github.com/hyperledger/aries-framework-go/component/storageutil v0.0.0-20230427134832-0c9969493bd3 h1:JGYA9l5zTlvsvfnXT9hYPpCokAjmVKX0/r7njba7OX4=
+github.com/hyperledger/aries-framework-go/spi v0.0.0-20230427134832-0c9969493bd3 h1:ytWmOQZIYQfVJ4msFvrqlp6d+ZLhT43wS8rgE2m+J1A=
+github.com/hyperledger/aries-framework-go/spi v0.0.0-20230427134832-0c9969493bd3/go.mod h1:oryUyWb23l/a3tAP9KW+GBbfcfqp9tZD4y5hSkFrkqI=
 github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 github.com/inhies/go-bytesize v0.0.0-20201103132853-d0aed0d254f8/go.mod h1:KrtyD5PFj++GKkFS/7/RRrfnRhAMGQwy75GLCHWrCNs=
@@ -684,8 +692,8 @@ github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
-github.com/leodido/go-urn v1.2.2 h1:7z68G0FCGvDk646jz1AelTYNYWrTNm0bEcFAo147wt4=
-github.com/leodido/go-urn v1.2.2/go.mod h1:kUaIbLZWttglzwNuG0pgsh5vuV6u2YcGBYz1hIPjtOQ=
+github.com/leodido/go-urn v1.2.3 h1:6BE2vPT0lqoz3fmOesHZiaiFh7889ssCo2GMvLCfiuA=
+github.com/leodido/go-urn v1.2.3/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
 github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf2E2un5A=
 github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y=
 github.com/lestrrat-go/blackmagic v1.0.0/go.mod h1:TNgH//0vYSs8VXDCfkZLgIrVTTXQELZffUV0tz3MtdQ=
@@ -793,8 +801,8 @@ github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9
 github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4=
 github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g=
 github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk=
-github.com/multiformats/go-multicodec v0.8.1 h1:ycepHwavHafh3grIbR1jIXnKCsFm0fqsfEOsJ8NtKE8=
-github.com/multiformats/go-multicodec v0.8.1/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k=
+github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg=
+github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k=
 github.com/multiformats/go-multihash v0.2.1 h1:aem8ZT0VA2nCHHk7bPJ1BjUbHNciqZC/d16Vve9l108=
 github.com/multiformats/go-multihash v0.2.1/go.mod h1:WxoMcYG85AZVQUyRyo9s4wULvW5qrI9vb2Lt6evduFc=
 github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8=
@@ -929,7 +937,6 @@ github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThC
 github.com/rubenv/sql-migrate v0.0.0-20190212093014-1007f53448d7/go.mod h1:WS0rl9eEliYI8DPnr3TOwz4439pay+qNgzJoVya/DmY=
 github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
-github.com/rwtodd/Go.Sed v0.0.0-20210816025313-55464686f9ef/go.mod h1:8AEUvGVi2uQ5b24BIhcr0GCcpd/RNAFWaN2CJFrWIIQ=
 github.com/santhosh-tekuri/jsonschema v1.2.4/go.mod h1:TEAUOeZSmIxTTuHatJzrvARHiuO9LYd+cIxzgEHCQI4=
 github.com/santhosh-tekuri/jsonschema/v2 v2.1.0/go.mod h1:yzJzKUGV4RbWqWIBBP4wSOBqavX5saE02yirLS0OTyg=
 github.com/santhosh-tekuri/jsonschema/v5 v5.3.0 h1:uIkTLo0AGRc8l7h5l9r+GcYi9qfVPt6lD4/bhmzfiKo=
@@ -1309,14 +1316,14 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
-golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
+golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
 golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
-golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ=
-golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
+golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols=
+golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
diff --git a/internal/credential/verification.go b/internal/credential/verification.go
index 7e52edb..dcbec83 100644
--- a/internal/credential/verification.go
+++ b/internal/credential/verification.go
@@ -7,7 +7,7 @@ import (
 	credsdk "github.com/TBD54566975/ssi-sdk/credential"
 	"github.com/TBD54566975/ssi-sdk/credential/verification"
 	"github.com/TBD54566975/ssi-sdk/crypto"
-	didsdk "github.com/TBD54566975/ssi-sdk/did"
+	"github.com/TBD54566975/ssi-sdk/did/resolution"
 	sdkutil "github.com/TBD54566975/ssi-sdk/util"
 	"github.com/goccy/go-json"
 	"github.com/lestrrat-go/jwx/jws"
@@ -20,13 +20,13 @@ import (
 
 type Verifier struct {
 	verifier       *verification.CredentialVerifier
-	didResolver    didsdk.Resolver
+	didResolver    resolution.Resolver
 	schemaResolver schema.Resolution
 }
 
 // NewCredentialVerifier creates a new credential verifier which executes both signature and static verification checks.
 // In the future the set of verification checks will be configurable.
-func NewCredentialVerifier(didResolver didsdk.Resolver, schemaResolver schema.Resolution) (*Verifier, error) {
+func NewCredentialVerifier(didResolver resolution.Resolver, schemaResolver schema.Resolution) (*Verifier, error) {
 	if didResolver == nil {
 		return nil, errors.New("didResolver cannot be nil")
 	}
diff --git a/internal/did/access.go b/internal/did/access.go
index c0613dc..88dc7cd 100644
--- a/internal/did/access.go
+++ b/internal/did/access.go
@@ -5,6 +5,7 @@ import (
 	"crypto"
 
 	didsdk "github.com/TBD54566975/ssi-sdk/did"
+	"github.com/TBD54566975/ssi-sdk/did/resolution"
 	"github.com/TBD54566975/ssi-sdk/util"
 	"github.com/pkg/errors"
 
@@ -12,7 +13,7 @@ import (
 )
 
 // ResolveKeyForDID resolves a public key from a DID for a given KID.
-func ResolveKeyForDID(ctx context.Context, resolver didsdk.Resolver, did, kid string) (pubKey crypto.PublicKey, err error) {
+func ResolveKeyForDID(ctx context.Context, resolver resolution.Resolver, did, kid string) (pubKey crypto.PublicKey, err error) {
 	resolved, err := resolver.Resolve(ctx, did, nil)
 	if err != nil {
 		err = errors.Wrapf(err, "resolving DID: %s", did)
@@ -31,7 +32,7 @@ func ResolveKeyForDID(ctx context.Context, resolver didsdk.Resolver, did, kid st
 // VerifyTokenFromDID verifies that the information in the token was digitally signed by the public key associated with
 // the public key of the verification method of the did's document. The passed in resolver is used to map from the did
 // to the did document.
-func VerifyTokenFromDID(ctx context.Context, resolver didsdk.Resolver, did, kid string, token keyaccess.JWT) error {
+func VerifyTokenFromDID(ctx context.Context, resolver resolution.Resolver, did, kid string, token keyaccess.JWT) error {
 	resolved, err := resolver.Resolve(ctx, did)
 	if err != nil {
 		return errors.Wrapf(err, "resolving DID: %s", did)
diff --git a/internal/did/resolver.go b/internal/did/resolver.go
index fee47d4..df4bb22 100644
--- a/internal/did/resolver.go
+++ b/internal/did/resolver.go
@@ -4,16 +4,22 @@ import (
 	"fmt"
 
 	didsdk "github.com/TBD54566975/ssi-sdk/did"
+	"github.com/TBD54566975/ssi-sdk/did/jwk"
+	"github.com/TBD54566975/ssi-sdk/did/key"
+	"github.com/TBD54566975/ssi-sdk/did/peer"
+	"github.com/TBD54566975/ssi-sdk/did/pkh"
+	"github.com/TBD54566975/ssi-sdk/did/resolution"
+	"github.com/TBD54566975/ssi-sdk/did/web"
 	"github.com/pkg/errors"
 	"github.com/sirupsen/logrus"
 )
 
 // BuildMultiMethodResolver builds a multi method DID resolver from a list of methods to support resolution for
-func BuildMultiMethodResolver(methods []string) (*didsdk.MultiMethodResolver, error) {
+func BuildMultiMethodResolver(methods []string) (*resolution.MultiMethodResolver, error) {
 	if len(methods) == 0 {
 		return nil, errors.New("no methods provided")
 	}
-	resolvers := make([]didsdk.Resolver, 0, len(methods))
+	resolvers := make([]resolution.Resolver, 0, len(methods))
 	for _, method := range methods {
 		resolver, err := getKnownResolver(method)
 		if err != nil {
@@ -26,20 +32,22 @@ func BuildMultiMethodResolver(methods []string) (*didsdk.MultiMethodResolver, er
 	if len(resolvers) == 0 {
 		return nil, errors.New("no resolvers created")
 	}
-	return didsdk.NewResolver(resolvers...)
+	return resolution.NewResolver(resolvers...)
 }
 
 // all possible resolvers for the DID service
-func getKnownResolver(method string) (didsdk.Resolver, error) {
+func getKnownResolver(method string) (resolution.Resolver, error) {
 	switch didsdk.Method(method) {
 	case didsdk.KeyMethod:
-		return new(didsdk.KeyResolver), nil
+		return new(key.Resolver), nil
 	case didsdk.WebMethod:
-		return new(didsdk.WebResolver), nil
+		return new(web.Resolver), nil
 	case didsdk.PKHMethod:
-		return new(didsdk.PKHResolver), nil
+		return new(pkh.Resolver), nil
 	case didsdk.PeerMethod:
-		return new(didsdk.PeerResolver), nil
+		return new(peer.Resolver), nil
+	case didsdk.JWKMethod:
+		return new(jwk.Resolver), nil
 	}
 	return nil, fmt.Errorf("unsupported method: %s", method)
 }
diff --git a/internal/keyaccess/dataintegrity.go b/internal/keyaccess/dataintegrity.go
index 9473bcf..9fe9696 100644
--- a/internal/keyaccess/dataintegrity.go
+++ b/internal/keyaccess/dataintegrity.go
@@ -4,7 +4,7 @@ import (
 	gocrypto "crypto"
 
 	"github.com/TBD54566975/ssi-sdk/credential"
-	"github.com/TBD54566975/ssi-sdk/crypto"
+	"github.com/TBD54566975/ssi-sdk/crypto/jwx"
 	"github.com/TBD54566975/ssi-sdk/cryptosuite"
 	"github.com/goccy/go-json"
 	"github.com/pkg/errors"
@@ -15,9 +15,9 @@ import (
 // DataIntegrityKeyAccess represents a key access object for data integrity using the JsonWebSignature2020 suite:
 // https://w3c.github.io/vc-jws-2020/
 type DataIntegrityKeyAccess struct {
-	cryptosuite.JSONWebKeySigner
-	cryptosuite.JSONWebKeyVerifier
-	cryptosuite.CryptoSuite
+	Signer      cryptosuite.JSONWebKeySigner
+	Verifier    cryptosuite.JSONWebKeyVerifier
+	CryptoSuite cryptosuite.CryptoSuite
 }
 
 // NewDataIntegrityKeyAccess creates a new DataIntegrityKeyAccess object from an id, key id, and private key, generating both
@@ -29,11 +29,11 @@ func NewDataIntegrityKeyAccess(id, kid string, key gocrypto.PrivateKey) (*DataIn
 	if key == nil {
 		return nil, errors.New("key cannot be nil")
 	}
-	publicKeyJWK, privateKeyJWK, err := crypto.PrivateKeyToPrivateKeyJWK(key)
+	publicKeyJWK, privateKeyJWK, err := jwx.PrivateKeyToPrivateKeyJWK(kid, key)
 	if err != nil {
 		return nil, errors.Wrapf(err, "could not convert private key to JWK: %s", kid)
 	}
-	signer, err := cryptosuite.NewJSONWebKeySigner(id, kid, *privateKeyJWK, cryptosuite.AssertionMethod)
+	signer, err := cryptosuite.NewJSONWebKeySigner(id, *privateKeyJWK, cryptosuite.AssertionMethod)
 	if err != nil {
 		return nil, errors.Wrapf(err, "could not create JWK signer: %s", kid)
 	}
@@ -42,9 +42,9 @@ func NewDataIntegrityKeyAccess(id, kid string, key gocrypto.PrivateKey) (*DataIn
 		return nil, errors.Wrapf(err, "could not create JWK verifier: %s", kid)
 	}
 	return &DataIntegrityKeyAccess{
-		JSONWebKeySigner:   *signer,
-		JSONWebKeyVerifier: *verifier,
-		CryptoSuite:        cryptosuite.GetJSONWebSignature2020Suite(),
+		Signer:      *signer,
+		Verifier:    *verifier,
+		CryptoSuite: cryptosuite.GetJSONWebSignature2020Suite(),
 	}, nil
 }
 
@@ -58,7 +58,7 @@ func (ka DataIntegrityKeyAccess) Sign(payload cryptosuite.Provable) (*DataIntegr
 	if payload == nil {
 		return nil, errors.New("payload cannot be nil")
 	}
-	if err := ka.CryptoSuite.Sign(&ka.JSONWebKeySigner, payload); err != nil {
+	if err := ka.CryptoSuite.Sign(&ka.Signer, payload); err != nil {
 		return nil, errors.Wrap(err, "could not sign payload")
 	}
 	signedJSONBytes, err := json.Marshal(payload)
@@ -72,7 +72,7 @@ func (ka DataIntegrityKeyAccess) Verify(payload cryptosuite.Provable) error {
 	if payload == nil {
 		return errors.New("payload cannot be nil")
 	}
-	if err := ka.CryptoSuite.Verify(&ka.JSONWebKeyVerifier, payload); err != nil {
+	if err := ka.CryptoSuite.Verify(&ka.Verifier, payload); err != nil {
 		return errors.Wrap(err, "could not verify payload")
 	}
 	return nil
diff --git a/internal/keyaccess/jwt.go b/internal/keyaccess/jwt.go
index c33a65a..dc13d7b 100644
--- a/internal/keyaccess/jwt.go
+++ b/internal/keyaccess/jwt.go
@@ -6,16 +6,16 @@ import (
 	"fmt"
 
 	"github.com/TBD54566975/ssi-sdk/credential"
-	"github.com/TBD54566975/ssi-sdk/crypto"
-	didsdk "github.com/TBD54566975/ssi-sdk/did"
+	"github.com/TBD54566975/ssi-sdk/crypto/jwx"
+	"github.com/TBD54566975/ssi-sdk/did/resolution"
 	"github.com/goccy/go-json"
 	"github.com/lestrrat-go/jwx/jws"
 	"github.com/pkg/errors"
 )
 
 type JWKKeyAccess struct {
-	*crypto.JWTSigner
-	*crypto.JWTVerifier
+	*jwx.Signer
+	*jwx.Verifier
 }
 
 // NewJWKKeyAccess creates a JWKKeyAccess object from an id, key id, and private key, generating both
@@ -30,7 +30,7 @@ func NewJWKKeyAccess(id, kid string, key gocrypto.PrivateKey) (*JWKKeyAccess, er
 	if key == nil {
 		return nil, errors.New("key cannot be nil")
 	}
-	signer, err := crypto.NewJWTSigner(id, kid, key)
+	signer, err := jwx.NewJWXSigner(id, kid, key)
 	if err != nil {
 		return nil, errors.Wrapf(err, "could not create JWK Key Access object for kid: %s, error creating signer", kid)
 	}
@@ -39,8 +39,8 @@ func NewJWKKeyAccess(id, kid string, key gocrypto.PrivateKey) (*JWKKeyAccess, er
 		return nil, errors.Wrapf(err, "could not create JWK Key Access object for kid: %s, error creating verifier", kid)
 	}
 	return &JWKKeyAccess{
-		JWTSigner:   signer,
-		JWTVerifier: verifier,
+		Signer:   signer,
+		Verifier: verifier,
 	}, nil
 }
 
@@ -55,13 +55,11 @@ func NewJWKKeyAccessVerifier(id, kid string, key gocrypto.PublicKey) (*JWKKeyAcc
 	if key == nil {
 		return nil, errors.New("key cannot be nil")
 	}
-	verifier, err := crypto.NewJWTVerifier(id, key)
+	verifier, err := jwx.NewJWXVerifier(id, kid, key)
 	if err != nil {
 		return nil, errors.Wrapf(err, "could not create JWK Key Access object for kid: %s, error creating verifier", kid)
 	}
-	return &JWKKeyAccess{
-		JWTVerifier: verifier,
-	}, nil
+	return &JWKKeyAccess{Verifier: verifier}, nil
 }
 
 type JWT string
@@ -81,7 +79,7 @@ func JWTPtr(j string) *JWT {
 
 // SignJSON takes an object that is either itself json or json-serializable and signs it.
 func (ka JWKKeyAccess) SignJSON(data any) (*JWT, error) {
-	if ka.JWTSigner == nil {
+	if ka.Signer == nil {
 		return nil, errors.New("cannot sign with nil signer")
 	}
 	jsonBytes, err := json.Marshal(data)
@@ -96,7 +94,7 @@ func (ka JWKKeyAccess) SignJSON(data any) (*JWT, error) {
 }
 
 func (ka JWKKeyAccess) Sign(payload map[string]any) (*JWT, error) {
-	if ka.JWTSigner == nil {
+	if ka.Signer == nil {
 		return nil, errors.New("cannot sign with nil signer")
 	}
 	if payload == nil {
@@ -117,14 +115,14 @@ func (ka JWKKeyAccess) Verify(token JWT) error {
 }
 
 func (ka JWKKeyAccess) SignVerifiableCredential(cred credential.VerifiableCredential) (*JWT, error) {
-	if ka.JWTSigner == nil {
+	if ka.Signer == nil {
 		return nil, errors.New("cannot sign with nil signer")
 	}
 	if err := cred.IsValid(); err != nil {
 		return nil, errors.New("cannot sign invalid credential")
 	}
 
-	tokenBytes, err := credential.SignVerifiableCredentialJWT(*ka.JWTSigner, cred)
+	tokenBytes, err := credential.SignVerifiableCredentialJWT(*ka.Signer, cred)
 	if err != nil {
 		return nil, errors.Wrap(err, "could not sign cred")
 	}
@@ -135,29 +133,29 @@ func (ka JWKKeyAccess) VerifyVerifiableCredential(token JWT) (*credential.Verifi
 	if token == "" {
 		return nil, errors.New("token cannot be empty")
 	}
-	_, _, verifiableCredential, err := credential.VerifyVerifiableCredentialJWT(*ka.JWTVerifier, token.String())
+	_, _, verifiableCredential, err := credential.VerifyVerifiableCredentialJWT(*ka.Verifier, token.String())
 	return verifiableCredential, err
 }
 
 func (ka JWKKeyAccess) SignVerifiablePresentation(audience string, presentation credential.VerifiablePresentation) (*JWT, error) {
-	if ka.JWTSigner == nil {
+	if ka.Signer == nil {
 		return nil, errors.New("cannot sign with nil signer")
 	}
 	if err := presentation.IsValid(); err != nil {
 		return nil, errors.New("cannot sign invalid presentation")
 	}
-	tokenBytes, err := credential.SignVerifiablePresentationJWT(*ka.JWTSigner, credential.JWTVVPParameters{Audience: audience}, presentation)
+	tokenBytes, err := credential.SignVerifiablePresentationJWT(*ka.Signer, credential.JWTVVPParameters{Audience: []string{audience}}, presentation)
 	if err != nil {
 		return nil, errors.Wrap(err, "could not sign presentation")
 	}
 	return JWT(tokenBytes).Ptr(), nil
 }
 
-func (ka JWKKeyAccess) VerifyVerifiablePresentation(ctx context.Context, resolver didsdk.Resolver, token JWT) (*credential.VerifiablePresentation, error) {
+func (ka JWKKeyAccess) VerifyVerifiablePresentation(ctx context.Context, resolver resolution.Resolver, token JWT) (*credential.VerifiablePresentation, error) {
 	if token == "" {
 		return nil, errors.New("token cannot be empty")
 	}
-	_, _, presentation, err := credential.VerifyVerifiablePresentationJWT(ctx, *ka.JWTVerifier, resolver, token.String())
+	_, _, presentation, err := credential.VerifyVerifiablePresentationJWT(ctx, *ka.Verifier, resolver, token.String())
 	return presentation, err
 }
 
diff --git a/pkg/authorizationserver/oauth2_auth.go b/pkg/authorizationserver/oauth2_auth.go
index 64dff7d..3d566e7 100644
--- a/pkg/authorizationserver/oauth2_auth.go
+++ b/pkg/authorizationserver/oauth2_auth.go
@@ -10,6 +10,7 @@ import (
 	"github.com/ory/fosite"
 	"github.com/pkg/errors"
 	"github.com/sirupsen/logrus"
+
 	"github.com/tbd54566975/ssi-service/pkg/authorizationserver/request"
 )
 
diff --git a/pkg/server/router/did.go b/pkg/server/router/did.go
index 8c43f9d..6c00076 100644
--- a/pkg/server/router/did.go
+++ b/pkg/server/router/did.go
@@ -8,6 +8,7 @@ import (
 
 	"github.com/TBD54566975/ssi-sdk/crypto"
 	didsdk "github.com/TBD54566975/ssi-sdk/did"
+	"github.com/TBD54566975/ssi-sdk/did/resolution"
 	"github.com/goccy/go-json"
 	"github.com/pkg/errors"
 	"github.com/sirupsen/logrus"
@@ -282,9 +283,9 @@ func (dr DIDRouter) GetDIDsByMethod(ctx context.Context, w http.ResponseWriter,
 }
 
 type ResolveDIDResponse struct {
-	ResolutionMetadata  *didsdk.ResolutionMetadata `json:"didResolutionMetadata,omitempty"`
-	DIDDocument         *didsdk.Document           `json:"didDocument"`
-	DIDDocumentMetadata *didsdk.DocumentMetadata   `json:"didDocumentMetadata,omitempty"`
+	ResolutionMetadata  *resolution.ResolutionMetadata `json:"didResolutionMetadata,omitempty"`
+	DIDDocument         *didsdk.Document               `json:"didDocument"`
+	DIDDocumentMetadata *resolution.DocumentMetadata   `json:"didDocumentMetadata,omitempty"`
 }
 
 // SoftDeleteDIDByMethod godoc
diff --git a/pkg/service/credential/service.go b/pkg/service/credential/service.go
index 63f6f31..5ea94dc 100644
--- a/pkg/service/credential/service.go
+++ b/pkg/service/credential/service.go
@@ -9,7 +9,7 @@ import (
 	"github.com/TBD54566975/ssi-sdk/credential"
 	schemalib "github.com/TBD54566975/ssi-sdk/credential/schema"
 	statussdk "github.com/TBD54566975/ssi-sdk/credential/status"
-	didsdk "github.com/TBD54566975/ssi-sdk/did"
+	"github.com/TBD54566975/ssi-sdk/did/resolution"
 	sdkutil "github.com/TBD54566975/ssi-sdk/util"
 	"github.com/google/uuid"
 	"github.com/pkg/errors"
@@ -66,7 +66,7 @@ func (s Service) Config() config.CredentialServiceConfig {
 	return s.config
 }
 
-func NewCredentialService(config config.CredentialServiceConfig, s storage.ServiceStorage, keyStore *keystore.Service, didResolver didsdk.Resolver, schema *schema.Service) (*Service, error) {
+func NewCredentialService(config config.CredentialServiceConfig, s storage.ServiceStorage, keyStore *keystore.Service, didResolver resolution.Resolver, schema *schema.Service) (*Service, error) {
 	credentialStorage, err := NewCredentialStorage(s)
 	if err != nil {
 		return nil, sdkutil.LoggingErrorMsg(err, "could not instantiate storage for the credential service")
diff --git a/pkg/service/did/handler.go b/pkg/service/did/handler.go
index 207149a..8b6c69b 100644
--- a/pkg/service/did/handler.go
+++ b/pkg/service/did/handler.go
@@ -4,6 +4,7 @@ import (
 	"context"
 
 	didsdk "github.com/TBD54566975/ssi-sdk/did"
+	"github.com/TBD54566975/ssi-sdk/did/resolution"
 	"github.com/TBD54566975/ssi-sdk/util"
 	"github.com/pkg/errors"
 )
@@ -23,18 +24,18 @@ type MethodHandler interface {
 
 // NewHandlerResolver creates a new HandlerResolver from a map of MethodHandlers which are used to resolve DIDs
 // stored in our database
-func NewHandlerResolver(handlers map[didsdk.Method]MethodHandler) (*didsdk.MultiMethodResolver, error) {
+func NewHandlerResolver(handlers map[didsdk.Method]MethodHandler) (*resolution.MultiMethodResolver, error) {
 	if len(handlers) == 0 {
 		return nil, util.LoggingNewError("no handlers provided")
 	}
 
-	methodResolvers := make([]didsdk.Resolver, 0, len(handlers))
+	methodResolvers := make([]resolution.Resolver, 0, len(handlers))
 	for method, handler := range handlers {
 		methodResolver := resolverFromHandler(method, handler)
 		methodResolvers = append(methodResolvers, methodResolver)
 	}
 
-	multiMethodResolver, err := didsdk.NewResolver(methodResolvers...)
+	multiMethodResolver, err := resolution.NewResolver(methodResolvers...)
 	if err != nil {
 		return nil, errors.Wrap(err, "creating multi-method resolver")
 	}
@@ -48,8 +49,8 @@ type handlerResolver struct {
 	method  didsdk.Method
 }
 
-func (h handlerResolver) Resolve(ctx context.Context, did string, _ ...didsdk.ResolutionOption) (*didsdk.ResolutionResult, error) {
-	method, err := didsdk.GetMethodForDID(did)
+func (h handlerResolver) Resolve(ctx context.Context, did string, _ ...resolution.ResolutionOption) (*resolution.ResolutionResult, error) {
+	method, err := resolution.GetMethodForDID(did)
 	if err != nil {
 		return nil, errors.Wrap(err, "getting method from DID")
 	}
@@ -65,13 +66,13 @@ func (h handlerResolver) Resolve(ctx context.Context, did string, _ ...didsdk.Re
 	if err != nil {
 		return nil, errors.Wrap(err, "getting DID from handler")
 	}
-	return &didsdk.ResolutionResult{Document: gotDIDResponse.DID}, nil
+	return &resolution.ResolutionResult{Document: gotDIDResponse.DID}, nil
 }
 
 func (h handlerResolver) Methods() []didsdk.Method {
 	return []didsdk.Method{h.method}
 }
 
-func resolverFromHandler(method didsdk.Method, handler MethodHandler) didsdk.Resolver {
+func resolverFromHandler(method didsdk.Method, handler MethodHandler) resolution.Resolver {
 	return &handlerResolver{handler: handler, method: method}
 }
diff --git a/pkg/service/did/ion.go b/pkg/service/did/ion.go
index a09090d..facc41a 100644
--- a/pkg/service/did/ion.go
+++ b/pkg/service/did/ion.go
@@ -6,6 +6,7 @@ import (
 	"net/http"
 
 	"github.com/TBD54566975/ssi-sdk/crypto"
+	"github.com/TBD54566975/ssi-sdk/crypto/jwx"
 	"github.com/TBD54566975/ssi-sdk/did"
 	"github.com/TBD54566975/ssi-sdk/did/ion"
 	"github.com/TBD54566975/ssi-sdk/util"
@@ -102,7 +103,7 @@ func (h *ionHandler) CreateDID(ctx context.Context, request CreateDIDRequest) (*
 	if err != nil {
 		return nil, errors.Wrap(err, "could not generate key for ion DID")
 	}
-	pubKeyJWK, privKeyJWK, err := crypto.PrivateKeyToPrivateKeyJWK(privKey)
+	pubKeyJWK, privKeyJWK, err := jwx.PrivateKeyToPrivateKeyJWK(uuid.NewString(), privKey)
 	if err != nil {
 		return nil, errors.Wrap(err, "could not convert key to JWK")
 	}
@@ -200,7 +201,7 @@ func (h *ionHandler) CreateDID(ctx context.Context, request CreateDIDRequest) (*
 	return &CreateDIDResponse{DID: didDoc}, nil
 }
 
-func keyToStoreRequest(kid string, privateKeyJWK crypto.PrivateKeyJWK, controller string) (*keystore.StoreKeyRequest, error) {
+func keyToStoreRequest(kid string, privateKeyJWK jwx.PrivateKeyJWK, controller string) (*keystore.StoreKeyRequest, error) {
 	privateKey, err := privateKeyJWK.ToPrivateKey()
 	if err != nil {
 		return nil, errors.Wrap(err, "getting private private key from JWK")
diff --git a/pkg/service/did/key.go b/pkg/service/did/key.go
index a740d61..40241e9 100644
--- a/pkg/service/did/key.go
+++ b/pkg/service/did/key.go
@@ -6,6 +6,7 @@ import (
 
 	"github.com/TBD54566975/ssi-sdk/crypto"
 	"github.com/TBD54566975/ssi-sdk/did"
+	"github.com/TBD54566975/ssi-sdk/did/key"
 	"github.com/mr-tron/base58"
 	"github.com/pkg/errors"
 	"github.com/sirupsen/logrus"
@@ -37,7 +38,7 @@ func (h *keyHandler) CreateDID(ctx context.Context, request CreateDIDRequest) (*
 	logrus.Debugf("creating DID: %+v", request)
 
 	// create the DID
-	privKey, doc, err := did.GenerateDIDKey(request.KeyType)
+	privKey, doc, err := key.GenerateDIDKey(request.KeyType)
 	if err != nil {
 		return nil, errors.Wrap(err, "could not create did:key")
 	}
diff --git a/pkg/service/did/model.go b/pkg/service/did/model.go
index e0ac279..dbf6c2b 100644
--- a/pkg/service/did/model.go
+++ b/pkg/service/did/model.go
@@ -5,6 +5,7 @@ import (
 
 	"github.com/TBD54566975/ssi-sdk/crypto"
 	didsdk "github.com/TBD54566975/ssi-sdk/did"
+	"github.com/TBD54566975/ssi-sdk/did/resolution"
 )
 
 type GetSupportedMethodsResponse struct {
@@ -16,9 +17,9 @@ type ResolveDIDRequest struct {
 }
 
 type ResolveDIDResponse struct {
-	ResolutionMetadata  *didsdk.ResolutionMetadata `json:"didResolutionMetadata,omitempty"`
-	DIDDocument         *didsdk.Document           `json:"didDocument"`
-	DIDDocumentMetadata *didsdk.DocumentMetadata   `json:"didDocumentMetadata,omitempty"`
+	ResolutionMetadata  *resolution.ResolutionMetadata `json:"didResolutionMetadata,omitempty"`
+	DIDDocument         *didsdk.Document               `json:"didDocument"`
+	DIDDocumentMetadata *resolution.DocumentMetadata   `json:"didDocumentMetadata,omitempty"`
 }
 
 type CreateDIDRequestOptions interface {
diff --git a/pkg/service/did/resolution/resolver.go b/pkg/service/did/resolution/resolver.go
index f872a51..e62eedd 100644
--- a/pkg/service/did/resolution/resolver.go
+++ b/pkg/service/did/resolution/resolver.go
@@ -5,6 +5,7 @@ import (
 	"fmt"
 
 	didsdk "github.com/TBD54566975/ssi-sdk/did"
+	"github.com/TBD54566975/ssi-sdk/did/resolution"
 	"github.com/pkg/errors"
 	"github.com/sirupsen/logrus"
 
@@ -15,17 +16,17 @@ import (
 // ServiceResolver is a resolver that can resolve DIDs using a combination of local and universal resolvers.
 type ServiceResolver struct {
 	resolutionMethods []string
-	hr                didsdk.Resolver
-	lr                didsdk.Resolver
+	hr                resolution.Resolver
+	lr                resolution.Resolver
 	ur                *universalResolver
 }
 
-var _ didsdk.Resolver = (*ServiceResolver)(nil)
+var _ resolution.Resolver = (*ServiceResolver)(nil)
 
 // NewServiceResolver creates a new ServiceResolver instance which can resolve DIDs using a combination of local and
 // universal resolvers.
-func NewServiceResolver(handlerResolver didsdk.Resolver, localResolutionMethods []string, universalResolverURL string) (*ServiceResolver, error) {
-	var lr didsdk.Resolver
+func NewServiceResolver(handlerResolver resolution.Resolver, localResolutionMethods []string, universalResolverURL string) (*ServiceResolver, error) {
+	var lr resolution.Resolver
 	var err error
 	if len(localResolutionMethods) > 0 {
 		// instantiate sdk resolver
@@ -57,7 +58,7 @@ func NewServiceResolver(handlerResolver didsdk.Resolver, localResolutionMethods
 // 2. Try to resolve with the local resolver
 // 3. Try to resolve with the universal resolver
 // TODO(gabe) avoid caching DIDs that should be externally resolved https://github.com/TBD54566975/ssi-service/issues/361
-func (sr *ServiceResolver) Resolve(ctx context.Context, did string, opts ...didsdk.ResolutionOption) (*didsdk.ResolutionResult, error) {
+func (sr *ServiceResolver) Resolve(ctx context.Context, did string, opts ...resolution.ResolutionOption) (*resolution.ResolutionResult, error) {
 	// check the did is valid
 	if _, err := utilint.GetMethodForDID(did); err != nil {
 		return nil, errors.Wrap(err, "getting method DID")
diff --git a/pkg/service/did/resolution/universal.go b/pkg/service/did/resolution/universal.go
index e0730bd..02026a2 100644
--- a/pkg/service/did/resolution/universal.go
+++ b/pkg/service/did/resolution/universal.go
@@ -7,6 +7,7 @@ import (
 	"net/http"
 
 	didsdk "github.com/TBD54566975/ssi-sdk/did"
+	"github.com/TBD54566975/ssi-sdk/did/resolution"
 	"github.com/goccy/go-json"
 	"github.com/pkg/errors"
 	"github.com/sirupsen/logrus"
@@ -21,7 +22,7 @@ type universalResolver struct {
 	supportedMethods []didsdk.Method
 }
 
-var _ didsdk.Resolver = (*universalResolver)(nil)
+var _ resolution.Resolver = (*universalResolver)(nil)
 
 func newUniversalResolver(url string) (*universalResolver, error) {
 	if url == "" {
@@ -34,7 +35,7 @@ func newUniversalResolver(url string) (*universalResolver, error) {
 }
 
 // Resolve results resolution results by doing a GET on <url>/1.0.identifiers/<did>.
-func (ur *universalResolver) Resolve(ctx context.Context, did string, _ ...didsdk.ResolutionOption) (*didsdk.ResolutionResult, error) {
+func (ur *universalResolver) Resolve(ctx context.Context, did string, _ ...resolution.ResolutionOption) (*resolution.ResolutionResult, error) {
 	url := ur.url + "/1.0/identifiers/" + did
 	req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
 	if err != nil {
@@ -50,7 +51,7 @@ func (ur *universalResolver) Resolve(ctx context.Context, did string, _ ...didsd
 	if err != nil {
 		return nil, err
 	}
-	var result didsdk.ResolutionResult
+	var result resolution.ResolutionResult
 	if err = json.Unmarshal(respBody, &result); err != nil {
 		return nil, errors.Wrap(err, "unmarshalling JSON")
 	}
diff --git a/pkg/service/did/service.go b/pkg/service/did/service.go
index 65c3350..223378c 100644
--- a/pkg/service/did/service.go
+++ b/pkg/service/did/service.go
@@ -5,6 +5,7 @@ import (
 	"fmt"
 
 	didsdk "github.com/TBD54566975/ssi-sdk/did"
+	didresolution "github.com/TBD54566975/ssi-sdk/did/resolution"
 	sdkutil "github.com/TBD54566975/ssi-sdk/util"
 	"github.com/pkg/errors"
 
@@ -61,7 +62,7 @@ func (s *Service) Config() config.DIDServiceConfig {
 	return s.config
 }
 
-func (s *Service) GetResolver() didsdk.Resolver {
+func (s *Service) GetResolver() didresolution.Resolver {
 	return s.resolver
 }
 
@@ -147,7 +148,7 @@ func (s *Service) ResolveDID(request ResolveDIDRequest) (*ResolveDIDResponse, er
 	}, nil
 }
 
-func (s *Service) Resolve(ctx context.Context, did string, opts ...didsdk.ResolutionOption) (*didsdk.ResolutionResult, error) {
+func (s *Service) Resolve(ctx context.Context, did string, opts ...didresolution.ResolutionOption) (*didresolution.ResolutionResult, error) {
 	return s.resolver.Resolve(ctx, did, opts)
 }
 
diff --git a/pkg/service/did/web.go b/pkg/service/did/web.go
index 01363d7..c7dcb60 100644
--- a/pkg/service/did/web.go
+++ b/pkg/service/did/web.go
@@ -6,6 +6,7 @@ import (
 
 	"github.com/TBD54566975/ssi-sdk/crypto"
 	"github.com/TBD54566975/ssi-sdk/did"
+	"github.com/TBD54566975/ssi-sdk/did/web"
 	"github.com/TBD54566975/ssi-sdk/util"
 	"github.com/mr-tron/base58"
 	"github.com/pkg/errors"
@@ -58,7 +59,7 @@ func (h *webHandler) CreateDID(ctx context.Context, request CreateDIDRequest) (*
 		return nil, errors.Wrap(err, "processing options")
 	}
 
-	didWeb := did.DIDWeb(opts.DIDWebID)
+	didWeb := web.DIDWeb(opts.DIDWebID)
 
 	if !didWeb.IsValid() {
 		return nil, fmt.Errorf("could not resolve did:web DID: %s", didWeb)
diff --git a/pkg/service/manifest/response.go b/pkg/service/manifest/response.go
index 01098aa..c5066f2 100644
--- a/pkg/service/manifest/response.go
+++ b/pkg/service/manifest/response.go
@@ -65,27 +65,38 @@ func (s Service) buildFulfillmentCredentialResponseFromTemplate(ctx context.Cont
 		templateCred := templateCred
 		templateMap[templateCred.ID] = templateCred
 	}
-	return s.fulfillmentCredentialResponse(ctx, application.ID, applicantDID, manifestID, issuingKID, credManifest, &application, templateMap, applicationJSON, nil)
+
+	responseBuilder := manifest.NewCredentialResponseBuilder(manifestID)
+	if err := responseBuilder.SetApplicationID(application.ID); err != nil {
+		return nil, nil, sdkutil.LoggingErrorMsgf(err, "could not fulfill credential application<%s> from template", application.ID)
+	}
+	if err := responseBuilder.SetApplicantID(applicantDID); err != nil {
+		return nil, nil, sdkutil.LoggingErrorMsgf(err, "could not fulfill credential application<%s> from template", application.ID)
+	}
+
+	return s.fulfillmentCredentialResponse(ctx, responseBuilder, applicantDID, issuingKID, credManifest, &application, templateMap, applicationJSON, nil)
 }
 
 // buildFulfillmentCredentialResponseFromOverrides builds a credential response from overrides
 func (s Service) buildFulfillmentCredentialResponse(ctx context.Context, applicantDID, applicationID, manifestID, issuerKID string,
 	credManifest manifest.CredentialManifest, overrides map[string]model.CredentialOverride) (*manifest.CredentialResponse, []cred.Container, error) {
-	return s.fulfillmentCredentialResponse(ctx, applicationID, applicantDID, manifestID, issuerKID, credManifest, nil, nil, nil, overrides)
-}
 
-// TODO(gabe) add applicant id to response once https://github.com/TBD54566975/ssi-sdk/issues/372 is in
-// unifies both templated and override paths for building a credential response
-func (s Service) fulfillmentCredentialResponse(ctx context.Context,
-	applicationID, applicantDID, manifestID, issuerKID string, credManifest manifest.CredentialManifest,
-	application *manifest.CredentialApplication,
-	templateMap map[string]issuing.CredentialTemplate,
-	applicationJSON map[string]any,
-	credentialOverrides map[string]model.CredentialOverride) (*manifest.CredentialResponse, []cred.Container, error) {
 	responseBuilder := manifest.NewCredentialResponseBuilder(manifestID)
 	if err := responseBuilder.SetApplicationID(applicationID); err != nil {
-		return nil, nil, sdkutil.LoggingErrorMsgf(err, "could not fulfill credential credentials: could not set credentials id: %s", applicationID)
+		return nil, nil, sdkutil.LoggingErrorMsgf(err, "could not fulfill credential application<%s>", applicationID)
 	}
+	if err := responseBuilder.SetApplicantID(applicantDID); err != nil {
+		return nil, nil, sdkutil.LoggingErrorMsgf(err, "could not fulfill credential application<%s>", applicationID)
+	}
+
+	return s.fulfillmentCredentialResponse(ctx, responseBuilder, applicantDID, issuerKID, credManifest, nil, nil, nil, overrides)
+}
+
+// unifies both templated and override paths for building a credential response
+func (s Service) fulfillmentCredentialResponse(ctx context.Context, responseBuilder manifest.CredentialResponseBuilder,
+	applicantDID, issuerKID string, credManifest manifest.CredentialManifest, application *manifest.CredentialApplication,
+	templateMap map[string]issuing.CredentialTemplate, applicationJSON map[string]any,
+	credentialOverrides map[string]model.CredentialOverride) (*manifest.CredentialResponse, []cred.Container, error) {
 
 	creds := make([]cred.Container, 0, len(credManifest.OutputDescriptors))
 	for _, od := range credManifest.OutputDescriptors {
@@ -224,11 +235,11 @@ func getCredentialJSON(applicationJSON map[string]any, ct issuing.CredentialTemp
 }
 
 func toCredentialJSON(c any) (map[string]any, error) {
-	_, _, cred, err := credsdk.ToCredential(c)
+	_, _, genericCredential, err := credsdk.ToCredential(c)
 	if err != nil {
 		return nil, errors.Wrapf(err, "converting credential to json")
 	}
-	credBytes, err := json.Marshal(cred)
+	credBytes, err := json.Marshal(genericCredential)
 	if err != nil {
 		return nil, errors.Wrapf(err, "marshalling credential to json")
 	}
@@ -240,11 +251,14 @@ func toCredentialJSON(c any) (map[string]any, error) {
 }
 
 // TODO(gabe) add applicant to response id once https://github.com/TBD54566975/ssi-sdk/issues/372 is in
-func buildDenialCredentialResponse(manifestID, applicationID, reason string, failedOutputDescriptorIDs ...string) (*manifest.CredentialResponse, error) {
+func buildDenialCredentialResponse(manifestID, applicantDID, applicationID, reason string, failedOutputDescriptorIDs ...string) (*manifest.CredentialResponse, error) {
 	builder := manifest.NewCredentialResponseBuilder(manifestID)
 	if err := builder.SetApplicationID(applicationID); err != nil {
 		return nil, err
 	}
+	if err := builder.SetApplicantID(applicantDID); err != nil {
+		return nil, err
+	}
 	if err := builder.SetDenial(reason, failedOutputDescriptorIDs...); err != nil {
 		return nil, err
 	}
diff --git a/pkg/service/manifest/service.go b/pkg/service/manifest/service.go
index 17dc40c..d5a1cd0 100644
--- a/pkg/service/manifest/service.go
+++ b/pkg/service/manifest/service.go
@@ -5,7 +5,7 @@ import (
 	"fmt"
 
 	"github.com/TBD54566975/ssi-sdk/credential/manifest"
-	didsdk "github.com/TBD54566975/ssi-sdk/did"
+	"github.com/TBD54566975/ssi-sdk/did/resolution"
 	errresp "github.com/TBD54566975/ssi-sdk/error"
 	sdkutil "github.com/TBD54566975/ssi-sdk/util"
 	"github.com/benbjohnson/clock"
@@ -35,7 +35,7 @@ type Service struct {
 
 	// external dependencies
 	keyStore    *keystore.Service
-	didResolver didsdk.Resolver
+	didResolver resolution.Resolver
 	credential  *credential.Service
 
 	Clock clock.Clock
@@ -72,7 +72,8 @@ func (s Service) Config() config.ManifestServiceConfig {
 	return s.config
 }
 
-func NewManifestService(config config.ManifestServiceConfig, s storage.ServiceStorage, keyStore *keystore.Service, didResolver didsdk.Resolver, credential *credential.Service) (*Service, error) {
+func NewManifestService(config config.ManifestServiceConfig, s storage.ServiceStorage, keyStore *keystore.Service,
+	didResolver resolution.Resolver, credential *credential.Service) (*Service, error) {
 	manifestStorage, err := manifeststg.NewManifestStorage(s)
 	if err != nil {
 		return nil, sdkutil.LoggingErrorMsg(err, "could not instantiate storage for the manifest service")
@@ -173,7 +174,7 @@ func (s Service) CreateManifest(ctx context.Context, request model.CreateManifes
 	// store the manifest
 	storageRequest := manifeststg.StoredManifest{
 		ID:          m.ID,
-		Issuer:      m.Issuer.ID,
+		IssuerDID:   m.Issuer.ID,
 		IssuerKID:   request.IssuerKID,
 		Manifest:    *m,
 		ManifestJWT: *manifestJWT,
@@ -276,7 +277,7 @@ func (s Service) ProcessApplicationSubmission(ctx context.Context, request model
 	if validationErr != nil {
 		resp := errresp.GetErrorResponse(validationErr)
 		if resp.ErrorType == DenialResponse {
-			denialResp, err := buildDenialCredentialResponse(manifestID, applicationID, resp.Err.Error(), unfulfilledInputDescriptorIDs...)
+			denialResp, err := buildDenialCredentialResponse(manifestID, request.ApplicantDID, applicationID, resp.Err.Error(), unfulfilledInputDescriptorIDs...)
 			if err != nil {
 				return nil, sdkutil.LoggingErrorMsg(err, "could not build denial credential response")
 			}
@@ -414,7 +415,7 @@ func (s Service) ReviewApplication(ctx context.Context, request model.ReviewAppl
 			Credentials: genericCredentials,
 		}
 	} else {
-		denialResponse, err := buildDenialCredentialResponse(manifestID, applicationID, request.Reason)
+		denialResponse, err := buildDenialCredentialResponse(manifestID, applicantDID, applicationID, request.Reason)
 		if err != nil {
 			return nil, sdkutil.LoggingErrorMsg(err, "building denial credential response")
 		}
diff --git a/pkg/service/manifest/storage/storage.go b/pkg/service/manifest/storage/storage.go
index 8dd6726..4c20c94 100644
--- a/pkg/service/manifest/storage/storage.go
+++ b/pkg/service/manifest/storage/storage.go
@@ -26,7 +26,7 @@ const (
 
 type StoredManifest struct {
 	ID          string                      `json:"id"`
-	Issuer      string                      `json:"issuer"`
+	IssuerDID   string                      `json:"issuerDid"`
 	IssuerKID   string                      `json:"issuerKid"`
 	Manifest    manifest.CredentialManifest `json:"manifest"`
 	ManifestJWT keyaccess.JWT               `json:"manifestJwt"`
@@ -46,7 +46,7 @@ type StoredApplication struct {
 type StoredResponse struct {
 	ID           string                      `json:"id"`
 	ManifestID   string                      `json:"manifestId"`
-	ApplicantDID string                      `json:"applicantId"`
+	ApplicantDID string                      `json:"applicantDid"`
 	Response     manifest.CredentialResponse `json:"response"`
 	Credentials  []cred.Container            `json:"credentials"`
 	ResponseJWT  keyaccess.JWT               `json:"responseJwt"`
diff --git a/pkg/service/presentation/service.go b/pkg/service/presentation/service.go
index 0c21023..cde34ea 100644
--- a/pkg/service/presentation/service.go
+++ b/pkg/service/presentation/service.go
@@ -6,7 +6,7 @@ import (
 
 	credsdk "github.com/TBD54566975/ssi-sdk/credential"
 	"github.com/TBD54566975/ssi-sdk/credential/exchange"
-	didsdk "github.com/TBD54566975/ssi-sdk/did"
+	"github.com/TBD54566975/ssi-sdk/did/resolution"
 	sdkutil "github.com/TBD54566975/ssi-sdk/util"
 	"github.com/lestrrat-go/jwx/jws"
 	"github.com/pkg/errors"
@@ -31,7 +31,7 @@ type Service struct {
 	keystore   *keystore.Service
 	opsStorage *operation.Storage
 	config     config.PresentationServiceConfig
-	resolver   didsdk.Resolver
+	resolver   resolution.Resolver
 	schema     *schema.Service
 	verifier   *credential.Verifier
 }
@@ -58,7 +58,8 @@ func (s Service) Config() config.PresentationServiceConfig {
 	return s.config
 }
 
-func NewPresentationService(config config.PresentationServiceConfig, s storage.ServiceStorage, resolver didsdk.Resolver, schema *schema.Service, keystore *keystore.Service) (*Service, error) {
+func NewPresentationService(config config.PresentationServiceConfig, s storage.ServiceStorage,
+	resolver resolution.Resolver, schema *schema.Service, keystore *keystore.Service) (*Service, error) {
 	presentationStorage, err := NewPresentationStorage(s)
 	if err != nil {
 		return nil, sdkutil.LoggingErrorMsg(err, "could not instantiate definition storage for the presentation service")
@@ -88,7 +89,8 @@ func NewPresentationService(config config.PresentationServiceConfig, s storage.S
 
 // CreatePresentationDefinition houses the main service logic for presentation definition creation. It validates the input, and
 // produces a presentation definition value that conforms with the PresentationDefinition specification.
-func (s Service) CreatePresentationDefinition(ctx context.Context, request model.CreatePresentationDefinitionRequest) (*model.CreatePresentationDefinitionResponse, error) {
+func (s Service) CreatePresentationDefinition(ctx context.Context,
+	request model.CreatePresentationDefinitionRequest) (*model.CreatePresentationDefinitionResponse, error) {
 	logrus.Debugf("creating presentation definition: %+v", request)
 
 	if err := request.IsValid(); err != nil {
@@ -109,7 +111,8 @@ func (s Service) CreatePresentationDefinition(ctx context.Context, request model
 	if err := s.storage.StorePresentation(ctx, storedPresentation); err != nil {
 		return nil, sdkutil.LoggingErrorMsg(err, "could not store presentation")
 	}
-	defJWT, err := s.keystore.Sign(context.Background(), storedPresentation.AuthorKID, exchange.PresentationDefinitionEnvelope{PresentationDefinition: storedPresentation.PresentationDefinition})
+	defJWT, err := s.keystore.Sign(context.Background(), storedPresentation.AuthorKID,
+		exchange.PresentationDefinitionEnvelope{PresentationDefinition: storedPresentation.PresentationDefinition})
 	if err != nil {
 		return nil, sdkutil.LoggingErrorMsgf(err, "signing presentation definition enveloper with author<%s>", storedPresentation.Author)
 	}
@@ -120,7 +123,8 @@ func (s Service) CreatePresentationDefinition(ctx context.Context, request model
 	return &m, nil
 }
 
-func (s Service) GetPresentationDefinition(ctx context.Context, request model.GetPresentationDefinitionRequest) (*model.GetPresentationDefinitionResponse, error) {
+func (s Service) GetPresentationDefinition(ctx context.Context,
+	request model.GetPresentationDefinitionRequest) (*model.GetPresentationDefinitionResponse, error) {
 	logrus.Debugf("getting presentation definition: %s", request.ID)
 
 	storedPresentation, err := s.storage.GetPresentation(ctx, request.ID)
@@ -131,7 +135,8 @@ func (s Service) GetPresentationDefinition(ctx context.Context, request model.Ge
 		return nil, sdkutil.LoggingNewErrorf("presentation definition with id<%s> could not be found", request.ID)
 	}
 	// TODO(gabe) decouple this to a separate endpoint for presentation requests https://github.com/TBD54566975/ssi-service/issues/375
-	defJWT, err := s.keystore.Sign(ctx, storedPresentation.AuthorKID, exchange.PresentationDefinitionEnvelope{PresentationDefinition: storedPresentation.PresentationDefinition})
+	defJWT, err := s.keystore.Sign(ctx, storedPresentation.AuthorKID,
+		exchange.PresentationDefinitionEnvelope{PresentationDefinition: storedPresentation.PresentationDefinition})
 	if err != nil {
 		return nil, sdkutil.LoggingErrorMsgf(err, "signing presentation definition envelope by issuer<%s>", storedPresentation.Author)
 	}
@@ -276,7 +281,8 @@ func (s Service) ReviewSubmission(ctx context.Context, request model.ReviewSubmi
 		return nil, errors.Wrap(err, "invalid request")
 	}
 
-	updatedSubmission, _, err := s.storage.UpdateSubmission(ctx, request.ID, request.Approved, request.Reason, submission.IDFromSubmissionID(request.ID))
+	updatedSubmission, _, err := s.storage.UpdateSubmission(ctx, request.ID, request.Approved, request.Reason,
+		submission.IDFromSubmissionID(request.ID))
 	if err != nil {
 		return nil, errors.Wrap(err, "updating submission")
 	}
diff --git a/pkg/service/schema/service.go b/pkg/service/schema/service.go
index ac9647e..268a4de 100644
--- a/pkg/service/schema/service.go
+++ b/pkg/service/schema/service.go
@@ -7,6 +7,7 @@ import (
 
 	"github.com/TBD54566975/ssi-sdk/credential/schema"
 	didsdk "github.com/TBD54566975/ssi-sdk/did"
+	"github.com/TBD54566975/ssi-sdk/did/resolution"
 	schemalib "github.com/TBD54566975/ssi-sdk/schema"
 	sdkutil "github.com/TBD54566975/ssi-sdk/util"
 	"github.com/goccy/go-json"
@@ -30,7 +31,7 @@ type Service struct {
 
 	// external dependencies
 	keyStore *keystore.Service
-	resolver didsdk.Resolver
+	resolver resolution.Resolver
 }
 
 func (s Service) Type() framework.Type {
@@ -61,7 +62,7 @@ func (s Service) Config() config.SchemaServiceConfig {
 	return s.config
 }
 
-func NewSchemaService(config config.SchemaServiceConfig, s storage.ServiceStorage, keyStore *keystore.Service, resolver didsdk.Resolver) (*Service, error) {
+func NewSchemaService(config config.SchemaServiceConfig, s storage.ServiceStorage, keyStore *keystore.Service, resolver resolution.Resolver) (*Service, error) {
 	schemaStorage, err := NewSchemaStorage(s)
 	if err != nil {
 		return nil, sdkutil.LoggingErrorMsg(err, "could not instantiate storage for the schema service")


Test patch:
diff --git a/integration/didion_integration_test.go b/integration/didion_integration_test.go
index 67ab87d..41c5354 100644
--- a/integration/didion_integration_test.go
+++ b/integration/didion_integration_test.go
@@ -4,7 +4,7 @@ import (
 	"testing"
 
 	"github.com/TBD54566975/ssi-sdk/crypto"
-	didsdk "github.com/TBD54566975/ssi-sdk/did"
+	"github.com/TBD54566975/ssi-sdk/did/key"
 	"github.com/stretchr/testify/assert"
 
 	"github.com/tbd54566975/ssi-service/pkg/service/operation/storage"
@@ -36,7 +36,7 @@ func TestCreateAliceDIDKeyForDIDIONIntegration(t *testing.T) {
 		t.Skip("skipping integration test")
 	}
 
-	applicantPrivKey, applicantDIDKey, err := didsdk.GenerateDIDKey(crypto.Ed25519)
+	applicantPrivKey, applicantDIDKey, err := key.GenerateDIDKey(crypto.Ed25519)
 	assert.NoError(t, err)
 	assert.NotEmpty(t, applicantPrivKey)
 	assert.NotEmpty(t, applicantDIDKey)
diff --git a/integration/didweb_integration_test.go b/integration/didweb_integration_test.go
index cc8b912..bf91535 100644
--- a/integration/didweb_integration_test.go
+++ b/integration/didweb_integration_test.go
@@ -4,7 +4,7 @@ import (
 	"testing"
 
 	"github.com/TBD54566975/ssi-sdk/crypto"
-	didsdk "github.com/TBD54566975/ssi-sdk/did"
+	"github.com/TBD54566975/ssi-sdk/did/key"
 	"github.com/stretchr/testify/assert"
 
 	"github.com/tbd54566975/ssi-service/pkg/service/operation/storage"
@@ -36,7 +36,7 @@ func TestCreateAliceDIDKeyForDIDWebIntegration(t *testing.T) {
 		t.Skip("skipping integration test")
 	}
 
-	applicantPrivKey, applicantDIDKey, err := didsdk.GenerateDIDKey(crypto.Ed25519)
+	applicantPrivKey, applicantDIDKey, err := key.GenerateDIDKey(crypto.Ed25519)
 	assert.NoError(t, err)
 	assert.NotEmpty(t, applicantPrivKey)
 	assert.NotEmpty(t, applicantDIDKey)
diff --git a/integration/presentation_exchange_integration_test.go b/integration/presentation_exchange_integration_test.go
index 5be9d39..23b8de8 100644
--- a/integration/presentation_exchange_integration_test.go
+++ b/integration/presentation_exchange_integration_test.go
@@ -4,7 +4,7 @@ import (
 	"testing"
 
 	"github.com/TBD54566975/ssi-sdk/crypto"
-	didsdk "github.com/TBD54566975/ssi-sdk/did"
+	"github.com/TBD54566975/ssi-sdk/did/key"
 	"github.com/google/uuid"
 	"github.com/stretchr/testify/assert"
 
@@ -31,7 +31,7 @@ func TestCreateParticipants(t *testing.T) {
 	assert.NotEmpty(t, issuerKID)
 	SetValue(presentationExchangeContext, "issuerKID", issuerKID)
 
-	holderPrivateKey, holderDIDKey, err := didsdk.GenerateDIDKey(crypto.Ed25519)
+	holderPrivateKey, holderDIDKey, err := key.GenerateDIDKey(crypto.Ed25519)
 	assert.NoError(t, err)
 	assert.NotEmpty(t, holderPrivateKey)
 	assert.NotEmpty(t, holderDIDKey)
diff --git a/integration/steelthread_integration_test.go b/integration/steelthread_integration_test.go
index 76d96bf..51b5115 100644
--- a/integration/steelthread_integration_test.go
+++ b/integration/steelthread_integration_test.go
@@ -5,7 +5,7 @@ import (
 
 	credsdk "github.com/TBD54566975/ssi-sdk/credential"
 	"github.com/TBD54566975/ssi-sdk/crypto"
-	didsdk "github.com/TBD54566975/ssi-sdk/did"
+	"github.com/TBD54566975/ssi-sdk/did/key"
 	"github.com/stretchr/testify/assert"
 
 	"github.com/tbd54566975/ssi-service/pkg/service/operation/storage"
@@ -51,7 +51,7 @@ func TestCreateAliceDIDKeyIntegration(t *testing.T) {
 		t.Skip("skipping integration test")
 	}
 
-	applicantPrivKey, applicantDIDKey, err := didsdk.GenerateDIDKey(crypto.Ed25519)
+	applicantPrivKey, applicantDIDKey, err := key.GenerateDIDKey(crypto.Ed25519)
 	assert.NoError(t, err)
 	assert.NotEmpty(t, applicantPrivKey)
 	assert.NotEmpty(t, applicantDIDKey)
diff --git a/internal/keyaccess/jwt_test.go b/internal/keyaccess/jwt_test.go
index 110c3e9..1388525 100644
--- a/internal/keyaccess/jwt_test.go
+++ b/internal/keyaccess/jwt_test.go
@@ -6,7 +6,8 @@ import (
 
 	"github.com/TBD54566975/ssi-sdk/credential"
 	"github.com/TBD54566975/ssi-sdk/crypto"
-	"github.com/TBD54566975/ssi-sdk/did"
+	"github.com/TBD54566975/ssi-sdk/did/key"
+	"github.com/TBD54566975/ssi-sdk/did/resolution"
 	"github.com/goccy/go-json"
 	"github.com/google/uuid"
 	"github.com/stretchr/testify/assert"
@@ -222,7 +223,7 @@ func TestJWKKeyAccessSignVerifyCredentials(t *testing.T) {
 
 func TestJWKKeyAccessSignVerifyPresentations(t *testing.T) {
 	t.Run("Sign and Verify Presentations - Happy Path", func(tt *testing.T) {
-		privKey, didKey, err := did.GenerateDIDKey(crypto.Ed25519)
+		privKey, didKey, err := key.GenerateDIDKey(crypto.Ed25519)
 		assert.NoError(tt, err)
 		assert.NotEmpty(tt, privKey)
 		expanded, err := didKey.Expand()
@@ -239,7 +240,7 @@ func TestJWKKeyAccessSignVerifyPresentations(t *testing.T) {
 		assert.NotEmpty(tt, signedPres)
 
 		// verify
-		resolver, err := did.NewResolver([]did.Resolver{did.KeyResolver{}}...)
+		resolver, err := resolution.NewResolver([]resolution.Resolver{key.Resolver{}}...)
 		assert.NoError(tt, err)
 		verifiedPres, err := ka.VerifyVerifiablePresentation(context.Background(), resolver, *signedPres)
 		assert.NoError(tt, err)
@@ -278,7 +279,7 @@ func TestJWKKeyAccessSignVerifyPresentations(t *testing.T) {
 		assert.NotEmpty(tt, ka)
 
 		// verify
-		resolver, err := did.NewResolver([]did.Resolver{did.KeyResolver{}}...)
+		resolver, err := resolution.NewResolver([]resolution.Resolver{key.Resolver{}}...)
 		assert.NoError(tt, err)
 		_, err = ka.VerifyVerifiablePresentation(context.Background(), resolver, "bad")
 		assert.Error(tt, err)
@@ -312,7 +313,7 @@ func getDataIntegrityTestPresentation(ka DataIntegrityKeyAccess) credential.Veri
 	knownID := uuid.NewString()
 	knownType := []string{"VerifiablePresentation", "HappyPresentation"}
 	knownHolder := "did:example:ebfeb1f712ebc6f1c276e12ec21"
-	testCredential := getTestCredential(ka.JWTSigner.ID)
+	testCredential := getTestCredential(ka.Signer.ID)
 	signedCred, _ := ka.Sign(&testCredential)
 	return credential.VerifiablePresentation{
 		Context:              knownContext,
@@ -328,7 +329,7 @@ func getJWTTestPresentation(ka JWKKeyAccess) credential.VerifiablePresentation {
 	knownID := uuid.NewString()
 	knownType := []string{"VerifiablePresentation", "HappyPresentation"}
 	knownHolder := "did:example:ebfeb1f712ebc6f1c276e12ec21"
-	testCredential := getTestCredential(ka.JWTSigner.ID)
+	testCredential := getTestCredential(ka.Signer.ID)
 	signedJWT, _ := ka.SignVerifiableCredential(testCredential)
 	return credential.VerifiablePresentation{
 		Context:              knownContext,
diff --git a/pkg/server/router/credential_test.go b/pkg/server/router/credential_test.go
index ce0afdf..fbc439b 100644
--- a/pkg/server/router/credential_test.go
+++ b/pkg/server/router/credential_test.go
@@ -548,7 +548,7 @@ func TestCredentialRouter(t *testing.T) {
 
 	})
 
-	t.Run("Create Multiple Suspendable Credential Different Issuer SchemaID StatusPurpose Triples", func(tt *testing.T) {
+	t.Run("Create Multiple Suspendable Credential Different IssuerDID SchemaID StatusPurpose Triples", func(tt *testing.T) {
 		bolt := setupTestDB(tt)
 		assert.NotNil(tt, bolt)
 
diff --git a/pkg/server/router/manifest_test.go b/pkg/server/router/manifest_test.go
index 7b1dc5b..ae8a7b3 100644
--- a/pkg/server/router/manifest_test.go
+++ b/pkg/server/router/manifest_test.go
@@ -8,6 +8,7 @@ import (
 	manifestsdk "github.com/TBD54566975/ssi-sdk/credential/manifest"
 	"github.com/TBD54566975/ssi-sdk/crypto"
 	didsdk "github.com/TBD54566975/ssi-sdk/did"
+	"github.com/TBD54566975/ssi-sdk/did/key"
 	"github.com/google/uuid"
 	"github.com/stretchr/testify/assert"
 
@@ -62,7 +63,7 @@ func TestManifestRouter(t *testing.T) {
 		assert.NoError(tt, err)
 		assert.NotEmpty(tt, issuerDID)
 
-		applicantPrivKey, applicantDIDKey, err := didsdk.GenerateDIDKey(crypto.Ed25519)
+		applicantPrivKey, applicantDIDKey, err := key.GenerateDIDKey(crypto.Ed25519)
 		assert.NoError(tt, err)
 		assert.NotEmpty(tt, applicantPrivKey)
 		assert.NotEmpty(tt, applicantDIDKey)
diff --git a/pkg/server/server_manifest_test.go b/pkg/server/server_manifest_test.go
index 91f6dd1..6776376 100644
--- a/pkg/server/server_manifest_test.go
+++ b/pkg/server/server_manifest_test.go
@@ -12,6 +12,7 @@ import (
 	"github.com/TBD54566975/ssi-sdk/credential/manifest"
 	"github.com/TBD54566975/ssi-sdk/crypto"
 	didsdk "github.com/TBD54566975/ssi-sdk/did"
+	"github.com/TBD54566975/ssi-sdk/did/key"
 	"github.com/benbjohnson/clock"
 	"github.com/goccy/go-json"
 	"github.com/google/uuid"
@@ -349,7 +350,7 @@ func TestManifestAPI(t *testing.T) {
 		assert.NotEmpty(tt, issuerDID)
 
 		// create an applicant
-		applicantPrivKey, applicantDIDKey, err := didsdk.GenerateDIDKey(crypto.Ed25519)
+		applicantPrivKey, applicantDIDKey, err := key.GenerateDIDKey(crypto.Ed25519)
 		assert.NoError(tt, err)
 		assert.NotEmpty(tt, applicantPrivKey)
 		assert.NotEmpty(tt, applicantDIDKey)
@@ -512,7 +513,7 @@ func TestManifestAPI(t *testing.T) {
 		assert.NotEmpty(tt, issuerDID)
 
 		// create an applicant
-		applicantPrivKey, applicantDIDKey, err := didsdk.GenerateDIDKey(crypto.Ed25519)
+		applicantPrivKey, applicantDIDKey, err := key.GenerateDIDKey(crypto.Ed25519)
 		assert.NoError(tt, err)
 		assert.NotEmpty(tt, applicantPrivKey)
 		assert.NotEmpty(tt, applicantDIDKey)
@@ -665,7 +666,7 @@ func TestManifestAPI(t *testing.T) {
 		assert.NotEmpty(tt, issuerDID)
 
 		// create an applicant
-		applicantPrivKey, applicantDIDKey, err := didsdk.GenerateDIDKey(crypto.Ed25519)
+		applicantPrivKey, applicantDIDKey, err := key.GenerateDIDKey(crypto.Ed25519)
 		assert.NoError(tt, err)
 		assert.NotEmpty(tt, applicantPrivKey)
 		assert.NotEmpty(tt, applicantDIDKey)
@@ -816,7 +817,7 @@ func TestManifestAPI(t *testing.T) {
 		assert.NotEmpty(tt, issuerDID)
 
 		// create an applicant
-		applicantPrivKey, applicantDIDKey, err := didsdk.GenerateDIDKey(crypto.Ed25519)
+		applicantPrivKey, applicantDIDKey, err := key.GenerateDIDKey(crypto.Ed25519)
 		assert.NoError(tt, err)
 		assert.NotEmpty(tt, applicantPrivKey)
 		assert.NotEmpty(tt, applicantDIDKey)
@@ -969,7 +970,7 @@ func TestManifestAPI(t *testing.T) {
 		assert.NotEmpty(tt, issuerDID)
 
 		// create an applicant
-		applicantPrivKey, applicantDIDKey, err := didsdk.GenerateDIDKey(crypto.Ed25519)
+		applicantPrivKey, applicantDIDKey, err := key.GenerateDIDKey(crypto.Ed25519)
 		assert.NoError(tt, err)
 		assert.NotEmpty(tt, applicantPrivKey)
 		assert.NotEmpty(tt, applicantDIDKey)
diff --git a/pkg/server/server_presentation_test.go b/pkg/server/server_presentation_test.go
index 39a10f4..e487977 100644
--- a/pkg/server/server_presentation_test.go
+++ b/pkg/server/server_presentation_test.go
@@ -10,7 +10,9 @@ import (
 	"github.com/TBD54566975/ssi-sdk/credential"
 	"github.com/TBD54566975/ssi-sdk/credential/exchange"
 	"github.com/TBD54566975/ssi-sdk/crypto"
+	"github.com/TBD54566975/ssi-sdk/crypto/jwx"
 	didsdk "github.com/TBD54566975/ssi-sdk/did"
+	"github.com/TBD54566975/ssi-sdk/did/key"
 	"github.com/goccy/go-json"
 	"github.com/google/go-cmp/cmp"
 	"github.com/google/go-cmp/cmp/cmpopts"
@@ -545,7 +547,8 @@ func createDID(t *testing.T, didService *did.Service) *did.CreateDIDResponse {
 	return creatorDID
 }
 
-func createSubmission(t *testing.T, pRouter *router.PresentationRouter, definitionID string, requesterDID string, vc credential.VerifiableCredential, holderDID didsdk.DIDKey, holderSigner crypto.JWTSigner) router.Operation {
+func createSubmission(t *testing.T, pRouter *router.PresentationRouter, definitionID string, requesterDID string,
+	vc credential.VerifiableCredential, holderDID key.DIDKey, holderSigner jwx.Signer) router.Operation {
 	request := createSubmissionRequest(t, definitionID, requesterDID, vc, holderSigner, holderDID)
 
 	value := newRequestValue(t, request)
@@ -560,7 +563,8 @@ func createSubmission(t *testing.T, pRouter *router.PresentationRouter, definiti
 	return resp
 }
 
-func createSubmissionRequest(t *testing.T, definitionID, requesterDID string, vc credential.VerifiableCredential, holderSigner crypto.JWTSigner, holderDID didsdk.DIDKey) router.CreateSubmissionRequest {
+func createSubmissionRequest(t *testing.T, definitionID, requesterDID string, vc credential.VerifiableCredential,
+	holderSigner jwx.Signer, holderDID key.DIDKey) router.CreateSubmissionRequest {
 	issuerSigner, didKey := getSigner(t)
 	vc.Issuer = didKey.String()
 	vcData, err := credential.SignVerifiableCredentialJWT(issuerSigner, vc)
@@ -586,7 +590,7 @@ func createSubmissionRequest(t *testing.T, definitionID, requesterDID string, vc
 		VerifiableCredential:   []any{keyaccess.JWT(vcData)},
 	}
 
-	signed, err := credential.SignVerifiablePresentationJWT(holderSigner, credential.JWTVVPParameters{Audience: requesterDID}, vp)
+	signed, err := credential.SignVerifiablePresentationJWT(holderSigner, credential.JWTVVPParameters{Audience: []string{requesterDID}}, vp)
 	require.NoError(t, err)
 
 	request := router.CreateSubmissionRequest{SubmissionJWT: keyaccess.JWT(signed)}
@@ -672,14 +676,14 @@ func createPresentationDefinition(t *testing.T, pRouter *router.PresentationRout
 	return resp
 }
 
-func getSigner(t *testing.T) (crypto.JWTSigner, didsdk.DIDKey) {
-	private, didKey, err := didsdk.GenerateDIDKey(crypto.P256)
+func getSigner(t *testing.T) (jwx.Signer, key.DIDKey) {
+	private, didKey, err := key.GenerateDIDKey(crypto.P256)
 	require.NoError(t, err)
 
 	expanded, err := didKey.Expand()
 	require.NoError(t, err)
 
-	signer, err := crypto.NewJWTSigner(didKey.String(), expanded.VerificationMethod[0].ID, private)
+	signer, err := jwx.NewJWXSigner(didKey.String(), expanded.VerificationMethod[0].ID, private)
 	require.NoError(t, err)
 
 	return *signer, *didKey
diff --git a/pkg/service/did/ion_test.go b/pkg/service/did/ion_test.go
index a6f391d..05dea67 100644
--- a/pkg/service/did/ion_test.go
+++ b/pkg/service/did/ion_test.go
@@ -40,7 +40,7 @@ func TestIONHandler(t *testing.T) {
 		handler, err = NewIONHandler("bad", didStorage, keystoreService)
 		assert.Error(tt, err)
 		assert.Empty(tt, handler)
-		assert.Contains(tt, err.Error(), "invalid resolver URL: parse \"bad\": invalid URI for request")
+		assert.Contains(tt, err.Error(), "invalid resolution URL")
 
 		handler, err = NewIONHandler("https://example.com", didStorage, keystoreService)
 		assert.NoError(tt, err)
diff --git a/pkg/service/keystore/service_test.go b/pkg/service/keystore/service_test.go
index 92167ab..fa2b4fc 100644
--- a/pkg/service/keystore/service_test.go
+++ b/pkg/service/keystore/service_test.go
@@ -6,6 +6,7 @@ import (
 	"testing"
 
 	"github.com/TBD54566975/ssi-sdk/crypto"
+	"github.com/TBD54566975/ssi-sdk/crypto/jwx"
 	"github.com/mr-tron/base58"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
@@ -139,7 +140,7 @@ func TestStoreAndGetKey(t *testing.T) {
 	assert.Equal(t, privKey, keyResponse.Key)
 
 	// make sure can create a signer properly
-	signer, err := crypto.NewJWTSigner("test-id", "kid", keyResponse.Key)
+	signer, err := jwx.NewJWXSigner("test-id", "kid", keyResponse.Key)
 	assert.NoError(t, err)
 	assert.NotEmpty(t, signer)
 }
diff --git a/pkg/testutil/well_known_generation_test.go b/pkg/testutil/well_known_generation_test.go
index 60ec2ee..8226cf7 100644
--- a/pkg/testutil/well_known_generation_test.go
+++ b/pkg/testutil/well_known_generation_test.go
@@ -133,7 +133,7 @@ func createWellKnownDIDConfiguration(tt *testing.T, didResponse *did.CreateDIDRe
 
 	// TODO: Remove typ header
 	// option := jwt.WithJwsHeaders()
-	signedTokenBytes, err := jwt.Sign(jwtToken, jwa.SignatureAlgorithm(keyAccess.JWTSigner.GetSigningAlgorithm()), keyAccess.JWTSigner.Key)
+	signedTokenBytes, err := jwt.Sign(jwtToken, jwa.SignatureAlgorithm(keyAccess.Signer.ALG), keyAccess.Signer.PrivateKey)
 	assert.NoError(tt, err)
 
 	credToken := keyaccess.JWT(signedTokenBytes).Ptr()