diff --git a/src/app/calculators/verificateur/config.json b/src/app/calculators/verificateur/config.json
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..18c5d0c81b43338138856c455c2c452b43b192c9 100644
--- a/src/app/calculators/verificateur/config.json
+++ b/src/app/calculators/verificateur/config.json
@@ -0,0 +1,39 @@
+[
+    {
+        "id": "fs_pass",
+        "type": "fieldset",
+        "fields": [
+            {
+                "id": "select_target_pass",
+                "type": "select_reference",
+                "reference": "nub",
+                "source": "verificateur_target"
+            },
+            {
+                "type": "select",
+                "id": "select_pab_jet_type",
+                "property": "pabJetType",
+                "default": "SURFACE"
+            }
+        ]
+    },
+    {
+        "id": "fs_species",
+        "type": "fieldset",
+        "fields": [
+            {
+                "type": "select",
+                "id": "select_species_list",
+                "property": "speciesList",
+                "default": "SPECIES_1"
+            }
+        ]
+    },
+    {
+        "type": "options",
+        "selectIds": [ "select_pab_jet_type" ],
+        "targetPassSelectId": "select_target_pass",
+        "speciesListSelectId": "select_species_list",
+        "help": "verification/verificateur.html"
+    }
+]
diff --git a/src/app/calculators/verificateur/en.json b/src/app/calculators/verificateur/en.json
new file mode 100644
index 0000000000000000000000000000000000000000..eb48e983534bc5a83f22f944946958989c632053
--- /dev/null
+++ b/src/app/calculators/verificateur/en.json
@@ -0,0 +1,13 @@
+{
+    "fs_pass": "Fish pass parameters",
+
+    "select_target_pass": "Fish pass to verify",
+
+    "select_pab_jet_type": "Jet type (PAB)",
+    "select_pab_jet_type_0": "Diving",
+    "select_pab_jet_type_1": "Surface",
+
+    "fs_species": "Species parameters",
+
+    "select_species_list": "Species groups"
+}
diff --git a/src/app/calculators/verificateur/fr.json b/src/app/calculators/verificateur/fr.json
new file mode 100644
index 0000000000000000000000000000000000000000..13b6430de34ec99f1e365468b50041044f551c11
--- /dev/null
+++ b/src/app/calculators/verificateur/fr.json
@@ -0,0 +1,13 @@
+{
+    "fs_pass": "Paramètres de la passe",
+
+    "select_target_pass": "Passe à vérifier",
+
+    "select_pab_jet_type": "Type de jet (PAB)",
+    "select_pab_jet_type_0": "Plongeant",
+    "select_pab_jet_type_1": "Surface",
+
+    "fs_species": "Paramètres des espèces",
+
+    "select_species_list": "Groupes d'espèces"
+}
diff --git a/src/app/formulaire/definition/form-verificateur.ts b/src/app/formulaire/definition/form-verificateur.ts
new file mode 100644
index 0000000000000000000000000000000000000000..50560319a8a37fff9cb39fc273ddb48134035a81
--- /dev/null
+++ b/src/app/formulaire/definition/form-verificateur.ts
@@ -0,0 +1,91 @@
+import { IObservable, Nub } from "jalhyd";
+
+import { SelectFieldNub } from "../elements/select-field-nub";
+import { FormulaireFixedVar } from "./form-fixedvar";
+
+/**
+ * Formulaire pour les Vérificateurs
+ */
+export class FormulaireVerificateur extends FormulaireFixedVar {
+
+    /** id of select configuring target pass Nub */
+    private _targetPassSelectId: string;
+
+    /** id of select configuring list of species */
+    private _speciesListSelectId: string;
+
+    protected parseOptions(json: {}) {
+        super.parseOptions(json);
+        this._targetPassSelectId = this.getOption(json, "targetPassSelectI");
+        this._speciesListSelectId = this.getOption(json, "speciesListSelectId");
+    }
+
+    protected completeParse(json: {}, firstNotif: boolean = true) {
+        super.completeParse(json);
+        if (this._targetPassSelectId) {
+            const sel = this.getFormulaireNodeById(this._targetPassSelectId);
+            if (sel) {
+                sel.addObserver(this);
+                if (firstNotif) {
+                    // force 1st observation
+                    (sel as SelectFieldNub).notifySelectValueChanged();
+                }
+            }
+        }
+        if (this._speciesListSelectId) {
+            const sel = this.getFormulaireNodeById(this._speciesListSelectId);
+            /* if (sel) {
+                sel.addObserver(this);
+                if (firstNotif) {
+                    // force 1st observation
+                    (sel as SelectFieldNub).notifySelectValueChanged();
+                }
+            } */
+        }
+
+    }
+
+    // interface Observer
+
+    public update(sender: IObservable, data: any) {
+        // copied from FormDefinition, to avoid calling super.update()
+        if (sender instanceof Nub) {
+            switch (data.action) {
+                case "resultUpdated":
+                    // forward Nub results update notification to FormCompute objects
+                    this.reaffectResultComponents();
+                    break;
+            }
+        }
+        // copied from FormFixedVar, to avoid calling super.update()
+        if (data.action === "propertyChange") {
+            this.reset();
+        }
+
+        if (sender instanceof SelectFieldNub) {
+            if (data.action === "select") {
+                // update Verificateur property: Pass to check
+                this._currentNub.properties.setPropValue("nubToVerify", data.value.value);
+                // @TODO refresh jet type selector
+            }
+        }/*  else if (sender instanceof SelectField) {
+            if (sender.id === "select_target_result") {
+                // refresh parameters selector
+                this.refreshParameterEntries();
+            }
+        } */
+    }
+
+    /**
+     * Re-populate searched parameter selector with fresh entries
+     */
+    /* private refreshParameterEntries() {
+        const pSel = this.getFormulaireNodeById(this._speciesListSelectId) as SelectFieldParameter;
+        if (pSel) {
+            pSel.updateEntries();
+            // reflect changes in GUI
+            const inputYtarget = this.getFormulaireNodeById("Ytarget") as NgParameter;
+            inputYtarget.notifyValueModified(this);
+        }
+    } */
+}
diff --git a/src/app/formulaire/elements/select-field-nub.ts b/src/app/formulaire/elements/select-field-nub.ts
index 3cbcf0720c2fc42257292ebaf60c89cb202cdd88..c4c2d18baeceb5bd79bbceb06c2bfddc04c665d9 100644
--- a/src/app/formulaire/elements/select-field-nub.ts
+++ b/src/app/formulaire/elements/select-field-nub.ts
@@ -3,7 +3,7 @@ import { SelectEntry } from "./select-entry";
 import { ServiceFactory } from "../../services/service-factory";
 import { decodeHtml } from "../../util";
 
-import { Session, Solveur } from "jalhyd";
+import { Session, Solveur, FishPass, CalculatorType } from "jalhyd";
 
 /**
  * A select field that populates itself with references to Nubs
@@ -24,11 +24,12 @@ export class SelectFieldNub extends SelectFieldReference {
      * Populates entries with available references
      */
     protected populate() {
+        const fs = ServiceFactory.instance.formulaireService;
+        let candidateNubs: any[];
         switch (this._source) {
             case "solveur_target": // Solveur, module cible (à calculer)
                 // find all Nubs having at least one link to another Nub's result
-                const fs = ServiceFactory.instance.formulaireService;
-                const candidateNubs =
+                candidateNubs =
                     Session.getInstance().getDownstreamNubs().concat(
                         Session.getInstance().getUpstreamNubsHavingExtraResults()
                     ).filter(
@@ -50,6 +51,25 @@ export class SelectFieldNub extends SelectFieldReference {
                     }
                 }
                 break;
+
+            case "verificateur_target": // Vérificateur, passe cible (à vérifier)
+                // find all Nubs of type FishPass
+                candidateNubs = Session.getInstance().getAllNubs().filter((element, index, self) => {
+                    return (
+                        (element instanceof FishPass)
+                        && element.calcType !== CalculatorType.Par // ParSimulation extends Par @TODO find something better
+                    );
+                });
+                for (const cn of candidateNubs) {
+                    const nub = fs.getFormulaireFromId(cn.uid);
+                    if (nub) {
+                        const label = nub.calculatorName + " (" + fs.getLocalisedTitleFromCalculatorType(nub.calculatorType) + ")";
+                        this.addEntry(new SelectEntry(this._entriesBaseId + cn.uid, cn.uid, decodeHtml(label)));
+                    } else {
+                        // silent fail, this Verificateur nub was probably loaded before all the candidate nubs are done loading
+                    }
+                }
+                break;
         }
     }
 
diff --git a/src/app/services/formulaire.service.ts b/src/app/services/formulaire.service.ts
index 101572ca12f6d88a4cc3658d284cf375357e3f4b..6be778881a247358d41619eb3170b15649c21f5d 100644
--- a/src/app/services/formulaire.service.ts
+++ b/src/app/services/formulaire.service.ts
@@ -40,6 +40,7 @@ import { AppComponent } from "../app.component";
 import { FormulaireSPP } from "../formulaire/definition/form-spp";
 import { FormulaireFixedVar } from "../formulaire/definition/form-fixedvar";
 import { FormulaireSection } from "../formulaire/definition/form-section";
+import { FormulaireVerificateur } from '../formulaire/definition/form-verificateur';
 
 @Injectable()
 export class FormulaireService extends Observable {
@@ -307,6 +308,10 @@ export class FormulaireService extends Observable {
                 f = new FormulaireSPP();
                 break;
 
+            case CalculatorType.Verificateur:
+                f = new FormulaireVerificateur();
+                break;
+
             default:
                 f = new FormulaireFixedVar();
         }
diff --git a/src/locale/messages.en.json b/src/locale/messages.en.json
index fe1494fd0242d3a6eaa1f5574616e2bb2f78a297..35ed945ba89fca8459159634fad064055979be55 100644
--- a/src/locale/messages.en.json
+++ b/src/locale/messages.en.json
@@ -144,9 +144,9 @@
     "INFO_ENUM_STRUCTUREFLOWREGIME_1": "Partially submerged",
     "INFO_ENUM_STRUCTUREFLOWREGIME_2": "Submerged",
     "INFO_ENUM_STRUCTUREFLOWREGIME_3": "Zero flow",
-    "INFO_ENUM_STRUCTUREJETTYPE_0": "Not applicable",
-    "INFO_ENUM_STRUCTUREJETTYPE_1": "Diving",
-    "INFO_ENUM_STRUCTUREJETTYPE_2": "Surface",
+    "INFO_ENUM_STRUCTUREJETTYPE_0": "Diving",
+    "INFO_ENUM_STRUCTUREJETTYPE_1": "Surface",
+    "INFO_ENUM_STRUCTUREJETTYPE_2": "Not applicable",
     "INFO_CHART_BUTTON_TITLE_RESET_ZOOM": "Restore default zoom",
     "INFO_CHART_BUTTON_TITLE_EXPORT_IMAGE": "Save picture",
     "INFO_CHART_BUTTON_TITLE_ENTER_FS": "Display fullscreen",
diff --git a/src/locale/messages.fr.json b/src/locale/messages.fr.json
index 77aeae0e9ccc99b0cc49bfb80cf1e08de9417e71..260890161e36c6217128d2a3c0e4c09530eaf2ac 100644
--- a/src/locale/messages.fr.json
+++ b/src/locale/messages.fr.json
@@ -144,9 +144,9 @@
     "INFO_ENUM_STRUCTUREFLOWREGIME_1": "Partiellement noyé",
     "INFO_ENUM_STRUCTUREFLOWREGIME_2": "Noyé",
     "INFO_ENUM_STRUCTUREFLOWREGIME_3": "Débit nul",
-    "INFO_ENUM_STRUCTUREJETTYPE_0": "Sans objet",
-    "INFO_ENUM_STRUCTUREJETTYPE_1": "Plongeant",
-    "INFO_ENUM_STRUCTUREJETTYPE_2": "De surface",
+    "INFO_ENUM_STRUCTUREJETTYPE_0": "Plongeant",
+    "INFO_ENUM_STRUCTUREJETTYPE_1": "De surface",
+    "INFO_ENUM_STRUCTUREJETTYPE_2": "Sans objet",
     "INFO_CHART_BUTTON_TITLE_RESET_ZOOM": "Réinitialiser le zoom",
     "INFO_CHART_BUTTON_TITLE_EXPORT_IMAGE": "Enregistrer l'image",
     "INFO_CHART_BUTTON_TITLE_ENTER_FS": "Afficher en plein écran",