` is the did:web dataspace identifier.
-
-### GAIA-X Private key
-
-The GAIA-X authority private key is available to repository committers as a downloadable artifact in the GitHub workflow run. This is done for presentation/development purposes.
-
-![Private Key artifact](key-artifact.png)
-
-This allows users who extend MVD with additional policies to publish additional verifiable credentials into their deployments, using the [Identity Hub CLI](https://github.com/eclipse-dataspaceconnector/IdentityHub/tree/main/client-cli).
-
-## Rationale
-
-This structure illustrates the components involved in onboarding participants in dataspaces in the context of GAIA-X.
-
-In a future iteration, the publicly available test GAIA-X server could be used to generate Verifiable Credentials.
diff --git a/docs/developer/decision-records/2022-08-04-verifiable-credentials/key-artifact.png b/docs/developer/decision-records/2022-08-04-verifiable-credentials/key-artifact.png
deleted file mode 100644
index fb70adfd..00000000
Binary files a/docs/developer/decision-records/2022-08-04-verifiable-credentials/key-artifact.png and /dev/null differ
diff --git a/docs/developer/decision-records/2022-08-15-code-quality-tooling/README.md b/docs/developer/decision-records/2022-08-15-code-quality-tooling/README.md
deleted file mode 100644
index edff190a..00000000
--- a/docs/developer/decision-records/2022-08-15-code-quality-tooling/README.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# Code Quality
-
-## Decision
-
-Use [Checkstyle](https://checkstyle.sourceforge.io/) and [CodeQL](https://codeql.github.com/) static code analysis tools to guarantee adherence to coding standards and discover potential vulnerabilities.
-
-## Rationale
-
-Both Checkstyle and CodeQL are already in use in the EDC framework, so these tools are the natural choice in related projects like the MVD as well.
-
-## Approach
-
-Checkstyle checks and CodeQL analysis need to run on Pull Requests in both upstream and forked repositories.
diff --git a/docs/developer/decision-records/README.md b/docs/developer/decision-records/README.md
deleted file mode 100644
index 2bc95cad..00000000
--- a/docs/developer/decision-records/README.md
+++ /dev/null
@@ -1,10 +0,0 @@
-# Decision Records
-
-- [2022-04-11 Decentralized Identity](2022-04-11-decentralized-identity/)
-- [2022-04-28 Federated Catalog](2022-04-28-federated-catalog/)
-- [2022-06-15 Registration Service](2022-06-15-registration-service/)
-- [2022-06-16 Distributed Authorization](2022-06-16-distributed-authorization/)
-- [2022-06-20 MVD Onboarding](2022-06-20-mvd-onboarding/)
-- [2022-07-19 CD Vault Secrets](2022-07-19-cd-vault-secrets/)
-- [2022-08-04 Verifiable Credentials](2022-08-04-verifiable-credentials/)
-- [2022-08-15 Code Quality Tooling](2022-08-15-code-quality-tooling/)
diff --git a/docs/developer/edc-data-dashboard/add-asset.md b/docs/developer/edc-data-dashboard/add-asset.md
deleted file mode 100644
index 12cba069..00000000
--- a/docs/developer/edc-data-dashboard/add-asset.md
+++ /dev/null
@@ -1,39 +0,0 @@
-# Add Asset
-
-## Overview
-
-A new asset can be added through the EDC data dashboard, in this process we actually point to a pre-existing asset in a participant's respective object storage account. In the current MVD version, only Azure Object Storage is supported.
-
-If we want to add an asset named as `test-document` then this asset must be already available in the participant's object storage account under a container named as `src-container` before we can add it via the dashboard UI. Refer to the following links for more details about how to upload an asset in Azure Object Storage:
-
-* [Create a container](https://docs.microsoft.com/azure/storage/blobs/storage-quickstart-blobs-portal#create-a-container)
-* [Upload a blob](https://docs.microsoft.com/azure/storage/blobs/storage-quickstart-blobs-portal#upload-a-block-blob)
-
-## Prerequisites
-
-Actual asset must be already uploaded in object storage account in a container named as `src-container`.
-
-## Adding an Azure object storage asset
-
-* Go to `Assets` pane and here you will see all existing assets if any.
-
-![assets](assets.png)
-
-* Click on `Create asset` button and this will open an UI popup where you can add further details.
-
-![create-assets](create-assets.png)
-
-* Add a unique ID e.g. UUID for the asset in text box named `id`. This id will be used when selecting asset for publishing. Publishing an asset is covered under [publish-asset.md](./publish-asset.md).
-* Add name for the asset in text box named `name`.
-* Add content type for the asset in text box named `Content Type`. e.g. `text/plain`. It is just an additional metadata for the content of the asset and it is not used further in EDC data transfer.
-* Select the `Destination` type (`Azure Storage` in this case to transfer from Azure Blob Storage to Azure Blob Storage).
-* Add object storage account name in text box named as `Account`.
-* Define the container within the Azure Object Storage Account in `Container` (pre-defined as `src-container` for the MVD for simplicity reasons).
-* Add blob name in text box named as `Blob Name`.
-
-![create-assets-filled](create-assets-filled.png)
-
-* Click on `Create` button to add the asset.
-* `Assets` pane will be refreshed and you will see the newly created asset.
-
-![newly-added-assets](newly-added-assets.png)
diff --git a/docs/developer/edc-data-dashboard/add-policy.md b/docs/developer/edc-data-dashboard/add-policy.md
deleted file mode 100644
index 97c0e9fa..00000000
--- a/docs/developer/edc-data-dashboard/add-policy.md
+++ /dev/null
@@ -1,61 +0,0 @@
-# Adding a Policy
-
-## Overview
-
-*Data Providers can be sure that their data is treated according to the specified usage policies by the IDS Connector of the Data Consumer. Each participant is able to define usage control polices that are attached to outbound data. Policies might include restrictions, e.g. disallowing persistence of data or transfer of data to other parties.* (Source: [Industrial Data Spaces Association, IDS Reference Architecture Model, Version 2.0](https://www.fraunhofer.de/content/dam/zv/de/Forschungsfelder/industrial-data-space/IDS_Referenz_Architecture.pdf))
-
-## Adding a policy
-
-In the *Policies* pane, click the *Create policy* button.
-
-![create-policy-button](create-policy-button.png)
-
-Enter the required data.
-
-- ID: a unique ID string.
-
-- Assignee: a string identifying the Policy assignee. May be blank.
-
-- Assigner: a string identifying the Policy assigner. May be blank.
-
-- Permissions: a JSON string detailing Policy permissions. Use `[]` for an empty list. For example:
-
- ```
- [
- {
- "edctype": "dataspaceconnector:permission",
- "uid": null,
- "target": null,
- "action": {
- "type": "USE",
- "includedIn": null,
- "constraint": null
- },
- "assignee": null,
- "assigner": null,
- "constraints": [
- {
- "edctype": "AtomicConstraint",
- "leftExpression": {
- "edctype": "dataspaceconnector:literalexpression",
- "value": "ids:absoluteSpatialPosition"
- },
- "rightExpression": {
- "edctype": "dataspaceconnector:literalexpression",
- "value": "eu"
- },
- "operator": "EQ"
- }
- ],
- "duties": []
- }
- ]
- ```
-
-- Prohibitions: a JSON string detailing Policy prohibitions. Use `[]` for an empty list.
-
-- Obligations: a JSON string detailing Policy obligations. Use `[]` for an empty list.
-
-![add-policy](add-policy.png)
-
-Click *Save*. The newly created Policy appears in the *Policies* pane.
diff --git a/docs/developer/edc-data-dashboard/add-policy.png b/docs/developer/edc-data-dashboard/add-policy.png
deleted file mode 100644
index 47e8d099..00000000
Binary files a/docs/developer/edc-data-dashboard/add-policy.png and /dev/null differ
diff --git a/docs/developer/edc-data-dashboard/assets.png b/docs/developer/edc-data-dashboard/assets.png
deleted file mode 100644
index e5614e78..00000000
Binary files a/docs/developer/edc-data-dashboard/assets.png and /dev/null differ
diff --git a/docs/developer/edc-data-dashboard/contract-agreements.md b/docs/developer/edc-data-dashboard/contract-agreements.md
deleted file mode 100644
index 5f93f42a..00000000
--- a/docs/developer/edc-data-dashboard/contract-agreements.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Browsing Contract Agreements
-
-## Overview
-
-A Contract Agreement is established after a Consumer connector, having obtained a Contract Offer from a Provider connector, negotiates the agreement with the Provider. Afterwards the Contract Agreement can be executed to have the Provider transfer data to the Consumer.
-
-## Browsing Contract Agreements
-
-In the *Contracts* pane, browse the list of current Contract Agreements on the Consumer side.
-
-For each Contract Agreement, the following fields are displayed:
-
-- Contract Agreement ID
-- Asset ID
-- Policy ID
-- Provider Connector Name
-- Validity start and end dates
-
-![contracts-transfer](contracts-transfer.png)
-
-You can then proceed to [Initiating a Data Transfer](initiate-transfer.md).
diff --git a/docs/developer/edc-data-dashboard/contracts-definition.png b/docs/developer/edc-data-dashboard/contracts-definition.png
deleted file mode 100644
index 03a69a1e..00000000
Binary files a/docs/developer/edc-data-dashboard/contracts-definition.png and /dev/null differ
diff --git a/docs/developer/edc-data-dashboard/contracts-transfer-start.png b/docs/developer/edc-data-dashboard/contracts-transfer-start.png
deleted file mode 100644
index a6987a68..00000000
Binary files a/docs/developer/edc-data-dashboard/contracts-transfer-start.png and /dev/null differ
diff --git a/docs/developer/edc-data-dashboard/contracts-transfer.png b/docs/developer/edc-data-dashboard/contracts-transfer.png
deleted file mode 100644
index 1408395b..00000000
Binary files a/docs/developer/edc-data-dashboard/contracts-transfer.png and /dev/null differ
diff --git a/docs/developer/edc-data-dashboard/create-assets-filled.png b/docs/developer/edc-data-dashboard/create-assets-filled.png
deleted file mode 100644
index 907d1624..00000000
Binary files a/docs/developer/edc-data-dashboard/create-assets-filled.png and /dev/null differ
diff --git a/docs/developer/edc-data-dashboard/create-assets.png b/docs/developer/edc-data-dashboard/create-assets.png
deleted file mode 100644
index 868e4493..00000000
Binary files a/docs/developer/edc-data-dashboard/create-assets.png and /dev/null differ
diff --git a/docs/developer/edc-data-dashboard/create-contract-definition.png b/docs/developer/edc-data-dashboard/create-contract-definition.png
deleted file mode 100644
index f8c04227..00000000
Binary files a/docs/developer/edc-data-dashboard/create-contract-definition.png and /dev/null differ
diff --git a/docs/developer/edc-data-dashboard/create-contracts-definition-sample.png b/docs/developer/edc-data-dashboard/create-contracts-definition-sample.png
deleted file mode 100644
index 0d1eab1b..00000000
Binary files a/docs/developer/edc-data-dashboard/create-contracts-definition-sample.png and /dev/null differ
diff --git a/docs/developer/edc-data-dashboard/create-contracts-definition.png b/docs/developer/edc-data-dashboard/create-contracts-definition.png
deleted file mode 100644
index 0d1eab1b..00000000
Binary files a/docs/developer/edc-data-dashboard/create-contracts-definition.png and /dev/null differ
diff --git a/docs/developer/edc-data-dashboard/create-policy-button.png b/docs/developer/edc-data-dashboard/create-policy-button.png
deleted file mode 100644
index 815e50be..00000000
Binary files a/docs/developer/edc-data-dashboard/create-policy-button.png and /dev/null differ
diff --git a/docs/developer/edc-data-dashboard/dataspace-catalog-negotiation.png b/docs/developer/edc-data-dashboard/dataspace-catalog-negotiation.png
deleted file mode 100644
index cefec866..00000000
Binary files a/docs/developer/edc-data-dashboard/dataspace-catalog-negotiation.png and /dev/null differ
diff --git a/docs/developer/edc-data-dashboard/dataspace-catalog.png b/docs/developer/edc-data-dashboard/dataspace-catalog.png
deleted file mode 100644
index d6e22bb8..00000000
Binary files a/docs/developer/edc-data-dashboard/dataspace-catalog.png and /dev/null differ
diff --git a/docs/developer/edc-data-dashboard/initiate-transfer.md b/docs/developer/edc-data-dashboard/initiate-transfer.md
deleted file mode 100644
index ee1fb2a3..00000000
--- a/docs/developer/edc-data-dashboard/initiate-transfer.md
+++ /dev/null
@@ -1,29 +0,0 @@
-# Initiating a Data Transfer
-
-## Overview
-
-Data Transfer in EDC is an operation by which a Consumer connector and a Provider connector, having previously negotiated a Contract Agreement, execute the Contract Agreement to have the Provider transfer data to the Consumer.
-
-A transfer request is initiated on the Consumer side, sent over to the Provider, and executed in DPF.
-
-The Consumer provides the Provider with a data destination (such as a cloud object storage with temporary credentials).
-
-The Provider does not notify the Consumer when a transfer has completed (succeeded or failed), see [EDC developer documentation](https://github.com/eclipse-dataspaceconnector/DataSpaceConnector/tree/main/docs/developer/decision-records/2022-04-21-dpf-blob-data-transfer). Depending on the type of destination, the Consumer polls the output (e.g. cloud object storage) to wait for data to be produced.
-
-## Prerequisites
-
-To perform a data transfer, the Consumer must first have successfully executed a Contract Negotiation with the Provider.
-
-## Initiating a transfer
-
-In the *Contracts* pane, locate the [Contract Agreement](contract-agreements.md) to execute. click the *Transfer* button under the agreement.
-
-![contracts-transfer](contracts-transfer.png)
-
-Select a destination (only *Azure Storage* is currently implemented). Click Start transfer to begin the process.
-
-![contracts-transfer-start](contracts-transfer-start.png)
-
-The UI displays the transfer state as it progresses. When the transfer reaches the *COMPLETED* state, a pop-up appears to indicate completion.
-
-The transfer is displayed in the [*Transfer History* pane](transfer-history.md).
diff --git a/docs/developer/edc-data-dashboard/negotiate-contract-complete.png b/docs/developer/edc-data-dashboard/negotiate-contract-complete.png
deleted file mode 100644
index 044df97d..00000000
Binary files a/docs/developer/edc-data-dashboard/negotiate-contract-complete.png and /dev/null differ
diff --git a/docs/developer/edc-data-dashboard/negotiate-contract.md b/docs/developer/edc-data-dashboard/negotiate-contract.md
deleted file mode 100644
index 11db8a69..00000000
--- a/docs/developer/edc-data-dashboard/negotiate-contract.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# Negotiating a Contract
-
-## Overview
-
-Asset Negotiation in EDC is an operation by which a Consumer connector, having obtained a Contract Offer from a Provider connector, negotiates a Contract Agreement with the Provider. Afterwards the Contract Agreement can be executed to have the Provider transfer data to the Consumer.
-
-A negotiation request is initiated on the Consumer side, sent over to the Provider, which sends a Contract Agreement response back to the Consumer (accepted or rejected).
-
-## Prerequisites
-
-To perform a data transfer, the Consumer must have a Contract Offer from the Provider.
-
-## Initiating a transfer
-
-In the *Dataspace Catalog* pane, click the *Negotiate* button under an asset.
-
-![negotiate-contract](negotiate-contract.png)
-
-After negotiation completes, a pop-up appears.
-
-![negotiate-contract-complete](negotiate-contract-complete.png)
-
-You can then proceed to [Initiating a Data Transfer](initiate-transfer.md).
diff --git a/docs/developer/edc-data-dashboard/negotiate-contract.png b/docs/developer/edc-data-dashboard/negotiate-contract.png
deleted file mode 100644
index 8b922137..00000000
Binary files a/docs/developer/edc-data-dashboard/negotiate-contract.png and /dev/null differ
diff --git a/docs/developer/edc-data-dashboard/newly-added-assets.png b/docs/developer/edc-data-dashboard/newly-added-assets.png
deleted file mode 100644
index 406b2212..00000000
Binary files a/docs/developer/edc-data-dashboard/newly-added-assets.png and /dev/null differ
diff --git a/docs/developer/edc-data-dashboard/newly-added-create-contracts.png b/docs/developer/edc-data-dashboard/newly-added-create-contracts.png
deleted file mode 100644
index 94a970f7..00000000
Binary files a/docs/developer/edc-data-dashboard/newly-added-create-contracts.png and /dev/null differ
diff --git a/docs/developer/edc-data-dashboard/publish-asset.md b/docs/developer/edc-data-dashboard/publish-asset.md
deleted file mode 100644
index aaa5c257..00000000
--- a/docs/developer/edc-data-dashboard/publish-asset.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# Publish Assets
-
-## Overview
-
-Publishing an asset in EDC is done by creating a new contract definition. Every contract definition has an access policy and contract policy associated with it. Along with this one or more assets can be chosen which defines the assets that are being published by the current contract definition.
-
-## Prerequisites
-
-To publish an asset followings are the prerequisites:
-
-* Asset must be already uploaded and available in the EDC.
-* Policy must be created in the EDC.
-
-## Publishing an asset
-
-* Go to`Contract Definitions` pane and here you will see any existing contract definitions, if any.
-
-![contracts-definition](contracts-definition.png)
-
-* Click on `Create Contract Definition` button and this will open a UI popup where you can add further details.
-
-![create-contract-definition](create-contract-definition.png)
-
-* Add a unique ID e.g. UUID for the contract definition in UI box named `ID`.
-* Select appropriate access policy from the dropdown.
-* Select appropriate contract policy from the dropdown.
-* Select the assets you want to add to the contract definition
- * More than one asset can be added to a contract definition.
-* Click on `Create` button to create the contract definition.
-
-![create-contracts-definition-sample](create-contracts-definition-sample.png)
-
-* `Contract Definition` pane will be refreshed and you will see the newly created contract definition.
-* Soon this newly published asset will be available in the `Catalog` of other Dataspace participants. This depends on refresh rate of the catalog for the particular dataspace participant.
-
-![newly-added-create-contracts](newly-added-create-contracts.png)
diff --git a/docs/developer/edc-data-dashboard/transfer-history.md b/docs/developer/edc-data-dashboard/transfer-history.md
deleted file mode 100644
index d896f869..00000000
--- a/docs/developer/edc-data-dashboard/transfer-history.md
+++ /dev/null
@@ -1,29 +0,0 @@
-# Browsing the Transfer History
-
-## Overview
-
-The Transfer History pane shows Data Transfers for which the connector was a participant, either as Consumer or Provider.
-
-See [Initiating a Data Transfer](initiate-transfer.md) for more details about the transfer process.
-
-## Browsing the Transfer History
-
-Browse to the *Transfer History* pane.
-
-For each transfer, the UI shows:
-
-- Transfer Process ID
-- Type: whether the connector was the Consumer or Provider side of the transfer
-- State: transfer completion state (see caveats in [Initiating a Data Transfer](initiate-transfer.md))
-- ConnectorId: the counterpart Connector ID
-- Protocol: unused
-- AssetId: the transferred Asset ID
-- ContractId: the Contract Agreement ID used to execute the transfer
-- Error: error message if any
-- Action: link to a data browser, if available
-
-![transfer-history](transfer-history.png)
-
-For data transferred to Azure Storage, The *Open Storage Explorer* link opens the destination storage container in [Azure Storage Explorer](https://azure.microsoft.com/features/storage-explorer) (you will need to install the software beforehand if not available on your machine).
-
-You can see the created assets, as well as a `.complete` marker blob used for the Consumer to detect transfer completion.
diff --git a/docs/developer/edc-data-dashboard/transfer-history.png b/docs/developer/edc-data-dashboard/transfer-history.png
deleted file mode 100644
index 1d964432..00000000
Binary files a/docs/developer/edc-data-dashboard/transfer-history.png and /dev/null differ
diff --git a/docs/developer/edc-data-dashboard/view-catalog.md b/docs/developer/edc-data-dashboard/view-catalog.md
deleted file mode 100644
index 2e51e459..00000000
--- a/docs/developer/edc-data-dashboard/view-catalog.md
+++ /dev/null
@@ -1,14 +0,0 @@
-# View Catalog
-
-## Overview
-
-Dataspace participants can use the EDC data dashboard to view contract offers are shared with them. Contract offers are added to the `Catalog` which is refreshed frequently(the refresh interval is configurable per connector) as new contract offers are added by other participants.
-
-## Viewing Catalog/Offers
-
-* Go to `Dataspace Catalog` pane to see list of all existing contract offers which are shared with current dataspce participant.
-* Click on `Additional Properties` section to view complete details of the contract offer.
-
-![dataspace-catalog](dataspace-catalog.png)
-
-To perform negotiation on a contract offer, see [Negotiating a Contract](negotiate-contract.md).
diff --git a/docs/templates/README.md b/docs/templates/README.md
deleted file mode 100644
index 1cf75e8b..00000000
--- a/docs/templates/README.md
+++ /dev/null
@@ -1,16 +0,0 @@
-# Templates
-
-Find all provided documentation templates in this folder. Please note that the _italic text
-and sentences_ should be removed. Feel free to add additional sections and subsections, however, make sure
-that at least the sections of the templates marked as "mandatory" are filled.
-
-## Decision Records
-
-[Link](decision-record.md) to template.
-
-Each decision record should be put in an appropriate folder that is following a naming pattern:
-`YYYY-MM-DD-title-of-decision-record`. This should be located at the [decision record folder](../developer/decision-records)
-and contain all relevant files, at least a filled-out template named `README.md` and any additional images.
-
-As of now, every merged decision record is in state `accepted`. Please make sure to add a comment to
-a decision record that replaces a previous one with adding a hint: `superseded by [...]`.
\ No newline at end of file
diff --git a/docs/templates/decision-record.md b/docs/templates/decision-record.md
deleted file mode 100644
index 68d30c57..00000000
--- a/docs/templates/decision-record.md
+++ /dev/null
@@ -1,15 +0,0 @@
-# Title of the Decision Record
-
-## Decision
-
-_Briefly and clearly describe the topic this record covers, what decision was made and why._
-
-## Rationale
-
-_Briefly describe the relevance of this topic and why it is important to have a decision. If applicable,
-add an evaluation of several options (e.g., different libs)._
-
-## Approach
-
-_Clearly describe the approach. Feel free to add subsections, graphics, or example code and please
-make sure every relevant detail is explained._
diff --git a/docs/templates/puml-colors.txt b/docs/templates/puml-colors.txt
deleted file mode 100644
index d3bd9c6c..00000000
--- a/docs/templates/puml-colors.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-
-Insert this at the beginning of each PlantUML file to keep the style consistent.
-
----
-
-skinParam NoteBackgroundColor WhiteSmoke
-skinParam NoteFontColor Black
-skinParam ParticipantBackgroundColor WhiteSmoke
-skinParam ActorBackgroundColor WhiteSmoke
-skinParam AgentBackgroundColor White
-skinParam AgentBorderColor SkyBlue
-skinparam shadowing false
-
-!define ConsumerColor f8f2ff
-!define ProviderColor d9edff
-!define WarningColor Business
-!define LeadColor Technology
\ No newline at end of file
diff --git a/extensions/catalog-node-resolver/build.gradle.kts b/extensions/catalog-node-resolver/build.gradle.kts
new file mode 100644
index 00000000..36971d21
--- /dev/null
+++ b/extensions/catalog-node-resolver/build.gradle.kts
@@ -0,0 +1,24 @@
+/*
+* Copyright (c) 2023 Bayerische Motoren Werke Aktiengesellschaft (BMW AG)
+*
+* This program and the accompanying materials are made available under the
+* terms of the Apache License, Version 2.0 which is available at
+* https://www.apache.org/licenses/LICENSE-2.0
+*
+* SPDX-License-Identifier: Apache-2.0
+*
+* Contributors:
+* Bayerische Motoren Werke Aktiengesellschaft (BMW AG) - Initial API and Implementation
+*
+*/
+
+plugins {
+ `java-library`
+}
+
+dependencies {
+ implementation(libs.edc.spi.identity.did)
+ implementation(libs.edc.fc.spi.crawler)
+ runtimeOnly(libs.edc.fc.core)
+ runtimeOnly(libs.edc.fc.api)
+}
diff --git a/extensions/catalog-node-resolver/src/main/java/org/eclipse/edc/demo/participants/ParticipantsResolverExtension.java b/extensions/catalog-node-resolver/src/main/java/org/eclipse/edc/demo/participants/ParticipantsResolverExtension.java
new file mode 100644
index 00000000..c31ec391
--- /dev/null
+++ b/extensions/catalog-node-resolver/src/main/java/org/eclipse/edc/demo/participants/ParticipantsResolverExtension.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2024 Metaform Systems, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Apache License, Version 2.0 which is available at
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Contributors:
+ * Metaform Systems, Inc. - initial API and implementation
+ *
+ */
+
+package org.eclipse.edc.demo.participants;
+
+import org.eclipse.edc.crawler.spi.TargetNodeDirectory;
+import org.eclipse.edc.crawler.spi.TargetNodeFilter;
+import org.eclipse.edc.demo.participants.resolver.LazyLoadNodeDirectory;
+import org.eclipse.edc.iam.did.spi.resolution.DidResolverRegistry;
+import org.eclipse.edc.runtime.metamodel.annotation.Extension;
+import org.eclipse.edc.runtime.metamodel.annotation.Inject;
+import org.eclipse.edc.runtime.metamodel.annotation.Provider;
+import org.eclipse.edc.spi.monitor.Monitor;
+import org.eclipse.edc.spi.system.ServiceExtension;
+import org.eclipse.edc.spi.system.ServiceExtensionContext;
+import org.eclipse.edc.spi.types.TypeManager;
+
+import java.io.File;
+
+import static org.eclipse.edc.demo.participants.ParticipantsResolverExtension.NAME;
+
+@Extension(value = NAME)
+public class ParticipantsResolverExtension implements ServiceExtension {
+ public static final String NAME = "MVD Participant Resolver Extension";
+
+ public static final String PARTICIPANT_LIST_FILE_PATH = "edc.mvd.participants.list.file";
+
+ @Inject
+ private TypeManager typeManager;
+
+ @Inject
+ private DidResolverRegistry didResolverRegistry;
+
+ private File participantListFile;
+ private Monitor monitor;
+ private TargetNodeDirectory nodeDirectory;
+
+ @Override
+ public String name() {
+ return NAME;
+ }
+
+ @Override
+ public void initialize(ServiceExtensionContext context) {
+ var participantsPath = context.getConfig().getString(PARTICIPANT_LIST_FILE_PATH);
+ monitor = context.getMonitor().withPrefix("DEMO");
+
+ participantListFile = new File(participantsPath).getAbsoluteFile();
+ if (!participantListFile.exists()) {
+ monitor.warning("Path '%s' does not exist. It must be a resolvable path with read access. Will not add any VCs.".formatted(participantsPath));
+ }
+ }
+
+ @Provider
+ public TargetNodeDirectory createLazyTargetNodeDirectory() {
+ if (nodeDirectory == null) {
+ nodeDirectory = new LazyLoadNodeDirectory(typeManager.getMapper(), participantListFile, didResolverRegistry, monitor);
+ }
+ return nodeDirectory;
+ }
+
+ @Provider
+ public TargetNodeFilter skipSelfNodeFilter(ServiceExtensionContext context) {
+ return targetNode -> {
+ var predicateTest = !targetNode.id().equals(context.getParticipantId());
+ if (!predicateTest) {
+ monitor.debug("Node filter: skipping node '%s' for participant '%s'".formatted(targetNode.id(), context.getParticipantId()));
+ }
+ return predicateTest;
+ };
+ }
+
+
+}
diff --git a/extensions/catalog-node-resolver/src/main/java/org/eclipse/edc/demo/participants/resolver/LazyLoadNodeDirectory.java b/extensions/catalog-node-resolver/src/main/java/org/eclipse/edc/demo/participants/resolver/LazyLoadNodeDirectory.java
new file mode 100644
index 00000000..c5b8dcb2
--- /dev/null
+++ b/extensions/catalog-node-resolver/src/main/java/org/eclipse/edc/demo/participants/resolver/LazyLoadNodeDirectory.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2024 Metaform Systems, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Apache License, Version 2.0 which is available at
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Contributors:
+ * Metaform Systems, Inc. - initial API and implementation
+ *
+ */
+
+package org.eclipse.edc.demo.participants.resolver;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.eclipse.edc.crawler.spi.TargetNode;
+import org.eclipse.edc.crawler.spi.TargetNodeDirectory;
+import org.eclipse.edc.iam.did.spi.document.Service;
+import org.eclipse.edc.iam.did.spi.resolution.DidResolverRegistry;
+import org.eclipse.edc.spi.EdcException;
+import org.eclipse.edc.spi.monitor.Monitor;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * {@link TargetNodeDirectory} that is initialized with a file, that contains participant DIDs. On the first getAll() request
+ * the DIDs are resolved and converted into {@link TargetNode} objects. From then on, they are held in memory and cached.
+ *
+ * DIDs must contain a {@link org.eclipse.edc.iam.did.spi.document.Service} where the {@link Service#getType()} equals {@code ProtocolEndpoint}
+ */
+public class LazyLoadNodeDirectory implements TargetNodeDirectory {
+ private static final TypeReference