diff --git a/src/app/calculators/concentration-blocs/concentration-blocs.config.json b/src/app/calculators/concentration-blocs/concentration-blocs.config.json
new file mode 100644
index 0000000000000000000000000000000000000000..c85dcc16044930a2fed6607159525c53b85ad4d1
--- /dev/null
+++ b/src/app/calculators/concentration-blocs/concentration-blocs.config.json
@@ -0,0 +1,17 @@
+[
+    {
+        "id": "fs_params",
+        "type": "fieldset",
+        "fields": [
+            "C",
+            "N",
+            "L",
+            "D"
+        ]
+    },
+    {
+        "type": "options",
+        "idCal": "C",
+        "help": "macrorugo/macrorugo.html"
+    }
+]
\ No newline at end of file
diff --git a/src/app/calculators/concentration-blocs/concentration-blocs.en.json b/src/app/calculators/concentration-blocs/concentration-blocs.en.json
new file mode 100644
index 0000000000000000000000000000000000000000..8c407122e1f1e9fa1ef79987c701b7eb3d40ba12
--- /dev/null
+++ b/src/app/calculators/concentration-blocs/concentration-blocs.en.json
@@ -0,0 +1,22 @@
+{
+    "fs_params": "Pass parameters",
+
+    "C": "Concentration",
+    "N": "Number of blocks",
+    "L": "Pass width",
+    "D": "Diameter of a block",
+
+    "ax": "Pattern width",
+    "R": "Residual width",
+    "NB": "Number of blocks, downwards harmonization",
+    "NH": "Number of blocks, upwards harmonization",
+    "AXB": "Pattern width, downwards harmonization",
+    "AXH": "Pattern width, upwards harmonization",
+    "CB": "Concentration, downwards harmonization",
+    "CH": "Concentration, upwards harmonization",
+
+    "UNIT_AX": "m",
+    "UNIT_R": "m",
+    "UNIT_AXB": "m",
+    "UNIT_AXH": "m"
+}
diff --git a/src/app/calculators/concentration-blocs/concentration-blocs.fr.json b/src/app/calculators/concentration-blocs/concentration-blocs.fr.json
new file mode 100644
index 0000000000000000000000000000000000000000..1d0a9f3a515908911bf275ae99fb5f59c308a5f5
--- /dev/null
+++ b/src/app/calculators/concentration-blocs/concentration-blocs.fr.json
@@ -0,0 +1,22 @@
+{
+    "fs_params": "Paramètres de la passe",
+
+    "C": "Concentration",
+    "N": "Nombre de blocs",
+    "L": "Largeur de la passe",
+    "D": "Diamètre d'un bloc",
+
+    "ax": "Largeur d'un motif",
+    "R": "Largeur résiduelle",
+    "NB": "Nombre de blocs, harmonisation vers le bas",
+    "NH": "Nombre de blocs, harmonisation vers le haut",
+    "AXB": "Largeur d'un motif, harmonisation vers le bas",
+    "AXH": "Largeur d'un motif, harmonisation vers le haut",
+    "CB": "Concentration, harmonisation vers le bas",
+    "CH": "Concentration, harmonisation vers le haut",
+
+    "UNIT_AX": "m",
+    "UNIT_R": "m",
+    "UNIT_AXB": "m",
+    "UNIT_AXH": "m"
+}
diff --git a/src/app/config.json b/src/app/config.json
index f9d36885cc825e0af03a659ed6445a8674c90178..ab384b6d8720bd2995da18ba3b47dee1bb93cba5 100644
--- a/src/app/config.json
+++ b/src/app/config.json
@@ -23,7 +23,7 @@
                 "path": "passe-naturelle.jpg",
                 "credits": "S. Richard / AFB"
             },
-            "calculators": [ 11, 17 ]
+            "calculators": [ 11, 17, 27 ]
         },
         {
             "name": "DEVALAISON",
diff --git a/src/app/services/formulaire.service.ts b/src/app/services/formulaire.service.ts
index e0224f8d6a24e30dbfa8b3293c5e990acfccaef4..53156bc4d44b0d9091e88ee381b0b5b526784d62 100644
--- a/src/app/services/formulaire.service.ts
+++ b/src/app/services/formulaire.service.ts
@@ -92,6 +92,7 @@ export class FormulaireService extends Observable {
         this.calculatorPaths[CalculatorType.YAXB] = "yaxb";
         this.calculatorPaths[CalculatorType.Trigo] = "trigo";
         this.calculatorPaths[CalculatorType.SPP] = "spp";
+        this.calculatorPaths[CalculatorType.ConcentrationBlocs] = "concentration-blocs";
     }
 
     private get _intlService(): I18nService {
diff --git a/src/locale/messages.en.json b/src/locale/messages.en.json
index 1e4480cb9bcfcfdd6627d84553dec448ffc6c2f2..d064a60a081ca6703fb339759073058b74c5230a 100644
--- a/src/locale/messages.en.json
+++ b/src/locale/messages.en.json
@@ -81,6 +81,8 @@
     "INFO_CLOSE_DIALOGUE_DEPENDING_MODULES": "The following modules depend on the one you are closing:",
     "INFO_CLOSE_DIALOGUE_TEXT": "Warning ! Parameters and results of this module will be lost.",
     "INFO_CLOSE_DIALOGUE_TITRE": "Closing calculation module",
+    "INFO_CONCENTRATIONBLOCS_TITRE": "Blocks concentration",
+    "INFO_CONCENTRATIONBLOCS_TITRE_COURT": "Blocks conc.",
     "INFO_CONDUITEDISTRIBUTRICE_TITRE_COURT": "Distrib.",
     "INFO_CONDUITEDISTRIBUTRICE_TITRE": "Distributor pipe",
     "INFO_COURBEREMOUS_TITRE_COURT": "Backwater",
diff --git a/src/locale/messages.fr.json b/src/locale/messages.fr.json
index 42ab64ad7ed85779a24d36242e7765b75515dbf5..6e7ba5d64a856941be452f30e1285e208ef18462 100644
--- a/src/locale/messages.fr.json
+++ b/src/locale/messages.fr.json
@@ -81,6 +81,8 @@
     "INFO_CLOSE_DIALOGUE_DEPENDING_MODULES": "Les modules suivants dépendent de celui que vous êtes en train de fermer :",
     "INFO_CLOSE_DIALOGUE_TEXT": "Attention ! Les paramètres et résultats du module de calcul seront perdus.",
     "INFO_CLOSE_DIALOGUE_TITRE": "Fermeture du module de calcul",
+    "INFO_CONCENTRATIONBLOCS_TITRE": "Concentration de blocs",
+    "INFO_CONCENTRATIONBLOCS_TITRE_COURT": "Conc. blocs",
     "INFO_CONDUITEDISTRIBUTRICE_TITRE_COURT": "Conduite distri.",
     "INFO_CONDUITEDISTRIBUTRICE_TITRE": "Conduite distributrice",
     "INFO_COURBEREMOUS_TITRE_COURT": "Remous",