diff --git a/src/app/formulaire/formulaire-definition.ts b/src/app/formulaire/formulaire-definition.ts
index 14b55b6d301226f19b2522363f0fe93dcacc08c4..8b621d1696691dff73dfa16d53e33d682f0055cb 100644
--- a/src/app/formulaire/formulaire-definition.ts
+++ b/src/app/formulaire/formulaire-definition.ts
@@ -26,118 +26,9 @@ import { SectionResults } from "../results/section-results";
 import { RemousResults } from "../results/remous-results";
 import { StringMap } from "../stringmap";
 import { Observable, Observer, IObservable } from "../services/observer";
+import { TopFormulaireElementIterator, DeepFormulaireElementIterator, TopFieldsetIterator, DeepFieldsetIterator } from "./formulaire-iterator";
 
-/** 
- * itérateur qui parcourt un arbre de FormulaireElement
- */
-class AbstractFormulaireElementIterator<T extends FormulaireElement> {
-    private _array: T[] = [];
-
-    private _index: number = 0;
-
-    constructor(fes: FormulaireElement[]) {
-        this.flatten(fes, this._array);
-    }
-
-    private flatten(input: FormulaireElement[], out: FormulaireElement[]) {
-        for (let fe of input) {
-            if (this.isIterable(fe))
-                out.push(fe);
-            if (this.isDeepIterator())
-                this.flatten(fe.kids, out);
-        }
-    }
-
-    protected isIterable(fe: FormulaireElement): boolean {
-        return true;
-    }
-
-    protected isDeepIterator(): boolean {
-        return true;
-    }
-
-    public next(): IteratorResult<T> {
-        const i = this._index;
-        if (this._index < this._array.length) {
-            this._index = i + 1;
-            return {
-                done: false,
-                value: this._array[i]
-            };
-        } else {
-            return {
-                done: true,
-                value: undefined
-            };
-        }
-    }
-}
-
-/** 
- * itérateur qui extrait les FormulaireElement de 1er niveau dans un tableau de FormulaireElement
- * (qui peut contenir des FieldsetContainer)
- */
-class TopFormulaireElementIterator extends AbstractFormulaireElementIterator<FormulaireElement> implements IterableIterator<FormulaireElement> {
-    protected isDeepIterator(): boolean {
-        return false;
-    }
-
-    // interface IterableIterator
-
-    [Symbol.iterator](): IterableIterator<FormulaireElement> {
-        return this;
-    }
-}
-
-/** 
- * itérateur qui extrait récursivement les FormulaireElement dans un tableau de FormulaireElement
- * (qui peut contenir des FieldsetContainer)
- */
-class DeepFormulaireElementIterator extends AbstractFormulaireElementIterator<FormulaireElement> implements IterableIterator<FormulaireElement> {
-    // interface IterableIterator
-
-    [Symbol.iterator](): IterableIterator<FormulaireElement> {
-        return this;
-    }
-}
-
-/** 
- * itérateur qui extrait les FieldSet de 1er niveau dans un tableau de FormulaireElement
- * (qui peut contenir des FieldsetContainer)
- */
-class TopFieldsetIterator extends AbstractFormulaireElementIterator<FieldSet> implements IterableIterator<FieldSet> {
-    protected isIterable(fe: FormulaireElement): boolean {
-        return fe instanceof FieldSet;
-    }
-
-    protected isDeepIterator(): boolean {
-        return false;
-    }
-
-    // interface IterableIterator
-
-    [Symbol.iterator](): IterableIterator<FieldSet> {
-        return this;
-    }
-}
-
-/** 
- * itérateur qui extrait récursivement les FieldSet dans un tableau de FormulaireElement
- * (qui peut contenir des FieldsetContainer)
- */
-class DeepFieldsetIterator extends AbstractFormulaireElementIterator<FieldSet> implements IterableIterator<FieldSet> {
-    protected isIterable(fe: FormulaireElement) {
-        return fe instanceof FieldSet;
-    }
-
-    // interface IterableIterator
-
-    [Symbol.iterator](): IterableIterator<FieldSet> {
-        return this;
-    }
-}
-
-export class FormulaireDefinition extends Observable implements Observer { //, Iterable<FieldSet> {
+export class FormulaireDefinition extends Observable implements Observer {
     /**
      * objet JSON chargé depuis le fichier de configuration de la calculette
      */
diff --git a/src/app/formulaire/formulaire-iterator.ts b/src/app/formulaire/formulaire-iterator.ts
new file mode 100644
index 0000000000000000000000000000000000000000..005448ed9d725f4ac3b5f7fc09a66203871a94ae
--- /dev/null
+++ b/src/app/formulaire/formulaire-iterator.ts
@@ -0,0 +1,112 @@
+import { FormulaireElement } from "./formulaire-element";
+import { FieldSet } from "./fieldset";
+
+/**
+ * itérateur qui parcourt un arbre de FormulaireElement
+ */
+class AbstractFormulaireElementIterator<T extends FormulaireElement> {
+    private _array: T[] = [];
+
+    private _index: number = 0;
+
+    constructor(fes: FormulaireElement[]) {
+        this.flatten(fes, this._array);
+    }
+
+    private flatten(input: FormulaireElement[], out: FormulaireElement[]) {
+        for (let fe of input) {
+            if (this.isIterable(fe))
+                out.push(fe);
+            if (this.isDeepIterator())
+                this.flatten(fe.kids, out);
+        }
+    }
+
+    protected isIterable(fe: FormulaireElement): boolean {
+        return true;
+    }
+
+    protected isDeepIterator(): boolean {
+        return true;
+    }
+
+    public next(): IteratorResult<T> {
+        const i = this._index;
+        if (this._index < this._array.length) {
+            this._index = i + 1;
+            return {
+                done: false,
+                value: this._array[i]
+            };
+        } else {
+            return {
+                done: true,
+                value: undefined
+            };
+        }
+    }
+}
+
+/** 
+ * itérateur qui extrait les FormulaireElement de 1er niveau dans un tableau de FormulaireElement
+ * (qui peut contenir des FieldsetContainer)
+ */
+export class TopFormulaireElementIterator extends AbstractFormulaireElementIterator<FormulaireElement> implements IterableIterator<FormulaireElement> {
+    protected isDeepIterator(): boolean {
+        return false;
+    }
+
+    // interface IterableIterator
+
+    [Symbol.iterator](): IterableIterator<FormulaireElement> {
+        return this;
+    }
+}
+
+/** 
+ * itérateur qui extrait récursivement les FormulaireElement dans un tableau de FormulaireElement
+ * (qui peut contenir des FieldsetContainer)
+ */
+export class DeepFormulaireElementIterator extends AbstractFormulaireElementIterator<FormulaireElement> implements IterableIterator<FormulaireElement> {
+    // interface IterableIterator
+
+    [Symbol.iterator](): IterableIterator<FormulaireElement> {
+        return this;
+    }
+}
+
+/** 
+ * itérateur qui extrait les FieldSet de 1er niveau dans un tableau de FormulaireElement
+ * (qui peut contenir des FieldsetContainer)
+ */
+export class TopFieldsetIterator extends AbstractFormulaireElementIterator<FieldSet> implements IterableIterator<FieldSet> {
+    protected isIterable(fe: FormulaireElement): boolean {
+        return fe instanceof FieldSet;
+    }
+
+    protected isDeepIterator(): boolean {
+        return false;
+    }
+
+    // interface IterableIterator
+
+    [Symbol.iterator](): IterableIterator<FieldSet> {
+        return this;
+    }
+}
+
+/** 
+ * itérateur qui extrait récursivement les FieldSet dans un tableau de FormulaireElement
+ * (qui peut contenir des FieldsetContainer)
+ */
+export class DeepFieldsetIterator extends AbstractFormulaireElementIterator<FieldSet> implements IterableIterator<FieldSet> {
+    protected isIterable(fe: FormulaireElement) {
+        return fe instanceof FieldSet;
+    }
+
+    // interface IterableIterator
+
+    [Symbol.iterator](): IterableIterator<FieldSet> {
+        return this;
+    }
+}