diff --git a/apps/agent/deployment/Dockerfile b/apps/agent/deployment/Dockerfile
index 30cfa8470ed5f5701a3afa0eeb5cb79eb2b3e174..63745abbd85d9e6fe8adc0cc2fcbc0775694527c 100644
--- a/apps/agent/deployment/Dockerfile
+++ b/apps/agent/deployment/Dockerfile
@@ -12,5 +12,6 @@ RUN yarn install
 
 EXPOSE 8080
 EXPOSE 8001
+EXPOSE 6001
 
 CMD ["node", "main.js"]
diff --git a/apps/attestation-manager/src/app/app.controller.ts b/apps/attestation-manager/src/app/app.controller.ts
index 667407051f8d6570e9a874631f3122a79660b0a2..84bdeef588003c1b19530a0db877903b98d7e56f 100644
--- a/apps/attestation-manager/src/app/app.controller.ts
+++ b/apps/attestation-manager/src/app/app.controller.ts
@@ -2,12 +2,14 @@ import { Body, Controller, Logger } from "@nestjs/common";
 
 import { MessagePattern, RpcException } from "@nestjs/microservices";
 import {
+  BasicMessageEvent,
   CloudEventDto,
   CreateCredentialDefinitionRequsetDto,
   CreateSchemaRequestDto,
   CredentialEvent,
   GatewayAcceptedResponseDto,
   IssueCredentialRequestDto,
+  MakeBasicMessageRequestDto,
   makeEvent,
   SchemaEvent,
 } from "@ocm-engine/dtos";
@@ -27,7 +29,7 @@ export class AppController {
       type: SchemaEvent;
       source: string;
     },
-  ): Promise<{ id: string }> {
+  ): Promise<GatewayAcceptedResponseDto> {
     this.logger.debug(JSON.stringify(payload, null, 2));
 
     try {
@@ -63,7 +65,40 @@ export class AppController {
       type: CredentialEvent;
       source: string;
     },
-  ): Promise<{ id: string }> {
+  ): Promise<GatewayAcceptedResponseDto> {
+    this.logger.debug(JSON.stringify(payload, null, 2));
+
+    try {
+      const event = makeEvent(payload);
+      this.logger.debug(JSON.stringify(event, null, 2));
+      await this.producerService.publish<typeof payload.data>(
+        payload.type,
+        event as CloudEventDto<typeof payload.data>,
+      );
+
+      const response = new GatewayAcceptedResponseDto();
+      response.id = event.id;
+
+      return response;
+    } catch (e) {
+      this.logger.debug(JSON.stringify(e, null, 2));
+      if (e instanceof Error) {
+        throw new RpcException(e.message);
+      }
+
+      throw new RpcException("Internal server error");
+    }
+  }
+
+  @MessagePattern("messages")
+  async sendMeesage(
+    @Body()
+    payload: {
+      data: MakeBasicMessageRequestDto;
+      type: BasicMessageEvent;
+      source: string;
+    },
+  ): Promise<GatewayAcceptedResponseDto> {
     this.logger.debug(JSON.stringify(payload, null, 2));
 
     try {
diff --git a/apps/connection-manager/src/app/app.controller.ts b/apps/connection-manager/src/app/app.controller.ts
index 8001d35a53d9570173cb7ea75b0d24fe399b421c..a8c5c05cc61c66aae8fce0bf9e1c86cdbe4a3e8b 100644
--- a/apps/connection-manager/src/app/app.controller.ts
+++ b/apps/connection-manager/src/app/app.controller.ts
@@ -25,7 +25,7 @@ export class AppController {
       type: ConnectionEvent;
       source: string;
     },
-  ): Promise<{ id: string }> {
+  ): Promise<GatewayAcceptedResponseDto> {
     this.logger.debug(JSON.stringify(payload, null, 2));
 
     try {
diff --git a/apps/gateway/src/app/managers/attestation.controller.ts b/apps/gateway/src/app/managers/attestation.controller.ts
index c1e290fb6dc510e1d635beebe54970485f2062cc..707c2ae23009b1820f1d8db7e45efda0433f6fca 100644
--- a/apps/gateway/src/app/managers/attestation.controller.ts
+++ b/apps/gateway/src/app/managers/attestation.controller.ts
@@ -21,6 +21,8 @@ import {
   GatewayAcceptedResponseDto,
   GetSchemaRequestDto,
   IssueCredentialRequestDto,
+  MakeBasicMessageRequestDto,
+  MESSAGE_MAKE,
   SCHEMA_CREATE,
   SCHEMA_GET,
   SCHEMA_LIST,
@@ -312,4 +314,38 @@ export class AttestationController {
       },
     });
   }
+
+  @Post("/messages")
+  @ApiResponse({
+    status: 200,
+    description:
+      "Request is accepted for execution, the response id will match the event id received from the web socket",
+    type: GatewayAcceptedResponseDto,
+  })
+  @ApiBadRequestResponse({
+    status: 400,
+    description:
+      "Error in sending data to attestation manager. This error shows that attestation manager could not convert request to event or attestation manager could not send the event to the broker.",
+    type: BadRequestException,
+  })
+  @ApiInternalServerErrorResponse({
+    status: 500,
+    description: "Unknown error",
+  })
+  @ApiOperation({
+    summary: "Send basic message",
+    description:
+      "Method will send basic message to a connection. The id of the response will be matched when you receive event from the websocket",
+    tags: ["Credentials Offers"],
+  })
+  sendMeesage(@Body() message: MakeBasicMessageRequestDto) {
+    return this.amClient.sendPayload({
+      pattern: "messages",
+      payload: {
+        source: "messages",
+        data: message,
+        type: MESSAGE_MAKE,
+      },
+    });
+  }
 }
diff --git a/compose/docker-compose.simple.yml b/compose/docker-compose.simple.yml
new file mode 100644
index 0000000000000000000000000000000000000000..0d8d9ad9557fbabc3efc2789d571667cdaf0b2ac
--- /dev/null
+++ b/compose/docker-compose.simple.yml
@@ -0,0 +1,40 @@
+version: '3.8'
+
+services:
+  pg_db:
+    image: 'postgres:latest'
+    ports:
+      - '5432:5432'
+    environment:
+      POSTGRES_USER: postgres
+      POSTGRES_PASSWORD: postgres
+    volumes:
+      - ./data/db-simple/:/var/lib/postgresql/data/
+
+  agent-issuer-simple:
+    container_name: agent-issuer-simple
+    build:
+      context: "../"
+      dockerfile: "./apps/agent/deployment/Dockerfile"
+    env_file:
+      - ./env/issuer.simple.env
+    ports:
+      - "8080:8080"
+      - "8001:8001"
+    depends_on:
+      pg_db:
+        condition: service_started
+
+  agent-holder-simple:
+    container_name: agent-holder-simple
+    build:
+      context: "../"
+      dockerfile: "./apps/agent/deployment/Dockerfile"
+    env_file:
+      - ./env/holder.simple.env
+    ports:
+      - "8081:8080"
+      - "6001:6001"
+    depends_on:
+      pg_db:
+        condition: service_started
diff --git a/compose/env/holder.simple.env b/compose/env/holder.simple.env
new file mode 100644
index 0000000000000000000000000000000000000000..0db552de3ba9ba0e25e9e1a91c837aca8f4bc28e
--- /dev/null
+++ b/compose/env/holder.simple.env
@@ -0,0 +1,34 @@
+LEDGERS="BCOVRIN_TEST"
+IDUNION_KEY=
+
+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_DB_HOST=pg_db:5432
+AGENT_DB_USER=postgres
+AGENT_DB_PASS=postgres
+AGENT_PORT=8081
+AGENT_CONSUMER_NAME=agent_1
+AGENT_IS_REST=true
+AGENT_MAX_MESSAGES=10
+AGENT_RETE_LIMIT=5
+
+NATS_SERVERS=broker-holder:4222
+NATS_STREAM_NAME=ssi_holder_stream
+NATS_SUBJECTS="connections.*,proofs.*,credentials.*,schemas.*"
+
+GATEWAY_HTTP_PORT=8081
+GATEWAY_TCP_PORT=8881
+GATEWAY_SOCKET_EVENT_NAME=message
+GATEWAY_MESSAGE_PATTERN=webhook
+GATEWAY_HOST=gateway-holder
+
+CONNECTION_SERVICE_TCP_PORT=8882
+CONNECTION_SERVICE_HOST=cm-holder
+
+ATTESTATION_SERVICE_TCP_PORT=8883
+ATTESTATION_SERVICE_HOST=ap-holder
+
+PROOF_SERVICE_TCP_PORT=8884
+PROOF_SERVICE_HOST=pm-holder
diff --git a/compose/env/issuer.simple.env b/compose/env/issuer.simple.env
new file mode 100644
index 0000000000000000000000000000000000000000..22c8de61a9796eadeda934873ca3a3f88f25a67d
--- /dev/null
+++ b/compose/env/issuer.simple.env
@@ -0,0 +1,34 @@
+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
+AGENT_DB_HOST=pg_db:5432
+AGENT_DB_USER=postgres
+AGENT_DB_PASS=postgres
+AGENT_PORT=8081
+AGENT_CONSUMER_NAME=agent_1
+AGENT_IS_REST=true
+AGENT_MAX_MESSAGES=10
+AGENT_RETE_LIMIT=5
+
+NATS_SERVERS=broker-issuer:4222
+NATS_STREAM_NAME=ssi_issuer_stream
+NATS_SUBJECTS="connections.*,proofs.*,credentials.*,schemas.*"
+
+GATEWAY_HTTP_PORT=8081
+GATEWAY_TCP_PORT=8881
+GATEWAY_SOCKET_EVENT_NAME=message
+GATEWAY_MESSAGE_PATTERN=webhook
+GATEWAY_HOST=gateway-issuer
+
+CONNECTION_SERVICE_TCP_PORT=8882
+CONNECTION_SERVICE_HOST=cm-issuer
+
+ATTESTATION_SERVICE_TCP_PORT=8883
+ATTESTATION_SERVICE_HOST=ap-issuer
+
+PROOF_SERVICE_TCP_PORT=8884
+PROOF_SERVICE_HOST=pm-issuer
diff --git a/libs/asker/src/asker-nats/agent.consumer.service.ts b/libs/asker/src/asker-nats/agent.consumer.service.ts
index ee23e0288b5071d52a79d0ebe7b356a522b82306..6833e8859fa74bfb4de53567cfa9582d0fcba25c 100644
--- a/libs/asker/src/asker-nats/agent.consumer.service.ts
+++ b/libs/asker/src/asker-nats/agent.consumer.service.ts
@@ -28,6 +28,8 @@ import {
   GetSchemaRequestDto,
   IssueCredentialRequestDto,
   IssueProofRequestDto,
+  MakeBasicMessageRequestDto,
+  MESSAGE_MAKE,
   PROOF_ACCEPT,
   PROOF_ISSUE,
   PROOF_LIST,
@@ -35,6 +37,7 @@ import {
   SCHEMA_GET,
   SCHEMA_LIST,
 } from "@ocm-engine/dtos";
+import asyncRetry from "async-retry";
 
 @Injectable()
 export class AgentConsumerService implements OnModuleInit, OnModuleDestroy {
@@ -61,77 +64,98 @@ export class AgentConsumerService implements OnModuleInit, OnModuleDestroy {
       let data;
       let dto;
 
-      switch (event.type) {
-        case CONNECTION_CREATE:
-          data = await this.agentService.createInvitation();
-          break;
-        case CONNECTION_ACCEPT:
-          dto = event.data as CreateInvitationResponseDto;
-          data = await this.agentService.acceptInvitation(dto.invitationUrl);
-          break;
-
-        case CONNECTION_LIST:
-          data = await this.agentService.fetchConnections();
-          break;
-
-        case CONNECTION_GET:
-          dto = event.data as GetConnectionRequestDto;
-          data = await this.agentService.getConnectionById(dto.connectionId);
-          break;
-
-        case SCHEMA_CREATE:
-          dto = event.data as CreateSchemaRequestDto;
-          data = await this.agentService.createSchema(dto);
-          break;
-        case SCHEMA_LIST:
-          data = await this.agentService.fetchSchemas();
-          break;
-
-        case SCHEMA_GET:
-          dto = event.data as GetSchemaRequestDto;
-          data = await this.agentService.getSchemaById(dto.schemaId);
-          break;
-        case CRED_DEF_CREATE:
-          data = await this.agentService.createCredentialDefinition(
-            event.data as CreateCredentialDefinitionRequsetDto,
-          );
-          break;
-
-        case CRED_ISSUE:
-          data = await this.agentService.issueCredential(
-            event.data as IssueCredentialRequestDto,
-          );
-          break;
-
-        case CRED_LIST:
-          data = await this.agentService.credentials();
-          break;
-
-        case CRED_OFFER_LIST:
-          data = await this.agentService.credentialByStatedOfferReceived();
-          break;
-
-        case CRED_OFFER_ACCEPT:
-          dto = event.data as AcceptCredentialOfferRequestDto;
-          data = await this.agentService.acceptCredential(
-            dto.credentialRecordId,
-          );
-          break;
-
-        case PROOF_ISSUE:
-          dto = event.data as IssueProofRequestDto;
-          data = await this.agentService.issueProof(dto);
-          break;
-
-        case PROOF_LIST:
-          data = await this.agentService.proofs();
-          break;
-
-        case PROOF_ACCEPT:
-          dto = event.data as AcceptProofRequestDto;
-          data = await this.agentService.acceptProof(dto.proofRecordId);
-          break;
-      }
+      await asyncRetry(
+        async () => {
+          switch (event.type) {
+            case CONNECTION_CREATE:
+              data = await this.agentService.createInvitation();
+              break;
+            case CONNECTION_ACCEPT:
+              dto = event.data as CreateInvitationResponseDto;
+              data = await this.agentService.acceptInvitation(
+                dto.invitationUrl,
+              );
+              break;
+
+            case CONNECTION_LIST:
+              data = await this.agentService.fetchConnections();
+              break;
+
+            case CONNECTION_GET:
+              dto = event.data as GetConnectionRequestDto;
+              data = await this.agentService.getConnectionById(
+                dto.connectionId,
+              );
+              break;
+
+            case SCHEMA_CREATE:
+              dto = event.data as CreateSchemaRequestDto;
+              data = await this.agentService.createSchema(dto);
+              break;
+            case SCHEMA_LIST:
+              data = await this.agentService.fetchSchemas();
+              break;
+
+            case SCHEMA_GET:
+              dto = event.data as GetSchemaRequestDto;
+              data = await this.agentService.getSchemaById(dto.schemaId);
+              break;
+            case CRED_DEF_CREATE:
+              data = await this.agentService.createCredentialDefinition(
+                event.data as CreateCredentialDefinitionRequsetDto,
+              );
+              break;
+
+            case CRED_ISSUE:
+              data = await this.agentService.issueCredential(
+                event.data as IssueCredentialRequestDto,
+              );
+              break;
+
+            case CRED_LIST:
+              data = await this.agentService.credentials();
+              break;
+
+            case CRED_OFFER_LIST:
+              data = await this.agentService.credentialByStatedOfferReceived();
+              break;
+
+            case CRED_OFFER_ACCEPT:
+              dto = event.data as AcceptCredentialOfferRequestDto;
+              data = await this.agentService.acceptCredential(
+                dto.credentialRecordId,
+              );
+              break;
+
+            case PROOF_ISSUE:
+              dto = event.data as IssueProofRequestDto;
+              data = await this.agentService.issueProof(dto);
+              break;
+
+            case PROOF_LIST:
+              data = await this.agentService.proofs();
+              break;
+
+            case PROOF_ACCEPT:
+              dto = event.data as AcceptProofRequestDto;
+              data = await this.agentService.acceptProof(dto.proofRecordId);
+              break;
+
+            case MESSAGE_MAKE:
+              dto = event.data as MakeBasicMessageRequestDto;
+              data = await this.agentService.sendMessage(dto);
+              break;
+          }
+        },
+        {
+          retries: 5,
+          maxTimeout: 5000,
+          onRetry: (error) => {
+            this.logger.log(JSON.stringify(error, null, 2));
+            this.logger.error(`Fail...${error.message}`);
+          },
+        },
+      );
 
       event.data = data;
       this.logger.debug(`before sending ${JSON.stringify(event, null, 2)}`);
diff --git a/libs/asker/src/asker-rest/rest.controller.ts b/libs/asker/src/asker-rest/rest.controller.ts
index b47f29b36a72a84dbbae62c2871d5df98e107c7e..f4b3aafbf14d5b1c76e4d6d97220b7ac2e6d7e6d 100644
--- a/libs/asker/src/asker-rest/rest.controller.ts
+++ b/libs/asker/src/asker-rest/rest.controller.ts
@@ -6,11 +6,12 @@ import {
   IssueCredentialRequestDto,
   IssueProofRequestDto,
   CreateSchemaRequestDto,
+  MakeBasicMessageRequestDto,
 } from "@ocm-engine/dtos";
 import { AllExceptionsHandler } from "./exception.handler";
 
 @UseFilters(AllExceptionsHandler)
-@Controller()
+@Controller("v1")
 export class RestController {
   constructor(private readonly agentService: AgentService) {}
 
@@ -84,4 +85,9 @@ export class RestController {
   resolve(@Body("did") did: string) {
     return this.agentService.resolve(did);
   }
+
+  @Post("/messages")
+  sendMeesage(@Body() message: MakeBasicMessageRequestDto) {
+    return this.agentService.sendMessage(message);
+  }
 }
diff --git a/libs/asker/src/asker/agent.event.listener.servce.ts b/libs/asker/src/asker/agent.event.listener.servce.ts
new file mode 100644
index 0000000000000000000000000000000000000000..8b9a0f56b1d3a4d4db4236f92415f1743ca8c440
--- /dev/null
+++ b/libs/asker/src/asker/agent.event.listener.servce.ts
@@ -0,0 +1,63 @@
+import { Injectable, Logger, OnModuleInit } from "@nestjs/common";
+import { GatewayClient } from "@ocm-engine/clients";
+import { AskerService } from "./asker.service";
+import {
+  BasicMessageEventTypes,
+  BasicMessageRole,
+  BasicMessageStateChangedEvent,
+} from "@aries-framework/core";
+import {
+  MakeBasicMessageResponseDto,
+  makeEvent,
+  MESSAGE_MAKE,
+} from "@ocm-engine/dtos";
+import { IConfAgent } from "@ocm-engine/config";
+import { ConfigService } from "@nestjs/config";
+
+@Injectable()
+export class AgentEventListenerServce implements OnModuleInit {
+  private agentConfig: IConfAgent;
+  private readonly logger: Logger = new Logger(AgentEventListenerServce.name);
+
+  constructor(
+    private readonly gatewayClient: GatewayClient,
+    private readonly asker: AskerService,
+    private readonly configService: ConfigService,
+  ) {}
+
+  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.asker.agent.events.on(
+      BasicMessageEventTypes.BasicMessageStateChanged,
+      async (ev: BasicMessageStateChangedEvent) => {
+        if (ev.payload.basicMessageRecord.role === BasicMessageRole.Receiver) {
+          this.logger.debug(JSON.stringify(ev, null, 2));
+
+          const dto = new MakeBasicMessageResponseDto();
+          dto.message = ev.payload.basicMessageRecord.content;
+          dto.id = ev.payload.basicMessageRecord.id;
+
+          if (this.agentConfig.agentIsRest) {
+            this.logger.debug(
+              "agent is configured as rest, webhook still not implemented",
+            );
+
+            return;
+          }
+
+          const event = makeEvent({
+            data: dto,
+            type: MESSAGE_MAKE,
+            source: "agent-basic-message-afj",
+          });
+
+          this.logger.debug("Sending message event to gateway");
+          this.gatewayClient.sendPayload(event);
+        }
+      },
+    );
+  }
+}
diff --git a/libs/asker/src/asker/agent.service.ts b/libs/asker/src/asker/agent.service.ts
index d311a3eaeda17537995f89fa7a4c1e85470d1f52..0fdf814a67efdccd8e78c12bab2dff06ee966a44 100644
--- a/libs/asker/src/asker/agent.service.ts
+++ b/libs/asker/src/asker/agent.service.ts
@@ -13,6 +13,8 @@ import {
   IssueCredentialResponseDto,
   IssueProofRequestDto,
   IssueProofResponseDto,
+  MakeBasicMessageRequestDto,
+  MakeBasicMessageResponseDto,
   SchemaNotCreatedError,
 } from "@ocm-engine/dtos";
 import {
@@ -309,4 +311,18 @@ export class AgentService {
   resolve = async (did: string) => {
     return this.asker.agent.dids.resolve(did);
   };
+
+  sendMessage = async (message: MakeBasicMessageRequestDto) => {
+    const response = new MakeBasicMessageResponseDto();
+
+    const m = await this.asker.agent.basicMessages.sendMessage(
+      message.connectionId,
+      message.message,
+    );
+
+    response.id = m.id;
+    response.message = m.content;
+
+    return response;
+  };
 }
diff --git a/libs/asker/src/asker/asker.module.ts b/libs/asker/src/asker/asker.module.ts
index 254adfdf119805a6362d3da186cabb22ac1be811..90dea64021e9cd55b7559b30fc5c88113255667b 100644
--- a/libs/asker/src/asker/asker.module.ts
+++ b/libs/asker/src/asker/asker.module.ts
@@ -3,11 +3,12 @@ import { AskerService } from "./asker.service";
 import { AgentService } from "./agent.service";
 import { ConfigModule } from "@nestjs/config";
 import { LedgersModule } from "@ocm-engine/ledgers";
+import { AgentEventListenerServce } from "./agent.event.listener.servce";
 
 @Global()
 @Module({
   imports: [ConfigModule, LedgersModule],
-  providers: [AgentService, AskerService],
+  providers: [AgentService, AskerService, AgentEventListenerServce],
   exports: [AgentService, AskerService],
 })
 export class AskerModule {}
diff --git a/libs/asker/src/asker/asker.service.ts b/libs/asker/src/asker/asker.service.ts
index 6bf5e577778e22fffc70c406d8d9287769fb314d..b3a391c08c9b91c044d01b19f52bd3694ccc8be9 100644
--- a/libs/asker/src/asker/asker.service.ts
+++ b/libs/asker/src/asker/asker.service.ts
@@ -10,7 +10,6 @@ import {
   ConsoleLogger,
   HttpOutboundTransport,
   InitConfig,
-  KeyDerivationMethod,
   LogLevel,
   TypedArrayEncoder,
   WsOutboundTransport,
diff --git a/libs/clients/src/lib/gateway.client.ts b/libs/clients/src/lib/gateway.client.ts
index c32b0b768da442603a69f406412e6ad0a62b5a3e..c7e9564dbda419e2f7d78e09ee99c46cd5a95b46 100644
--- a/libs/clients/src/lib/gateway.client.ts
+++ b/libs/clients/src/lib/gateway.client.ts
@@ -16,7 +16,6 @@ export class GatewayClient {
 
   constructor(configService: ConfigService) {
     this.gatewayConf = configService.get<IGateway>("gateway")!;
-    console.log(this.gatewayConf);
 
     this.client = ClientProxyFactory.create({
       transport: Transport.TCP,
diff --git a/libs/dtos/src/dtos/requests/make.basic.message.request.dto.ts b/libs/dtos/src/dtos/requests/make.basic.message.request.dto.ts
new file mode 100644
index 0000000000000000000000000000000000000000..33f2130e4bc0f95692f6a04a6caa5b59ade6cdda
--- /dev/null
+++ b/libs/dtos/src/dtos/requests/make.basic.message.request.dto.ts
@@ -0,0 +1,11 @@
+import { IsNotEmpty, IsString } from "class-validator";
+
+export class MakeBasicMessageRequestDto {
+  @IsNotEmpty()
+  @IsString()
+  connectionId: string;
+
+  @IsNotEmpty()
+  @IsString()
+  message: string;
+}
diff --git a/libs/dtos/src/dtos/responses/make.basic.message.response.dto.ts b/libs/dtos/src/dtos/responses/make.basic.message.response.dto.ts
new file mode 100644
index 0000000000000000000000000000000000000000..684b4d311ace58a10ccedd9c0f7f4fd642eb76a4
--- /dev/null
+++ b/libs/dtos/src/dtos/responses/make.basic.message.response.dto.ts
@@ -0,0 +1,11 @@
+import { IsNotEmpty, IsString } from "class-validator";
+
+export class MakeBasicMessageResponseDto {
+  @IsNotEmpty()
+  @IsString()
+  id: string;
+
+  @IsNotEmpty()
+  @IsString()
+  message: string;
+}
diff --git a/libs/dtos/src/events/dtoToEventTransformer.ts b/libs/dtos/src/events/dtoToEventTransformer.ts
index 0bb08689e7c55f0f0aa6d399465145eaa4c02174..e0c2c3046824e89f9a7be5f29488aa6df45c56b0 100644
--- a/libs/dtos/src/events/dtoToEventTransformer.ts
+++ b/libs/dtos/src/events/dtoToEventTransformer.ts
@@ -1,5 +1,6 @@
 import {
   ALL_EVENTS,
+  BasicMessageEvent,
   ConnectionEvent,
   CredentialEvent,
   ProofEvent,
@@ -14,6 +15,8 @@ import { GetConnectionRequestDto } from "../dtos/requests/get.connection.request
 import { IssueCredentialRequestDto } from "../dtos/requests/issue.credential.request.dto";
 import { IssueProofRequestDto } from "../dtos/requests/issue.proof.request.dto";
 import { AcceptCredentialOfferRequestDto } from "../dtos/requests/accept.credential.offer.request.dto";
+import { MakeBasicMessageResponseDto } from "../dtos/responses/make.basic.message.response.dto";
+import { MakeBasicMessageRequestDto } from "../dtos/requests/make.basic.message.request.dto";
 
 export const makeEvent = (payload: {
   data:
@@ -25,8 +28,15 @@ export const makeEvent = (payload: {
     | CreateSchemaRequestDto
     | CreateSchemaRequestDto
     | CreateCredentialDefinitionRequsetDto
-    | IssueCredentialRequestDto;
-  type: SchemaEvent | CredentialEvent | ProofEvent | ConnectionEvent;
+    | IssueCredentialRequestDto
+    | MakeBasicMessageResponseDto
+    | MakeBasicMessageRequestDto;
+  type:
+    | SchemaEvent
+    | CredentialEvent
+    | ProofEvent
+    | ConnectionEvent
+    | BasicMessageEvent;
   source: string;
 }) => {
   if (ALL_EVENTS.includes(payload.type)) {
diff --git a/libs/dtos/src/events/types.ts b/libs/dtos/src/events/types.ts
index e4fc183d6890f20fc15ca9a293bd15d718f5a912..f19e1b6c62fdfb057e40f735a4e762454006e0b7 100644
--- a/libs/dtos/src/events/types.ts
+++ b/libs/dtos/src/events/types.ts
@@ -60,9 +60,15 @@ export const PROOF_EVENTS: ProofEvent[] = [
   PROOF_ISSUE,
 ];
 
+export type BasicMessageEvent = "messages.make";
+export const MESSAGE_MAKE = "messages.make";
+
+export const DIDCOMM_EVENTS: BasicMessageEvent[] = [MESSAGE_MAKE];
+
 export const ALL_EVENTS = [
   ...SCHEMA_EVENTS,
   ...CRED_EVENTS,
   ...PROOF_EVENTS,
   ...CONNECTION_EVENTS,
+  ...DIDCOMM_EVENTS,
 ];
diff --git a/libs/dtos/src/index.ts b/libs/dtos/src/index.ts
index 1cb5460a67fe1c16bcb98d09e905e4ea796e88ec..e699d9fee52649b12387d27ab349fd61feaf4a10 100644
--- a/libs/dtos/src/index.ts
+++ b/libs/dtos/src/index.ts
@@ -7,6 +7,7 @@ export * from "./dtos/requests/get.connection.request.dto";
 export * from "./dtos/requests/get.schema.request.dto";
 export * from "./dtos/requests/accept.credential.offer.request.dto";
 export * from "./dtos/requests/accept.proof.request.dto";
+export * from "./dtos/requests/make.basic.message.request.dto";
 
 export * from "./dtos/responses/create.invitation.response.dto";
 export * from "./dtos/responses/accept.invitation.response.dto";
@@ -15,6 +16,7 @@ export * from "./dtos/responses/create.credential.definition.response.dto";
 export * from "./dtos/responses/issue.credential.response.dto";
 export * from "./dtos/responses/issue.proof.response.dto";
 export * from "./dtos/responses/gateway.accepted.response.dto";
+export * from "./dtos/responses/make.basic.message.response.dto";
 
 export * from "./errors/connection.not.found.error";
 export * from "./errors/schema.not.created.error";
diff --git a/package.json b/package.json
index 92245c61c7c3a9034741acef77d3a47a4403c81d..ef466b42ebfe6d96a905c989fe66974dc77822eb 100644
--- a/package.json
+++ b/package.json
@@ -28,7 +28,9 @@
     "infra:issuer:stop": "cd compose && docker-compose --profile issuer stop",
     "infra:holder:stop": "cd compose && docker-compose --profile holder stop",
     "infra:local": "cd compose && docker-compose -f=docker-compose.infra.yml up -d",
-    "infra:local:stop": "cd compose && docker-compose -f=docker-compose.infra.yml stop"
+    "infra:local:stop": "cd compose && docker-compose -f=docker-compose.infra.yml stop",
+
+    "infra:simple": "cd compose && docker-compose -f docker-compose.simple.yml up -d"
   },
   "private": true,
   "dependencies": {