diff --git a/.env.example b/.env.example
index 5434e09a6c663550d900224de4d37d61fa66a33f..c3cd2caa3094daa00407959cfc222e7e39e601c5 100644
--- a/.env.example
+++ b/.env.example
@@ -1,5 +1,7 @@
 LEDGERS="BCOVRIN_TEST"
 IDUNION_KEY=#add if you are using IDUNION as a ledger
+IDUNION_BASIC_USER=#add if you are using IDUNION as a ledger
+IDUNION_BASIC_PASS=#add if you are using IDUNION as a ledger
 
 AGENT_PEER_URL="http://localhost:8001"
 AGENT_NAME=EXAMPTTLE_AGENT_45
diff --git a/compose/docker-compose.simple.yml b/compose/docker-compose.simple.yml
index 30d614e481ab7e208ea86f184cf39f4fe029c862..5508f648a5d3d4fa4f0c5e372b7387fd57e73fae 100644
--- a/compose/docker-compose.simple.yml
+++ b/compose/docker-compose.simple.yml
@@ -1,6 +1,30 @@
 version: '3.8'
 
 services:
+
+  builder:
+    privileged: true
+    image: node:18.16.0-buster-slim
+    volumes:
+      - ./../yarn.lock:/app/yarn.lock
+      - ./../package.json:/app/package.json
+      - ./../apps:/app/apps
+      - ./../libs:/app/libs
+      - ./../nx.json:/app/nx.json
+      - ./../tsconfig.base.json:/app/tsconfig.base.json
+      - ./data/node_modules:/app/node_modules
+      - ./data/dist:/app/dist
+    working_dir: /app
+    command:
+      - sh
+      - -c
+      - |
+        whoami
+        apt update -y && apt install python3 git make build-essential -y
+        yarn install
+        yarn build:agent
+        exit 0
+
   pg_db:
     image: 'postgres:latest'
     ports:
@@ -12,10 +36,13 @@ services:
       - ./data/db-simple/:/var/lib/postgresql/data/
 
   agent-issuer-simple:
+    image: node:18.16.0
+    volumes:
+      - ./data/node_modules:/app/node_modules
+      - ./data/dist/apps/agent:/app/
+    working_dir: /app
+    command: node main.js
     container_name: agent-issuer-simple
-    build:
-      context: "../"
-      dockerfile: "./apps/agent/deployment/local/Dockerfile"
     env_file:
       - ./env/issuer.simple.env
     ports:
@@ -24,12 +51,17 @@ services:
     depends_on:
       pg_db:
         condition: service_started
+      builder:
+        condition: service_completed_successfully
 
   agent-holder-simple:
     container_name: agent-holder-simple
-    build:
-      context: "../"
-      dockerfile: "./apps/agent/deployment/local/Dockerfile"
+    image: node:18.16.0
+    volumes:
+      - ./data/node_modules:/app/node_modules
+      - ./data/dist/apps/agent:/app/
+    working_dir: /app
+    command: node main.js
     env_file:
       - ./env/holder.simple.env
     ports:
@@ -38,3 +70,6 @@ services:
     depends_on:
       pg_db:
         condition: service_started
+      builder:
+        condition: service_completed_successfully
+
diff --git a/compose/env/holder.simple.env b/compose/env/holder.simple.env
index 8928d0564da69e5b9af00c27a7c8cd4e6f2f1086..6fb198c52bab9de6d815468f737c1e3c5abfdc5d 100644
--- a/compose/env/holder.simple.env
+++ b/compose/env/holder.simple.env
@@ -1,14 +1,18 @@
 LEDGERS="BCOVRIN_TEST"
+
 IDUNION_KEY=
+IDUNION_BASIC_USER=
+IDUNION_BASIC_PASS=
 
-AGENT_PEER_URL="http://agent-holder:6001"
-AGENT_NAME=DEV_SIMPLE_AGENT_HOLDER_OCM # this should be changed to company name
-AGENT_KEY=DEV_SIMPLE_AGENT_HOLDER_OCM #example random string
-AGENT_DID_SEED=200000000000000000000000TCuste21xh #did private key seed min lenght 32
+AGENT_PEER_URL=http://agent-holder-simple:6001
+AGENT_PEER_PORT=6001
+AGENT_NAME=DEV_SIMPLE_AGENT_HOLDER_OCM_3919 # this should be changed to company name
+AGENT_KEY=DEV_SIMPLE_AGENT_HOLDER_OCM_3818 #example random string
+AGENT_DID_SEED=jhPctchKaUfyZ1ioz6Fjypoasdhjahjsiscdkd23ozxflxkaKD0RR4TICwx
 AGENT_DB_HOST=pg_db:5432
 AGENT_DB_USER=postgres
 AGENT_DB_PASS=postgres
-AGENT_PORT=8081
+AGENT_PORT=8080
 AGENT_CONSUMER_NAME=agent_1
 AGENT_IS_REST=true
 AGENT_MAX_MESSAGES=10
diff --git a/compose/env/issuer.simple.env b/compose/env/issuer.simple.env
index 465996055c663cc68da01f3dd997f54f61404aa9..86e1d2bfc69f5b3d6a3309f5adb9f7278ecb31ac 100644
--- a/compose/env/issuer.simple.env
+++ b/compose/env/issuer.simple.env
@@ -1,14 +1,18 @@
 LEDGERS="BCOVRIN_TEST"
-IDUNION_KEY=
 
-AGENT_PEER_URL="http://agent-issuer:8001"
-AGENT_NAME=DEV_SIMPLE_AGENT_ISSUER_OCM # this should be changed to company name
-AGENT_KEY=DEV_SIMPLE_AGENT_ISSUER_OCM #example random string
-AGENT_DID_SEED=200000000000000000000000TCuste21js #did private key seed min lenght 32
+IDUNION_KEY=6eb8859f-dd7f-445a-bc37-ba986145d3b6
+IDUNION_BASIC_USER=idunion4ssi
+IDUNION_BASIC_PASS=7eDZ+LrUbV5bCRwe6Ki0Gw==
+
+AGENT_PEER_URL=http://agent-issuer-simple:8001
+AGENT_PEER_PORT=8001
+AGENT_NAME=DEV_SIMPLE_AGENT_ISSUER_OCM_45 # this should be changed to company name
+AGENT_KEY=DEV_SIMPLE_AGENT_ISSUER_OCM_45 #example random string
+AGENT_DID_SEED=Cd0VanW68R3HCaskjdakjsNpiuadscmsBBPP3DV6pMdwDFdHvPasdasdas
 AGENT_DB_HOST=pg_db:5432
 AGENT_DB_USER=postgres
 AGENT_DB_PASS=postgres
-AGENT_PORT=8081
+AGENT_PORT=8080
 AGENT_CONSUMER_NAME=agent_1
 AGENT_IS_REST=true
 AGENT_MAX_MESSAGES=10
diff --git a/libs/askar/src/agent.utils.ts b/libs/askar/src/agent.utils.ts
index 3eae5e959a039310952d4bdaadd5e631d6e54827..30de9c76e6f7304812caf2060d5e391e770dc9ad 100644
--- a/libs/askar/src/agent.utils.ts
+++ b/libs/askar/src/agent.utils.ts
@@ -3,11 +3,17 @@ import {
   AutoAcceptCredential,
   AutoAcceptProof,
   ConnectionsModule,
+  ConnectionStateChangedEvent,
   CredentialsModule,
+  DidExchangeRole,
   DidsModule,
   Key,
+  KeyDidResolver,
   KeyType,
+  PeerDidResolver,
   ProofsModule,
+  ProofState,
+  ProofStateChangedEvent,
   TypedArrayEncoder,
   V2CredentialProtocol,
   V2ProofProtocol,
@@ -17,6 +23,7 @@ import {
 import {
   AnonCredsCredentialFormatService,
   AnonCredsModule,
+  AnonCredsProof,
   AnonCredsProofFormatService,
 } from "@aries-framework/anoncreds";
 import {
@@ -31,6 +38,8 @@ import { indyVdr } from "@hyperledger/indy-vdr-nodejs";
 import { AskarModule } from "@aries-framework/askar";
 import { ariesAskar } from "@hyperledger/aries-askar-nodejs";
 import { Key as C, KeyAlgs } from "@hyperledger/aries-askar-shared";
+import { IConfAgent } from "@ocm-engine/config";
+import axios from "axios";
 
 export const importDidsToWallet = async (
   agent: Agent,
@@ -126,10 +135,140 @@ export const getAskarAnonCredsIndyModules = (networks: any) => {
     }),
     dids: new DidsModule({
       registrars: [new IndyVdrIndyDidRegistrar()],
-      resolvers: [new IndyVdrIndyDidResolver()],
+      resolvers: [
+        new IndyVdrIndyDidResolver(),
+        new KeyDidResolver(),
+        new PeerDidResolver(),
+      ],
     }),
     askar: new AskarModule({
       ariesAskar,
     }),
   } as const;
 };
+
+export const svdxProofStateChangeHandler = async (
+  ev: ProofStateChangedEvent,
+  agent: Agent,
+  config?: IConfAgent,
+) => {
+  if (ProofState.Done !== ev.payload.proofRecord.state) {
+    return;
+  }
+
+  const presentationMessage = await agent.proofs.findPresentationMessage(
+    ev.payload.proofRecord.id,
+  );
+
+  console.log(JSON.stringify(presentationMessage, null, 2));
+  if (!presentationMessage) {
+    console.log("No presentation message found");
+    return;
+  }
+
+  const attachmentId = presentationMessage.formats[0].attachmentId;
+
+  const attachment =
+    presentationMessage.getPresentationAttachmentById(attachmentId);
+
+  console.log(JSON.stringify(attachment, null, 2));
+  if (!attachment) {
+    console.log("No attachment found");
+    return;
+  }
+
+  const email =
+    attachment.getDataAsJson<AnonCredsProof>()?.requested_proof.revealed_attrs[
+      "email"
+    ].raw;
+
+  if (!config?.agentSVDXWebHook) {
+    console.log("Agent SVDX web hook not set");
+    return;
+  }
+
+  try {
+    await axios.post(
+      config?.agentSVDXWebHook,
+      {
+        email,
+        connectionId: ev.payload.proofRecord.connectionId,
+      },
+      {
+        auth: {
+          username: config?.agentSVDXBasicUser,
+          password: config?.agentSVDXBasicPass,
+        },
+      },
+    );
+  } catch (e) {
+    console.log(JSON.stringify(e, null, 2));
+  }
+};
+
+export const svdxConnectionStateChangeHandler = async (
+  ev: ConnectionStateChangedEvent,
+  agent: Agent,
+  config?: IConfAgent,
+) => {
+  if (
+    ev.payload.connectionRecord.role === DidExchangeRole.Responder &&
+    ev.payload.connectionRecord.state !== "completed"
+  ) {
+    return;
+  }
+
+  await agent.connections.addConnectionType(
+    ev.payload.connectionRecord.id,
+    ev.payload.connectionRecord.theirLabel || "svdx",
+  );
+
+  console.log("connection accepted", JSON.stringify(ev, null, 2));
+
+  const connections = await agent.connections.findAllByConnectionTypes([
+    ev.payload.connectionRecord.theirLabel || "svdx",
+  ]);
+
+  if (connections.length < 2) {
+    return;
+  }
+
+  connections.sort(
+    (a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime(),
+  );
+
+  while (connections.length > 1) {
+    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
+    const con = connections.pop()!;
+
+    console.log(`deleting ${con.id}`);
+    await agent.connections.deleteById(con.id);
+  }
+
+  try {
+    await agent.proofs.requestProof({
+      protocolVersion: "v2",
+      connectionId: connections[0].id,
+      proofFormats: {
+        anoncreds: {
+          name: "proof-request",
+          version: "1.0",
+          requested_attributes: {
+            email: {
+              name: "email",
+              restrictions: [
+                {
+                  schema_id: config?.agentSVDXSchemaId,
+                  cred_def_id: config?.agentSVDXCredDefId,
+                },
+              ],
+            },
+          },
+        },
+      },
+    });
+  } catch (e) {
+    console.log(JSON.stringify(e, null, 2));
+    console.log("failed to issue credential");
+  }
+};
diff --git a/libs/askar/src/askar-rest/askar.rest.module.ts b/libs/askar/src/askar-rest/askar.rest.module.ts
index 7390822ad25c59d12e428ba08264ddc9bd9cee82..6aff9fe7d2977452b6a685ddcba21a21537042e1 100644
--- a/libs/askar/src/askar-rest/askar.rest.module.ts
+++ b/libs/askar/src/askar-rest/askar.rest.module.ts
@@ -1,12 +1,20 @@
-import { Module, ValidationPipe } from "@nestjs/common";
+import {
+  Module,
+  ValidationPipe,
+  MiddlewareConsumer,
+  RequestMethod,
+} from "@nestjs/common";
 import { AgentService } from "../askar/agent.service";
-import { ConfigModule } from "@nestjs/config";
+import { ConfigModule, ConfigService } from "@nestjs/config";
 import { LedgersModule } from "@ocm-engine/ledgers";
 import { APP_PIPE } from "@nestjs/core";
 import { RestController } from "./rest.controller";
+import { PassportModule } from "@nestjs/passport";
+import { BasicAuthMiddleware } from "./auth/basic.middleware";
+import { IConfAgent } from "@ocm-engine/config";
 
 @Module({
-  imports: [ConfigModule, LedgersModule],
+  imports: [ConfigModule, LedgersModule, PassportModule],
   providers: [
     AgentService,
     {
@@ -18,4 +26,17 @@ import { RestController } from "./rest.controller";
   ],
   controllers: [RestController],
 })
-export class AskarRestModule {}
+export class AskarRestModule {
+  constructor(private readonly configService: ConfigService) {}
+
+  configure(consumer: MiddlewareConsumer) {
+    const config: IConfAgent | undefined =
+      this.configService.get<IConfAgent>("agent");
+
+    if (config?.agentIsSVDX) {
+      consumer
+        .apply(BasicAuthMiddleware)
+        .forRoutes({ path: "*messages", method: RequestMethod.ALL });
+    }
+  }
+}
diff --git a/libs/askar/src/askar-rest/auth/basic.guard.ts b/libs/askar/src/askar-rest/auth/basic.guard.ts
new file mode 100644
index 0000000000000000000000000000000000000000..354ea9ed785a36ed534e5536493034a23a7099f0
--- /dev/null
+++ b/libs/askar/src/askar-rest/auth/basic.guard.ts
@@ -0,0 +1,9 @@
+import { Injectable } from "@nestjs/common";
+import { AuthGuard } from "@nestjs/passport";
+
+/**
+ * Basic guard is NOT currently used, it is left for the  time when we implement jwt auth for the rest of the routes
+ */
+
+@Injectable()
+export class BasicGuard extends AuthGuard("basic") {}
diff --git a/libs/askar/src/askar-rest/auth/basic.middleware.ts b/libs/askar/src/askar-rest/auth/basic.middleware.ts
new file mode 100644
index 0000000000000000000000000000000000000000..25099e3a334f4c8448379ac88ed7673d3a1cb158
--- /dev/null
+++ b/libs/askar/src/askar-rest/auth/basic.middleware.ts
@@ -0,0 +1,48 @@
+import {
+  Injectable,
+  Logger,
+  NestMiddleware,
+  UnauthorizedException,
+} from "@nestjs/common";
+import { Request, Response, NextFunction } from "express";
+import { ConfigService } from "@nestjs/config";
+import { IConfAgent } from "@ocm-engine/config";
+
+@Injectable()
+export class BasicAuthMiddleware implements NestMiddleware {
+  private readonly logger: Logger = new Logger(BasicAuthMiddleware.name);
+
+  constructor(private readonly configService: ConfigService) {}
+
+  use(req: Request, res: Response, next: NextFunction) {
+    const config: IConfAgent | undefined =
+      this.configService.get<IConfAgent>("agent");
+
+    if (!config?.agentIsSVDX) {
+      this.logger.log("Agent is REST only turning of basic auth");
+
+      return next();
+    }
+
+    this.logger.log("Agent is SVDX turning basic auth middleware on");
+
+    const authHeader = req.headers["authorization"];
+
+    if (!authHeader) {
+      return next(new UnauthorizedException());
+    }
+
+    const [username, password] = Buffer.from(authHeader.split(" ")[1], "base64")
+      .toString()
+      .split(":");
+
+    if (
+      username === config.agentSVDXBasicUser &&
+      password === config.agentSVDXBasicPass
+    ) {
+      return next();
+    }
+
+    return next(new UnauthorizedException());
+  }
+}
diff --git a/libs/askar/src/askar-rest/auth/basic.strategy.ts b/libs/askar/src/askar-rest/auth/basic.strategy.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f454f0af8b0af6da4e6f71d3b7cb3319b22e4b1b
--- /dev/null
+++ b/libs/askar/src/askar-rest/auth/basic.strategy.ts
@@ -0,0 +1,30 @@
+import { ConfigService } from "@nestjs/config";
+import { IConfAgent } from "@ocm-engine/config";
+import { BasicStrategy as Strategy } from "passport-http";
+import { PassportStrategy } from "@nestjs/passport";
+import { Injectable, UnauthorizedException } from "@nestjs/common";
+
+/**
+ * Basic strategy is NOT currently used, it is left for the  time when we implement jwt auth for the rest of the routes
+ */
+@Injectable()
+export class BasicStrategy extends PassportStrategy(Strategy, "basic") {
+  constructor(private readonly configService: ConfigService) {
+    super();
+  }
+
+  async validate(username: string, password: string): Promise<boolean> {
+    console.log(username, password);
+    const config: IConfAgent | undefined =
+      this.configService.get<IConfAgent>("agent");
+
+    if (
+      config?.agentSVDXBasicUser === username &&
+      config?.agentSVDXBasicPass === password
+    ) {
+      return true;
+    }
+
+    throw new UnauthorizedException();
+  }
+}
diff --git a/libs/askar/src/askar-rest/rest.controller.ts b/libs/askar/src/askar-rest/rest.controller.ts
index e0d3b06e1e4e5c302dc973c559b3fcbb6e1d99d7..53c82aa8e4766e73ed88f97bd58377d6f4800d24 100644
--- a/libs/askar/src/askar-rest/rest.controller.ts
+++ b/libs/askar/src/askar-rest/rest.controller.ts
@@ -1,4 +1,5 @@
 import { Body, Controller, Get, Param, Post, UseFilters } from "@nestjs/common";
+
 import { AgentService } from "../askar/agent.service";
 import {
   CreateCredentialDefinitionRequsetDto,
@@ -87,7 +88,7 @@ export class RestController {
   }
 
   @Post("/messages")
-  sendMeesage(@Body() message: MakeBasicMessageRequestDto) {
+  async sendMeesage(@Body() message: MakeBasicMessageRequestDto) {
     return this.agentService.sendMessage(message);
   }
 }
diff --git a/libs/askar/src/askar/agent.event.listener.servce.ts b/libs/askar/src/askar/agent.event.listener.servce.ts
index 03eaf71d0507327cd89e83b680ae4cdfbcf21cf5..08c4fec6be11ee782da60f2ba85f6e9dea9a0666 100644
--- a/libs/askar/src/askar/agent.event.listener.servce.ts
+++ b/libs/askar/src/askar/agent.event.listener.servce.ts
@@ -5,6 +5,10 @@ import {
   BasicMessageEventTypes,
   BasicMessageRole,
   BasicMessageStateChangedEvent,
+  ConnectionEventTypes,
+  ConnectionStateChangedEvent,
+  ProofEventTypes,
+  ProofStateChangedEvent,
 } from "@aries-framework/core";
 import {
   MakeBasicMessageResponseDto,
@@ -13,10 +17,14 @@ import {
 } from "@ocm-engine/dtos";
 import { IConfAgent } from "@ocm-engine/config";
 import { ConfigService } from "@nestjs/config";
+import {
+  svdxConnectionStateChangeHandler,
+  svdxProofStateChangeHandler,
+} from "../agent.utils";
 
 @Injectable()
 export class AgentEventListenerServce implements OnModuleInit {
-  private agentConfig: IConfAgent;
+  private agentConfig: IConfAgent | undefined;
   private readonly logger: Logger = new Logger(AgentEventListenerServce.name);
 
   constructor(
@@ -27,8 +35,36 @@ export class AgentEventListenerServce implements OnModuleInit {
 
   onModuleInit(): void {
     this.logger.debug("Agent is listening for AFJ events");
-    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-    this.agentConfig = this.configService.get<IConfAgent>("agent")!;
+    this.agentConfig = this.configService.get<IConfAgent>("agent");
+
+    if (this.agentConfig?.agentIsSVDX && this.agentConfig?.agentIsRest) {
+      this.askar.agent.events.on(
+        ConnectionEventTypes.ConnectionStateChanged,
+        async (ev: ConnectionStateChangedEvent) => {
+          this.logger.log("connection state event received");
+          this.logger.debug(JSON.stringify(ev, null, 2));
+          return svdxConnectionStateChangeHandler(
+            ev,
+            this.askar.agent,
+            this.agentConfig,
+          );
+        },
+      );
+
+      this.askar.agent.events.on(
+        ProofEventTypes.ProofStateChanged,
+        async (ev: ProofStateChangedEvent) => {
+          this.logger.log("proof state event received");
+          this.logger.debug(JSON.stringify(ev, null, 2));
+
+          return svdxProofStateChangeHandler(
+            ev,
+            this.askar.agent,
+            this.agentConfig,
+          );
+        },
+      );
+    }
 
     this.askar.agent.events.on(
       BasicMessageEventTypes.BasicMessageStateChanged,
@@ -46,7 +82,7 @@ export class AgentEventListenerServce implements OnModuleInit {
           dto.connectionId = ev.payload.basicMessageRecord.connectionId;
           dto.from = connectionInfo?.theirLabel;
 
-          if (this.agentConfig.agentIsRest) {
+          if (this.agentConfig?.agentIsRest) {
             this.logger.debug(
               "agent is configured as rest, webhook still not implemented",
             );
diff --git a/libs/config/src/config/agent.config.ts b/libs/config/src/config/agent.config.ts
index 98e02af930dcaa8bec69d5b7c4b2b14486ca9094..c7fced916bc3e844873b808c453f09678b64f5ef 100644
--- a/libs/config/src/config/agent.config.ts
+++ b/libs/config/src/config/agent.config.ts
@@ -18,5 +18,11 @@ export const agentConfig = registerAs(
     agentConsumerMaxMessagess: parseInt(process.env["AGENT_MAX_MESSAGES"]!),
     agentConsumerRateLimit: parseInt(process.env["AGENT_RETE_LIMIT"]!),
     agentPort: parseInt(process.env["AGENT_PORT"]!),
+    agentIsSVDX: process.env["AGENT_IS_SVDX"] === "true",
+    agentSVDXSchemaId: process.env["AGENT_SVDX_SCHEMA_ID"]!,
+    agentSVDXCredDefId: process.env["AGENT_SVDX_CRED_DEF_ID"]!,
+    agentSVDXWebHook: process.env["AGENT_SVDX_WEBHOOK_URL"]!,
+    agentSVDXBasicUser: process.env["AGENT_SVDX_BASIC_USER"]!,
+    agentSVDXBasicPass: process.env["AGENT_SVDX_BASIC_PASS"]!,
   }),
 );
diff --git a/libs/config/src/interfaces/agent.config.interface.ts b/libs/config/src/interfaces/agent.config.interface.ts
index 1f0e7a85caa94710dd23ede1d6ff0d5042870a86..317b645a88d15a6b1eac322618bb706fabc12565 100644
--- a/libs/config/src/interfaces/agent.config.interface.ts
+++ b/libs/config/src/interfaces/agent.config.interface.ts
@@ -12,4 +12,11 @@ export interface IConfAgent {
   agentConsumerMaxMessagess: number;
   agentConsumerRateLimit: number;
   agentPort: number;
+
+  agentIsSVDX: boolean;
+  agentSVDXSchemaId: string;
+  agentSVDXCredDefId: string;
+  agentSVDXWebHook: string;
+  agentSVDXBasicUser: string;
+  agentSVDXBasicPass: string;
 }
diff --git a/libs/config/src/schemas/agent.schema.ts b/libs/config/src/schemas/agent.schema.ts
index 9cf569159b843b261c55387a444a11a52c39d2e6..46b36990cd6060f206dfcba92df03df3b4e6c8df 100644
--- a/libs/config/src/schemas/agent.schema.ts
+++ b/libs/config/src/schemas/agent.schema.ts
@@ -9,8 +9,12 @@ export const agentSchema = Joi.object({
   AGENT_DB_USER: Joi.string().required(),
   AGENT_DB_PASS: Joi.string().required(),
   AGENT_CONSUMER_NAME: Joi.string(),
-  AGENT_IS_REST: Joi.string().required(),
+  AGENT_IS_REST: Joi.string().optional(),
   AGENT_MAX_MESSAGES: Joi.string().required(),
   AGENT_RETE_LIMIT: Joi.string().required(),
   AGENT_PORT: Joi.string().required(),
+  AGENT_IS_SVDX: Joi.string().optional(),
+  AGENT_SVDX_SCHEMA_ID: Joi.string().optional(),
+  AGENT_SVDX_CRED_DEF_ID: Joi.string().optional(),
+  AGENT_SVDX_WEBHOOK_URL: Joi.string().optional(),
 });
diff --git a/package.json b/package.json
index 3443e6970e52e3487e33e157972825a37f297ccb..1e94baaca7f1934074d4d47753c7ec0922c192b2 100644
--- a/package.json
+++ b/package.json
@@ -41,6 +41,7 @@
     "@nestjs/config": "^2.3.1",
     "@nestjs/core": "^9.0.0",
     "@nestjs/microservices": "^9.4.2",
+    "@nestjs/passport": "^10.0.1",
     "@nestjs/platform-express": "^9.0.0",
     "@nestjs/platform-ws": "^10.1.3",
     "@nestjs/websockets": "^9.4.2",
@@ -51,6 +52,9 @@
     "cloudevents": "^7.0.0",
     "joi": "^17.9.2",
     "nats": "^2.14.0",
+    "passport": "^0.6.0",
+    "passport-http": "^0.3.0",
+    "passport-local": "^1.0.0",
     "reflect-metadata": "^0.1.13",
     "rxjs": "^7.0.0",
     "tslib": "^2.3.0",
@@ -83,6 +87,8 @@
     "@types/async-retry": "^1.4.5",
     "@types/jest": "^29.4.0",
     "@types/node": "~18.7.1",
+    "@types/passport-http": "^0.3.9",
+    "@types/passport-local": "^1.0.35",
     "@typescript-eslint/eslint-plugin": "^5.58.0",
     "@typescript-eslint/parser": "^5.58.0",
     "concurrently": "^8.2.0",
diff --git a/yarn.lock b/yarn.lock
index 9b857ac58a18edcb876f55ba20d6a865edc57975..2766f1095dc46380e23bf57b0170333df647dd1f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1676,6 +1676,11 @@
     iterare "1.2.1"
     tslib "2.5.3"
 
+"@nestjs/passport@^10.0.1":
+  version "10.0.1"
+  resolved "https://registry.yarnpkg.com/@nestjs/passport/-/passport-10.0.1.tgz#4a745cb4acf01ef8fd56b9ec1349ac74165b098f"
+  integrity sha512-hS22LeNj0LByS9toBPkpKyZhyKAXoHACLS1EQrjbAJJEQjhocOskVGwcMwvMlz+ohN+VU804/nMF1Zlya4+TiQ==
+
 "@nestjs/platform-express@^9.0.0":
   version "9.4.3"
   resolved "https://registry.yarnpkg.com/@nestjs/platform-express/-/platform-express-9.4.3.tgz#f61b75686bdfce566be3b54fa7bb20a4d87ed619"
@@ -2899,6 +2904,38 @@
   resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
   integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
 
+"@types/passport-http@^0.3.9":
+  version "0.3.9"
+  resolved "https://registry.yarnpkg.com/@types/passport-http/-/passport-http-0.3.9.tgz#268e483ade820d4f0edb3d35cec090d1990cc081"
+  integrity sha512-uQ4vyRdvM0jdWuKpLmi6Q6ri9Nwt8YnHmF7kE6snbthxPrsMWcjRCVc5WcPaQ356ODSZTDgiRYURMPIspCkn3Q==
+  dependencies:
+    "@types/express" "*"
+    "@types/passport" "*"
+
+"@types/passport-local@^1.0.35":
+  version "1.0.35"
+  resolved "https://registry.yarnpkg.com/@types/passport-local/-/passport-local-1.0.35.tgz#233d370431b3f93bb43cf59154fb7519314156d9"
+  integrity sha512-K4eLTJ8R0yYW8TvCqkjB0pTKoqfUSdl5PfZdidTjV2ETV3604fQxtY6BHKjQWAx50WUS0lqzBvKv3LoI1ZBPeA==
+  dependencies:
+    "@types/express" "*"
+    "@types/passport" "*"
+    "@types/passport-strategy" "*"
+
+"@types/passport-strategy@*":
+  version "0.2.35"
+  resolved "https://registry.yarnpkg.com/@types/passport-strategy/-/passport-strategy-0.2.35.tgz#e52f5212279ea73f02d9b06af67efe9cefce2d0c"
+  integrity sha512-o5D19Jy2XPFoX2rKApykY15et3Apgax00RRLf0RUotPDUsYrQa7x4howLYr9El2mlUApHmCMv5CZ1IXqKFQ2+g==
+  dependencies:
+    "@types/express" "*"
+    "@types/passport" "*"
+
+"@types/passport@*":
+  version "1.0.12"
+  resolved "https://registry.yarnpkg.com/@types/passport/-/passport-1.0.12.tgz#7dc8ab96a5e895ec13688d9e3a96920a7f42e73e"
+  integrity sha512-QFdJ2TiAEoXfEQSNDISJR1Tm51I78CymqcBa8imbjo6dNNu+l2huDxxbDEIoFIwOSKMkOfHEikyDuZ38WwWsmw==
+  dependencies:
+    "@types/express" "*"
+
 "@types/qs@*":
   version "6.9.7"
   resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb"
@@ -8901,6 +8938,34 @@ parseurl@~1.3.2, parseurl@~1.3.3:
   resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
   integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
 
+passport-http@^0.3.0:
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/passport-http/-/passport-http-0.3.0.tgz#8ee53d4380be9c60df2151925029826f77115603"
+  integrity sha512-OwK9DkqGVlJfO8oD0Bz1VDIo+ijD3c1ZbGGozIZw+joIP0U60pXY7goB+8wiDWtNqHpkTaQiJ9Ux1jE3Ykmpuw==
+  dependencies:
+    passport-strategy "1.x.x"
+
+passport-local@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/passport-local/-/passport-local-1.0.0.tgz#1fe63268c92e75606626437e3b906662c15ba6ee"
+  integrity sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==
+  dependencies:
+    passport-strategy "1.x.x"
+
+passport-strategy@1.x.x:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4"
+  integrity sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==
+
+passport@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/passport/-/passport-0.6.0.tgz#e869579fab465b5c0b291e841e6cc95c005fac9d"
+  integrity sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==
+  dependencies:
+    passport-strategy "1.x.x"
+    pause "0.0.1"
+    utils-merge "^1.0.1"
+
 path-exists@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
@@ -8966,6 +9031,11 @@ path-type@^4.0.0:
   resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
   integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
 
+pause@0.0.1:
+  version "0.0.1"
+  resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d"
+  integrity sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==
+
 picocolors@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
@@ -11063,7 +11133,7 @@ util@^0.12.4:
     is-typed-array "^1.1.3"
     which-typed-array "^1.1.2"
 
-utils-merge@1.0.1:
+utils-merge@1.0.1, utils-merge@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
   integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==