diff --git a/apps/shared/src/events/credentialEvents.ts b/apps/shared/src/events/credentialEvents.ts
index 49a495d2b4ee44d0df77ac9343874162dd642b2f..e52cdbf812ad908da705d976dbf5eaab48be7ad3 100644
--- a/apps/shared/src/events/credentialEvents.ts
+++ b/apps/shared/src/events/credentialEvents.ts
@@ -55,7 +55,6 @@ export type EventDidcommAnonCredsCredentialsOfferInput = BaseEventInput<{
   credentialDefinitionId: string;
   attributes: Array<{ name: string; value: string; mimeType?: string }>;
   revocationRegistryDefinitionId?: string;
-  revocationRegistryIndex?: number;
 }>;
 export class EventDidcommAnonCredsCredentialsOffer extends BaseEvent<CredentialExchangeRecord> {
   public static token = 'didcomm.anoncreds.credentials.offer';
diff --git a/apps/ssi-abstraction/src/agent/anoncredsCredentials/anoncredsCredentials.service.ts b/apps/ssi-abstraction/src/agent/anoncredsCredentials/anoncredsCredentials.service.ts
index a00ce2c0a2238f180ca1354bfe0c7ea802df3e73..72fa3311d28cf1149d297781a35d75a3b754466a 100644
--- a/apps/ssi-abstraction/src/agent/anoncredsCredentials/anoncredsCredentials.service.ts
+++ b/apps/ssi-abstraction/src/agent/anoncredsCredentials/anoncredsCredentials.service.ts
@@ -1,3 +1,4 @@
+import type { TenantAgent } from '../agent.service.js';
 import type { CredentialExchangeRecord } from '@credo-ts/core';
 import type {
   EventAnonCredsCredentialOfferGetAll,
@@ -19,10 +20,11 @@ import type {
 } from '@ocm/shared';
 
 import { AutoAcceptCredential, CredentialState } from '@credo-ts/core';
+import { GenericRecord } from '@credo-ts/core/build/modules/generic-records/repository/GenericRecord.js';
 import { Injectable } from '@nestjs/common';
 import { logger } from '@ocm/shared';
 
-import { MetadataTokens } from '../../common/constants.js';
+import { GenericRecordTokens, MetadataTokens } from '../../common/constants.js';
 import { WithTenantService } from '../withTenantService.js';
 
 @Injectable()
@@ -141,13 +143,13 @@ export class AnonCredsCredentialsService {
     connectionId,
     credentialDefinitionId,
     attributes,
-    revocationRegistryIndex,
     revocationRegistryDefinitionId,
   }: EventDidcommAnonCredsCredentialsOfferInput): Promise<
     EventDidcommAnonCredsCredentialsOffer['data']
   > {
-    return this.withTenantService.invoke(tenantId, (t) =>
-      t.credentials.offerCredential({
+    return this.withTenantService.invoke(tenantId, async (t) => {
+      const revocationRegistryIndex = await this.getNextRevocationIdx(t);
+      return t.credentials.offerCredential({
         protocolVersion: 'v2',
         connectionId,
         credentialFormats: {
@@ -158,15 +160,14 @@ export class AnonCredsCredentialsService {
             revocationRegistryIndex,
           },
         },
-      }),
-    );
+      });
+    });
   }
 
   public async offerToSelf({
     tenantId,
     credentialDefinitionId,
     attributes,
-    revocationRegistryIndex,
     revocationRegistryDefinitionId,
   }: EventDidcommAnonCredsCredentialsOfferToSelfInput): Promise<
     EventDidcommAnonCredsCredentialsOfferToSelf['data']
@@ -175,7 +176,7 @@ export class AnonCredsCredentialsService {
       const connections = await t.connections.getAll();
       const connection = connections.find((c) => {
         const metadata = c.metadata.get<{ withSelf: boolean }>(
-          MetadataTokens.GAIA_X_CONNECTION_METADATA_KEY,
+          MetadataTokens.CONNECTION_METADATA_KEY,
         );
         return metadata && metadata.withSelf === true;
       });
@@ -190,6 +191,8 @@ export class AnonCredsCredentialsService {
         throw new Error('Connection with yourself is not ready, yet');
       }
 
+      const revocationRegistryIndex = await this.getNextRevocationIdx(t);
+
       return t.credentials.offerCredential({
         protocolVersion: 'v2',
         autoAcceptCredential: AutoAcceptCredential.Always,
@@ -205,4 +208,48 @@ export class AnonCredsCredentialsService {
       });
     });
   }
+
+  // TODO: this is mainly focussed on one revocation status list per issuer. But this is normally not the case. The credential should store the record id in metadata to support multiple generic records. One per revocation status list
+  private async getNextRevocationIdx(
+    tenantAgent: TenantAgent,
+  ): Promise<number> {
+    let recordExists = true;
+    let genericRecord = await tenantAgent.genericRecords.findById(
+      GenericRecordTokens.REVOCATION,
+    );
+
+    if (!genericRecord) {
+      recordExists = false;
+      genericRecord = new GenericRecord({
+        id: GenericRecordTokens.REVOCATION,
+        content: {
+          revocationIndices: [],
+        },
+      });
+    }
+
+    if (
+      !genericRecord.content.revocationIndices ||
+      !Array.isArray(genericRecord.content.revocationIndices)
+    ) {
+      throw new Error(
+        `Revocation record '${GenericRecordTokens.REVOCATION}' does not have the required revocationIndices in the content. Invalid state has been reached`,
+      );
+    }
+
+    const highestIdx =
+      genericRecord.content.revocationIndices.length > 0
+        ? Math.max(...genericRecord.content.revocationIndices)
+        : 0;
+
+    const credentialIdx = highestIdx + 1;
+
+    genericRecord.content.revocationIndices.push(credentialIdx);
+
+    recordExists
+      ? await tenantAgent.genericRecords.update(genericRecord)
+      : await tenantAgent.genericRecords.save(genericRecord);
+
+    return credentialIdx;
+  }
 }
diff --git a/apps/ssi-abstraction/src/agent/connections/connections.service.ts b/apps/ssi-abstraction/src/agent/connections/connections.service.ts
index 73ae244bacfe0350b23496fe00e82c0c1c2cc533..1b6f8c4d84531aea50a7b4700a1cafb71b05815a 100644
--- a/apps/ssi-abstraction/src/agent/connections/connections.service.ts
+++ b/apps/ssi-abstraction/src/agent/connections/connections.service.ts
@@ -153,7 +153,7 @@ export class ConnectionsService {
           async ({ payload: { connectionRecord } }) => {
             if (connectionRecord.state !== DidExchangeState.Completed) return;
             connectionRecord.metadata.set(
-              MetadataTokens.GAIA_X_CONNECTION_METADATA_KEY,
+              MetadataTokens.CONNECTION_METADATA_KEY,
               {
                 trusted: true,
                 withSelf: true,
diff --git a/apps/ssi-abstraction/src/common/constants.ts b/apps/ssi-abstraction/src/common/constants.ts
index 723add9e86ac1f1618c37e1babc3742cc90195dc..1e67c0f2320b146813897916d7c0ef0455dded7f 100644
--- a/apps/ssi-abstraction/src/common/constants.ts
+++ b/apps/ssi-abstraction/src/common/constants.ts
@@ -3,5 +3,9 @@ export enum NATSServices {
 }
 
 export enum MetadataTokens {
-  GAIA_X_CONNECTION_METADATA_KEY = 'gaia_x_connection_metadata_key',
+  CONNECTION_METADATA_KEY = 'connection_metadata_key',
+}
+
+export enum GenericRecordTokens {
+  REVOCATION = 'revocation_generic_record',
 }
diff --git a/apps/ssi-abstraction/test/connections.e2e-spec.ts b/apps/ssi-abstraction/test/connections.e2e-spec.ts
index 64604e86b673d6a620dfe88382c9794fe788d70f..7579cac7f39bb7b7100ac201e5d48155a0d96917 100644
--- a/apps/ssi-abstraction/test/connections.e2e-spec.ts
+++ b/apps/ssi-abstraction/test/connections.e2e-spec.ts
@@ -152,7 +152,7 @@ describe('Connections', () => {
 
     expect(eventInstance.instance).toHaveProperty('id');
     const metadata = eventInstance.instance.metadata.get(
-      MetadataTokens.GAIA_X_CONNECTION_METADATA_KEY,
+      MetadataTokens.CONNECTION_METADATA_KEY,
     );
     expect(metadata).toMatchObject({ trusted: true });
   });
diff --git a/apps/ssi-abstraction/test/revocation.e2e-spec.ts b/apps/ssi-abstraction/test/revocation.e2e-spec.ts
index e6150f745df985f8049e2cec7fce7b06668135df..17667ac93d952d2168c80e35e7cbfdd5c2c8fd9f 100644
--- a/apps/ssi-abstraction/test/revocation.e2e-spec.ts
+++ b/apps/ssi-abstraction/test/revocation.e2e-spec.ts
@@ -233,7 +233,6 @@ describe('Revocation', () => {
           { name: 'Age', value: '30' },
         ],
         revocationRegistryDefinitionId: revRegDefId,
-        revocationRegistryIndex: 10,
         credentialDefinitionId,
       });
       const response = await firstValueFrom(response$);