diff --git a/apps/ssi-abstraction/.swcrc b/apps/ssi-abstraction/.swcrc
new file mode 100644
index 0000000000000000000000000000000000000000..f0831e454c02bece75b8b8b60ac59891a48fe7f2
--- /dev/null
+++ b/apps/ssi-abstraction/.swcrc
@@ -0,0 +1,20 @@
+{
+  "jsc": {
+    "preserveAllComments": true,
+    "parser": {
+      "syntax": "typescript",
+      "tsx": false,
+      "decorators": true
+    },
+    "transform": {
+      "legacyDecorator": true,
+      "decoratorMetadata": true
+    },
+    "target": "es2022"
+  },
+  "module": {
+    "type": "es6"
+  },
+  "sourceMaps": true,
+  "exclude": [".spec.ts", ".e2e-spec.ts"]
+}
diff --git a/apps/ssi-abstraction/jest.config.js b/apps/ssi-abstraction/jest.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..1b2ee91fa88cada4d31ad3c2528291214de4aebe
--- /dev/null
+++ b/apps/ssi-abstraction/jest.config.js
@@ -0,0 +1,50 @@
+/** @type {import('jest').Config} */
+
+import { readFileSync } from 'node:fs';
+
+const swcConfig = JSON.parse(readFileSync('./.swcrc', 'utf8'));
+
+export default {
+  moduleFileExtensions: ['js', 'ts'],
+  testEnvironment: 'node',
+  transform: {
+    '^.+\\.ts$': [
+      '@swc/jest',
+      {
+        ...swcConfig,
+        sourceMaps: false,
+        exclude: [],
+        swcrc: false,
+      },
+    ],
+  },
+  extensionsToTreatAsEsm: ['.ts'],
+  moduleNameMapper: {
+    // ESM modules require `.js` extension to be specified, but Jest doesn't work with them
+    // Removing `.js` extension from module imports
+    '^uuid$': 'uuid',
+    '^(.*)/(.*)\\.js$': '$1/$2',
+  },
+  collectCoverageFrom: ['src/**/*.(t|j)s'],
+  coverageReporters:
+    process.env.CI === 'true'
+      ? ['text-summary', 'json-summary']
+      : ['text-summary', 'html'],
+  coveragePathIgnorePatterns: [
+    '<rootDir>/node_modules/',
+    '<rootDir>/test/',
+    '<rootDir>/coverage/',
+    '<rootDir>/dist/',
+    '<rootDir>/**/test',
+    '@types',
+    '.dto.(t|j)s',
+    '.enum.ts',
+    '.interface.ts',
+    '.type.ts',
+    '.spec.ts',
+  ],
+  coverageDirectory: './coverage',
+  // With v8 coverage provider it's much faster, but
+  // with this enabled it's not possible to ignore whole files' coverage
+  coverageProvider: 'v8',
+};
diff --git a/apps/ssi-abstraction/package.json b/apps/ssi-abstraction/package.json
index 87ab54b5f89abf73edadc864dbb50af7a9c70848..638c6d30a9bd92fbe966e91fbc45c765616b51af 100644
--- a/apps/ssi-abstraction/package.json
+++ b/apps/ssi-abstraction/package.json
@@ -4,20 +4,28 @@
   "description": "A core OCM service that provides the SSI interface through REST endpoints and events.",
   "author": "Vereign",
   "private": true,
+  "type": "module",
   "license": "Apache-2.0",
   "scripts": {
     "clean": "rm -r dist",
     "prebuild": "rimraf dist",
     "build": "nest build",
-    "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
+    "prisma:generate": "prisma generate --schema=./src/prisma/schema.prisma",
+    "prisma:migrate": "npx prisma migrate deploy --schema=./src/prisma/schema.prisma",
+    "dbSchema": "npx prisma db push --schema=./src/prisma/schema.prisma",
+    "prismaStudio": "npx prisma studio",
     "start": "nest start",
-    "start:docker": "nest start",
-    "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
+    "start:dev": "nest start --watch --preserveWatchOutput",
+    "start:docker": "pnpm prisma:generate && pnpm dbSchema && pnpm start",
+    "lint": "eslint --fix",
+    "lint:all": "npm run lint -- .",
+    "format": "prettier --write",
+    "format:all": "npm run format -- .",
     "test": "jest",
     "test:watch": "jest --watch",
     "test:cov": "jest --coverage",
     "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
-    "test:e2e": "jest -i --config ./test/jest-e2e.json"
+    "test:e2e": "jest --config ./test/jest.config.js"
   },
   "dependencies": {
     "@aries-framework/anoncreds": "0.4.2",
@@ -82,35 +90,5 @@
     "tsconfig-paths": "^3.10.1",
     "typedoc": "^0.22.15",
     "typescript": "^4.3.5"
-  },
-  "jest": {
-    "moduleFileExtensions": [
-      "js",
-      "json",
-      "ts"
-    ],
-    "rootDir": "src",
-    "testRegex": ".*\\.spec\\.ts$",
-    "transform": {
-      "^.+\\.(t|j)s$": "ts-jest"
-    },
-    "moduleNameMapper": {
-      "^@src/(.*)$": "<rootDir>/$1",
-      "@config/(.*)": "<rootDir>/../config/$1",
-      "@globalUtils/(.*)": "<rootDir>/globalUtils/$1",
-      "^@didComm/(.*)$": "<rootDir>/didComm/$1",
-      "^@DB/(.*)$": "<rootDir>/prisma/$1",
-      "^@common/(.*)$": "<rootDir>/common/$1",
-      "^@agent/(.*)$": "<rootDir>/agent/$1",
-      "^@health/(.*)$": "<rootDir>/health/$1"
-    },
-    "collectCoverageFrom": [
-      "**/agent/agentUtils/listener.(t|j)s",
-      "**/didComm/controller/**/*.(t|j)s",
-      "**/didComm/utils/**/*.(t|j)s",
-      "**/globalUtils/logger.(t|j)s"
-    ],
-    "coverageDirectory": "../coverage",
-    "testEnvironment": "node"
   }
 }
diff --git a/apps/ssi-abstraction/src/agent/agent.controller.ts b/apps/ssi-abstraction/src/agent/agent.controller.ts
index 3f28248a7efd2ec3a70fa5357245bb4e5f9b4d13..f5b90bba3839221bc06848055f7754a15ffcc055 100644
--- a/apps/ssi-abstraction/src/agent/agent.controller.ts
+++ b/apps/ssi-abstraction/src/agent/agent.controller.ts
@@ -1,5 +1,5 @@
 import { Controller, Get, HttpStatus } from '@nestjs/common';
-import { AgentService } from './agent.service';
+import { AgentService } from './agent.service.js';
 
 @Controller('agent')
 export class AgentController {
diff --git a/apps/ssi-abstraction/src/agent/agent.module.ts b/apps/ssi-abstraction/src/agent/agent.module.ts
index d9c2070d1a396f633d823837a7a3419323b6ec2a..ebdf5c28ac85fa52f9d8fbb28732a87e85a29703 100644
--- a/apps/ssi-abstraction/src/agent/agent.module.ts
+++ b/apps/ssi-abstraction/src/agent/agent.module.ts
@@ -1,11 +1,11 @@
-import config from '@config/config';
 import { Module } from '@nestjs/common';
 import { ConfigModule } from '@nestjs/config';
 import { ClientsModule, Transport } from '@nestjs/microservices';
-import { NatsClientService } from '@src/client/nats.client';
-import { NATSServices } from '@src/common/constants';
-import { AgentController } from './agent.controller';
-import { AgentService } from './agent.service';
+import config from '../config/config.js';
+import { NatsClientService } from '../client/nats.client.js';
+import { NATSServices } from '../common/constants.js';
+import { AgentController } from './agent.controller.js';
+import { AgentService } from './agent.service.js';
 
 @Module({
   imports: [
diff --git a/apps/ssi-abstraction/src/agent/agent.service.ts b/apps/ssi-abstraction/src/agent/agent.service.ts
index 187b4d85721fca541d5f2c66baabb5aca0d316b0..4d58a6736fbb526e2850a4f0b15ac83839405be0 100644
--- a/apps/ssi-abstraction/src/agent/agent.service.ts
+++ b/apps/ssi-abstraction/src/agent/agent.service.ts
@@ -16,8 +16,6 @@ import {
 import { agentDependencies, HttpInboundTransport } from '@aries-framework/node';
 import { Injectable } from '@nestjs/common';
 import { ConfigService } from '@nestjs/config';
-import { NatsClientService } from '@src/client/nats.client';
-import logger from '@src/globalUtils/logger';
 import { AnonCredsRsModule } from '@aries-framework/anoncreds-rs';
 import { anoncreds } from '@hyperledger/anoncreds-nodejs';
 import { AnonCredsModule } from '@aries-framework/anoncreds';
@@ -31,14 +29,16 @@ import {
   IndyVdrPoolConfig,
   IndyVdrSovDidResolver,
 } from '@aries-framework/indy-vdr';
-import { subscribe } from './utils/listener';
+import { subscribe } from './utils/listener.js';
 import {
   LedgerIds,
   ledgerNamespaces,
   LEDGER_GENESIS,
-} from './utils/ledgerConfig';
-import { AgentLogger } from './utils/logger';
-import { registerPublicDids } from './ledger/register';
+} from './utils/ledgerConfig.js';
+import { AgentLogger } from './utils/logger.js';
+import { registerPublicDids } from './ledger/register.js';
+import { NatsClientService } from '../client/nats.client.js';
+import logger from '../globalUtils/logger.js';
 
 @Injectable()
 export class AgentService {
diff --git a/apps/ssi-abstraction/src/agent/ledger/register.ts b/apps/ssi-abstraction/src/agent/ledger/register.ts
index 50b4cc65d21b239824f44261aaabdb3f74aedfe8..d3957e5830299737deee178336cc8965bae8ef35 100644
--- a/apps/ssi-abstraction/src/agent/ledger/register.ts
+++ b/apps/ssi-abstraction/src/agent/ledger/register.ts
@@ -1,7 +1,7 @@
-import logger from '@src/globalUtils/logger';
+import logger from '../../globalUtils/logger.js';
 import axios from 'axios';
-import { logAxiosError } from '../utils/helperFunctions';
-import { LedgerIds, ledgerNamespaces, NYM_URL } from '../utils/ledgerConfig';
+import { logAxiosError } from '../utils/helperFunctions.js';
+import { LedgerIds, ledgerNamespaces, NYM_URL } from '../utils/ledgerConfig.js';
 
 type RegisterPublicDidOptions = {
   alias: string;
@@ -43,7 +43,7 @@ export const registerPublicDids = async ({
       };
 
       // eslint-disable-next-line no-await-in-loop
-      const res = await axios.post<RegisterPublicDidResponse>(
+      const res = await new axios.Axios().post<RegisterPublicDidResponse>(
         ledgerRegisterUrl,
         body,
       );
diff --git a/apps/ssi-abstraction/src/agent/utils/helperFunctions.ts b/apps/ssi-abstraction/src/agent/utils/helperFunctions.ts
index 82e880bbd1959aee9ce3d28916b88b2e02a9af6c..0f4f2720b9256d0084fcec8dadd5b3b3f2adf2f0 100644
--- a/apps/ssi-abstraction/src/agent/utils/helperFunctions.ts
+++ b/apps/ssi-abstraction/src/agent/utils/helperFunctions.ts
@@ -1,4 +1,4 @@
-import logger from '@src/globalUtils/logger';
+import logger from '../../globalUtils/logger.js';
 
 export function logAxiosError(err: any) {
   if (err.response) {
diff --git a/apps/ssi-abstraction/src/agent/utils/listener.spec.ts b/apps/ssi-abstraction/src/agent/utils/listener.spec.ts
index ea1052213b44272156bc3a33526185220f56b0f4..95d5a43a8f1303ec2c2755d1e32dd6a45a05c1a6 100644
--- a/apps/ssi-abstraction/src/agent/utils/listener.spec.ts
+++ b/apps/ssi-abstraction/src/agent/utils/listener.spec.ts
@@ -1,4 +1,4 @@
-import { subscribe } from './listener';
+import { subscribe } from './listener.js';
 
 describe('listener', () => {
   it('should subscribe agent to available events', async () => {
diff --git a/apps/ssi-abstraction/src/agent/utils/listener.ts b/apps/ssi-abstraction/src/agent/utils/listener.ts
index 1c636de348040bf422937baa979accc93b79af72..17615e1a6839e5422f1b49dc2b9dcdee052ba34c 100644
--- a/apps/ssi-abstraction/src/agent/utils/listener.ts
+++ b/apps/ssi-abstraction/src/agent/utils/listener.ts
@@ -1,7 +1,7 @@
 import { Agent } from '@aries-framework/core';
-import logger from '@src/globalUtils/logger';
-import { NatsClientService } from '@src/client/nats.client';
-import { listenerConfig } from './listenerConfig';
+import logger from '../../globalUtils/logger.js';
+import { NatsClientService } from '../../client/nats.client.js';
+import { listenerConfig } from './listenerConfig.js';
 
 /**
  * Subscribes to events on nats
diff --git a/apps/ssi-abstraction/src/agent/utils/logger.ts b/apps/ssi-abstraction/src/agent/utils/logger.ts
index 5339a9cf7a8619af0973bc5b434a670d91ce166d..dff3f0c41f75a5a31b0588734c40e24c603bb840 100644
--- a/apps/ssi-abstraction/src/agent/utils/logger.ts
+++ b/apps/ssi-abstraction/src/agent/utils/logger.ts
@@ -1,6 +1,5 @@
-/* eslint-disable class-methods-use-this */
 import { BaseLogger, LogLevel } from '@aries-framework/core';
-import logger from '@src/globalUtils/logger';
+import logger from '../../globalUtils/logger.js';
 
 export class AgentLogger extends BaseLogger {
   public test(message: string, data?: Record<string, any> | undefined): void {
diff --git a/apps/ssi-abstraction/src/app.module.ts b/apps/ssi-abstraction/src/app.module.ts
index 7ad33cb9e6ff32cf34bf9f2be6cc12830416fd70..0eda6d7aa2a922016077b4787231803371e6d2b7 100644
--- a/apps/ssi-abstraction/src/app.module.ts
+++ b/apps/ssi-abstraction/src/app.module.ts
@@ -2,12 +2,13 @@ import { APP_FILTER } from '@nestjs/core';
 import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
 import { ConfigModule } from '@nestjs/config';
 import { TerminusModule } from '@nestjs/terminus';
-import config from '@config/config';
-import validationSchema from '@config/validation';
-import HealthController from '@src/health/health.controller';
-import ExceptionHandler from '@src/globalUtils/exception.handler';
-import { AgentMid } from './middleware/agentMid.middleware';
-import { AgentModule } from './agent/agent.module';
+
+import config from './config/config.js';
+import validationSchema from './config/validation.js';
+import HealthController from './health/health.controller.js';
+import ExceptionHandler from './globalUtils/exception.handler.js';
+import { AgentMid } from './middleware/agentMid.middleware.js';
+import { AgentModule } from './agent/agent.module.js';
 
 @Module({
   imports: [
diff --git a/apps/ssi-abstraction/src/client/nats.client.ts b/apps/ssi-abstraction/src/client/nats.client.ts
index 5a4c62abcbb59fc811fd182f0da43112f0f036b5..1e995b4807452c54d5c36665e8b426bb01ef6ed0 100644
--- a/apps/ssi-abstraction/src/client/nats.client.ts
+++ b/apps/ssi-abstraction/src/client/nats.client.ts
@@ -1,7 +1,7 @@
 import { Inject, Injectable } from '@nestjs/common';
 import { ClientProxy } from '@nestjs/microservices';
-import { NATSServices } from '@common/constants';
-import logger from '@globalUtils/logger';
+import { NATSServices } from '../common/constants.js';
+import logger from '../globalUtils/logger.js';
 
 @Injectable()
 export class NatsClientService {
diff --git a/apps/ssi-abstraction/config/config.ts b/apps/ssi-abstraction/src/config/config.ts
similarity index 100%
rename from apps/ssi-abstraction/config/config.ts
rename to apps/ssi-abstraction/src/config/config.ts
diff --git a/apps/ssi-abstraction/config/validation.ts b/apps/ssi-abstraction/src/config/validation.ts
similarity index 100%
rename from apps/ssi-abstraction/config/validation.ts
rename to apps/ssi-abstraction/src/config/validation.ts
diff --git a/apps/ssi-abstraction/src/globalUtils/appConfig.ts b/apps/ssi-abstraction/src/globalUtils/appConfig.ts
index 7005ea6c17e5b90db1013ace914b82a4a366610b..f3fba5475a3a8a7872b740e9823fe2e9a33161ad 100644
--- a/apps/ssi-abstraction/src/globalUtils/appConfig.ts
+++ b/apps/ssi-abstraction/src/globalUtils/appConfig.ts
@@ -1,7 +1,7 @@
 import { VersioningType, INestApplication } from '@nestjs/common';
 import { ConfigService } from '@nestjs/config';
 import { Transport, MicroserviceOptions } from '@nestjs/microservices';
-import logger from './logger';
+import logger from './logger.js';
 
 /**
  * Microservice and versioning configuration of the service
diff --git a/apps/ssi-abstraction/src/globalUtils/exception.handler.ts b/apps/ssi-abstraction/src/globalUtils/exception.handler.ts
index 1b8ea4c1d64ecb7446dbc181de74284a4680cc19..dec587357ac200b27a171fab7f11d0e75f463ebb 100644
--- a/apps/ssi-abstraction/src/globalUtils/exception.handler.ts
+++ b/apps/ssi-abstraction/src/globalUtils/exception.handler.ts
@@ -6,7 +6,7 @@ import {
   HttpStatus,
 } from '@nestjs/common';
 import { HttpAdapterHost } from '@nestjs/core';
-import { ResponseType } from '@common/response';
+import { ResponseType } from '../common/response.js';
 
 @Catch()
 export class ExceptionHandler implements ExceptionFilter {
diff --git a/apps/ssi-abstraction/src/main.ts b/apps/ssi-abstraction/src/main.ts
index a140a1769797aca8c228c8d1ba68828ea0536318..98f80968b247c45eb4bcb445dbcfa0dafb2b76e2 100644
--- a/apps/ssi-abstraction/src/main.ts
+++ b/apps/ssi-abstraction/src/main.ts
@@ -1,9 +1,10 @@
 import { NestFactory } from '@nestjs/core';
 import { ConfigService } from '@nestjs/config';
-import AppModule from '@src/app.module';
-import logger from './globalUtils/logger';
-import swaggerSetup from './globalUtils/swagger';
-import appConf from './globalUtils/appConfig';
+
+import AppModule from './app.module.js';
+import logger from './globalUtils/logger.js';
+import swaggerSetup from './globalUtils/swagger.js';
+import appConf from './globalUtils/appConfig.js';
 
 async function bootstrap() {
   const app = await NestFactory.create(AppModule);
diff --git a/apps/ssi-abstraction/test/jest-e2e.json b/apps/ssi-abstraction/test/jest-e2e.json
deleted file mode 100644
index 4a8635e2f768ed6352e0341b685e1bc65d3bb426..0000000000000000000000000000000000000000
--- a/apps/ssi-abstraction/test/jest-e2e.json
+++ /dev/null
@@ -1,23 +0,0 @@
-{
-  "moduleFileExtensions": ["js", "json", "ts"],
-  "rootDir": ".",
-  "testEnvironment": "node",
-  "testRegex": ".e2e-spec.ts$",
-  "transform": {
-    "^.+\\.(t|j)s$": "ts-jest"
-  },
-  "moduleNameMapper": {
-    "@src/(.*)": ["<rootDir>/../src/$1"],
-    "@config/(.*)": ["<rootDir>/../config/$1"],
-    "@globalUtils/(.*)" :["<rootDir>/../src/globalUtils/$1"],
-    "@common/(.*)":["<rootDir>/../src/common/$1"],
-    "@agent/(.*)":["<rootDir>/../src/agent/$1"],
-    "@didComm/(.*)":["<rootDir>/../src/didComm/$1"],
-    "@eventHandler/(.*)":["<rootDir>/../src/eventHandler/$1"],
-    "@health/(.*)":["<rootDir>/../src/health/$1"],
-    "@DB/(.*)":["<rootDir>/../src/prisma/$1"]
-  },
-  "setupFiles": [
-    "./setEnvVars.js"
-  ]
-}
\ No newline at end of file
diff --git a/apps/ssi-abstraction/test/jest.config.js b/apps/ssi-abstraction/test/jest.config.js
new file mode 100644
index 0000000000000000000000000000000000000000..aff146f7bfb93ea0915f112ad94fa165c2cb03cd
--- /dev/null
+++ b/apps/ssi-abstraction/test/jest.config.js
@@ -0,0 +1,8 @@
+/** @type {import('jest').Config} */
+import config from '../jest.config.js';
+
+export default {
+  ...config,
+  rootDir: '.',
+  testRegex: '.*\\.e2e-spec\\.ts$',
+};
diff --git a/apps/ssi-abstraction/tsconfig.json b/apps/ssi-abstraction/tsconfig.json
index 22c429bbfc492b7dacaf3af5f3579538db30bff9..c759d12a5c23cb01761f3e77cda699cd76bcadd8 100644
--- a/apps/ssi-abstraction/tsconfig.json
+++ b/apps/ssi-abstraction/tsconfig.json
@@ -1,31 +1,15 @@
 {
+  "extends": "../../tsconfig.json",
   "compilerOptions": {
-    "target": "es6",
-    "experimentalDecorators": true,
-    "emitDecoratorMetadata": true,
-    "module": "commonjs",
+    "composite": true,
+    "removeComments": false,
+    "declaration": true,
+    "sourceMap": true,
+    "incremental": true,
     "outDir": "./dist",
-    "esModuleInterop": true,
-    "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */,
-    "strict": true,
-    "skipLibCheck": true,
     "baseUrl": "./",
-    "strictPropertyInitialization": false,
-    "sourceMap": true,
-    "strictNullChecks": true,
-    "paths": {
-      "@src/*": ["src/*"],
-      "@config/*": ["config/*"],
-      "@globalUtils/*" :["src/globalUtils/*"],
-      "@common/*":["src/common/*"],
-      "@agent/*":["src/agent/*"],
-      "@didComm/*":["src/didComm/*"],
-      "@health/*":["src/health/*"],
-      "@DB/*":["src/prisma/*"]
-    }
+    "rootDir": "./src"
   },
-  "exclude": [
-    "node_modules",
-    "./dist/**/*"
-  ]
+  "include": ["src", "config"],
+  "exclude": ["node_modules", "./dist/**/*"]
 }