diff --git a/schema.graphql b/schema.graphql
index 0a7b6ebbaf4f4446aea3686a4d8fb210c1c5698c..50e8fc91f861dbc2ec15fdf089b9387b3b377d1b 100644
--- a/schema.graphql
+++ b/schema.graphql
@@ -1,8 +1,8 @@
 type Account @entity {
-  "Account address"
+  "Account address is SS58 format"
   id: ID!
-  transfersTo: [Transfer!] @derivedFrom(field: "to")
-  transfersFrom: [Transfer!] @derivedFrom(field: "from")
+  transfersIssued: [Transfer!] @derivedFrom(field: "to")
+  transfersReceived: [Transfer!] @derivedFrom(field: "from")
   identity: Identity @derivedFrom(field: "account")
 }
 
@@ -15,20 +15,52 @@ type Transfer @entity {
   amount: BigInt! @index
 }
 
+"Identity"
 type Identity @entity {
+  "Identity index"
   index: Int! @index @unique
-  account: Account @unique # TODO non nullable
-  name: String @index # TODO non nullable
-  certIsued: [Cert!] @derivedFrom(field: "issuer")
-  certIceived: [Cert!] @derivedFrom(field: "receiver")
+  "Current account"
+  account: Account! @unique
+  "Name"
+  name: String! @index
+  "Certifications issued"
+  certIssued: [Cert!] @derivedFrom(field: "issuer")
+  "Certifications received"
+  certReceived: [Cert!] @derivedFrom(field: "receiver")
+  "Smith certifications issued"
+  smithCertIssued: [SmithCert!] @derivedFrom(field: "issuer")
+  "Smith certifications received"
+  smithCertReceived: [SmithCert!] @derivedFrom(field: "receiver")
+  "Membership of the identity"
+  membership: Membership @derivedFrom(field: "identity")
+  "Smith Membership of the identity"
+  smithMembership: SmithMembership @derivedFrom(field: "identity")
 }
 
+"Certification"
 type Cert @entity {
-  blockNumber: Int! @index
   issuer: Identity!
   receiver: Identity!
 }
 
+"Smith certification"
+type SmithCert @entity {
+  issuer: Identity!
+  receiver: Identity!
+}
+
+"Membership"
+type Membership @entity {
+  identity: Identity! @unique @index
+  expireOn: Int! @index
+}
+
+"Smith membership"
+type SmithMembership @entity {
+  identity: Identity! @unique @index
+  expireOn: Int! @index
+}
+
 # --- generic call record ---
 
 type Call @entity {
diff --git a/src/model/generated/account.model.ts b/src/model/generated/account.model.ts
index d87f34bd64e71747a543aa83ec5a6ece69867ee2..3f91cfa1c33c1219254cc546a65e9c00e55c8511 100644
--- a/src/model/generated/account.model.ts
+++ b/src/model/generated/account.model.ts
@@ -9,15 +9,15 @@ export class Account {
     }
 
     /**
-     * Account address
+     * Account address is SS58 format
      */
     @PrimaryColumn_()
     id!: string
 
     @OneToMany_(() => Transfer, e => e.to)
-    transfersTo!: Transfer[]
+    transfersIssued!: Transfer[]
 
     @OneToMany_(() => Transfer, e => e.from)
-    transfersFrom!: Transfer[]
+    transfersReceived!: Transfer[]
 
 }
diff --git a/src/model/generated/cert.model.ts b/src/model/generated/cert.model.ts
index d55e5f405c9f3c24b449ca339f7da56605aacee6..1120465d992e6674e21abb77ad0aca9ae30ab3c5 100644
--- a/src/model/generated/cert.model.ts
+++ b/src/model/generated/cert.model.ts
@@ -1,6 +1,9 @@
-import {Entity as Entity_, Column as Column_, PrimaryColumn as PrimaryColumn_, Index as Index_, ManyToOne as ManyToOne_} from "typeorm"
+import {Entity as Entity_, Column as Column_, PrimaryColumn as PrimaryColumn_, ManyToOne as ManyToOne_, Index as Index_} from "typeorm"
 import {Identity} from "./identity.model"
 
+/**
+ * Certification
+ */
 @Entity_()
 export class Cert {
     constructor(props?: Partial<Cert>) {
@@ -10,10 +13,6 @@ export class Cert {
     @PrimaryColumn_()
     id!: string
 
-    @Index_()
-    @Column_("int4", {nullable: false})
-    blockNumber!: number
-
     @Index_()
     @ManyToOne_(() => Identity, {nullable: true})
     issuer!: Identity
diff --git a/src/model/generated/identity.model.ts b/src/model/generated/identity.model.ts
index 9cfd1574c0761ad648a0fb6b031e89893b117e18..1abb30a9a7773fa177386c1ab6780de04f111c8c 100644
--- a/src/model/generated/identity.model.ts
+++ b/src/model/generated/identity.model.ts
@@ -1,7 +1,13 @@
 import {Entity as Entity_, Column as Column_, PrimaryColumn as PrimaryColumn_, Index as Index_, OneToOne as OneToOne_, JoinColumn as JoinColumn_, OneToMany as OneToMany_} from "typeorm"
 import {Account} from "./account.model"
 import {Cert} from "./cert.model"
+import {SmithCert} from "./smithCert.model"
+import {Membership} from "./membership.model"
+import {SmithMembership} from "./smithMembership.model"
 
+/**
+ * Identity
+ */
 @Entity_()
 export class Identity {
     constructor(props?: Partial<Identity>) {
@@ -11,22 +17,57 @@ export class Identity {
     @PrimaryColumn_()
     id!: string
 
+    /**
+     * Identity index
+     */
     @Index_({unique: true})
     @Column_("int4", {nullable: false})
     index!: number
 
+    /**
+     * Current account
+     */
     @Index_({unique: true})
     @OneToOne_(() => Account, {nullable: true})
     @JoinColumn_()
-    account!: Account | undefined | null
+    account!: Account
 
+    /**
+     * Name
+     */
     @Index_()
-    @Column_("text", {nullable: true})
-    name!: string | undefined | null
+    @Column_("text", {nullable: false})
+    name!: string
 
+    /**
+     * Certifications issued
+     */
     @OneToMany_(() => Cert, e => e.issuer)
-    certIsued!: Cert[]
+    certIssued!: Cert[]
 
+    /**
+     * Certifications received
+     */
     @OneToMany_(() => Cert, e => e.receiver)
-    certIceived!: Cert[]
+    certReceived!: Cert[]
+
+    /**
+     * Smith certifications issued
+     */
+    @OneToMany_(() => SmithCert, e => e.issuer)
+    smithCertIssued!: SmithCert[]
+
+    /**
+     * Smith certifications received
+     */
+    @OneToMany_(() => SmithCert, e => e.receiver)
+    smithCertReceived!: SmithCert[]
+
+    /**
+     * Membership of the identity
+     */
+
+    /**
+     * Smith Membership of the identity
+     */
 }
diff --git a/src/model/generated/index.ts b/src/model/generated/index.ts
index 9855a086291fe4426346b19e0dd71a6bffafa178..8703db3e4d33ae6f191fce19d6b7ed28b3054a97 100644
--- a/src/model/generated/index.ts
+++ b/src/model/generated/index.ts
@@ -2,5 +2,8 @@ export * from "./account.model"
 export * from "./transfer.model"
 export * from "./identity.model"
 export * from "./cert.model"
+export * from "./smithCert.model"
+export * from "./membership.model"
+export * from "./smithMembership.model"
 export * from "./call.model"
 export * from "./block.model"
diff --git a/src/model/generated/membership.model.ts b/src/model/generated/membership.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..9bec4caaa0173de55369181c0a1d53d8fc089453
--- /dev/null
+++ b/src/model/generated/membership.model.ts
@@ -0,0 +1,24 @@
+import {Entity as Entity_, Column as Column_, PrimaryColumn as PrimaryColumn_, OneToOne as OneToOne_, Index as Index_, JoinColumn as JoinColumn_} from "typeorm"
+import {Identity} from "./identity.model"
+
+/**
+ * Membership
+ */
+@Entity_()
+export class Membership {
+    constructor(props?: Partial<Membership>) {
+        Object.assign(this, props)
+    }
+
+    @PrimaryColumn_()
+    id!: string
+
+    @Index_({unique: true})
+    @OneToOne_(() => Identity, {nullable: true})
+    @JoinColumn_()
+    identity!: Identity
+
+    @Index_()
+    @Column_("int4", {nullable: false})
+    expireOn!: number
+}
diff --git a/src/model/generated/smithCert.model.ts b/src/model/generated/smithCert.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..1a22caa4046ca55d1f01c1bb8a2079455fbb8819
--- /dev/null
+++ b/src/model/generated/smithCert.model.ts
@@ -0,0 +1,23 @@
+import {Entity as Entity_, Column as Column_, PrimaryColumn as PrimaryColumn_, ManyToOne as ManyToOne_, Index as Index_} from "typeorm"
+import {Identity} from "./identity.model"
+
+/**
+ * Smith certification
+ */
+@Entity_()
+export class SmithCert {
+    constructor(props?: Partial<SmithCert>) {
+        Object.assign(this, props)
+    }
+
+    @PrimaryColumn_()
+    id!: string
+
+    @Index_()
+    @ManyToOne_(() => Identity, {nullable: true})
+    issuer!: Identity
+
+    @Index_()
+    @ManyToOne_(() => Identity, {nullable: true})
+    receiver!: Identity
+}
diff --git a/src/model/generated/smithMembership.model.ts b/src/model/generated/smithMembership.model.ts
new file mode 100644
index 0000000000000000000000000000000000000000..51a108bd780e16bf98e3be17001da5a189600c23
--- /dev/null
+++ b/src/model/generated/smithMembership.model.ts
@@ -0,0 +1,24 @@
+import {Entity as Entity_, Column as Column_, PrimaryColumn as PrimaryColumn_, OneToOne as OneToOne_, Index as Index_, JoinColumn as JoinColumn_} from "typeorm"
+import {Identity} from "./identity.model"
+
+/**
+ * Smith membership
+ */
+@Entity_()
+export class SmithMembership {
+    constructor(props?: Partial<SmithMembership>) {
+        Object.assign(this, props)
+    }
+
+    @PrimaryColumn_()
+    id!: string
+
+    @Index_({unique: true})
+    @OneToOne_(() => Identity, {nullable: true})
+    @JoinColumn_()
+    identity!: Identity
+
+    @Index_()
+    @Column_("int4", {nullable: false})
+    expireOn!: number
+}
diff --git a/src/types/cert/storage.ts b/src/types/cert/storage.ts
new file mode 100644
index 0000000000000000000000000000000000000000..eb20bb518458f617b729999ef8923fb36317ed6f
--- /dev/null
+++ b/src/types/cert/storage.ts
@@ -0,0 +1,76 @@
+import {sts, Block, Bytes, Option, Result, StorageType, RuntimeCtx} from '../support'
+import * as v700 from '../v700'
+
+export const storageIdtyCertMeta =  {
+    /**
+     *  Certifications metada by issuer
+     */
+    v700: new StorageType('Cert.StorageIdtyCertMeta', 'Default', [sts.number()], v700.IdtyCertMeta) as StorageIdtyCertMetaV700,
+}
+
+/**
+ *  Certifications metada by issuer
+ */
+export interface StorageIdtyCertMetaV700  {
+    is(block: RuntimeCtx): boolean
+    getDefault(block: Block): v700.IdtyCertMeta
+    get(block: Block, key: number): Promise<(v700.IdtyCertMeta | undefined)>
+    getMany(block: Block, keys: number[]): Promise<(v700.IdtyCertMeta | undefined)[]>
+    getKeys(block: Block): Promise<number[]>
+    getKeys(block: Block, key: number): Promise<number[]>
+    getKeysPaged(pageSize: number, block: Block): AsyncIterable<number[]>
+    getKeysPaged(pageSize: number, block: Block, key: number): AsyncIterable<number[]>
+    getPairs(block: Block): Promise<[k: number, v: (v700.IdtyCertMeta | undefined)][]>
+    getPairs(block: Block, key: number): Promise<[k: number, v: (v700.IdtyCertMeta | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block): AsyncIterable<[k: number, v: (v700.IdtyCertMeta | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block, key: number): AsyncIterable<[k: number, v: (v700.IdtyCertMeta | undefined)][]>
+}
+
+export const certsByReceiver =  {
+    /**
+     *  Certifications by receiver
+     */
+    v700: new StorageType('Cert.CertsByReceiver', 'Default', [sts.number()], sts.array(() => sts.tuple(() => [sts.number(), sts.number()]))) as CertsByReceiverV700,
+}
+
+/**
+ *  Certifications by receiver
+ */
+export interface CertsByReceiverV700  {
+    is(block: RuntimeCtx): boolean
+    getDefault(block: Block): [number, number][]
+    get(block: Block, key: number): Promise<([number, number][] | undefined)>
+    getMany(block: Block, keys: number[]): Promise<([number, number][] | undefined)[]>
+    getKeys(block: Block): Promise<number[]>
+    getKeys(block: Block, key: number): Promise<number[]>
+    getKeysPaged(pageSize: number, block: Block): AsyncIterable<number[]>
+    getKeysPaged(pageSize: number, block: Block, key: number): AsyncIterable<number[]>
+    getPairs(block: Block): Promise<[k: number, v: ([number, number][] | undefined)][]>
+    getPairs(block: Block, key: number): Promise<[k: number, v: ([number, number][] | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block): AsyncIterable<[k: number, v: ([number, number][] | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block, key: number): AsyncIterable<[k: number, v: ([number, number][] | undefined)][]>
+}
+
+export const storageCertsRemovableOn =  {
+    /**
+     *  Certifications removable on
+     */
+    v700: new StorageType('Cert.StorageCertsRemovableOn', 'Optional', [sts.number()], sts.array(() => sts.tuple(() => [sts.number(), sts.number()]))) as StorageCertsRemovableOnV700,
+}
+
+/**
+ *  Certifications removable on
+ */
+export interface StorageCertsRemovableOnV700  {
+    is(block: RuntimeCtx): boolean
+    get(block: Block, key: number): Promise<([number, number][] | undefined)>
+    getMany(block: Block, keys: number[]): Promise<([number, number][] | undefined)[]>
+    getKeys(block: Block): Promise<number[]>
+    getKeys(block: Block, key: number): Promise<number[]>
+    getKeysPaged(pageSize: number, block: Block): AsyncIterable<number[]>
+    getKeysPaged(pageSize: number, block: Block, key: number): AsyncIterable<number[]>
+    getPairs(block: Block): Promise<[k: number, v: ([number, number][] | undefined)][]>
+    getPairs(block: Block, key: number): Promise<[k: number, v: ([number, number][] | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block): AsyncIterable<[k: number, v: ([number, number][] | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block, key: number): AsyncIterable<[k: number, v: ([number, number][] | undefined)][]>
+}
diff --git a/src/types/identity/storage.ts b/src/types/identity/storage.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c5f0635381a7c4ba06f6cd20a7f229ac48a9b3e1
--- /dev/null
+++ b/src/types/identity/storage.ts
@@ -0,0 +1,131 @@
+import {sts, Block, Bytes, Option, Result, StorageType, RuntimeCtx} from '../support'
+import * as v700 from '../v700'
+
+export const identities =  {
+    /**
+     *  maps identity index to identity value
+     */
+    v700: new StorageType('Identity.Identities', 'Optional', [sts.number()], v700.IdtyValue) as IdentitiesV700,
+}
+
+/**
+ *  maps identity index to identity value
+ */
+export interface IdentitiesV700  {
+    is(block: RuntimeCtx): boolean
+    get(block: Block, key: number): Promise<(v700.IdtyValue | undefined)>
+    getMany(block: Block, keys: number[]): Promise<(v700.IdtyValue | undefined)[]>
+    getKeys(block: Block): Promise<number[]>
+    getKeys(block: Block, key: number): Promise<number[]>
+    getKeysPaged(pageSize: number, block: Block): AsyncIterable<number[]>
+    getKeysPaged(pageSize: number, block: Block, key: number): AsyncIterable<number[]>
+    getPairs(block: Block): Promise<[k: number, v: (v700.IdtyValue | undefined)][]>
+    getPairs(block: Block, key: number): Promise<[k: number, v: (v700.IdtyValue | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block): AsyncIterable<[k: number, v: (v700.IdtyValue | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block, key: number): AsyncIterable<[k: number, v: (v700.IdtyValue | undefined)][]>
+}
+
+export const counterForIdentities =  {
+    /**
+     * Counter for the related counted storage map
+     */
+    v700: new StorageType('Identity.CounterForIdentities', 'Default', [], sts.number()) as CounterForIdentitiesV700,
+}
+
+/**
+ * Counter for the related counted storage map
+ */
+export interface CounterForIdentitiesV700  {
+    is(block: RuntimeCtx): boolean
+    getDefault(block: Block): number
+    get(block: Block): Promise<(number | undefined)>
+}
+
+export const identityIndexOf =  {
+    /**
+     *  maps account id to identity index
+     */
+    v700: new StorageType('Identity.IdentityIndexOf', 'Optional', [v700.AccountId32], sts.number()) as IdentityIndexOfV700,
+}
+
+/**
+ *  maps account id to identity index
+ */
+export interface IdentityIndexOfV700  {
+    is(block: RuntimeCtx): boolean
+    get(block: Block, key: v700.AccountId32): Promise<(number | undefined)>
+    getMany(block: Block, keys: v700.AccountId32[]): Promise<(number | 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: (number | undefined)][]>
+    getPairs(block: Block, key: v700.AccountId32): Promise<[k: v700.AccountId32, v: (number | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block): AsyncIterable<[k: v700.AccountId32, v: (number | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block, key: v700.AccountId32): AsyncIterable<[k: v700.AccountId32, v: (number | undefined)][]>
+}
+
+export const identitiesNames =  {
+    /**
+     *  maps identity name to identity index (simply a set)
+     */
+    v700: new StorageType('Identity.IdentitiesNames', 'Optional', [sts.string()], sts.number()) as IdentitiesNamesV700,
+}
+
+/**
+ *  maps identity name to identity index (simply a set)
+ */
+export interface IdentitiesNamesV700  {
+    is(block: RuntimeCtx): boolean
+    get(block: Block, key: string): Promise<(number | undefined)>
+    getMany(block: Block, keys: string[]): Promise<(number | undefined)[]>
+    getKeys(block: Block): Promise<string[]>
+    getKeys(block: Block, key: string): Promise<string[]>
+    getKeysPaged(pageSize: number, block: Block): AsyncIterable<string[]>
+    getKeysPaged(pageSize: number, block: Block, key: string): AsyncIterable<string[]>
+    getPairs(block: Block): Promise<[k: string, v: (number | undefined)][]>
+    getPairs(block: Block, key: string): Promise<[k: string, v: (number | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block): AsyncIterable<[k: string, v: (number | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block, key: string): AsyncIterable<[k: string, v: (number | undefined)][]>
+}
+
+export const nextIdtyIndex =  {
+    /**
+     *  counter of the identity index to give to the next identity
+     */
+    v700: new StorageType('Identity.NextIdtyIndex', 'Default', [], sts.number()) as NextIdtyIndexV700,
+}
+
+/**
+ *  counter of the identity index to give to the next identity
+ */
+export interface NextIdtyIndexV700  {
+    is(block: RuntimeCtx): boolean
+    getDefault(block: Block): number
+    get(block: Block): Promise<(number | undefined)>
+}
+
+export const identitiesRemovableOn =  {
+    /**
+     *  maps block number to the list of identities set to be removed at this bloc
+     */
+    v700: new StorageType('Identity.IdentitiesRemovableOn', 'Default', [sts.number()], sts.array(() => sts.tuple(() => [sts.number(), v700.IdtyStatus]))) as IdentitiesRemovableOnV700,
+}
+
+/**
+ *  maps block number to the list of identities set to be removed at this bloc
+ */
+export interface IdentitiesRemovableOnV700  {
+    is(block: RuntimeCtx): boolean
+    getDefault(block: Block): [number, v700.IdtyStatus][]
+    get(block: Block, key: number): Promise<([number, v700.IdtyStatus][] | undefined)>
+    getMany(block: Block, keys: number[]): Promise<([number, v700.IdtyStatus][] | undefined)[]>
+    getKeys(block: Block): Promise<number[]>
+    getKeys(block: Block, key: number): Promise<number[]>
+    getKeysPaged(pageSize: number, block: Block): AsyncIterable<number[]>
+    getKeysPaged(pageSize: number, block: Block, key: number): AsyncIterable<number[]>
+    getPairs(block: Block): Promise<[k: number, v: ([number, v700.IdtyStatus][] | undefined)][]>
+    getPairs(block: Block, key: number): Promise<[k: number, v: ([number, v700.IdtyStatus][] | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block): AsyncIterable<[k: number, v: ([number, v700.IdtyStatus][] | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block, key: number): AsyncIterable<[k: number, v: ([number, v700.IdtyStatus][] | undefined)][]>
+}
diff --git a/src/types/index.ts b/src/types/index.ts
index 1361d462965c80fa49fcdbe96f3e494756b251d5..b637d4b9ea878b60007542731fa7d836b743bf62 100644
--- a/src/types/index.ts
+++ b/src/types/index.ts
@@ -2,3 +2,4 @@ export * as v700 from './v700'
 export * as events from './events'
 export * as calls from './calls'
 export * as constants from './constants'
+export * as storage from './storage'
diff --git a/src/types/membership/storage.ts b/src/types/membership/storage.ts
new file mode 100644
index 0000000000000000000000000000000000000000..57d70178ec9d0de728029ca12856406ab54a4aa6
--- /dev/null
+++ b/src/types/membership/storage.ts
@@ -0,0 +1,116 @@
+import {sts, Block, Bytes, Option, Result, StorageType, RuntimeCtx} from '../support'
+import * as v700 from '../v700'
+
+export const membership =  {
+    /**
+     *  maps identity id to membership data
+     */
+    v700: new StorageType('Membership.Membership', 'Optional', [sts.number()], v700.MembershipData) as MembershipV700,
+}
+
+/**
+ *  maps identity id to membership data
+ */
+export interface MembershipV700  {
+    is(block: RuntimeCtx): boolean
+    get(block: Block, key: number): Promise<(v700.MembershipData | undefined)>
+    getMany(block: Block, keys: number[]): Promise<(v700.MembershipData | undefined)[]>
+    getKeys(block: Block): Promise<number[]>
+    getKeys(block: Block, key: number): Promise<number[]>
+    getKeysPaged(pageSize: number, block: Block): AsyncIterable<number[]>
+    getKeysPaged(pageSize: number, block: Block, key: number): AsyncIterable<number[]>
+    getPairs(block: Block): Promise<[k: number, v: (v700.MembershipData | undefined)][]>
+    getPairs(block: Block, key: number): Promise<[k: number, v: (v700.MembershipData | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block): AsyncIterable<[k: number, v: (v700.MembershipData | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block, key: number): AsyncIterable<[k: number, v: (v700.MembershipData | undefined)][]>
+}
+
+export const counterForMembership =  {
+    /**
+     * Counter for the related counted storage map
+     */
+    v700: new StorageType('Membership.CounterForMembership', 'Default', [], sts.number()) as CounterForMembershipV700,
+}
+
+/**
+ * Counter for the related counted storage map
+ */
+export interface CounterForMembershipV700  {
+    is(block: RuntimeCtx): boolean
+    getDefault(block: Block): number
+    get(block: Block): Promise<(number | undefined)>
+}
+
+export const membershipsExpireOn =  {
+    /**
+     *  maps block number to the list of identity id set to expire at this block
+     */
+    v700: new StorageType('Membership.MembershipsExpireOn', 'Default', [sts.number()], sts.array(() => sts.number())) as MembershipsExpireOnV700,
+}
+
+/**
+ *  maps block number to the list of identity id set to expire at this block
+ */
+export interface MembershipsExpireOnV700  {
+    is(block: RuntimeCtx): boolean
+    getDefault(block: Block): number[]
+    get(block: Block, key: number): Promise<(number[] | undefined)>
+    getMany(block: Block, keys: number[]): Promise<(number[] | undefined)[]>
+    getKeys(block: Block): Promise<number[]>
+    getKeys(block: Block, key: number): Promise<number[]>
+    getKeysPaged(pageSize: number, block: Block): AsyncIterable<number[]>
+    getKeysPaged(pageSize: number, block: Block, key: number): AsyncIterable<number[]>
+    getPairs(block: Block): Promise<[k: number, v: (number[] | undefined)][]>
+    getPairs(block: Block, key: number): Promise<[k: number, v: (number[] | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block): AsyncIterable<[k: number, v: (number[] | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block, key: number): AsyncIterable<[k: number, v: (number[] | undefined)][]>
+}
+
+export const pendingMembership =  {
+    /**
+     *  identities with pending membership request
+     */
+    v700: new StorageType('Membership.PendingMembership', 'Optional', [sts.number()], sts.unit()) as PendingMembershipV700,
+}
+
+/**
+ *  identities with pending membership request
+ */
+export interface PendingMembershipV700  {
+    is(block: RuntimeCtx): boolean
+    get(block: Block, key: number): Promise<(null | undefined)>
+    getMany(block: Block, keys: number[]): Promise<(null | undefined)[]>
+    getKeys(block: Block): Promise<number[]>
+    getKeys(block: Block, key: number): Promise<number[]>
+    getKeysPaged(pageSize: number, block: Block): AsyncIterable<number[]>
+    getKeysPaged(pageSize: number, block: Block, key: number): AsyncIterable<number[]>
+    getPairs(block: Block): Promise<[k: number, v: (null | undefined)][]>
+    getPairs(block: Block, key: number): Promise<[k: number, v: (null | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block): AsyncIterable<[k: number, v: (null | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block, key: number): AsyncIterable<[k: number, v: (null | undefined)][]>
+}
+
+export const pendingMembershipsExpireOn =  {
+    /**
+     *  maps block number to the list of memberships set to expire at this block
+     */
+    v700: new StorageType('Membership.PendingMembershipsExpireOn', 'Default', [sts.number()], sts.array(() => sts.number())) as PendingMembershipsExpireOnV700,
+}
+
+/**
+ *  maps block number to the list of memberships set to expire at this block
+ */
+export interface PendingMembershipsExpireOnV700  {
+    is(block: RuntimeCtx): boolean
+    getDefault(block: Block): number[]
+    get(block: Block, key: number): Promise<(number[] | undefined)>
+    getMany(block: Block, keys: number[]): Promise<(number[] | undefined)[]>
+    getKeys(block: Block): Promise<number[]>
+    getKeys(block: Block, key: number): Promise<number[]>
+    getKeysPaged(pageSize: number, block: Block): AsyncIterable<number[]>
+    getKeysPaged(pageSize: number, block: Block, key: number): AsyncIterable<number[]>
+    getPairs(block: Block): Promise<[k: number, v: (number[] | undefined)][]>
+    getPairs(block: Block, key: number): Promise<[k: number, v: (number[] | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block): AsyncIterable<[k: number, v: (number[] | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block, key: number): AsyncIterable<[k: number, v: (number[] | undefined)][]>
+}
diff --git a/src/types/smith-cert/storage.ts b/src/types/smith-cert/storage.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fa2587bd90ef2aa0c710cd3e5f7ef8d561310303
--- /dev/null
+++ b/src/types/smith-cert/storage.ts
@@ -0,0 +1,76 @@
+import {sts, Block, Bytes, Option, Result, StorageType, RuntimeCtx} from '../support'
+import * as v700 from '../v700'
+
+export const storageIdtyCertMeta =  {
+    /**
+     *  Certifications metada by issuer
+     */
+    v700: new StorageType('SmithCert.StorageIdtyCertMeta', 'Default', [sts.number()], v700.IdtyCertMeta) as StorageIdtyCertMetaV700,
+}
+
+/**
+ *  Certifications metada by issuer
+ */
+export interface StorageIdtyCertMetaV700  {
+    is(block: RuntimeCtx): boolean
+    getDefault(block: Block): v700.IdtyCertMeta
+    get(block: Block, key: number): Promise<(v700.IdtyCertMeta | undefined)>
+    getMany(block: Block, keys: number[]): Promise<(v700.IdtyCertMeta | undefined)[]>
+    getKeys(block: Block): Promise<number[]>
+    getKeys(block: Block, key: number): Promise<number[]>
+    getKeysPaged(pageSize: number, block: Block): AsyncIterable<number[]>
+    getKeysPaged(pageSize: number, block: Block, key: number): AsyncIterable<number[]>
+    getPairs(block: Block): Promise<[k: number, v: (v700.IdtyCertMeta | undefined)][]>
+    getPairs(block: Block, key: number): Promise<[k: number, v: (v700.IdtyCertMeta | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block): AsyncIterable<[k: number, v: (v700.IdtyCertMeta | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block, key: number): AsyncIterable<[k: number, v: (v700.IdtyCertMeta | undefined)][]>
+}
+
+export const certsByReceiver =  {
+    /**
+     *  Certifications by receiver
+     */
+    v700: new StorageType('SmithCert.CertsByReceiver', 'Default', [sts.number()], sts.array(() => sts.tuple(() => [sts.number(), sts.number()]))) as CertsByReceiverV700,
+}
+
+/**
+ *  Certifications by receiver
+ */
+export interface CertsByReceiverV700  {
+    is(block: RuntimeCtx): boolean
+    getDefault(block: Block): [number, number][]
+    get(block: Block, key: number): Promise<([number, number][] | undefined)>
+    getMany(block: Block, keys: number[]): Promise<([number, number][] | undefined)[]>
+    getKeys(block: Block): Promise<number[]>
+    getKeys(block: Block, key: number): Promise<number[]>
+    getKeysPaged(pageSize: number, block: Block): AsyncIterable<number[]>
+    getKeysPaged(pageSize: number, block: Block, key: number): AsyncIterable<number[]>
+    getPairs(block: Block): Promise<[k: number, v: ([number, number][] | undefined)][]>
+    getPairs(block: Block, key: number): Promise<[k: number, v: ([number, number][] | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block): AsyncIterable<[k: number, v: ([number, number][] | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block, key: number): AsyncIterable<[k: number, v: ([number, number][] | undefined)][]>
+}
+
+export const storageCertsRemovableOn =  {
+    /**
+     *  Certifications removable on
+     */
+    v700: new StorageType('SmithCert.StorageCertsRemovableOn', 'Optional', [sts.number()], sts.array(() => sts.tuple(() => [sts.number(), sts.number()]))) as StorageCertsRemovableOnV700,
+}
+
+/**
+ *  Certifications removable on
+ */
+export interface StorageCertsRemovableOnV700  {
+    is(block: RuntimeCtx): boolean
+    get(block: Block, key: number): Promise<([number, number][] | undefined)>
+    getMany(block: Block, keys: number[]): Promise<([number, number][] | undefined)[]>
+    getKeys(block: Block): Promise<number[]>
+    getKeys(block: Block, key: number): Promise<number[]>
+    getKeysPaged(pageSize: number, block: Block): AsyncIterable<number[]>
+    getKeysPaged(pageSize: number, block: Block, key: number): AsyncIterable<number[]>
+    getPairs(block: Block): Promise<[k: number, v: ([number, number][] | undefined)][]>
+    getPairs(block: Block, key: number): Promise<[k: number, v: ([number, number][] | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block): AsyncIterable<[k: number, v: ([number, number][] | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block, key: number): AsyncIterable<[k: number, v: ([number, number][] | undefined)][]>
+}
diff --git a/src/types/smith-membership/storage.ts b/src/types/smith-membership/storage.ts
new file mode 100644
index 0000000000000000000000000000000000000000..5c1a4f147f22da33edcd7a77defc6e40623c5b51
--- /dev/null
+++ b/src/types/smith-membership/storage.ts
@@ -0,0 +1,116 @@
+import {sts, Block, Bytes, Option, Result, StorageType, RuntimeCtx} from '../support'
+import * as v700 from '../v700'
+
+export const membership =  {
+    /**
+     *  maps identity id to membership data
+     */
+    v700: new StorageType('SmithMembership.Membership', 'Optional', [sts.number()], v700.MembershipData) as MembershipV700,
+}
+
+/**
+ *  maps identity id to membership data
+ */
+export interface MembershipV700  {
+    is(block: RuntimeCtx): boolean
+    get(block: Block, key: number): Promise<(v700.MembershipData | undefined)>
+    getMany(block: Block, keys: number[]): Promise<(v700.MembershipData | undefined)[]>
+    getKeys(block: Block): Promise<number[]>
+    getKeys(block: Block, key: number): Promise<number[]>
+    getKeysPaged(pageSize: number, block: Block): AsyncIterable<number[]>
+    getKeysPaged(pageSize: number, block: Block, key: number): AsyncIterable<number[]>
+    getPairs(block: Block): Promise<[k: number, v: (v700.MembershipData | undefined)][]>
+    getPairs(block: Block, key: number): Promise<[k: number, v: (v700.MembershipData | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block): AsyncIterable<[k: number, v: (v700.MembershipData | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block, key: number): AsyncIterable<[k: number, v: (v700.MembershipData | undefined)][]>
+}
+
+export const counterForMembership =  {
+    /**
+     * Counter for the related counted storage map
+     */
+    v700: new StorageType('SmithMembership.CounterForMembership', 'Default', [], sts.number()) as CounterForMembershipV700,
+}
+
+/**
+ * Counter for the related counted storage map
+ */
+export interface CounterForMembershipV700  {
+    is(block: RuntimeCtx): boolean
+    getDefault(block: Block): number
+    get(block: Block): Promise<(number | undefined)>
+}
+
+export const membershipsExpireOn =  {
+    /**
+     *  maps block number to the list of identity id set to expire at this block
+     */
+    v700: new StorageType('SmithMembership.MembershipsExpireOn', 'Default', [sts.number()], sts.array(() => sts.number())) as MembershipsExpireOnV700,
+}
+
+/**
+ *  maps block number to the list of identity id set to expire at this block
+ */
+export interface MembershipsExpireOnV700  {
+    is(block: RuntimeCtx): boolean
+    getDefault(block: Block): number[]
+    get(block: Block, key: number): Promise<(number[] | undefined)>
+    getMany(block: Block, keys: number[]): Promise<(number[] | undefined)[]>
+    getKeys(block: Block): Promise<number[]>
+    getKeys(block: Block, key: number): Promise<number[]>
+    getKeysPaged(pageSize: number, block: Block): AsyncIterable<number[]>
+    getKeysPaged(pageSize: number, block: Block, key: number): AsyncIterable<number[]>
+    getPairs(block: Block): Promise<[k: number, v: (number[] | undefined)][]>
+    getPairs(block: Block, key: number): Promise<[k: number, v: (number[] | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block): AsyncIterable<[k: number, v: (number[] | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block, key: number): AsyncIterable<[k: number, v: (number[] | undefined)][]>
+}
+
+export const pendingMembership =  {
+    /**
+     *  identities with pending membership request
+     */
+    v700: new StorageType('SmithMembership.PendingMembership', 'Optional', [sts.number()], sts.unit()) as PendingMembershipV700,
+}
+
+/**
+ *  identities with pending membership request
+ */
+export interface PendingMembershipV700  {
+    is(block: RuntimeCtx): boolean
+    get(block: Block, key: number): Promise<(null | undefined)>
+    getMany(block: Block, keys: number[]): Promise<(null | undefined)[]>
+    getKeys(block: Block): Promise<number[]>
+    getKeys(block: Block, key: number): Promise<number[]>
+    getKeysPaged(pageSize: number, block: Block): AsyncIterable<number[]>
+    getKeysPaged(pageSize: number, block: Block, key: number): AsyncIterable<number[]>
+    getPairs(block: Block): Promise<[k: number, v: (null | undefined)][]>
+    getPairs(block: Block, key: number): Promise<[k: number, v: (null | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block): AsyncIterable<[k: number, v: (null | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block, key: number): AsyncIterable<[k: number, v: (null | undefined)][]>
+}
+
+export const pendingMembershipsExpireOn =  {
+    /**
+     *  maps block number to the list of memberships set to expire at this block
+     */
+    v700: new StorageType('SmithMembership.PendingMembershipsExpireOn', 'Default', [sts.number()], sts.array(() => sts.number())) as PendingMembershipsExpireOnV700,
+}
+
+/**
+ *  maps block number to the list of memberships set to expire at this block
+ */
+export interface PendingMembershipsExpireOnV700  {
+    is(block: RuntimeCtx): boolean
+    getDefault(block: Block): number[]
+    get(block: Block, key: number): Promise<(number[] | undefined)>
+    getMany(block: Block, keys: number[]): Promise<(number[] | undefined)[]>
+    getKeys(block: Block): Promise<number[]>
+    getKeys(block: Block, key: number): Promise<number[]>
+    getKeysPaged(pageSize: number, block: Block): AsyncIterable<number[]>
+    getKeysPaged(pageSize: number, block: Block, key: number): AsyncIterable<number[]>
+    getPairs(block: Block): Promise<[k: number, v: (number[] | undefined)][]>
+    getPairs(block: Block, key: number): Promise<[k: number, v: (number[] | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block): AsyncIterable<[k: number, v: (number[] | undefined)][]>
+    getPairsPaged(pageSize: number, block: Block, key: number): AsyncIterable<[k: number, v: (number[] | undefined)][]>
+}
diff --git a/src/types/storage.ts b/src/types/storage.ts
new file mode 100644
index 0000000000000000000000000000000000000000..c86ec9987ea2a50deeb45e47713f24f0b1efc1ce
--- /dev/null
+++ b/src/types/storage.ts
@@ -0,0 +1,5 @@
+export * as identity from './identity/storage'
+export * as membership from './membership/storage'
+export * as cert from './cert/storage'
+export * as smithMembership from './smith-membership/storage'
+export * as smithCert from './smith-cert/storage'
diff --git a/src/types/v700.ts b/src/types/v700.ts
index f280244833532bb0d07fa6513a4c428b54421446..72c79c073fdc280aeeac9ea57ac772dfe6eb72be 100644
--- a/src/types/v700.ts
+++ b/src/types/v700.ts
@@ -116,6 +116,84 @@ export interface BlockWeights {
     perClass: Type_96
 }
 
+export interface IdtyCertMeta {
+    issuedCount: number
+    nextIssuableOn: number
+    receivedCount: number
+}
+
+export const IdtyCertMeta: sts.Type<IdtyCertMeta> = sts.struct(() => {
+    return  {
+        issuedCount: sts.number(),
+        nextIssuableOn: sts.number(),
+        receivedCount: sts.number(),
+    }
+})
+
+export interface MembershipData {
+    expireOn: number
+}
+
+export const MembershipData: sts.Type<MembershipData> = sts.struct(() => {
+    return  {
+        expireOn: sts.number(),
+    }
+})
+
+export type IdtyStatus = IdtyStatus_ConfirmedByOwner | IdtyStatus_Created | IdtyStatus_Validated
+
+export interface IdtyStatus_ConfirmedByOwner {
+    __kind: 'ConfirmedByOwner'
+}
+
+export interface IdtyStatus_Created {
+    __kind: 'Created'
+}
+
+export interface IdtyStatus_Validated {
+    __kind: 'Validated'
+}
+
+export const IdtyStatus: sts.Type<IdtyStatus> = sts.closedEnum(() => {
+    return  {
+        ConfirmedByOwner: sts.unit(),
+        Created: sts.unit(),
+        Validated: sts.unit(),
+    }
+})
+
+export type AccountId32 = Bytes
+
+export interface IdtyValue {
+    data: IdtyData
+    nextCreatableIdentityOn: number
+    oldOwnerKey?: ([AccountId32, number] | undefined)
+    ownerKey: AccountId32
+    removableOn: number
+    status: IdtyStatus
+}
+
+export interface IdtyData {
+    firstEligibleUd: number
+}
+
+export const IdtyValue: sts.Type<IdtyValue> = sts.struct(() => {
+    return  {
+        data: IdtyData,
+        nextCreatableIdentityOn: sts.number(),
+        oldOwnerKey: sts.option(() => sts.tuple(() => [AccountId32, sts.number()])),
+        ownerKey: AccountId32,
+        removableOn: sts.number(),
+        status: IdtyStatus,
+    }
+})
+
+export const IdtyData: sts.Type<IdtyData> = sts.struct(() => {
+    return  {
+        firstEligibleUd: sts.number(),
+    }
+})
+
 export const MultiSignature: sts.Type<MultiSignature> = sts.closedEnum(() => {
     return  {
         Ecdsa: sts.bytes(),
@@ -177,8 +255,6 @@ export interface MultiAddress_Raw {
     value: Bytes
 }
 
-export type AccountId32 = Bytes
-
 export const IdtyRemovalReason: sts.Type<IdtyRemovalReason> = sts.closedEnum(() => {
     return  {
         Expired: sts.unit(),
diff --git a/typegen.json b/typegen.json
index 9263ff1d31a8f8e187228b43caa0839aa5f9ef40..1065336c24ecb0315fab6e70b880e28e1da4e304 100644
--- a/typegen.json
+++ b/typegen.json
@@ -17,31 +17,31 @@
     "Identity": {
       "events": true,
       "calls": true,
-      "storage": [],
+      "storage": true,
       "constants": true
     },
     "Cert": {
       "events": true,
       "calls": true,
-      "storage": [],
+      "storage": true,
       "constants": true
     },
     "Membership": {
       "events": true,
       "calls": true,
-      "storage": [],
+      "storage": true,
       "constants": true
     },
     "SmithCert": {
       "events": true,
       "calls": true,
-      "storage": [],
+      "storage": true,
       "constants": true
     },
     "SmithMembership": {
       "events": true,
       "calls": true,
-      "storage": [],
+      "storage": true,
       "constants": true
     }
   }