diff --git a/package-lock.json b/package-lock.json
index bac5a1ae1b1ee398e3ab5e2ca13ef484cdea2e35..382b9d62d8d9c2efe6672cda64d4adf02c289847 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,111 +1,17 @@
 {
-  "name": "epoc-types",
-  "version": "1.0.0",
+  "name": "@epoc/epoc-types",
+  "version": "2.0.0-beta.8",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
-      "name": "epoc-types",
-      "version": "1.0.0",
+      "name": "@epoc/epoc-types",
+      "version": "2.0.0-beta.8",
       "license": "CeCILL-B",
       "devDependencies": {
-        "typedoc": "^0.23.25",
         "typescript": "^4.9.5"
       }
     },
-    "node_modules/ansi-sequence-parser": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz",
-      "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==",
-      "dev": true
-    },
-    "node_modules/balanced-match": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
-      "dev": true
-    },
-    "node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
-      "dev": true,
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "node_modules/jsonc-parser": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
-      "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==",
-      "dev": true
-    },
-    "node_modules/lunr": {
-      "version": "2.3.9",
-      "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz",
-      "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==",
-      "dev": true
-    },
-    "node_modules/marked": {
-      "version": "4.2.12",
-      "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz",
-      "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==",
-      "dev": true,
-      "bin": {
-        "marked": "bin/marked.js"
-      },
-      "engines": {
-        "node": ">= 12"
-      }
-    },
-    "node_modules/minimatch": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz",
-      "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==",
-      "dev": true,
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/shiki": {
-      "version": "0.14.1",
-      "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.1.tgz",
-      "integrity": "sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==",
-      "dev": true,
-      "dependencies": {
-        "ansi-sequence-parser": "^1.1.0",
-        "jsonc-parser": "^3.2.0",
-        "vscode-oniguruma": "^1.7.0",
-        "vscode-textmate": "^8.0.0"
-      }
-    },
-    "node_modules/typedoc": {
-      "version": "0.23.25",
-      "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.25.tgz",
-      "integrity": "sha512-O1he153qVyoCgJYSvIyY3bPP1wAJTegZfa6tL3APinSZhJOf8CSd8F/21M6ex8pUY/fuY6n0jAsT4fIuMGA6sA==",
-      "dev": true,
-      "dependencies": {
-        "lunr": "^2.3.9",
-        "marked": "^4.2.12",
-        "minimatch": "^6.1.6",
-        "shiki": "^0.14.1"
-      },
-      "bin": {
-        "typedoc": "bin/typedoc"
-      },
-      "engines": {
-        "node": ">= 14.14"
-      },
-      "peerDependencies": {
-        "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x"
-      }
-    },
     "node_modules/typescript": {
       "version": "4.9.5",
       "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
@@ -118,110 +24,14 @@
       "engines": {
         "node": ">=4.2.0"
       }
-    },
-    "node_modules/vscode-oniguruma": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz",
-      "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==",
-      "dev": true
-    },
-    "node_modules/vscode-textmate": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz",
-      "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==",
-      "dev": true
     }
   },
   "dependencies": {
-    "ansi-sequence-parser": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz",
-      "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==",
-      "dev": true
-    },
-    "balanced-match": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
-      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
-      "dev": true
-    },
-    "brace-expansion": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
-      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
-      "dev": true,
-      "requires": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "jsonc-parser": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
-      "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==",
-      "dev": true
-    },
-    "lunr": {
-      "version": "2.3.9",
-      "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz",
-      "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==",
-      "dev": true
-    },
-    "marked": {
-      "version": "4.2.12",
-      "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz",
-      "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==",
-      "dev": true
-    },
-    "minimatch": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz",
-      "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==",
-      "dev": true,
-      "requires": {
-        "brace-expansion": "^2.0.1"
-      }
-    },
-    "shiki": {
-      "version": "0.14.1",
-      "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.1.tgz",
-      "integrity": "sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==",
-      "dev": true,
-      "requires": {
-        "ansi-sequence-parser": "^1.1.0",
-        "jsonc-parser": "^3.2.0",
-        "vscode-oniguruma": "^1.7.0",
-        "vscode-textmate": "^8.0.0"
-      }
-    },
-    "typedoc": {
-      "version": "0.23.25",
-      "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.25.tgz",
-      "integrity": "sha512-O1he153qVyoCgJYSvIyY3bPP1wAJTegZfa6tL3APinSZhJOf8CSd8F/21M6ex8pUY/fuY6n0jAsT4fIuMGA6sA==",
-      "dev": true,
-      "requires": {
-        "lunr": "^2.3.9",
-        "marked": "^4.2.12",
-        "minimatch": "^6.1.6",
-        "shiki": "^0.14.1"
-      }
-    },
     "typescript": {
       "version": "4.9.5",
       "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
       "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
       "dev": true
-    },
-    "vscode-oniguruma": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz",
-      "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==",
-      "dev": true
-    },
-    "vscode-textmate": {
-      "version": "8.0.0",
-      "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz",
-      "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==",
-      "dev": true
     }
   }
 }
diff --git a/package.json b/package.json
index f8c8777a3d718ed185fb76be6018161c7624e495..838943c6c457e3488b85faa32171a273e9d15eda 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@epoc/epoc-types",
-  "version": "2.0.0-beta.8",
+  "version": "2.0.0-beta.9",
   "description": "ePoc (Electronic Pocket Open Course) types specifications",
   "main": "dist/index.ts",
   "types": "dist/index.d.ts",
diff --git a/src/v1/badge.ts b/src/v1/badge.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6cd55ea49519fc8e0939c0b5e27174527129e8d0
--- /dev/null
+++ b/src/v1/badge.ts
@@ -0,0 +1,10 @@
+import {uid} from './types';
+import {Rule} from './rule';
+
+export interface Badge {
+    id?: uid;
+    title: string;
+    description: string;
+    icon: string;
+    rule: Rule
+}
\ No newline at end of file
diff --git a/src/v1/epoc.ts b/src/v1/epoc.ts
index e9976662b99f05466d2d3bd1cab07062ffd4525f..c8f6790342d6cd85edb7c0c0ec2126f7f84c7671 100644
--- a/src/v1/epoc.ts
+++ b/src/v1/epoc.ts
@@ -2,6 +2,7 @@ import {Author} from './author';
 import {Content} from './content';
 import {html, uid} from './types';
 import {Question} from './question';
+import {Badge} from './badge';
 
 export interface EpocMetadata {
     lastModif : string;
@@ -26,12 +27,14 @@ export interface EpocMetadata {
 }
 
 export interface Epoc extends EpocMetadata {
+    certificateBadgeCount: number;
     certificateScore: number;
     parameters: Parameters;
     plugins: string[];
     contents: Record<uid, Content>;
     chapters: Record<uid, Chapter>;
     questions: Record<uid, Question>;
+    badges: Record<uid, Badge>;
 }
 
 export interface Chapter {
diff --git a/src/v1/rule.ts b/src/v1/rule.ts
new file mode 100644
index 0000000000000000000000000000000000000000..fca5b7f10f6d236ddf46dc8d2ff5bcc3b426d9b8
--- /dev/null
+++ b/src/v1/rule.ts
@@ -0,0 +1,8 @@
+// Types to represents jsonlogic rules https://jsonlogic.com/
+export type Operators = "var" | ">" | ">=" | "<" | "<=" | "===" | "!==" | "and" | "or";
+export type Operand = number | string | boolean | Rule;
+export type Operands = string | [Operand, Operand, ...Operand[]]; // minimum 2 operands or a value if operator is var
+
+export type Rule = {
+  [key in Operators]?: Operands;
+};
diff --git a/src/v2/achievement.ts b/src/v2/achievement.ts
deleted file mode 100644
index c8884593a4458e05a417ce109f0cb201ba1bf6eb..0000000000000000000000000000000000000000
--- a/src/v2/achievement.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import {uid} from './types';
-import {Rule} from './rule'
-
-/**
-* Describe a pedagogical achievement and conditions to unlock it
-*/
-export interface Achievement {
-    /**
-     * Achievement unique id
-     */
-    id: uid;
-
-    /**
-     * Achievement title that will be shown in the course
-     */
-    title: string;
-
-    /**
-     * The rule to obtain the achievement
-     */
-    rule: Rule 
-}
diff --git a/src/v2/badge.ts b/src/v2/badge.ts
new file mode 100644
index 0000000000000000000000000000000000000000..6cd55ea49519fc8e0939c0b5e27174527129e8d0
--- /dev/null
+++ b/src/v2/badge.ts
@@ -0,0 +1,10 @@
+import {uid} from './types';
+import {Rule} from './rule';
+
+export interface Badge {
+    id?: uid;
+    title: string;
+    description: string;
+    icon: string;
+    rule: Rule
+}
\ No newline at end of file
diff --git a/src/v2/epoc.ts b/src/v2/epoc.ts
index e5e7505c4cc6555bf2095f9645c3ac06d9cc3fb5..776e753639fe8c710fb7721cedfb31e9d7719c1f 100644
--- a/src/v2/epoc.ts
+++ b/src/v2/epoc.ts
@@ -1,7 +1,7 @@
 import {Content} from './content';
 import {html, uid, uri, langcode} from './types';
 import {Question} from './question';
-import {Achievement} from './achievement';
+import {Badge} from './badge';
 
 /**
 * Contains all the ePoc metadata that can be retrieved from the library API 
@@ -136,14 +136,14 @@ export interface Epoc extends EpocMetadata {
 
     /**
      * The score to obtain the certificate
-     * @deprecated Use pedagogical achievements instead
+     * @deprecated Use badges instead
      */
     certificateScore?: number;
 
     /**
-     * Map of all contents (id, content) of the ePoc
+     * Map of all badges (id, badge) of the ePoc
      */
-    achievements: Map<uid, Achievement>
+    badges: Map<uid, Badge>
 
     /**
      * List of plugins of the ePoc
diff --git a/src/v2/index.ts b/src/v2/index.ts
index b7fb3c4193e3f61143f92abf588cc6fe74c75733..197d82d883dcf8f586305609bba0a05bf1c430b7 100644
--- a/src/v2/index.ts
+++ b/src/v2/index.ts
@@ -1,6 +1,6 @@
 export * from './epoc'
 export * from './types'
-export * from './achievement'
+export * from './badge'
 export * from './content'
 export * from './question'
 export * from './rule'
\ No newline at end of file
diff --git a/src/v2/question.ts b/src/v2/question.ts
index ec40df55716a4fb579d1173034f198a7d3877610..6f4d6600cb7b18a2a47f27d42d5eded3ec3d3117 100644
--- a/src/v2/question.ts
+++ b/src/v2/question.ts
@@ -11,7 +11,7 @@ export interface Question {
 
     /**
      * The score of this question
-     * @deprecated Use pedagogical achievements instead
+     * @deprecated Use badges instead
      */
     score: number;