From 51cce4eca2554506e0df4849c3924f5f955a3825 Mon Sep 17 00:00:00 2001
From: vmaubert <v.maubert@code-troopers.com>
Date: Mon, 22 Aug 2022 17:45:01 +0200
Subject: [PATCH] =?UTF-8?q?refactor(substances):=20supprime=20les=20substa?=
 =?UTF-8?q?nces=20de=20la=20base=20de=20donn=C3=A9es=20(#150)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../substances--substances-legales.json       |  882 ------------
 packages/api/sources/substances-legales.json  |  385 -----
 packages/api/sources/substances.json          | 1031 -------------
 packages/api/src/api/graphql/resolvers.ts     |    8 +-
 .../substances.test.integration.ts.snap       |  998 +++++++++++++
 .../resolvers/substances.test.integration.ts  |   26 +
 .../src/api/graphql/resolvers/substances.ts   |   14 +-
 .../api/graphql/resolvers/titres-activites.ts |    8 +-
 .../api/graphql/resolvers/titres-demarches.ts |    8 +-
 .../graphql/resolvers/titres-etapes.test.ts   |   45 -
 .../api/graphql/resolvers/titres-etapes.ts    |   24 -
 .../api/src/api/graphql/resolvers/titres.ts   |   11 +-
 .../api/src/api/graphql/schemas/index.graphql |   12 +-
 .../api/graphql/schemas/substances.graphql    |   21 -
 .../api/graphql/schemas/titres-etapes.graphql |   13 +-
 .../src/api/graphql/schemas/titres.graphql    |    2 +-
 .../titres-etapes-creer.test.integration.ts   |    4 +-
 packages/api/src/api/rest/entreprises.test.ts |   36 +-
 packages/api/src/api/rest/entreprises.ts      |   24 +-
 .../src/api/rest/format/titres-activites.ts   |    2 +-
 packages/api/src/api/rest/format/titres.ts    |   10 +-
 packages/api/src/api/rest/index.ts            |   26 +-
 packages/api/src/business/matrices.ts         |    2 +-
 .../processes/titres-activites-update.ts      |    4 +-
 .../titres-etapes-heritage-props-update.ts    |    1 -
 .../titres-props-etapes-ids-update.ts         |    3 +-
 .../__mocks__/titre-activites-build-titres.ts |   19 +-
 .../titre-prop-etape-find-demarches.ts        |    4 +-
 .../business/rules/titre-activites-build.ts   |   31 +-
 .../titre-etape-heritage-props-find.test.ts   |   33 +-
 .../utils/titre-etape-heritage-props-find.ts  |   20 +-
 .../titre-etape-updation-validate.test.ts     |   27 +-
 .../titre-etape-updation-validate.ts          |    2 +-
 .../models/_format/titre-etape-heritage.ts    |    2 -
 .../src/database/models/substances-legales.ts |   37 -
 .../api/src/database/models/substances.ts     |   47 -
 .../api/src/database/models/titres-etapes.ts  |   18 +-
 packages/api/src/database/models/titres.ts    |   18 +-
 packages/api/src/database/queries/_options.ts |   13 +-
 .../src/database/queries/_titres-filters.ts   |   53 +-
 .../src/database/queries/graph/fields-add.ts  |    6 +
 .../database/queries/graph/fields-format.ts   |    5 -
 .../api/src/database/queries/substances.ts    |   31 -
 .../src/database/queries/titres-activites.ts  |   18 +-
 .../src/database/queries/titres-demarches.ts  |   18 +-
 .../api/src/database/queries/titres-etapes.ts |   10 -
 packages/api/src/database/queries/titres.ts   |   23 +-
 ...726122406_activites-fiscales-unites-fix.js |    2 +-
 ...0220816140444_substances-ordre-required.js |   27 +
 .../20220816143105_substances-delete.js       |   58 +
 packages/api/src/knex/seeds/04-substances.js  |   15 -
 packages/api/src/tools/api-openfisca/index.ts |    2 +-
 .../api/src/tools/database-to-json/tables.ts  |    7 -
 packages/api/src/types.ts                     |   32 +-
 .../_utils/administrations-permissions.ts     |    2 +-
 .../tests/queries/substance-variables.json    |    3 -
 packages/api/tests/queries/substance.graphql  |   22 -
 packages/api/tests/queries/substances.graphql |   11 -
 packages/api/tests/queries/titre.graphql      |   24 +-
 packages/api/tests/queries/titres-min.graphql |   20 +-
 .../api/tests/queries/titres-variables.json   |    2 +-
 packages/api/tests/queries/titres.graphql     |   30 +-
 packages/common/src/etape.ts                  |   26 +
 packages/common/src/fiscalite.test.ts         |    4 +-
 packages/common/src/fiscalite.ts              |    9 +-
 .../substancesFiscales.test.ts.snap           |   90 ++
 packages/common/src/static/domaines.ts        |    2 +
 packages/common/src/static/substance.test.ts  |    6 -
 .../src/static/substancesFiscales.test.ts     |   11 +
 .../{substance.ts => substancesFiscales.ts}   |   10 +-
 .../common/src/static/substancesLegales.ts    | 1013 +++++++++++++
 packages/common/src/static/unites.ts          |   28 +-
 packages/common/src/typescript-tools.ts       |    2 +
 packages/ui/src/api/fragments/substance.js    |   49 -
 packages/ui/src/api/fragments/titre-etape.js  |   26 +-
 packages/ui/src/api/fragments/titre.js        |   13 +-
 packages/ui/src/api/metas-activites.js        |   42 -
 packages/ui/src/api/metas.js                  |   14 -
 packages/ui/src/api/titres-activites.js       |    4 +-
 packages/ui/src/api/titres-demarches.js       |    9 +-
 packages/ui/src/api/titres-etapes.js          |    7 -
 packages/ui/src/api/titres.js                 |   25 +-
 .../ui/src/components/activites/filtres.js    |   15 +-
 ...ure-entreprise-dashboard.stories.storyshot |    4 +-
 .../pure-entreprise-dashboard.stories.ts      |   14 +-
 .../ui/src/components/demarches/filtres.js    |   17 +-
 .../substances-edit.stories.storyshot         | 1281 +++++++++++++++++
 packages/ui/src/components/etape/edit.vue     |    5 +-
 .../components/etape/fondamentales-edit.vue   |  116 +-
 .../ui/src/components/etape/fondamentales.vue |   30 +-
 .../ui/src/components/etape/heritage-edit.vue |   58 +-
 .../etape/substances-edit.stories.ts          |   70 +
 .../src/components/etape/substances-edit.vue  |  131 ++
 packages/ui/src/components/titre/infos.vue    |   14 +-
 packages/ui/src/components/titres/filtres.js  |   13 +-
 packages/ui/src/components/titres/map.vue     |    3 +-
 .../ui/src/components/titres/table-utils.ts   |   31 +-
 packages/ui/src/store/definitions.js          |    4 +-
 packages/ui/src/store/metas-definitions.js    |   26 -
 packages/ui/src/store/titre-etape-edition.js  |    2 -
 packages/ui/src/store/titres-activites.js     |    8 +-
 .../ui/src/store/titres-activites.test.js     |   10 +-
 packages/ui/src/store/titres-demarches.js     |   11 +-
 .../ui/src/store/titres-demarches.test.js     |   10 +-
 packages/ui/src/store/titres.js               |   12 +-
 packages/ui/src/store/titres.test.js          |    9 -
 packages/ui/src/utils/titre-etape-edit.js     |    6 +-
 .../ui/src/utils/titre-etape-edit.test.js     |    4 +-
 packages/ui/src/utils/titre-etape-save.js     |   15 +-
 .../ui/src/utils/titre-etape-save.test.js     |    4 +-
 110 files changed, 4105 insertions(+), 3500 deletions(-)
 delete mode 100644 packages/api/sources/substances--substances-legales.json
 delete mode 100644 packages/api/sources/substances-legales.json
 delete mode 100644 packages/api/sources/substances.json
 create mode 100644 packages/api/src/api/graphql/resolvers/__snapshots__/substances.test.integration.ts.snap
 create mode 100644 packages/api/src/api/graphql/resolvers/substances.test.integration.ts
 delete mode 100644 packages/api/src/api/graphql/resolvers/titres-etapes.test.ts
 delete mode 100644 packages/api/src/database/models/substances-legales.ts
 delete mode 100644 packages/api/src/database/models/substances.ts
 delete mode 100644 packages/api/src/database/queries/substances.ts
 create mode 100644 packages/api/src/knex/migrations-data/20220816140444_substances-ordre-required.js
 create mode 100644 packages/api/src/knex/migrations-schema/20220816143105_substances-delete.js
 delete mode 100644 packages/api/src/knex/seeds/04-substances.js
 delete mode 100644 packages/api/tests/queries/substance-variables.json
 delete mode 100644 packages/api/tests/queries/substance.graphql
 create mode 100644 packages/common/src/etape.ts
 create mode 100644 packages/common/src/static/__snapshots__/substancesFiscales.test.ts.snap
 delete mode 100644 packages/common/src/static/substance.test.ts
 create mode 100644 packages/common/src/static/substancesFiscales.test.ts
 rename packages/common/src/static/{substance.ts => substancesFiscales.ts} (94%)
 create mode 100644 packages/common/src/static/substancesLegales.ts
 delete mode 100644 packages/ui/src/api/fragments/substance.js
 create mode 100644 packages/ui/src/components/etape/__snapshots__/substances-edit.stories.storyshot
 create mode 100644 packages/ui/src/components/etape/substances-edit.stories.ts
 create mode 100644 packages/ui/src/components/etape/substances-edit.vue

diff --git a/packages/api/sources/substances--substances-legales.json b/packages/api/sources/substances--substances-legales.json
deleted file mode 100644
index 6d9299e89..000000000
--- a/packages/api/sources/substances--substances-legales.json
+++ /dev/null
@@ -1,882 +0,0 @@
-[
-  {
-    "substance_id": "acti",
-    "substance_legale_id": "rxxx"
-  },
-  {
-    "substance_id": "aloh",
-    "substance_legale_id": "aloh"
-  },
-  {
-    "substance_id": "amph",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "anda",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "ande",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "anhy",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "anti",
-    "substance_legale_id": "anti"
-  },
-  {
-    "substance_id": "ardo",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "argc",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "arge",
-    "substance_legale_id": "arge"
-  },
-  {
-    "substance_id": "argf",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "argk",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "args",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "arse",
-    "substance_legale_id": "arse"
-  },
-  {
-    "substance_id": "asta",
-    "substance_legale_id": "rxxx"
-  },
-  {
-    "substance_id": "auru",
-    "substance_legale_id": "auru"
-  },
-  {
-    "substance_id": "bary",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "basa",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "bery",
-    "substance_legale_id": "bery"
-  },
-  {
-    "substance_id": "bism",
-    "substance_legale_id": "bism"
-  },
-  {
-    "substance_id": "bitm",
-    "substance_legale_id": "hydm"
-  },
-  {
-    "substance_id": "bitu",
-    "substance_legale_id": "cfxx"
-  },
-  {
-    "substance_id": "buta",
-    "substance_legale_id": "skst"
-  },
-  {
-    "substance_id": "caci",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "cadm",
-    "substance_legale_id": "cadm"
-  },
-  {
-    "substance_id": "calc",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "cals",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "cend",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "ceri",
-    "substance_legale_id": "ceri"
-  },
-  {
-    "substance_id": "cesi",
-    "substance_legale_id": "cesi"
-  },
-  {
-    "substance_id": "cfan",
-    "substance_legale_id": "cfxx"
-  },
-  {
-    "substance_id": "cfch",
-    "substance_legale_id": "cfxx"
-  },
-  {
-    "substance_id": "cfho",
-    "substance_legale_id": "cfxx"
-  },
-  {
-    "substance_id": "cfli",
-    "substance_legale_id": "cfxx"
-  },
-  {
-    "substance_id": "cfxx",
-    "substance_legale_id": "cfxx"
-  },
-  {
-    "substance_id": "chro",
-    "substance_legale_id": "chro"
-  },
-  {
-    "substance_id": "coba",
-    "substance_legale_id": "coba"
-  },
-  {
-    "substance_id": "coox",
-    "substance_legale_id": "coox"
-  },
-  {
-    "substance_id": "corn",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "crai",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "cuiv",
-    "substance_legale_id": "cuiv"
-  },
-  {
-    "substance_id": "daci",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "diab",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "diam",
-    "substance_legale_id": "diam"
-  },
-  {
-    "substance_id": "diat",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "dior",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "dole",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "dolo",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "dysp",
-    "substance_legale_id": "trxx"
-  },
-  {
-    "substance_id": "erbi",
-    "substance_legale_id": "trxx"
-  },
-  {
-    "substance_id": "etai",
-    "substance_legale_id": "etai"
-  },
-  {
-    "substance_id": "ethy",
-    "substance_legale_id": "skst"
-  },
-  {
-    "substance_id": "euro",
-    "substance_legale_id": "trxx"
-  },
-  {
-    "substance_id": "falu",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "feld",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "ferx",
-    "substance_legale_id": "ferx"
-  },
-  {
-    "substance_id": "fluo",
-    "substance_legale_id": "fluo"
-  },
-  {
-    "substance_id": "gabb",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "gado",
-    "substance_legale_id": "trxx"
-  },
-  {
-    "substance_id": "gall",
-    "substance_legale_id": "gall"
-  },
-  {
-    "substance_id": "galt",
-    "substance_legale_id": "grma"
-  },
-  {
-    "substance_id": "gazn",
-    "substance_legale_id": "skst"
-  },
-  {
-    "substance_id": "geob",
-    "substance_legale_id": "geob"
-  },
-  {
-    "substance_id": "geoh",
-    "substance_legale_id": "geoh"
-  },
-  {
-    "substance_id": "geom",
-    "substance_legale_id": "geom"
-  },
-  {
-    "substance_id": "germ",
-    "substance_legale_id": "germ"
-  },
-  {
-    "substance_id": "glac",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "gnei",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "grai",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "grao",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "grap",
-    "substance_legale_id": "grap"
-  },
-  {
-    "substance_id": "gref",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "gres",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "grma",
-    "substance_legale_id": "grma"
-  },
-  {
-    "substance_id": "grsi",
-    "substance_legale_id": "grma"
-  },
-  {
-    "substance_id": "gyps",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "hafn",
-    "substance_legale_id": "hafn"
-  },
-  {
-    "substance_id": "heli",
-    "substance_legale_id": "heli"
-  },
-  {
-    "substance_id": "holm",
-    "substance_legale_id": "trxx"
-  },
-  {
-    "substance_id": "hyda",
-    "substance_legale_id": "hydx"
-  },
-  {
-    "substance_id": "hydc",
-    "substance_legale_id": "hydx"
-  },
-  {
-    "substance_id": "hydg",
-    "substance_legale_id": "skst"
-  },
-  {
-    "substance_id": "hydl",
-    "substance_legale_id": "skst"
-  },
-  {
-    "substance_id": "hydo",
-    "substance_legale_id": "hydx"
-  },
-  {
-    "substance_id": "hydr",
-    "substance_legale_id": "hydx"
-  },
-  {
-    "substance_id": "hydx",
-    "substance_legale_id": "hydx"
-  },
-  {
-    "substance_id": "indi",
-    "substance_legale_id": "indi"
-  },
-  {
-    "substance_id": "irid",
-    "substance_legale_id": "plax"
-  },
-  {
-    "substance_id": "kals",
-    "substance_legale_id": "kals"
-  },
-  {
-    "substance_id": "kaol",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "kclx",
-    "substance_legale_id": "kclx"
-  },
-  {
-    "substance_id": "lant",
-    "substance_legale_id": "trxx"
-  },
-  {
-    "substance_id": "lept",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "lith",
-    "substance_legale_id": "lith"
-  },
-  {
-    "substance_id": "lute",
-    "substance_legale_id": "trxx"
-  },
-  {
-    "substance_id": "maer",
-    "substance_legale_id": "grma"
-  },
-  {
-    "substance_id": "mais",
-    "substance_legale_id": "suco"
-  },
-  {
-    "substance_id": "mang",
-    "substance_legale_id": "mang"
-  },
-  {
-    "substance_id": "marb",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "marn",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "meba",
-    "substance_legale_id": "aloh"
-  },
-  {
-    "substance_id": "meba",
-    "substance_legale_id": "chro"
-  },
-  {
-    "substance_id": "meba",
-    "substance_legale_id": "cuiv"
-  },
-  {
-    "substance_id": "meba",
-    "substance_legale_id": "etai"
-  },
-  {
-    "substance_id": "meba",
-    "substance_legale_id": "ferx"
-  },
-  {
-    "substance_id": "meba",
-    "substance_legale_id": "mang"
-  },
-  {
-    "substance_id": "meba",
-    "substance_legale_id": "nick"
-  },
-  {
-    "substance_id": "meba",
-    "substance_legale_id": "plom"
-  },
-  {
-    "substance_id": "meba",
-    "substance_legale_id": "tita"
-  },
-  {
-    "substance_id": "meba",
-    "substance_legale_id": "zinc"
-  },
-  {
-    "substance_id": "meco",
-    "substance_legale_id": "suco"
-  },
-  {
-    "substance_id": "mepr",
-    "substance_legale_id": "arge"
-  },
-  {
-    "substance_id": "mepr",
-    "substance_legale_id": "auru"
-  },
-  {
-    "substance_id": "mepr",
-    "substance_legale_id": "plat"
-  },
-  {
-    "substance_id": "mepr",
-    "substance_legale_id": "plax"
-  },
-  {
-    "substance_id": "merc",
-    "substance_legale_id": "merc"
-  },
-  {
-    "substance_id": "mica",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "mics",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "migm",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "moly",
-    "substance_legale_id": "moly"
-  },
-  {
-    "substance_id": "mylo",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "nacl",
-    "substance_legale_id": "nacl"
-  },
-  {
-    "substance_id": "neod",
-    "substance_legale_id": "trxx"
-  },
-  {
-    "substance_id": "nick",
-    "substance_legale_id": "nick"
-  },
-  {
-    "substance_id": "niob",
-    "substance_legale_id": "niob"
-  },
-  {
-    "substance_id": "ocre",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "oooo",
-    "substance_legale_id": "oooo"
-  },
-  {
-    "substance_id": "ophi",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "osmi",
-    "substance_legale_id": "plax"
-  },
-  {
-    "substance_id": "pall",
-    "substance_legale_id": "plax"
-  },
-  {
-    "substance_id": "perl",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "phon",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "phos",
-    "substance_legale_id": "phos"
-  },
-  {
-    "substance_id": "pipe",
-    "substance_legale_id": "diam"
-  },
-  {
-    "substance_id": "plat",
-    "substance_legale_id": "plat"
-  },
-  {
-    "substance_id": "plax",
-    "substance_legale_id": "plax"
-  },
-  {
-    "substance_id": "plom",
-    "substance_legale_id": "plom"
-  },
-  {
-    "substance_id": "polo",
-    "substance_legale_id": "rxxx"
-  },
-  {
-    "substance_id": "porp",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "pouz",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "pras",
-    "substance_legale_id": "trxx"
-  },
-  {
-    "substance_id": "prom",
-    "substance_legale_id": "trxx"
-  },
-  {
-    "substance_id": "prot",
-    "substance_legale_id": "rxxx"
-  },
-  {
-    "substance_id": "prpa",
-    "substance_legale_id": "skst"
-  },
-  {
-    "substance_id": "prpy",
-    "substance_legale_id": "skst"
-  },
-  {
-    "substance_id": "pyri",
-    "substance_legale_id": "ferx"
-  },
-  {
-    "substance_id": "quar",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "quat",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "radi",
-    "substance_legale_id": "rxxx"
-  },
-  {
-    "substance_id": "rado",
-    "substance_legale_id": "rxxx"
-  },
-  {
-    "substance_id": "rard",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "rdet",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "rhen",
-    "substance_legale_id": "rhen"
-  },
-  {
-    "substance_id": "rhod",
-    "substance_legale_id": "plax"
-  },
-  {
-    "substance_id": "rhyo",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "rubi",
-    "substance_legale_id": "rubi"
-  },
-  {
-    "substance_id": "ruth",
-    "substance_legale_id": "plax"
-  },
-  {
-    "substance_id": "rxxx",
-    "substance_legale_id": "rxxx"
-  },
-  {
-    "substance_id": "saco",
-    "substance_legale_id": "grma"
-  },
-  {
-    "substance_id": "sama",
-    "substance_legale_id": "trxx"
-  },
-  {
-    "substance_id": "samg",
-    "substance_legale_id": "grma"
-  },
-  {
-    "substance_id": "sasi",
-    "substance_legale_id": "grma"
-  },
-  {
-    "substance_id": "scan",
-    "substance_legale_id": "trxx"
-  },
-  {
-    "substance_id": "scbi",
-    "substance_legale_id": "cfxx"
-  },
-  {
-    "substance_id": "schi",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "scor",
-    "substance_legale_id": "scor"
-  },
-  {
-    "substance_id": "sele",
-    "substance_legale_id": "sele"
-  },
-  {
-    "substance_id": "selg",
-    "substance_legale_id": "kclx"
-  },
-  {
-    "substance_id": "selg",
-    "substance_legale_id": "nacl"
-  },
-  {
-    "substance_id": "selp",
-    "substance_legale_id": "kclx"
-  },
-  {
-    "substance_id": "selp",
-    "substance_legale_id": "nacl"
-  },
-  {
-    "substance_id": "sels",
-    "substance_legale_id": "kclx"
-  },
-  {
-    "substance_id": "sels",
-    "substance_legale_id": "nacl"
-  },
-  {
-    "substance_id": "selx",
-    "substance_legale_id": "nacl"
-  },
-  {
-    "substance_id": "serp",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "sexs",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "sgin",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "sgra",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "sgrm",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "sgsc",
-    "substance_legale_id": "grma"
-  },
-  {
-    "substance_id": "sgsm",
-    "substance_legale_id": "grma"
-  },
-  {
-    "substance_id": "silc",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "sili",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "silx",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "skst",
-    "substance_legale_id": "skst"
-  },
-  {
-    "substance_id": "smil",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "souf",
-    "substance_legale_id": "souf"
-  },
-  {
-    "substance_id": "soxx",
-    "substance_legale_id": "soxx"
-  },
-  {
-    "substance_id": "sssc",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "stex",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "suco",
-    "substance_legale_id": "scoc"
-  },
-  {
-    "substance_id": "suco",
-    "substance_legale_id": "scof"
-  },
-  {
-    "substance_id": "suco",
-    "substance_legale_id": "scog"
-  },
-  {
-    "substance_id": "suco",
-    "substance_legale_id": "scoh"
-  },
-  {
-    "substance_id": "suco",
-    "substance_legale_id": "scos"
-  },
-  {
-    "substance_id": "suco",
-    "substance_legale_id": "scow"
-  },
-  {
-    "substance_id": "suco",
-    "substance_legale_id": "suco"
-  },
-  {
-    "substance_id": "syen",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "talc",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "tant",
-    "substance_legale_id": "tant"
-  },
-  {
-    "substance_id": "tech",
-    "substance_legale_id": "rxxx"
-  },
-  {
-    "substance_id": "tell",
-    "substance_legale_id": "tell"
-  },
-  {
-    "substance_id": "terb",
-    "substance_legale_id": "trxx"
-  },
-  {
-    "substance_id": "terv",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "thal",
-    "substance_legale_id": "thal"
-  },
-  {
-    "substance_id": "thor",
-    "substance_legale_id": "thor"
-  },
-  {
-    "substance_id": "thul",
-    "substance_legale_id": "trxx"
-  },
-  {
-    "substance_id": "tita",
-    "substance_legale_id": "tita"
-  },
-  {
-    "substance_id": "tmas",
-    "substance_legale_id": "suco"
-  },
-  {
-    "substance_id": "tour",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "trac",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "trxx",
-    "substance_legale_id": "trxx"
-  },
-  {
-    "substance_id": "tufo",
-    "substance_legale_id": "carx"
-  },
-  {
-    "substance_id": "uran",
-    "substance_legale_id": "uran"
-  },
-  {
-    "substance_id": "vana",
-    "substance_legale_id": "vana"
-  },
-  {
-    "substance_id": "wolf",
-    "substance_legale_id": "wolf"
-  },
-  {
-    "substance_id": "ytri",
-    "substance_legale_id": "trxx"
-  },
-  {
-    "substance_id": "ytte",
-    "substance_legale_id": "trxx"
-  },
-  {
-    "substance_id": "zinc",
-    "substance_legale_id": "zinc"
-  },
-  {
-    "substance_id": "zirc",
-    "substance_legale_id": "zirc"
-  }
-]
\ No newline at end of file
diff --git a/packages/api/sources/substances-legales.json b/packages/api/sources/substances-legales.json
deleted file mode 100644
index 96c05774b..000000000
--- a/packages/api/sources/substances-legales.json
+++ /dev/null
@@ -1,385 +0,0 @@
-[
-  {
-    "id": "aloh",
-    "nom": "bauxite",
-    "domaine_id": "m"
-  },
-  {
-    "id": "anti",
-    "nom": "antimoine",
-    "domaine_id": "m"
-  },
-  {
-    "id": "arge",
-    "nom": "argent",
-    "domaine_id": "m"
-  },
-  {
-    "id": "arse",
-    "nom": "arsenic",
-    "domaine_id": "m"
-  },
-  {
-    "id": "auru",
-    "nom": "or",
-    "domaine_id": "m"
-  },
-  {
-    "id": "bery",
-    "nom": "béryllium",
-    "domaine_id": "m"
-  },
-  {
-    "id": "bism",
-    "nom": "bismuth",
-    "domaine_id": "m"
-  },
-  {
-    "id": "cadm",
-    "nom": "cadmium",
-    "domaine_id": "m"
-  },
-  {
-    "id": "carx",
-    "nom": "substances de carrière",
-    "domaine_id": "c",
-    "description": "Substance minérale ou fossile qui n’est pas qualifiée de substance de mine par l’article L.111-1 du code minier. Certaines d’entres elles sont ajoutées ou retirées de la liste des substances de mine selon leur utilisation dans l’économie."
-  },
-  {
-    "id": "ceri",
-    "nom": "cérium",
-    "domaine_id": "m"
-  },
-  {
-    "id": "cesi",
-    "nom": "césium",
-    "domaine_id": "m"
-  },
-  {
-    "id": "cfxx",
-    "nom": "combustibles fossiles solides",
-    "domaine_id": "f",
-    "description": "A l'exeption de la tourbe"
-  },
-  {
-    "id": "chro",
-    "nom": "chrome",
-    "domaine_id": "m"
-  },
-  {
-    "id": "coba",
-    "nom": "cobalt",
-    "domaine_id": "m"
-  },
-  {
-    "id": "coox",
-    "nom": "gaz carbonique",
-    "domaine_id": "m",
-    "description": "A l'exception du gaz naturellement contenu dans les eaux qui sont ou qui viendraient à être utilisées pour l'alimentation humaine ou à des fins thérapeutiques"
-  },
-  {
-    "id": "cuiv",
-    "nom": "cuivre",
-    "domaine_id": "m"
-  },
-  {
-    "id": "diam",
-    "nom": "diamant",
-    "domaine_id": "m"
-  },
-  {
-    "id": "etai",
-    "nom": "étain",
-    "domaine_id": "m"
-  },
-  {
-    "id": "ferx",
-    "nom": "fer",
-    "domaine_id": "m"
-  },
-  {
-    "id": "fluo",
-    "nom": "fluorine",
-    "domaine_id": "m"
-  },
-  {
-    "id": "gall",
-    "nom": "gallium",
-    "domaine_id": "m"
-  },
-  {
-    "id": "geob",
-    "nom": "géothermie basse température",
-    "domaine_id": "g"
-  },
-  {
-    "id": "geoh",
-    "nom": "géothermie haute température",
-    "domaine_id": "g"
-  },
-  {
-    "id": "geom",
-    "nom": "géothermie de minime importance",
-    "domaine_id": "g"
-  },
-  {
-    "id": "germ",
-    "nom": "germanium",
-    "domaine_id": "m"
-  },
-  {
-    "id": "grap",
-    "nom": "graphite",
-    "domaine_id": "m"
-  },
-  {
-    "id": "grma",
-    "nom": "granulats marins",
-    "domaine_id": "w"
-  },
-  {
-    "id": "hafn",
-    "nom": "hafnium",
-    "domaine_id": "m"
-  },
-  {
-    "id": "heli",
-    "nom": "hélium",
-    "domaine_id": "m"
-  },
-  {
-    "id": "hydm",
-    "nom": "hydrocarbures solides",
-    "domaine_id": "m"
-  },
-  {
-    "id": "hydx",
-    "nom": "hydrocarbures liquides ou gazeux",
-    "domaine_id": "h",
-    "description": "A l'exeption de la tourbe"
-  },
-  {
-    "id": "indi",
-    "nom": "indium",
-    "domaine_id": "m"
-  },
-  {
-    "id": "kals",
-    "nom": "alun",
-    "domaine_id": "m"
-  },
-  {
-    "id": "kclx",
-    "nom": "sels de potassium",
-    "domaine_id": "m",
-    "description": "A l'état solide ou en dissolution, à l'exception de ceux contenus dans les eaux salées utilisées à des fins thérapeutiques ou de loisirs"
-  },
-  {
-    "id": "lith",
-    "nom": "lithium",
-    "domaine_id": "m"
-  },
-  {
-    "id": "mang",
-    "nom": "manganèse",
-    "domaine_id": "m"
-  },
-  {
-    "id": "merc",
-    "nom": "mercure",
-    "domaine_id": "m"
-  },
-  {
-    "id": "moly",
-    "nom": "molybdène",
-    "domaine_id": "m"
-  },
-  {
-    "id": "nacl",
-    "nom": "sels de sodium",
-    "domaine_id": "m",
-    "description": "A l'état solide ou en dissolution, à l'exception de ceux contenus dans les eaux salées utilisées à des fins thérapeutiques ou de loisirs"
-  },
-  {
-    "id": "nick",
-    "nom": "nickel",
-    "domaine_id": "m"
-  },
-  {
-    "id": "niob",
-    "nom": "niobium",
-    "domaine_id": "m"
-  },
-  {
-    "id": "oooo",
-    "nom": "non précisé(e)s",
-    "domaine_id": "m"
-  },
-  {
-    "id": "phos",
-    "nom": "phosphates",
-    "domaine_id": "m"
-  },
-  {
-    "id": "plat",
-    "nom": "platine",
-    "domaine_id": "m"
-  },
-  {
-    "id": "plax",
-    "nom": "métaux de la mine du platine",
-    "domaine_id": "m"
-  },
-  {
-    "id": "plom",
-    "nom": "plomb",
-    "domaine_id": "m"
-  },
-  {
-    "id": "radi",
-    "nom": "radium",
-    "domaine_id": "r"
-  },
-  {
-    "id": "rhen",
-    "nom": "rhénium",
-    "domaine_id": "m"
-  },
-  {
-    "id": "rubi",
-    "nom": "rubidium",
-    "domaine_id": "m"
-  },
-  {
-    "id": "rxxx",
-    "nom": "autres éléments radioactifs",
-    "domaine_id": "r"
-  },
-  {
-    "id": "scan",
-    "nom": "scandium",
-    "domaine_id": "m"
-  },
-  {
-    "id": "scoc",
-    "nom": "substances connexes",
-    "domaine_id": "c",
-    "description": "Substances présentes lors de l’abattage des substances principales. Elles sont à la libre disposition de l’opérateur à la condition que le titre ou l’autorisation porte la mention « et substances connexes »."
-  },
-  {
-    "id": "scof",
-    "nom": "substances connexes",
-    "domaine_id": "f",
-    "description": "Substances présentes lors de l’abattage des substances principales. Elles sont à la libre disposition de l’opérateur à la condition que le titre ou l’autorisation porte la mention « et substances connexes »."
-  },
-  {
-    "id": "scog",
-    "nom": "substances connexes",
-    "domaine_id": "g",
-    "description": "Substances présentes lors de l’abattage des substances principales. Elles sont à la libre disposition de l’opérateur à la condition que le titre ou l’autorisation porte la mention « et substances connexes »."
-  },
-  {
-    "id": "scoh",
-    "nom": "substances connexes",
-    "domaine_id": "h",
-    "description": "Substances présentes lors de l’abattage des substances principales. Elles sont à la libre disposition de l’opérateur à la condition que le titre ou l’autorisation porte la mention « et substances connexes »."
-  },
-  {
-    "id": "scor",
-    "nom": "substances connexes",
-    "domaine_id": "r",
-    "description": "Substances présentes lors de l’abattage des substances principales. Elles sont à la libre disposition de l’opérateur à la condition que le titre ou l’autorisation porte la mention « et substances connexes »."
-  },
-  {
-    "id": "scos",
-    "nom": "substances connexes",
-    "domaine_id": "s",
-    "description": "Substances présentes lors de l’abattage des substances principales. Elles sont à la libre disposition de l’opérateur à la condition que le titre ou l’autorisation porte la mention « et substances connexes »."
-  },
-  {
-    "id": "scow",
-    "nom": "substances connexes",
-    "domaine_id": "w",
-    "description": "Substances présentes lors de l’abattage des substances principales. Elles sont à la libre disposition de l’opérateur à la condition que le titre ou l’autorisation porte la mention « et substances connexes »."
-  },
-  {
-    "id": "sele",
-    "nom": "sélénium",
-    "domaine_id": "m"
-  },
-  {
-    "id": "skst",
-    "nom": "stockage souterrain",
-    "domaine_id": "s"
-  },
-  {
-    "id": "souf",
-    "nom": "soufre",
-    "domaine_id": "m"
-  },
-  {
-    "id": "soxx",
-    "nom": "sulfates non alcalino-terreux",
-    "domaine_id": "m"
-  },
-  {
-    "id": "suco",
-    "nom": "substances connexes",
-    "domaine_id": "m"
-  },
-  {
-    "id": "tant",
-    "nom": "tantale",
-    "domaine_id": "m"
-  },
-  {
-    "id": "tell",
-    "nom": "tellure",
-    "domaine_id": "m"
-  },
-  {
-    "id": "thal",
-    "nom": "thallium",
-    "domaine_id": "m"
-  },
-  {
-    "id": "thor",
-    "nom": "thorium",
-    "domaine_id": "r"
-  },
-  {
-    "id": "tita",
-    "nom": "titane",
-    "domaine_id": "m"
-  },
-  {
-    "id": "trxx",
-    "nom": "autres éléments des terres rares",
-    "domaine_id": "m"
-  },
-  {
-    "id": "uran",
-    "nom": "uranium",
-    "domaine_id": "r"
-  },
-  {
-    "id": "vana",
-    "nom": "vanadium",
-    "domaine_id": "m"
-  },
-  {
-    "id": "wolf",
-    "nom": "tungstène",
-    "domaine_id": "m"
-  },
-  {
-    "id": "zinc",
-    "nom": "zinc",
-    "domaine_id": "m"
-  },
-  {
-    "id": "zirc",
-    "nom": "zirconium",
-    "domaine_id": "m"
-  }
-]
\ No newline at end of file
diff --git a/packages/api/sources/substances.json b/packages/api/sources/substances.json
deleted file mode 100644
index 00e62126c..000000000
--- a/packages/api/sources/substances.json
+++ /dev/null
@@ -1,1031 +0,0 @@
-[
-  {
-    "id": "acti",
-    "nom": "actinium",
-    "symbole": "Ac"
-  },
-  {
-    "id": "aloh",
-    "nom": "bauxite",
-    "symbole": "Al"
-  },
-  {
-    "id": "amph",
-    "nom": "amphibolite",
-    "gerep": 1401,
-    "description": "Roche métamorphique présentant de bonnes caractéristiques géomécaniques, de couleur sombre (gris à vert foncé) riche en silicates calciques et ferromagnésiens (essentiellement hornblende, mais aussi feldspath plagioclase) et de minéraux annexes (pyroxène, micas). Elle est utilisée comme roche ornementale et de construction et comme granulat."
-  },
-  {
-    "id": "anda",
-    "nom": "andalousite / sillimanite / kyanite - (cyanite - disthène)",
-    "gerep": 2002,
-    "description": "Minéral - Silicate d'alumine (SiAl2O5). L'andalousite, la silimanite et la Kyanite (Cyanite ou Disthème) ont la même composition chimique mais avec une structure cristalline et des propriétés physico-minéraloriques différentes (triclinique) autrement dit une variété allotropique (même formule chimique mais système cristallin différent). En France, on ne connait pas de gisement de Kyanite à ce jour. L'andalousite et la silimanite y sont exploitées et sont utilisées dans l'industrie. L'andalousite est utilisée pour ses propriétés réfractaires et son excellente résistance aux chocs thermiques. La silimanite, utilisée pour le même usage réfractaire, a toutefois des propriétés physico-minéraloriques sensiblement différentes de l'andalousite."
-  },
-  {
-    "id": "ande",
-    "nom": "andésite",
-    "gerep": 1301,
-    "description": "Roche volcanique de couleur gris-clair constituée de cristaux de silicates (plagioclases, biotite, hornblende, pyroxène) dans une matrice vitreuse, avec une bonne homogénéité texturale. Elle présente une bonne résistance mécanique et à l'abrasion."
-  },
-  {
-    "id": "anhy",
-    "nom": "anhydrite",
-    "gerep": 2003,
-    "description": "Forme anhydre (CaSO4) du sulfate de calcium hydraté (gypse), utilisée comme charge dans l'industrie des peintures, plastiques et comme régulateur de prise dans les ciments, plus rarement comme amendement."
-  },
-  {
-    "id": "anti",
-    "nom": "antimoine",
-    "symbole": "Sb"
-  },
-  {
-    "id": "ardo",
-    "nom": "ardoises",
-    "gerep": 1402,
-    "description": "Roche schistosée, à l'origine une argile, ayant subi un faible métamorphisme. Variétés gris-bleuté à noire dont la texture (à grains très fin et homogène) et la fissillité (débit en plaques fines) sont mis à profit pour la fabrication d'éléments de toiture, de parement et de dallage pour les variétés plus gréseuses (autres utilisations possibles: additifs pour la fabrication du clinker et des ciments)."
-  },
-  {
-    "id": "argc",
-    "nom": "argiles communes",
-    "gerep": 1101,
-    "description": "Roche sédimentaire tendre à grain très fin, constituée de minéraux argileux à dominante de smectites-illites, ainsi que d'autres minéraux (quartz, oxydes...) de couleur gris-foncé, brune, jaune-oranger ou rougeâtre. Elles forment une pâte en présence d'eau et durcissent à la cuisson (terres-cuites). peuvent être utilisées (10 à 20%) dans la fabrication du clinker, constituant de base de tous les ciments."
-  },
-  {
-    "id": "arge",
-    "nom": "argent",
-    "symbole": "Ag"
-  },
-  {
-    "id": "argf",
-    "nom": "argiles fibreuses (attapulgites ou palygorskites, sépiolites)",
-    "gerep": 1103,
-    "description": "Roches sédimentaires tendre à grains fins, constituées majoritairement d'argiles alumino-magnésiennes (fibres de 1 à 3 µm de long et de 100 à 300 Angstroms de large. La différence entre la largeur des fibres permet de différentier les sépiolites des attapulgites). L'existence de micropores entre les fibres, confèrent à ces argiles une grande capacité d'absorption."
-  },
-  {
-    "id": "argk",
-    "nom": "argiles kaoliniques",
-    "gerep": 1102,
-    "description": "Roche sédimentaire tendre à grains très fins constituée principalement de kaolinite (minéral argileux blanc à crème) utilisée pour ses propriétés en céramiques communes (sanitaires) et pour matériaux réfractaires (fabrication de chamottes)."
-  },
-  {
-    "id": "args",
-    "nom": "argiles",
-    "gerep": 1104,
-    "description": "Roches sédimentaires peu consolidées formées de minéraux argileux comme la montmorillonite (silicate d'aluminium et de magnésium hydraté) et la beidellite (silicate naturel d'aluminium hydraté). Ces phyllosilicates ont des propriétés physico-chimiques (gonflement en présence d'eau, rhéologie, adsorption, échanges cationiques...) avec de nombreuses applications dans les secteurs industriels (chimie, métallurgie, environnement, produit de collage en œnologie pour l'élimination des protéines des vins blancs et rosés. Synonyme : bentonite, \"terre à foulon\"."
-  },
-  {
-    "id": "arse",
-    "nom": "arsenic",
-    "symbole": "As"
-  },
-  {
-    "id": "asta",
-    "nom": "astate",
-    "symbole": "At"
-  },
-  {
-    "id": "auru",
-    "nom": "or",
-    "symbole": "Au"
-  },
-  {
-    "id": "bary",
-    "nom": "barytine",
-    "gerep": 2004,
-    "description": "Minéral - Sulfate de baryum (BaSO4) présentant une forte densité (4,5) et une bonne inertie chimique utilisé comme charge minérale dans les boues de forage, les bétons spéciaux des installations nucléaires (radioprotection) et certaines peintures industrielles."
-  },
-  {
-    "id": "basa",
-    "nom": "basalte",
-    "gerep": 1302,
-    "description": "Roche volcanique dure et massive de couleur gris-foncé à noire, constituée de fin cristaux (pyroxène et olivine) dans une masse vitreuse. Excellentes propriétés mécaniques (dureté), utilisation en tant que granulats et roche ornementale et de construction."
-  },
-  {
-    "id": "bery",
-    "nom": "béryllium",
-    "symbole": "Be"
-  },
-  {
-    "id": "bism",
-    "nom": "bismuth",
-    "symbole": "Bi"
-  },
-  {
-    "id": "bitm",
-    "nom": "calcaires bitumineux",
-    "description": "Bitumes à usages non énergétiques"
-  },
-  {
-    "id": "bitu",
-    "nom": "bitume"
-  },
-  {
-    "id": "buta",
-    "nom": "butane"
-  },
-  {
-    "id": "caci",
-    "nom": "calcaires cimentiers",
-    "gerep": 1105
-  },
-  {
-    "id": "cadm",
-    "nom": "cadmium",
-    "symbole": "Cd"
-  },
-  {
-    "id": "calc",
-    "nom": "calcaires",
-    "gerep": 1105,
-    "description": "Roche sédimentaire (couleur blanc-beige-gris) principalement constituée de calcite (carbonate de calcium (CaCO3) faisant effervescence à l'acide). Caractéristiques pétrophysiques et géomécaniques très hétérogènes en fonction de la cristallinité, porosité, teneur en autres constituants (argiles, quartz...). Pour les variétés de haute pureté et blancheur, utilisations comme charges minérales. Autres utilisations : sidérurgie, verrerie, amendements, principale matière première pour la fabrication du clinker et de la chaux. Elle est également très employée en tant pierre ornementale et de construction et pour les granulats."
-  },
-  {
-    "id": "cals",
-    "nom": "calcschiste",
-    "gerep": 1403,
-    "description": "Roche métamorphique, d'aspect rubané, provenant de formations argileuses plus ou moins carbonatées comme les marnes et calcaires marneux. Peut être utilisée comme matière première en remplacement du calcaire et/ou des marnes dans la fabrication du clinker, le constituant de base des ciments."
-  },
-  {
-    "id": "cend",
-    "nom": "cendres volcaniques riches en silice",
-    "gerep": 1303,
-    "description": "Roche volcanique formée de fragments généralement à grains fins, peu indurée (pulvérulente) ou indurée. Elle est utilisée en tant que granulats ou comme roches ornementales et de construction."
-  },
-  {
-    "id": "ceri",
-    "nom": "cérium",
-    "symbole": "Ce"
-  },
-  {
-    "id": "cesi",
-    "nom": "césium",
-    "symbole": "Cs"
-  },
-  {
-    "id": "cfan",
-    "nom": "anthracite"
-  },
-  {
-    "id": "cfch",
-    "nom": "charbon"
-  },
-  {
-    "id": "cfho",
-    "nom": "houille"
-  },
-  {
-    "id": "cfli",
-    "nom": "lignite"
-  },
-  {
-    "id": "cfxx",
-    "nom": "combustibles fossiles"
-  },
-  {
-    "id": "chro",
-    "nom": "chrome",
-    "symbole": "Cr"
-  },
-  {
-    "id": "coba",
-    "nom": "cobalt",
-    "symbole": "Co"
-  },
-  {
-    "id": "coox",
-    "nom": "gaz carbonique",
-    "symbole": "CO2"
-  },
-  {
-    "id": "corn",
-    "nom": "cornéenne",
-    "gerep": 1404,
-    "description": "Roche métamorphique cristalline plus ou moins orientée, habituellement très dure produite sous l'action de la chaleur d'un magma en fusion (métamorphisme de contact). Les grains sont d'une grosseur homogène et ne suivent pas une orientation préférentielle. Leur composition minéralogique varie selon le degré de métamorphisme et la nature des roches initiales. Elles présentent en général de bonnes résistances au choc et à l'abrasion."
-  },
-  {
-    "id": "crai",
-    "nom": "craie",
-    "gerep": 1106,
-    "description": "Roche sédimentaire fine, tendre, friable, de couleur blanche, composée de calcite(CaCO3) d'origine fossilifère. En amendement, est utilisée sous forme pulvérisée, broyée, concassée ou brute pour corriger les sols acides. En liant hydraulique, elle est utilisée dans des proportions de 80 à 90% dans la fabrication du clinker, le constituant de base du ciment mais sert également à la fabrication de chaux et de mortier. Pour les minéraux industriels, la pureté et la blancheur autorisent une utilisation comme charge minérale."
-  },
-  {
-    "id": "cuiv",
-    "nom": "cuivre",
-    "symbole": "Cu"
-  },
-  {
-    "id": "daci",
-    "nom": "dacite",
-    "gerep": 1304,
-    "description": "Roche volcanique de couleur gris-clair constituée de fins cristaux de quartz, plagioclase et silicates ferro-magnésiens baignant dans un verre. Elle est utilisée comme roche ornementale ou de construction et comme granulat."
-  },
-  {
-    "id": "diab",
-    "nom": "diabase",
-    "gerep": 1405,
-    "description": "Roche métamorphique dure, d'origine volcanique à grain fin de couleur sombre (issue de dolérite). Elle est utilisé comme granulat."
-  },
-  {
-    "id": "diam",
-    "nom": "diamant"
-  },
-  {
-    "id": "diat",
-    "nom": "diatomites",
-    "gerep": 1108,
-    "description": "Roche sédimentaire tendre et légère formée par accumulation de carapaces siliceuses de micro-organismes en milieux lacustes ou marins. Utilisations industrielles : filtration de liquides alimentaires, charge minérale, absorbant de pollutions. En liant hydraulique, elle peut être utilisée comme additifs pour la fabrication de certains ciments."
-  },
-  {
-    "id": "dior",
-    "nom": "diorites",
-    "gerep": 1201,
-    "description": "Roche plutonique cristalline à texture grenue et homogène, constituée de feldspaths blanchâtres et de silicates ferro-magnésiens colorés (amphiboles, biotite...). En roche ornemental et de construction, elle est sélectionnée pour son aspect décoratif. En granulat, cette roche présente de bonnes caractéristiques mécaniques."
-  },
-  {
-    "id": "dole",
-    "nom": "dolérite",
-    "gerep": 1305,
-    "description": "Roche volcanique massive, compacte, de couleur sombre (grise à noire), composée de fins cristaux de feldspaths calciques, de pyroxène et parfois d'oxydes de fer. Elle est utilisée en tant que granulats ou en roche ornementale et de construction. On la trouve en association possible des dolérites altérées (diabases issues du métamorphisme des dolérites)."
-  },
-  {
-    "id": "dolo",
-    "nom": "dolomie",
-    "gerep": 1109,
-    "description": "Roche sédimentaire constituée principalement de dolomite (carbonate double de calcium et de magnésium). Utilisée comme charge minérale dans de nombreuses applications : peintures et enduits, élastomères, papiers et revêtements de sol ou dans l'industrie du verre. Au regard de ses propriétés chimiques, est utilisée comme amendement sous forme pulvérisée, broyée, pour corriger le pH des sols acides."
-  },
-  {
-    "id": "dysp",
-    "nom": "dysprosium",
-    "symbole": "Dy"
-  },
-  {
-    "id": "erbi",
-    "nom": "erbium",
-    "symbole": "Er"
-  },
-  {
-    "id": "etai",
-    "nom": "étain",
-    "symbole": "Sn"
-  },
-  {
-    "id": "ethy",
-    "nom": "éthylène"
-  },
-  {
-    "id": "euro",
-    "nom": "europium",
-    "symbole": "Eu"
-  },
-  {
-    "id": "falu",
-    "nom": "faluns",
-    "gerep": 1129,
-    "description": "Roche sédimentaire meuble d'origine détritique riche en débris de coquilles d'animaux marins. Facilement délitable et transformée en sable, elle est utilisée en tant qu'amendement agricole en substitution de carbonate de calcium ou de calcite. Par le passé, cette roche a été utilisée comme sarcophage pour conserver les corps au regard de sa porosité qui permet d'éviter la putréfaction des chairs et d'absorber les exudats."
-  },
-  {
-    "id": "feld",
-    "nom": "feldspaths",
-    "gerep": 2007,
-    "description": "Minéral - Principal constituant de nombreuses roches magmatiques dont la composition varie entre des pôles potassique (KAlSi3O8), sodique (NaAlSi3O8) et calcique (CaAl2Si2O8), utilisé en céramique et dans la verrerie."
-  },
-  {
-    "id": "ferx",
-    "nom": "fer",
-    "symbole": "Fe"
-  },
-  {
-    "id": "fluo",
-    "nom": "fluorine",
-    "symbole": "F"
-  },
-  {
-    "id": "gabb",
-    "nom": "gabbro",
-    "gerep": 1202,
-    "description": "Roche plutonique grenue de couleur sombre, contenant des feldspaths calciques et du pyroxène (olivine, biotite et hornblende associés). Cette roche présente généralement de bonnes caractéristiques mécaniques qui la rendent utilisable comme roche ornementale et de construction et comme granulat."
-  },
-  {
-    "id": "gado",
-    "nom": "gadolinium",
-    "symbole": "Gd"
-  },
-  {
-    "id": "gall",
-    "nom": "gallium",
-    "symbole": "Ga"
-  },
-  {
-    "id": "galt",
-    "nom": "galets",
-    "gerep": 1118,
-    "description": "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat."
-  },
-  {
-    "id": "gazn",
-    "nom": "gaz naturel"
-  },
-  {
-    "id": "geob",
-    "nom": "gîtes géothermiques basse température"
-  },
-  {
-    "id": "geoh",
-    "nom": "gîtes géothermiques haute température"
-  },
-  {
-    "id": "geom",
-    "nom": "activités géothermiques de minime importance"
-  },
-  {
-    "id": "germ",
-    "nom": "germanium",
-    "symbole": "Ge"
-  },
-  {
-    "id": "glac",
-    "nom": "dépôt glaciaire",
-    "gerep": 1107,
-    "description": "Mélange de roches sédimentaires détritiques hétérogènes d'origine glaciaire constituées de fragments hétérométriques, unis par un ciment naturel (moraines et tillites). Les moraines se présentent sous forme de blocs, de cailloux de sables et d'argiles. Elles peuvent être valorisées comme granulat. Les tillites sont des conglomérats à éléments arrondis et anguleux, suffisamment indurées (dures) pour être valorisées également comme granulat ou comme roche ornementale et de construction."
-  },
-  {
-    "id": "gnei",
-    "nom": "gneiss",
-    "gerep": 1406,
-    "description": "Roche métamorphique cristalline à faciès rubanné ou lenticulaire (alternance de lits clairs quartzo-feldspathiques et de lits sombres à micas, amphiboles et pyroxènes). Utilisée en tant que granulats pour ses propriétés mécaniques ou en tant que roche ornementale et de construction pour son aspect décoratif."
-  },
-  {
-    "id": "grai",
-    "nom": "granite et granulite",
-    "gerep": 1203,
-    "description": "Roche plutonique cristalline à texture grenue de couleur claire (gris, rose ou jaune) composée de quartz, feldspaths et micas, sélectionnée pour son aspect décoratif. Pour les roches ornementales et de construction, une définition \"commerciale\" existe également et est différente de celle-ci dite \"acceptation scientifique\" (cf. point 2.1.156 NF EN 12670 : 2001 page 16). Pour les granulats, cette roche présente de bonnes caractéristiques de rugosité. Pour les minéraux industriels, cette roche rendue friable par l'altération (arénisation) facilite l'extraction de tout ou partie de ses constituants (quartz, feldspaths et micas). Nota : Le terme GRANULITE était utilisé autrefois pour désigner des granites de couleur claire à 2 micas (noir et blanc). qui sont valorisées pour leur aspect esthétique dans le domaine des roches ornementales et de construction."
-  },
-  {
-    "id": "grao",
-    "nom": "granodiorite",
-    "gerep": 1204,
-    "description": "Roche plutonique grenue dont la composition est intermédiaire entre le granite et la diorite. Elle est principalement constituée de quartz (> 10 %) et de feldspaths de couleur claire. Les minéraux secondaires sont la biotite (grains sombres vert, brun ou noir), l'amphibole et le pyroxène. La Pierre de Rosette qui permit de percer le mystère des hiéroglyphes est en granodiorite."
-  },
-  {
-    "id": "grap",
-    "nom": "graphite"
-  },
-  {
-    "id": "gref",
-    "nom": "grès silico-ferrugineux",
-    "gerep": 1111,
-    "description": "Roche sédimentaire de couleur brun-orangé constituée d'un mélange de silice et d'oxydes et hydroxydes de fer, utilisée en tant que minéraux industriels, comme agent colorant en céramique."
-  },
-  {
-    "id": "gres",
-    "nom": "grès",
-    "gerep": 1110,
-    "description": "Roche sédimentaire plus ou moins indurée et stratifiée, composée de grains de quartz d'origine détritique (d'une taille comprise entre 63 µm et 2 mm) soudés par un ciment interstitiel de nature variable (calcite, oxydes de fer, silice, minéraux argileux). Dans le domaine des granulats et des roches ornementales et de construction, les propriétés mécaniques et l'aspect esthétique sont valorisés. Dans le domaine des minéraux industriels, elle est utilisée comme source de silice pour la production de ferro-silicium."
-  },
-  {
-    "id": "grma",
-    "nom": "granulats marins"
-  },
-  {
-    "id": "grsi",
-    "nom": "graviers siliceux",
-    "gerep": 1118,
-    "description": "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat."
-  },
-  {
-    "id": "gyps",
-    "nom": "gypse",
-    "gerep": 2008,
-    "description": "Minéral - Sulfate de calcium hydraté (CaSO4,2H2O). Dans le domaine des liants hydrauliques, ce minéral est utilisé pour la fabrication du plâtre et comme régulateur de prise dans les ciments. Dans le domaine des minéraux industriel, sa pureté chimique et ses caractéristiques physiques comme la blancheur lui permettent d'être utilisé comme charge minérale. Dans le domaine de l'amendement, sa propriété chimique (base) est utilisée pour corriger les sols acides."
-  },
-  {
-    "id": "hafn",
-    "nom": "hafnium",
-    "symbole": "Hf"
-  },
-  {
-    "id": "heli",
-    "nom": "hélium",
-    "symbole": "He"
-  },
-  {
-    "id": "holm",
-    "nom": "holmium",
-    "symbole": "Ho"
-  },
-  {
-    "id": "hyda",
-    "nom": "asphalte"
-  },
-  {
-    "id": "hydc",
-    "nom": "hydrocarbures conventionnels liquides ou gazeux"
-  },
-  {
-    "id": "hydg",
-    "nom": "gaz combustible"
-  },
-  {
-    "id": "hydl",
-    "nom": "hydrocarbures liquides"
-  },
-  {
-    "id": "hydo",
-    "nom": "hydrocarbures liquides"
-  },
-  {
-    "id": "hydr",
-    "nom": "hydrocarbures"
-  },
-  {
-    "id": "hydx",
-    "nom": "hydrocarbures liquides ou gazeux"
-  },
-  {
-    "id": "indi",
-    "nom": "indium",
-    "symbole": "In"
-  },
-  {
-    "id": "irid",
-    "nom": "iridium",
-    "symbole": "Ir"
-  },
-  {
-    "id": "kals",
-    "nom": "alun"
-  },
-  {
-    "id": "kaol",
-    "nom": "kaolin",
-    "gerep": 2009,
-    "description": "Minéral - Extrait de roches granitiques ou sédimentaires composées principalement de kaolinite (silicate d'alumine hydraté Al2Si2O5(OH)4). Le kaolin est utilisé pour sa grande pureté et sa blancheur en céramique (porcelaine) ou comme charges minérales (papier, peinture, etc.). Il peut être également utilisé comme matière première en remplacement de l'argile dans la fabrication de certains clinkers pour ciments blancs (Portland)."
-  },
-  {
-    "id": "kclx",
-    "nom": "sels de potassium",
-    "symbole": "K"
-  },
-  {
-    "id": "lant",
-    "nom": "lanthane",
-    "symbole": "La"
-  },
-  {
-    "id": "lept",
-    "nom": "leptynite",
-    "gerep": 1407,
-    "description": "Roche métamorphique cristallisée et orientée de couleur claire composée de quartz, feldspath et micas en faible quantité présentant une bonne résistance mécanique."
-  },
-  {
-    "id": "lith",
-    "nom": "lithium",
-    "symbole": "Li"
-  },
-  {
-    "id": "lute",
-    "nom": "lutécium",
-    "symbole": "Lu"
-  },
-  {
-    "id": "maer",
-    "nom": "maërl",
-    "gerep": 1118,
-    "description": "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat."
-  },
-  {
-    "id": "mais",
-    "nom": "minerais"
-  },
-  {
-    "id": "mang",
-    "nom": "manganèse",
-    "symbole": "Mn"
-  },
-  {
-    "id": "marb",
-    "nom": "marbres",
-    "gerep": 1408,
-    "description": "Roche métamorphique cristalline plus ou moins rubanée, contenant plus de 50 % de carbonates (calcite et plus rarement dolomite) dans laquelle les minéraux ont totalement recristallisé avec des traces d'oxydes métalliques ou d'impuretés lui donnant une grande variété de couleurs. Le métamorphisme de cette roche lui confère une plus grande dureté. Dans le domaine des roches ornementales, elle est sélectionnée pour son aspect décoratif, la recristallisation de ses composants favorise son polissage. Une définition \"commerciale\" existe également et est différente de celle-ci dite \"acceptation scientifique\" (cf. point 2.1.243 NF EN 12670 : 2001 page 22). Dans le domaine des granulats, elle est sélectionnée pour ses propriétés mécaniques (dureté, résistance aux chocs). Dans le domaine des liants hydrauliques, elle peut être utilisée comme matière première en remplacement du calcaire dans la fabrication du clinker, le constituant de base des ciments. Dans le domaine de l'amendement les composants calciques ou magnésiens sont particulièrement utiles pour la correction de pH des milieux acides. Dans le domaine des minéraux industriels, elle est utilisée, après calcination en carbonate de calcium, comme: - charge minérale dans de nombreuses applications industrielles (papier, peinture, plastiques, élastomères) - ou transformée en chaux pour la correction de pH des milieux acides."
-  },
-  {
-    "id": "marn",
-    "nom": "marnes",
-    "gerep": 1112,
-    "description": "Roche sédimentaire plus ou moins indurée (dure) et stratifiée (couches successives de sédiments) composée d'un mélange de carbonate de calcium (CaCO3) et d'argiles de différentes natures (de 35% à 65%). Usages : Dans le domaine des granulats, l'emploi de cette roche est exceptionnel bien que présent dans les couches de découverte et que ces caractéristiques mécaniques soient compatibles avec cet usage. Si elle est utilisée comme granulat, c'est principalement sous forme de remblai et encore plus exceptionnellement en granulat pour béton. Dans le domaine de l'agriculture, cette roche est employée comme amendement du fait du mélange carbonate de calcium et argile qu'elle contient. Dans le domaine des liants hydrauliques, cette roche est souvent utilisée comme matière première en remplacement du calcaire et/ou de l'argile dans la fabrication du clinker, le constituant de base des ciments. Dans le domaine des minéraux industriels, elle est exploitée en fonction de sa richesse en calcite afin de constituer des charges minérales. Nota: Les marnes ont une composition chimique intermédiaire entre les calcaires marneux (5 à 35% d'argiles) et les argiles calcareuses ou marnes argileuses (65 à 95% d'argiles)."
-  },
-  {
-    "id": "meba",
-    "nom": "métaux de base"
-  },
-  {
-    "id": "meco",
-    "nom": "métaux connexes"
-  },
-  {
-    "id": "mepr",
-    "nom": "métaux précieux"
-  },
-  {
-    "id": "merc",
-    "nom": "mercure",
-    "symbole": "Hg"
-  },
-  {
-    "id": "mica",
-    "nom": "micas",
-    "gerep": 2011,
-    "description": "Minéral - Silicates en feuillets riches en aluminium et potassium (micas blancs) ou en magnésium et fer (micas noirs) dont les propriétés physico-minéralogiques trouvent de nombreuses applications dans les domaines de l'isolation et des charges minérales."
-  },
-  {
-    "id": "mics",
-    "nom": "micaschistes",
-    "gerep": 1409,
-    "description": "Roche métamorphique cristallisée et schisteuse caractérisée par l'abondance de la fraction micacée et une plus faible teneur en quartz. Dans le domaine des roches ornementales et de construction, les proportions de quartz et de micas déterminent les propriétés de la roche comme la fissilité pour la production de dallage ou de couverture. Sa richesse en mica confère un aspect brillant à sa surface. Dans le domaine des minéraux industriel, cette roche est valorisée dans des applications de type charge minérale."
-  },
-  {
-    "id": "migm",
-    "nom": "migmatite",
-    "gerep": 1410,
-    "description": "Roche métamorphique formée d'une alternance de roches de type granite de couleur sombre et de roche de type gneiss de couleur clair. La partie de couleur claire est assimilé à la partie de la roche ayant fondu et est appelée \"le mobilisat\". La partie de couleur sombre constitue la partie de la roche étant restée solide et est appelée \"la restite\". Ses bonnes propriétés mécaniques, permettent de l'utiliser comme roche ornementale et de construction ou comme granulat."
-  },
-  {
-    "id": "moly",
-    "nom": "molybdène",
-    "symbole": "Mo"
-  },
-  {
-    "id": "mylo",
-    "nom": "mylonites",
-    "gerep": 1501,
-    "description": "Roche autre cataclastique résultant du cisaillement et du broyage puis de la recristallisation plus ou moins intense de roches préexistantes de différentes natures (éventuellement recristallisées) dans une zone de formation intense de failles. Elle est constituée d'une hétérogénéité de roches."
-  },
-  {
-    "id": "nacl",
-    "nom": "sels de sodium",
-    "symbole": "Na"
-  },
-  {
-    "id": "neod",
-    "nom": "néodyme",
-    "symbole": "Nd"
-  },
-  {
-    "id": "nick",
-    "nom": "nickel",
-    "symbole": "Ni"
-  },
-  {
-    "id": "niob",
-    "nom": "niobium",
-    "symbole": "Nb"
-  },
-  {
-    "id": "ocre",
-    "nom": "ocres",
-    "gerep": 1113,
-    "description": "Mélange sédimentaire naturel de kaolinite (argile), d'oxyde de fer rouge (hématite) et d'hydroxyde de fer jaune-oranger (limonite) utilisé pour la production de pigments naturels dans les peintures et les enduits."
-  },
-  {
-    "id": "oooo",
-    "nom": "non précisée(s)"
-  },
-  {
-    "id": "ophi",
-    "nom": "ophite",
-    "gerep": 1205,
-    "description": "Roche plutonique intermédiaire entre basalte et gabbro présentant un faciès plus ou moins altéré de couleur vert-foncé. En tant que roche ornementale et de construction elle est sélectionnée pour son aspect décoratif. Son emploi en tant que granulats est dû à sa dureté et à sa compacité."
-  },
-  {
-    "id": "osmi",
-    "nom": "osmium",
-    "symbole": "Os"
-  },
-  {
-    "id": "pall",
-    "nom": "palladium",
-    "symbole": "Pd"
-  },
-  {
-    "id": "perl",
-    "nom": "perlite",
-    "gerep": 1306,
-    "description": "Roche volcanique de couleur claire à texture vitreuse plus ou moins hydratée et composition rhyolitique utilisée dans l'industrie pour la production d'agents filtrants et d'additifs fonctionnels. Elle est utilisée dans l'industrie pour la production d'agents filtrants et d'additifs fonctionnels."
-  },
-  {
-    "id": "phon",
-    "nom": "phonolite",
-    "gerep": 1307,
-    "description": "Roche volcanique à grain très fin, de couleur grise tirant parfois sur le vert ou le brun, qui se débite en plaques et qui, sous le choc du métal, rend un son clair (dalles sonores). Sa composition chimique est déficitaire en silice (dite sous-saturées en silice). Le silicium y représente donc moins de la moitié des cations. Ces caractéristiques mécaniques (dureté) permettent son utilisation en tant que granulat. En tant que roche ornementale et de construction, elle est utilisée comme pierre ardoisière en Auvergne. En tant que minéraux industriels, sa composition chimique sous-saturée en silice est recherchée pour les industries du verre et de la céramique."
-  },
-  {
-    "id": "phos",
-    "nom": "phosphates",
-    "symbole": "P"
-  },
-  {
-    "id": "pipe",
-    "nom": "pierres précieuses"
-  },
-  {
-    "id": "plat",
-    "nom": "platine",
-    "symbole": "Pt"
-  },
-  {
-    "id": "plax",
-    "nom": "métaux de la mine du platine"
-  },
-  {
-    "id": "plom",
-    "nom": "plomb",
-    "symbole": "Pb"
-  },
-  {
-    "id": "polo",
-    "nom": "polonium",
-    "symbole": "Po"
-  },
-  {
-    "id": "porp",
-    "nom": "porphyre",
-    "gerep": 1206,
-    "description": "Roche plutonique caractérisée par une texture intermédiaire constituée de cristaux de feldpaths baignant dans une matrice finement cristallisée. Dans le domaine des roches ornementales et de construction, la couleur variable de cette roche est utilisée pour son aspect décoratif. Dans le domaine des minéraux industriels, cette roche est employée pour ces propriétés mécaniques (dureté, résistance aux chocs et à l'abrasion)."
-  },
-  {
-    "id": "pouz",
-    "nom": "pouzzolane",
-    "gerep": 1308,
-    "description": "Roche volcanique scoriacée à texture bulleuse de couleur noire ou rouge brique. Elle est donc assez rarement exploitée en roche de construction sauf dans la région de Clermont-Ferrand et sur l'île de la Réunion. Elle permet la fabrication de moellons utilisés dans le bâtiment compte tenu de leurs propriétés (isolation thermique et phonique) (voir la fiche pouzzolane de Ph. Rocher). L'exploitation en roche ornementale est marginale et est destinée la construction de rocaille décorative dans les jardins d'agrément. En tant que granulats, elle est utilisée comme agent de sablage ou comme agrégat pour la réalisation de massifs drainants. Sa texture bulleuse peu résistante mécaniquement en fait tout de même un granulat léger notamment dans les bétons spéciaux. Dans le domaine des liants hydrauliques, elle peut être utilisée comme additifs pour la fabrication de certains ciments. Dans le domaine des minéraux industriels, elle est utilisée pour ses propriétés d'isolation phonique et thermique."
-  },
-  {
-    "id": "pras",
-    "nom": "praséodyme",
-    "symbole": "Pr"
-  },
-  {
-    "id": "prom",
-    "nom": "prométhium",
-    "symbole": "Pm"
-  },
-  {
-    "id": "prot",
-    "nom": "protactinium",
-    "symbole": "Pa"
-  },
-  {
-    "id": "prpa",
-    "nom": "propane"
-  },
-  {
-    "id": "prpy",
-    "nom": "propylène"
-  },
-  {
-    "id": "pyri",
-    "nom": "pyrite"
-  },
-  {
-    "id": "quar",
-    "nom": "quartz",
-    "gerep": 2012,
-    "description": "Minéral - Oxyde de silicium (SiO2) Dans le domaine des granulats, sans grand degré de pureté le quartz est valorisé pour ses caractéristiques mécaniques et certains aspects décoratifs. Dans le domaine des minéraux industriels, sa pureté en SiO2 est recherchée pour sa résistance à l'abrasion dans les revêtements de sols ou comme agent de décapage. Elle constitue une source de silicium pour des applications verre et céramique lorsqu'il présente un très haut degré de pureté."
-  },
-  {
-    "id": "quat",
-    "nom": "quartzites",
-    "gerep": 1411,
-    "description": "Roche métamorphique massive composée principalement de quartz issue de la recristallisation et de la cimentation du quartz. Les caractéristiques mécaniques sont favorables à la production de granulats de haute qualité (forte résistance à l'abrasion) ou à une utilisation comme roche ornementale et de construction. Le tombeau de Napoléon, aux Invalides, est réalisé dans un bloc de quartzite. Dans le domaine des minéraux industriels, sa pureté est recherchée pour être utilisée comme matériaux réfractaires."
-  },
-  {
-    "id": "radi",
-    "nom": "radium",
-    "symbole": "Ra"
-  },
-  {
-    "id": "rado",
-    "nom": "radon",
-    "symbole": "Rn"
-  },
-  {
-    "id": "rard",
-    "nom": "roches ardoisières",
-    "gerep": 1412,
-    "description": "Roche métamorphique qui est à l'origine de l'argile ayant subi un faible métamorphisme et qui est devenue schisteuse. Ces roches ardoisières ont un plan de schistocité épais et peuvent avoir une fraction gréseuse. Elle comprend notamment les lauzes qui sont utilisées comme pierres de construction (dallage ou toiture)."
-  },
-  {
-    "id": "rdet",
-    "nom": "roches détritiques grossières",
-    "gerep": 1114,
-    "description": "Famille de roches sédimentaire détritiques (issues de la dégradation mécanique d'autres roches) constituées d'éléments grossiers (galets) arrondis (qui traduisent un transport long avant sédimentation) cimentés par des éléments plus fins de type sables et graviers. Devenues suffisamment dures (indurées) ces roches sont utilisées pour la production de granulats. En tant que roches ornementales et de construction, elles présentent des caractéristiques mécaniques et esthétiques valorisables en décoration. Cette famille regroupe les roches suivantes : les arkoses, les brèches, les conglomérats et les poudingues. Ces dernières sont celles qui sont le plus souvent utilisées comme roches ornementales."
-  },
-  {
-    "id": "rhen",
-    "nom": "rhénium",
-    "symbole": "Re"
-  },
-  {
-    "id": "rhod",
-    "nom": "rhodium",
-    "symbole": "Rh"
-  },
-  {
-    "id": "rhyo",
-    "nom": "rhyolite",
-    "gerep": 1309,
-    "description": "Roche volcanique effusive riche en silice de couleur claire constituée de fins cristaux de feldspaths dispersés dans une matrice vitreuse valorisée pour ses propriétés mécaniques et son aspect esthétique soit en tant que roche ornementale et de construction ou en tant que granulats."
-  },
-  {
-    "id": "rubi",
-    "nom": "rubidium",
-    "symbole": "Rb"
-  },
-  {
-    "id": "ruth",
-    "nom": "ruthénium",
-    "symbole": "Ru"
-  },
-  {
-    "id": "rxxx",
-    "nom": "autres éléments radioactifs"
-  },
-  {
-    "id": "saco",
-    "nom": "sables coquilliers",
-    "gerep": 1118,
-    "description": "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat."
-  },
-  {
-    "id": "sama",
-    "nom": "samarium",
-    "symbole": "Sm"
-  },
-  {
-    "id": "samg",
-    "nom": "sables moyens à grossiers",
-    "gerep": 1118,
-    "description": "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat."
-  },
-  {
-    "id": "sasi",
-    "nom": "sables siliceux",
-    "gerep": 1118,
-    "description": "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat."
-  },
-  {
-    "id": "scan",
-    "nom": "scandium",
-    "symbole": "Sc"
-  },
-  {
-    "id": "scbi",
-    "nom": "schistes bitumineux"
-  },
-  {
-    "id": "schi",
-    "nom": "schistes",
-    "gerep": 1413,
-    "description": "Roche métamorphique à grains très fins peu ou pas décelables à l'œil nu présentant un débit en feuillet dû à la schistosité et à la présence de minéraux plats (micas, hornblende...) orientés. Utilisée pour ses propriétés mécaniques, cette roche est particulièrement délitable et donne des granulats de forme assez plate. Son aspect décoratif est valorisé en tant que roche ornementale et de construction."
-  },
-  {
-    "id": "scor",
-    "nom": "substances connexes"
-  },
-  {
-    "id": "sele",
-    "nom": "sélénium",
-    "symbole": "Se"
-  },
-  {
-    "id": "selg",
-    "nom": "sel gemme"
-  },
-  {
-    "id": "selh",
-    "nom": "sources d'eau salée"
-  },
-  {
-    "id": "selp",
-    "nom": "puits d'eau salée"
-  },
-  {
-    "id": "sels",
-    "nom": "sels"
-  },
-  {
-    "id": "selx",
-    "nom": "sel"
-  },
-  {
-    "id": "serp",
-    "nom": "serpentinite",
-    "gerep": 1414,
-    "description": "Roche métamorphique de couleur jaunâtre à verdâtre (voire vert sombre) ou présentant des inclusions verdâtres (forme porphyrique) essentiellement constituée (plus de 75 %) d'antigorite (phyllosilicate magnésien). Cette roche provient de l'altération d'une péridotite en présence d'eau. Les serpentinites sont essentiellement exploitées aujourd'hui pour la production de granulats et plus rarement comme roches ornementales."
-  },
-  {
-    "id": "sexs",
-    "nom": "sable extra siliceux",
-    "gerep": 1120,
-    "description": "Roche sédimentaire meuble d'origine détritique presque exclusivement constituée de grains calibrés de quartz de très grande pureté (égale ou > 98% de silice), utilisée dans les industries du verre et de la céramique et comme additif fonctionnel."
-  },
-  {
-    "id": "sgin",
-    "nom": "sables et grès industriels",
-    "gerep": 1120
-  },
-  {
-    "id": "sgra",
-    "nom": "sables et graviers alluvionnaires",
-    "gerep": 1117,
-    "description": "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme de sables, graviers et galets de nature variable extraits d'anciens lits de cours d'eau et utilisé comme granulat encore aujourd'hui principalement dans des bétons spéciaux ou pour des couches drainantes."
-  },
-  {
-    "id": "sgrm",
-    "nom": "sables et graviers marins",
-    "gerep": 1118,
-    "description": "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat."
-  },
-  {
-    "id": "sgsc",
-    "nom": "sables et graviers silico-calcaires marins",
-    "gerep": 1118,
-    "description": "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat."
-  },
-  {
-    "id": "sgsm",
-    "nom": "sables et graviers siliceux marins",
-    "gerep": 1118,
-    "description": "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat."
-  },
-  {
-    "id": "silc",
-    "nom": "silice",
-    "gerep": 1120
-  },
-  {
-    "id": "sili",
-    "nom": "sillimanite",
-    "gerep": 2014,
-    "description": "Minéral - Silicate d'alumine (SiAl2O5) de même composition chimique que l'andalousite mais avec une structure cristalline et des propriétés physico-minéralogiques sensiblement différentes."
-  },
-  {
-    "id": "silx",
-    "nom": "silex / chert",
-    "gerep": 1121,
-    "description": "Roche sédimentaire d'origine détritique issue d'une précipitation chimique et constituée de silice calcédonieuse presque pure la rendant très dure et quelques impuretés telles que de l'eau ou des oxydes, ces derniers influant sur sa couleur. De part, la dureté de cette roche, elle est valorisée sous forme de granulat. Pour l'industrie, elle est utilisée, sous forme de galet plus ou moins arrondis dont les propriétés mécaniques permettent d'en faire des charges broyantes ou des produits abrasifs ou dont la grande pureté chimique permet de faire de la silice industrielle. [Définition de la norme européenne EN 932-3 : Roche sédimentaire composée de silice cryptocristalline ou microcristalline (cristaux indétectables à l'œil nu), se formant en général en couches ou en nodules dans le calcaire.] Préférer le terme SILEX au terme CHERT qui vaut dire la même chose. Le silex est un chert se formant dans la craie du Crétacé (cf. falaise d'Etretat)."
-  },
-  {
-    "id": "skst",
-    "nom": "stockage souterrain"
-  },
-  {
-    "id": "smil",
-    "nom": "sables a minéraux lourds",
-    "gerep": 1115,
-    "description": "Sables alluvionnaires ou de plage composés de minéraux lourds (rutile, zircon, barytine, grenat). L'accumulation des minéraux lourds se fait dans des placers dont l'origine est liée aux paramètres favorables de sédimentation. Ces minéraux peuvent être utilisés en industrie."
-  },
-  {
-    "id": "souf",
-    "nom": "soufre",
-    "symbole": "S"
-  },
-  {
-    "id": "soxx",
-    "nom": "sulfates autres que les sulfates alcalino-terreux"
-  },
-  {
-    "id": "sssc",
-    "nom": "sable siliceux ou silico-calcaire",
-    "gerep": 1119,
-    "description": "Roche sédimentaire meuble d'origine détritique pouvant soit être constituée majoritairement de grains de quartz (fort % de silice mais < à 98%) soit de calcaire et de silice (silico-calcaire). Ce sable est principalement utilisé comme produits de correction pour la fabrication du clinker, le constituant de base des ciments."
-  },
-  {
-    "id": "stex",
-    "nom": "stérile d'exploitation",
-    "gerep": 1502,
-    "description": "Roche d'origine diverse, caractérisée par des roches constituant des stériles d'ancienne exploitation (schiste, grès, carbonates ou roche grenue) dont les caractéristiques mécaniques et physiques permettent de les valoriser comme granulat."
-  },
-  {
-    "id": "suco",
-    "nom": "substances connexes"
-  },
-  {
-    "id": "syen",
-    "nom": "syénite",
-    "gerep": 1207,
-    "description": "Roche plutonique grenue de couleur rose à rouge, composée de feldspath alcalin (assez riche en silice). Elle se rapproche du granite et du gabbro mais ne contient pas de quartz. L'équivalent volcanique d'une syénite est un trachyte. Elle est utilisée en tant que granulats ou roche ornementale et de construction."
-  },
-  {
-    "id": "talc",
-    "nom": "talc",
-    "gerep": 2015,
-    "description": "Minéral - Silicate de magnésium hydraté (Mg3 Si4 O10 (OH)2) présentant une structure en feuillets dont les propriétés comme la dureté (1 de l'échelle de Mohs), hydrophobie, grande inertie chimique, blancheur en font un remarquable additif fonctionnel de nombreux domaines (peintures, plastiques, pharmacopée...)."
-  },
-  {
-    "id": "tant",
-    "nom": "tantale",
-    "symbole": "Ta"
-  },
-  {
-    "id": "tech",
-    "nom": "technétium",
-    "symbole": "Tc"
-  },
-  {
-    "id": "tell",
-    "nom": "tellure",
-    "symbole": "Te"
-  },
-  {
-    "id": "terb",
-    "nom": "terbium",
-    "symbole": "Tb"
-  },
-  {
-    "id": "terv",
-    "nom": "terre végétale",
-    "gerep": 1122,
-    "description": "Horizon sédimentaire humifère constitué suivant la profondeur de l'accumulation de matière organique associée à la croissance des végétaux et de l'altération du substratum rocheux sous-jacent."
-  },
-  {
-    "id": "thal",
-    "nom": "thallium",
-    "symbole": "Tl"
-  },
-  {
-    "id": "thor",
-    "nom": "thorium",
-    "symbole": "Th"
-  },
-  {
-    "id": "thul",
-    "nom": "thulium",
-    "symbole": "Tm"
-  },
-  {
-    "id": "tita",
-    "nom": "titane",
-    "symbole": "Ti"
-  },
-  {
-    "id": "tmas",
-    "nom": "tous métaux associés"
-  },
-  {
-    "id": "tour",
-    "nom": "tourbe",
-    "gerep": 1123,
-    "description": "Roche sédimentaire organique résultant de l'accumulation de la matière organique liée à la croissance des végétaux et de leur transformation sous certaines conditions. Elle est utilisée principalement comme amendement."
-  },
-  {
-    "id": "trac",
-    "nom": "trachyte",
-    "gerep": 1310,
-    "description": "Roche volcanique effusive de couleur gris-clair, à texture souvent poreuse constituée de fins cristaux (microlites) de feldspaths baignant dans une matrice vitreuse (du fait de sa teneur en silice assez élevée). Elle est utilisée pour ses bonnes caractéristiques mécaniques en tant que granulats et comme roches ornementales et de constructions (ex: lave de Volvic, lave de Chambois)."
-  },
-  {
-    "id": "trxx",
-    "nom": "autres éléments de terres rares"
-  },
-  {
-    "id": "tufo",
-    "nom": "tuffeau",
-    "gerep": 1124,
-    "description": "Roche sédimentaire blanchâtre peu stratifiée à texture crayeuse constituée de calcite, utilisée comme pierre de construction."
-  },
-  {
-    "id": "uran",
-    "nom": "uranium",
-    "symbole": "U"
-  },
-  {
-    "id": "vana",
-    "nom": "vanadium",
-    "symbole": "V"
-  },
-  {
-    "id": "wolf",
-    "nom": "tungstène",
-    "symbole": "W"
-  },
-  {
-    "id": "ytri",
-    "nom": "yttrium",
-    "symbole": "Y"
-  },
-  {
-    "id": "ytte",
-    "nom": "ytterbium",
-    "symbole": "Yb"
-  },
-  {
-    "id": "zinc",
-    "nom": "zinc",
-    "symbole": "Zn"
-  },
-  {
-    "id": "zirc",
-    "nom": "zirconium",
-    "symbole": "Zr"
-  }
-]
\ No newline at end of file
diff --git a/packages/api/src/api/graphql/resolvers.ts b/packages/api/src/api/graphql/resolvers.ts
index 2fb5d82b9..31bcf1f96 100644
--- a/packages/api/src/api/graphql/resolvers.ts
+++ b/packages/api/src/api/graphql/resolvers.ts
@@ -135,11 +135,7 @@ import {
   etapeTypeJustificatifTypeSupprimer
 } from './resolvers/metas-join'
 
-import {
-  substance,
-  substances,
-  substancesLegales
-} from './resolvers/substances'
+import { substances } from './resolvers/substances'
 
 import {
   entreprise,
@@ -208,9 +204,7 @@ export default {
   version,
   titre,
   titres,
-  substance,
   substances,
-  substancesLegales,
   moi,
   entreprise,
   entreprises,
diff --git a/packages/api/src/api/graphql/resolvers/__snapshots__/substances.test.integration.ts.snap b/packages/api/src/api/graphql/resolvers/__snapshots__/substances.test.integration.ts.snap
new file mode 100644
index 000000000..0fe8698cc
--- /dev/null
+++ b/packages/api/src/api/graphql/resolvers/__snapshots__/substances.test.integration.ts.snap
@@ -0,0 +1,998 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`substances peut voir toutes les substances 1`] = `
+Object {
+  "substances": Array [
+    Object {
+      "description": null,
+      "id": "cfxx",
+      "nom": "combustibles fossiles",
+    },
+    Object {
+      "description": null,
+      "id": "selh",
+      "nom": "sources d'eau salée",
+    },
+    Object {
+      "description": null,
+      "id": "aloh",
+      "nom": "bauxite",
+    },
+    Object {
+      "description": null,
+      "id": "anti",
+      "nom": "antimoine",
+    },
+    Object {
+      "description": null,
+      "id": "arge",
+      "nom": "argent",
+    },
+    Object {
+      "description": null,
+      "id": "arse",
+      "nom": "arsenic",
+    },
+    Object {
+      "description": null,
+      "id": "auru",
+      "nom": "or",
+    },
+    Object {
+      "description": null,
+      "id": "bery",
+      "nom": "béryllium",
+    },
+    Object {
+      "description": null,
+      "id": "bism",
+      "nom": "bismuth",
+    },
+    Object {
+      "description": null,
+      "id": "cadm",
+      "nom": "cadmium",
+    },
+    Object {
+      "description": null,
+      "id": "ceri",
+      "nom": "cérium",
+    },
+    Object {
+      "description": null,
+      "id": "cesi",
+      "nom": "césium",
+    },
+    Object {
+      "description": null,
+      "id": "chro",
+      "nom": "chrome",
+    },
+    Object {
+      "description": null,
+      "id": "coba",
+      "nom": "cobalt",
+    },
+    Object {
+      "description": "A l'exception du gaz naturellement contenu dans les eaux qui sont ou qui viendraient à être utilisées pour l'alimentation humaine ou à des fins thérapeutiques",
+      "id": "coox",
+      "nom": "gaz carbonique",
+    },
+    Object {
+      "description": null,
+      "id": "cuiv",
+      "nom": "cuivre",
+    },
+    Object {
+      "description": null,
+      "id": "diam",
+      "nom": "diamant",
+    },
+    Object {
+      "description": null,
+      "id": "etai",
+      "nom": "étain",
+    },
+    Object {
+      "description": null,
+      "id": "ferx",
+      "nom": "fer",
+    },
+    Object {
+      "description": null,
+      "id": "fluo",
+      "nom": "fluorine",
+    },
+    Object {
+      "description": null,
+      "id": "gall",
+      "nom": "gallium",
+    },
+    Object {
+      "description": null,
+      "id": "geob",
+      "nom": "gîtes géothermiques basse température",
+    },
+    Object {
+      "description": null,
+      "id": "geoh",
+      "nom": "gîtes géothermiques haute température",
+    },
+    Object {
+      "description": null,
+      "id": "geom",
+      "nom": "activités géothermiques de minime importance",
+    },
+    Object {
+      "description": null,
+      "id": "germ",
+      "nom": "germanium",
+    },
+    Object {
+      "description": null,
+      "id": "grap",
+      "nom": "graphite",
+    },
+    Object {
+      "description": null,
+      "id": "grma",
+      "nom": "granulats marins",
+    },
+    Object {
+      "description": null,
+      "id": "hafn",
+      "nom": "hafnium",
+    },
+    Object {
+      "description": null,
+      "id": "heli",
+      "nom": "hélium",
+    },
+    Object {
+      "description": null,
+      "id": "hydm",
+      "nom": "calcaires bitumineux",
+    },
+    Object {
+      "description": "A l'exeption de la tourbe",
+      "id": "hydx",
+      "nom": "hydrocarbures liquides ou gazeux",
+    },
+    Object {
+      "description": null,
+      "id": "indi",
+      "nom": "indium",
+    },
+    Object {
+      "description": null,
+      "id": "kals",
+      "nom": "alun",
+    },
+    Object {
+      "description": "A l'état solide ou en dissolution, à l'exception de ceux contenus dans les eaux salées utilisées à des fins thérapeutiques ou de loisirs",
+      "id": "kclx",
+      "nom": "sels de potassium",
+    },
+    Object {
+      "description": null,
+      "id": "lith",
+      "nom": "lithium",
+    },
+    Object {
+      "description": null,
+      "id": "mang",
+      "nom": "manganèse",
+    },
+    Object {
+      "description": null,
+      "id": "merc",
+      "nom": "mercure",
+    },
+    Object {
+      "description": null,
+      "id": "moly",
+      "nom": "molybdène",
+    },
+    Object {
+      "description": "A l'état solide ou en dissolution, à l'exception de ceux contenus dans les eaux salées utilisées à des fins thérapeutiques ou de loisirs",
+      "id": "nacl",
+      "nom": "sels de sodium",
+    },
+    Object {
+      "description": null,
+      "id": "nick",
+      "nom": "nickel",
+    },
+    Object {
+      "description": null,
+      "id": "niob",
+      "nom": "niobium",
+    },
+    Object {
+      "description": null,
+      "id": "oooo",
+      "nom": "non précisée(s)",
+    },
+    Object {
+      "description": null,
+      "id": "phos",
+      "nom": "phosphates",
+    },
+    Object {
+      "description": null,
+      "id": "plat",
+      "nom": "platine",
+    },
+    Object {
+      "description": null,
+      "id": "plax",
+      "nom": "métaux de la mine du platine",
+    },
+    Object {
+      "description": null,
+      "id": "plom",
+      "nom": "plomb",
+    },
+    Object {
+      "description": null,
+      "id": "radi",
+      "nom": "radium",
+    },
+    Object {
+      "description": null,
+      "id": "rhen",
+      "nom": "rhénium",
+    },
+    Object {
+      "description": null,
+      "id": "rubi",
+      "nom": "rubidium",
+    },
+    Object {
+      "description": null,
+      "id": "rxxx",
+      "nom": "autres éléments radioactifs",
+    },
+    Object {
+      "description": null,
+      "id": "scan",
+      "nom": "scandium",
+    },
+    Object {
+      "description": "Substances présentes lors de l’abattage des substances principales. Elles sont à la libre disposition de l’opérateur à la condition que le titre ou l’autorisation porte la mention « et substances connexes ».",
+      "id": "scoc",
+      "nom": "substances connexes",
+    },
+    Object {
+      "description": null,
+      "id": "sele",
+      "nom": "sélénium",
+    },
+    Object {
+      "description": null,
+      "id": "skst",
+      "nom": "stockage souterrain",
+    },
+    Object {
+      "description": null,
+      "id": "souf",
+      "nom": "soufre",
+    },
+    Object {
+      "description": null,
+      "id": "soxx",
+      "nom": "sulfates autres que les sulfates alcalino-terreux",
+    },
+    Object {
+      "description": null,
+      "id": "tant",
+      "nom": "tantale",
+    },
+    Object {
+      "description": null,
+      "id": "tell",
+      "nom": "tellure",
+    },
+    Object {
+      "description": null,
+      "id": "thal",
+      "nom": "thallium",
+    },
+    Object {
+      "description": null,
+      "id": "thor",
+      "nom": "thorium",
+    },
+    Object {
+      "description": null,
+      "id": "tita",
+      "nom": "titane",
+    },
+    Object {
+      "description": null,
+      "id": "trxx",
+      "nom": "autres éléments de terres rares",
+    },
+    Object {
+      "description": null,
+      "id": "uran",
+      "nom": "uranium",
+    },
+    Object {
+      "description": null,
+      "id": "vana",
+      "nom": "vanadium",
+    },
+    Object {
+      "description": null,
+      "id": "wolf",
+      "nom": "tungstène",
+    },
+    Object {
+      "description": null,
+      "id": "zinc",
+      "nom": "zinc",
+    },
+    Object {
+      "description": null,
+      "id": "zirc",
+      "nom": "zirconium",
+    },
+    Object {
+      "description": null,
+      "id": "acti",
+      "nom": "actinium",
+    },
+    Object {
+      "description": "Roche métamorphique présentant de bonnes caractéristiques géomécaniques, de couleur sombre (gris à vert foncé) riche en silicates calciques et ferromagnésiens (essentiellement hornblende, mais aussi feldspath plagioclase) et de minéraux annexes (pyroxène, micas). Elle est utilisée comme roche ornementale et de construction et comme granulat.",
+      "id": "amph",
+      "nom": "amphibolite",
+    },
+    Object {
+      "description": "Minéral - Silicate d'alumine (SiAl2O5). L'andalousite, la silimanite et la Kyanite (Cyanite ou Disthème) ont la même composition chimique mais avec une structure cristalline et des propriétés physico-minéraloriques différentes (triclinique) autrement dit une variété allotropique (même formule chimique mais système cristallin différent). En France, on ne connait pas de gisement de Kyanite à ce jour. L'andalousite et la silimanite y sont exploitées et sont utilisées dans l'industrie. L'andalousite est utilisée pour ses propriétés réfractaires et son excellente résistance aux chocs thermiques. La silimanite, utilisée pour le même usage réfractaire, a toutefois des propriétés physico-minéraloriques sensiblement différentes de l'andalousite.",
+      "id": "anda",
+      "nom": "andalousite / sillimanite / kyanite - (cyanite - disthène)",
+    },
+    Object {
+      "description": "Roche volcanique de couleur gris-clair constituée de cristaux de silicates (plagioclases, biotite, hornblende, pyroxène) dans une matrice vitreuse, avec une bonne homogénéité texturale. Elle présente une bonne résistance mécanique et à l'abrasion.",
+      "id": "ande",
+      "nom": "andésite",
+    },
+    Object {
+      "description": "Forme anhydre (CaSO4) du sulfate de calcium hydraté (gypse), utilisée comme charge dans l'industrie des peintures, plastiques et comme régulateur de prise dans les ciments, plus rarement comme amendement.",
+      "id": "anhy",
+      "nom": "anhydrite",
+    },
+    Object {
+      "description": "Roche schistosée, à l'origine une argile, ayant subi un faible métamorphisme. Variétés gris-bleuté à noire dont la texture (à grains très fin et homogène) et la fissillité (débit en plaques fines) sont mis à profit pour la fabrication d'éléments de toiture, de parement et de dallage pour les variétés plus gréseuses (autres utilisations possibles: additifs pour la fabrication du clinker et des ciments).",
+      "id": "ardo",
+      "nom": "ardoises",
+    },
+    Object {
+      "description": "Roche sédimentaire tendre à grain très fin, constituée de minéraux argileux à dominante de smectites-illites, ainsi que d'autres minéraux (quartz, oxydes...) de couleur gris-foncé, brune, jaune-oranger ou rougeâtre. Elles forment une pâte en présence d'eau et durcissent à la cuisson (terres-cuites). peuvent être utilisées (10 à 20%) dans la fabrication du clinker, constituant de base de tous les ciments.",
+      "id": "argc",
+      "nom": "argiles communes",
+    },
+    Object {
+      "description": "Roches sédimentaires tendre à grains fins, constituées majoritairement d'argiles alumino-magnésiennes (fibres de 1 à 3 µm de long et de 100 à 300 Angstroms de large. La différence entre la largeur des fibres permet de différentier les sépiolites des attapulgites). L'existence de micropores entre les fibres, confèrent à ces argiles une grande capacité d'absorption.",
+      "id": "argf",
+      "nom": "argiles fibreuses (attapulgites ou palygorskites, sépiolites)",
+    },
+    Object {
+      "description": "Roche sédimentaire tendre à grains très fins constituée principalement de kaolinite (minéral argileux blanc à crème) utilisée pour ses propriétés en céramiques communes (sanitaires) et pour matériaux réfractaires (fabrication de chamottes).",
+      "id": "argk",
+      "nom": "argiles kaoliniques",
+    },
+    Object {
+      "description": "Roches sédimentaires peu consolidées formées de minéraux argileux comme la montmorillonite (silicate d'aluminium et de magnésium hydraté) et la beidellite (silicate naturel d'aluminium hydraté). Ces phyllosilicates ont des propriétés physico-chimiques (gonflement en présence d'eau, rhéologie, adsorption, échanges cationiques...) avec de nombreuses applications dans les secteurs industriels (chimie, métallurgie, environnement, produit de collage en œnologie pour l'élimination des protéines des vins blancs et rosés. Synonyme : bentonite, \\"terre à foulon\\".",
+      "id": "args",
+      "nom": "argiles",
+    },
+    Object {
+      "description": null,
+      "id": "asta",
+      "nom": "astate",
+    },
+    Object {
+      "description": "Minéral - Sulfate de baryum (BaSO4) présentant une forte densité (4,5) et une bonne inertie chimique utilisé comme charge minérale dans les boues de forage, les bétons spéciaux des installations nucléaires (radioprotection) et certaines peintures industrielles.",
+      "id": "bary",
+      "nom": "barytine",
+    },
+    Object {
+      "description": "Roche volcanique dure et massive de couleur gris-foncé à noire, constituée de fin cristaux (pyroxène et olivine) dans une masse vitreuse. Excellentes propriétés mécaniques (dureté), utilisation en tant que granulats et roche ornementale et de construction.",
+      "id": "basa",
+      "nom": "basalte",
+    },
+    Object {
+      "description": null,
+      "id": "bitu",
+      "nom": "bitume",
+    },
+    Object {
+      "description": null,
+      "id": "buta",
+      "nom": "butane",
+    },
+    Object {
+      "description": null,
+      "id": "caci",
+      "nom": "calcaires cimentiers",
+    },
+    Object {
+      "description": "Roche sédimentaire (couleur blanc-beige-gris) principalement constituée de calcite (carbonate de calcium (CaCO3) faisant effervescence à l'acide). Caractéristiques pétrophysiques et géomécaniques très hétérogènes en fonction de la cristallinité, porosité, teneur en autres constituants (argiles, quartz...). Pour les variétés de haute pureté et blancheur, utilisations comme charges minérales. Autres utilisations : sidérurgie, verrerie, amendements, principale matière première pour la fabrication du clinker et de la chaux. Elle est également très employée en tant pierre ornementale et de construction et pour les granulats.",
+      "id": "calc",
+      "nom": "calcaires",
+    },
+    Object {
+      "description": "Roche métamorphique, d'aspect rubané, provenant de formations argileuses plus ou moins carbonatées comme les marnes et calcaires marneux. Peut être utilisée comme matière première en remplacement du calcaire et/ou des marnes dans la fabrication du clinker, le constituant de base des ciments.",
+      "id": "cals",
+      "nom": "calcschiste",
+    },
+    Object {
+      "description": "Roche volcanique formée de fragments généralement à grains fins, peu indurée (pulvérulente) ou indurée. Elle est utilisée en tant que granulats ou comme roches ornementales et de construction.",
+      "id": "cend",
+      "nom": "cendres volcaniques riches en silice",
+    },
+    Object {
+      "description": null,
+      "id": "cfan",
+      "nom": "anthracite",
+    },
+    Object {
+      "description": null,
+      "id": "cfch",
+      "nom": "charbon",
+    },
+    Object {
+      "description": null,
+      "id": "cfho",
+      "nom": "houille",
+    },
+    Object {
+      "description": null,
+      "id": "cfli",
+      "nom": "lignite",
+    },
+    Object {
+      "description": "Roche métamorphique cristalline plus ou moins orientée, habituellement très dure produite sous l'action de la chaleur d'un magma en fusion (métamorphisme de contact). Les grains sont d'une grosseur homogène et ne suivent pas une orientation préférentielle. Leur composition minéralogique varie selon le degré de métamorphisme et la nature des roches initiales. Elles présentent en général de bonnes résistances au choc et à l'abrasion.",
+      "id": "corn",
+      "nom": "cornéenne",
+    },
+    Object {
+      "description": "Roche sédimentaire fine, tendre, friable, de couleur blanche, composée de calcite(CaCO3) d'origine fossilifère. En amendement, est utilisée sous forme pulvérisée, broyée, concassée ou brute pour corriger les sols acides. En liant hydraulique, elle est utilisée dans des proportions de 80 à 90% dans la fabrication du clinker, le constituant de base du ciment mais sert également à la fabrication de chaux et de mortier. Pour les minéraux industriels, la pureté et la blancheur autorisent une utilisation comme charge minérale.",
+      "id": "crai",
+      "nom": "craie",
+    },
+    Object {
+      "description": "Roche volcanique de couleur gris-clair constituée de fins cristaux de quartz, plagioclase et silicates ferro-magnésiens baignant dans un verre. Elle est utilisée comme roche ornementale ou de construction et comme granulat.",
+      "id": "daci",
+      "nom": "dacite",
+    },
+    Object {
+      "description": "Roche métamorphique dure, d'origine volcanique à grain fin de couleur sombre (issue de dolérite). Elle est utilisé comme granulat.",
+      "id": "diab",
+      "nom": "diabase",
+    },
+    Object {
+      "description": "Roche sédimentaire tendre et légère formée par accumulation de carapaces siliceuses de micro-organismes en milieux lacustes ou marins. Utilisations industrielles : filtration de liquides alimentaires, charge minérale, absorbant de pollutions. En liant hydraulique, elle peut être utilisée comme additifs pour la fabrication de certains ciments.",
+      "id": "diat",
+      "nom": "diatomites",
+    },
+    Object {
+      "description": "Roche plutonique cristalline à texture grenue et homogène, constituée de feldspaths blanchâtres et de silicates ferro-magnésiens colorés (amphiboles, biotite...). En roche ornemental et de construction, elle est sélectionnée pour son aspect décoratif. En granulat, cette roche présente de bonnes caractéristiques mécaniques.",
+      "id": "dior",
+      "nom": "diorites",
+    },
+    Object {
+      "description": "Roche volcanique massive, compacte, de couleur sombre (grise à noire), composée de fins cristaux de feldspaths calciques, de pyroxène et parfois d'oxydes de fer. Elle est utilisée en tant que granulats ou en roche ornementale et de construction. On la trouve en association possible des dolérites altérées (diabases issues du métamorphisme des dolérites).",
+      "id": "dole",
+      "nom": "dolérite",
+    },
+    Object {
+      "description": "Roche sédimentaire constituée principalement de dolomite (carbonate double de calcium et de magnésium). Utilisée comme charge minérale dans de nombreuses applications : peintures et enduits, élastomères, papiers et revêtements de sol ou dans l'industrie du verre. Au regard de ses propriétés chimiques, est utilisée comme amendement sous forme pulvérisée, broyée, pour corriger le pH des sols acides.",
+      "id": "dolo",
+      "nom": "dolomie",
+    },
+    Object {
+      "description": null,
+      "id": "dysp",
+      "nom": "dysprosium",
+    },
+    Object {
+      "description": null,
+      "id": "erbi",
+      "nom": "erbium",
+    },
+    Object {
+      "description": null,
+      "id": "ethy",
+      "nom": "éthylène",
+    },
+    Object {
+      "description": null,
+      "id": "euro",
+      "nom": "europium",
+    },
+    Object {
+      "description": "Roche sédimentaire meuble d'origine détritique riche en débris de coquilles d'animaux marins. Facilement délitable et transformée en sable, elle est utilisée en tant qu'amendement agricole en substitution de carbonate de calcium ou de calcite. Par le passé, cette roche a été utilisée comme sarcophage pour conserver les corps au regard de sa porosité qui permet d'éviter la putréfaction des chairs et d'absorber les exudats.",
+      "id": "falu",
+      "nom": "faluns",
+    },
+    Object {
+      "description": "Minéral - Principal constituant de nombreuses roches magmatiques dont la composition varie entre des pôles potassique (KAlSi3O8), sodique (NaAlSi3O8) et calcique (CaAl2Si2O8), utilisé en céramique et dans la verrerie.",
+      "id": "feld",
+      "nom": "feldspaths",
+    },
+    Object {
+      "description": "Roche plutonique grenue de couleur sombre, contenant des feldspaths calciques et du pyroxène (olivine, biotite et hornblende associés). Cette roche présente généralement de bonnes caractéristiques mécaniques qui la rendent utilisable comme roche ornementale et de construction et comme granulat.",
+      "id": "gabb",
+      "nom": "gabbro",
+    },
+    Object {
+      "description": null,
+      "id": "gado",
+      "nom": "gadolinium",
+    },
+    Object {
+      "description": "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat.",
+      "id": "galt",
+      "nom": "galets",
+    },
+    Object {
+      "description": null,
+      "id": "gazn",
+      "nom": "gaz naturel",
+    },
+    Object {
+      "description": "Mélange de roches sédimentaires détritiques hétérogènes d'origine glaciaire constituées de fragments hétérométriques, unis par un ciment naturel (moraines et tillites). Les moraines se présentent sous forme de blocs, de cailloux de sables et d'argiles. Elles peuvent être valorisées comme granulat. Les tillites sont des conglomérats à éléments arrondis et anguleux, suffisamment indurées (dures) pour être valorisées également comme granulat ou comme roche ornementale et de construction.",
+      "id": "glac",
+      "nom": "dépôt glaciaire",
+    },
+    Object {
+      "description": "Roche métamorphique cristalline à faciès rubanné ou lenticulaire (alternance de lits clairs quartzo-feldspathiques et de lits sombres à micas, amphiboles et pyroxènes). Utilisée en tant que granulats pour ses propriétés mécaniques ou en tant que roche ornementale et de construction pour son aspect décoratif.",
+      "id": "gnei",
+      "nom": "gneiss",
+    },
+    Object {
+      "description": "Roche plutonique cristalline à texture grenue de couleur claire (gris, rose ou jaune) composée de quartz, feldspaths et micas, sélectionnée pour son aspect décoratif. Pour les roches ornementales et de construction, une définition \\"commerciale\\" existe également et est différente de celle-ci dite \\"acceptation scientifique\\" (cf. point 2.1.156 NF EN 12670 : 2001 page 16). Pour les granulats, cette roche présente de bonnes caractéristiques de rugosité. Pour les minéraux industriels, cette roche rendue friable par l'altération (arénisation) facilite l'extraction de tout ou partie de ses constituants (quartz, feldspaths et micas). Nota : Le terme GRANULITE était utilisé autrefois pour désigner des granites de couleur claire à 2 micas (noir et blanc). qui sont valorisées pour leur aspect esthétique dans le domaine des roches ornementales et de construction.",
+      "id": "grai",
+      "nom": "granite et granulite",
+    },
+    Object {
+      "description": "Roche plutonique grenue dont la composition est intermédiaire entre le granite et la diorite. Elle est principalement constituée de quartz (> 10 %) et de feldspaths de couleur claire. Les minéraux secondaires sont la biotite (grains sombres vert, brun ou noir), l'amphibole et le pyroxène. La Pierre de Rosette qui permit de percer le mystère des hiéroglyphes est en granodiorite.",
+      "id": "grao",
+      "nom": "granodiorite",
+    },
+    Object {
+      "description": "Roche sédimentaire de couleur brun-orangé constituée d'un mélange de silice et d'oxydes et hydroxydes de fer, utilisée en tant que minéraux industriels, comme agent colorant en céramique.",
+      "id": "gref",
+      "nom": "grès silico-ferrugineux",
+    },
+    Object {
+      "description": "Roche sédimentaire plus ou moins indurée et stratifiée, composée de grains de quartz d'origine détritique (d'une taille comprise entre 63 µm et 2 mm) soudés par un ciment interstitiel de nature variable (calcite, oxydes de fer, silice, minéraux argileux). Dans le domaine des granulats et des roches ornementales et de construction, les propriétés mécaniques et l'aspect esthétique sont valorisés. Dans le domaine des minéraux industriels, elle est utilisée comme source de silice pour la production de ferro-silicium.",
+      "id": "gres",
+      "nom": "grès",
+    },
+    Object {
+      "description": "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat.",
+      "id": "grsi",
+      "nom": "graviers siliceux",
+    },
+    Object {
+      "description": "Minéral - Sulfate de calcium hydraté (CaSO4,2H2O). Dans le domaine des liants hydrauliques, ce minéral est utilisé pour la fabrication du plâtre et comme régulateur de prise dans les ciments. Dans le domaine des minéraux industriel, sa pureté chimique et ses caractéristiques physiques comme la blancheur lui permettent d'être utilisé comme charge minérale. Dans le domaine de l'amendement, sa propriété chimique (base) est utilisée pour corriger les sols acides.",
+      "id": "gyps",
+      "nom": "gypse",
+    },
+    Object {
+      "description": null,
+      "id": "holm",
+      "nom": "holmium",
+    },
+    Object {
+      "description": null,
+      "id": "hyda",
+      "nom": "asphalte",
+    },
+    Object {
+      "description": null,
+      "id": "hydc",
+      "nom": "hydrocarbures conventionnels liquides ou gazeux",
+    },
+    Object {
+      "description": null,
+      "id": "hydg",
+      "nom": "gaz combustible",
+    },
+    Object {
+      "description": null,
+      "id": "hydo",
+      "nom": "hydrocarbures liquides",
+    },
+    Object {
+      "description": null,
+      "id": "hydr",
+      "nom": "hydrocarbures",
+    },
+    Object {
+      "description": null,
+      "id": "irid",
+      "nom": "iridium",
+    },
+    Object {
+      "description": "Minéral - Extrait de roches granitiques ou sédimentaires composées principalement de kaolinite (silicate d'alumine hydraté Al2Si2O5(OH)4). Le kaolin est utilisé pour sa grande pureté et sa blancheur en céramique (porcelaine) ou comme charges minérales (papier, peinture, etc.). Il peut être également utilisé comme matière première en remplacement de l'argile dans la fabrication de certains clinkers pour ciments blancs (Portland).",
+      "id": "kaol",
+      "nom": "kaolin",
+    },
+    Object {
+      "description": null,
+      "id": "lant",
+      "nom": "lanthane",
+    },
+    Object {
+      "description": "Roche métamorphique cristallisée et orientée de couleur claire composée de quartz, feldspath et micas en faible quantité présentant une bonne résistance mécanique.",
+      "id": "lept",
+      "nom": "leptynite",
+    },
+    Object {
+      "description": null,
+      "id": "lute",
+      "nom": "lutécium",
+    },
+    Object {
+      "description": "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat.",
+      "id": "maer",
+      "nom": "maërl",
+    },
+    Object {
+      "description": null,
+      "id": "mais",
+      "nom": "minerais",
+    },
+    Object {
+      "description": "Roche métamorphique cristalline plus ou moins rubanée, contenant plus de 50 % de carbonates (calcite et plus rarement dolomite) dans laquelle les minéraux ont totalement recristallisé avec des traces d'oxydes métalliques ou d'impuretés lui donnant une grande variété de couleurs. Le métamorphisme de cette roche lui confère une plus grande dureté. Dans le domaine des roches ornementales, elle est sélectionnée pour son aspect décoratif, la recristallisation de ses composants favorise son polissage. Une définition \\"commerciale\\" existe également et est différente de celle-ci dite \\"acceptation scientifique\\" (cf. point 2.1.243 NF EN 12670 : 2001 page 22). Dans le domaine des granulats, elle est sélectionnée pour ses propriétés mécaniques (dureté, résistance aux chocs). Dans le domaine des liants hydrauliques, elle peut être utilisée comme matière première en remplacement du calcaire dans la fabrication du clinker, le constituant de base des ciments. Dans le domaine de l'amendement les composants calciques ou magnésiens sont particulièrement utiles pour la correction de pH des milieux acides. Dans le domaine des minéraux industriels, elle est utilisée, après calcination en carbonate de calcium, comme: - charge minérale dans de nombreuses applications industrielles (papier, peinture, plastiques, élastomères) - ou transformée en chaux pour la correction de pH des milieux acides.",
+      "id": "marb",
+      "nom": "marbres",
+    },
+    Object {
+      "description": "Roche sédimentaire plus ou moins indurée (dure) et stratifiée (couches successives de sédiments) composée d'un mélange de carbonate de calcium (CaCO3) et d'argiles de différentes natures (de 35% à 65%). Usages : Dans le domaine des granulats, l'emploi de cette roche est exceptionnel bien que présent dans les couches de découverte et que ces caractéristiques mécaniques soient compatibles avec cet usage. Si elle est utilisée comme granulat, c'est principalement sous forme de remblai et encore plus exceptionnellement en granulat pour béton. Dans le domaine de l'agriculture, cette roche est employée comme amendement du fait du mélange carbonate de calcium et argile qu'elle contient. Dans le domaine des liants hydrauliques, cette roche est souvent utilisée comme matière première en remplacement du calcaire et/ou de l'argile dans la fabrication du clinker, le constituant de base des ciments. Dans le domaine des minéraux industriels, elle est exploitée en fonction de sa richesse en calcite afin de constituer des charges minérales. Nota: Les marnes ont une composition chimique intermédiaire entre les calcaires marneux (5 à 35% d'argiles) et les argiles calcareuses ou marnes argileuses (65 à 95% d'argiles).",
+      "id": "marn",
+      "nom": "marnes",
+    },
+    Object {
+      "description": null,
+      "id": "meba",
+      "nom": "métaux de base",
+    },
+    Object {
+      "description": null,
+      "id": "meco",
+      "nom": "métaux connexes",
+    },
+    Object {
+      "description": null,
+      "id": "mepr",
+      "nom": "métaux précieux",
+    },
+    Object {
+      "description": "Minéral - Silicates en feuillets riches en aluminium et potassium (micas blancs) ou en magnésium et fer (micas noirs) dont les propriétés physico-minéralogiques trouvent de nombreuses applications dans les domaines de l'isolation et des charges minérales.",
+      "id": "mica",
+      "nom": "micas",
+    },
+    Object {
+      "description": "Roche métamorphique cristallisée et schisteuse caractérisée par l'abondance de la fraction micacée et une plus faible teneur en quartz. Dans le domaine des roches ornementales et de construction, les proportions de quartz et de micas déterminent les propriétés de la roche comme la fissilité pour la production de dallage ou de couverture. Sa richesse en mica confère un aspect brillant à sa surface. Dans le domaine des minéraux industriel, cette roche est valorisée dans des applications de type charge minérale.",
+      "id": "mics",
+      "nom": "micaschistes",
+    },
+    Object {
+      "description": "Roche métamorphique formée d'une alternance de roches de type granite de couleur sombre et de roche de type gneiss de couleur clair. La partie de couleur claire est assimilé à la partie de la roche ayant fondu et est appelée \\"le mobilisat\\". La partie de couleur sombre constitue la partie de la roche étant restée solide et est appelée \\"la restite\\". Ses bonnes propriétés mécaniques, permettent de l'utiliser comme roche ornementale et de construction ou comme granulat.",
+      "id": "migm",
+      "nom": "migmatite",
+    },
+    Object {
+      "description": "Roche autre cataclastique résultant du cisaillement et du broyage puis de la recristallisation plus ou moins intense de roches préexistantes de différentes natures (éventuellement recristallisées) dans une zone de formation intense de failles. Elle est constituée d'une hétérogénéité de roches.",
+      "id": "mylo",
+      "nom": "mylonites",
+    },
+    Object {
+      "description": null,
+      "id": "neod",
+      "nom": "néodyme",
+    },
+    Object {
+      "description": "Mélange sédimentaire naturel de kaolinite (argile), d'oxyde de fer rouge (hématite) et d'hydroxyde de fer jaune-oranger (limonite) utilisé pour la production de pigments naturels dans les peintures et les enduits.",
+      "id": "ocre",
+      "nom": "ocres",
+    },
+    Object {
+      "description": "Roche plutonique intermédiaire entre basalte et gabbro présentant un faciès plus ou moins altéré de couleur vert-foncé. En tant que roche ornementale et de construction elle est sélectionnée pour son aspect décoratif. Son emploi en tant que granulats est dû à sa dureté et à sa compacité.",
+      "id": "ophi",
+      "nom": "ophite",
+    },
+    Object {
+      "description": null,
+      "id": "osmi",
+      "nom": "osmium",
+    },
+    Object {
+      "description": null,
+      "id": "pall",
+      "nom": "palladium",
+    },
+    Object {
+      "description": "Roche volcanique de couleur claire à texture vitreuse plus ou moins hydratée et composition rhyolitique utilisée dans l'industrie pour la production d'agents filtrants et d'additifs fonctionnels. Elle est utilisée dans l'industrie pour la production d'agents filtrants et d'additifs fonctionnels.",
+      "id": "perl",
+      "nom": "perlite",
+    },
+    Object {
+      "description": "Roche volcanique à grain très fin, de couleur grise tirant parfois sur le vert ou le brun, qui se débite en plaques et qui, sous le choc du métal, rend un son clair (dalles sonores). Sa composition chimique est déficitaire en silice (dite sous-saturées en silice). Le silicium y représente donc moins de la moitié des cations. Ces caractéristiques mécaniques (dureté) permettent son utilisation en tant que granulat. En tant que roche ornementale et de construction, elle est utilisée comme pierre ardoisière en Auvergne. En tant que minéraux industriels, sa composition chimique sous-saturée en silice est recherchée pour les industries du verre et de la céramique.",
+      "id": "phon",
+      "nom": "phonolite",
+    },
+    Object {
+      "description": null,
+      "id": "pipe",
+      "nom": "pierres précieuses",
+    },
+    Object {
+      "description": null,
+      "id": "polo",
+      "nom": "polonium",
+    },
+    Object {
+      "description": "Roche plutonique caractérisée par une texture intermédiaire constituée de cristaux de feldpaths baignant dans une matrice finement cristallisée. Dans le domaine des roches ornementales et de construction, la couleur variable de cette roche est utilisée pour son aspect décoratif. Dans le domaine des minéraux industriels, cette roche est employée pour ces propriétés mécaniques (dureté, résistance aux chocs et à l'abrasion).",
+      "id": "porp",
+      "nom": "porphyre",
+    },
+    Object {
+      "description": "Roche volcanique scoriacée à texture bulleuse de couleur noire ou rouge brique. Elle est donc assez rarement exploitée en roche de construction sauf dans la région de Clermont-Ferrand et sur l'île de la Réunion. Elle permet la fabrication de moellons utilisés dans le bâtiment compte tenu de leurs propriétés (isolation thermique et phonique) (voir la fiche pouzzolane de Ph. Rocher). L'exploitation en roche ornementale est marginale et est destinée la construction de rocaille décorative dans les jardins d'agrément. En tant que granulats, elle est utilisée comme agent de sablage ou comme agrégat pour la réalisation de massifs drainants. Sa texture bulleuse peu résistante mécaniquement en fait tout de même un granulat léger notamment dans les bétons spéciaux. Dans le domaine des liants hydrauliques, elle peut être utilisée comme additifs pour la fabrication de certains ciments. Dans le domaine des minéraux industriels, elle est utilisée pour ses propriétés d'isolation phonique et thermique.",
+      "id": "pouz",
+      "nom": "pouzzolane",
+    },
+    Object {
+      "description": null,
+      "id": "pras",
+      "nom": "praséodyme",
+    },
+    Object {
+      "description": null,
+      "id": "prom",
+      "nom": "prométhium",
+    },
+    Object {
+      "description": null,
+      "id": "prot",
+      "nom": "protactinium",
+    },
+    Object {
+      "description": null,
+      "id": "prpa",
+      "nom": "propane",
+    },
+    Object {
+      "description": null,
+      "id": "prpy",
+      "nom": "propylène",
+    },
+    Object {
+      "description": null,
+      "id": "pyri",
+      "nom": "pyrite",
+    },
+    Object {
+      "description": "Minéral - Oxyde de silicium (SiO2) Dans le domaine des granulats, sans grand degré de pureté le quartz est valorisé pour ses caractéristiques mécaniques et certains aspects décoratifs. Dans le domaine des minéraux industriels, sa pureté en SiO2 est recherchée pour sa résistance à l'abrasion dans les revêtements de sols ou comme agent de décapage. Elle constitue une source de silicium pour des applications verre et céramique lorsqu'il présente un très haut degré de pureté.",
+      "id": "quar",
+      "nom": "quartz",
+    },
+    Object {
+      "description": "Roche métamorphique massive composée principalement de quartz issue de la recristallisation et de la cimentation du quartz. Les caractéristiques mécaniques sont favorables à la production de granulats de haute qualité (forte résistance à l'abrasion) ou à une utilisation comme roche ornementale et de construction. Le tombeau de Napoléon, aux Invalides, est réalisé dans un bloc de quartzite. Dans le domaine des minéraux industriels, sa pureté est recherchée pour être utilisée comme matériaux réfractaires.",
+      "id": "quat",
+      "nom": "quartzites",
+    },
+    Object {
+      "description": null,
+      "id": "rado",
+      "nom": "radon",
+    },
+    Object {
+      "description": "Roche métamorphique qui est à l'origine de l'argile ayant subi un faible métamorphisme et qui est devenue schisteuse. Ces roches ardoisières ont un plan de schistocité épais et peuvent avoir une fraction gréseuse. Elle comprend notamment les lauzes qui sont utilisées comme pierres de construction (dallage ou toiture).",
+      "id": "rard",
+      "nom": "roches ardoisières",
+    },
+    Object {
+      "description": "Famille de roches sédimentaire détritiques (issues de la dégradation mécanique d'autres roches) constituées d'éléments grossiers (galets) arrondis (qui traduisent un transport long avant sédimentation) cimentés par des éléments plus fins de type sables et graviers. Devenues suffisamment dures (indurées) ces roches sont utilisées pour la production de granulats. En tant que roches ornementales et de construction, elles présentent des caractéristiques mécaniques et esthétiques valorisables en décoration. Cette famille regroupe les roches suivantes : les arkoses, les brèches, les conglomérats et les poudingues. Ces dernières sont celles qui sont le plus souvent utilisées comme roches ornementales.",
+      "id": "rdet",
+      "nom": "roches détritiques grossières",
+    },
+    Object {
+      "description": null,
+      "id": "rhod",
+      "nom": "rhodium",
+    },
+    Object {
+      "description": "Roche volcanique effusive riche en silice de couleur claire constituée de fins cristaux de feldspaths dispersés dans une matrice vitreuse valorisée pour ses propriétés mécaniques et son aspect esthétique soit en tant que roche ornementale et de construction ou en tant que granulats.",
+      "id": "rhyo",
+      "nom": "rhyolite",
+    },
+    Object {
+      "description": null,
+      "id": "ruth",
+      "nom": "ruthénium",
+    },
+    Object {
+      "description": "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat.",
+      "id": "saco",
+      "nom": "sables coquilliers",
+    },
+    Object {
+      "description": null,
+      "id": "sama",
+      "nom": "samarium",
+    },
+    Object {
+      "description": "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat.",
+      "id": "samg",
+      "nom": "sables moyens à grossiers",
+    },
+    Object {
+      "description": "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat.",
+      "id": "sasi",
+      "nom": "sables siliceux",
+    },
+    Object {
+      "description": null,
+      "id": "scbi",
+      "nom": "schistes bitumineux",
+    },
+    Object {
+      "description": "Roche métamorphique à grains très fins peu ou pas décelables à l'œil nu présentant un débit en feuillet dû à la schistosité et à la présence de minéraux plats (micas, hornblende...) orientés. Utilisée pour ses propriétés mécaniques, cette roche est particulièrement délitable et donne des granulats de forme assez plate. Son aspect décoratif est valorisé en tant que roche ornementale et de construction.",
+      "id": "schi",
+      "nom": "schistes",
+    },
+    Object {
+      "description": null,
+      "id": "selg",
+      "nom": "sel gemme",
+    },
+    Object {
+      "description": null,
+      "id": "selp",
+      "nom": "puits d'eau salée",
+    },
+    Object {
+      "description": null,
+      "id": "sels",
+      "nom": "sels",
+    },
+    Object {
+      "description": null,
+      "id": "selx",
+      "nom": "sel",
+    },
+    Object {
+      "description": "Roche métamorphique de couleur jaunâtre à verdâtre (voire vert sombre) ou présentant des inclusions verdâtres (forme porphyrique) essentiellement constituée (plus de 75 %) d'antigorite (phyllosilicate magnésien). Cette roche provient de l'altération d'une péridotite en présence d'eau. Les serpentinites sont essentiellement exploitées aujourd'hui pour la production de granulats et plus rarement comme roches ornementales.",
+      "id": "serp",
+      "nom": "serpentinite",
+    },
+    Object {
+      "description": "Roche sédimentaire meuble d'origine détritique presque exclusivement constituée de grains calibrés de quartz de très grande pureté (égale ou > 98% de silice), utilisée dans les industries du verre et de la céramique et comme additif fonctionnel.",
+      "id": "sexs",
+      "nom": "sable extra siliceux",
+    },
+    Object {
+      "description": null,
+      "id": "sgin",
+      "nom": "sables et grès industriels",
+    },
+    Object {
+      "description": "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme de sables, graviers et galets de nature variable extraits d'anciens lits de cours d'eau et utilisé comme granulat encore aujourd'hui principalement dans des bétons spéciaux ou pour des couches drainantes.",
+      "id": "sgra",
+      "nom": "sables et graviers alluvionnaires",
+    },
+    Object {
+      "description": "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat.",
+      "id": "sgrm",
+      "nom": "sables et graviers marins",
+    },
+    Object {
+      "description": "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat.",
+      "id": "sgsc",
+      "nom": "sables et graviers silico-calcaires marins",
+    },
+    Object {
+      "description": "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat.",
+      "id": "sgsm",
+      "nom": "sables et graviers siliceux marins",
+    },
+    Object {
+      "description": null,
+      "id": "silc",
+      "nom": "silice",
+    },
+    Object {
+      "description": "Minéral - Silicate d'alumine (SiAl2O5) de même composition chimique que l'andalousite mais avec une structure cristalline et des propriétés physico-minéralogiques sensiblement différentes.",
+      "id": "sili",
+      "nom": "sillimanite",
+    },
+    Object {
+      "description": "Roche sédimentaire d'origine détritique issue d'une précipitation chimique et constituée de silice calcédonieuse presque pure la rendant très dure et quelques impuretés telles que de l'eau ou des oxydes, ces derniers influant sur sa couleur. De part, la dureté de cette roche, elle est valorisée sous forme de granulat. Pour l'industrie, elle est utilisée, sous forme de galet plus ou moins arrondis dont les propriétés mécaniques permettent d'en faire des charges broyantes ou des produits abrasifs ou dont la grande pureté chimique permet de faire de la silice industrielle. [Définition de la norme européenne EN 932-3 : Roche sédimentaire composée de silice cryptocristalline ou microcristalline (cristaux indétectables à l'œil nu), se formant en général en couches ou en nodules dans le calcaire.] Préférer le terme SILEX au terme CHERT qui vaut dire la même chose. Le silex est un chert se formant dans la craie du Crétacé (cf. falaise d'Etretat).",
+      "id": "silx",
+      "nom": "silex / chert",
+    },
+    Object {
+      "description": "Sables alluvionnaires ou de plage composés de minéraux lourds (rutile, zircon, barytine, grenat). L'accumulation des minéraux lourds se fait dans des placers dont l'origine est liée aux paramètres favorables de sédimentation. Ces minéraux peuvent être utilisés en industrie.",
+      "id": "smil",
+      "nom": "sables a minéraux lourds",
+    },
+    Object {
+      "description": "Roche sédimentaire meuble d'origine détritique pouvant soit être constituée majoritairement de grains de quartz (fort % de silice mais < à 98%) soit de calcaire et de silice (silico-calcaire). Ce sable est principalement utilisé comme produits de correction pour la fabrication du clinker, le constituant de base des ciments.",
+      "id": "sssc",
+      "nom": "sable siliceux ou silico-calcaire",
+    },
+    Object {
+      "description": "Roche d'origine diverse, caractérisée par des roches constituant des stériles d'ancienne exploitation (schiste, grès, carbonates ou roche grenue) dont les caractéristiques mécaniques et physiques permettent de les valoriser comme granulat.",
+      "id": "stex",
+      "nom": "stérile d'exploitation",
+    },
+    Object {
+      "description": "Roche plutonique grenue de couleur rose à rouge, composée de feldspath alcalin (assez riche en silice). Elle se rapproche du granite et du gabbro mais ne contient pas de quartz. L'équivalent volcanique d'une syénite est un trachyte. Elle est utilisée en tant que granulats ou roche ornementale et de construction.",
+      "id": "syen",
+      "nom": "syénite",
+    },
+    Object {
+      "description": "Minéral - Silicate de magnésium hydraté (Mg3 Si4 O10 (OH)2) présentant une structure en feuillets dont les propriétés comme la dureté (1 de l'échelle de Mohs), hydrophobie, grande inertie chimique, blancheur en font un remarquable additif fonctionnel de nombreux domaines (peintures, plastiques, pharmacopée...).",
+      "id": "talc",
+      "nom": "talc",
+    },
+    Object {
+      "description": null,
+      "id": "tech",
+      "nom": "technétium",
+    },
+    Object {
+      "description": null,
+      "id": "terb",
+      "nom": "terbium",
+    },
+    Object {
+      "description": "Horizon sédimentaire humifère constitué suivant la profondeur de l'accumulation de matière organique associée à la croissance des végétaux et de l'altération du substratum rocheux sous-jacent.",
+      "id": "terv",
+      "nom": "terre végétale",
+    },
+    Object {
+      "description": null,
+      "id": "thul",
+      "nom": "thulium",
+    },
+    Object {
+      "description": null,
+      "id": "tmas",
+      "nom": "tous métaux associés",
+    },
+    Object {
+      "description": "Roche sédimentaire organique résultant de l'accumulation de la matière organique liée à la croissance des végétaux et de leur transformation sous certaines conditions. Elle est utilisée principalement comme amendement.",
+      "id": "tour",
+      "nom": "tourbe",
+    },
+    Object {
+      "description": "Roche volcanique effusive de couleur gris-clair, à texture souvent poreuse constituée de fins cristaux (microlites) de feldspaths baignant dans une matrice vitreuse (du fait de sa teneur en silice assez élevée). Elle est utilisée pour ses bonnes caractéristiques mécaniques en tant que granulats et comme roches ornementales et de constructions (ex: lave de Volvic, lave de Chambois).",
+      "id": "trac",
+      "nom": "trachyte",
+    },
+    Object {
+      "description": "Roche sédimentaire blanchâtre peu stratifiée à texture crayeuse constituée de calcite, utilisée comme pierre de construction.",
+      "id": "tufo",
+      "nom": "tuffeau",
+    },
+    Object {
+      "description": null,
+      "id": "ytri",
+      "nom": "yttrium",
+    },
+    Object {
+      "description": null,
+      "id": "ytte",
+      "nom": "ytterbium",
+    },
+  ],
+}
+`;
diff --git a/packages/api/src/api/graphql/resolvers/substances.test.integration.ts b/packages/api/src/api/graphql/resolvers/substances.test.integration.ts
new file mode 100644
index 000000000..0610514d9
--- /dev/null
+++ b/packages/api/src/api/graphql/resolvers/substances.test.integration.ts
@@ -0,0 +1,26 @@
+import { graphQLCall } from '../../../../tests/_utils'
+import { dbManager } from '../../../../tests/db-manager'
+beforeAll(async () => {
+  await dbManager.populateDb()
+})
+
+afterAll(async () => {
+  await dbManager.closeKnex()
+})
+describe('substances', () => {
+  test('peut voir toutes les substances', async () => {
+    const res = await graphQLCall(
+      `query Substances {
+  substances {
+   id
+    nom
+    description    
+  }
+}`,
+      {},
+      'defaut'
+    )
+
+    expect(res.body.data).toMatchSnapshot()
+  })
+})
diff --git a/packages/api/src/api/graphql/resolvers/substances.ts b/packages/api/src/api/graphql/resolvers/substances.ts
index 56f78a9d2..c927051d0 100644
--- a/packages/api/src/api/graphql/resolvers/substances.ts
+++ b/packages/api/src/api/graphql/resolvers/substances.ts
@@ -1,13 +1,3 @@
-import {
-  substanceGet,
-  substancesGet,
-  substancesLegalesGet
-} from '../../../database/queries/substances'
+import { SubstancesLegales } from 'camino-common/src/static/substancesLegales'
 
-const substance = async ({ id }: { id: string }) => substanceGet(id)
-
-const substancesLegales = async () => substancesLegalesGet({ distinct: 'nom' })
-
-const substances = async () => substancesGet()
-
-export { substance, substances, substancesLegales }
+export const substances = () => SubstancesLegales
diff --git a/packages/api/src/api/graphql/resolvers/titres-activites.ts b/packages/api/src/api/graphql/resolvers/titres-activites.ts
index 1da613c77..e5853551d 100644
--- a/packages/api/src/api/graphql/resolvers/titres-activites.ts
+++ b/packages/api/src/api/graphql/resolvers/titres-activites.ts
@@ -102,7 +102,7 @@ const activites = async (
     annees,
     titresNoms,
     titresEntreprises,
-    titresSubstances,
+    titresSubstancesIds,
     titresReferences,
     titresTerritoires,
     titresTypesIds,
@@ -118,7 +118,7 @@ const activites = async (
     annees?: number[] | null
     titresNoms?: string | null
     titresEntreprises?: string | null
-    titresSubstances?: string | null
+    titresSubstancesIds?: string[] | null
     titresReferences?: string | null
     titresTerritoires?: string | null
     titresTypesIds?: string[] | null
@@ -151,7 +151,7 @@ const activites = async (
           annees,
           titresNoms,
           titresEntreprises,
-          titresSubstances,
+          titresSubstancesIds,
           titresReferences,
           titresTerritoires,
           statutsIds,
@@ -168,7 +168,7 @@ const activites = async (
           annees,
           titresNoms,
           titresEntreprises,
-          titresSubstances,
+          titresSubstancesIds,
           titresReferences,
           titresTerritoires,
           statutsIds,
diff --git a/packages/api/src/api/graphql/resolvers/titres-demarches.ts b/packages/api/src/api/graphql/resolvers/titres-demarches.ts
index 4e9c8660d..5d342a678 100644
--- a/packages/api/src/api/graphql/resolvers/titres-demarches.ts
+++ b/packages/api/src/api/graphql/resolvers/titres-demarches.ts
@@ -67,7 +67,7 @@ const demarches = async (
     titresStatutsIds,
     titresNoms,
     titresEntreprises,
-    titresSubstances,
+    titresSubstancesIds,
     titresReferences,
     titresTerritoires,
     travaux
@@ -85,7 +85,7 @@ const demarches = async (
     titresStatutsIds?: string[] | null
     titresNoms?: string | null
     titresEntreprises?: string | null
-    titresSubstances?: string | null
+    titresSubstancesIds?: string[] | null
     titresReferences?: string | null
     titresTerritoires?: string | null
     travaux?: boolean | null
@@ -122,7 +122,7 @@ const demarches = async (
           titresStatutsIds,
           titresNoms,
           titresEntreprises,
-          titresSubstances,
+          titresSubstancesIds,
           titresReferences,
           titresTerritoires,
           travaux
@@ -141,7 +141,7 @@ const demarches = async (
           titresStatutsIds,
           titresNoms,
           titresEntreprises,
-          titresSubstances,
+          titresSubstancesIds,
           titresReferences,
           titresTerritoires,
           travaux
diff --git a/packages/api/src/api/graphql/resolvers/titres-etapes.test.ts b/packages/api/src/api/graphql/resolvers/titres-etapes.test.ts
deleted file mode 100644
index 20e5ecac7..000000000
--- a/packages/api/src/api/graphql/resolvers/titres-etapes.test.ts
+++ /dev/null
@@ -1,45 +0,0 @@
-import { uglySubstanceTrick } from './titres-etapes'
-
-describe('uglySubstanceTrick', () => {
-  test('pas de substances', () => {
-    const initial = {}
-    const tested = { ...initial }
-
-    uglySubstanceTrick(0, tested)
-    expect(tested).toStrictEqual(initial)
-  })
-
-  test('des substances', () => {
-    const initial = {
-      substances: [
-        { id: 'auru', ordre: 1 },
-        { id: 'arge', ordre: 2 },
-        { id: 'plat', ordre: 3 }
-      ]
-    }
-    uglySubstanceTrick(0, initial)
-
-    expect(initial.substances).toStrictEqual([
-      { id: 'auru', ordre: 4 },
-      { id: 'arge', ordre: 5 },
-      { id: 'plat', ordre: 6 }
-    ])
-  })
-
-  test('des substances déjà en base', () => {
-    const initial = {
-      substances: [
-        { id: 'auru', ordre: 1 },
-        { id: 'arge', ordre: 2 },
-        { id: 'plat', ordre: 3 }
-      ]
-    }
-    uglySubstanceTrick(6, initial)
-
-    expect(initial.substances).toStrictEqual([
-      { id: 'auru', ordre: 7 },
-      { id: 'arge', ordre: 8 },
-      { id: 'plat', ordre: 9 }
-    ])
-  })
-})
diff --git a/packages/api/src/api/graphql/resolvers/titres-etapes.ts b/packages/api/src/api/graphql/resolvers/titres-etapes.ts
index 774432cdd..8dda6d640 100644
--- a/packages/api/src/api/graphql/resolvers/titres-etapes.ts
+++ b/packages/api/src/api/graphql/resolvers/titres-etapes.ts
@@ -16,7 +16,6 @@ import { titreFormat } from '../../_format/titres'
 import {
   titreEtapeCreate,
   titreEtapeGet,
-  titreEtapeMaxSubstanceOrdre,
   titreEtapeUpdate,
   titreEtapeUpsert
 } from '../../../database/queries/titres-etapes'
@@ -92,23 +91,6 @@ const statutIdAndDateGet = (
   return result
 }
 
-// il y a un index d’unicité sur la colonne ordre de titres_substances
-// on ne peut pas échanger la position de 2 substances via le upsertGraph de Objection, même avec une transaction
-// https://github.com/Vincit/objection.js/issues/1809)
-// VisibleForTesting
-export const uglySubstanceTrick = (
-  max: number,
-  etape: Pick<ITitreEtape, 'substances'>
-) => {
-  const maxOrdre =
-    etape.substances?.reduce(
-      (maxOrdre, substance) => Math.max(maxOrdre, substance.ordre ?? 0),
-      max
-    ) ?? 0
-  etape.substances?.forEach(substance => {
-    if (substance.ordre) substance.ordre += maxOrdre
-  })
-}
 const etape = async (
   { id }: { id: string },
   context: IToken,
@@ -181,7 +163,6 @@ const etapeHeritage = async (
             type: { id: {} },
             titulaires: { id: {} },
             amodiataires: { id: {} },
-            substances: { legales: { id: {} } },
             points: { references: { id: {} } }
           }
         }
@@ -543,11 +524,6 @@ const etapeModifier = async (
       )
     }
 
-    if (etape.substances?.length) {
-      const maxBdd = await titreEtapeMaxSubstanceOrdre(etape.id)
-      uglySubstanceTrick(maxBdd, etape)
-    }
-
     let etapeUpdated: ITitreEtape = await titreEtapeUpsert(
       etape,
       user!,
diff --git a/packages/api/src/api/graphql/resolvers/titres.ts b/packages/api/src/api/graphql/resolvers/titres.ts
index 839968fe7..b9a8736ff 100644
--- a/packages/api/src/api/graphql/resolvers/titres.ts
+++ b/packages/api/src/api/graphql/resolvers/titres.ts
@@ -53,9 +53,8 @@ const titres = async (
     typesIds,
     domainesIds,
     statutsIds,
-    substancesLegalesIds,
+    substancesIds,
     entreprisesIds,
-    substances,
     noms,
     entreprises,
     references,
@@ -71,7 +70,7 @@ const titres = async (
     typesIds: string[]
     domainesIds: string[]
     statutsIds: string[]
-    substancesLegalesIds: string[]
+    substancesIds: string[]
     entreprisesIds: string[]
     substances: string
     noms: string
@@ -99,9 +98,8 @@ const titres = async (
           typesIds,
           domainesIds,
           statutsIds,
-          substancesLegalesIds,
+          substancesIds,
           entreprisesIds,
-          substances,
           noms,
           entreprises,
           references,
@@ -117,9 +115,8 @@ const titres = async (
           typesIds,
           domainesIds,
           statutsIds,
-          substancesLegalesIds,
+          substancesIds,
           entreprisesIds,
-          substances,
           noms,
           entreprises,
           references,
diff --git a/packages/api/src/api/graphql/schemas/index.graphql b/packages/api/src/api/graphql/schemas/index.graphql
index 0c4bef9b6..0d7d9ea26 100644
--- a/packages/api/src/api/graphql/schemas/index.graphql
+++ b/packages/api/src/api/graphql/schemas/index.graphql
@@ -52,7 +52,7 @@ type Query {
     typesIds: [ID]
     domainesIds: [ID]
     statutsIds: [ID]
-    substancesLegalesIds: [ID]
+    substancesIds: [ID]
     entreprisesIds: [ID]
     substances: String
     noms: String
@@ -77,7 +77,7 @@ type Query {
     titresStatutsIds: [ID]
     titresNoms: String
     titresEntreprises: String
-    titresSubstances: String
+    titresSubstancesIds: [ID]
     titresReferences: String
     titresTerritoires: String
     travaux: Boolean
@@ -108,7 +108,7 @@ type Query {
     titresStatutsIds: [ID]
     titresNoms: String
     titresEntreprises: String
-    titresSubstances: String
+    titresSubstancesIds: [String]
     titresReferences: String
     titresTerritoires: String
   ): Activites
@@ -152,15 +152,9 @@ type Query {
     emails: String
   ): Utilisateurs
 
-  "Substance en fonction de son id"
-  substance(id: ID!): Substance
-
   "Liste des substances"
   substances: [Substance]
 
-  "Liste des substances par nom distinct"
-  substancesLegales: [SubstanceLegale]
-
   "Metas"
   devises: [Devise]
   documentsTypes(repertoire: ID, typeId: ID): [DocumentType]
diff --git a/packages/api/src/api/graphql/schemas/substances.graphql b/packages/api/src/api/graphql/schemas/substances.graphql
index f20797d68..c275131fc 100644
--- a/packages/api/src/api/graphql/schemas/substances.graphql
+++ b/packages/api/src/api/graphql/schemas/substances.graphql
@@ -3,26 +3,5 @@
 type Substance {
   id: ID!
   nom: String!
-  symbole: String
-  gerep: Int
   description: String
-  legales: [SubstanceLegale!]
-}
-
-type TitreSubstance {
-  id: ID!
-  nom: String!
-  symbole: String
-  gerep: Int
-  description: String
-  legales: [SubstanceLegale!]
-  ordre: Int
-}
-
-type SubstanceLegale {
-  id: ID!
-  nom: String!
-  domaine: Domaine
-  description: String
-  ordre: Int
 }
diff --git a/packages/api/src/api/graphql/schemas/titres-etapes.graphql b/packages/api/src/api/graphql/schemas/titres-etapes.graphql
index 847053ba1..3b8042238 100644
--- a/packages/api/src/api/graphql/schemas/titres-etapes.graphql
+++ b/packages/api/src/api/graphql/schemas/titres-etapes.graphql
@@ -51,7 +51,7 @@ type Etape {
   surface: Float
 
   "Substances concernées par le titre"
-  substances: [TitreSubstance]
+  substances: [String!]
 
   "Coordonnées des points du périmètre géographique du titre"
   points: [Point]
@@ -118,7 +118,7 @@ type EtapeHeritage {
   surface: Float
 
   "Substances concernées par le titre"
-  substances: [TitreSubstance]
+  substances: [String!]
 
   "Coordonnées des points du périmètre géographique du titre"
   points: [Point]
@@ -178,7 +178,7 @@ input InputEtapeCreation {
   dateDebut: String
   dateFin: String
   surface: Float
-  substances: [InputSubstances!]
+  substances: [String!]
   points: [InputPoint]
   titulaires: [InputEtapeEntreprise!]
   amodiataires: [InputEtapeEntreprise!]
@@ -201,7 +201,7 @@ input InputEtapeModification {
   dateDebut: String
   dateFin: String
   surface: Float
-  substances: [InputSubstances!]
+  substances: [String!]
   points: [InputPoint]
   titulaires: [InputEtapeEntreprise!]
   amodiataires: [InputEtapeEntreprise!]
@@ -248,11 +248,6 @@ input InputHeritageProp {
   actif: Boolean
 }
 
-input InputSubstances {
-  id: ID!
-  ordre: Int
-}
-
 input InputEtapeEntreprise {
   id: ID!
   operateur: Boolean
diff --git a/packages/api/src/api/graphql/schemas/titres.graphql b/packages/api/src/api/graphql/schemas/titres.graphql
index 715dcc5fd..84babd6d1 100644
--- a/packages/api/src/api/graphql/schemas/titres.graphql
+++ b/packages/api/src/api/graphql/schemas/titres.graphql
@@ -50,7 +50,7 @@ type Titre {
   statut: TitreStatut!
 
   "Substances concernées par le titre dans son dernier état de validité"
-  substances: [TitreSubstance]
+  substances: [String!]
 
   "Coordonnées x,y du titre"
   coordonnees: Coordonnees
diff --git a/packages/api/src/api/graphql/titres-etapes-creer.test.integration.ts b/packages/api/src/api/graphql/titres-etapes-creer.test.integration.ts
index 710899da3..6cb9a4a24 100644
--- a/packages/api/src/api/graphql/titres-etapes-creer.test.integration.ts
+++ b/packages/api/src/api/graphql/titres-etapes-creer.test.integration.ts
@@ -149,7 +149,7 @@ describe('etapeCreer', () => {
             }
           },
           contenu: { arm: { mecanise: true, franchissements: 3 } },
-          substances: [{ id: 'auru' }],
+          substances: ['auru'],
           duree: 10,
           documentIds: ['dep', 'doe'],
           points: [
@@ -309,7 +309,7 @@ describe('etapeCreer', () => {
               franchissements: { actif: true }
             }
           },
-          substances: [{ id: 'auru' }],
+          substances: ['auru'],
           points: [
             {
               groupe: 1,
diff --git a/packages/api/src/api/rest/entreprises.test.ts b/packages/api/src/api/rest/entreprises.test.ts
index 3caab3bec..8592fb3db 100644
--- a/packages/api/src/api/rest/entreprises.test.ts
+++ b/packages/api/src/api/rest/entreprises.test.ts
@@ -1,5 +1,6 @@
 import { bodyBuilder, responseExtractor } from './entreprises'
 import { DEPARTEMENT_IDS } from 'camino-common/src/static/departement'
+import Titres from '../../database/models/titres'
 
 const entreprise = { id: 'entrepriseId', categorie: 'PME', nom: 'ma companie' }
 const entreprise2 = {
@@ -58,11 +59,12 @@ describe('construit le corps de la requête pour openFisca', () => {
         contenu: { renseignements: { environnement: 1000 } }
       }
     ]
-    const titres = [
+    const titres: Pick<
+      Titres,
+      'titulaires' | 'amodiataires' | 'substances' | 'communes' | 'id'
+    >[] = [
       {
-        substances: [
-          { id: 'auru', nom: 'or', legales: [{ id: 'auru', nom: 'or' }] }
-        ],
+        substances: ['auru'],
         titulaires: [entreprise2],
         amodiataires: [],
         communes: [
@@ -76,10 +78,7 @@ describe('construit le corps de la requête pour openFisca', () => {
         id: 'titreSansActivite'
       },
       {
-        substances: [
-          { id: 'auru', nom: 'or', legales: [{ id: 'auru', nom: 'or' }] },
-          { id: 'suco', nom: 'substances connexes', legales: [] }
-        ],
+        substances: ['auru', 'scoc'],
         communes: [
           {
             id: '97310',
@@ -93,10 +92,7 @@ describe('construit le corps de la requête pour openFisca', () => {
         id: 'titre1'
       },
       {
-        substances: [
-          { id: 'auru', nom: 'or', legales: [{ id: 'auru', nom: 'or' }] },
-          { id: 'suco', nom: 'substances connexes', legales: [] }
-        ],
+        substances: ['auru', 'scoc'],
         titulaires: [entreprise],
         amodiataires: [],
         communes: [
@@ -107,14 +103,10 @@ describe('construit le corps de la requête pour openFisca', () => {
             surface: 19805494
           }
         ],
-        pays: [{ id: 'GF', nom: 'unused' }],
         id: 'titre2'
       },
       {
-        substances: [
-          { id: 'auru', nom: 'or', legales: [{ id: 'auru', nom: 'or' }] },
-          { id: 'suco', nom: 'substances connexes', legales: [] }
-        ],
+        substances: ['auru', 'scoc'],
         titulaires: [entreprise2],
         amodiataires: [],
         communes: [
@@ -128,10 +120,7 @@ describe('construit le corps de la requête pour openFisca', () => {
         id: 'titre3'
       },
       {
-        substances: [
-          { id: 'auru', nom: 'or', legales: [{ id: 'auru', nom: 'or' }] },
-          { id: 'suco', nom: 'substances connexes', legales: [] }
-        ],
+        substances: ['auru', 'scoc'],
         titulaires: [entreprise2],
         amodiataires: [],
         communes: [
@@ -145,10 +134,7 @@ describe('construit le corps de la requête pour openFisca', () => {
         id: 'titre4'
       },
       {
-        substances: [
-          { id: 'auru', nom: 'or', legales: [{ id: 'auru', nom: 'or' }] },
-          { id: 'suco', nom: 'substances connexes', legales: [] }
-        ],
+        substances: ['auru', 'scoc'],
         titulaires: [entreprise],
         amodiataires: [],
         communes: [
diff --git a/packages/api/src/api/rest/entreprises.ts b/packages/api/src/api/rest/entreprises.ts
index 5fc7fae82..400dc5fde 100644
--- a/packages/api/src/api/rest/entreprises.ts
+++ b/packages/api/src/api/rest/entreprises.ts
@@ -27,8 +27,8 @@ import Titres from '../../database/models/titres'
 import { CustomResponse } from './express-type'
 import {
   SubstanceFiscale,
-  SubstancesFiscales
-} from 'camino-common/src/static/substance'
+  substancesFiscalesBySubstanceLegale
+} from 'camino-common/src/static/substancesFiscales'
 import { Departements } from 'camino-common/src/static/departement'
 import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
 import { Regions } from 'camino-common/src/static/region'
@@ -119,19 +119,10 @@ export const bodyBuilder = (
     }
 
     if (titre.substances.length > 0 && activite.contenu) {
-      if (!titre.substances[0].legales) {
-        throw new Error(
-          `les substances légales des substances du titre ${activite.titreId} ne sont pas chargées`
-        )
-      }
-
       const substanceLegalesWithFiscales = titre.substances
-        .flatMap(s => s.legales)
         .filter(isNotNullNorUndefined)
-        .filter(s =>
-          SubstancesFiscales.some(
-            ({ substanceLegaleId }) => substanceLegaleId === s.id
-          )
+        .filter(
+          substanceId => substancesFiscalesBySubstanceLegale(substanceId).length
         )
 
       if (substanceLegalesWithFiscales.length > 1) {
@@ -143,10 +134,7 @@ export const bodyBuilder = (
       }
 
       const substancesFiscales = substanceLegalesWithFiscales.flatMap(
-        ({ id }) =>
-          SubstancesFiscales.filter(
-            ({ substanceLegaleId }) => substanceLegaleId === id
-          )
+        substanceId => substancesFiscalesBySubstanceLegale(substanceId)
       )
 
       for (const substancesFiscale of substancesFiscales) {
@@ -373,7 +361,7 @@ export const fiscalite = async (
       { entreprisesIds: [entrepriseId] },
       {
         fields: {
-          substances: { legales: { id: {} } },
+          substancesEtape: { id: {} },
           communes: { id: {} }
         }
       },
diff --git a/packages/api/src/api/rest/format/titres-activites.ts b/packages/api/src/api/rest/format/titres-activites.ts
index 0f8ad479b..8b0798360 100644
--- a/packages/api/src/api/rest/format/titres-activites.ts
+++ b/packages/api/src/api/rest/format/titres-activites.ts
@@ -8,7 +8,7 @@ import {
 import {
   isSubstanceFiscale,
   SubstancesFiscale
-} from 'camino-common/src/static/substance'
+} from 'camino-common/src/static/substancesFiscales'
 import { UniteId, Unites } from 'camino-common/src/static/unites'
 
 const titreActiviteContenuFormat = (contenu: IContenu, sections: ISection[]) =>
diff --git a/packages/api/src/api/rest/format/titres.ts b/packages/api/src/api/rest/format/titres.ts
index 59defe2df..ed8837743 100644
--- a/packages/api/src/api/rest/format/titres.ts
+++ b/packages/api/src/api/rest/format/titres.ts
@@ -9,6 +9,7 @@ import {
 } from '../../../types'
 import { Departements } from 'camino-common/src/static/departement'
 import { Regions } from 'camino-common/src/static/region'
+import { SubstancesLegale } from 'camino-common/src/static/substancesLegales'
 
 const titreContenuTableFormat = (contenu?: IContenu | null) =>
   contenu
@@ -54,7 +55,9 @@ export const titresTableFormat = (titres: ITitre[]) =>
       date_fin: titre.dateFin,
       date_demande: titre.dateDemande,
       statut: titre.statut!.nom,
-      substances: titre.substances!.map(s => s.nom).join(separator),
+      substances: titre
+        .substances!.map(substanceId => SubstancesLegale[substanceId].nom)
+        .join(separator),
       'surface renseignee km2': titre.surface,
       'communes (surface calculee km2)': communes.join(separator),
       forets: titre.forets?.map(f => f.nom).join(separator),
@@ -107,7 +110,10 @@ const titreGeojsonPropertiesFormat = (titre: ITitre) => {
     date_fin: titre.dateFin,
     date_demande: titre.dateDemande,
     statut: titre.statut!.nom,
-    substances: titre.substances!.map(s => s.nom).join(separator) || null,
+    substances:
+      titre
+        .substances!.map(substanceId => SubstancesLegale[substanceId].nom)
+        .join(separator) || null,
     'surface renseignee km2': titre.surface,
     'communes (surface calculee km2)': communes.join(separator),
     forets: titre.forets?.map(f => f.nom).join(separator),
diff --git a/packages/api/src/api/rest/index.ts b/packages/api/src/api/rest/index.ts
index 5da174c3d..dfdf669fb 100644
--- a/packages/api/src/api/rest/index.ts
+++ b/packages/api/src/api/rest/index.ts
@@ -45,7 +45,7 @@ const titreFields = {
   domaine: { id: {} },
   statut: { id: {} },
   references: { type: { id: {} } },
-  substances: { legales: { id: {} } },
+  substancesEtape: { id: {} },
   titulaires: { id: {} },
   amodiataires: { id: {} },
   surfaceEtape: { id: {} },
@@ -100,7 +100,7 @@ interface ITitresQueryInput {
   domainesIds?: string | null
   typesIds?: string | null
   statutsIds?: string | null
-  substancesLegalesIds?: string | null
+  substancesIds?: string | null
   titresIds?: string | null
   entreprisesIds?: string | null
   references?: string | null
@@ -117,7 +117,7 @@ const titres = async (
       typesIds,
       domainesIds,
       statutsIds,
-      substancesLegalesIds,
+      substancesIds,
       titresIds,
       entreprisesIds,
       references,
@@ -140,9 +140,7 @@ const titres = async (
       statutsIds: statutsIds?.split(','),
       ids: titresIds ? stringSplit(titresIds) : null,
       entreprisesIds: entreprisesIds ? stringSplit(entreprisesIds) : null,
-      substancesLegalesIds: substancesLegalesIds
-        ? stringSplit(substancesLegalesIds)
-        : null,
+      substancesIds: substancesIds ? stringSplit(substancesIds) : null,
       references,
       territoires,
       perimetre
@@ -175,7 +173,7 @@ const titres = async (
       typesIds,
       domainesIds,
       statutsIds,
-      substancesLegalesIds,
+      substancesIds,
       titresIds,
       entreprisesIds,
       references,
@@ -214,7 +212,7 @@ interface ITitresDemarchesQueryInput {
   titresStatutsIds?: string | null
   titresNoms?: string | null
   titresEntreprises?: string | null
-  titresSubstances?: string | null
+  titresSubstancesIds?: string | null
   titresReferences?: string | null
   titresTerritoires?: string | null
   travaux?: string | null
@@ -235,7 +233,7 @@ const demarches = async (
       titresStatutsIds,
       titresNoms,
       titresEntreprises,
-      titresSubstances,
+      titresSubstancesIds,
       titresReferences,
       titresTerritoires,
       travaux
@@ -260,7 +258,7 @@ const demarches = async (
       titresStatutsIds: titresStatutsIds?.split(','),
       titresNoms,
       titresEntreprises,
-      titresSubstances,
+      titresSubstancesIds: titresSubstancesIds?.split(','),
       titresReferences,
       titresTerritoires,
       travaux: travaux ? travaux === 'true' : undefined
@@ -292,7 +290,7 @@ const demarches = async (
     titreDemarcheFormat(titreDemarche)
   )
 
-  let contenu = ''
+  let contenu
 
   if (['csv', 'xlsx', 'ods'].includes(format)) {
     const elements = titresDemarchesFormatTable(demarchesFormatted)
@@ -325,7 +323,7 @@ interface ITitresActivitesQueryInput {
   annees?: string | null
   titresNoms?: string | null
   titresEntreprises?: string | null
-  titresSubstances?: string | null
+  titresSubstancesIds?: string | null
   titresReferences?: string | null
   titresTerritoires?: string | null
   titresTypesIds?: string | null
@@ -344,7 +342,7 @@ const activites = async (
       annees,
       titresNoms,
       titresEntreprises,
-      titresSubstances,
+      titresSubstancesIds,
       titresReferences,
       titresTerritoires,
       titresTypesIds,
@@ -367,7 +365,7 @@ const activites = async (
       annees: annees?.split(',').map(a => Number(a)),
       titresNoms,
       titresEntreprises,
-      titresSubstances,
+      titresSubstancesIds: titresSubstancesIds?.split(','),
       titresReferences,
       titresTerritoires,
       titresTypesIds: titresTypesIds?.split(','),
diff --git a/packages/api/src/business/matrices.ts b/packages/api/src/business/matrices.ts
index fffc97d94..83d5903a6 100644
--- a/packages/api/src/business/matrices.ts
+++ b/packages/api/src/business/matrices.ts
@@ -450,7 +450,7 @@ export const matrices = async (annee: number) => {
     },
     {
       fields: {
-        substances: { legales: { id: {} } },
+        substancesEtape: { id: {} },
         communes: { id: {} },
         titulaires: { id: {} },
         amodiataires: { id: {} },
diff --git a/packages/api/src/business/processes/titres-activites-update.ts b/packages/api/src/business/processes/titres-activites-update.ts
index 1c1b58d8b..8389ef14c 100644
--- a/packages/api/src/business/processes/titres-activites-update.ts
+++ b/packages/api/src/business/processes/titres-activites-update.ts
@@ -24,9 +24,7 @@ export const titresActivitesUpdate = async (titresIds?: string[]) => {
         demarches: {
           type: { id: {} },
           phase: { id: {} },
-          etapes: {
-            substances: { legales: { id: {} } }
-          }
+          etapes: { id: {} }
         },
         communes: { id: {} },
         activites: { id: {} },
diff --git a/packages/api/src/business/processes/titres-etapes-heritage-props-update.ts b/packages/api/src/business/processes/titres-etapes-heritage-props-update.ts
index 9b80baafa..f70e43556 100644
--- a/packages/api/src/business/processes/titres-etapes-heritage-props-update.ts
+++ b/packages/api/src/business/processes/titres-etapes-heritage-props-update.ts
@@ -21,7 +21,6 @@ export const titresEtapesHeritagePropsUpdate = async (
           type: { id: {} },
           titulaires: { id: {} },
           amodiataires: { id: {} },
-          substances: { id: {} },
           points: { references: { id: {} } }
         }
       }
diff --git a/packages/api/src/business/processes/titres-props-etapes-ids-update.ts b/packages/api/src/business/processes/titres-props-etapes-ids-update.ts
index 50b5f1de4..5be0c9100 100644
--- a/packages/api/src/business/processes/titres-props-etapes-ids-update.ts
+++ b/packages/api/src/business/processes/titres-props-etapes-ids-update.ts
@@ -28,8 +28,7 @@ export const titresPropsEtapesIdsUpdate = async (titresIds?: string[]) => {
             points: { id: {} },
             titulaires: { id: {} },
             amodiataires: { id: {} },
-            administrations: { id: {} },
-            substances: { id: {} }
+            administrations: { id: {} }
           }
         }
       }
diff --git a/packages/api/src/business/rules/__mocks__/titre-activites-build-titres.ts b/packages/api/src/business/rules/__mocks__/titre-activites-build-titres.ts
index de1703914..00b95dfdf 100644
--- a/packages/api/src/business/rules/__mocks__/titre-activites-build-titres.ts
+++ b/packages/api/src/business/rules/__mocks__/titre-activites-build-titres.ts
@@ -1,5 +1,5 @@
 import { IActiviteType, ITitreDemarche } from '../../../types'
-import { SubstancesFiscale } from 'camino-common/src/static/substance'
+import { SubstancesFiscale } from 'camino-common/src/static/substancesFiscales'
 import { UNITES } from 'camino-common/src/static/unites'
 
 const activiteTypeGra = {
@@ -220,22 +220,7 @@ const titreDemarches = [
         date: '2018-01-01',
         typeId: 'dpu',
         statutId: 'fai',
-        substances: [
-          {
-            id: 'auru',
-            legales: [
-              {
-                id: 'auru',
-                nom: 'Or'
-              },
-              {
-                id: 'nacl',
-                nom: 'Sel'
-              },
-              null
-            ]
-          }
-        ]
+        substances: ['auru', 'nacl', null]
       }
     ]
   } as ITitreDemarche
diff --git a/packages/api/src/business/rules/__mocks__/titre-prop-etape-find-demarches.ts b/packages/api/src/business/rules/__mocks__/titre-prop-etape-find-demarches.ts
index ecd6b37b8..905319fbb 100644
--- a/packages/api/src/business/rules/__mocks__/titre-prop-etape-find-demarches.ts
+++ b/packages/api/src/business/rules/__mocks__/titre-prop-etape-find-demarches.ts
@@ -505,7 +505,7 @@ const titreDemarchesProModPhaseEch = {
           ordre: 1,
           points: [1, 2, 3],
           surface: 3.2,
-          substances: [{ id: 'or' }],
+          substances: ['auru'],
           communes: ['paris'],
           titulaires: ['titulaire2'],
           amodiataires: ['amodiataire2'],
@@ -531,7 +531,7 @@ const titreDemarchesProModPhaseEch = {
           ordre: 1,
           points: [1, 2],
           surface: 3,
-          substances: [{ id: 'argent' }],
+          substances: ['arge'],
           communes: ['tours'],
           titulaires: ['titulaire1'],
           amodiataires: ['amodiataire1'],
diff --git a/packages/api/src/business/rules/titre-activites-build.ts b/packages/api/src/business/rules/titre-activites-build.ts
index c3307923e..0f6d8545e 100644
--- a/packages/api/src/business/rules/titre-activites-build.ts
+++ b/packages/api/src/business/rules/titre-activites-build.ts
@@ -4,7 +4,6 @@ import {
   ITitreDemarche,
   IActiviteType,
   ITitreActivite,
-  ISubstance,
   ISection,
   ISectionElement
 } from '../../types'
@@ -13,27 +12,19 @@ import { titreEtapePropFind } from './titre-etape-prop-find'
 import { titreActiviteValideCheck } from '../utils/titre-activite-valide-check'
 import {
   SubstanceFiscale,
-  SubstancesFiscale
-} from 'camino-common/src/static/substance'
+  substancesFiscalesBySubstanceLegale
+} from 'camino-common/src/static/substancesFiscales'
 import { UNITES, Unites } from 'camino-common/src/static/unites'
 import { sortedDevises } from 'camino-common/src/static/devise'
 import { exhaustiveCheck } from '../../tools/exhaustive-type-check'
+import { SubstanceLegaleId } from 'camino-common/src/static/substancesLegales'
 
-const onlyUnique = <T>(value: T, index: number, self: T[]): boolean => {
-  return self.indexOf(value) === index
-}
-
-const substancesFiscalesFind = (substances: ISubstance[]): SubstanceFiscale[] =>
+const substancesFiscalesFind = (
+  substances: SubstanceLegaleId[]
+): SubstanceFiscale[] =>
   substances
-    .flatMap(
-      s => s?.legales?.filter(legal => legal !== null).map(({ id }) => id) ?? []
-    )
-    .filter(onlyUnique)
-    .flatMap(id =>
-      Object.values(SubstancesFiscale).filter(
-        substance => substance.substanceLegaleId === id
-      )
-    )
+    .filter(s => !!s)
+    .flatMap(substanceId => substancesFiscalesBySubstanceLegale(substanceId))
 
 const titreActiviteSectionElementsFormat = (
   elements: ISectionElement[],
@@ -113,20 +104,20 @@ const titreActiviteSectionsBuild = (
         date,
         titreDemarches,
         titreTypeId
-      ) as ISubstance[] | null
+      ) as SubstanceLegaleId[] | null
 
       if (substances?.length) {
         const substancesFiscales = substancesFiscalesFind(substances)
 
         elements = substancesFiscales.map(sf => {
           const unite = Unites[sf.uniteId]
-          const element = {
+          const element: ISectionElement = {
             id: sf.id,
             nom: `${sf.nom}`,
             type: 'number',
             description: `<b>${unite.symbole} (${unite.nom})</b> ${sf.description}`,
             uniteId: sf.uniteId
-          } as ISectionElement
+          }
 
           if (unite.referenceUniteRatio) {
             element.referenceUniteRatio = unite.referenceUniteRatio
diff --git a/packages/api/src/business/utils/titre-etape-heritage-props-find.test.ts b/packages/api/src/business/utils/titre-etape-heritage-props-find.test.ts
index 1accb999f..5317b9d96 100644
--- a/packages/api/src/business/utils/titre-etape-heritage-props-find.test.ts
+++ b/packages/api/src/business/utils/titre-etape-heritage-props-find.test.ts
@@ -108,7 +108,7 @@ describe('retourne l’étape en fonction de son héritage', () => {
     })
   })
 
-  test.each(['titulaires', 'amodiataires', 'substances'])(
+  test.each(['titulaires', 'amodiataires'])(
     'l’étape est modifiée si changement sur les $propId',
     propId => {
       const titreEtapePrecedente = {
@@ -145,6 +145,37 @@ describe('retourne l’étape en fonction de son héritage', () => {
     }
   )
 
+  test('l’étape est modifiée si changement sur les substances', () => {
+    const titreEtapePrecedente = {
+      id: 'titreEtapePrecedenteId',
+      heritageProps: titreEtapePropsIds.reduce((acc, prop) => {
+        acc[prop] = { actif: false, etapeId: null }
+
+        return acc
+      }, {} as IHeritageProps)
+    } as ITitreEtape
+    titreEtapePrecedente.substances = ['auru', 'arge']
+
+    const titreEtape = objectClone(titreEtapePrecedente) as ITitreEtape
+    titreEtape.heritageProps!.substances.actif = true
+    titreEtape.id = 'titreEtapeId'
+    titreEtapePropsIds.forEach(
+      prop =>
+        (titreEtape.heritageProps![prop].etapeId = titreEtapePrecedente.id)
+    )
+    titreEtape.substances = ['nacl', 'arge']
+
+    const titreEtapeNew = objectClone(titreEtape) as ITitreEtape
+    titreEtapeNew.substances = ['auru', 'arge']
+
+    expect(
+      titreEtapeHeritagePropsFind(titreEtape, titreEtapePrecedente)
+    ).toEqual({
+      hasChanged: true,
+      titreEtape: titreEtapeNew
+    })
+  })
+
   test('l’étape est modifiée si il y a un titulaire en moins', () => {
     const titreEtapePrecedente = {
       id: 'titreEtapePrecedenteId',
diff --git a/packages/api/src/business/utils/titre-etape-heritage-props-find.ts b/packages/api/src/business/utils/titre-etape-heritage-props-find.ts
index 83c8df6c0..ef2005ffb 100644
--- a/packages/api/src/business/utils/titre-etape-heritage-props-find.ts
+++ b/packages/api/src/business/utils/titre-etape-heritage-props-find.ts
@@ -3,11 +3,11 @@ import {
   IEntreprise,
   ITitrePoint,
   ITitreIncertitudes,
-  ITitreSubstance,
   ITitreEntreprise
 } from '../../types'
 import { objectClone } from '../../tools/index'
 import { idGenerate } from '../../database/models/_format/id-create'
+import { SubstanceLegaleId } from 'camino-common/src/static/substancesLegales'
 
 const titreEtapePropsIds: (keyof ITitreEtape)[] = [
   'points',
@@ -57,19 +57,7 @@ const propertyArrayCheck = (
         (prevValue as ITitrePoint[]).map(comparator).sort().toString()
       )
     } else if (propId === 'substances') {
-      const comparator = (propValueArray: { id: string; ordre: number }) =>
-        propValueArray.id + propValueArray.ordre
-
-      return (
-        (newValue as { id: string; ordre: number }[])
-          .map(comparator)
-          .sort()
-          .toString() ===
-        (prevValue as { id: string; ordre: number }[])
-          .map(comparator)
-          .sort()
-          .toString()
-      )
+      return newValue.toString() === prevValue.toString()
     } else if (['titulaires', 'amodiataires'].includes(propId)) {
       const comparator = (propValueArray: ITitreEntreprise) =>
         propValueArray.id + propValueArray.operateur
@@ -89,7 +77,7 @@ type IPropValueArray =
   | null
   | IEntreprise[]
   | ITitrePoint[]
-  | ITitreSubstance[]
+  | SubstanceLegaleId[]
 
 type IPropValue = number | string | IPropValueArray
 
@@ -158,7 +146,7 @@ const titreEtapeHeritagePropsFind = (
           } else if (propId === 'amodiataires' || propId === 'titulaires') {
             newTitreEtape[propId] = newValue as IEntreprise[]
           } else if (propId === 'substances') {
-            newTitreEtape[propId] = newValue as ITitreSubstance[]
+            newTitreEtape[propId] = newValue as SubstanceLegaleId[]
           } else if (propId === 'dateDebut' || propId === 'dateFin') {
             newTitreEtape[propId] = newValue as string
           } else if (propId === 'duree' || propId === 'surface') {
diff --git a/packages/api/src/business/validations/titre-etape-updation-validate.test.ts b/packages/api/src/business/validations/titre-etape-updation-validate.test.ts
index 0c83d56e2..4edfb050c 100644
--- a/packages/api/src/business/validations/titre-etape-updation-validate.test.ts
+++ b/packages/api/src/business/validations/titre-etape-updation-validate.test.ts
@@ -1,26 +1,21 @@
-import {
-  ISubstance,
-  ITitreEtape,
-  ITitreDemarche,
-  ITitrePoint,
-  ITitre
-} from '../../types'
+import { ITitreEtape, ITitreDemarche, ITitrePoint, ITitre } from '../../types'
 
 import {
   titreEtapeCompleteValidate,
   titreEtapeUpdationValidate
 } from './titre-etape-updation-validate'
+import { SubstanceLegaleId } from 'camino-common/src/static/substancesLegales'
 
 describe('valide l’étape avant de l’enregistrer', () => {
   test.each`
-    substances          | etapeType | titreType | error
-    ${[]}               | ${'mfr'}  | ${'arm'}  | ${true}
-    ${[]}               | ${'mfr'}  | ${'axm'}  | ${true}
-    ${[]}               | ${'rde'}  | ${'arm'}  | ${false}
-    ${[]}               | ${'mfr'}  | ${'prm'}  | ${false}
-    ${[{ id: 'auru' }]} | ${'mfr'}  | ${'arm'}  | ${false}
-    ${[{ id: 'auru' }]} | ${'mfr'}  | ${'axm'}  | ${false}
-    ${[{}]}             | ${'mfr'}  | ${'axm'}  | ${true}
+    substances  | etapeType | titreType | error
+    ${[]}       | ${'mfr'}  | ${'arm'}  | ${true}
+    ${[]}       | ${'mfr'}  | ${'axm'}  | ${true}
+    ${[]}       | ${'rde'}  | ${'arm'}  | ${false}
+    ${[]}       | ${'mfr'}  | ${'prm'}  | ${false}
+    ${['auru']} | ${'mfr'}  | ${'arm'}  | ${false}
+    ${['auru']} | ${'mfr'}  | ${'axm'}  | ${false}
+    ${[]}       | ${'mfr'}  | ${'axm'}  | ${true}
   `(
     'teste la complétude des substances',
     ({
@@ -29,7 +24,7 @@ describe('valide l’étape avant de l’enregistrer', () => {
       titreType,
       error
     }: {
-      substances: ISubstance[]
+      substances: SubstanceLegaleId[]
       etapeType: string
       titreType: string
       error: boolean
diff --git a/packages/api/src/business/validations/titre-etape-updation-validate.ts b/packages/api/src/business/validations/titre-etape-updation-validate.ts
index fbd3bb7e1..18d06c400 100644
--- a/packages/api/src/business/validations/titre-etape-updation-validate.ts
+++ b/packages/api/src/business/validations/titre-etape-updation-validate.ts
@@ -215,7 +215,7 @@ const titreEtapeCompleteValidate = (
     if (
       !titreEtape.substances ||
       !titreEtape.substances.length ||
-      !titreEtape.substances.some(({ id }) => !!id)
+      !titreEtape.substances.some(substanceId => !!substanceId)
     ) {
       errors.push('au moins une substance doit être renseignée')
     }
diff --git a/packages/api/src/database/models/_format/titre-etape-heritage.ts b/packages/api/src/database/models/_format/titre-etape-heritage.ts
index 239834f0c..3f2b43d60 100644
--- a/packages/api/src/database/models/_format/titre-etape-heritage.ts
+++ b/packages/api/src/database/models/_format/titre-etape-heritage.ts
@@ -8,8 +8,6 @@ const heritagePropsFormat = async (heritageProps: IHeritageProps) => {
       const fields = { type: { id: {} } } as IFields
       if (propId === 'points') {
         fields.points = { references: { id: {} } }
-      } else if (propId === 'substances') {
-        fields.substances = { legales: { id: {} } }
       } else if (['titulaires', 'amodiataires'].includes(propId)) {
         fields[propId] = { id: {} }
       }
diff --git a/packages/api/src/database/models/substances-legales.ts b/packages/api/src/database/models/substances-legales.ts
deleted file mode 100644
index 5c593e0bb..000000000
--- a/packages/api/src/database/models/substances-legales.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import { Model } from 'objection'
-
-import { ISubstanceLegale } from '../../types'
-
-import Domaines from './domaines'
-
-interface SubstancesLegales extends ISubstanceLegale {}
-
-class SubstancesLegales extends Model {
-  public static tableName = 'substancesLegales'
-
-  public static jsonSchema = {
-    type: 'object',
-    required: ['id', 'nom'],
-
-    properties: {
-      id: { type: 'string' },
-      nom: { type: ['string', 'null'] },
-      domaineId: { type: ['string', 'null'] },
-      description: { type: ['string', 'null'] },
-      substanceLegaleCodeId: { type: ['string', 'null'] }
-    }
-  }
-
-  static relationMappings = () => ({
-    domaine: {
-      relation: Model.BelongsToOneRelation,
-      modelClass: Domaines,
-      join: {
-        from: 'substancesLegales.domaineId',
-        to: 'domaines.id'
-      }
-    }
-  })
-}
-
-export default SubstancesLegales
diff --git a/packages/api/src/database/models/substances.ts b/packages/api/src/database/models/substances.ts
deleted file mode 100644
index b3782634c..000000000
--- a/packages/api/src/database/models/substances.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import { Model, Modifiers } from 'objection'
-
-import { ISubstance } from '../../types'
-import SubstancesLegales from './substances-legales'
-
-interface Substances extends ISubstance {}
-
-class Substances extends Model {
-  public static tableName = 'substances'
-
-  public static jsonSchema = {
-    type: 'object',
-    required: ['id', 'nom', 'substanceLegaleId'],
-
-    properties: {
-      id: { type: 'string' },
-      nom: { type: ['string', 'null'] },
-      symbole: { type: ['string', 'null'] },
-      gerep: { type: ['integer', 'null'] },
-      description: { type: ['string', 'null'], maxLength: 2048 },
-      substanceLegaleId: { type: 'string' }
-    }
-  }
-
-  static relationMappings = () => ({
-    legales: {
-      relation: Model.ManyToManyRelation,
-      modelClass: SubstancesLegales,
-      join: {
-        from: 'substances.id',
-        through: {
-          from: 'substances__substancesLegales.substanceId',
-          to: 'substances__substancesLegales.substanceLegaleId'
-        },
-        to: 'substancesLegales.id'
-      }
-    }
-  })
-
-  public static modifiers: Modifiers = {
-    orderAsc: builder => {
-      builder.orderBy('ordre', 'asc')
-    }
-  }
-}
-
-export default Substances
diff --git a/packages/api/src/database/models/titres-etapes.ts b/packages/api/src/database/models/titres-etapes.ts
index c56a85c9e..150ef710a 100644
--- a/packages/api/src/database/models/titres-etapes.ts
+++ b/packages/api/src/database/models/titres-etapes.ts
@@ -9,7 +9,6 @@ import {
 import { idGenerate } from './_format/id-create'
 import EtapesTypes from './etapes-types'
 import TitresDemarches from './titres-demarches'
-import Substances from './substances'
 import TitresPoints from './titres-points'
 import Entreprises from './entreprises'
 import Administrations from './administrations'
@@ -50,7 +49,8 @@ class TitresEtapes extends Model {
       heritageProps: { type: ['object', 'null'] },
       decisionsAnnexesSections: {},
       decisionsAnnexesContenu: { type: ['object', 'null'] },
-      archive: { type: 'boolean' }
+      archive: { type: 'boolean' },
+      substances: { type: 'array' }
     }
   }
 
@@ -73,20 +73,6 @@ class TitresEtapes extends Model {
       }
     },
 
-    substances: {
-      relation: Model.ManyToManyRelation,
-      modelClass: Substances,
-      join: {
-        from: 'titresEtapes.id',
-        through: {
-          from: 'titresSubstances.titreEtapeId',
-          to: 'titresSubstances.substanceId',
-          extra: ['ordre']
-        },
-        to: 'substances.id'
-      }
-    },
-
     points: {
       relation: Model.HasManyRelation,
       modelClass: TitresPoints,
diff --git a/packages/api/src/database/models/titres.ts b/packages/api/src/database/models/titres.ts
index cdc8973df..e1f4d03f7 100644
--- a/packages/api/src/database/models/titres.ts
+++ b/packages/api/src/database/models/titres.ts
@@ -7,7 +7,6 @@ import Communes from './communes'
 import Domaines from './domaines'
 import Entreprises from './entreprises'
 import TitresStatuts from './titres-statuts'
-import Substances from './substances'
 import TitresDemarches from './titres-demarches'
 import TitresEtapes from './titres-etapes'
 import TitresPoints from './titres-points'
@@ -90,17 +89,12 @@ class Titres extends Model {
       }
     },
 
-    substances: {
-      relation: Model.ManyToManyRelation,
-      modelClass: Substances,
+    substancesEtape: {
+      relation: Model.BelongsToOneRelation,
+      modelClass: TitresEtapes,
       join: {
         from: ref('titres.propsTitreEtapesIds:substances').castText(),
-        through: {
-          from: 'titresSubstances.titreEtapeId',
-          to: 'titresSubstances.substanceId',
-          extra: ['ordre']
-        },
-        to: 'substances.id'
+        to: 'titresEtapes.id'
       }
     },
 
@@ -270,6 +264,10 @@ class Titres extends Model {
         this.demarches
       )
     }
+
+    if (this.substancesEtape) {
+      this.substances = this.substancesEtape.substances
+    }
   }
 
   public $parseJson(json: Pojo) {
diff --git a/packages/api/src/database/queries/_options.ts b/packages/api/src/database/queries/_options.ts
index 8535fb1b6..e393a17c9 100644
--- a/packages/api/src/database/queries/_options.ts
+++ b/packages/api/src/database/queries/_options.ts
@@ -1,7 +1,3 @@
-const substances = {
-  graph: `legales.domaine`
-}
-
 const points = {
   graph: `references`
 }
@@ -79,7 +75,6 @@ const titresEtapesRelateTrue = [
   'titulaires',
   'amodiataires',
   'administrations',
-  'substances',
   'communes',
   'forets',
   'justificatifs'
@@ -94,7 +89,6 @@ const titresEtapesRelateFalse = [
   'amodiataires.utilisateurs',
   'administrations.titresTypes',
   'administrations.utilisateurs',
-  'substances.legales',
   ...documentsRelateFalse.map(k => `documents.${k}`),
   ...documentsRelateFalse.map(k => `justificatifs.${k}`)
 ]
@@ -105,7 +99,6 @@ const titresEtapes = {
     type,
     documents.${documents.graph},
     justificatifs.${documents.graph},
-    substances(orderAsc).${substances.graph},
     titulaires.${entreprises.graph},
     amodiataires.${entreprises.graph},
     administrations.${administrations.graph},
@@ -235,9 +228,7 @@ const titresRelateFalse = [
   'points.references',
   'communes',
   'forets',
-  'substances',
-  'substances.legales',
-  'substances.legales.domaine',
+  'substancesEtape',
   'titulaires',
   'titulaires.etablissements',
   'titulaires.utilisateurs',
@@ -265,7 +256,6 @@ const titres = {
     domaine.${domaines.graph},
     statut,
     points(orderAsc).${points.graph},
-    substances(orderAsc).${substances.graph},
     titulaires.${entreprises.graph},
     amodiataires.${entreprises.graph},
     administrationsGestionnaires.${administrations.graph},
@@ -300,7 +290,6 @@ export default {
   entreprises,
   entreprisesEtablissements,
   points,
-  substances,
   titres,
   titresActivites,
   titresDemarches,
diff --git a/packages/api/src/database/queries/_titres-filters.ts b/packages/api/src/database/queries/_titres-filters.ts
index 6d260492a..80486d910 100644
--- a/packages/api/src/database/queries/_titres-filters.ts
+++ b/packages/api/src/database/queries/_titres-filters.ts
@@ -31,11 +31,10 @@ export const titresFiltersQueryModify = (
     domainesIds,
     typesIds,
     statutsIds,
-    substancesLegalesIds,
+    substancesIds,
     entreprisesIds,
     noms,
     entreprises,
-    substances,
     references,
     territoires
   }: {
@@ -44,11 +43,10 @@ export const titresFiltersQueryModify = (
     domainesIds?: string[] | null
     typesIds?: string[] | null
     statutsIds?: string[] | null
-    substancesLegalesIds?: string[] | null
+    substancesIds?: string[] | null
     entreprisesIds?: string[] | null
     noms?: string | null
     entreprises?: string | null
-    substances?: string | null
     references?: string | null
     territoires?: string | null
   } = {},
@@ -94,14 +92,17 @@ export const titresFiltersQueryModify = (
     q.whereIn(`${name}.statutId`, statutsIds)
   }
 
-  if (substancesLegalesIds?.length) {
+  if (substancesIds?.length) {
     if (name === 'titre') {
       q.leftJoinRelated('titre')
     }
 
-    q.leftJoinRelated(jointureFormat(name, 'substances.legales'))
+    q.leftJoinRelated(jointureFormat(name, 'substancesEtape'))
 
-    q.whereIn(fieldFormat(name, 'substances:legales.id'), substancesLegalesIds)
+    q.whereRaw('?? @> ?', [
+      fieldFormat(name, 'substancesEtape.substances'),
+      JSON.stringify(substancesIds)
+    ])
   }
 
   if (entreprisesIds?.length) {
@@ -179,44 +180,6 @@ export const titresFiltersQueryModify = (
       )
   }
 
-  if (substances) {
-    const substancesArray = stringSplit(substances)
-
-    let fields = [
-      'substances.nom',
-      'substances.id',
-      'substances:legales.nom',
-      'substances:legales.id'
-    ]
-
-    if (name === 'titre') {
-      fields = fields.map(field => fieldFormat(name, field))
-    }
-
-    q.leftJoinRelated(jointureFormat(name, 'substances.legales'))
-      .where(b => {
-        substancesArray.forEach(s => {
-          fields.forEach(f => {
-            b.orWhereRaw(`lower(??) like ?`, [f, `%${s.toLowerCase()}%`])
-          })
-        })
-      })
-      .groupBy(`${root}.id`)
-      .havingRaw(
-        `(${substancesArray
-          .map(
-            () =>
-              'count(*) filter (where ' +
-              fields.map(() => 'lower(??) like ?').join(' or ') +
-              ') > 0'
-          )
-          .join(') and (')})`,
-        substancesArray.flatMap(s =>
-          fields.flatMap(f => [f, `%${s.toLowerCase()}%`])
-        )
-      )
-  }
-
   if (references) {
     const referencesArray = stringSplit(references)
 
diff --git a/packages/api/src/database/queries/graph/fields-add.ts b/packages/api/src/database/queries/graph/fields-add.ts
index 71b21ec21..b4a0b7ca9 100644
--- a/packages/api/src/database/queries/graph/fields-add.ts
+++ b/packages/api/src/database/queries/graph/fields-add.ts
@@ -86,6 +86,12 @@ const titresFieldsAdd = (fields: IFields) => {
     }
   }
 
+  if (fields.substances) {
+    if (!fields.substancesEtape) {
+      fields.substancesEtape = { id: {} }
+    }
+  }
+
   return fields
 }
 
diff --git a/packages/api/src/database/queries/graph/fields-format.ts b/packages/api/src/database/queries/graph/fields-format.ts
index 9bbd708f3..0488e6ca7 100644
--- a/packages/api/src/database/queries/graph/fields-format.ts
+++ b/packages/api/src/database/queries/graph/fields-format.ts
@@ -2,7 +2,6 @@ const fieldsOrderDesc = ['etablissements', 'demarches', 'activites']
 const fieldsOrderAsc = [
   'domaines',
   'points',
-  'substances',
   'references',
   'etapesTypes',
   'titresTypes',
@@ -199,10 +198,6 @@ export const fieldsFormat = (fields: IFields, parent: string) => {
       fields.points = { id: {} }
     }
 
-    if (!fields.substances) {
-      fields.substances = { id: {} }
-    }
-
     if (!fields.sdomZones) {
       fields.sdomZones = { id: {} }
     }
diff --git a/packages/api/src/database/queries/substances.ts b/packages/api/src/database/queries/substances.ts
deleted file mode 100644
index 00ce8b33c..000000000
--- a/packages/api/src/database/queries/substances.ts
+++ /dev/null
@@ -1,31 +0,0 @@
-import { ISubstanceLegale } from '../../types'
-
-import options from './_options'
-
-import Substances from '../models/substances'
-import SubstancesLegales from '../models/substances-legales'
-
-const substancesGet = async () =>
-  Substances.query().withGraphFetched(options.substances.graph).orderBy('nom')
-
-const substanceGet = async (id: string) =>
-  Substances.query().findById(id).withGraphFetched(options.substances.graph)
-
-const substancesLegalesGet = async ({ distinct }: { distinct: string }) => {
-  const query = SubstancesLegales.query()
-  if (distinct) {
-    query.distinctOn(distinct)
-  }
-
-  return query
-}
-
-const substanceFiscaleCreate = async (substanceLegale: ISubstanceLegale) =>
-  SubstancesLegales.query().insertAndFetch(substanceLegale)
-
-export {
-  substancesGet,
-  substanceGet,
-  substancesLegalesGet,
-  substanceFiscaleCreate
-}
diff --git a/packages/api/src/database/queries/titres-activites.ts b/packages/api/src/database/queries/titres-activites.ts
index 072e99273..a982ddb8d 100644
--- a/packages/api/src/database/queries/titres-activites.ts
+++ b/packages/api/src/database/queries/titres-activites.ts
@@ -48,7 +48,7 @@ const titresActivitesFiltersQueryModify = (
     annees,
     titresNoms,
     titresEntreprises,
-    titresSubstances,
+    titresSubstancesIds,
     titresReferences,
     titresTerritoires,
     titresTypesIds,
@@ -61,7 +61,7 @@ const titresActivitesFiltersQueryModify = (
     annees?: number[] | null
     titresNoms?: string | null
     titresEntreprises?: string | null
-    titresSubstances?: string | null
+    titresSubstancesIds?: string[] | null
     titresReferences?: string | null
     titresTerritoires?: string | null
     titresTypesIds?: string[] | null
@@ -94,7 +94,7 @@ const titresActivitesFiltersQueryModify = (
       statutsIds: titresStatutsIds,
       noms: titresNoms,
       entreprises: titresEntreprises,
-      substances: titresSubstances,
+      substancesIds: titresSubstancesIds,
       references: titresReferences,
       territoires: titresTerritoires
     },
@@ -228,7 +228,7 @@ const titresActivitesGet = async (
     annees,
     titresNoms,
     titresEntreprises,
-    titresSubstances,
+    titresSubstancesIds,
     titresReferences,
     titresTerritoires,
     titresTypesIds,
@@ -245,7 +245,7 @@ const titresActivitesGet = async (
     annees?: number[] | null
     titresNoms?: string | null
     titresEntreprises?: string | null
-    titresSubstances?: string | null
+    titresSubstancesIds?: string[] | null
     titresReferences?: string | null
     titresTerritoires?: string | null
     titresTypesIds?: string[] | null
@@ -265,7 +265,7 @@ const titresActivitesGet = async (
       annees,
       titresNoms,
       titresEntreprises,
-      titresSubstances,
+      titresSubstancesIds,
       titresReferences,
       titresTerritoires,
       titresTypesIds,
@@ -330,7 +330,7 @@ const titresActivitesCount = async (
     annees,
     titresNoms,
     titresEntreprises,
-    titresSubstances,
+    titresSubstancesIds,
     titresReferences,
     titresTerritoires,
     titresTypesIds,
@@ -342,7 +342,7 @@ const titresActivitesCount = async (
     annees?: number[] | null
     titresNoms?: string | null
     titresEntreprises?: string | null
-    titresSubstances?: string | null
+    titresSubstancesIds?: string[] | null
     titresReferences?: string | null
     titresTerritoires?: string | null
     titresTypesIds?: string[] | null
@@ -361,7 +361,7 @@ const titresActivitesCount = async (
       annees,
       titresNoms,
       titresEntreprises,
-      titresSubstances,
+      titresSubstancesIds,
       titresReferences,
       titresTerritoires,
       titresTypesIds,
diff --git a/packages/api/src/database/queries/titres-demarches.ts b/packages/api/src/database/queries/titres-demarches.ts
index 7f5db74ef..83a974dc6 100644
--- a/packages/api/src/database/queries/titres-demarches.ts
+++ b/packages/api/src/database/queries/titres-demarches.ts
@@ -69,7 +69,7 @@ const titresDemarchesFiltersQueryModify = (
     titresStatutsIds,
     titresNoms,
     titresEntreprises,
-    titresSubstances,
+    titresSubstancesIds,
     titresReferences,
     titresTerritoires,
     travaux
@@ -84,7 +84,7 @@ const titresDemarchesFiltersQueryModify = (
     titresStatutsIds?: string[] | null
     titresNoms?: string | null
     titresEntreprises?: string | null
-    titresSubstances?: string | null
+    titresSubstancesIds?: string[] | null
     titresReferences?: string | null
     titresTerritoires?: string | null
     travaux?: boolean | null
@@ -131,7 +131,7 @@ const titresDemarchesFiltersQueryModify = (
       statutsIds: titresStatutsIds,
       noms: titresNoms,
       entreprises: titresEntreprises,
-      substances: titresSubstances,
+      substancesIds: titresSubstancesIds,
       references: titresReferences,
       territoires: titresTerritoires
     },
@@ -168,7 +168,7 @@ const titresDemarchesCount = async (
     titresStatutsIds,
     titresNoms,
     titresEntreprises,
-    titresSubstances,
+    titresSubstancesIds,
     titresReferences,
     titresTerritoires,
     travaux
@@ -183,7 +183,7 @@ const titresDemarchesCount = async (
     titresStatutsIds?: string[] | null
     titresNoms?: string | null
     titresEntreprises?: string | null
-    titresSubstances?: string | null
+    titresSubstancesIds?: string[] | null
     titresReferences?: string | null
     titresTerritoires?: string | null
     travaux?: boolean | null
@@ -205,7 +205,7 @@ const titresDemarchesCount = async (
       titresStatutsIds,
       titresNoms,
       titresEntreprises,
-      titresSubstances,
+      titresSubstancesIds,
       titresReferences,
       titresTerritoires,
       travaux
@@ -249,7 +249,7 @@ const titresDemarchesGet = async (
     titresStatutsIds,
     titresNoms,
     titresEntreprises,
-    titresSubstances,
+    titresSubstancesIds,
     titresReferences,
     titresTerritoires,
     travaux
@@ -268,7 +268,7 @@ const titresDemarchesGet = async (
     titresStatutsIds?: string[] | null
     titresNoms?: string | null
     titresEntreprises?: string | null
-    titresSubstances?: string | null
+    titresSubstancesIds?: string[] | null
     titresReferences?: string | null
     titresTerritoires?: string | null
     travaux?: boolean | null
@@ -290,7 +290,7 @@ const titresDemarchesGet = async (
       titresStatutsIds,
       titresNoms,
       titresEntreprises,
-      titresSubstances,
+      titresSubstancesIds,
       titresReferences,
       titresTerritoires,
       travaux
diff --git a/packages/api/src/database/queries/titres-etapes.ts b/packages/api/src/database/queries/titres-etapes.ts
index a001b1349..a3684dbe2 100644
--- a/packages/api/src/database/queries/titres-etapes.ts
+++ b/packages/api/src/database/queries/titres-etapes.ts
@@ -8,8 +8,6 @@ import {
   ITitreForet,
   ITitreSDOMZone
 } from '../../types'
-import { knex } from '../../knex'
-
 import options from './_options'
 import graphBuild from './graph/build'
 import { fieldsFormat } from './graph/fields-format'
@@ -148,14 +146,6 @@ const titresEtapesCommunesUpdate = async (
     insertMissing: true
   })
 
-export const titreEtapeMaxSubstanceOrdre = async (titreEtapeId: string) => {
-  const result = await knex('titresSubstances')
-    .max('ordre as maxId')
-    .where({ titreEtapeId })
-    .first()
-
-  return typeof result?.maxId === 'number' ? result.maxId : 0
-}
 const titreEtapeCommuneDelete = async (
   titreEtapeId: string,
   communeId: string
diff --git a/packages/api/src/database/queries/titres.ts b/packages/api/src/database/queries/titres.ts
index a2780d2d3..a5e65c11d 100644
--- a/packages/api/src/database/queries/titres.ts
+++ b/packages/api/src/database/queries/titres.ts
@@ -80,11 +80,6 @@ const titresColonnes = {
   type: { id: 'type:type.nom', relation: 'type.type' },
   statut: { id: 'statutId', groupBy: ['titres.statutId'] },
   activites: { id: 'activites', groupBy: [] },
-  substances: {
-    id: raw(`STRING_AGG("substances"."nom", ' ; ')`),
-    relation: 'substances',
-    groupBy: []
-  },
   titulaires: {
     id: raw(`STRING_AGG("titulaires"."nom", ' ; ')`),
     relation: 'titulaires',
@@ -119,9 +114,8 @@ const titresGet = async (
     domainesIds,
     typesIds,
     statutsIds,
-    substancesLegalesIds,
+    substancesIds,
     entreprisesIds,
-    substances,
     noms,
     entreprises,
     references,
@@ -138,9 +132,8 @@ const titresGet = async (
     domainesIds?: string[] | null
     typesIds?: string[] | null
     statutsIds?: string[] | null
-    substancesLegalesIds?: string[] | null
+    substancesIds?: string[] | null
     entreprisesIds?: string[] | null
-    substances?: string | null
     noms?: string | null
     entreprises?: string | null
     references?: string | null
@@ -164,11 +157,10 @@ const titresGet = async (
       domainesIds,
       typesIds,
       statutsIds,
-      substancesLegalesIds,
+      substancesIds,
       entreprisesIds,
       noms,
       entreprises,
-      substances,
       references,
       territoires
     },
@@ -242,8 +234,7 @@ const titresCount = async (
     domainesIds,
     typesIds,
     statutsIds,
-    substances,
-    substancesLegalesIds,
+    substancesIds,
     entreprisesIds,
     noms,
     entreprises,
@@ -255,9 +246,8 @@ const titresCount = async (
     domainesIds?: string[] | null
     typesIds?: string[] | null
     statutsIds?: string[] | null
-    substancesLegalesIds?: string[] | null
+    substancesIds?: string[] | null
     entreprisesIds?: string[] | null
-    substances?: string | null
     noms?: string | null
     entreprises?: string | null
     references?: string | null
@@ -275,11 +265,10 @@ const titresCount = async (
       domainesIds,
       typesIds,
       statutsIds,
-      substancesLegalesIds,
+      substancesIds,
       entreprisesIds,
       noms,
       entreprises,
-      substances,
       references,
       territoires
     },
diff --git a/packages/api/src/knex/migrations-data/20220726122406_activites-fiscales-unites-fix.js b/packages/api/src/knex/migrations-data/20220726122406_activites-fiscales-unites-fix.js
index 50868ff0b..f47f19eb1 100644
--- a/packages/api/src/knex/migrations-data/20220726122406_activites-fiscales-unites-fix.js
+++ b/packages/api/src/knex/migrations-data/20220726122406_activites-fiscales-unites-fix.js
@@ -1,7 +1,7 @@
 const {
   SUBSTANCES_FISCALES_IDS,
   SubstancesFiscale
-} = require('camino-common/src/static/substance')
+} = require('camino-common/src/static/substancesFiscales')
 const { Unites } = require('camino-common/src/static/unites')
 exports.up = async knex => {
   const activites = await knex('titres_activites')
diff --git a/packages/api/src/knex/migrations-data/20220816140444_substances-ordre-required.js b/packages/api/src/knex/migrations-data/20220816140444_substances-ordre-required.js
new file mode 100644
index 000000000..483d3dc82
--- /dev/null
+++ b/packages/api/src/knex/migrations-data/20220816140444_substances-ordre-required.js
@@ -0,0 +1,27 @@
+exports.up = async knex => {
+  await knex('titres_substances').whereNull('ordre').update({ ordre: 0 })
+
+  const titresSubstances = await knex('titres_substances')
+
+  const groupByTitres = titresSubstances.reduce((acc, ts) => {
+    if (!acc[ts.titreEtapeId]) {
+      acc[ts.titreEtapeId] = []
+    }
+    acc[ts.titreEtapeId].push(ts)
+
+    return acc
+  }, {})
+
+  for (const titreSubstances of Object.values(groupByTitres)) {
+    titreSubstances.sort((a, b) => a.ordre - b.ordre)
+    for (let index = 0; index < titreSubstances.length; index++) {
+      const ts = titreSubstances[index]
+      await knex('titres_substances')
+        .where('titreEtapeId', ts.titreEtapeId)
+        .where('substanceId', ts.substanceId)
+        .update('ordre', index)
+    }
+  }
+}
+
+exports.down = () => ({})
diff --git a/packages/api/src/knex/migrations-schema/20220816143105_substances-delete.js b/packages/api/src/knex/migrations-schema/20220816143105_substances-delete.js
new file mode 100644
index 000000000..a91ea87bc
--- /dev/null
+++ b/packages/api/src/knex/migrations-schema/20220816143105_substances-delete.js
@@ -0,0 +1,58 @@
+exports.up = async knex => {
+  await knex.schema.alterTable('titres_substances', function (table) {
+    table.dropForeign('substance_id', 'titressubstances_substanceid_foreign')
+    table.integer('ordre').notNullable().alter()
+  })
+
+  await knex.raw('DROP INDEX titre_etape_id_unique')
+  await knex.raw('DROP INDEX titre_etape_id_ordre_unique')
+  await knex.raw(
+    'CREATE UNIQUE INDEX titre_etape_id_ordre_unique on titres_substances(titre_etape_id, ordre)'
+  )
+
+  await knex.schema.dropTable('substances__substances_legales')
+  await knex.schema.dropTable('substances_legales')
+  await knex.schema.dropTable('substances')
+
+  await knex('titres_substances')
+    .where('substance_id', 'suco')
+    .update({ substance_id: 'scoc' })
+
+  await knex('titres_substances')
+    .where('substance_id', 'scor')
+    .update({ substance_id: 'scoc' })
+
+  await knex('titres_substances')
+    .where('substance_id', 'bitm')
+    .update({ substance_id: 'hydm' })
+
+  await knex.schema.alterTable('titres_etapes', function (table) {
+    table.jsonb('substances').index()
+  })
+  const titresSubstances = await knex('titres_substances')
+
+  const substanceIdsByTitre = titresSubstances.reduce((acc, ts) => {
+    if (!acc[ts.titreEtapeId]) {
+      acc[ts.titreEtapeId] = []
+    }
+    acc[ts.titreEtapeId].push(ts)
+
+    return acc
+  }, {})
+
+  for (const titreEtapeId in substanceIdsByTitre) {
+    await knex('titres_etapes')
+      .where('id', titreEtapeId)
+      .update({
+        substances: JSON.stringify(
+          substanceIdsByTitre[titreEtapeId]
+            .sort((a, b) => a.ordre - b.ordre)
+            .map(({ substanceId }) => substanceId)
+        )
+      })
+  }
+
+  await knex.schema.dropTable('titres_substances')
+}
+
+exports.down = () => ({})
diff --git a/packages/api/src/knex/seeds/04-substances.js b/packages/api/src/knex/seeds/04-substances.js
deleted file mode 100644
index d80a11709..000000000
--- a/packages/api/src/knex/seeds/04-substances.js
+++ /dev/null
@@ -1,15 +0,0 @@
-const seeding = require('../seeding')
-
-const substances = require('../../../sources/substances.json')
-const substancesLegales = require('../../../sources/substances-legales.json')
-const substancesSubstancesLegales = require('../../../sources/substances--substances-legales.json')
-
-const seed = seeding(async ({ insert }) => {
-  await insert('substancesLegales', substancesLegales)
-  await insert('substances', substances)
-  await insert('substances__substancesLegales', substancesSubstancesLegales)
-})
-
-module.exports = seed
-
-module.exports.seed = seed
diff --git a/packages/api/src/tools/api-openfisca/index.ts b/packages/api/src/tools/api-openfisca/index.ts
index d55825aba..ee1b64fb2 100644
--- a/packages/api/src/tools/api-openfisca/index.ts
+++ b/packages/api/src/tools/api-openfisca/index.ts
@@ -1,5 +1,5 @@
 import fetch, { Response } from 'node-fetch'
-import { SubstanceFiscale } from 'camino-common/src/static/substance'
+import { SubstanceFiscale } from 'camino-common/src/static/substancesFiscales'
 import { Unite, Unites } from 'camino-common/src/static/unites'
 type Attribute =
   | 'surface_communale'
diff --git a/packages/api/src/tools/database-to-json/tables.ts b/packages/api/src/tools/database-to-json/tables.ts
index a43769c36..d7648824b 100644
--- a/packages/api/src/tools/database-to-json/tables.ts
+++ b/packages/api/src/tools/database-to-json/tables.ts
@@ -54,12 +54,6 @@ export const tables = [
   { name: 'mois', orderBy: ['id'] },
   { name: 'phases_statuts', orderBy: ['id'] },
   { name: 'references_types', orderBy: ['id'] },
-  { name: 'substances', orderBy: ['id'] },
-  {
-    name: 'substances__substances_legales',
-    orderBy: ['substance_id', 'substance_legale_id']
-  },
-  { name: 'substances_legales', orderBy: ['id'] },
   { name: 'titres', orderBy: ['id'] },
   { name: 'titres_activites', orderBy: ['id'] },
   {
@@ -88,7 +82,6 @@ export const tables = [
   { name: 'titres_points_references', orderBy: ['id'] },
   { name: 'titres_references', orderBy: ['titre_id', 'type_id'] },
   { name: 'titres_statuts', orderBy: ['id'] },
-  { name: 'titres_substances', orderBy: ['titre_etape_id', 'substance_id'] },
   { name: 'titres_titulaires', orderBy: ['titre_etape_id', 'entreprise_id'] },
   { name: 'titres_types', orderBy: ['id'] },
   {
diff --git a/packages/api/src/types.ts b/packages/api/src/types.ts
index 83d9b805c..020404a32 100644
--- a/packages/api/src/types.ts
+++ b/packages/api/src/types.ts
@@ -15,6 +15,8 @@ import { DemarcheTypeId } from 'camino-common/src/static/demarchesTypes'
 import { EtapeStatutId } from 'camino-common/src/static/etapesStatuts'
 import { Couleur } from 'camino-common/src/static/couleurs'
 import { EtapeTypeId } from 'camino-common/src/static/etapesTypes'
+import { SubstanceLegaleId } from 'camino-common/src/static/substancesLegales'
+import { UniteId } from 'camino-common/src/static/unites'
 
 const DemarchesStatutsTypesIds = {
   Accepte: 'acc',
@@ -209,6 +211,7 @@ interface ISectionElement {
   valeurs?: { id: string; nom: string }[] | null
   valeursMetasNom?: IValeurMetasNom
   referenceUniteRatio?: number
+  uniteId?: UniteId
   optionnel?: boolean
   elements?: ISectionElement[]
 }
@@ -582,27 +585,6 @@ interface ITitreStatut {
   ordre: number
 }
 
-interface ISubstanceLegale {
-  id: string
-  nom: string
-  domaineId?: string | null
-  description?: string | null
-  domaine?: IDomaine | null
-}
-
-interface ISubstance {
-  id: string
-  nom?: string | null
-  symbole?: string | null
-  gerep?: number | null
-  description?: string | null
-  legales?: ISubstanceLegale[]
-}
-
-interface ITitreSubstance extends ISubstance {
-  ordre?: number
-}
-
 export interface ITitreTitre {
   titreFromId: string
   titreToId: string
@@ -625,7 +607,8 @@ interface ITitre {
   activitesDeposees?: number | null
   activitesEnConstruction?: number | null
   activitesAbsentes?: number | null
-  substances?: ITitreSubstance[] | null
+  substancesEtape?: ITitreEtape | null
+  substances?: SubstanceLegaleId[] | null
   points?: ITitrePoint[] | null
   coordonnees?: ICoordonnees | null
   geojsonMultiPolygon?: IGeoJson | null
@@ -788,7 +771,7 @@ interface ITitreEtape {
   demarche?: ITitreDemarche
   dateDebut?: string | null
   dateFin?: string | null
-  substances?: ITitreSubstance[] | null
+  substances?: SubstanceLegaleId[] | null
   points?: ITitrePoint[] | null
   geojsonMultiPolygon?: IGeoJson | null
   geojsonPoints?: IGeoJson | null
@@ -1033,9 +1016,6 @@ export {
   IAdministrationActiviteType,
   IAdministrationActiviteTypeEmail,
   ITitreStatut,
-  ISubstance,
-  ISubstanceLegale,
-  ITitreSubstance,
   ITitre,
   ITitreActivite,
   ITitreAdministration,
diff --git a/packages/api/tests/_utils/administrations-permissions.ts b/packages/api/tests/_utils/administrations-permissions.ts
index fc7841b58..46f25687e 100644
--- a/packages/api/tests/_utils/administrations-permissions.ts
+++ b/packages/api/tests/_utils/administrations-permissions.ts
@@ -230,7 +230,7 @@ const creationCheck = async (
           ),
           heritageContenu,
           contenu,
-          substances: [{ id: 'auru' }],
+          substances: ['auru'],
           points: [
             {
               groupe: 1,
diff --git a/packages/api/tests/queries/substance-variables.json b/packages/api/tests/queries/substance-variables.json
deleted file mode 100644
index dd5fcf6f5..000000000
--- a/packages/api/tests/queries/substance-variables.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "id": "acti"
-}
diff --git a/packages/api/tests/queries/substance.graphql b/packages/api/tests/queries/substance.graphql
deleted file mode 100644
index 3d5b7a40f..000000000
--- a/packages/api/tests/queries/substance.graphql
+++ /dev/null
@@ -1,22 +0,0 @@
-query Substance($id: ID!) {
-  substance(id: $id) {
-    ...substance
-  }
-}
-
-fragment substance on Substance {
-  id
-  nom
-  symbole
-  gerep
-  description
-  legales {
-    id
-    nom
-    description
-    domaine {
-      id
-      nom
-    }
-  }
-}
diff --git a/packages/api/tests/queries/substances.graphql b/packages/api/tests/queries/substances.graphql
index ebcd66a8c..525555f2e 100644
--- a/packages/api/tests/queries/substances.graphql
+++ b/packages/api/tests/queries/substances.graphql
@@ -7,16 +7,5 @@ query {
 fragment substance on Substance {
   id
   nom
-  symbole
-  gerep
   description
-  legales {
-    id
-    nom
-    description
-    domaine {
-      id
-      nom
-    }
-  }
 }
diff --git a/packages/api/tests/queries/titre.graphql b/packages/api/tests/queries/titre.graphql
index 039a14c5c..7358c2f27 100644
--- a/packages/api/tests/queries/titre.graphql
+++ b/packages/api/tests/queries/titre.graphql
@@ -29,9 +29,7 @@ fragment titre on Titre {
     nom
   }
   surface
-  substances {
-    ...titreSubstance
-  }
+  substances
   administrations {
     ...administration
   }
@@ -139,9 +137,7 @@ fragment etape on Etape {
   geojsonMultiPolygon {
     ...geojsonMultiPolygon
   }
-  substances {
-    ...titreSubstance
-  }
+  substances
   documents {
     ...document
   }
@@ -247,22 +243,6 @@ fragment geojsonPoints on GeojsonPoints {
   }
 }
 
-fragment titreSubstance on TitreSubstance {
-  id
-  nom
-  gerep
-  description
-  legales {
-    id
-    nom
-    description
-    domaine {
-      id
-      nom
-    }
-  }
-}
-
 fragment document on Document {
   id
   url
diff --git a/packages/api/tests/queries/titres-min.graphql b/packages/api/tests/queries/titres-min.graphql
index 149e6c6fe..5c1f16cd3 100644
--- a/packages/api/tests/queries/titres-min.graphql
+++ b/packages/api/tests/queries/titres-min.graphql
@@ -49,9 +49,7 @@ fragment titre on Titre {
     couleur
   }
   surface
-  substances {
-    ...substance
-  }
+  substances
   administrations {
     ...administration
   }
@@ -126,19 +124,3 @@ fragment geojsonMultiPolygon on GeojsonMultiPolygon {
     coordinates
   }
 }
-
-fragment substance on TitreSubstance {
-  id
-  nom
-  gerep
-  description
-  legales {
-    id
-    nom
-    description
-    domaine {
-      id
-      nom
-    }
-  }
-}
diff --git a/packages/api/tests/queries/titres-variables.json b/packages/api/tests/queries/titres-variables.json
index c9e25254d..72d34c9dd 100644
--- a/packages/api/tests/queries/titres-variables.json
+++ b/packages/api/tests/queries/titres-variables.json
@@ -6,7 +6,7 @@
   "domainesIds": ["c", "f", "g", "h", "m", "r", "s", "w"],
   "typesIds": ["ap", "ar", "ax", "cx", "pc", "pr", "px"],
   "statutsIds": ["dmc", "dmi", "ech", "ind", "mod", "val"],
-  "substances": null,
+  "substancesIds": null,
   "noms": null,
   "entreprises": null,
   "references": null,
diff --git a/packages/api/tests/queries/titres.graphql b/packages/api/tests/queries/titres.graphql
index 2a87eb09b..72b4bd54a 100644
--- a/packages/api/tests/queries/titres.graphql
+++ b/packages/api/tests/queries/titres.graphql
@@ -2,7 +2,7 @@ query Titres(
   $domainesIds: [ID!]
   $typesIds: [ID!]
   $statutsIds: [ID!]
-  $substances: String
+  $substancesIds: String
   $noms: String
   $entreprises: String
   $references: String
@@ -12,7 +12,7 @@ query Titres(
     domainesIds: $domainesIds
     typesIds: $typesIds
     statutsIds: $statutsIds
-    substances: $substances
+    substancesIds: $substancesIds
     noms: $noms
     entreprises: $entreprises
     references: $references
@@ -48,9 +48,7 @@ fragment titre on Titre {
     ...reference
   }
   surface
-  substances {
-    ...titreSubstance
-  }
+  substances
   administrations {
     ...administration
   }
@@ -111,9 +109,7 @@ fragment etape on Etape {
     nom
   }
   statutId
-  substances {
-    ...titreSubstance
-  }
+  substances
   administrations {
     ...administration
   }
@@ -236,24 +232,6 @@ fragment geojsonPoints on GeojsonPoints {
   }
 }
 
-fragment titreSubstance on TitreSubstance {
-  id
-  nom
-  ordre
-  symbole
-  gerep
-  description
-  legales {
-    id
-    nom
-    description
-    domaine {
-      id
-      nom
-    }
-  }
-}
-
 fragment document on Document {
   id
   type {
diff --git a/packages/common/src/etape.ts b/packages/common/src/etape.ts
new file mode 100644
index 000000000..4a6008a01
--- /dev/null
+++ b/packages/common/src/etape.ts
@@ -0,0 +1,26 @@
+import { SubstanceLegaleId } from './static/substancesLegales'
+
+export interface HeritageProp {
+  actif: boolean
+  etape: Etape
+}
+
+export interface Etape {
+  contenu: { [key: string]: unknown }
+  date: string
+  type: { nom: string }
+  incertitudes: { [key: string]: boolean }
+  substances: SubstanceLegaleId[]
+  duree: number
+  dateDebut: string
+  dateFin: string
+  titulaires: Entreprise[]
+  amodiataires: Entreprise[]
+}
+
+interface Entreprise {
+  id: string
+  nom: string
+  etablissements: []
+  operateur: boolean
+}
diff --git a/packages/common/src/fiscalite.test.ts b/packages/common/src/fiscalite.test.ts
index a4fa10eeb..00af1cbff 100644
--- a/packages/common/src/fiscalite.test.ts
+++ b/packages/common/src/fiscalite.test.ts
@@ -2,9 +2,7 @@ import { fiscaliteVisible, fraisGestion } from './fiscalite'
 import { Role } from './roles'
 
 test('fraisGestion', () => {
-  expect(
-    fraisGestion({ redevanceDepartementale: 50, redevanceCommunale: 50 })
-  ).toBe(8)
+  expect(fraisGestion({ redevanceDepartementale: 50, redevanceCommunale: 50 })).toBe(8)
   expect(
     fraisGestion({
       redevanceDepartementale: 50,
diff --git a/packages/common/src/fiscalite.ts b/packages/common/src/fiscalite.ts
index e954487a2..1caecf4fe 100644
--- a/packages/common/src/fiscalite.ts
+++ b/packages/common/src/fiscalite.ts
@@ -19,14 +19,9 @@ export const isFiscaliteGuyane = (fiscalite: Fiscalite): fiscalite is FiscaliteG
   return 'guyane' in fiscalite
 }
 
-export const montantNetTaxeAurifere = (fiscalite: Fiscalite) =>
-  isFiscaliteGuyane(fiscalite) ? fiscalite.guyane.taxeAurifere : 0
+export const montantNetTaxeAurifere = (fiscalite: Fiscalite) => (isFiscaliteGuyane(fiscalite) ? fiscalite.guyane.taxeAurifere : 0)
 
-export const fraisGestion = (fiscalite: Fiscalite) =>
-  (fiscalite.redevanceDepartementale +
-    fiscalite.redevanceCommunale +
-    montantNetTaxeAurifere(fiscalite)) *
-  0.08
+export const fraisGestion = (fiscalite: Fiscalite) => (fiscalite.redevanceDepartementale + fiscalite.redevanceCommunale + montantNetTaxeAurifere(fiscalite)) * 0.08
 
 export const fiscaliteVisible = (
   user:
diff --git a/packages/common/src/static/__snapshots__/substancesFiscales.test.ts.snap b/packages/common/src/static/__snapshots__/substancesFiscales.test.ts.snap
new file mode 100644
index 000000000..54c85a434
--- /dev/null
+++ b/packages/common/src/static/__snapshots__/substancesFiscales.test.ts.snap
@@ -0,0 +1,90 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`substancesFiscalesBySubstanceLegale 1`] = `
+Array [
+  Object {
+    "description": "contenu dans les minerais",
+    "id": "auru",
+    "nom": "or",
+    "openFisca": Object {
+      "nom": "aurifere",
+      "unite": "mkg",
+    },
+    "substanceLegaleId": "auru",
+    "uniteId": "mgr",
+  },
+]
+`;
+
+exports[`substancesFiscalesBySubstanceLegale 2`] = `
+Array [
+  Object {
+    "description": "bauxite nettes livrées",
+    "id": "aloh",
+    "nom": "bauxite",
+    "substanceLegaleId": "aloh",
+    "uniteId": "mtk",
+  },
+  Object {
+    "description": "contenu dans les minerais",
+    "id": "cuiv",
+    "nom": "cuivre",
+    "substanceLegaleId": "cuiv",
+    "uniteId": "mtt",
+  },
+  Object {
+    "description": "contenu dans les minerais",
+    "id": "etai",
+    "nom": "étain",
+    "openFisca": Object {
+      "nom": "etain",
+    },
+    "substanceLegaleId": "etai",
+    "uniteId": "mtt",
+  },
+  Object {
+    "description": "net livré",
+    "id": "fera",
+    "nom": "pyrite de fer",
+    "openFisca": Object {
+      "nom": "fer_pyrite",
+    },
+    "substanceLegaleId": "ferx",
+    "uniteId": "mtk",
+  },
+  Object {
+    "description": "net livré",
+    "id": "ferb",
+    "nom": "minerais de fer",
+    "openFisca": Object {
+      "nom": "fer",
+    },
+    "substanceLegaleId": "ferx",
+    "uniteId": "mtk",
+  },
+  Object {
+    "description": "contenu dans les minerais",
+    "id": "mang",
+    "nom": "manganèse",
+    "openFisca": Object {
+      "nom": "manganese",
+    },
+    "substanceLegaleId": "mang",
+    "uniteId": "mtc",
+  },
+  Object {
+    "description": "contenu dans les minerais",
+    "id": "plom",
+    "nom": "plomb",
+    "substanceLegaleId": "plom",
+    "uniteId": "mtc",
+  },
+  Object {
+    "description": "contenu dans les minerais",
+    "id": "zinc",
+    "nom": "zinc",
+    "substanceLegaleId": "zinc",
+    "uniteId": "mtc",
+  },
+]
+`;
diff --git a/packages/common/src/static/domaines.ts b/packages/common/src/static/domaines.ts
index 290c596cd..f0ba71213 100644
--- a/packages/common/src/static/domaines.ts
+++ b/packages/common/src/static/domaines.ts
@@ -74,3 +74,5 @@ export const Domaines: { [key in DomaineId]: Definition<key> } = {
     ordre: 2
   }
 }
+
+export const sortedDomaines = Object.values(Domaines).sort((a, b) => a.ordre - b.ordre)
diff --git a/packages/common/src/static/substance.test.ts b/packages/common/src/static/substance.test.ts
deleted file mode 100644
index f4fd7e4e1..000000000
--- a/packages/common/src/static/substance.test.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { isSubstanceFiscale } from './substance'
-
-test('isSubstanceFiscale', () => {
-  expect(isSubstanceFiscale('wolf')).toBe(true)
-  expect(isSubstanceFiscale('plop')).toBe(false)
-})
diff --git a/packages/common/src/static/substancesFiscales.test.ts b/packages/common/src/static/substancesFiscales.test.ts
new file mode 100644
index 000000000..a10a8b601
--- /dev/null
+++ b/packages/common/src/static/substancesFiscales.test.ts
@@ -0,0 +1,11 @@
+import { isSubstanceFiscale, substancesFiscalesBySubstanceLegale } from './substancesFiscales'
+
+test('isSubstanceFiscale', () => {
+  expect(isSubstanceFiscale('wolf')).toBe(true)
+  expect(isSubstanceFiscale('plop')).toBe(false)
+})
+
+test('substancesFiscalesBySubstanceLegale', () => {
+  expect(substancesFiscalesBySubstanceLegale('auru')).toMatchSnapshot()
+  expect(substancesFiscalesBySubstanceLegale('meba')).toMatchSnapshot()
+})
diff --git a/packages/common/src/static/substance.ts b/packages/common/src/static/substancesFiscales.ts
similarity index 94%
rename from packages/common/src/static/substance.ts
rename to packages/common/src/static/substancesFiscales.ts
index fcaa84bfd..25214155e 100644
--- a/packages/common/src/static/substance.ts
+++ b/packages/common/src/static/substancesFiscales.ts
@@ -1,4 +1,5 @@
 import { UniteId } from './unites'
+import { SubstanceLegaleId, SubstancesLegales } from './substancesLegales'
 
 export const SUBSTANCES_FISCALES_IDS = {
   bauxite: 'aloh',
@@ -41,8 +42,7 @@ export type SubstanceFiscaleId = typeof SUBSTANCES_FISCALES_IDS[keyof typeof SUB
 export interface SubstanceFiscale<T = SubstanceFiscaleId> {
   id: T
   nom: string
-  // TODO 2022-05-31: extract this from DB
-  substanceLegaleId: string
+  substanceLegaleId: SubstanceLegaleId
   uniteId: UniteId
   description: string
   openFisca?: {
@@ -359,3 +359,9 @@ export const SubstancesFiscale: {
 }
 
 export const SubstancesFiscales = Object.values(SubstancesFiscale)
+
+export const substancesFiscalesBySubstanceLegale = (substanceLegaleId: SubstanceLegaleId): SubstanceFiscale[] => {
+  const substancesLegalesIds = SubstancesLegales.filter(({ id, substanceParentIds }) => id === substanceLegaleId || substanceParentIds?.includes(substanceLegaleId)).map(({ id }) => id)
+
+  return SubstancesFiscales.filter(({ substanceLegaleId }) => substancesLegalesIds.includes(substanceLegaleId))
+}
diff --git a/packages/common/src/static/substancesLegales.ts b/packages/common/src/static/substancesLegales.ts
new file mode 100644
index 000000000..8db06a125
--- /dev/null
+++ b/packages/common/src/static/substancesLegales.ts
@@ -0,0 +1,1013 @@
+import { DomaineId } from './domaines'
+
+export const SUBSTANCES_LEGALES_IDS = {
+  'combustibles fossiles': 'cfxx',
+  "sources d'eau salée": 'selh',
+  bauxite: 'aloh',
+  antimoine: 'anti',
+  argent: 'arge',
+  arsenic: 'arse',
+  or: 'auru',
+  béryllium: 'bery',
+  bismuth: 'bism',
+  cadmium: 'cadm',
+  cérium: 'ceri',
+  césium: 'cesi',
+  chrome: 'chro',
+  cobalt: 'coba',
+  'gaz carbonique': 'coox',
+  cuivre: 'cuiv',
+  diamant: 'diam',
+  étain: 'etai',
+  fer: 'ferx',
+  fluorine: 'fluo',
+  gallium: 'gall',
+  'gîtes géothermiques basse température': 'geob',
+  'gîtes géothermiques haute température': 'geoh',
+  'activités géothermiques de minime importance': 'geom',
+  germanium: 'germ',
+  graphite: 'grap',
+  'granulats marins': 'grma',
+  hafnium: 'hafn',
+  hélium: 'heli',
+  'calcaires bitumineux': 'hydm',
+  'hydrocarbures liquides ou gazeux': 'hydx',
+  indium: 'indi',
+  alun: 'kals',
+  'sels de potassium': 'kclx',
+  lithium: 'lith',
+  manganèse: 'mang',
+  mercure: 'merc',
+  molybdène: 'moly',
+  'sels de sodium': 'nacl',
+  nickel: 'nick',
+  niobium: 'niob',
+  'non précisée(s)': 'oooo',
+  phosphates: 'phos',
+  platine: 'plat',
+  'métaux de la mine du platine': 'plax',
+  plomb: 'plom',
+  radium: 'radi',
+  rhénium: 'rhen',
+  rubidium: 'rubi',
+  'autres éléments radioactifs': 'rxxx',
+  scandium: 'scan',
+  'substances connexes': 'scoc',
+  sélénium: 'sele',
+  'stockage souterrain': 'skst',
+  soufre: 'souf',
+  'sulfates autres que les sulfates alcalino-terreux': 'soxx',
+  tantale: 'tant',
+  tellure: 'tell',
+  thallium: 'thal',
+  thorium: 'thor',
+  titane: 'tita',
+  'autres éléments de terres rares': 'trxx',
+  uranium: 'uran',
+  vanadium: 'vana',
+  tungstène: 'wolf',
+  zinc: 'zinc',
+  zirconium: 'zirc',
+  actinium: 'acti',
+  amphibolite: 'amph',
+  'andalousite / sillimanite / kyanite - (cyanite - disthène)': 'anda',
+  andésite: 'ande',
+  anhydrite: 'anhy',
+  ardoises: 'ardo',
+  'argiles communes': 'argc',
+  'argiles fibreuses (attapulgites ou palygorskites, sépiolites)': 'argf',
+  'argiles kaoliniques': 'argk',
+  argiles: 'args',
+  astate: 'asta',
+  barytine: 'bary',
+  basalte: 'basa',
+  bitume: 'bitu',
+  butane: 'buta',
+  'calcaires cimentiers': 'caci',
+  calcaires: 'calc',
+  calcschiste: 'cals',
+  'cendres volcaniques riches en silice': 'cend',
+  anthracite: 'cfan',
+  charbon: 'cfch',
+  houille: 'cfho',
+  lignite: 'cfli',
+  cornéenne: 'corn',
+  craie: 'crai',
+  dacite: 'daci',
+  diabase: 'diab',
+  diatomites: 'diat',
+  diorites: 'dior',
+  dolérite: 'dole',
+  dolomie: 'dolo',
+  dysprosium: 'dysp',
+  erbium: 'erbi',
+  éthylène: 'ethy',
+  europium: 'euro',
+  faluns: 'falu',
+  feldspaths: 'feld',
+  gabbro: 'gabb',
+  gadolinium: 'gado',
+  galets: 'galt',
+  'gaz naturel': 'gazn',
+  'dépôt glaciaire': 'glac',
+  gneiss: 'gnei',
+  'granite et granulite': 'grai',
+  granodiorite: 'grao',
+  'grès silico-ferrugineux': 'gref',
+  grès: 'gres',
+  'graviers siliceux': 'grsi',
+  gypse: 'gyps',
+  holmium: 'holm',
+  asphalte: 'hyda',
+  'hydrocarbures conventionnels liquides ou gazeux': 'hydc',
+  'gaz combustible': 'hydg',
+  'hydrocarbures liquides': 'hydo',
+  hydrocarbures: 'hydr',
+  iridium: 'irid',
+  kaolin: 'kaol',
+  lanthane: 'lant',
+  leptynite: 'lept',
+  lutécium: 'lute',
+  maërl: 'maer',
+  minerais: 'mais',
+  marbres: 'marb',
+  marnes: 'marn',
+  'métaux de base': 'meba',
+  'métaux connexes': 'meco',
+  'métaux précieux': 'mepr',
+  micas: 'mica',
+  micaschistes: 'mics',
+  migmatite: 'migm',
+  mylonites: 'mylo',
+  néodyme: 'neod',
+  ocres: 'ocre',
+  ophite: 'ophi',
+  osmium: 'osmi',
+  palladium: 'pall',
+  perlite: 'perl',
+  phonolite: 'phon',
+  'pierres précieuses': 'pipe',
+  polonium: 'polo',
+  porphyre: 'porp',
+  pouzzolane: 'pouz',
+  praséodyme: 'pras',
+  prométhium: 'prom',
+  protactinium: 'prot',
+  propane: 'prpa',
+  propylène: 'prpy',
+  pyrite: 'pyri',
+  quartz: 'quar',
+  quartzites: 'quat',
+  radon: 'rado',
+  'roches ardoisières': 'rard',
+  'roches détritiques grossières': 'rdet',
+  rhodium: 'rhod',
+  rhyolite: 'rhyo',
+  ruthénium: 'ruth',
+  'sables coquilliers': 'saco',
+  samarium: 'sama',
+  'sables moyens à grossiers': 'samg',
+  'sables siliceux': 'sasi',
+  'schistes bitumineux': 'scbi',
+  schistes: 'schi',
+  'sel gemme': 'selg',
+  "puits d'eau salée": 'selp',
+  sels: 'sels',
+  sel: 'selx',
+  serpentinite: 'serp',
+  'sable extra siliceux': 'sexs',
+  'sables et grès industriels': 'sgin',
+  'sables et graviers alluvionnaires': 'sgra',
+  'sables et graviers marins': 'sgrm',
+  'sables et graviers silico-calcaires marins': 'sgsc',
+  'sables et graviers siliceux marins': 'sgsm',
+  silice: 'silc',
+  sillimanite: 'sili',
+  'silex / chert': 'silx',
+  'sables a minéraux lourds': 'smil',
+  'sable siliceux ou silico-calcaire': 'sssc',
+  "stérile d'exploitation": 'stex',
+  syénite: 'syen',
+  talc: 'talc',
+  technétium: 'tech',
+  terbium: 'terb',
+  'terre végétale': 'terv',
+  thulium: 'thul',
+  'tous métaux associés': 'tmas',
+  tourbe: 'tour',
+  trachyte: 'trac',
+  tuffeau: 'tufo',
+  yttrium: 'ytri',
+  ytterbium: 'ytte'
+} as const
+
+export type SubstanceLegaleId = typeof SUBSTANCES_LEGALES_IDS[keyof typeof SUBSTANCES_LEGALES_IDS]
+
+export interface SubstanceLegale<T = SubstanceLegaleId> {
+  id: T
+  nom: string
+  description?: string
+  substanceParentIds?: SubstanceLegaleId[]
+  domaineIds: DomaineId[]
+}
+
+export const SubstancesLegale: {
+  [key in SubstanceLegaleId]: SubstanceLegale<key>
+} = {
+  cfxx: { id: 'cfxx', nom: 'combustibles fossiles', domaineIds: ['f'] },
+  selh: { id: 'selh', domaineIds: ['m'], nom: "sources d'eau salée" },
+  aloh: {
+    id: 'aloh',
+    domaineIds: ['m'],
+    nom: 'bauxite',
+    substanceParentIds: ['meba']
+  },
+  anti: { id: 'anti', domaineIds: ['m'], nom: 'antimoine' },
+  arge: {
+    id: 'arge',
+    domaineIds: ['m'],
+    nom: 'argent',
+    substanceParentIds: ['mepr']
+  },
+  arse: { id: 'arse', domaineIds: ['m'], nom: 'arsenic' },
+  auru: {
+    id: 'auru',
+    domaineIds: ['m'],
+    nom: 'or',
+    substanceParentIds: ['mepr']
+  },
+  bery: { id: 'bery', domaineIds: ['m'], nom: 'béryllium' },
+  bism: { id: 'bism', domaineIds: ['m'], nom: 'bismuth' },
+  cadm: { id: 'cadm', domaineIds: ['m'], nom: 'cadmium' },
+  ceri: { id: 'ceri', domaineIds: ['m'], nom: 'cérium' },
+  cesi: { id: 'cesi', domaineIds: ['m'], nom: 'césium' },
+  chro: {
+    id: 'chro',
+    domaineIds: ['m'],
+    nom: 'chrome',
+    substanceParentIds: ['meba']
+  },
+  coba: { id: 'coba', domaineIds: ['m'], nom: 'cobalt' },
+  coox: {
+    id: 'coox',
+    domaineIds: ['m'],
+    nom: 'gaz carbonique',
+    description: "A l'exception du gaz naturellement contenu dans les eaux qui sont ou qui viendraient à être utilisées pour l'alimentation humaine ou à des fins thérapeutiques"
+  },
+  cuiv: {
+    id: 'cuiv',
+    domaineIds: ['m'],
+    nom: 'cuivre',
+    substanceParentIds: ['meba']
+  },
+  diam: {
+    id: 'diam',
+    domaineIds: ['m'],
+    nom: 'diamant',
+    substanceParentIds: ['pipe']
+  },
+  etai: {
+    id: 'etai',
+    domaineIds: ['m'],
+    nom: 'étain',
+    substanceParentIds: ['meba']
+  },
+  ferx: {
+    id: 'ferx',
+    domaineIds: ['m'],
+    nom: 'fer',
+    substanceParentIds: ['meba', 'pyri']
+  },
+  fluo: { id: 'fluo', domaineIds: ['m'], nom: 'fluorine' },
+  gall: { id: 'gall', domaineIds: ['m'], nom: 'gallium' },
+  geob: {
+    id: 'geob',
+    domaineIds: ['g'],
+    nom: 'gîtes géothermiques basse température'
+  },
+  geoh: {
+    id: 'geoh',
+    domaineIds: ['g'],
+    nom: 'gîtes géothermiques haute température'
+  },
+  geom: {
+    id: 'geom',
+    domaineIds: ['g'],
+    nom: 'activités géothermiques de minime importance'
+  },
+  germ: { id: 'germ', domaineIds: ['m'], nom: 'germanium' },
+  grap: { id: 'grap', domaineIds: ['m'], nom: 'graphite' },
+  grma: {
+    id: 'grma',
+    domaineIds: ['w'],
+    nom: 'granulats marins',
+    substanceParentIds: ['galt', 'grsi', 'maer', 'saco', 'samg', 'sasi', 'sgsc', 'sgsm']
+  },
+  hafn: { id: 'hafn', domaineIds: ['m'], nom: 'hafnium' },
+  heli: { id: 'heli', domaineIds: ['m'], nom: 'hélium' },
+  hydm: {
+    id: 'hydm',
+    domaineIds: ['m'],
+    nom: 'calcaires bitumineux'
+  },
+  hydx: {
+    id: 'hydx',
+    domaineIds: ['h'],
+    nom: 'hydrocarbures liquides ou gazeux',
+    description: "A l'exeption de la tourbe",
+    substanceParentIds: ['hyda', 'hydc', 'hydo', 'hydr']
+  },
+  indi: { id: 'indi', domaineIds: ['m'], nom: 'indium' },
+  kals: { id: 'kals', domaineIds: ['m'], nom: 'alun' },
+  kclx: {
+    id: 'kclx',
+    domaineIds: ['m'],
+    nom: 'sels de potassium',
+    description: "A l'état solide ou en dissolution, à l'exception de ceux contenus dans les eaux salées utilisées à des fins thérapeutiques ou de loisirs",
+    substanceParentIds: ['selg', 'selp', 'sels']
+  },
+  lith: { id: 'lith', domaineIds: ['m'], nom: 'lithium' },
+  mang: {
+    id: 'mang',
+    domaineIds: ['m'],
+    nom: 'manganèse',
+    substanceParentIds: ['meba']
+  },
+  merc: { id: 'merc', domaineIds: ['m'], nom: 'mercure' },
+  moly: { id: 'moly', domaineIds: ['m'], nom: 'molybdène' },
+  nacl: {
+    id: 'nacl',
+    domaineIds: ['m'],
+    nom: 'sels de sodium',
+    description: "A l'état solide ou en dissolution, à l'exception de ceux contenus dans les eaux salées utilisées à des fins thérapeutiques ou de loisirs",
+    substanceParentIds: ['selg', 'selp', 'sels', 'selx']
+  },
+  nick: {
+    id: 'nick',
+    domaineIds: ['m'],
+    nom: 'nickel',
+    substanceParentIds: ['meba']
+  },
+  niob: { id: 'niob', domaineIds: ['m'], nom: 'niobium' },
+  oooo: { id: 'oooo', domaineIds: ['m'], nom: 'non précisée(s)' },
+  phos: { id: 'phos', domaineIds: ['m'], nom: 'phosphates' },
+  plat: {
+    id: 'plat',
+    domaineIds: ['m'],
+    nom: 'platine',
+    substanceParentIds: ['mepr']
+  },
+  plax: {
+    id: 'plax',
+    domaineIds: ['m'],
+    nom: 'métaux de la mine du platine',
+    substanceParentIds: ['irid', 'mepr', 'osmi', 'pall', 'rhod', 'ruth']
+  },
+  plom: {
+    id: 'plom',
+    domaineIds: ['m'],
+    nom: 'plomb',
+    substanceParentIds: ['meba']
+  },
+  radi: { id: 'radi', domaineIds: ['r'], nom: 'radium' },
+  rhen: { id: 'rhen', domaineIds: ['m'], nom: 'rhénium' },
+  rubi: { id: 'rubi', domaineIds: ['m'], nom: 'rubidium' },
+  rxxx: {
+    id: 'rxxx',
+    domaineIds: ['r'],
+    nom: 'autres éléments radioactifs',
+    substanceParentIds: ['acti', 'asta', 'polo', 'prot', 'radi', 'rado', 'tech']
+  },
+  scan: { id: 'scan', domaineIds: ['m'], nom: 'scandium' },
+  scoc: {
+    id: 'scoc',
+    domaineIds: ['c', 'f', 'g', 'h', 'r', 's', 'w', 'm'],
+    nom: 'substances connexes',
+    description:
+      'Substances présentes lors de l’abattage des substances principales. Elles sont à la libre disposition de l’opérateur à la condition que le titre ou l’autorisation porte la mention « et substances connexes ».',
+    substanceParentIds: ['mais', 'meco', 'tmas']
+  },
+  sele: { id: 'sele', domaineIds: ['m'], nom: 'sélénium' },
+  skst: {
+    id: 'skst',
+    domaineIds: ['s'],
+    nom: 'stockage souterrain',
+    substanceParentIds: ['buta', 'ethy', 'gazn', 'hydg', 'hydo', 'prpa', 'prpy']
+  },
+  souf: { id: 'souf', domaineIds: ['m'], nom: 'soufre' },
+  soxx: {
+    id: 'soxx',
+    domaineIds: ['m'],
+    nom: 'sulfates autres que les sulfates alcalino-terreux'
+  },
+  tant: { id: 'tant', domaineIds: ['m'], nom: 'tantale' },
+  tell: { id: 'tell', domaineIds: ['m'], nom: 'tellure' },
+  thal: { id: 'thal', domaineIds: ['m'], nom: 'thallium' },
+  thor: { id: 'thor', domaineIds: ['r'], nom: 'thorium' },
+  tita: {
+    id: 'tita',
+    domaineIds: ['m'],
+    nom: 'titane',
+    substanceParentIds: ['meba']
+  },
+  trxx: {
+    id: 'trxx',
+    domaineIds: ['m'],
+    nom: 'autres éléments de terres rares',
+    substanceParentIds: ['dysp', 'erbi', 'euro', 'gado', 'holm', 'lant', 'lute', 'neod', 'pras', 'prom', 'sama', 'scan', 'terb', 'thul', 'ytri', 'ytte']
+  },
+  uran: { id: 'uran', domaineIds: ['r'], nom: 'uranium' },
+  vana: { id: 'vana', domaineIds: ['m'], nom: 'vanadium' },
+  wolf: { id: 'wolf', domaineIds: ['m'], nom: 'tungstène' },
+  zinc: {
+    id: 'zinc',
+    domaineIds: ['m'],
+    nom: 'zinc',
+    substanceParentIds: ['meba']
+  },
+  zirc: { id: 'zirc', domaineIds: ['m'], nom: 'zirconium' },
+  acti: { id: 'acti', nom: 'actinium', domaineIds: ['r'] },
+  amph: {
+    id: 'amph',
+    nom: 'amphibolite',
+    domaineIds: ['c'],
+    description:
+      'Roche métamorphique présentant de bonnes caractéristiques géomécaniques, de couleur sombre (gris à vert foncé) riche en silicates calciques et ferromagnésiens (essentiellement hornblende, mais aussi feldspath plagioclase) et de minéraux annexes (pyroxène, micas). Elle est utilisée comme roche ornementale et de construction et comme granulat.'
+  },
+  anda: {
+    id: 'anda',
+    nom: 'andalousite / sillimanite / kyanite - (cyanite - disthène)',
+    domaineIds: ['c'],
+    description:
+      "Minéral - Silicate d'alumine (SiAl2O5). L'andalousite, la silimanite et la Kyanite (Cyanite ou Disthème) ont la même composition chimique mais avec une structure cristalline et des propriétés physico-minéraloriques différentes (triclinique) autrement dit une variété allotropique (même formule chimique mais système cristallin différent). En France, on ne connait pas de gisement de Kyanite à ce jour. L'andalousite et la silimanite y sont exploitées et sont utilisées dans l'industrie. L'andalousite est utilisée pour ses propriétés réfractaires et son excellente résistance aux chocs thermiques. La silimanite, utilisée pour le même usage réfractaire, a toutefois des propriétés physico-minéraloriques sensiblement différentes de l'andalousite."
+  },
+  ande: {
+    id: 'ande',
+    nom: 'andésite',
+    domaineIds: ['c'],
+    description:
+      "Roche volcanique de couleur gris-clair constituée de cristaux de silicates (plagioclases, biotite, hornblende, pyroxène) dans une matrice vitreuse, avec une bonne homogénéité texturale. Elle présente une bonne résistance mécanique et à l'abrasion."
+  },
+  anhy: {
+    id: 'anhy',
+    nom: 'anhydrite',
+    domaineIds: ['c'],
+    description:
+      "Forme anhydre (CaSO4) du sulfate de calcium hydraté (gypse), utilisée comme charge dans l'industrie des peintures, plastiques et comme régulateur de prise dans les ciments, plus rarement comme amendement."
+  },
+  ardo: {
+    id: 'ardo',
+    nom: 'ardoises',
+    domaineIds: ['c'],
+    description:
+      "Roche schistosée, à l'origine une argile, ayant subi un faible métamorphisme. Variétés gris-bleuté à noire dont la texture (à grains très fin et homogène) et la fissillité (débit en plaques fines) sont mis à profit pour la fabrication d'éléments de toiture, de parement et de dallage pour les variétés plus gréseuses (autres utilisations possibles: additifs pour la fabrication du clinker et des ciments)."
+  },
+  argc: {
+    id: 'argc',
+    nom: 'argiles communes',
+    domaineIds: ['c'],
+    description:
+      "Roche sédimentaire tendre à grain très fin, constituée de minéraux argileux à dominante de smectites-illites, ainsi que d'autres minéraux (quartz, oxydes...) de couleur gris-foncé, brune, jaune-oranger ou rougeâtre. Elles forment une pâte en présence d'eau et durcissent à la cuisson (terres-cuites). peuvent être utilisées (10 à 20%) dans la fabrication du clinker, constituant de base de tous les ciments."
+  },
+  argf: {
+    id: 'argf',
+    nom: 'argiles fibreuses (attapulgites ou palygorskites, sépiolites)',
+    domaineIds: ['c'],
+    description:
+      "Roches sédimentaires tendre à grains fins, constituées majoritairement d'argiles alumino-magnésiennes (fibres de 1 à 3 µm de long et de 100 à 300 Angstroms de large. La différence entre la largeur des fibres permet de différentier les sépiolites des attapulgites). L'existence de micropores entre les fibres, confèrent à ces argiles une grande capacité d'absorption."
+  },
+  argk: {
+    id: 'argk',
+    nom: 'argiles kaoliniques',
+    domaineIds: ['c'],
+    description:
+      'Roche sédimentaire tendre à grains très fins constituée principalement de kaolinite (minéral argileux blanc à crème) utilisée pour ses propriétés en céramiques communes (sanitaires) et pour matériaux réfractaires (fabrication de chamottes).'
+  },
+  args: {
+    id: 'args',
+    nom: 'argiles',
+    domaineIds: ['c'],
+    description: `Roches sédimentaires peu consolidées formées de minéraux argileux comme la montmorillonite (silicate d'aluminium et de magnésium hydraté) et la beidellite (silicate naturel d'aluminium hydraté). Ces phyllosilicates ont des propriétés physico-chimiques (gonflement en présence d'eau, rhéologie, adsorption, échanges cationiques...) avec de nombreuses applications dans les secteurs industriels (chimie, métallurgie, environnement, produit de collage en œnologie pour l'élimination des protéines des vins blancs et rosés. Synonyme : bentonite, "terre à foulon".`
+  },
+  asta: { id: 'asta', nom: 'astate', domaineIds: ['r'] },
+  bary: {
+    id: 'bary',
+    nom: 'barytine',
+    domaineIds: ['c'],
+    description:
+      'Minéral - Sulfate de baryum (BaSO4) présentant une forte densité (4,5) et une bonne inertie chimique utilisé comme charge minérale dans les boues de forage, les bétons spéciaux des installations nucléaires (radioprotection) et certaines peintures industrielles.'
+  },
+  basa: {
+    id: 'basa',
+    nom: 'basalte',
+    domaineIds: ['c'],
+    description:
+      'Roche volcanique dure et massive de couleur gris-foncé à noire, constituée de fin cristaux (pyroxène et olivine) dans une masse vitreuse. Excellentes propriétés mécaniques (dureté), utilisation en tant que granulats et roche ornementale et de construction.'
+  },
+  bitu: { id: 'bitu', nom: 'bitume', domaineIds: ['f'] },
+  buta: { id: 'buta', nom: 'butane', domaineIds: ['s'] },
+  caci: { id: 'caci', nom: 'calcaires cimentiers', domaineIds: ['c'] },
+  calc: {
+    id: 'calc',
+    nom: 'calcaires',
+    domaineIds: ['c'],
+    description:
+      "Roche sédimentaire (couleur blanc-beige-gris) principalement constituée de calcite (carbonate de calcium (CaCO3) faisant effervescence à l'acide). Caractéristiques pétrophysiques et géomécaniques très hétérogènes en fonction de la cristallinité, porosité, teneur en autres constituants (argiles, quartz...). Pour les variétés de haute pureté et blancheur, utilisations comme charges minérales. Autres utilisations : sidérurgie, verrerie, amendements, principale matière première pour la fabrication du clinker et de la chaux. Elle est également très employée en tant pierre ornementale et de construction et pour les granulats."
+  },
+  cals: {
+    id: 'cals',
+    nom: 'calcschiste',
+    domaineIds: ['c'],
+    description:
+      "Roche métamorphique, d'aspect rubané, provenant de formations argileuses plus ou moins carbonatées comme les marnes et calcaires marneux. Peut être utilisée comme matière première en remplacement du calcaire et/ou des marnes dans la fabrication du clinker, le constituant de base des ciments."
+  },
+  cend: {
+    id: 'cend',
+    nom: 'cendres volcaniques riches en silice',
+    domaineIds: ['c'],
+    description:
+      'Roche volcanique formée de fragments généralement à grains fins, peu indurée (pulvérulente) ou indurée. Elle est utilisée en tant que granulats ou comme roches ornementales et de construction.'
+  },
+  cfan: { id: 'cfan', nom: 'anthracite', domaineIds: ['f'] },
+  cfch: { id: 'cfch', nom: 'charbon', domaineIds: ['f'] },
+  cfho: { id: 'cfho', nom: 'houille', domaineIds: ['f'] },
+  cfli: { id: 'cfli', nom: 'lignite', domaineIds: ['f'] },
+  corn: {
+    id: 'corn',
+    nom: 'cornéenne',
+    domaineIds: ['c'],
+    description:
+      "Roche métamorphique cristalline plus ou moins orientée, habituellement très dure produite sous l'action de la chaleur d'un magma en fusion (métamorphisme de contact). Les grains sont d'une grosseur homogène et ne suivent pas une orientation préférentielle. Leur composition minéralogique varie selon le degré de métamorphisme et la nature des roches initiales. Elles présentent en général de bonnes résistances au choc et à l'abrasion."
+  },
+  crai: {
+    id: 'crai',
+    nom: 'craie',
+    domaineIds: ['c'],
+    description:
+      "Roche sédimentaire fine, tendre, friable, de couleur blanche, composée de calcite(CaCO3) d'origine fossilifère. En amendement, est utilisée sous forme pulvérisée, broyée, concassée ou brute pour corriger les sols acides. En liant hydraulique, elle est utilisée dans des proportions de 80 à 90% dans la fabrication du clinker, le constituant de base du ciment mais sert également à la fabrication de chaux et de mortier. Pour les minéraux industriels, la pureté et la blancheur autorisent une utilisation comme charge minérale."
+  },
+  daci: {
+    id: 'daci',
+    nom: 'dacite',
+    domaineIds: ['c'],
+    description:
+      'Roche volcanique de couleur gris-clair constituée de fins cristaux de quartz, plagioclase et silicates ferro-magnésiens baignant dans un verre. Elle est utilisée comme roche ornementale ou de construction et comme granulat.'
+  },
+  diab: {
+    id: 'diab',
+    nom: 'diabase',
+    domaineIds: ['c'],
+    description: "Roche métamorphique dure, d'origine volcanique à grain fin de couleur sombre (issue de dolérite). Elle est utilisé comme granulat."
+  },
+  diat: {
+    id: 'diat',
+    nom: 'diatomites',
+    domaineIds: ['c'],
+    description:
+      'Roche sédimentaire tendre et légère formée par accumulation de carapaces siliceuses de micro-organismes en milieux lacustes ou marins. Utilisations industrielles : filtration de liquides alimentaires, charge minérale, absorbant de pollutions. En liant hydraulique, elle peut être utilisée comme additifs pour la fabrication de certains ciments.'
+  },
+  dior: {
+    id: 'dior',
+    nom: 'diorites',
+    domaineIds: ['c'],
+    description:
+      'Roche plutonique cristalline à texture grenue et homogène, constituée de feldspaths blanchâtres et de silicates ferro-magnésiens colorés (amphiboles, biotite...). En roche ornemental et de construction, elle est sélectionnée pour son aspect décoratif. En granulat, cette roche présente de bonnes caractéristiques mécaniques.'
+  },
+  dole: {
+    id: 'dole',
+    nom: 'dolérite',
+    domaineIds: ['c'],
+    description:
+      "Roche volcanique massive, compacte, de couleur sombre (grise à noire), composée de fins cristaux de feldspaths calciques, de pyroxène et parfois d'oxydes de fer. Elle est utilisée en tant que granulats ou en roche ornementale et de construction. On la trouve en association possible des dolérites altérées (diabases issues du métamorphisme des dolérites)."
+  },
+  dolo: {
+    id: 'dolo',
+    nom: 'dolomie',
+    domaineIds: ['c'],
+    description:
+      "Roche sédimentaire constituée principalement de dolomite (carbonate double de calcium et de magnésium). Utilisée comme charge minérale dans de nombreuses applications : peintures et enduits, élastomères, papiers et revêtements de sol ou dans l'industrie du verre. Au regard de ses propriétés chimiques, est utilisée comme amendement sous forme pulvérisée, broyée, pour corriger le pH des sols acides."
+  },
+  dysp: { id: 'dysp', nom: 'dysprosium', domaineIds: ['m'] },
+  erbi: { id: 'erbi', nom: 'erbium', domaineIds: ['m'] },
+  ethy: { id: 'ethy', nom: 'éthylène', domaineIds: ['s'] },
+  euro: { id: 'euro', nom: 'europium', domaineIds: ['m'] },
+  falu: {
+    id: 'falu',
+    nom: 'faluns',
+    domaineIds: ['c'],
+    description:
+      "Roche sédimentaire meuble d'origine détritique riche en débris de coquilles d'animaux marins. Facilement délitable et transformée en sable, elle est utilisée en tant qu'amendement agricole en substitution de carbonate de calcium ou de calcite. Par le passé, cette roche a été utilisée comme sarcophage pour conserver les corps au regard de sa porosité qui permet d'éviter la putréfaction des chairs et d'absorber les exudats."
+  },
+  feld: {
+    id: 'feld',
+    nom: 'feldspaths',
+    domaineIds: ['c'],
+    description:
+      'Minéral - Principal constituant de nombreuses roches magmatiques dont la composition varie entre des pôles potassique (KAlSi3O8), sodique (NaAlSi3O8) et calcique (CaAl2Si2O8), utilisé en céramique et dans la verrerie.'
+  },
+  gabb: {
+    id: 'gabb',
+    nom: 'gabbro',
+    domaineIds: ['c'],
+    description:
+      'Roche plutonique grenue de couleur sombre, contenant des feldspaths calciques et du pyroxène (olivine, biotite et hornblende associés). Cette roche présente généralement de bonnes caractéristiques mécaniques qui la rendent utilisable comme roche ornementale et de construction et comme granulat.'
+  },
+  gado: { id: 'gado', nom: 'gadolinium', domaineIds: ['m'] },
+  galt: {
+    id: 'galt',
+    nom: 'galets',
+    domaineIds: ['w'],
+    description:
+      "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat."
+  },
+  gazn: { id: 'gazn', nom: 'gaz naturel', domaineIds: ['s'] },
+  glac: {
+    id: 'glac',
+    nom: 'dépôt glaciaire',
+    domaineIds: ['c'],
+    description:
+      "Mélange de roches sédimentaires détritiques hétérogènes d'origine glaciaire constituées de fragments hétérométriques, unis par un ciment naturel (moraines et tillites). Les moraines se présentent sous forme de blocs, de cailloux de sables et d'argiles. Elles peuvent être valorisées comme granulat. Les tillites sont des conglomérats à éléments arrondis et anguleux, suffisamment indurées (dures) pour être valorisées également comme granulat ou comme roche ornementale et de construction."
+  },
+  gnei: {
+    id: 'gnei',
+    nom: 'gneiss',
+    domaineIds: ['c'],
+    description:
+      'Roche métamorphique cristalline à faciès rubanné ou lenticulaire (alternance de lits clairs quartzo-feldspathiques et de lits sombres à micas, amphiboles et pyroxènes). Utilisée en tant que granulats pour ses propriétés mécaniques ou en tant que roche ornementale et de construction pour son aspect décoratif.'
+  },
+  grai: {
+    id: 'grai',
+    nom: 'granite et granulite',
+    domaineIds: ['c'],
+    description: `Roche plutonique cristalline à texture grenue de couleur claire (gris, rose ou jaune) composée de quartz, feldspaths et micas, sélectionnée pour son aspect décoratif. Pour les roches ornementales et de construction, une définition "commerciale" existe également et est différente de celle-ci dite "acceptation scientifique" (cf. point 2.1.156 NF EN 12670 : 2001 page 16). Pour les granulats, cette roche présente de bonnes caractéristiques de rugosité. Pour les minéraux industriels, cette roche rendue friable par l'altération (arénisation) facilite l'extraction de tout ou partie de ses constituants (quartz, feldspaths et micas). Nota : Le terme GRANULITE était utilisé autrefois pour désigner des granites de couleur claire à 2 micas (noir et blanc). qui sont valorisées pour leur aspect esthétique dans le domaine des roches ornementales et de construction.`
+  },
+  grao: {
+    id: 'grao',
+    nom: 'granodiorite',
+    domaineIds: ['c'],
+    description:
+      "Roche plutonique grenue dont la composition est intermédiaire entre le granite et la diorite. Elle est principalement constituée de quartz (> 10 %) et de feldspaths de couleur claire. Les minéraux secondaires sont la biotite (grains sombres vert, brun ou noir), l'amphibole et le pyroxène. La Pierre de Rosette qui permit de percer le mystère des hiéroglyphes est en granodiorite."
+  },
+  gref: {
+    id: 'gref',
+    nom: 'grès silico-ferrugineux',
+    domaineIds: ['c'],
+    description:
+      "Roche sédimentaire de couleur brun-orangé constituée d'un mélange de silice et d'oxydes et hydroxydes de fer, utilisée en tant que minéraux industriels, comme agent colorant en céramique."
+  },
+  gres: {
+    id: 'gres',
+    nom: 'grès',
+    domaineIds: ['c'],
+    description:
+      "Roche sédimentaire plus ou moins indurée et stratifiée, composée de grains de quartz d'origine détritique (d'une taille comprise entre 63 µm et 2 mm) soudés par un ciment interstitiel de nature variable (calcite, oxydes de fer, silice, minéraux argileux). Dans le domaine des granulats et des roches ornementales et de construction, les propriétés mécaniques et l'aspect esthétique sont valorisés. Dans le domaine des minéraux industriels, elle est utilisée comme source de silice pour la production de ferro-silicium."
+  },
+  grsi: {
+    id: 'grsi',
+    nom: 'graviers siliceux',
+    domaineIds: ['w'],
+    description:
+      "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat."
+  },
+  gyps: {
+    id: 'gyps',
+    nom: 'gypse',
+    domaineIds: ['c'],
+    description:
+      "Minéral - Sulfate de calcium hydraté (CaSO4,2H2O). Dans le domaine des liants hydrauliques, ce minéral est utilisé pour la fabrication du plâtre et comme régulateur de prise dans les ciments. Dans le domaine des minéraux industriel, sa pureté chimique et ses caractéristiques physiques comme la blancheur lui permettent d'être utilisé comme charge minérale. Dans le domaine de l'amendement, sa propriété chimique (base) est utilisée pour corriger les sols acides."
+  },
+  holm: { id: 'holm', nom: 'holmium', domaineIds: ['m'] },
+  hyda: { id: 'hyda', nom: 'asphalte', domaineIds: ['h'] },
+  hydc: {
+    id: 'hydc',
+    nom: 'hydrocarbures conventionnels liquides ou gazeux',
+    domaineIds: ['h']
+  },
+  hydg: { id: 'hydg', nom: 'gaz combustible', domaineIds: ['s'] },
+  hydo: { id: 'hydo', nom: 'hydrocarbures liquides', domaineIds: ['h', 's'] },
+  hydr: { id: 'hydr', nom: 'hydrocarbures', domaineIds: ['h'] },
+  irid: { id: 'irid', nom: 'iridium', domaineIds: ['m'] },
+  kaol: {
+    id: 'kaol',
+    nom: 'kaolin',
+    domaineIds: ['c'],
+    description:
+      "Minéral - Extrait de roches granitiques ou sédimentaires composées principalement de kaolinite (silicate d'alumine hydraté Al2Si2O5(OH)4). Le kaolin est utilisé pour sa grande pureté et sa blancheur en céramique (porcelaine) ou comme charges minérales (papier, peinture, etc.). Il peut être également utilisé comme matière première en remplacement de l'argile dans la fabrication de certains clinkers pour ciments blancs (Portland)."
+  },
+  lant: { id: 'lant', nom: 'lanthane', domaineIds: ['m'] },
+  lept: {
+    id: 'lept',
+    nom: 'leptynite',
+    domaineIds: ['c'],
+    description: 'Roche métamorphique cristallisée et orientée de couleur claire composée de quartz, feldspath et micas en faible quantité présentant une bonne résistance mécanique.'
+  },
+  lute: { id: 'lute', nom: 'lutécium', domaineIds: ['m'] },
+  maer: {
+    id: 'maer',
+    nom: 'maërl',
+    domaineIds: ['w'],
+    description:
+      "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat."
+  },
+  mais: { id: 'mais', nom: 'minerais', domaineIds: ['m'] },
+  marb: {
+    id: 'marb',
+    nom: 'marbres',
+    domaineIds: ['c'],
+    description: `Roche métamorphique cristalline plus ou moins rubanée, contenant plus de 50 % de carbonates (calcite et plus rarement dolomite) dans laquelle les minéraux ont totalement recristallisé avec des traces d'oxydes métalliques ou d'impuretés lui donnant une grande variété de couleurs. Le métamorphisme de cette roche lui confère une plus grande dureté. Dans le domaine des roches ornementales, elle est sélectionnée pour son aspect décoratif, la recristallisation de ses composants favorise son polissage. Une définition "commerciale" existe également et est différente de celle-ci dite "acceptation scientifique" (cf. point 2.1.243 NF EN 12670 : 2001 page 22). Dans le domaine des granulats, elle est sélectionnée pour ses propriétés mécaniques (dureté, résistance aux chocs). Dans le domaine des liants hydrauliques, elle peut être utilisée comme matière première en remplacement du calcaire dans la fabrication du clinker, le constituant de base des ciments. Dans le domaine de l'amendement les composants calciques ou magnésiens sont particulièrement utiles pour la correction de pH des milieux acides. Dans le domaine des minéraux industriels, elle est utilisée, après calcination en carbonate de calcium, comme: - charge minérale dans de nombreuses applications industrielles (papier, peinture, plastiques, élastomères) - ou transformée en chaux pour la correction de pH des milieux acides.`
+  },
+  marn: {
+    id: 'marn',
+    nom: 'marnes',
+    domaineIds: ['c'],
+    description:
+      "Roche sédimentaire plus ou moins indurée (dure) et stratifiée (couches successives de sédiments) composée d'un mélange de carbonate de calcium (CaCO3) et d'argiles de différentes natures (de 35% à 65%). Usages : Dans le domaine des granulats, l'emploi de cette roche est exceptionnel bien que présent dans les couches de découverte et que ces caractéristiques mécaniques soient compatibles avec cet usage. Si elle est utilisée comme granulat, c'est principalement sous forme de remblai et encore plus exceptionnellement en granulat pour béton. Dans le domaine de l'agriculture, cette roche est employée comme amendement du fait du mélange carbonate de calcium et argile qu'elle contient. Dans le domaine des liants hydrauliques, cette roche est souvent utilisée comme matière première en remplacement du calcaire et/ou de l'argile dans la fabrication du clinker, le constituant de base des ciments. Dans le domaine des minéraux industriels, elle est exploitée en fonction de sa richesse en calcite afin de constituer des charges minérales. Nota: Les marnes ont une composition chimique intermédiaire entre les calcaires marneux (5 à 35% d'argiles) et les argiles calcareuses ou marnes argileuses (65 à 95% d'argiles)."
+  },
+  meba: { id: 'meba', nom: 'métaux de base', domaineIds: ['m'] },
+  meco: { id: 'meco', nom: 'métaux connexes', domaineIds: ['m'] },
+  mepr: { id: 'mepr', nom: 'métaux précieux', domaineIds: ['m'] },
+  mica: {
+    id: 'mica',
+    nom: 'micas',
+    domaineIds: ['c'],
+    description:
+      "Minéral - Silicates en feuillets riches en aluminium et potassium (micas blancs) ou en magnésium et fer (micas noirs) dont les propriétés physico-minéralogiques trouvent de nombreuses applications dans les domaines de l'isolation et des charges minérales."
+  },
+  mics: {
+    id: 'mics',
+    nom: 'micaschistes',
+    domaineIds: ['c'],
+    description:
+      "Roche métamorphique cristallisée et schisteuse caractérisée par l'abondance de la fraction micacée et une plus faible teneur en quartz. Dans le domaine des roches ornementales et de construction, les proportions de quartz et de micas déterminent les propriétés de la roche comme la fissilité pour la production de dallage ou de couverture. Sa richesse en mica confère un aspect brillant à sa surface. Dans le domaine des minéraux industriel, cette roche est valorisée dans des applications de type charge minérale."
+  },
+  migm: {
+    id: 'migm',
+    nom: 'migmatite',
+    domaineIds: ['c'],
+    description: `Roche métamorphique formée d'une alternance de roches de type granite de couleur sombre et de roche de type gneiss de couleur clair. La partie de couleur claire est assimilé à la partie de la roche ayant fondu et est appelée "le mobilisat". La partie de couleur sombre constitue la partie de la roche étant restée solide et est appelée "la restite". Ses bonnes propriétés mécaniques, permettent de l'utiliser comme roche ornementale et de construction ou comme granulat.`
+  },
+  mylo: {
+    id: 'mylo',
+    nom: 'mylonites',
+    domaineIds: ['c'],
+    description:
+      "Roche autre cataclastique résultant du cisaillement et du broyage puis de la recristallisation plus ou moins intense de roches préexistantes de différentes natures (éventuellement recristallisées) dans une zone de formation intense de failles. Elle est constituée d'une hétérogénéité de roches."
+  },
+  neod: { id: 'neod', nom: 'néodyme', domaineIds: ['m'] },
+  ocre: {
+    id: 'ocre',
+    nom: 'ocres',
+    domaineIds: ['c'],
+    description:
+      "Mélange sédimentaire naturel de kaolinite (argile), d'oxyde de fer rouge (hématite) et d'hydroxyde de fer jaune-oranger (limonite) utilisé pour la production de pigments naturels dans les peintures et les enduits."
+  },
+  ophi: {
+    id: 'ophi',
+    nom: 'ophite',
+    domaineIds: ['c'],
+    description:
+      'Roche plutonique intermédiaire entre basalte et gabbro présentant un faciès plus ou moins altéré de couleur vert-foncé. En tant que roche ornementale et de construction elle est sélectionnée pour son aspect décoratif. Son emploi en tant que granulats est dû à sa dureté et à sa compacité.'
+  },
+  osmi: { id: 'osmi', nom: 'osmium', domaineIds: ['m'] },
+  pall: { id: 'pall', nom: 'palladium', domaineIds: ['m'] },
+  perl: {
+    id: 'perl',
+    nom: 'perlite',
+    domaineIds: ['c'],
+    description:
+      "Roche volcanique de couleur claire à texture vitreuse plus ou moins hydratée et composition rhyolitique utilisée dans l'industrie pour la production d'agents filtrants et d'additifs fonctionnels. Elle est utilisée dans l'industrie pour la production d'agents filtrants et d'additifs fonctionnels."
+  },
+  phon: {
+    id: 'phon',
+    nom: 'phonolite',
+    domaineIds: ['c'],
+    description:
+      'Roche volcanique à grain très fin, de couleur grise tirant parfois sur le vert ou le brun, qui se débite en plaques et qui, sous le choc du métal, rend un son clair (dalles sonores). Sa composition chimique est déficitaire en silice (dite sous-saturées en silice). Le silicium y représente donc moins de la moitié des cations. Ces caractéristiques mécaniques (dureté) permettent son utilisation en tant que granulat. En tant que roche ornementale et de construction, elle est utilisée comme pierre ardoisière en Auvergne. En tant que minéraux industriels, sa composition chimique sous-saturée en silice est recherchée pour les industries du verre et de la céramique.'
+  },
+  pipe: { id: 'pipe', nom: 'pierres précieuses', domaineIds: ['m'] },
+  polo: { id: 'polo', nom: 'polonium', domaineIds: ['r'] },
+  porp: {
+    id: 'porp',
+    nom: 'porphyre',
+    domaineIds: ['c'],
+    description:
+      "Roche plutonique caractérisée par une texture intermédiaire constituée de cristaux de feldpaths baignant dans une matrice finement cristallisée. Dans le domaine des roches ornementales et de construction, la couleur variable de cette roche est utilisée pour son aspect décoratif. Dans le domaine des minéraux industriels, cette roche est employée pour ces propriétés mécaniques (dureté, résistance aux chocs et à l'abrasion)."
+  },
+  pouz: {
+    id: 'pouz',
+    nom: 'pouzzolane',
+    domaineIds: ['c'],
+    description:
+      "Roche volcanique scoriacée à texture bulleuse de couleur noire ou rouge brique. Elle est donc assez rarement exploitée en roche de construction sauf dans la région de Clermont-Ferrand et sur l'île de la Réunion. Elle permet la fabrication de moellons utilisés dans le bâtiment compte tenu de leurs propriétés (isolation thermique et phonique) (voir la fiche pouzzolane de Ph. Rocher). L'exploitation en roche ornementale est marginale et est destinée la construction de rocaille décorative dans les jardins d'agrément. En tant que granulats, elle est utilisée comme agent de sablage ou comme agrégat pour la réalisation de massifs drainants. Sa texture bulleuse peu résistante mécaniquement en fait tout de même un granulat léger notamment dans les bétons spéciaux. Dans le domaine des liants hydrauliques, elle peut être utilisée comme additifs pour la fabrication de certains ciments. Dans le domaine des minéraux industriels, elle est utilisée pour ses propriétés d'isolation phonique et thermique."
+  },
+  pras: { id: 'pras', nom: 'praséodyme', domaineIds: ['m'] },
+  prom: { id: 'prom', nom: 'prométhium', domaineIds: ['m'] },
+  prot: { id: 'prot', nom: 'protactinium', domaineIds: ['r'] },
+  prpa: { id: 'prpa', nom: 'propane', domaineIds: ['s'] },
+  prpy: { id: 'prpy', nom: 'propylène', domaineIds: ['s'] },
+  pyri: { id: 'pyri', nom: 'pyrite', domaineIds: ['m'] },
+  quar: {
+    id: 'quar',
+    nom: 'quartz',
+    domaineIds: ['c'],
+    description:
+      "Minéral - Oxyde de silicium (SiO2) Dans le domaine des granulats, sans grand degré de pureté le quartz est valorisé pour ses caractéristiques mécaniques et certains aspects décoratifs. Dans le domaine des minéraux industriels, sa pureté en SiO2 est recherchée pour sa résistance à l'abrasion dans les revêtements de sols ou comme agent de décapage. Elle constitue une source de silicium pour des applications verre et céramique lorsqu'il présente un très haut degré de pureté."
+  },
+  quat: {
+    id: 'quat',
+    nom: 'quartzites',
+    domaineIds: ['c'],
+    description:
+      "Roche métamorphique massive composée principalement de quartz issue de la recristallisation et de la cimentation du quartz. Les caractéristiques mécaniques sont favorables à la production de granulats de haute qualité (forte résistance à l'abrasion) ou à une utilisation comme roche ornementale et de construction. Le tombeau de Napoléon, aux Invalides, est réalisé dans un bloc de quartzite. Dans le domaine des minéraux industriels, sa pureté est recherchée pour être utilisée comme matériaux réfractaires."
+  },
+  rado: { id: 'rado', nom: 'radon', domaineIds: ['r'] },
+  rard: {
+    id: 'rard',
+    nom: 'roches ardoisières',
+    domaineIds: ['c'],
+    description:
+      "Roche métamorphique qui est à l'origine de l'argile ayant subi un faible métamorphisme et qui est devenue schisteuse. Ces roches ardoisières ont un plan de schistocité épais et peuvent avoir une fraction gréseuse. Elle comprend notamment les lauzes qui sont utilisées comme pierres de construction (dallage ou toiture)."
+  },
+  rdet: {
+    id: 'rdet',
+    nom: 'roches détritiques grossières',
+    domaineIds: ['c'],
+    description:
+      "Famille de roches sédimentaire détritiques (issues de la dégradation mécanique d'autres roches) constituées d'éléments grossiers (galets) arrondis (qui traduisent un transport long avant sédimentation) cimentés par des éléments plus fins de type sables et graviers. Devenues suffisamment dures (indurées) ces roches sont utilisées pour la production de granulats. En tant que roches ornementales et de construction, elles présentent des caractéristiques mécaniques et esthétiques valorisables en décoration. Cette famille regroupe les roches suivantes : les arkoses, les brèches, les conglomérats et les poudingues. Ces dernières sont celles qui sont le plus souvent utilisées comme roches ornementales."
+  },
+  rhod: { id: 'rhod', nom: 'rhodium', domaineIds: ['m'] },
+  rhyo: {
+    id: 'rhyo',
+    nom: 'rhyolite',
+    domaineIds: ['c'],
+    description:
+      'Roche volcanique effusive riche en silice de couleur claire constituée de fins cristaux de feldspaths dispersés dans une matrice vitreuse valorisée pour ses propriétés mécaniques et son aspect esthétique soit en tant que roche ornementale et de construction ou en tant que granulats.'
+  },
+  ruth: { id: 'ruth', nom: 'ruthénium', domaineIds: ['m'] },
+  saco: {
+    id: 'saco',
+    nom: 'sables coquilliers',
+    domaineIds: ['w'],
+    description:
+      "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat."
+  },
+  sama: { id: 'sama', nom: 'samarium', domaineIds: ['m'] },
+  samg: {
+    id: 'samg',
+    nom: 'sables moyens à grossiers',
+    domaineIds: ['w'],
+    description:
+      "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat."
+  },
+  sasi: {
+    id: 'sasi',
+    nom: 'sables siliceux',
+    domaineIds: ['w'],
+    description:
+      "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat."
+  },
+  scbi: { id: 'scbi', nom: 'schistes bitumineux', domaineIds: ['f'] },
+  schi: {
+    id: 'schi',
+    nom: 'schistes',
+    domaineIds: ['c'],
+    description:
+      "Roche métamorphique à grains très fins peu ou pas décelables à l'œil nu présentant un débit en feuillet dû à la schistosité et à la présence de minéraux plats (micas, hornblende...) orientés. Utilisée pour ses propriétés mécaniques, cette roche est particulièrement délitable et donne des granulats de forme assez plate. Son aspect décoratif est valorisé en tant que roche ornementale et de construction."
+  },
+  selg: { id: 'selg', nom: 'sel gemme', domaineIds: ['m'] },
+  selp: { id: 'selp', nom: "puits d'eau salée", domaineIds: ['m'] },
+  sels: { id: 'sels', nom: 'sels', domaineIds: ['m'] },
+  selx: { id: 'selx', nom: 'sel', domaineIds: ['m'] },
+  serp: {
+    id: 'serp',
+    nom: 'serpentinite',
+    domaineIds: ['c'],
+    description:
+      "Roche métamorphique de couleur jaunâtre à verdâtre (voire vert sombre) ou présentant des inclusions verdâtres (forme porphyrique) essentiellement constituée (plus de 75 %) d'antigorite (phyllosilicate magnésien). Cette roche provient de l'altération d'une péridotite en présence d'eau. Les serpentinites sont essentiellement exploitées aujourd'hui pour la production de granulats et plus rarement comme roches ornementales."
+  },
+  sexs: {
+    id: 'sexs',
+    nom: 'sable extra siliceux',
+    domaineIds: ['c'],
+    description:
+      "Roche sédimentaire meuble d'origine détritique presque exclusivement constituée de grains calibrés de quartz de très grande pureté (égale ou > 98% de silice), utilisée dans les industries du verre et de la céramique et comme additif fonctionnel."
+  },
+  sgin: {
+    id: 'sgin',
+    nom: 'sables et grès industriels',
+    domaineIds: ['c']
+  },
+  sgra: {
+    id: 'sgra',
+    nom: 'sables et graviers alluvionnaires',
+    domaineIds: ['c'],
+    description:
+      "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme de sables, graviers et galets de nature variable extraits d'anciens lits de cours d'eau et utilisé comme granulat encore aujourd'hui principalement dans des bétons spéciaux ou pour des couches drainantes."
+  },
+  sgrm: {
+    id: 'sgrm',
+    nom: 'sables et graviers marins',
+    domaineIds: ['c'],
+    description:
+      "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat."
+  },
+  sgsc: {
+    id: 'sgsc',
+    nom: 'sables et graviers silico-calcaires marins',
+    domaineIds: ['w'],
+    description:
+      "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat."
+  },
+  sgsm: {
+    id: 'sgsm',
+    nom: 'sables et graviers siliceux marins',
+    domaineIds: ['w'],
+    description:
+      "Mélange sédimentaire meuble constituée d'éléments rocheux de nature variée sous forme sous forme de sables et graviers d'origine détritique, de nature siliceuse et calcaire extrait des fonds marins. Leur utilité est destinée au granulat."
+  },
+  silc: { id: 'silc', nom: 'silice', domaineIds: ['c'] },
+  sili: {
+    id: 'sili',
+    nom: 'sillimanite',
+    domaineIds: ['c'],
+    description:
+      "Minéral - Silicate d'alumine (SiAl2O5) de même composition chimique que l'andalousite mais avec une structure cristalline et des propriétés physico-minéralogiques sensiblement différentes."
+  },
+  silx: {
+    id: 'silx',
+    nom: 'silex / chert',
+    domaineIds: ['c'],
+    description:
+      "Roche sédimentaire d'origine détritique issue d'une précipitation chimique et constituée de silice calcédonieuse presque pure la rendant très dure et quelques impuretés telles que de l'eau ou des oxydes, ces derniers influant sur sa couleur. De part, la dureté de cette roche, elle est valorisée sous forme de granulat. Pour l'industrie, elle est utilisée, sous forme de galet plus ou moins arrondis dont les propriétés mécaniques permettent d'en faire des charges broyantes ou des produits abrasifs ou dont la grande pureté chimique permet de faire de la silice industrielle. [Définition de la norme européenne EN 932-3 : Roche sédimentaire composée de silice cryptocristalline ou microcristalline (cristaux indétectables à l'œil nu), se formant en général en couches ou en nodules dans le calcaire.] Préférer le terme SILEX au terme CHERT qui vaut dire la même chose. Le silex est un chert se formant dans la craie du Crétacé (cf. falaise d'Etretat)."
+  },
+  smil: {
+    id: 'smil',
+    nom: 'sables a minéraux lourds',
+    domaineIds: ['c'],
+    description:
+      "Sables alluvionnaires ou de plage composés de minéraux lourds (rutile, zircon, barytine, grenat). L'accumulation des minéraux lourds se fait dans des placers dont l'origine est liée aux paramètres favorables de sédimentation. Ces minéraux peuvent être utilisés en industrie."
+  },
+  sssc: {
+    id: 'sssc',
+    nom: 'sable siliceux ou silico-calcaire',
+    domaineIds: ['c'],
+    description:
+      "Roche sédimentaire meuble d'origine détritique pouvant soit être constituée majoritairement de grains de quartz (fort % de silice mais < à 98%) soit de calcaire et de silice (silico-calcaire). Ce sable est principalement utilisé comme produits de correction pour la fabrication du clinker, le constituant de base des ciments."
+  },
+  stex: {
+    id: 'stex',
+    nom: "stérile d'exploitation",
+    domaineIds: ['c'],
+    description:
+      "Roche d'origine diverse, caractérisée par des roches constituant des stériles d'ancienne exploitation (schiste, grès, carbonates ou roche grenue) dont les caractéristiques mécaniques et physiques permettent de les valoriser comme granulat."
+  },
+  syen: {
+    id: 'syen',
+    nom: 'syénite',
+    domaineIds: ['c'],
+    description:
+      "Roche plutonique grenue de couleur rose à rouge, composée de feldspath alcalin (assez riche en silice). Elle se rapproche du granite et du gabbro mais ne contient pas de quartz. L'équivalent volcanique d'une syénite est un trachyte. Elle est utilisée en tant que granulats ou roche ornementale et de construction."
+  },
+  talc: {
+    id: 'talc',
+    nom: 'talc',
+    domaineIds: ['c'],
+    description:
+      "Minéral - Silicate de magnésium hydraté (Mg3 Si4 O10 (OH)2) présentant une structure en feuillets dont les propriétés comme la dureté (1 de l'échelle de Mohs), hydrophobie, grande inertie chimique, blancheur en font un remarquable additif fonctionnel de nombreux domaines (peintures, plastiques, pharmacopée...)."
+  },
+  tech: { id: 'tech', nom: 'technétium', domaineIds: ['r'] },
+  terb: { id: 'terb', nom: 'terbium', domaineIds: ['m'] },
+  terv: {
+    id: 'terv',
+    nom: 'terre végétale',
+    domaineIds: ['c'],
+    description:
+      "Horizon sédimentaire humifère constitué suivant la profondeur de l'accumulation de matière organique associée à la croissance des végétaux et de l'altération du substratum rocheux sous-jacent."
+  },
+  thul: { id: 'thul', nom: 'thulium', domaineIds: ['m'] },
+  tmas: { id: 'tmas', nom: 'tous métaux associés', domaineIds: ['m'] },
+  tour: {
+    id: 'tour',
+    nom: 'tourbe',
+    domaineIds: ['c'],
+    description:
+      "Roche sédimentaire organique résultant de l'accumulation de la matière organique liée à la croissance des végétaux et de leur transformation sous certaines conditions. Elle est utilisée principalement comme amendement."
+  },
+  trac: {
+    id: 'trac',
+    nom: 'trachyte',
+    domaineIds: ['c'],
+    description:
+      'Roche volcanique effusive de couleur gris-clair, à texture souvent poreuse constituée de fins cristaux (microlites) de feldspaths baignant dans une matrice vitreuse (du fait de sa teneur en silice assez élevée). Elle est utilisée pour ses bonnes caractéristiques mécaniques en tant que granulats et comme roches ornementales et de constructions (ex: lave de Volvic, lave de Chambois).'
+  },
+  tufo: {
+    id: 'tufo',
+    nom: 'tuffeau',
+    domaineIds: ['c'],
+    description: 'Roche sédimentaire blanchâtre peu stratifiée à texture crayeuse constituée de calcite, utilisée comme pierre de construction.'
+  },
+  ytri: { id: 'ytri', nom: 'yttrium', domaineIds: ['m'] },
+  ytte: { id: 'ytte', nom: 'ytterbium', domaineIds: ['m'] }
+}
+
+export const SubstancesLegales = Object.values(SubstancesLegale)
diff --git a/packages/common/src/static/unites.ts b/packages/common/src/static/unites.ts
index 4ea5a6089..345bb5a6b 100644
--- a/packages/common/src/static/unites.ts
+++ b/packages/common/src/static/unites.ts
@@ -29,20 +29,20 @@ export type UniteOpenfiscaId = 'kg' | '100kg' | 't' | '100t' | 'kt' | '100km3'
 export type UniteId = typeof UNITE_IDS[keyof typeof UNITE_IDS]
 
 export const Unites: { [key in UniteId]: Unite<key> } = {
-  deg: {id: 'deg', nom: 'degré', symbole: 'º', referenceUniteId: null, referenceUniteRatio: null},
-  gon: {id: 'gon', nom: 'grade', symbole: 'gon', referenceUniteId: 'deg', referenceUniteRatio: 0.9},
-  km3: {id: 'km3', nom: 'kilomètre cube', symbole: 'km³', referenceUniteId: 'm3x', referenceUniteRatio: 1000000000},
-  m3a: {id: 'm3a', nom: 'mètre cube par an', symbole: 'm³ / an', referenceUniteId: null, referenceUniteRatio: null},
-  m3x: {id: 'm3x', nom: 'mètre cube', symbole: 'm³', referenceUniteId: null, referenceUniteRatio: null},
-  met: {id: 'met', nom: 'mètre', symbole: 'm', referenceUniteId: null, referenceUniteRatio: null},
-  mgr: {id: 'mgr', nom: 'gramme', symbole: 'g', referenceUniteId: 'mkg', referenceUniteRatio: 0.001},
-  mkc: {id: 'mkc', nom: 'quintal', symbole: 'x 100 kg', referenceUniteId: 'mkg', referenceUniteRatio: 100, openfiscaId: '100kg'},
-  mkg: {id: 'mkg', nom: 'kilogramme', symbole: 'kg', referenceUniteId: null, referenceUniteRatio: null, openfiscaId: 'kg'},
-  mtc: {id: 'mtc', nom: 'centaine de tonnes', symbole: 'x 100 t', referenceUniteId: 'mkg', referenceUniteRatio: 100000, openfiscaId: '100t'},
-  mtk: {id: 'mtk', nom: 'millier de tonnes', symbole: 'x 1000 t', referenceUniteId: 'mkg', referenceUniteRatio: 1000000, openfiscaId: 'kt'},
-  mtt: {id: 'mtt', nom: 'tonne', symbole: 't', referenceUniteId: 'mkg', referenceUniteRatio: 1000, openfiscaId: 't'},
-  txa: {id: 'txa', nom: 'tonnes par an', symbole: 't / an', referenceUniteId: null, referenceUniteRatio: null},
-  vmd: {id: 'vmd', nom: '100 000 mètres cubes', symbole: 'x 100 000 m³', referenceUniteId: 'm3x', referenceUniteRatio: 100000, openfiscaId: '100km3'}
+  deg: { id: 'deg', nom: 'degré', symbole: 'º', referenceUniteId: null, referenceUniteRatio: null },
+  gon: { id: 'gon', nom: 'grade', symbole: 'gon', referenceUniteId: 'deg', referenceUniteRatio: 0.9 },
+  km3: { id: 'km3', nom: 'kilomètre cube', symbole: 'km³', referenceUniteId: 'm3x', referenceUniteRatio: 1000000000 },
+  m3a: { id: 'm3a', nom: 'mètre cube par an', symbole: 'm³ / an', referenceUniteId: null, referenceUniteRatio: null },
+  m3x: { id: 'm3x', nom: 'mètre cube', symbole: 'm³', referenceUniteId: null, referenceUniteRatio: null },
+  met: { id: 'met', nom: 'mètre', symbole: 'm', referenceUniteId: null, referenceUniteRatio: null },
+  mgr: { id: 'mgr', nom: 'gramme', symbole: 'g', referenceUniteId: 'mkg', referenceUniteRatio: 0.001 },
+  mkc: { id: 'mkc', nom: 'quintal', symbole: 'x 100 kg', referenceUniteId: 'mkg', referenceUniteRatio: 100, openfiscaId: '100kg' },
+  mkg: { id: 'mkg', nom: 'kilogramme', symbole: 'kg', referenceUniteId: null, referenceUniteRatio: null, openfiscaId: 'kg' },
+  mtc: { id: 'mtc', nom: 'centaine de tonnes', symbole: 'x 100 t', referenceUniteId: 'mkg', referenceUniteRatio: 100000, openfiscaId: '100t' },
+  mtk: { id: 'mtk', nom: 'millier de tonnes', symbole: 'x 1000 t', referenceUniteId: 'mkg', referenceUniteRatio: 1000000, openfiscaId: 'kt' },
+  mtt: { id: 'mtt', nom: 'tonne', symbole: 't', referenceUniteId: 'mkg', referenceUniteRatio: 1000, openfiscaId: 't' },
+  txa: { id: 'txa', nom: 'tonnes par an', symbole: 't / an', referenceUniteId: null, referenceUniteRatio: null },
+  vmd: { id: 'vmd', nom: '100 000 mètres cubes', symbole: 'x 100 000 m³', referenceUniteId: 'm3x', referenceUniteRatio: 100000, openfiscaId: '100km3' }
 }
 
 export const UNITES = Object.values(Unites)
diff --git a/packages/common/src/typescript-tools.ts b/packages/common/src/typescript-tools.ts
index ffd48ed73..a1a63973d 100644
--- a/packages/common/src/typescript-tools.ts
+++ b/packages/common/src/typescript-tools.ts
@@ -7,3 +7,5 @@ export const isNotNullNorUndefined = <T>(value: T | null | undefined): value is
 export const onlyUnique = <T>(value: T, index: number, self: T[]): boolean => {
   return self.indexOf(value) === index
 }
+
+export type Optional<T, K extends keyof T> = Pick<Partial<T>, K> & Omit<T, K>
diff --git a/packages/ui/src/api/fragments/substance.js b/packages/ui/src/api/fragments/substance.js
deleted file mode 100644
index 8ed663b05..000000000
--- a/packages/ui/src/api/fragments/substance.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import gql from 'graphql-tag'
-
-const fragmentSubstance = gql`
-  fragment substance on Substance {
-    id
-    nom
-    symbole
-    gerep
-    description
-    legales {
-      id
-      nom
-      description
-      domaine {
-        id
-        nom
-      }
-    }
-  }
-`
-
-const fragmentTitreSubstance = gql`
-  fragment titreSubstance on TitreSubstance {
-    id
-    nom
-    ordre
-    symbole
-    gerep
-    description
-    legales {
-      id
-      nom
-      description
-      domaine {
-        id
-        nom
-      }
-    }
-  }
-`
-
-const fragmentTitresSubstance = gql`
-  fragment titresSubstance on TitreSubstance {
-    id
-    nom
-  }
-`
-
-export { fragmentSubstance, fragmentTitreSubstance, fragmentTitresSubstance }
diff --git a/packages/ui/src/api/fragments/titre-etape.js b/packages/ui/src/api/fragments/titre-etape.js
index 971663f18..138f038c6 100644
--- a/packages/ui/src/api/fragments/titre-etape.js
+++ b/packages/ui/src/api/fragments/titre-etape.js
@@ -1,7 +1,6 @@
 import gql from 'graphql-tag'
 import { fragmentTitreAdministrations } from './administrations'
 import { fragmentTitreEntreprises } from './entreprises'
-import { fragmentTitreSubstance } from './substance'
 import { fragmentPoint } from './point'
 import { fragmentGeojsonMultiPolygon } from './geojson'
 import {
@@ -59,9 +58,7 @@ const fragmentHeritageEtape = gql`
     points {
       ...point
     }
-    substances {
-      ...titreSubstance
-    }
+    substances
     contenu
   }
 
@@ -72,8 +69,6 @@ const fragmentHeritageEtape = gql`
   ${fragmentTitreEntreprises}
 
   ${fragmentPoint}
-
-  ${fragmentTitreSubstance}
 `
 
 const fragmentHeritageProps = gql`
@@ -151,9 +146,8 @@ const fragmentTitreEtape = gql`
     geojsonMultiPolygon {
       ...geojsonMultiPolygon
     }
-    substances {
-      ...titreSubstance
-    }
+    substances
+
     documents {
       ...document
     }
@@ -186,8 +180,6 @@ const fragmentTitreEtape = gql`
 
   ${fragmentGeojsonMultiPolygon}
 
-  ${fragmentTitreSubstance}
-
   ${fragmentCommune}
 
   ${fragmentDocument}
@@ -229,9 +221,7 @@ const fragmentEtapeHeritage = gql`
       ...point
     }
 
-    substances {
-      ...titreSubstance
-    }
+    substances
 
     contenu
 
@@ -246,8 +236,6 @@ const fragmentEtapeHeritage = gql`
 
   ${fragmentPoint}
 
-  ${fragmentTitreSubstance}
-
   ${fragmentHeritageProps}
 
   ${fragmentDocumentType}
@@ -309,9 +297,7 @@ const fragmentEtape = gql`
     geojsonMultiPolygon {
       ...geojsonMultiPolygon
     }
-    substances {
-      ...titreSubstance
-    }
+    substances
     documents {
       ...document
     }
@@ -347,8 +333,6 @@ const fragmentEtape = gql`
 
   ${fragmentGeojsonMultiPolygon}
 
-  ${fragmentTitreSubstance}
-
   ${fragmentCommune}
 
   ${fragmentDocument}
diff --git a/packages/ui/src/api/fragments/titre.js b/packages/ui/src/api/fragments/titre.js
index 1826769bc..2b9b3bdc0 100644
--- a/packages/ui/src/api/fragments/titre.js
+++ b/packages/ui/src/api/fragments/titre.js
@@ -3,7 +3,6 @@ import gql from 'graphql-tag'
 import { fragmentTitreType } from './metas'
 import { fragmentTitreDemarche } from './titre-demarche'
 import { fragmentTitreActivite } from './titre-activite'
-import { fragmentTitreSubstance, fragmentTitresSubstance } from './substance'
 import { fragmentTitreAdministrations } from './administrations'
 import {
   fragmentTitreEntreprises,
@@ -40,9 +39,7 @@ const fragmentTitre = gql`
       }
       nom
     }
-    substances {
-      ...titreSubstance
-    }
+    substances
     dateDebut
     dateFin
     activitesEnConstruction
@@ -109,8 +106,6 @@ const fragmentTitre = gql`
 
   ${fragmentTitreActivite}
 
-  ${fragmentTitreSubstance}
-
   ${fragmentPoint}
 
   ${fragmentGeojsonPoints}
@@ -143,9 +138,7 @@ const fragmentTitres = gql`
       nom
       couleur
     }
-    substances {
-      ...titresSubstance
-    }
+    substances
     activitesEnConstruction
     activitesAbsentes
     activitesDeposees
@@ -168,8 +161,6 @@ const fragmentTitres = gql`
 
   ${fragmentTitresEntreprises}
 
-  ${fragmentTitresSubstance}
-
   ${fragmentTitreType}
 `
 
diff --git a/packages/ui/src/api/metas-activites.js b/packages/ui/src/api/metas-activites.js
index 7826d3091..e27c5faf6 100644
--- a/packages/ui/src/api/metas-activites.js
+++ b/packages/ui/src/api/metas-activites.js
@@ -21,11 +21,6 @@ const activitesMetas = apiGraphQLFetch(
         ...activiteStatut
       }
 
-      domaines {
-        id
-        nom
-      }
-
       types {
         ...titreTypeType
       }
@@ -101,40 +96,6 @@ const activitesTypesTitresTypes = apiGraphQLFetch(
   `
 )
 
-const activiteTypeTitreTypeModifier = apiGraphQLFetch(gql`
-  mutation ActiviteTypeTitreTypeModifier(
-    $element: InputActiviteTypeTitreType!
-  ) {
-    activiteTypeTitreTypeModifier(activiteTypeTitreType: $element) {
-      ...activiteTypeTitreType
-    }
-  }
-
-  ${fragmentActiviteTypeTitreType}
-`)
-
-const activiteTypeTitreTypeCreer = apiGraphQLFetch(gql`
-  mutation ActiviteTypeTitreTypeCreer($element: InputActiviteTypeTitreType!) {
-    activiteTypeTitreTypeCreer(activiteTypeTitreType: $element) {
-      ...activiteTypeTitreType
-    }
-  }
-
-  ${fragmentActiviteTypeTitreType}
-`)
-
-const activiteTypeTitreTypeSupprimer = apiGraphQLFetch(gql`
-  mutation ActiviteTypeTitreTypeSupprimer(
-    $element: InputActiviteTypeTitreType!
-  ) {
-    activiteTypeTitreTypeSupprimer(activiteTypeTitreType: $element) {
-      ...activiteTypeTitreType
-    }
-  }
-
-  ${fragmentActiviteTypeTitreType}
-`)
-
 const activitesTypesDocumentsTypes = apiGraphQLFetch(
   gql`
     query ActivitesTypesDocumentsTypes {
@@ -222,9 +183,6 @@ export {
   activitesStatuts,
   activiteStatutModifier,
   activitesTypesTitresTypes,
-  activiteTypeTitreTypeCreer,
-  activiteTypeTitreTypeModifier,
-  activiteTypeTitreTypeSupprimer,
   activitesTypesDocumentsTypes,
   activiteTypeDocumentTypeCreer,
   activiteTypeDocumentTypeModifier,
diff --git a/packages/ui/src/api/metas.js b/packages/ui/src/api/metas.js
index ae3f4f1c0..4f9717a47 100644
--- a/packages/ui/src/api/metas.js
+++ b/packages/ui/src/api/metas.js
@@ -140,19 +140,6 @@ const etapeTypeModifier = apiGraphQLFetch(gql`
   ${fragmentEtapeType}
 `)
 
-const substancesLegales = apiGraphQLFetch(
-  gql`
-    query SubstancesLegales {
-      substancesLegales {
-        id
-        nom
-        description
-        ordre
-      }
-    }
-  `
-)
-
 const documentsTypes = apiGraphQLFetch(
   gql`
     query DocumentsTypes {
@@ -615,7 +602,6 @@ export {
   phaseStatutModifier,
   etapesTypes,
   etapeTypeModifier,
-  substancesLegales,
   documentsTypes,
   documentTypeCreer,
   documentTypeModifier,
diff --git a/packages/ui/src/api/titres-activites.js b/packages/ui/src/api/titres-activites.js
index 31abcf347..6041117b0 100644
--- a/packages/ui/src/api/titres-activites.js
+++ b/packages/ui/src/api/titres-activites.js
@@ -42,7 +42,7 @@ const activites = apiGraphQLFetch(
       $titresStatutsIds: [ID]
       $titresNoms: String
       $titresEntreprises: String
-      $titresSubstances: String
+      $titresSubstancesIds: [String]
       $titresReferences: String
       $titresTerritoires: String
     ) {
@@ -59,7 +59,7 @@ const activites = apiGraphQLFetch(
         titresStatutsIds: $titresStatutsIds
         titresNoms: $titresNoms
         titresEntreprises: $titresEntreprises
-        titresSubstances: $titresSubstances
+        titresSubstancesIds: $titresSubstancesIds
         titresReferences: $titresReferences
         titresTerritoires: $titresTerritoires
       ) {
diff --git a/packages/ui/src/api/titres-demarches.js b/packages/ui/src/api/titres-demarches.js
index fd65467e1..d0194a4a0 100644
--- a/packages/ui/src/api/titres-demarches.js
+++ b/packages/ui/src/api/titres-demarches.js
@@ -7,11 +7,6 @@ import { fragmentDemarches } from './fragments/titres-demarches'
 const demarchesMetas = apiGraphQLFetch(
   gql`
     query MetasDemarches($travaux: Boolean) {
-      domaines {
-        id
-        nom
-      }
-
       types {
         id
         nom
@@ -70,7 +65,7 @@ const demarches = apiGraphQLFetch(
       $titresStatutsIds: [ID!]
       $titresNoms: String
       $titresEntreprises: String
-      $titresSubstances: String
+      $titresSubstancesIds: [ID]
       $titresReferences: String
       $titresTerritoires: String
       $travaux: Boolean
@@ -89,7 +84,7 @@ const demarches = apiGraphQLFetch(
         titresStatutsIds: $titresStatutsIds
         titresNoms: $titresNoms
         titresEntreprises: $titresEntreprises
-        titresSubstances: $titresSubstances
+        titresSubstancesIds: $titresSubstancesIds
         titresReferences: $titresReferences
         titresTerritoires: $titresTerritoires
         travaux: $travaux
diff --git a/packages/ui/src/api/titres-etapes.js b/packages/ui/src/api/titres-etapes.js
index 4337a718e..482a42348 100644
--- a/packages/ui/src/api/titres-etapes.js
+++ b/packages/ui/src/api/titres-etapes.js
@@ -1,7 +1,6 @@
 import gql from 'graphql-tag'
 import { apiGraphQLFetch } from './_client'
 
-import { fragmentSubstance } from './fragments/substance'
 import { fragmentEtape, fragmentEtapeHeritage } from './fragments/titre-etape'
 import { fragmentEtapeMetasEntreprises } from './fragments/entreprises'
 
@@ -53,10 +52,6 @@ const titreEtapeMetas = apiGraphQLFetch(
         }
       }
 
-      substances {
-        ...substance
-      }
-
       entreprises(archive: false, etapeId: $id) {
         elements {
           ...etapeMetasEntreprises
@@ -64,8 +59,6 @@ const titreEtapeMetas = apiGraphQLFetch(
       }
     }
 
-    ${fragmentSubstance}
-
     ${fragmentEtapeMetasEntreprises}
   `
 )
diff --git a/packages/ui/src/api/titres.js b/packages/ui/src/api/titres.js
index 63b27ae34..408c108a9 100644
--- a/packages/ui/src/api/titres.js
+++ b/packages/ui/src/api/titres.js
@@ -36,14 +36,6 @@ const titreCreationMetas = apiGraphQLFetch(
 const titresMetas = apiGraphQLFetch(
   gql`
     query TitresMetas {
-      domaines {
-        id
-        nom
-        titresTypes {
-          titresCreation
-        }
-      }
-
       types {
         ...titreTypeType
       }
@@ -54,11 +46,6 @@ const titresMetas = apiGraphQLFetch(
         couleur
       }
 
-      substancesLegales {
-        id
-        nom
-      }
-
       entreprises {
         elements {
           id
@@ -90,7 +77,7 @@ const titresGeoPolygon = apiGraphQLFetch(
       $typesIds: [ID!]
       $domainesIds: [ID!]
       $statutsIds: [ID!]
-      $substancesLegalesIds: [ID!]
+      $substancesIds: [ID!]
       $entreprisesIds: [ID!]
       $references: String
       $territoires: String
@@ -101,7 +88,7 @@ const titresGeoPolygon = apiGraphQLFetch(
         typesIds: $typesIds
         domainesIds: $domainesIds
         statutsIds: $statutsIds
-        substancesLegalesIds: $substancesLegalesIds
+        substancesIds: $substancesIds
         entreprisesIds: $entreprisesIds
         references: $references
         territoires: $territoires
@@ -126,7 +113,7 @@ const titresGeo = apiGraphQLFetch(
       $typesIds: [ID!]
       $domainesIds: [ID!]
       $statutsIds: [ID!]
-      $substancesLegalesIds: [ID!]
+      $substancesIds: [ID!]
       $entreprisesIds: [ID!]
       $references: String
       $territoires: String
@@ -137,7 +124,7 @@ const titresGeo = apiGraphQLFetch(
         typesIds: $typesIds
         domainesIds: $domainesIds
         statutsIds: $statutsIds
-        substancesLegalesIds: $substancesLegalesIds
+        substancesIds: $substancesIds
         entreprisesIds: $entreprisesIds
         references: $references
         territoires: $territoires
@@ -166,7 +153,7 @@ const titres = apiGraphQLFetch(
       $typesIds: [ID!]
       $domainesIds: [ID!]
       $statutsIds: [ID!]
-      $substancesLegalesIds: [ID!]
+      $substancesIds: [ID!]
       $noms: String
       $entreprisesIds: [ID!]
       $references: String
@@ -181,7 +168,7 @@ const titres = apiGraphQLFetch(
         typesIds: $typesIds
         domainesIds: $domainesIds
         statutsIds: $statutsIds
-        substancesLegalesIds: $substancesLegalesIds
+        substancesIds: $substancesIds
         noms: $noms
         entreprisesIds: $entreprisesIds
         references: $references
diff --git a/packages/ui/src/components/activites/filtres.js b/packages/ui/src/components/activites/filtres.js
index ae8beb756..d0bf9ba79 100644
--- a/packages/ui/src/components/activites/filtres.js
+++ b/packages/ui/src/components/activites/filtres.js
@@ -3,6 +3,8 @@ import FiltresDomaines from '../_common/filtres/domaines.vue'
 import FiltresTypes from '../_common/filtres/types.vue'
 import { elementsFormat } from '../../utils/index'
 import { markRaw } from '@vue/reactivity'
+import { SubstancesLegales } from 'camino-common/src/static/substancesLegales'
+import { sortedDomaines } from 'camino-common/src/static/domaines'
 
 const filtres = [
   {
@@ -20,11 +22,11 @@ const filtres = [
     placeholder: 'Nom ou siret'
   },
   {
-    id: 'titresSubstances',
-    type: 'input',
-    value: '',
+    id: 'titresSubstancesIds',
+    type: 'autocomplete',
+    value: [],
     name: 'Substances',
-    placeholder: 'Or, Argent, Ag, …'
+    elements: SubstancesLegales
   },
   {
     id: 'titresReferences',
@@ -45,9 +47,8 @@ const filtres = [
     name: 'Domaines',
     type: 'checkboxes',
     value: [],
-    elements: [],
-    component: markRaw(FiltresDomaines),
-    elementsFormat
+    elements: sortedDomaines,
+    component: markRaw(FiltresDomaines)
   },
   {
     id: 'titresTypesIds',
diff --git a/packages/ui/src/components/dashboard/__snapshots__/pure-entreprise-dashboard.stories.storyshot b/packages/ui/src/components/dashboard/__snapshots__/pure-entreprise-dashboard.stories.storyshot
index ab37f16c9..20a77bc27 100644
--- a/packages/ui/src/components/dashboard/__snapshots__/pure-entreprise-dashboard.stories.storyshot
+++ b/packages/ui/src/components/dashboard/__snapshots__/pure-entreprise-dashboard.stories.storyshot
@@ -1200,7 +1200,7 @@ exports[`Automated Storybook Snapshots Components/PureEntrepriseDashboard Ok 1`]
             class="th nowrap min-width-6"
           >
             <button
-              class="btn-menu full-x p-0"
+              class="btn-menu full-x p-0 disabled"
             >
               Substances 
               <!--v-if-->
@@ -2734,7 +2734,7 @@ exports[`Automated Storybook Snapshots Components/PureEntrepriseDashboard Ok Wit
             class="th nowrap min-width-6"
           >
             <button
-              class="btn-menu full-x p-0"
+              class="btn-menu full-x p-0 disabled"
             >
               Substances 
               <!--v-if-->
diff --git a/packages/ui/src/components/dashboard/pure-entreprise-dashboard.stories.ts b/packages/ui/src/components/dashboard/pure-entreprise-dashboard.stories.ts
index 3c8865c0a..2c5c9b586 100644
--- a/packages/ui/src/components/dashboard/pure-entreprise-dashboard.stories.ts
+++ b/packages/ui/src/components/dashboard/pure-entreprise-dashboard.stories.ts
@@ -45,12 +45,7 @@ const titres: TitreEntreprise[] = [
       nom: 'échu',
       couleur: 'neutral'
     },
-    substances: [
-      {
-        id: 'ferx',
-        nom: 'fer'
-      }
-    ],
+    substances: ['ferx'],
     activitesEnConstruction: null,
     activitesAbsentes: null,
     titulaires: [
@@ -91,12 +86,7 @@ const titres: TitreEntreprise[] = [
       nom: 'valide',
       couleur: 'success'
     },
-    substances: [
-      {
-        id: 'auru',
-        nom: 'or'
-      }
-    ],
+    substances: ['auru'],
     activitesEnConstruction: null,
     activitesAbsentes: null,
     titulaires: [
diff --git a/packages/ui/src/components/demarches/filtres.js b/packages/ui/src/components/demarches/filtres.js
index 362e721e1..ca090473e 100644
--- a/packages/ui/src/components/demarches/filtres.js
+++ b/packages/ui/src/components/demarches/filtres.js
@@ -4,6 +4,8 @@ import FiltresTitresStatuts from '../_common/filtres/statuts.vue'
 import FiltresEtapes from './filtres-custom-etapes.vue'
 import { elementsFormat } from '../../utils/index'
 import { EtapesStatuts } from 'camino-common/src/static/etapesStatuts'
+import { SubstancesLegales } from 'camino-common/src/static/substancesLegales'
+import { sortedDomaines } from 'camino-common/src/static/domaines'
 
 const etapesElementsFormat = (id, metas) => metas.etapesTypes
 const etapesLabelFormat = f =>
@@ -79,9 +81,8 @@ const filtres = [
     name: 'Domaines',
     type: 'checkboxes',
     value: [],
-    elements: [],
-    component: markRaw(FiltresTitresDomaines),
-    elementsFormat
+    elements: sortedDomaines,
+    component: markRaw(FiltresTitresDomaines)
   },
   {
     id: 'titresTypesIds',
@@ -115,11 +116,11 @@ const filtres = [
     placeholder: 'Nom ou siret'
   },
   {
-    id: 'titresSubstances',
-    type: 'input',
-    value: '',
-    name: 'Substances',
-    placeholder: 'Or, Argent, Ag, …'
+    id: 'titresSubstancesIds',
+    type: 'autocomplete',
+    value: [],
+    elements: SubstancesLegales,
+    name: 'Substances'
   },
   {
     id: 'titresReferences',
diff --git a/packages/ui/src/components/etape/__snapshots__/substances-edit.stories.storyshot b/packages/ui/src/components/etape/__snapshots__/substances-edit.stories.storyshot
new file mode 100644
index 000000000..65a5fc1c4
--- /dev/null
+++ b/packages/ui/src/components/etape/__snapshots__/substances-edit.stories.storyshot
@@ -0,0 +1,1281 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Automated Storybook Snapshots Components/Etape/SubstancesEdit Avec Heritage 1`] = `
+<div>
+  <h3
+    class="mb-s"
+  >
+    Substances
+  </h3>
+  <div
+    class="mb-s"
+  >
+    <div>
+      
+      <ul
+        class="list-inline mb-s"
+      >
+        
+        <li
+          class="mr-xs mb-xs"
+        >
+          <span
+            class="bold cap-first small lh-2"
+          >
+            <span
+              class="bg-neutral py-xs px-s py-xxs px-xs rnd-xs color-bg box"
+            >
+              
+              or
+              
+            </span>
+          </span>
+        </li>
+        
+      </ul>
+      
+      <div
+        class="mb-s"
+      >
+        <span
+          class="bold cap-first small"
+        >
+          <span
+            class="bg-info py-xxs px-xs py-xxs px-xs rnd-xs color-bg box"
+          >
+            
+            Incertain 
+            
+          </span>
+        </span>
+      </div>
+      <p
+        class="h6 italic mb-s"
+      >
+         Hérité de : 
+        <span
+          class="cap-first"
+        >
+          Demande
+        </span>
+         (01 / 01 / 2020) 
+      </p>
+    </div>
+    
+    
+    <button
+      class="btn full-x rnd-xs py-s px-m small mb-s"
+    >
+      Modifier
+    </button>
+  </div>
+</div>
+`;
+
+exports[`Automated Storybook Snapshots Components/Etape/SubstancesEdit Sans Heritage 1`] = `
+<div>
+  <h3
+    class="mb-s"
+  >
+    Substances
+  </h3>
+  <div
+    class="mb-s"
+  >
+    
+    
+    <div>
+      <div
+        class="flex mb-s"
+      >
+        <select
+          class="p-s mr-s"
+        >
+          
+          <option
+            value="selh"
+          >
+            sources d'eau salée
+          </option>
+          <option
+            value="aloh"
+          >
+            bauxite
+          </option>
+          <option
+            value="anti"
+          >
+            antimoine
+          </option>
+          <option
+            value="arge"
+          >
+            argent
+          </option>
+          <option
+            value="arse"
+          >
+            arsenic
+          </option>
+          <option
+            disabled=""
+            value="auru"
+          >
+            or
+          </option>
+          <option
+            value="bery"
+          >
+            béryllium
+          </option>
+          <option
+            value="bism"
+          >
+            bismuth
+          </option>
+          <option
+            value="cadm"
+          >
+            cadmium
+          </option>
+          <option
+            value="ceri"
+          >
+            cérium
+          </option>
+          <option
+            value="cesi"
+          >
+            césium
+          </option>
+          <option
+            value="chro"
+          >
+            chrome
+          </option>
+          <option
+            value="coba"
+          >
+            cobalt
+          </option>
+          <option
+            value="coox"
+          >
+            gaz carbonique
+          </option>
+          <option
+            value="cuiv"
+          >
+            cuivre
+          </option>
+          <option
+            value="diam"
+          >
+            diamant
+          </option>
+          <option
+            value="etai"
+          >
+            étain
+          </option>
+          <option
+            value="ferx"
+          >
+            fer
+          </option>
+          <option
+            value="fluo"
+          >
+            fluorine
+          </option>
+          <option
+            value="gall"
+          >
+            gallium
+          </option>
+          <option
+            value="germ"
+          >
+            germanium
+          </option>
+          <option
+            value="grap"
+          >
+            graphite
+          </option>
+          <option
+            value="hafn"
+          >
+            hafnium
+          </option>
+          <option
+            value="heli"
+          >
+            hélium
+          </option>
+          <option
+            value="hydm"
+          >
+            calcaires bitumineux
+          </option>
+          <option
+            value="indi"
+          >
+            indium
+          </option>
+          <option
+            value="kals"
+          >
+            alun
+          </option>
+          <option
+            value="kclx"
+          >
+            sels de potassium
+          </option>
+          <option
+            value="lith"
+          >
+            lithium
+          </option>
+          <option
+            value="mang"
+          >
+            manganèse
+          </option>
+          <option
+            value="merc"
+          >
+            mercure
+          </option>
+          <option
+            value="moly"
+          >
+            molybdène
+          </option>
+          <option
+            value="nacl"
+          >
+            sels de sodium
+          </option>
+          <option
+            value="nick"
+          >
+            nickel
+          </option>
+          <option
+            value="niob"
+          >
+            niobium
+          </option>
+          <option
+            value="oooo"
+          >
+            non précisée(s)
+          </option>
+          <option
+            value="phos"
+          >
+            phosphates
+          </option>
+          <option
+            value="plat"
+          >
+            platine
+          </option>
+          <option
+            value="plax"
+          >
+            métaux de la mine du platine
+          </option>
+          <option
+            value="plom"
+          >
+            plomb
+          </option>
+          <option
+            value="rhen"
+          >
+            rhénium
+          </option>
+          <option
+            value="rubi"
+          >
+            rubidium
+          </option>
+          <option
+            value="scan"
+          >
+            scandium
+          </option>
+          <option
+            value="scoc"
+          >
+            substances connexes
+          </option>
+          <option
+            value="sele"
+          >
+            sélénium
+          </option>
+          <option
+            value="souf"
+          >
+            soufre
+          </option>
+          <option
+            value="soxx"
+          >
+            sulfates autres que les sulfates alcalino-terreux
+          </option>
+          <option
+            value="tant"
+          >
+            tantale
+          </option>
+          <option
+            value="tell"
+          >
+            tellure
+          </option>
+          <option
+            value="thal"
+          >
+            thallium
+          </option>
+          <option
+            value="tita"
+          >
+            titane
+          </option>
+          <option
+            value="trxx"
+          >
+            autres éléments de terres rares
+          </option>
+          <option
+            value="vana"
+          >
+            vanadium
+          </option>
+          <option
+            value="wolf"
+          >
+            tungstène
+          </option>
+          <option
+            value="zinc"
+          >
+            zinc
+          </option>
+          <option
+            value="zirc"
+          >
+            zirconium
+          </option>
+          <option
+            value="dysp"
+          >
+            dysprosium
+          </option>
+          <option
+            value="erbi"
+          >
+            erbium
+          </option>
+          <option
+            value="euro"
+          >
+            europium
+          </option>
+          <option
+            value="gado"
+          >
+            gadolinium
+          </option>
+          <option
+            value="holm"
+          >
+            holmium
+          </option>
+          <option
+            value="irid"
+          >
+            iridium
+          </option>
+          <option
+            value="lant"
+          >
+            lanthane
+          </option>
+          <option
+            value="lute"
+          >
+            lutécium
+          </option>
+          <option
+            value="mais"
+          >
+            minerais
+          </option>
+          <option
+            value="meba"
+          >
+            métaux de base
+          </option>
+          <option
+            value="meco"
+          >
+            métaux connexes
+          </option>
+          <option
+            value="mepr"
+          >
+            métaux précieux
+          </option>
+          <option
+            value="neod"
+          >
+            néodyme
+          </option>
+          <option
+            value="osmi"
+          >
+            osmium
+          </option>
+          <option
+            value="pall"
+          >
+            palladium
+          </option>
+          <option
+            value="pipe"
+          >
+            pierres précieuses
+          </option>
+          <option
+            value="pras"
+          >
+            praséodyme
+          </option>
+          <option
+            value="prom"
+          >
+            prométhium
+          </option>
+          <option
+            value="pyri"
+          >
+            pyrite
+          </option>
+          <option
+            value="rhod"
+          >
+            rhodium
+          </option>
+          <option
+            value="ruth"
+          >
+            ruthénium
+          </option>
+          <option
+            value="sama"
+          >
+            samarium
+          </option>
+          <option
+            value="selg"
+          >
+            sel gemme
+          </option>
+          <option
+            value="selp"
+          >
+            puits d'eau salée
+          </option>
+          <option
+            value="sels"
+          >
+            sels
+          </option>
+          <option
+            value="selx"
+          >
+            sel
+          </option>
+          <option
+            value="terb"
+          >
+            terbium
+          </option>
+          <option
+            value="thul"
+          >
+            thulium
+          </option>
+          <option
+            value="tmas"
+          >
+            tous métaux associés
+          </option>
+          <option
+            value="ytri"
+          >
+            yttrium
+          </option>
+          <option
+            value="ytte"
+          >
+            ytterbium
+          </option>
+          
+        </select>
+        <!--v-if-->
+        <!--v-if-->
+        <button
+          class="rnd-l-xs btn py-s px-m rnd-r-xs"
+        >
+          <svg
+            aria-labelledby="minus"
+            fill="#666"
+            height="24px"
+            role="application"
+            style="display: block;"
+            tabindex="-1"
+            viewBox="0 0 24 24"
+            width="24px"
+            xmlns="http://www.w3.org/2000/svg"
+          >
+            <svg
+              aria-hidden="true"
+              style="position: absolute; width: 0px; height: 0px; overflow: hidden;"
+              xmlns="http://www.w3.org/2000/svg"
+              xmlns:xlink="http://www.w3.org/1999/xlink"
+            >
+              <symbol
+                id="icon-at"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  at
+                </title>
+                <path
+                  d="M20 12a8 8 0 1 0-3.562 6.657l1.11 1.664A9.953 9.953 0 0 1 12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10v1.5a3.5 3.5 0 0 1-6.396 1.966A5 5 0 1 1 15 8H17v5.5a1.5 1.5 0 0 0 3 0V12zm-8-3a3 3 0 1 0 0 6 3 3 0 0 0 0-6z"
+                />
+              </symbol>
+              <symbol
+                id="icon-checkbox-blank"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  checkbox-blank
+                </title>
+                <path
+                  d="M4 3h16a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1zm1 2v14h14V5H5z"
+                />
+              </symbol>
+              <symbol
+                id="icon-checkbox"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  checkbox
+                </title>
+                <path
+                  d="M4 3h16a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1zm1 2v14h14V5H5zm6.003 11L6.76 11.757l1.414-1.414 2.829 2.829 5.656-5.657 1.415 1.414L11.003 16z"
+                />
+              </symbol>
+              <symbol
+                id="icon-chevron-bas"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  chevron-bas
+                </title>
+                <path
+                  d="M12 13.172l4.95-4.95 1.414 1.414L12 16 5.636 9.636 7.05 8.222z"
+                />
+              </symbol>
+              <symbol
+                id="icon-chevron-haut"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  chevron-haut
+                </title>
+                <path
+                  d="M12 10.828l-4.95 4.95-1.414-1.414L12 8l6.364 6.364-1.414 1.414z"
+                />
+              </symbol>
+              <symbol
+                id="icon-close"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  close
+                </title>
+                <path
+                  d="M12 10.586l4.95-4.95 1.414 1.414-4.95 4.95 4.95 4.95-1.414 1.414-4.95-4.95-4.95 4.95-1.414-1.414 4.95-4.95-4.95-4.95L7.05 5.636z"
+                />
+              </symbol>
+              <symbol
+                id="icon-delete"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  delete
+                </title>
+                <path
+                  d="M17 6h5v2h-2v13a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V8H2V6h5V3a1 1 0 0 1 1-1h8a1 1 0 0 1 1 1v3zm1 2H6v12h12V8zm-9 3h2v6H9v-6zm4 0h2v6h-2v-6zM9 4v2h6V4H9z"
+                />
+              </symbol>
+              <symbol
+                id="icon-download"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  download
+                </title>
+                <path
+                  d="M3 19h18v2H3v-2zm10-5.828L19.071 7.1l1.414 1.414L12 17 3.515 8.515 4.929 7.1 11 13.17V2h2v11.172z"
+                />
+              </symbol>
+              <symbol
+                id="icon-error-warning"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  error-warning
+                </title>
+                <path
+                  d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-7v2h2v-2h-2zm0-8v6h2V7h-2z"
+                  fill="rgba(231,76,60,1)"
+                />
+              </symbol>
+              <symbol
+                id="icon-external-link"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  external-link
+                </title>
+                <path
+                  d="M10 6v2H5v11h11v-5h2v6a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h6zm11-3v8h-2V6.413l-7.793 7.794-1.414-1.414L17.585 5H13V3h8z"
+                />
+              </symbol>
+              <symbol
+                id="icon-file"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  file
+                </title>
+                <path
+                  d="M9 2.003V2h10.998C20.55 2 21 2.455 21 2.992v18.016a.993.993 0 0 1-.993.992H3.993A1 1 0 0 1 3 20.993V8l6-5.997zM5.83 8H9V4.83L5.83 8zM11 4v5a1 1 0 0 1-1 1H5v10h14V4h-8z"
+                />
+              </symbol>
+              <symbol
+                id="icon-file-add"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  file-add
+                </title>
+                <path
+                  d="M15 4H5v16h14V8h-4V4zM3 2.992C3 2.444 3.447 2 3.999 2H16l5 5v13.993A1 1 0 0 1 20.007 22H3.993A1 1 0 0 1 3 21.008V2.992zM11 11V8h2v3h3v2h-3v3h-2v-3H8v-2h3z"
+                />
+              </symbol>
+              <symbol
+                id="icon-globe"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  globe
+                </title>
+                <path
+                  d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-2.29-2.333A17.9 17.9 0 0 1 8.027 13H4.062a8.008 8.008 0 0 0 5.648 6.667zM10.03 13c.151 2.439.848 4.73 1.97 6.752A15.905 15.905 0 0 0 13.97 13h-3.94zm9.908 0h-3.965a17.9 17.9 0 0 1-1.683 6.667A8.008 8.008 0 0 0 19.938 13zM4.062 11h3.965A17.9 17.9 0 0 1 9.71 4.333 8.008 8.008 0 0 0 4.062 11zm5.969 0h3.938A15.905 15.905 0 0 0 12 4.248 15.905 15.905 0 0 0 10.03 11zm4.259-6.667A17.9 17.9 0 0 1 15.973 11h3.965a8.008 8.008 0 0 0-5.648-6.667z"
+                />
+              </symbol>
+              <symbol
+                id="icon-help"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  help
+                </title>
+                <path
+                  d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-2a8 8 0 1 0 0-16 8 8 0 0 0 0 16zM11 7h2v2h-2V7zm0 4h2v6h-2v-6z"
+                />
+              </symbol>
+              <symbol
+                id="icon-key"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  key
+                </title>
+                <path
+                  d="M10.758 11.828l7.849-7.849 1.414 1.414-1.414 1.415 2.474 2.474-1.414 1.415-2.475-2.475-1.414 1.414 2.121 2.121-1.414 1.415-2.121-2.122-2.192 2.192a5.002 5.002 0 0 1-7.708 6.294 5 5 0 0 1 6.294-7.708zm-.637 6.293A3 3 0 1 0 5.88 13.88a3 3 0 0 0 4.242 4.242z"
+                />
+              </symbol>
+              <symbol
+                id="icon-link"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  link
+                </title>
+                <path
+                  d="M18.364 15.536L16.95 14.12l1.414-1.414a5 5 0 1 0-7.071-7.071L9.879 7.05 8.464 5.636 9.88 4.222a7 7 0 0 1 9.9 9.9l-1.415 1.414zm-2.828 2.828l-1.415 1.414a7 7 0 0 1-9.9-9.9l1.415-1.414L7.05 9.88l-1.414 1.414a5 5 0 1 0 7.071 7.071l1.414-1.414 1.415 1.414zm-.708-10.607l1.415 1.415-7.071 7.07-1.415-1.414 7.071-7.07z"
+                />
+              </symbol>
+              <symbol
+                id="icon-list"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  list
+                </title>
+                <path
+                  d="M8 4h13v2H8V4zM4.5 6.5a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm0 7a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm0 6.9a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zM8 11h13v2H8v-2zm0 7h13v2H8v-2z"
+                />
+              </symbol>
+              <symbol
+                id="icon-marker-cluster"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  marker-cluster
+                </title>
+                <path
+                  d="M12 20.9l4.95-4.95a7 7 0 1 0-9.9 0L12 20.9zm0 2.828l-6.364-6.364a9 9 0 1 1 12.728 0L12 23.728zM12 13a2 2 0 1 0 0-4 2 2 0 0 0 0 4zm0 2a4 4 0 1 1 0-8 4 4 0 0 1 0 8z"
+                />
+              </symbol>
+              <symbol
+                id="icon-marker-none"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  marker-none
+                </title>
+                <g
+                  id="24-markers-grouped"
+                  transform="translate(0.908117, 0.000078)"
+                >
+                  <path
+                    d="M9.09188309,18.8999221 L14.0418831,13.9499221 C16.7753479,11.2161783 16.7751972,6.78415329 14.0415464,4.05059549 C11.3078956,1.31703769 6.87587059,1.31703769 4.1422198,4.05059549 C1.40856902,6.78415329 1.40841827,11.2161783 4.14188309,13.9499221 L9.09188309,18.8999221 Z M9.09188309,21.7279221 L2.72788309,15.3639221 C-0.786803866,11.8491921 -0.786780603,6.15072729 2.72793505,2.63602598 C6.24265071,-0.878675327 11.9411155,-0.878675327 15.4558311,2.63602598 C18.9705468,6.15072729 18.97057,11.8491921 15.4558831,15.3639221 L9.09188309,21.7279221 L9.09188309,21.7279221 Z M9.09188309,10.9999221 C10.1964526,10.9999221 11.0918831,10.1044916 11.0918831,8.99992206 C11.0918831,7.89535256 10.1964526,6.99992206 9.09188309,6.99992206 C7.98731359,6.99992206 7.09188309,7.89535256 7.09188309,8.99992206 C7.09188309,10.1044916 7.98731359,10.9999221 9.09188309,10.9999221 Z M9.09188309,12.9999221 C6.88274409,12.9999221 5.09188309,11.2090611 5.09188309,8.99992206 C5.09188309,6.79078306 6.88274409,4.99992206 9.09188309,4.99992206 C11.3010221,4.99992206 13.0918831,6.79078306 13.0918831,8.99992206 C13.0918831,11.2090611 11.3010221,12.9999221 9.09188309,12.9999221 Z"
+                  />
+                  <rect
+                    height="24"
+                    transform="translate(9.192388, 9.514641) rotate(-45.000000) translate(-9.192388, -9.514641) "
+                    width="2"
+                    x="8.19238816"
+                    y="-2.48535931"
+                  />
+                </g>
+              </symbol>
+              <symbol
+                id="icon-marker-ungrouped"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  marker-ungrouped
+                </title>
+                <path
+                  d="M9.975 8.975a3.5 3.5 0 1 0-4.95 0L7.5 11.45l2.475-2.475zM7.5 14.278L3.61 10.39a5.5 5.5 0 1 1 7.78 0L7.5 14.28zM7.5 8a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm9 12.45l2.475-2.475a3.5 3.5 0 1 0-4.95 0L16.5 20.45zm3.89-1.06l-3.89 3.888-3.89-3.889a5.5 5.5 0 1 1 7.78 0zM16.5 17a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z"
+                />
+              </symbol>
+              <symbol
+                id="icon-menu"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  menu
+                </title>
+                <path
+                  d="M3 4h18v2H3V4zm0 7h18v2H3v-2zm0 7h18v2H3v-2z"
+                />
+              </symbol>
+              <symbol
+                id="icon-minus"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  minus
+                </title>
+                <path
+                  d="M5 11h14v2H5z"
+                />
+              </symbol>
+              <symbol
+                id="icon-move-down"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  move-down
+                </title>
+                <path
+                  d="M13 16.172l5.364-5.364 1.414 1.414L12 20l-7.778-7.778 1.414-1.414L11 16.172V4h2v12.172z"
+                />
+              </symbol>
+              <symbol
+                id="icon-move-up"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  move-up
+                </title>
+                <path
+                  d="M13 7.828V20h-2V7.828l-5.364 5.364-1.414-1.414L12 4l7.778 7.778-1.414 1.414L13 7.828z"
+                />
+              </symbol>
+              <symbol
+                id="icon-pattern"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  pattern
+                </title>
+                <path
+                  d="M14.567 21h-4.242L3 13.675V9.433L14.567 21zM21 10.393v4.243L9.364 3h4.243L21 10.393zM3 17.849L6.151 21H3v-3.151zM5.053 3L21 18.947V21h-2.19L3 5.19V3h2.053zM21 6.151L17.849 3H21v3.151z"
+                />
+              </symbol>
+              <symbol
+                id="icon-pencil"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  pencil
+                </title>
+                <path
+                  d="M15.728 9.686l-1.414-1.414L5 17.586V19h1.414l9.314-9.314zm1.414-1.414l1.414-1.414-1.414-1.414-1.414 1.414 1.414 1.414zM7.242 21H3v-4.243L16.435 3.322a1 1 0 0 1 1.414 0l2.829 2.829a1 1 0 0 1 0 1.414L7.243 21z"
+                />
+              </symbol>
+              <symbol
+                id="icon-plus"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  plus
+                </title>
+                <path
+                  d="M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z"
+                />
+              </symbol>
+              <symbol
+                id="icon-refresh"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  refresh
+                </title>
+                <path
+                  d="M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"
+                />
+              </symbol>
+              <symbol
+                id="icon-x"
+                viewBox="0 0 24 24"
+              >
+                <title>
+                  x
+                </title>
+                <path
+                  d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-11.414L9.172 7.757 7.757 9.172 10.586 12l-2.829 2.828 1.415 1.415L12 13.414l2.828 2.829 1.415-1.415L13.414 12l2.829-2.828-1.415-1.415L12 10.586z"
+                />
+              </symbol>
+            </svg>
+            <use
+              href="#icon-minus"
+            />
+          </svg>
+        </button>
+      </div>
+    </div>
+    
+    <button
+      class="btn small rnd-xs py-s px-m full-x flex mb-s"
+    >
+      <span
+        class="mt-xxs"
+      >
+        Ajouter une substance
+      </span>
+      <svg
+        aria-labelledby="plus"
+        class="flex-right"
+        fill="#666"
+        height="24px"
+        role="application"
+        style="display: block;"
+        tabindex="-1"
+        viewBox="0 0 24 24"
+        width="24px"
+        xmlns="http://www.w3.org/2000/svg"
+      >
+        <svg
+          aria-hidden="true"
+          style="position: absolute; width: 0px; height: 0px; overflow: hidden;"
+          xmlns="http://www.w3.org/2000/svg"
+          xmlns:xlink="http://www.w3.org/1999/xlink"
+        >
+          <symbol
+            id="icon-at"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              at
+            </title>
+            <path
+              d="M20 12a8 8 0 1 0-3.562 6.657l1.11 1.664A9.953 9.953 0 0 1 12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10v1.5a3.5 3.5 0 0 1-6.396 1.966A5 5 0 1 1 15 8H17v5.5a1.5 1.5 0 0 0 3 0V12zm-8-3a3 3 0 1 0 0 6 3 3 0 0 0 0-6z"
+            />
+          </symbol>
+          <symbol
+            id="icon-checkbox-blank"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              checkbox-blank
+            </title>
+            <path
+              d="M4 3h16a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1zm1 2v14h14V5H5z"
+            />
+          </symbol>
+          <symbol
+            id="icon-checkbox"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              checkbox
+            </title>
+            <path
+              d="M4 3h16a1 1 0 0 1 1 1v16a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V4a1 1 0 0 1 1-1zm1 2v14h14V5H5zm6.003 11L6.76 11.757l1.414-1.414 2.829 2.829 5.656-5.657 1.415 1.414L11.003 16z"
+            />
+          </symbol>
+          <symbol
+            id="icon-chevron-bas"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              chevron-bas
+            </title>
+            <path
+              d="M12 13.172l4.95-4.95 1.414 1.414L12 16 5.636 9.636 7.05 8.222z"
+            />
+          </symbol>
+          <symbol
+            id="icon-chevron-haut"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              chevron-haut
+            </title>
+            <path
+              d="M12 10.828l-4.95 4.95-1.414-1.414L12 8l6.364 6.364-1.414 1.414z"
+            />
+          </symbol>
+          <symbol
+            id="icon-close"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              close
+            </title>
+            <path
+              d="M12 10.586l4.95-4.95 1.414 1.414-4.95 4.95 4.95 4.95-1.414 1.414-4.95-4.95-4.95 4.95-1.414-1.414 4.95-4.95-4.95-4.95L7.05 5.636z"
+            />
+          </symbol>
+          <symbol
+            id="icon-delete"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              delete
+            </title>
+            <path
+              d="M17 6h5v2h-2v13a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1V8H2V6h5V3a1 1 0 0 1 1-1h8a1 1 0 0 1 1 1v3zm1 2H6v12h12V8zm-9 3h2v6H9v-6zm4 0h2v6h-2v-6zM9 4v2h6V4H9z"
+            />
+          </symbol>
+          <symbol
+            id="icon-download"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              download
+            </title>
+            <path
+              d="M3 19h18v2H3v-2zm10-5.828L19.071 7.1l1.414 1.414L12 17 3.515 8.515 4.929 7.1 11 13.17V2h2v11.172z"
+            />
+          </symbol>
+          <symbol
+            id="icon-error-warning"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              error-warning
+            </title>
+            <path
+              d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-1-7v2h2v-2h-2zm0-8v6h2V7h-2z"
+              fill="rgba(231,76,60,1)"
+            />
+          </symbol>
+          <symbol
+            id="icon-external-link"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              external-link
+            </title>
+            <path
+              d="M10 6v2H5v11h11v-5h2v6a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h6zm11-3v8h-2V6.413l-7.793 7.794-1.414-1.414L17.585 5H13V3h8z"
+            />
+          </symbol>
+          <symbol
+            id="icon-file"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              file
+            </title>
+            <path
+              d="M9 2.003V2h10.998C20.55 2 21 2.455 21 2.992v18.016a.993.993 0 0 1-.993.992H3.993A1 1 0 0 1 3 20.993V8l6-5.997zM5.83 8H9V4.83L5.83 8zM11 4v5a1 1 0 0 1-1 1H5v10h14V4h-8z"
+            />
+          </symbol>
+          <symbol
+            id="icon-file-add"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              file-add
+            </title>
+            <path
+              d="M15 4H5v16h14V8h-4V4zM3 2.992C3 2.444 3.447 2 3.999 2H16l5 5v13.993A1 1 0 0 1 20.007 22H3.993A1 1 0 0 1 3 21.008V2.992zM11 11V8h2v3h3v2h-3v3h-2v-3H8v-2h3z"
+            />
+          </symbol>
+          <symbol
+            id="icon-globe"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              globe
+            </title>
+            <path
+              d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm-2.29-2.333A17.9 17.9 0 0 1 8.027 13H4.062a8.008 8.008 0 0 0 5.648 6.667zM10.03 13c.151 2.439.848 4.73 1.97 6.752A15.905 15.905 0 0 0 13.97 13h-3.94zm9.908 0h-3.965a17.9 17.9 0 0 1-1.683 6.667A8.008 8.008 0 0 0 19.938 13zM4.062 11h3.965A17.9 17.9 0 0 1 9.71 4.333 8.008 8.008 0 0 0 4.062 11zm5.969 0h3.938A15.905 15.905 0 0 0 12 4.248 15.905 15.905 0 0 0 10.03 11zm4.259-6.667A17.9 17.9 0 0 1 15.973 11h3.965a8.008 8.008 0 0 0-5.648-6.667z"
+            />
+          </symbol>
+          <symbol
+            id="icon-help"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              help
+            </title>
+            <path
+              d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-2a8 8 0 1 0 0-16 8 8 0 0 0 0 16zM11 7h2v2h-2V7zm0 4h2v6h-2v-6z"
+            />
+          </symbol>
+          <symbol
+            id="icon-key"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              key
+            </title>
+            <path
+              d="M10.758 11.828l7.849-7.849 1.414 1.414-1.414 1.415 2.474 2.474-1.414 1.415-2.475-2.475-1.414 1.414 2.121 2.121-1.414 1.415-2.121-2.122-2.192 2.192a5.002 5.002 0 0 1-7.708 6.294 5 5 0 0 1 6.294-7.708zm-.637 6.293A3 3 0 1 0 5.88 13.88a3 3 0 0 0 4.242 4.242z"
+            />
+          </symbol>
+          <symbol
+            id="icon-link"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              link
+            </title>
+            <path
+              d="M18.364 15.536L16.95 14.12l1.414-1.414a5 5 0 1 0-7.071-7.071L9.879 7.05 8.464 5.636 9.88 4.222a7 7 0 0 1 9.9 9.9l-1.415 1.414zm-2.828 2.828l-1.415 1.414a7 7 0 0 1-9.9-9.9l1.415-1.414L7.05 9.88l-1.414 1.414a5 5 0 1 0 7.071 7.071l1.414-1.414 1.415 1.414zm-.708-10.607l1.415 1.415-7.071 7.07-1.415-1.414 7.071-7.07z"
+            />
+          </symbol>
+          <symbol
+            id="icon-list"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              list
+            </title>
+            <path
+              d="M8 4h13v2H8V4zM4.5 6.5a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm0 7a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm0 6.9a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zM8 11h13v2H8v-2zm0 7h13v2H8v-2z"
+            />
+          </symbol>
+          <symbol
+            id="icon-marker-cluster"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              marker-cluster
+            </title>
+            <path
+              d="M12 20.9l4.95-4.95a7 7 0 1 0-9.9 0L12 20.9zm0 2.828l-6.364-6.364a9 9 0 1 1 12.728 0L12 23.728zM12 13a2 2 0 1 0 0-4 2 2 0 0 0 0 4zm0 2a4 4 0 1 1 0-8 4 4 0 0 1 0 8z"
+            />
+          </symbol>
+          <symbol
+            id="icon-marker-none"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              marker-none
+            </title>
+            <g
+              id="24-markers-grouped"
+              transform="translate(0.908117, 0.000078)"
+            >
+              <path
+                d="M9.09188309,18.8999221 L14.0418831,13.9499221 C16.7753479,11.2161783 16.7751972,6.78415329 14.0415464,4.05059549 C11.3078956,1.31703769 6.87587059,1.31703769 4.1422198,4.05059549 C1.40856902,6.78415329 1.40841827,11.2161783 4.14188309,13.9499221 L9.09188309,18.8999221 Z M9.09188309,21.7279221 L2.72788309,15.3639221 C-0.786803866,11.8491921 -0.786780603,6.15072729 2.72793505,2.63602598 C6.24265071,-0.878675327 11.9411155,-0.878675327 15.4558311,2.63602598 C18.9705468,6.15072729 18.97057,11.8491921 15.4558831,15.3639221 L9.09188309,21.7279221 L9.09188309,21.7279221 Z M9.09188309,10.9999221 C10.1964526,10.9999221 11.0918831,10.1044916 11.0918831,8.99992206 C11.0918831,7.89535256 10.1964526,6.99992206 9.09188309,6.99992206 C7.98731359,6.99992206 7.09188309,7.89535256 7.09188309,8.99992206 C7.09188309,10.1044916 7.98731359,10.9999221 9.09188309,10.9999221 Z M9.09188309,12.9999221 C6.88274409,12.9999221 5.09188309,11.2090611 5.09188309,8.99992206 C5.09188309,6.79078306 6.88274409,4.99992206 9.09188309,4.99992206 C11.3010221,4.99992206 13.0918831,6.79078306 13.0918831,8.99992206 C13.0918831,11.2090611 11.3010221,12.9999221 9.09188309,12.9999221 Z"
+              />
+              <rect
+                height="24"
+                transform="translate(9.192388, 9.514641) rotate(-45.000000) translate(-9.192388, -9.514641) "
+                width="2"
+                x="8.19238816"
+                y="-2.48535931"
+              />
+            </g>
+          </symbol>
+          <symbol
+            id="icon-marker-ungrouped"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              marker-ungrouped
+            </title>
+            <path
+              d="M9.975 8.975a3.5 3.5 0 1 0-4.95 0L7.5 11.45l2.475-2.475zM7.5 14.278L3.61 10.39a5.5 5.5 0 1 1 7.78 0L7.5 14.28zM7.5 8a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm9 12.45l2.475-2.475a3.5 3.5 0 1 0-4.95 0L16.5 20.45zm3.89-1.06l-3.89 3.888-3.89-3.889a5.5 5.5 0 1 1 7.78 0zM16.5 17a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z"
+            />
+          </symbol>
+          <symbol
+            id="icon-menu"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              menu
+            </title>
+            <path
+              d="M3 4h18v2H3V4zm0 7h18v2H3v-2zm0 7h18v2H3v-2z"
+            />
+          </symbol>
+          <symbol
+            id="icon-minus"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              minus
+            </title>
+            <path
+              d="M5 11h14v2H5z"
+            />
+          </symbol>
+          <symbol
+            id="icon-move-down"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              move-down
+            </title>
+            <path
+              d="M13 16.172l5.364-5.364 1.414 1.414L12 20l-7.778-7.778 1.414-1.414L11 16.172V4h2v12.172z"
+            />
+          </symbol>
+          <symbol
+            id="icon-move-up"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              move-up
+            </title>
+            <path
+              d="M13 7.828V20h-2V7.828l-5.364 5.364-1.414-1.414L12 4l7.778 7.778-1.414 1.414L13 7.828z"
+            />
+          </symbol>
+          <symbol
+            id="icon-pattern"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              pattern
+            </title>
+            <path
+              d="M14.567 21h-4.242L3 13.675V9.433L14.567 21zM21 10.393v4.243L9.364 3h4.243L21 10.393zM3 17.849L6.151 21H3v-3.151zM5.053 3L21 18.947V21h-2.19L3 5.19V3h2.053zM21 6.151L17.849 3H21v3.151z"
+            />
+          </symbol>
+          <symbol
+            id="icon-pencil"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              pencil
+            </title>
+            <path
+              d="M15.728 9.686l-1.414-1.414L5 17.586V19h1.414l9.314-9.314zm1.414-1.414l1.414-1.414-1.414-1.414-1.414 1.414 1.414 1.414zM7.242 21H3v-4.243L16.435 3.322a1 1 0 0 1 1.414 0l2.829 2.829a1 1 0 0 1 0 1.414L7.243 21z"
+            />
+          </symbol>
+          <symbol
+            id="icon-plus"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              plus
+            </title>
+            <path
+              d="M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z"
+            />
+          </symbol>
+          <symbol
+            id="icon-refresh"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              refresh
+            </title>
+            <path
+              d="M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"
+            />
+          </symbol>
+          <symbol
+            id="icon-x"
+            viewBox="0 0 24 24"
+          >
+            <title>
+              x
+            </title>
+            <path
+              d="M12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10-4.477 10-10 10zm0-11.414L9.172 7.757 7.757 9.172 10.586 12l-2.829 2.828 1.415 1.415L12 13.414l2.828 2.829 1.415-1.415L13.414 12l2.829-2.828-1.415-1.415L12 10.586z"
+            />
+          </symbol>
+        </svg>
+        <use
+          href="#icon-plus"
+        />
+      </svg>
+    </button>
+    <div
+      class="h6"
+    >
+      <label>
+        <input
+          class="mr-xs"
+          type="checkbox"
+        />
+         Incertain 
+      </label>
+    </div>
+    
+    
+    
+    <button
+      class="btn full-x rnd-xs py-s px-m small mb-s"
+    >
+      Hériter de l'étape précédente
+    </button>
+  </div>
+</div>
+`;
diff --git a/packages/ui/src/components/etape/edit.vue b/packages/ui/src/components/etape/edit.vue
index fda3fea7f..21a4cdc8c 100644
--- a/packages/ui/src/components/etape/edit.vue
+++ b/packages/ui/src/components/etape/edit.vue
@@ -138,6 +138,7 @@ import SectionsEdit from './sections-edit.vue'
 import DocumentsEdit from '../document/multi-edit.vue'
 import JustificatifsEdit from './justificatifs-edit.vue'
 import DecisionsAnnexesEdit from './decisions-annexes-edit.vue'
+import { SubstancesLegales } from 'camino-common/src/static/substancesLegales'
 
 export default {
   components: {
@@ -338,8 +339,8 @@ export default {
     },
 
     substances() {
-      return this.$store.state.titreEtapeEdition.metas.substances.filter(su =>
-        su.legales.find(sl => sl.domaine.id === this.domaineId)
+      return SubstancesLegales.filter(sl =>
+        sl.domaineIds.includes(this.domaineId)
       )
     }
   },
diff --git a/packages/ui/src/components/etape/fondamentales-edit.vue b/packages/ui/src/components/etape/fondamentales-edit.vue
index 1f23f1f63..29e2ad01c 100644
--- a/packages/ui/src/components/etape/fondamentales-edit.vue
+++ b/packages/ui/src/components/etape/fondamentales-edit.vue
@@ -218,84 +218,12 @@
       <hr />
     </div>
 
-    <h3 class="mb-s">Substances</h3>
-    <HeritageEdit
-      v-model:prop="etape.heritageProps.substances"
-      propId="substances"
-      :isArray="true"
-    >
-      <template #write>
-        <div v-for="(substance, n) in etape.substances" :key="n">
-          <div class="flex mb-s">
-            <select v-model="etape.substances[n]" class="p-s mr-s">
-              <option
-                v-for="s in substances"
-                :key="s.id"
-                :value="{ id: s.id }"
-                :disabled="etape.substances.find(({ id }) => id === s.id)"
-              >
-                {{ s.nom }}
-              </option>
-            </select>
-            <button
-              v-if="substancesLength && n + 1 < substancesLength"
-              class="btn-border py-s px-m rnd-l-xs"
-              @click="substanceMoveDown(n)"
-            >
-              <Icon size="M" name="move-down" />
-            </button>
-            <button
-              v-if="substancesLength && n > 0 && etape.substances[n].id"
-              :class="{
-                'rnd-l-xs': !(substancesLength && n + 1 < substancesLength)
-              }"
-              class="btn-border py-s px-m"
-              @click="substanceMoveUp(n)"
-            >
-              <Icon size="M" name="move-up" />
-            </button>
-            <button
-              :class="{
-                'rnd-l-xs': !etape.substances[n].id || substancesLength === 1
-              }"
-              class="btn py-s px-m rnd-r-xs"
-              @click="substanceRemove(n)"
-            >
-              <Icon name="minus" size="M" />
-            </button>
-          </div>
-        </div>
-
-        <button
-          v-if="!etape.substances.some(({ id }) => id === '')"
-          class="btn small rnd-xs py-s px-m full-x flex mb-s"
-          @click="substanceAdd"
-        >
-          <span class="mt-xxs">Ajouter une substance</span>
-          <Icon name="plus" size="M" class="flex-right" />
-        </button>
-
-        <div v-if="substancesLength" class="h6">
-          <label>
-            <input
-              v-model="etape.incertitudes.substances"
-              type="checkbox"
-              class="mr-xs"
-            />
-            Incertain
-          </label>
-        </div>
-      </template>
-
-      <template #read>
-        <TagList
-          class="mb-s"
-          :elements="
-            etape.heritageProps.substances.etape.substances.map(s => s.nom)
-          "
-        />
-      </template>
-    </HeritageEdit>
+    <SubstancesEdit
+      :substances="etape.substances"
+      :heritageProps="etape.heritageProps"
+      :incertitudes="etape.incertitudes"
+      :domaineId="domaineId"
+    />
 
     <hr />
   </div>
@@ -304,7 +232,6 @@
 <script>
 import { dateFormat } from '../../utils/index'
 import Tag from '../_ui/tag.vue'
-import TagList from '../_ui/tag-list.vue'
 import InputDate from '../_ui/input-date.vue'
 import InputNumber from '../_ui/input-number.vue'
 import HeritageEdit from './heritage-edit.vue'
@@ -312,16 +239,15 @@ import PropDuree from './prop-duree.vue'
 import AutocompleteEntreprise from './autocomplete-entreprise.vue'
 
 import { etablissementNameFind } from '@/utils/entreprise'
-import Icon from '@/components/_ui/icon.vue'
+import SubstancesEdit from '@/components/etape/substances-edit.vue'
 
 export default {
   components: {
-    Icon,
+    SubstancesEdit,
     InputDate,
     InputNumber,
     HeritageEdit,
     Tag,
-    TagList,
     PropDuree,
     AutocompleteEntreprise
   },
@@ -378,10 +304,6 @@ export default {
       return this.etape.amodiataires?.filter(({ id }) => id).length || 0
     },
 
-    substancesLength() {
-      return this.etape.substances.filter(({ id }) => id).length
-    },
-
     dureeOptionalCheck() {
       return (!this.isArm && !this.isAxm) || this.etape.type.id !== 'mfr'
     },
@@ -405,7 +327,8 @@ export default {
     complete() {
       return (
         this.etape.type.id !== 'mfr' ||
-        (this.substancesLength > 0 &&
+        (this.etape.substances.filter(substanceId => !!substanceId).length >
+          0 &&
           (this.dureeOptionalCheck ||
             !!this.etape.duree.ans ||
             !!this.etape.duree.mois))
@@ -472,25 +395,6 @@ export default {
         ...newAmodiataires
       )
     },
-    substanceAdd() {
-      this.etape.substances.push({ id: '' })
-    },
-
-    substanceRemove(index) {
-      this.etape.substances.splice(index, 1)
-    },
-
-    substanceMoveDown(n) {
-      const substance = this.etape.substances[n]
-      this.etape.substances.splice(n, 1)
-      this.etape.substances.splice(n + 1, 0, substance)
-    },
-
-    substanceMoveUp(n) {
-      const substance = this.etape.substances[n]
-      this.etape.substances.splice(n, 1)
-      this.etape.substances.splice(n - 1, 0, substance)
-    },
 
     etablissementNameFind() {
       return etablissementNameFind()
diff --git a/packages/ui/src/components/etape/fondamentales.vue b/packages/ui/src/components/etape/fondamentales.vue
index 8d049ae4d..4d2fc996d 100644
--- a/packages/ui/src/components/etape/fondamentales.vue
+++ b/packages/ui/src/components/etape/fondamentales.vue
@@ -134,34 +134,26 @@
         </h5>
       </div>
       <div class="tablet-blob-3-4">
-        <TagList :elements="etape.substances.map(s => s.nom)" />
+        <TagList
+          :elements="
+            etape.substances.map(
+              substanceId => SubstancesLegale[substanceId].nom
+            )
+          "
+        />
       </div>
     </div>
   </div>
 </template>
 
-<script>
+<script setup lang="ts">
 import { dateFormat } from '@/utils'
 import { etablissementNameFind } from '../../utils/entreprise'
 import TagList from '../_ui/tag-list.vue'
 import Tag from '../_ui/tag.vue'
 import PropDuree from './prop-duree.vue'
+import { SubstancesLegale } from 'camino-common/src/static/substancesLegales'
+import { Etape } from 'camino-common/src/etape'
 
-export default {
-  components: { TagList, Tag, PropDuree },
-
-  props: {
-    etape: { type: Object, required: true }
-  },
-
-  methods: {
-    etablissementNameFind(etablissements, date) {
-      return etablissementNameFind(etablissements, date)
-    },
-
-    dateFormat(date) {
-      return dateFormat(date)
-    }
-  }
-}
+defineProps<{ etape: Etape }>()
 </script>
diff --git a/packages/ui/src/components/etape/heritage-edit.vue b/packages/ui/src/components/etape/heritage-edit.vue
index b074c8d03..c30ffbf5a 100644
--- a/packages/ui/src/components/etape/heritage-edit.vue
+++ b/packages/ui/src/components/etape/heritage-edit.vue
@@ -30,43 +30,39 @@
   </div>
 </template>
 
-<script>
+<script setup lang="ts">
 import { hasValeurCheck } from '@/utils/contenu'
 import Tag from '@/components/_ui/tag.vue'
 import { dateFormat } from '@/utils'
+import { computed, withDefaults } from 'vue'
+import { HeritageProp } from 'camino-common/src/etape'
 
-export default {
-  components: { Tag },
-  props: {
-    prop: { type: Object, required: true },
-    propId: { type: String, required: true },
-    isArray: { type: Boolean, default: false },
-    sectionId: { type: String, default: null }
-  },
-  computed: {
-    buttonText() {
-      return this.prop.actif ? 'Modifier' : `Hériter de l'étape précédente`
-    },
+const props = withDefaults(
+  defineProps<{
+    prop: HeritageProp
+    propId: string
+    isArray?: boolean
+    sectionId?: string
+  }>(),
+  { isArray: false, sectionId: undefined }
+)
 
-    hasHeritage() {
-      let contenu
+const buttonText = computed<string>(() =>
+  props.prop.actif ? 'Modifier' : `Hériter de l'étape précédente`
+)
 
-      if (this.sectionId) {
-        contenu =
-          this.prop.etape &&
-          this.prop.etape.contenu &&
-          this.prop.etape.contenu[this.sectionId]
-      } else {
-        contenu = this.prop.etape
-      }
+const hasHeritage = computed<boolean>(() => {
+  let contenu
 
-      return hasValeurCheck(this.propId, contenu)
-    }
-  },
-  methods: {
-    dateFormat(date) {
-      return dateFormat(date)
-    }
+  if (props.sectionId) {
+    contenu =
+      props.prop.etape &&
+      props.prop.etape.contenu &&
+      props.prop.etape.contenu[props.sectionId]
+  } else {
+    contenu = props.prop.etape
   }
-}
+
+  return hasValeurCheck(props.propId, contenu)
+})
 </script>
diff --git a/packages/ui/src/components/etape/substances-edit.stories.ts b/packages/ui/src/components/etape/substances-edit.stories.ts
new file mode 100644
index 000000000..478663d5a
--- /dev/null
+++ b/packages/ui/src/components/etape/substances-edit.stories.ts
@@ -0,0 +1,70 @@
+import SubstancesEdit from './substances-edit.vue'
+import { Meta, Story } from '@storybook/vue3'
+import {
+  SubstanceLegaleId,
+  SubstancesLegale
+} from 'camino-common/src/static/substancesLegales'
+import { DomaineId } from 'camino-common/src/static/domaines'
+import { HeritageProp } from 'camino-common/src/etape'
+
+const meta: Meta = {
+  title: 'Components/Etape/SubstancesEdit',
+  component: SubstancesEdit,
+  argTypes: {}
+}
+export default meta
+
+type Props = {
+  substances: (SubstanceLegaleId | undefined)[]
+  heritageProps: { substances: HeritageProp }
+  incertitudes: { substances: boolean }
+  domaineId: DomaineId
+}
+
+const Template: Story<Props> = (args: Props) => ({
+  components: { SubstancesEdit },
+  setup() {
+    return { args }
+  },
+  data: () => ({
+    substances: ['auru']
+  }),
+  template: `<SubstancesEdit  v-bind="args" :substances='substances'/>`
+})
+const etapeHeritage = {
+  etape: {
+    duree: 4,
+    dateFin: '2020-01-01',
+    dateDebut: '2020-01-01',
+    date: '2020-01-01',
+    titulaires: [],
+    amodiataires: [],
+    type: { nom: 'Demande' },
+    substances: [SubstancesLegale.auru.id],
+    incertitudes: { substances: true },
+    contenu: {}
+  }
+}
+export const SansHeritage = Template.bind({})
+SansHeritage.args = {
+  domaineId: 'm',
+  heritageProps: {
+    substances: {
+      actif: false,
+      ...etapeHeritage
+    }
+  },
+  incertitudes: { substances: true }
+}
+
+export const AvecHeritage = Template.bind({})
+AvecHeritage.args = {
+  domaineId: 'm',
+  heritageProps: {
+    substances: {
+      actif: true,
+      ...etapeHeritage
+    }
+  },
+  incertitudes: { substances: true }
+}
diff --git a/packages/ui/src/components/etape/substances-edit.vue b/packages/ui/src/components/etape/substances-edit.vue
new file mode 100644
index 000000000..b1982e596
--- /dev/null
+++ b/packages/ui/src/components/etape/substances-edit.vue
@@ -0,0 +1,131 @@
+<template>
+  <div>
+    <h3 class="mb-s">Substances</h3>
+    <HeritageEdit
+      v-model:prop="heritageProps.substances"
+      propId="substances"
+      :isArray="true"
+    >
+      <template #write>
+        <div v-for="(_substance, n) in substances" :key="n">
+          <div class="flex mb-s">
+            <select v-model="substances[n]" class="p-s mr-s">
+              <option
+                v-for="s in substancesByDomaine"
+                :key="s.id"
+                :value="s.id"
+                :disabled="substances.some(substanceId => substanceId === s.id)"
+              >
+                {{ s.nom }}
+              </option>
+            </select>
+            <button
+              v-if="substancesLength && n + 1 < substancesLength"
+              class="btn-border py-s px-m rnd-l-xs"
+              @click="substanceMoveDown(n)"
+            >
+              <Icon size="M" name="move-down" />
+            </button>
+            <button
+              v-if="substancesLength && n > 0 && substances[n]"
+              :class="{
+                'rnd-l-xs': !(substancesLength && n + 1 < substancesLength)
+              }"
+              class="btn-border py-s px-m"
+              @click="substanceMoveUp(n)"
+            >
+              <Icon size="M" name="move-up" />
+            </button>
+            <button
+              :class="{
+                'rnd-l-xs': !substances[n] || substancesLength === 1
+              }"
+              class="btn py-s px-m rnd-r-xs"
+              @click="substanceRemove(n)"
+            >
+              <Icon name="minus" size="M" />
+            </button>
+          </div>
+        </div>
+
+        <button
+          v-if="substances.every(substanceId => !!substanceId)"
+          class="btn small rnd-xs py-s px-m full-x flex mb-s"
+          @click="substanceAdd"
+        >
+          <span class="mt-xxs">Ajouter une substance</span>
+          <Icon name="plus" size="M" class="flex-right" />
+        </button>
+
+        <div v-if="substancesLength" class="h6">
+          <label>
+            <input
+              v-model="incertitudes.substances"
+              type="checkbox"
+              class="mr-xs"
+            />
+            Incertain
+          </label>
+        </div>
+      </template>
+
+      <template #read>
+        <TagList class="mb-s" :elements="substanceNoms" />
+      </template>
+    </HeritageEdit>
+  </div>
+</template>
+<script setup lang="ts">
+import {
+  SubstancesLegales,
+  SubstancesLegale,
+  SubstanceLegaleId
+} from 'camino-common/src/static/substancesLegales'
+import { computed } from 'vue'
+import HeritageEdit from '@/components/etape/heritage-edit.vue'
+import TagList from '@/components/_ui/tag-list.vue'
+import Icon from '@/components/_ui/icon.vue'
+import { DomaineId } from 'camino-common/src/static/domaines'
+import { HeritageProp } from 'camino-common/src/etape'
+
+const props = defineProps<{
+  substances: (SubstanceLegaleId | undefined)[]
+  heritageProps: { substances: HeritageProp }
+  incertitudes: { substances: boolean }
+  domaineId: DomaineId
+}>()
+
+const substancesLength = computed(
+  () => props.substances.filter(substanceId => substanceId).length
+)
+
+const substancesByDomaine = computed(() =>
+  SubstancesLegales.filter(({ domaineIds }) =>
+    domaineIds.includes(props.domaineId)
+  )
+)
+
+const substanceNoms = computed<string[]>(() => {
+  return props.heritageProps.substances.etape.substances
+    .filter((substanceId): substanceId is SubstanceLegaleId => !!substanceId)
+    .map(substanceId => SubstancesLegale[substanceId].nom)
+})
+
+const substanceAdd = () => {
+  props.substances.push(undefined)
+}
+
+const substanceRemove = (index: number): SubstanceLegaleId | undefined => {
+  return props.substances.splice(index, 1)[0]
+}
+
+const substanceMoveDown = (index: number) => {
+  const substance = substanceRemove(index)
+  props.substances.splice(index + 1, 0, substance)
+}
+
+const substanceMoveUp = (index: number) => {
+  const substance = substanceRemove(index)
+  props.substances.splice(index - 1, 0, substance)
+}
+</script>
diff --git a/packages/ui/src/components/titre/infos.vue b/packages/ui/src/components/titre/infos.vue
index 3e0876689..a33feb6a3 100644
--- a/packages/ui/src/components/titre/infos.vue
+++ b/packages/ui/src/components/titre/infos.vue
@@ -81,7 +81,13 @@
 
       <div v-if="titre.substances && titre.substances.length > 0" class="mb">
         <h5>Substances</h5>
-        <TagList :elements="titre.substances.map(s => s.nom)" />
+        <TagList
+          :elements="
+            titre.substances.map(
+              substanceId => SubstancesLegale[substanceId].nom
+            )
+          "
+        />
       </div>
 
       <div v-if="titre.titulaires.length" class="mb">
@@ -172,6 +178,10 @@ import {
 } from 'camino-common/src/static/demarchesTypes'
 import { AdministrationId } from 'camino-common/src/static/administrations'
 import { TitresTypesTypes } from 'camino-common/src/static/titresTypesTypes'
+import {
+  SubstanceLegaleId,
+  SubstancesLegale
+} from 'camino-common/src/static/substancesLegales'
 
 type Entreprise = {
   id: string
@@ -198,7 +208,7 @@ const props = defineProps<{
     }
     titulaires: Entreprise[]
     amodiataires: Entreprise[]
-    substances: { nom: string }[]
+    substances: SubstanceLegaleId[]
     references: { nom: string; type: { nom: string } }[]
   }
   user: User
diff --git a/packages/ui/src/components/titres/filtres.js b/packages/ui/src/components/titres/filtres.js
index 6a77c8417..000bd701c 100644
--- a/packages/ui/src/components/titres/filtres.js
+++ b/packages/ui/src/components/titres/filtres.js
@@ -6,6 +6,8 @@ import FiltresTypes from '../_common/filtres/types.vue'
 
 import { elementsFormat } from '../../utils/index'
 import { titresFiltres, titresRechercherByNom } from '@/api/titres'
+import { SubstancesLegales } from 'camino-common/src/static/substancesLegales'
+import { sortedDomaines } from 'camino-common/src/static/domaines'
 
 const filtres = [
   {
@@ -26,11 +28,11 @@ const filtres = [
     elementsFormat
   },
   {
-    id: 'substancesLegalesIds',
+    id: 'substancesIds',
     type: 'autocomplete',
     value: [],
-    name: 'Substances',
-    elementsFormat
+    elements: SubstancesLegales,
+    name: 'Substances'
   },
   {
     id: 'references',
@@ -51,9 +53,8 @@ const filtres = [
     name: 'Domaines',
     type: 'checkboxes',
     value: [],
-    elements: [],
-    component: markRaw(FiltresDomaines),
-    elementsFormat
+    elements: sortedDomaines,
+    component: markRaw(FiltresDomaines)
   },
   {
     id: 'typesIds',
diff --git a/packages/ui/src/components/titres/map.vue b/packages/ui/src/components/titres/map.vue
index 6f018fc7d..dbaed0538 100644
--- a/packages/ui/src/components/titres/map.vue
+++ b/packages/ui/src/components/titres/map.vue
@@ -96,6 +96,7 @@ import {
 } from '../_map/leaflet.js'
 import { clustersBuild, layersBuild, zones } from './map.js'
 import Icon from '@/components/_ui/icon.vue'
+import { sortedDomaines } from 'camino-common/src/static/domaines'
 
 export default {
   components: {
@@ -160,7 +161,7 @@ export default {
     },
 
     domaines() {
-      return this.$store.state.titres.metas.domaines
+      return sortedDomaines
     },
 
     domainesIds() {
diff --git a/packages/ui/src/components/titres/table-utils.ts b/packages/ui/src/components/titres/table-utils.ts
index c9b7c62f5..95e8b18d2 100644
--- a/packages/ui/src/components/titres/table-utils.ts
+++ b/packages/ui/src/components/titres/table-utils.ts
@@ -24,16 +24,16 @@ import {
 } from 'camino-common/src/static/departement'
 import { onlyUnique } from 'camino-common/src/typescript-tools'
 import { Regions } from 'camino-common/src/static/region'
+import {
+  SubstanceLegaleId,
+  SubstancesLegale
+} from 'camino-common/src/static/substancesLegales'
 
 interface Reference {
   type: { nom: string }
   nom: string
 }
-interface Substance {
-  // ceci devrait être une union
-  id: string
-  nom: string
-}
+
 interface Titulaire {
   id: string
   nom: string
@@ -55,7 +55,7 @@ export interface TitreEntreprise {
   }
   // id devrait être une union, couleur aussi
   statut: { id: string; nom: string; couleur: string }
-  substances: Substance[]
+  substances: SubstanceLegaleId[]
   titulaires: Titulaire[]
   activitesAbsentes: number | null
   activitesEnConstruction: number | null
@@ -137,7 +137,7 @@ export const titulairesColumn: Column<'titulaires'> = {
   name: 'Titulaires',
   class: ['min-width-10']
 }
-const titresColonnes: Column[] = [
+export const titresColonnes: Column[] = [
   nomColumn,
   domaineColumn,
   typeColumn,
@@ -146,7 +146,8 @@ const titresColonnes: Column[] = [
   {
     id: 'substances',
     name: 'Substances',
-    class: ['min-width-6']
+    class: ['min-width-6'],
+    noSort: true
   },
   {
     id: 'coordonnees',
@@ -232,7 +233,7 @@ export const activitesCell = (titre: {
   },
   value: (titre?.activitesAbsentes ?? 0) + (titre?.activitesEnConstruction ?? 0)
 })
-const titresLignesBuild = (
+export const titresLignesBuild = (
   titres: TitreEntreprise[],
   activitesCol: boolean,
   ordre = 'asc'
@@ -259,9 +260,15 @@ const titresLignesBuild = (
       statut: statutCell(titre),
       substances: {
         component: markRaw(TagList),
-        props: { elements: titre.substances?.map(s => s.nom) },
+        props: {
+          elements: titre.substances?.map(
+            substanceId => SubstancesLegale[substanceId].nom
+          )
+        },
         class: 'mb--xs',
-        value: titre.substances?.map(s => s.nom).join(', ')
+        value: titre.substances
+          ?.map(substanceId => SubstancesLegale[substanceId].nom)
+          .join(', ')
       },
       titulaires: titulairesCell(titre),
       regions: {
@@ -295,5 +302,3 @@ const titresLignesBuild = (
       columns
     }
   })
-
-export { titresColonnes, titresLignesBuild }
diff --git a/packages/ui/src/store/definitions.js b/packages/ui/src/store/definitions.js
index 208bc76ee..f4c02c02c 100644
--- a/packages/ui/src/store/definitions.js
+++ b/packages/ui/src/store/definitions.js
@@ -2,12 +2,12 @@ import {
   demarchesStatuts,
   demarchesTypes,
   etapesTypes,
-  substancesLegales,
   titresStatuts
 } from '../api/metas'
 import { EtapesStatuts } from 'camino-common/src/static/etapesStatuts'
 import { Domaines } from 'camino-common/src/static/domaines'
 import { TitresTypesTypes } from 'camino-common/src/static/titresTypesTypes'
+import { SubstancesLegales } from 'camino-common/src/static/substancesLegales'
 
 const definitionsIndex = {
   domaines: () => Object.values(Domaines),
@@ -17,7 +17,7 @@ const definitionsIndex = {
   'demarches-types': demarchesTypes,
   'etapes-types': etapesTypes,
   'etapes-statuts': () => Object.values(EtapesStatuts),
-  'substances-legales': substancesLegales,
+  'substances-legales': () => SubstancesLegales,
   'titres-statuts': titresStatuts,
   'titres-types': () => Object.values(TitresTypesTypes)
 }
diff --git a/packages/ui/src/store/metas-definitions.js b/packages/ui/src/store/metas-definitions.js
index 2213170c6..71bae2d9c 100644
--- a/packages/ui/src/store/metas-definitions.js
+++ b/packages/ui/src/store/metas-definitions.js
@@ -54,9 +54,6 @@ import {
   activitesStatuts,
   activiteStatutModifier,
   activitesTypesTitresTypes,
-  activiteTypeTitreTypeModifier,
-  activiteTypeTitreTypeCreer,
-  activiteTypeTitreTypeSupprimer,
   activitesTypesDocumentsTypes,
   activiteTypeDocumentTypeModifier,
   activiteTypeDocumentTypeCreer,
@@ -524,29 +521,6 @@ const metasIndex = {
     ]
   },
 
-  'activites-types--titres-types': {
-    get: activitesTypesTitresTypes,
-    update: activiteTypeTitreTypeModifier,
-    create: activiteTypeTitreTypeCreer,
-    delete: activiteTypeTitreTypeSupprimer,
-    nom: 'Types des activités | Types des titres',
-    colonnes: [
-      {
-        id: 'activiteTypeId',
-        nom: "Type d'activité",
-        type: 'entities',
-        entities: 'activites-types'
-      },
-      {
-        id: 'titreTypeId',
-        nom: 'Type de titre',
-        type: 'entities',
-        entities: 'titres-types'
-      }
-    ],
-    ids: ['activiteTypeId', 'titreTypeId']
-  },
-
   'activites-types--documents-types': {
     get: activitesTypesDocumentsTypes,
     update: activiteTypeDocumentTypeModifier,
diff --git a/packages/ui/src/store/titre-etape-edition.js b/packages/ui/src/store/titre-etape-edition.js
index f80b83a0f..39294289d 100644
--- a/packages/ui/src/store/titre-etape-edition.js
+++ b/packages/ui/src/store/titre-etape-edition.js
@@ -26,7 +26,6 @@ const state = {
   metas: {
     demarche: null,
     etapesTypes: [],
-    substances: [],
     entreprises: [],
     documentsTypes: [],
     sdomZonesDocumentTypeIds: [],
@@ -359,7 +358,6 @@ const mutations = {
     state.metas = {
       demarche: null,
       etapesTypes: [],
-      substances: [],
       entreprises: [],
       documentsTypes: [],
       sdomZonesDocumentTypeIds: [],
diff --git a/packages/ui/src/store/titres-activites.js b/packages/ui/src/store/titres-activites.js
index d6a3aaac3..9b12aa99c 100644
--- a/packages/ui/src/store/titres-activites.js
+++ b/packages/ui/src/store/titres-activites.js
@@ -18,7 +18,6 @@ const state = {
     types: [],
     annees: anneesGet(new Date().getFullYear()),
     statuts: [],
-    titresDomaines: [],
     titresTypes: [],
     titresStatuts: []
   },
@@ -28,7 +27,7 @@ const state = {
     { id: 'annees', type: 'numbers', values: [] },
     { id: 'titresNoms', type: 'string' },
     { id: 'titresEntreprises', type: 'string' },
-    { id: 'titresSubstances', type: 'string' },
+    { id: 'titresSubstancesIds', type: 'strings', values: [] },
     { id: 'titresReferences', type: 'string' },
     { id: 'titresTerritoires', type: 'string' },
     { id: 'titresTypesIds', type: 'strings', values: [] },
@@ -60,7 +59,7 @@ const state = {
       annees: [],
       titresNoms: '',
       titresEntreprises: '',
-      titresSubstances: '',
+      titresSubstancesIds: [],
       titresReferences: '',
       titresTerritoires: '',
       titresTypesIds: [],
@@ -90,9 +89,6 @@ const mutations = Object.assign({}, listeMutations, {
       } else if (id === 'activitesStatuts') {
         metaId = 'statuts'
         paramId = 'statutsIds'
-      } else if (id === 'domaines') {
-        metaId = 'titresDomaines'
-        paramId = 'titresDomainesIds'
       } else if (id === 'types') {
         metaId = 'titresTypes'
         paramId = 'titresTypesIds'
diff --git a/packages/ui/src/store/titres-activites.test.js b/packages/ui/src/store/titres-activites.test.js
index d75f84915..338197d89 100644
--- a/packages/ui/src/store/titres-activites.test.js
+++ b/packages/ui/src/store/titres-activites.test.js
@@ -20,7 +20,6 @@ describe("état d'une activité", () => {
       metas: {
         types: [],
         statuts: [],
-        titresDomaines: [],
         titresTypes: [],
         titresStatuts: []
       },
@@ -51,10 +50,7 @@ describe("état d'une activité", () => {
       { id: 'dep', nom: 'déposé', couleur: 'success' },
       { id: 'fer', nom: 'cloturé', couleur: 'neutral' }
     ]
-    const domaines = [
-      { id: 'm', nom: 'minéraux et métaux' },
-      { id: 'w', nom: 'granulats marins' }
-    ]
+
     const statuts = [
       { id: 'val', nom: 'valide', couleur: 'success' },
       { id: 'ech', nom: 'échu', couleur: 'neutral' }
@@ -67,7 +63,6 @@ describe("état d'une activité", () => {
     store.commit('titresActivites/metasSet', {
       activitesTypes,
       activitesStatuts,
-      domaines,
       statuts,
       types,
       truc: {}
@@ -76,7 +71,6 @@ describe("état d'une activité", () => {
     expect(store.state.titresActivites.metas).toEqual({
       types: activitesTypes,
       statuts: activitesStatuts,
-      titresDomaines: domaines,
       titresTypes: types,
       titresStatuts: statuts
     })
@@ -89,7 +83,7 @@ describe("état d'une activité", () => {
         values: ['abs', 'enc', 'dep', 'fer']
       },
       { id: 'titresTypesIds', type: 'strings', values: ['cx', 'pr'] },
-      { id: 'titresDomainesIds', type: 'strings', values: ['m', 'w'] },
+      { id: 'titresDomainesIds', type: 'strings', values: [] },
       { id: 'titresStatutsIds', type: 'strings', values: ['val', 'ech'] }
     ])
   })
diff --git a/packages/ui/src/store/titres-demarches.js b/packages/ui/src/store/titres-demarches.js
index f472dd435..3fe3f10f3 100644
--- a/packages/ui/src/store/titres-demarches.js
+++ b/packages/ui/src/store/titres-demarches.js
@@ -9,7 +9,6 @@ const state = {
     statuts: [],
     etapesTypes: [],
     titresTypes: [],
-    titresDomaines: [],
     titresStatuts: []
   },
   definitions: [
@@ -22,7 +21,7 @@ const state = {
     { id: 'titresStatutsIds', type: 'strings', values: [] },
     { id: 'titresNoms', type: 'string' },
     { id: 'titresEntreprises', type: 'string' },
-    { id: 'titresSubstances', type: 'string' },
+    { id: 'titresSubstancesIds', type: 'strings', values: [] },
     { id: 'titresReferences', type: 'string' },
     { id: 'titresTerritoires', type: 'string' },
     { id: 'page', type: 'number', min: 0 },
@@ -63,7 +62,7 @@ const state = {
       titresStatutsIds: [],
       titresNoms: '',
       titresEntreprises: '',
-      titresSubstances: '',
+      titresSubstancesIds: [],
       titresReferences: '',
       titresTerritoires: ''
     }
@@ -86,7 +85,6 @@ const mutations = Object.assign({}, listeMutations, {
       statuts: [],
       etapesTypes: [],
       titresTypes: [],
-      titresDomaines: [],
       titresStatuts: []
     }
     state.params = {
@@ -106,7 +104,7 @@ const mutations = Object.assign({}, listeMutations, {
         titresStatutsIds: [],
         titresNoms: '',
         titresEntreprises: '',
-        titresSubstances: '',
+        titresSubstancesIds: [],
         titresReferences: '',
         titresTerritoires: ''
       }
@@ -132,9 +130,6 @@ const mutations = Object.assign({}, listeMutations, {
       } else if (id === 'types') {
         metaId = 'titresTypes'
         paramsIds = ['titresTypesIds']
-      } else if (id === 'domaines') {
-        metaId = 'titresDomaines'
-        paramsIds = ['titresDomainesIds']
       }
 
       if (metaId) {
diff --git a/packages/ui/src/store/titres-demarches.test.js b/packages/ui/src/store/titres-demarches.test.js
index 47357ee50..b6b901d9d 100644
--- a/packages/ui/src/store/titres-demarches.test.js
+++ b/packages/ui/src/store/titres-demarches.test.js
@@ -19,7 +19,6 @@ describe('liste des demarches', () => {
         statuts: [],
         etapesTypes: [],
         titresTypes: [],
-        titresDomaines: [],
         titresStatuts: []
       },
       definitions: [
@@ -49,10 +48,7 @@ describe('liste des demarches', () => {
       { id: 'dep', nom: 'déposé', couleur: 'success' },
       { id: 'fer', nom: 'cloturé', couleur: 'neutral' }
     ]
-    const domaines = [
-      { id: 'm', nom: 'minéraux et métaux' },
-      { id: 'w', nom: 'granulats marins' }
-    ]
+
     const statuts = [
       { id: 'val', nom: 'valide', couleur: 'success' },
       { id: 'ech', nom: 'échu', couleur: 'neutral' }
@@ -66,7 +62,6 @@ describe('liste des demarches', () => {
     store.commit('titresDemarches/metasSet', {
       demarchesTypes,
       demarchesStatuts,
-      domaines,
       statuts,
       types,
       etapesTypes,
@@ -76,7 +71,6 @@ describe('liste des demarches', () => {
     expect(store.state.titresDemarches.metas).toEqual({
       types: demarchesTypes,
       statuts: demarchesStatuts,
-      titresDomaines: domaines,
       titresTypes: types,
       titresStatuts: statuts,
       etapesTypes
@@ -91,7 +85,7 @@ describe('liste des demarches', () => {
       },
       { values: ['dpu'], id: 'etapesInclues', type: 'objects' },
       { values: ['dpu'], id: 'etapesExclues', type: 'objects' },
-      { values: ['m', 'w'], id: 'titresDomainesIds', type: 'strings' },
+      { values: [], id: 'titresDomainesIds', type: 'strings' },
       { values: ['cx', 'pr'], id: 'titresTypesIds', type: 'strings' },
       { values: ['val', 'ech'], id: 'titresStatutsIds', type: 'strings' }
     ])
diff --git a/packages/ui/src/store/titres.js b/packages/ui/src/store/titres.js
index cc99da11b..dd3e5a542 100644
--- a/packages/ui/src/store/titres.js
+++ b/packages/ui/src/store/titres.js
@@ -9,16 +9,14 @@ const getDefaultState = () => {
     total: 0,
     vueId: 'carte',
     metas: {
-      domaines: [],
       types: [],
-      statuts: [],
-      substancesLegales: []
+      statuts: []
     },
     definitions: [
       { id: 'typesIds', type: 'strings', values: [] },
       { id: 'domainesIds', type: 'strings', values: [] },
       { id: 'statutsIds', type: 'strings', values: [] },
-      { id: 'substancesLegalesIds', type: 'strings', values: [] },
+      { id: 'substancesIds', type: 'strings', values: [] },
       { id: 'titresIds', type: 'strings', values: [] },
       { id: 'entreprisesIds', type: 'strings', values: [] },
       { id: 'references', type: 'string' },
@@ -58,7 +56,7 @@ const getDefaultState = () => {
         typesIds: [],
         domainesIds: [],
         statutsIds: [],
-        substancesLegalesIds: [],
+        substancesIds: [],
         titresIds: [],
         entreprisesIds: '',
         references: '',
@@ -272,12 +270,8 @@ const mutations = Object.assign(
         let paramId
         if (id === 'types') {
           paramId = 'typesIds'
-        } else if (id === 'domaines') {
-          paramId = 'domainesIds'
         } else if (id === 'statuts') {
           paramId = 'statutsIds'
-        } else if (id === 'substancesLegales') {
-          paramId = 'substancesLegalesIds'
         } else if (id === 'entreprises') {
           paramId = 'entreprisesIds'
           data[id] = data[id].elements
diff --git a/packages/ui/src/store/titres.test.js b/packages/ui/src/store/titres.test.js
index ee66236c5..0adb19f0c 100644
--- a/packages/ui/src/store/titres.test.js
+++ b/packages/ui/src/store/titres.test.js
@@ -29,7 +29,6 @@ describe('liste des titres', () => {
       total: 0,
       vueId: 'carte',
       metas: {
-        domaines: [],
         types: [],
         statuts: []
       },
@@ -112,10 +111,6 @@ describe('liste des titres', () => {
 
   test('initialise le composant', async () => {
     const apiMetasMock = api.titresMetas.mockResolvedValue({
-      domaines: [
-        { id: 'w', nom: 'granulats' },
-        { id: 'c', nom: 'carrières' }
-      ],
       types: [
         { id: 'ifr', nom: 'Ifremer' },
         { id: 'dge', nom: 'DGEC' }
@@ -137,10 +132,6 @@ describe('liste des titres', () => {
     expect(apiMetasMock).toHaveBeenCalled()
     expect(apiMock).not.toHaveBeenCalled()
     expect(store.state.titres.metas).toEqual({
-      domaines: [
-        { id: 'w', nom: 'granulats' },
-        { id: 'c', nom: 'carrières' }
-      ],
       types: [
         { id: 'ifr', nom: 'Ifremer' },
         { id: 'dge', nom: 'DGEC' }
diff --git a/packages/ui/src/utils/titre-etape-edit.js b/packages/ui/src/utils/titre-etape-edit.js
index ce26b6bfc..36c4e0027 100644
--- a/packages/ui/src/utils/titre-etape-edit.js
+++ b/packages/ui/src/utils/titre-etape-edit.js
@@ -158,11 +158,7 @@ const etapeEditFormat = etape => {
     }
   })
 
-  if (etape.substances) {
-    etape.substances = etape.substances.map(({ id }) => ({
-      id
-    }))
-  } else {
+  if (!etape.substances) {
     etape.substances = []
   }
 
diff --git a/packages/ui/src/utils/titre-etape-edit.test.js b/packages/ui/src/utils/titre-etape-edit.test.js
index 93f97ae47..32669db8f 100644
--- a/packages/ui/src/utils/titre-etape-edit.test.js
+++ b/packages/ui/src/utils/titre-etape-edit.test.js
@@ -131,7 +131,7 @@ describe('etapeEditFormat', () => {
         ],
         contenu: { 'prop-id': 'prop-value' },
         incertitudes: { amodiataires: true },
-        substances: [{ id: 'auru' }],
+        substances: ['auru'],
         documents: [{ type: { id: 'act' } }]
       })
     ).toEqual({
@@ -169,7 +169,7 @@ describe('etapeEditFormat', () => {
           ]
         ]
       ],
-      substances: [{ id: 'auru' }],
+      substances: ['auru'],
       contenu: { 'prop-id': 'prop-value' },
       incertitudes: { amodiataires: true },
       documents: [{ fichierNouveau: null, typeId: 'act', type: { id: 'act' } }],
diff --git a/packages/ui/src/utils/titre-etape-save.js b/packages/ui/src/utils/titre-etape-save.js
index f7c1ad761..73c920165 100644
--- a/packages/ui/src/utils/titre-etape-save.js
+++ b/packages/ui/src/utils/titre-etape-save.js
@@ -230,12 +230,9 @@ const etapeSaveFormat = etape => {
 
   delete etape.demarche
 
-  const propsIds = [
-    'substances',
-    'titulaires',
-    'amodiataires',
-    'administrations'
-  ]
+  etape.substances = etape.substances.filter(substanceId => !!substanceId)
+
+  const propsIds = ['titulaires', 'amodiataires', 'administrations']
 
   // supprime les champs dont les ids sont vides
   propsIds.forEach(propId => {
@@ -244,12 +241,6 @@ const etapeSaveFormat = etape => {
     }
   })
 
-  if (etape.substances && etape.substances.length) {
-    etape.substances.forEach((substance, index) => {
-      substance.ordre = index + 1
-    })
-  }
-
   if (
     etape.geoSystemeIds &&
     etape.geoSystemeIds.length &&
diff --git a/packages/ui/src/utils/titre-etape-save.test.js b/packages/ui/src/utils/titre-etape-save.test.js
index 42aded9f9..ee3d203a0 100644
--- a/packages/ui/src/utils/titre-etape-save.test.js
+++ b/packages/ui/src/utils/titre-etape-save.test.js
@@ -153,7 +153,7 @@ describe('etapeSaveFormat', () => {
           ],
           [[]]
         ],
-        substances: [{ id: 'substance-id-1' }],
+        substances: ['substance-id-1', undefined],
         contenu: { 'prop-id': 'prop-value' },
         incertitudes: { amodiataires: true },
         documents: [{ id: 'tmp', typeId: 'tmp' }, { id: 'doc-id' }]
@@ -211,7 +211,7 @@ describe('etapeSaveFormat', () => {
         }
       ],
       statutId: 'etape-statut-id',
-      substances: [{ id: 'substance-id-1', ordre: 1 }],
+      substances: ['substance-id-1'],
       titreDemarcheId: 'demarche-id',
       titulaires: [{ id: 'titulaire-id' }],
       typeId: 'etape-type-id',
-- 
GitLab