diff --git a/README.md b/README.md
index 267fb59d6c7c7963dac0da1221bf83adb383c9df..cee255c4f7c9092453d4db3634c7efd1ba1bb8ac 100644
--- a/README.md
+++ b/README.md
@@ -109,12 +109,20 @@ See https://duniter.org/wiki/duniter-v2/indexers/duniter-squid/
 
 - [x] Refac way to process data from events (new, fetch needed...)
 - [ ] Add events:
-  - [ ] identity.IdtyCreated
-  - [ ] identity.IdtyConfirmed
-  - [ ] identity.IdtyValidated
+  - [x] identity.IdtyCreated
+  - [x] identity.IdtyConfirmed
+  - [ ] identity.IdtyValidated ?
   - [x] identity.IdtyChangedOwnerKey
   - [ ] identity.IdtyRemoved
-  - [ ] cert.NewCert
-  - [ ] cert.RenewedCert
+  - [ ] membership.MembershipAcquired
+  - [ ] membership.MembershipExpired
+  - [ ] membership.MembershipRenewed
+  - [ ] membership.MembershipRequested
+  - [ ] membership.MembershipRevoked
+  - [ ] membership.PendingMembershipExpired
+  - [ ] account.identity_linked
+  - [x] cert.NewCert
+  - [x] cert.RenewedCert
+  - [x] cert.RemovedCert
   - [ ] smithCert.NewCert
   - [ ] smithCert.RenewedCert
\ No newline at end of file
diff --git a/db/migrations/1700684897000-Data.js b/db/migrations/1700947757782-Data.js
similarity index 90%
rename from db/migrations/1700684897000-Data.js
rename to db/migrations/1700947757782-Data.js
index 58666b96496d3179304193a4c6b8f289a6208d9b..584b345dc6cb87147d37e6d9971289e8ad7fb114 100644
--- a/db/migrations/1700684897000-Data.js
+++ b/db/migrations/1700947757782-Data.js
@@ -1,5 +1,5 @@
-module.exports = class Data1700684897000 {
-    name = 'Data1700684897000'
+module.exports = class Data1700947757782 {
+    name = 'Data1700947757782'
 
     async up(db) {
         await db.query(`CREATE TABLE "event" ("id" character varying NOT NULL, "index" integer NOT NULL, "phase" text NOT NULL, "pallet" text NOT NULL, "name" text NOT NULL, "args" jsonb, "args_str" text array, "block_id" character varying, "extrinsic_id" character varying, "call_id" character varying, CONSTRAINT "PK_30c2f3bbaf6d34a55f8ae6e4614" PRIMARY KEY ("id"))`)
@@ -39,7 +39,11 @@ module.exports = class Data1700684897000 {
         await db.query(`CREATE INDEX "IDX_0751309c66e97eac9ef1149362" ON "transfer" ("to_id") `)
         await db.query(`CREATE INDEX "IDX_f4007436c1b546ede08a4fd7ab" ON "transfer" ("amount") `)
         await db.query(`CREATE TABLE "account" ("id" character varying NOT NULL, CONSTRAINT "PK_54115ee388cdb6d86bb4bf5b2ea" PRIMARY KEY ("id"))`)
-        await db.query(`CREATE TABLE "cert" ("id" character varying NOT NULL, "issuer_id" character varying, "receiver_id" character varying, CONSTRAINT "PK_6a0ce80cc860598b4f16c00998c" PRIMARY KEY ("id"))`)
+        await db.query(`CREATE TABLE "cert_renewal" ("id" character varying NOT NULL, "block_number" integer NOT NULL, "cert_id" character varying, CONSTRAINT "PK_2b8c3fc001515715892efe4fe3b" PRIMARY KEY ("id"))`)
+        await db.query(`CREATE INDEX "IDX_f1596a2147377881d3bd73dc18" ON "cert_renewal" ("cert_id") `)
+        await db.query(`CREATE TABLE "cert_removal" ("id" character varying NOT NULL, "block_number" integer NOT NULL, "cert_id" character varying, CONSTRAINT "PK_2b3e8cf035b04205a4b1f6a0acf" PRIMARY KEY ("id"))`)
+        await db.query(`CREATE INDEX "IDX_2efb6397676a3b82bde7631ed0" ON "cert_removal" ("cert_id") `)
+        await db.query(`CREATE TABLE "cert" ("id" character varying NOT NULL, "created_on" integer NOT NULL, "expire_on" integer NOT NULL, "issuer_id" character varying, "receiver_id" character varying, CONSTRAINT "PK_6a0ce80cc860598b4f16c00998c" PRIMARY KEY ("id"))`)
         await db.query(`CREATE INDEX "IDX_70592e488b2e75cd8a2fa79826" ON "cert" ("issuer_id") `)
         await db.query(`CREATE INDEX "IDX_262e29ab91c8ebc727cc518f2f" ON "cert" ("receiver_id") `)
         await db.query(`CREATE TABLE "smith_cert" ("id" character varying NOT NULL, "issuer_id" character varying, "receiver_id" character varying, CONSTRAINT "PK_ae2ef36c9f6d40348c86230fd35" PRIMARY KEY ("id"))`)
@@ -65,6 +69,8 @@ module.exports = class Data1700684897000 {
         await db.query(`ALTER TABLE "extrinsic" ADD CONSTRAINT "FK_824d47cc4b2cda726405aa507ca" FOREIGN KEY ("call_id") REFERENCES "call"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`)
         await db.query(`ALTER TABLE "transfer" ADD CONSTRAINT "FK_76bdfed1a7eb27c6d8ecbb73496" FOREIGN KEY ("from_id") REFERENCES "account"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`)
         await db.query(`ALTER TABLE "transfer" ADD CONSTRAINT "FK_0751309c66e97eac9ef11493623" FOREIGN KEY ("to_id") REFERENCES "account"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`)
+        await db.query(`ALTER TABLE "cert_renewal" ADD CONSTRAINT "FK_f1596a2147377881d3bd73dc182" FOREIGN KEY ("cert_id") REFERENCES "cert"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`)
+        await db.query(`ALTER TABLE "cert_removal" ADD CONSTRAINT "FK_2efb6397676a3b82bde7631ed03" FOREIGN KEY ("cert_id") REFERENCES "cert"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`)
         await db.query(`ALTER TABLE "cert" ADD CONSTRAINT "FK_70592e488b2e75cd8a2fa798261" FOREIGN KEY ("issuer_id") REFERENCES "identity"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`)
         await db.query(`ALTER TABLE "cert" ADD CONSTRAINT "FK_262e29ab91c8ebc727cc518f2fb" FOREIGN KEY ("receiver_id") REFERENCES "identity"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`)
         await db.query(`ALTER TABLE "smith_cert" ADD CONSTRAINT "FK_ae67cbd087fcea0e1ec2f70cd04" FOREIGN KEY ("issuer_id") REFERENCES "identity"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`)
@@ -112,6 +118,10 @@ module.exports = class Data1700684897000 {
         await db.query(`DROP INDEX "public"."IDX_0751309c66e97eac9ef1149362"`)
         await db.query(`DROP INDEX "public"."IDX_f4007436c1b546ede08a4fd7ab"`)
         await db.query(`DROP TABLE "account"`)
+        await db.query(`DROP TABLE "cert_renewal"`)
+        await db.query(`DROP INDEX "public"."IDX_f1596a2147377881d3bd73dc18"`)
+        await db.query(`DROP TABLE "cert_removal"`)
+        await db.query(`DROP INDEX "public"."IDX_2efb6397676a3b82bde7631ed0"`)
         await db.query(`DROP TABLE "cert"`)
         await db.query(`DROP INDEX "public"."IDX_70592e488b2e75cd8a2fa79826"`)
         await db.query(`DROP INDEX "public"."IDX_262e29ab91c8ebc727cc518f2f"`)
@@ -138,6 +148,8 @@ module.exports = class Data1700684897000 {
         await db.query(`ALTER TABLE "extrinsic" DROP CONSTRAINT "FK_824d47cc4b2cda726405aa507ca"`)
         await db.query(`ALTER TABLE "transfer" DROP CONSTRAINT "FK_76bdfed1a7eb27c6d8ecbb73496"`)
         await db.query(`ALTER TABLE "transfer" DROP CONSTRAINT "FK_0751309c66e97eac9ef11493623"`)
+        await db.query(`ALTER TABLE "cert_renewal" DROP CONSTRAINT "FK_f1596a2147377881d3bd73dc182"`)
+        await db.query(`ALTER TABLE "cert_removal" DROP CONSTRAINT "FK_2efb6397676a3b82bde7631ed03"`)
         await db.query(`ALTER TABLE "cert" DROP CONSTRAINT "FK_70592e488b2e75cd8a2fa798261"`)
         await db.query(`ALTER TABLE "cert" DROP CONSTRAINT "FK_262e29ab91c8ebc727cc518f2fb"`)
         await db.query(`ALTER TABLE "smith_cert" DROP CONSTRAINT "FK_ae67cbd087fcea0e1ec2f70cd04"`)
diff --git a/schema.graphql b/schema.graphql
index 95ee7fe3b61ec63921da9442827e5ae3067d7643..51707302224c82c96b81c255a66031bbfefa81c5 100644
--- a/schema.graphql
+++ b/schema.graphql
@@ -123,7 +123,6 @@ type Account @entity {
 }
 
 type Transfer @entity {
-  id: ID!
   blockNumber: Int! @index
   timestamp: DateTime! @index
   from: Account!
@@ -137,6 +136,8 @@ type Transfer @entity {
 
 "Identity"
 type Identity @entity {
+  "index in string format"
+  id: ID! # this is a limitation of @subsquid/typeorm-store
   "Identity index"
   index: Int! @index @unique
   "Current account"
@@ -159,8 +160,25 @@ type Identity @entity {
 
 "Certification"
 type Cert @entity {
-  issuer: Identity!
-  receiver: Identity!
+  "issuerIndex-receiverIndex"
+  id: ID!
+  issuer: Identity! @index
+  receiver: Identity! @index
+  "first block"
+  createdOn: Int!
+  expireOn: Int!
+  renewal: [CertRenewal!] @derivedFrom(field: "cert")
+  removal: [CertRemoval!] @derivedFrom(field: "cert")
+}
+"Certification renewal"
+type CertRenewal @entity {
+  cert: Cert! @index
+  blockNumber: Int!
+}
+"Certification removal"
+type CertRemoval @entity {
+  cert: Cert! @index
+  blockNumber: Int!
 }
 
 "Smith certification"
diff --git a/src/genesis.ts b/src/genesis.ts
index 3222780ef5e45486e5328fc744836ad33599071e..3eea6005ce1f581112d2f4fabf2bb09cd69aa6be 100644
--- a/src/genesis.ts
+++ b/src/genesis.ts
@@ -125,9 +125,11 @@ export async function saveGenesis(ctx: ProcessorContext<StoreWithCache>) {
       certs.push(
         new Cert({
           // cert id is different in genesis than in the rest of blockchain
-          id: `genesis-${issuer_index}-${receiver_index}`,
+          id: `${issuer_index}-${receiver_index}`,
           issuer: identities.get(parseInt(issuer_index)),
           receiver: identities.get(parseInt(receiver_index)),
+          createdOn: 0,
+          expireOn: expiration_block as number,
         })
       );
     }
@@ -138,7 +140,7 @@ export async function saveGenesis(ctx: ProcessorContext<StoreWithCache>) {
     for (const [issuer_index, expiration_block] of Object.entries(certs_received)) {
       smithCerts.push(
         new SmithCert({
-          id: `genesis-${issuer_index}-${receiver_index}`,
+          id: `${issuer_index}-${receiver_index}`,
           issuer: identities.get(parseInt(issuer_index)),
           receiver: identities.get(parseInt(receiver_index)),
         })
diff --git a/src/main.ts b/src/main.ts
index b2c4ef01427bb850e6101fb2eb296a6a5f657c03..244aa291f45785c4d02ad8f67dedb5a493cf7d43 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -4,8 +4,8 @@ import * as ss58 from "@subsquid/ss58";
 import assert from "assert";
 
 import { processor, ProcessorContext } from "./processor";
-import { Account, Cert, Identity, Transfer } from "./model";
-import { events as events_t, calls as calls_t } from "./types";
+import { Account, Cert, CertRemoval, CertRenewal, Identity, Transfer } from "./model";
+import { events as events_t, calls as calls_t, constants } from "./types";
 
 import { saveBlock, saveExtrinsic, saveCall, saveEvent } from "./giant-squid";
 import { saveGenesis } from "./genesis";
@@ -39,10 +39,13 @@ processor.run(new TypeormDatabaseWithCache(), async (ctx) => {
   // collect new data from events
   let ndata: NewData = {
     accounts: [],
-    identities: [],
+    identitiesCreated: [],
+    identitiesConfirmed: [],
     idtyChangedOwnerKey: [],
     transfers: [],
-    certs: [],
+    cert: [],
+    certRenewal: [],
+    certRemoval: [],
   };
   getNewData(ctx, ndata);
 
@@ -51,7 +54,9 @@ processor.run(new TypeormDatabaseWithCache(), async (ctx) => {
     accounts: new Map(),
     identities: new Map(),
     transfers: [],
-    certs: [],
+    cert: new Map(),
+    certRenewal: [],
+    certRemoval: [],
   };
   await prepareData(ctx, ndata, prepared);
 
@@ -59,6 +64,8 @@ processor.run(new TypeormDatabaseWithCache(), async (ctx) => {
   await storeData(ctx, prepared);
 });
 
+// =====================================================================================================
+
 // type aliases
 export type Address = string;
 export type IdtyIndex = number;
@@ -68,10 +75,13 @@ type BlockNumber = number;
 // this contains partial data to be turned into types
 interface NewData {
   accounts: Address[];
-  identities: IdtyCreatedEvent[];
+  identitiesCreated: IdtyCreatedEvent[];
+  identitiesConfirmed: IdtyConfirmedEvent[];
   idtyChangedOwnerKey: IdtyChangedOwnerKeyEvent[];
   transfers: TransferEvent[];
-  certs: CertEvent[];
+  cert: CertEvent[];
+  certRenewal: CertRenewalEvent[];
+  certRemoval: CertRemovalEvent[];
 }
 interface TransferEvent {
   id: string;
@@ -83,15 +93,31 @@ interface TransferEvent {
 }
 interface CertEvent {
   id: string;
-  issuer: IdtyIndex;
-  receiver: IdtyIndex;
-  blockNumber: BlockNumber;
+  issuerId: IdtyIndex;
+  receiverId: IdtyIndex;
+  createdOn: BlockNumber;
+  expireOn: BlockNumber;
+}
+interface CertRenewalEvent {
+  id: string; // id of the event
+  certId: string; // id of the cert
+  blockNumber: BlockNumber; // block number
+}
+interface CertRemovalEvent {
+  id: string; // id of the event
+  certId: string; // id of the cert
+  blockNumber: BlockNumber; // block number
 }
 interface IdtyCreatedEvent {
   id: string;
   index: IdtyIndex;
   account: Address;
 }
+interface IdtyConfirmedEvent {
+  id: string;
+  index: IdtyIndex;
+  name: string;
+}
 interface IdtyChangedOwnerKeyEvent {
   id: string;
   index: IdtyIndex;
@@ -103,9 +129,13 @@ interface PreparedData {
   accounts: Map<Address, Account>;
   identities: Map<IdtyIndex, Identity>;
   transfers: Transfer[];
-  certs: Cert[];
+  cert: Map<string, Cert>;
+  certRenewal: CertRenewal[];
+  certRemoval: CertRemoval[];
 }
 
+// ================================================================================
+
 /// fill data with data collected from events
 function getNewData(ctx: ProcessorContext<StoreWithCache>, ndata: NewData) {
   const silence_events = [
@@ -171,13 +201,28 @@ function getNewData(ctx: ProcessorContext<StoreWithCache>, ndata: NewData) {
           } else {
             throw new Error("Unsupported spec");
           }
-          ndata.identities.push({
+          ndata.identitiesCreated.push({
             id: event.id,
             index: newI.idtyIndex,
             account: ss58.codec(42).encode(newI.ownerKey),
           });
           break;
 
+        // ===== Identity.IdtyConfirmed
+        case events_t.identity.idtyConfirmed.name:
+          let cI: { idtyIndex: IdtyIndex; ownerKey: Address; name: string };
+          if (events_t.identity.idtyConfirmed.v700.is(event)) {
+            cI = events_t.identity.idtyConfirmed.v700.decode(event);
+          } else {
+            throw new Error("Unsupported spec");
+          }
+          ndata.identitiesConfirmed.push({
+            id: event.id,
+            index: cI.idtyIndex,
+            name: cI.name,
+          });
+          break;
+
         // ===== Identity.ChangeOwnerKey
         case events_t.identity.idtyChangedOwnerKey.name:
           let chok: { idtyIndex: IdtyIndex; newOwnerKey: Address };
@@ -193,6 +238,7 @@ function getNewData(ctx: ProcessorContext<StoreWithCache>, ndata: NewData) {
           });
           break;
 
+        // ====================================================== Cert
         // ===== Cert.NewCert
         case events_t.cert.newCert.name:
           let cert: { issuer: IdtyIndex; receiver: IdtyIndex };
@@ -201,11 +247,12 @@ function getNewData(ctx: ProcessorContext<StoreWithCache>, ndata: NewData) {
           } else {
             throw new Error("Unsupported spec");
           }
-          ndata.certs.push({
-            id: event.id,
-            blockNumber: block.header.height,
-            issuer: cert.issuer,
-            receiver: cert.receiver,
+          ndata.cert.push({
+            id: `${cert.issuer}-${cert.receiver}`,
+            issuerId: cert.issuer,
+            receiverId: cert.receiver,
+            createdOn: block.header.height,
+            expireOn: block.header.height + constants.cert.validityPeriod.v700.get(event.block),
           });
           break;
 
@@ -217,11 +264,31 @@ function getNewData(ctx: ProcessorContext<StoreWithCache>, ndata: NewData) {
           } else {
             throw new Error("Unsupported spec");
           }
-          ndata.certs.push({
+          ndata.certRenewal.push({
             id: event.id,
+            certId: `${recert.issuer}-${recert.receiver}`,
+            blockNumber: block.header.height,
+          });
+          break;
+
+        // ===== Cert.RemovedCert
+        case events_t.cert.removedCert.name:
+          let remcert: {
+            issuer: IdtyIndex;
+            issuerIssuedCount: number;
+            receiver: IdtyIndex;
+            receiverReceivedCount: number;
+            expiration: boolean;
+          };
+          if (events_t.cert.removedCert.v700.is(event)) {
+            remcert = events_t.cert.removedCert.v700.decode(event);
+          } else {
+            throw new Error("Unsupported spec");
+          }
+          ndata.certRemoval.push({
+            id: event.id,
+            certId: `${remcert.issuer}-${remcert.receiver}`,
             blockNumber: block.header.height,
-            issuer: recert.issuer,
-            receiver: recert.receiver,
           });
           break;
 
@@ -232,28 +299,39 @@ function getNewData(ctx: ProcessorContext<StoreWithCache>, ndata: NewData) {
   }
 }
 
+// =============================================================================================================
+
 /// prepare data for injection into database
 async function prepareData(ctx: ProcessorContext<StoreWithCache>, newData: NewData, data: PreparedData) {
   await createAccounts(ctx, newData, data);
   await createIdentities(ctx, newData, data);
+  await confirmIdentities(ctx, newData, data);
   await changeIdtyOwnerKey(ctx, newData, data);
   await createTransfers(ctx, newData, data);
   await createCerts(ctx, newData, data);
+  await createCertRenewals(ctx, newData, data);
+  await createCertRemovals(ctx, newData, data);
 }
 
+// =============================================
+
 /// store prepared data into database
 async function storeData(ctx: ProcessorContext<StoreWithCache>, data: PreparedData) {
   // UPSERT = update or insert if not existing
   // account can have already existed, been killed, and recreated
   await ctx.store.upsert([...data.accounts.values()]);
-  // identities can have been changed (change owner key)
+  // identities can have been changed (confirmed, change owner key...) or added (created)
   await ctx.store.upsert([...data.identities.values()]);
-  // INSERT
+  // certs can have been changed (renewed, ...)
+  await ctx.store.upsert([...data.cert.values()]);
+
+  // INSERT = these object can not exist before
   await ctx.store.insert(data.transfers);
-  await ctx.store.insert(data.certs);
+  await ctx.store.insert(data.certRenewal);
+  await ctx.store.insert(data.certRemoval);
 }
 
-// ===== create new instances if not existing in database =====
+// =============================================================================================================
 
 async function createAccounts(ctx: ProcessorContext<StoreWithCache>, newData: NewData, data: PreparedData) {
   // system will tell when accounts are created (but this should be added above)
@@ -265,7 +343,7 @@ async function createAccounts(ctx: ProcessorContext<StoreWithCache>, newData: Ne
 }
 
 async function createIdentities(ctx: ProcessorContext<StoreWithCache>, newData: NewData, data: PreparedData) {
-  for (let i of newData.identities) {
+  for (let i of newData.identitiesCreated) {
     let account = await ctx.store.getOrFail(Account, i.account);
     let newI = new Identity({
       id: String(i.index),
@@ -276,6 +354,14 @@ async function createIdentities(ctx: ProcessorContext<StoreWithCache>, newData:
   }
 }
 
+async function confirmIdentities(ctx: ProcessorContext<StoreWithCache>, newData: NewData, data: PreparedData) {
+  for (let i of newData.identitiesConfirmed) {
+    let idty = await ctx.store.getOrFail(Identity, String(i.index));
+    idty.name = i.name;
+    data.identities.set(i.index, idty);
+  }
+}
+
 async function changeIdtyOwnerKey(ctx: ProcessorContext<StoreWithCache>, newData: NewData, data: PreparedData) {
   for (let icok of newData.idtyChangedOwnerKey) {
     let idty = await ctx.store.getOrFail(Identity, String(icok.index));
@@ -304,15 +390,46 @@ async function createTransfers(ctx: ProcessorContext<StoreWithCache>, newData: N
 }
 
 async function createCerts(ctx: ProcessorContext<StoreWithCache>, newData: NewData, data: PreparedData) {
-  for (let c of newData.certs) {
-    let { id, blockNumber, issuer, receiver } = c;
-    let issuerIdty = data.identities.get(issuer) ?? await ctx.store.getOrFail(Identity, String(issuer));
-    let receiverIdty = data.identities.get(receiver) ?? await ctx.store.getOrFail(Identity, String(receiver));
-    data.certs.push(
+  for (let c of newData.cert) {
+    let { id, issuerId, receiverId, createdOn, expireOn } = c;
+    let issuer = data.identities.get(issuerId) ?? (await ctx.store.getOrFail(Identity, String(issuerId)));
+    let receiver = data.identities.get(receiverId) ?? (await ctx.store.getOrFail(Identity, String(receiverId)));
+    let cert =
+      (await ctx.store.get(Cert, id)) ??
       new Cert({
         id,
-        issuer: issuerIdty,
-        receiver: receiverIdty,
+        issuer,
+        receiver,
+        createdOn,
+        expireOn,
+      });
+    data.cert.set(id, cert);
+  }
+}
+
+async function createCertRenewals(ctx: ProcessorContext<StoreWithCache>, newData: NewData, data: PreparedData) {
+  for (let c of newData.certRenewal) {
+    let { id, certId, blockNumber } = c;
+    let cert = await ctx.store.getOrFail(Cert, certId);
+    data.certRenewal.push(
+      new CertRenewal({
+        id,
+        cert,
+        blockNumber,
+      })
+    );
+  }
+}
+
+async function createCertRemovals(ctx: ProcessorContext<StoreWithCache>, newData: NewData, data: PreparedData) {
+  for (let c of newData.certRemoval) {
+    let { id, certId, blockNumber } = c;
+    let cert = await ctx.store.getOrFail(Cert, certId);
+    data.certRenewal.push(
+      new CertRemoval({
+        id,
+        cert,
+        blockNumber,
       })
     );
   }
diff --git a/src/model/generated/cert.model.ts b/src/model/generated/cert.model.ts
index 1120465d992e6674e21abb77ad0aca9ae30ab3c5..6dd258f45cf3c3647297089b3b9d3c5e6438ecef 100644
--- a/src/model/generated/cert.model.ts
+++ b/src/model/generated/cert.model.ts
@@ -1,5 +1,7 @@
-import {Entity as Entity_, Column as Column_, PrimaryColumn as PrimaryColumn_, ManyToOne as ManyToOne_, Index as Index_} from "typeorm"
+import {Entity as Entity_, Column as Column_, PrimaryColumn as PrimaryColumn_, ManyToOne as ManyToOne_, Index as Index_, OneToMany as OneToMany_} from "typeorm"
 import {Identity} from "./identity.model"
+import {CertRenewal} from "./certRenewal.model"
+import {CertRemoval} from "./certRemoval.model"
 
 /**
  * Certification
@@ -10,6 +12,9 @@ export class Cert {
         Object.assign(this, props)
     }
 
+    /**
+     * issuerIndex-receiverIndex
+     */
     @PrimaryColumn_()
     id!: string
 
@@ -20,4 +25,19 @@ export class Cert {
     @Index_()
     @ManyToOne_(() => Identity, {nullable: true})
     receiver!: Identity
+
+    /**
+     * first block
+     */
+    @Column_("int4", {nullable: false})
+    createdOn!: number
+
+    @Column_("int4", {nullable: false})
+    expireOn!: number
+
+    @OneToMany_(() => CertRenewal, e => e.cert)
+    renewal!: CertRenewal[]
+
+    @OneToMany_(() => CertRemoval, e => e.cert)
+    removal!: CertRemoval[]
 }
diff --git a/src/model/generated/certRemoval.model.ts b/src/model/generated/certRemoval.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ae951ee6eafe77a75006f42a2c73f3372c6e3647
--- /dev/null
+++ b/src/model/generated/certRemoval.model.ts
@@ -0,0 +1,22 @@
+import {Entity as Entity_, Column as Column_, PrimaryColumn as PrimaryColumn_, ManyToOne as ManyToOne_, Index as Index_} from "typeorm"
+import {Cert} from "./cert.model"
+
+/**
+ * Certification removal
+ */
+@Entity_()
+export class CertRemoval {
+    constructor(props?: Partial<CertRemoval>) {
+        Object.assign(this, props)
+    }
+
+    @PrimaryColumn_()
+    id!: string
+
+    @Index_()
+    @ManyToOne_(() => Cert, {nullable: true})
+    cert!: Cert
+
+    @Column_("int4", {nullable: false})
+    blockNumber!: number
+}
diff --git a/src/model/generated/certRenewal.model.ts b/src/model/generated/certRenewal.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..866b76fcba635a76f9f0e7d6a63e0fd9da64e808
--- /dev/null
+++ b/src/model/generated/certRenewal.model.ts
@@ -0,0 +1,22 @@
+import {Entity as Entity_, Column as Column_, PrimaryColumn as PrimaryColumn_, ManyToOne as ManyToOne_, Index as Index_} from "typeorm"
+import {Cert} from "./cert.model"
+
+/**
+ * Certification renewal
+ */
+@Entity_()
+export class CertRenewal {
+    constructor(props?: Partial<CertRenewal>) {
+        Object.assign(this, props)
+    }
+
+    @PrimaryColumn_()
+    id!: string
+
+    @Index_()
+    @ManyToOne_(() => Cert, {nullable: true})
+    cert!: Cert
+
+    @Column_("int4", {nullable: false})
+    blockNumber!: number
+}
diff --git a/src/model/generated/identity.model.ts b/src/model/generated/identity.model.ts
index 1abb30a9a7773fa177386c1ab6780de04f111c8c..9730c901dc0258da0377af62841609fccb8268a5 100644
--- a/src/model/generated/identity.model.ts
+++ b/src/model/generated/identity.model.ts
@@ -14,6 +14,9 @@ export class Identity {
         Object.assign(this, props)
     }
 
+    /**
+     * index in string format
+     */
     @PrimaryColumn_()
     id!: string
 
diff --git a/src/model/generated/index.ts b/src/model/generated/index.ts
index 318f67bd157a4fc726217b9c29d0f6ed3d41b5c9..0cc7cf77ff41a442b002eb7bb672804538c12291 100644
--- a/src/model/generated/index.ts
+++ b/src/model/generated/index.ts
@@ -10,6 +10,8 @@ export * from "./account.model"
 export * from "./transfer.model"
 export * from "./identity.model"
 export * from "./cert.model"
+export * from "./certRenewal.model"
+export * from "./certRemoval.model"
 export * from "./smithCert.model"
 export * from "./membership.model"
 export * from "./smithMembership.model"
diff --git a/src/types/account/calls.ts b/src/types/account/calls.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5a66880ed31d6c3dea36d63030fac4e689ef2cde
--- /dev/null
+++ b/src/types/account/calls.ts
@@ -0,0 +1,12 @@
+import {sts, Block, Bytes, Option, Result, CallType, RuntimeCtx} from '../support'
+
+export const unlinkIdentity =  {
+    name: 'Account.unlink_identity',
+    /**
+     * unlink the identity associated with the account
+     */
+    v700: new CallType(
+        'Account.unlink_identity',
+        sts.unit()
+    ),
+}
diff --git a/src/types/account/constants.ts b/src/types/account/constants.ts
new file mode 100644
index 0000000000000000000000000000000000000000..ee9c280bf3711a4aaaebdf4c870b4abb9a7abfa3
--- /dev/null
+++ b/src/types/account/constants.ts
@@ -0,0 +1,15 @@
+import {sts, Block, Bytes, Option, Result, ConstantType, RuntimeCtx} from '../support'
+
+export const maxNewAccountsPerBlock =  {
+    v700: new ConstantType(
+        'Account.MaxNewAccountsPerBlock',
+        sts.number()
+    ),
+}
+
+export const newAccountPrice =  {
+    v700: new ConstantType(
+        'Account.NewAccountPrice',
+        sts.bigint()
+    ),
+}
diff --git a/src/types/account/events.ts b/src/types/account/events.ts
new file mode 100644
index 0000000000000000000000000000000000000000..d9214b08170afff03757ae10eba69f4b0e6f3689
--- /dev/null
+++ b/src/types/account/events.ts
@@ -0,0 +1,58 @@
+import {sts, Block, Bytes, Option, Result, EventType, RuntimeCtx} from '../support'
+import * as v700 from '../v700'
+
+export const forceDestroy =  {
+    name: 'Account.ForceDestroy',
+    /**
+     * Force the destruction of an account because its free balance is insufficient to pay
+     * the account creation price.
+     * [who, balance]
+     */
+    v700: new EventType(
+        'Account.ForceDestroy',
+        sts.struct({
+            who: v700.AccountId32,
+            balance: sts.bigint(),
+        })
+    ),
+}
+
+export const randomIdAssigned =  {
+    name: 'Account.RandomIdAssigned',
+    /**
+     * Random id assigned
+     * [account_id, random_id]
+     */
+    v700: new EventType(
+        'Account.RandomIdAssigned',
+        sts.struct({
+            who: v700.AccountId32,
+            randomId: v700.H256,
+        })
+    ),
+}
+
+export const accountLinked =  {
+    name: 'Account.AccountLinked',
+    /**
+     * account linked to identity
+     */
+    v700: new EventType(
+        'Account.AccountLinked',
+        sts.struct({
+            who: v700.AccountId32,
+            identity: sts.number(),
+        })
+    ),
+}
+
+export const accountUnlinked =  {
+    name: 'Account.AccountUnlinked',
+    /**
+     * account unlinked from identity
+     */
+    v700: new EventType(
+        'Account.AccountUnlinked',
+        v700.AccountId32
+    ),
+}
diff --git a/src/types/account/storage.ts b/src/types/account/storage.ts
new file mode 100644
index 0000000000000000000000000000000000000000..bbb6514938ddbd6941d5ec8ef05a65f62d461c1c
--- /dev/null
+++ b/src/types/account/storage.ts
@@ -0,0 +1,38 @@
+import {sts, Block, Bytes, Option, Result, StorageType, RuntimeCtx} from '../support'
+import * as v700 from '../v700'
+
+export const pendingRandomIdAssignments =  {
+    v700: new StorageType('Account.PendingRandomIdAssignments', 'Optional', [sts.bigint()], v700.AccountId32) as PendingRandomIdAssignmentsV700,
+}
+
+export interface PendingRandomIdAssignmentsV700  {
+    is(block: RuntimeCtx): boolean
+    get(block: Block, key: bigint): Promise<(v700.AccountId32 | undefined)>
+    getMany(block: Block, keys: bigint[]): Promise<(v700.AccountId32 | undefined)[]>
+    getKeys(block: Block): Promise<bigint[]>
+    getKeys(block: Block, key: bigint): Promise<bigint[]>
+    getKeysPaged(pageSize: number, block: Block): AsyncIterable<bigint[]>
+    getKeysPaged(pageSize: number, block: Block, key: bigint): AsyncIterable<bigint[]>
+    getPairs(block: Block): Promise<[k: bigint, v: (v700.AccountId32 | undefined)][]>
+    getPairs(block: Block, key: bigint): Promise<[k: bigint, v: (v700.AccountId32 | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block): AsyncIterable<[k: bigint, v: (v700.AccountId32 | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block, key: bigint): AsyncIterable<[k: bigint, v: (v700.AccountId32 | undefined)][]>
+}
+
+export const pendingNewAccounts =  {
+    v700: new StorageType('Account.PendingNewAccounts', 'Optional', [v700.AccountId32], sts.unit()) as PendingNewAccountsV700,
+}
+
+export interface PendingNewAccountsV700  {
+    is(block: RuntimeCtx): boolean
+    get(block: Block, key: v700.AccountId32): Promise<(null | undefined)>
+    getMany(block: Block, keys: v700.AccountId32[]): Promise<(null | undefined)[]>
+    getKeys(block: Block): Promise<v700.AccountId32[]>
+    getKeys(block: Block, key: v700.AccountId32): Promise<v700.AccountId32[]>
+    getKeysPaged(pageSize: number, block: Block): AsyncIterable<v700.AccountId32[]>
+    getKeysPaged(pageSize: number, block: Block, key: v700.AccountId32): AsyncIterable<v700.AccountId32[]>
+    getPairs(block: Block): Promise<[k: v700.AccountId32, v: (null | undefined)][]>
+    getPairs(block: Block, key: v700.AccountId32): Promise<[k: v700.AccountId32, v: (null | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block): AsyncIterable<[k: v700.AccountId32, v: (null | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block, key: v700.AccountId32): AsyncIterable<[k: v700.AccountId32, v: (null | undefined)][]>
+}
diff --git a/src/types/calls.ts b/src/types/calls.ts
index dfd6803f971a99130057f729d6d80826771c9aeb..c4f3bab3a5f957ef677335bb66a32b7f874c801d 100644
--- a/src/types/calls.ts
+++ b/src/types/calls.ts
@@ -1,4 +1,5 @@
 export * as system from './system/calls'
+export * as account from './account/calls'
 export * as timestamp from './timestamp/calls'
 export * as balances from './balances/calls'
 export * as authorityMembers from './authority-members/calls'
diff --git a/src/types/constants.ts b/src/types/constants.ts
index 96c32d36067876d2cebc1150bbb30090dd61d4da..1466c12987636e0272c4164c1d359e3b21103929 100644
--- a/src/types/constants.ts
+++ b/src/types/constants.ts
@@ -1,4 +1,5 @@
 export * as system from './system/constants'
+export * as account from './account/constants'
 export * as timestamp from './timestamp/constants'
 export * as balances from './balances/constants'
 export * as transactionPayment from './transaction-payment/constants'
diff --git a/src/types/events.ts b/src/types/events.ts
index 79d8b78a7dc610c45d73bd093e0dc0d43b094d22..edd290ec3256924d5bf54eca2e7f57011df40158 100644
--- a/src/types/events.ts
+++ b/src/types/events.ts
@@ -1,4 +1,5 @@
 export * as system from './system/events'
+export * as account from './account/events'
 export * as balances from './balances/events'
 export * as transactionPayment from './transaction-payment/events'
 export * as quota from './quota/events'
diff --git a/src/types/storage.ts b/src/types/storage.ts
index 37e5a29a596a55e5bcf0bbbed3bd17766febf720..16055d3b8b6bb5bb066c16ed6ef908b44e06a226 100644
--- a/src/types/storage.ts
+++ b/src/types/storage.ts
@@ -1,4 +1,5 @@
 export * as system from './system/storage'
+export * as account from './account/storage'
 export * as timestamp from './timestamp/storage'
 export * as balances from './balances/storage'
 export * as transactionPayment from './transaction-payment/storage'
diff --git a/typegen.json b/typegen.json
index 091110bfeb92ef34ce5f52b624b88ec32671b425..958738c1a6f5bbc3b9c3517911bd863c1f82e910 100644
--- a/typegen.json
+++ b/typegen.json
@@ -38,6 +38,12 @@
       "storage": true,
       "constants": true
     },
+    "Account": {
+      "events": true,
+      "calls": true,
+      "storage": true,
+      "constants": true
+    },
     "Quota": {
       "events": true,
       "calls": true,