diff --git a/vasl_templates/webapp/data/ordnance/french.json b/vasl_templates/webapp/data/ordnance/french.json
new file mode 100644
index 0000000..0f608ca
--- /dev/null
+++ b/vasl_templates/webapp/data/ordnance/french.json
@@ -0,0 +1,113 @@
+[
+
+{ "name": "LG de 50 mle 37(f)",
+ "capabilities_other": [ "2PP", "crewed\u2020" ],
+ "note_number": "1",
+ "notes": [ "A", "B", "C\u2020", "E" ]
+},
+{ "name": "Mortier de 60 mle 35",
+ "capabilities": [ "5PP", "no OBA\u2020" ],
+ "capabilities2": { "IR": [ [null,"2+"], "\u2020" ] },
+ "note_number": "2\u2020",
+ "notes": [ "A", "B", "V" ]
+},
+{ "name": "Mortier de 81 mle 27/31",
+ "capabilities": [ "NT", "QSU" ],
+ "capabilities2": { "s": 8 },
+ "note_number": "3\u2020",
+ "notes": [ "A", "B", "D", "V" ]
+},
+{ "name": "Fusil Antichar Boys",
+ "capabilities_other": [ "1PP" ],
+ "note_number": "4\u2020",
+ "notes": [ "B" ]
+},
+{ "name": "Canon AC de 25 SA-L mle 34",
+ "capabilities": [ "NT", "QSU" ],
+ "note_number": "5\u2020",
+ "notes": [ "B", "P" ]
+},
+{ "name": "Canon AC de 47 SA mle 37 APX",
+ "capabilities": [ "NT", "QSU", "APCR only\u20201" ],
+ "note_number": "6\u20201",
+ "notes": [ "B", "G\u2020", "P", "V" ]
+},
+{ "name": "Canon de 75 AC mle 97/35",
+ "capabilities": [ "h-d" ],
+ "capabilities2": { "LF": [ "NT" ], "HE": 7, "s": 6 },
+ "capabilities_other": [ "ST", "no shield" ],
+ "note_number": "7",
+ "notes": [ "E" ]
+},
+{ "name": "Canon de 37 mle 16 TR",
+ "capabilities_other": [ "5PP (3PP dm)", "crewed\u2020" ],
+ "note_number": "8\u20201",
+ "notes": [ "A", "C\u2020" ]
+},
+{ "name": "Canon de 65 M mle 06",
+ "capabilities": [ "NT", "QSU", "no Gunshield", "h-d" ],
+ "note_number": "9\u2020",
+ "notes": [ "A", "P" ]
+},
+{ "name": "Canon de 75 M mle 28",
+ "capabilities": [ "NT", "QSU", "h-d" ],
+ "capabilities2": { "s": 6, "AP": 5 },
+ "note_number": "10\u2020",
+ "notes": [ "A", "P" ]
+},
+{ "name": "Canon de 75 mle 1897",
+ "capabilities": [ "NT", "QSU" ],
+ "capabilities2": { "s": 8 },
+ "note_number": "11\u2020",
+ "notes": [ "B", "P" ]
+},
+{ "name": "Canon de 105 M mle 28",
+ "capabilities": [ "NT", "h-d" ],
+ "note_number": "12\u2020",
+ "notes": [ "A", "P" ]
+},
+{ "name": "Canon de 105 C mle 35 B",
+ "capabilities": [ "NT" ],
+ "note_number": "13",
+ "notes": [ "E", "F\u2020" ]
+},
+{ "name": "Canon de 105 L mle 13 S",
+ "capabilities": [ "NT" ],
+ "note_number": "14\u2020",
+ "notes": [ "P" ]
+},
+{ "name": "Canon de 105 L mle 36 S",
+ "capabilities": [ "NT" ],
+ "note_number": "15",
+ "notes": [ "E", "F\u2020" ]
+},
+{ "name": "Canon de 155 C mle 17 S",
+ "capabilities": [ "NT" ],
+ "capabilities2": { "s": 8 },
+ "note_number": "16\u2020"
+},
+{ "name": "Canon de 155 GPF",
+ "capabilities": [ "NT", "RFNM", "no IF" ],
+ "note_number": "17\u2020"
+},
+{ "name": "Mitr. de 13.2 CAJ mle 30",
+ "capabilities": [ "T", "2 TK DR\u20201", "Towing NA\u20201" ],
+ "note_number": "18\u20201",
+ "notes": [ "B", "G\u2020", "V" ]
+},
+{ "name": "Mitr. de 20 CA mle 39 O",
+ "capabilities": [ "T" ],
+ "capabilities2": { "LF": [ "NT", "20\u2020", "2 ROF", "B11" ] },
+ "note_number": "19\u2020"
+},
+{ "name": "Canon Auto. de 25 CA mle 38",
+ "capabilities": [ "T" ],
+ "note_number": "20\u20201",
+ "notes": [ "G\u2020" ]
+},
+{ "name": "Canon de 75 CA mle 32",
+ "capabilities": [ "T", "NM" ],
+ "note_number": "21\u2020"
+}
+
+]
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/french/1940.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/french/1940.txt
new file mode 100644
index 0000000..b9f1526
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/french/1940.txt
@@ -0,0 +1,25 @@
+=== ordnance/french/1940 ===
+
+Name Capabilities (effective) # Notes
+---------------------------- ------------------------------- ------------------------------- ------ --------
+LG de 50 mle 37(f) 2PP crewed† 2PP crewed† 1 A B C† E
+Mortier de 60 mle 35 5PP no OBA† IR[2+]† 5PP no OBA† 2† A B V
+Mortier de 81 mle 27/31 NT QSU s8 NT QSU s8 3† A B D V
+Fusil Antichar Boys 1PP 1PP 4† B
+Canon AC de 25 SA-L mle 34 NT QSU NT QSU 5† B P
+Canon AC de 47 SA mle 37 APX NT QSU APCR only†[1] NT QSU APCR only†[1] 6†[1] B G† P V
+Canon de 75 AC mle 97/35 h-d HE7 LF [NT] s6 ST no shield h-d HE7 LF [NT] s6 ST no shield 7 E
+Canon de 37 mle 16 TR 5PP (3PP dm) crewed† 5PP (3PP dm) crewed† 8†[1] A C†
+Canon de 65 M mle 06 NT QSU no Gunshield h-d NT QSU no Gunshield h-d 9† A P
+Canon de 75 M mle 28 NT QSU h-d AP5 s6 NT QSU h-d AP5 s6 10† A P
+Canon de 75 mle 1897 NT QSU s8 NT QSU s8 11† B P
+Canon de 105 M mle 28 NT h-d NT h-d 12† A P
+Canon de 105 C mle 35 B NT NT 13 E F†
+Canon de 105 L mle 13 S NT NT 14† P
+Canon de 105 L mle 36 S NT NT 15 E F†
+Canon de 155 C mle 17 S NT s8 NT s8 16† n/a
+Canon de 155 GPF NT RFNM no IF NT RFNM no IF 17† n/a
+Mitr. de 13.2 CAJ mle 30 T 2 TK DR†[1] Towing NA†[1] T 2 TK DR†[1] Towing NA†[1] 18†[1] B G† V
+Mitr. de 20 CA mle 39 O T LF [NT, 20†, 2 ROF, B11] T LF [NT, 20†, 2 ROF, B11] 19† n/a
+Canon Auto. de 25 CA mle 38 T T 20†[1] G†
+Canon de 75 CA mle 32 T NM T NM 21† n/a
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/french/1941.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/french/1941.txt
new file mode 100644
index 0000000..3f0861c
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/french/1941.txt
@@ -0,0 +1,25 @@
+=== ordnance/french/1941 ===
+
+Name Capabilities (effective) # Notes
+---------------------------- ------------------------------- ------------------------------- ------ --------
+LG de 50 mle 37(f) 2PP crewed† 2PP crewed† 1 A B C† E
+Mortier de 60 mle 35 5PP no OBA† IR[2+]† 5PP no OBA† 2† A B V
+Mortier de 81 mle 27/31 NT QSU s8 NT QSU s8 3† A B D V
+Fusil Antichar Boys 1PP 1PP 4† B
+Canon AC de 25 SA-L mle 34 NT QSU NT QSU 5† B P
+Canon AC de 47 SA mle 37 APX NT QSU APCR only†[1] NT QSU APCR only†[1] 6†[1] B G† P V
+Canon de 75 AC mle 97/35 h-d HE7 LF [NT] s6 ST no shield h-d HE7 LF [NT] s6 ST no shield 7 E
+Canon de 37 mle 16 TR 5PP (3PP dm) crewed† 5PP (3PP dm) crewed† 8†[1] A C†
+Canon de 65 M mle 06 NT QSU no Gunshield h-d NT QSU no Gunshield h-d 9† A P
+Canon de 75 M mle 28 NT QSU h-d AP5 s6 NT QSU h-d AP5 s6 10† A P
+Canon de 75 mle 1897 NT QSU s8 NT QSU s8 11† B P
+Canon de 105 M mle 28 NT h-d NT h-d 12† A P
+Canon de 105 C mle 35 B NT NT 13 E F†
+Canon de 105 L mle 13 S NT NT 14† P
+Canon de 105 L mle 36 S NT NT 15 E F†
+Canon de 155 C mle 17 S NT s8 NT s8 16† n/a
+Canon de 155 GPF NT RFNM no IF NT RFNM no IF 17† n/a
+Mitr. de 13.2 CAJ mle 30 T 2 TK DR†[1] Towing NA†[1] T 2 TK DR†[1] Towing NA†[1] 18†[1] B G† V
+Mitr. de 20 CA mle 39 O T LF [NT, 20†, 2 ROF, B11] T LF [NT, 20†, 2 ROF, B11] 19† n/a
+Canon Auto. de 25 CA mle 38 T T 20†[1] G†
+Canon de 75 CA mle 32 T NM T NM 21† n/a
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/french/1942.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/french/1942.txt
new file mode 100644
index 0000000..1bebb30
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/french/1942.txt
@@ -0,0 +1,25 @@
+=== ordnance/french/1942 ===
+
+Name Capabilities (effective) # Notes
+---------------------------- ------------------------------- ------------------------------- ------ --------
+LG de 50 mle 37(f) 2PP crewed† 2PP crewed† 1 A B C† E
+Mortier de 60 mle 35 5PP no OBA† IR[2+]† 5PP no OBA† IR† 2† A B V
+Mortier de 81 mle 27/31 NT QSU s8 NT QSU s8 3† A B D V
+Fusil Antichar Boys 1PP 1PP 4† B
+Canon AC de 25 SA-L mle 34 NT QSU NT QSU 5† B P
+Canon AC de 47 SA mle 37 APX NT QSU APCR only†[1] NT QSU APCR only†[1] 6†[1] B G† P V
+Canon de 75 AC mle 97/35 h-d HE7 LF [NT] s6 ST no shield h-d HE7 LF [NT] s6 ST no shield 7 E
+Canon de 37 mle 16 TR 5PP (3PP dm) crewed† 5PP (3PP dm) crewed† 8†[1] A C†
+Canon de 65 M mle 06 NT QSU no Gunshield h-d NT QSU no Gunshield h-d 9† A P
+Canon de 75 M mle 28 NT QSU h-d AP5 s6 NT QSU h-d AP5 s6 10† A P
+Canon de 75 mle 1897 NT QSU s8 NT QSU s8 11† B P
+Canon de 105 M mle 28 NT h-d NT h-d 12† A P
+Canon de 105 C mle 35 B NT NT 13 E F†
+Canon de 105 L mle 13 S NT NT 14† P
+Canon de 105 L mle 36 S NT NT 15 E F†
+Canon de 155 C mle 17 S NT s8 NT s8 16† n/a
+Canon de 155 GPF NT RFNM no IF NT RFNM no IF 17† n/a
+Mitr. de 13.2 CAJ mle 30 T 2 TK DR†[1] Towing NA†[1] T 2 TK DR†[1] Towing NA†[1] 18†[1] B G† V
+Mitr. de 20 CA mle 39 O T LF [NT, 20†, 2 ROF, B11] T LF [NT, 20†, 2 ROF, B11] 19† n/a
+Canon Auto. de 25 CA mle 38 T T 20†[1] G†
+Canon de 75 CA mle 32 T NM T NM 21† n/a
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/french/1943.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/french/1943.txt
new file mode 100644
index 0000000..8660441
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/french/1943.txt
@@ -0,0 +1,25 @@
+=== ordnance/french/1943 ===
+
+Name Capabilities (effective) # Notes
+---------------------------- ------------------------------- ------------------------------- ------ --------
+LG de 50 mle 37(f) 2PP crewed† 2PP crewed† 1 A B C† E
+Mortier de 60 mle 35 5PP no OBA† IR[2+]† 5PP no OBA† IR† 2† A B V
+Mortier de 81 mle 27/31 NT QSU s8 NT QSU s8 3† A B D V
+Fusil Antichar Boys 1PP 1PP 4† B
+Canon AC de 25 SA-L mle 34 NT QSU NT QSU 5† B P
+Canon AC de 47 SA mle 37 APX NT QSU APCR only†[1] NT QSU APCR only†[1] 6†[1] B G† P V
+Canon de 75 AC mle 97/35 h-d HE7 LF [NT] s6 ST no shield h-d HE7 LF [NT] s6 ST no shield 7 E
+Canon de 37 mle 16 TR 5PP (3PP dm) crewed† 5PP (3PP dm) crewed† 8†[1] A C†
+Canon de 65 M mle 06 NT QSU no Gunshield h-d NT QSU no Gunshield h-d 9† A P
+Canon de 75 M mle 28 NT QSU h-d AP5 s6 NT QSU h-d AP5 s6 10† A P
+Canon de 75 mle 1897 NT QSU s8 NT QSU s8 11† B P
+Canon de 105 M mle 28 NT h-d NT h-d 12† A P
+Canon de 105 C mle 35 B NT NT 13 E F†
+Canon de 105 L mle 13 S NT NT 14† P
+Canon de 105 L mle 36 S NT NT 15 E F†
+Canon de 155 C mle 17 S NT s8 NT s8 16† n/a
+Canon de 155 GPF NT RFNM no IF NT RFNM no IF 17† n/a
+Mitr. de 13.2 CAJ mle 30 T 2 TK DR†[1] Towing NA†[1] T 2 TK DR†[1] Towing NA†[1] 18†[1] B G† V
+Mitr. de 20 CA mle 39 O T LF [NT, 20†, 2 ROF, B11] T LF [NT, 20†, 2 ROF, B11] 19† n/a
+Canon Auto. de 25 CA mle 38 T T 20†[1] G†
+Canon de 75 CA mle 32 T NM T NM 21† n/a
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/french/1944.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/french/1944.txt
new file mode 100644
index 0000000..7053dfa
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/french/1944.txt
@@ -0,0 +1,25 @@
+=== ordnance/french/1944 ===
+
+Name Capabilities (effective) # Notes
+---------------------------- ------------------------------- ------------------------------- ------ --------
+LG de 50 mle 37(f) 2PP crewed† 2PP crewed† 1 A B C† E
+Mortier de 60 mle 35 5PP no OBA† IR[2+]† 5PP no OBA† IR† 2† A B V
+Mortier de 81 mle 27/31 NT QSU s8 NT QSU s8 3† A B D V
+Fusil Antichar Boys 1PP 1PP 4† B
+Canon AC de 25 SA-L mle 34 NT QSU NT QSU 5† B P
+Canon AC de 47 SA mle 37 APX NT QSU APCR only†[1] NT QSU APCR only†[1] 6†[1] B G† P V
+Canon de 75 AC mle 97/35 h-d HE7 LF [NT] s6 ST no shield h-d HE7 LF [NT] s6 ST no shield 7 E
+Canon de 37 mle 16 TR 5PP (3PP dm) crewed† 5PP (3PP dm) crewed† 8†[1] A C†
+Canon de 65 M mle 06 NT QSU no Gunshield h-d NT QSU no Gunshield h-d 9† A P
+Canon de 75 M mle 28 NT QSU h-d AP5 s6 NT QSU h-d AP5 s6 10† A P
+Canon de 75 mle 1897 NT QSU s8 NT QSU s8 11† B P
+Canon de 105 M mle 28 NT h-d NT h-d 12† A P
+Canon de 105 C mle 35 B NT NT 13 E F†
+Canon de 105 L mle 13 S NT NT 14† P
+Canon de 105 L mle 36 S NT NT 15 E F†
+Canon de 155 C mle 17 S NT s8 NT s8 16† n/a
+Canon de 155 GPF NT RFNM no IF NT RFNM no IF 17† n/a
+Mitr. de 13.2 CAJ mle 30 T 2 TK DR†[1] Towing NA†[1] T 2 TK DR†[1] Towing NA†[1] 18†[1] B G† V
+Mitr. de 20 CA mle 39 O T LF [NT, 20†, 2 ROF, B11] T LF [NT, 20†, 2 ROF, B11] 19† n/a
+Canon Auto. de 25 CA mle 38 T T 20†[1] G†
+Canon de 75 CA mle 32 T NM T NM 21† n/a
diff --git a/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/french/1945.txt b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/french/1945.txt
new file mode 100644
index 0000000..3435b37
--- /dev/null
+++ b/vasl_templates/webapp/tests/fixtures/vo-reports/ordnance/french/1945.txt
@@ -0,0 +1,25 @@
+=== ordnance/french/1945 ===
+
+Name Capabilities (effective) # Notes
+---------------------------- ------------------------------- ------------------------------- ------ --------
+LG de 50 mle 37(f) 2PP crewed† 2PP crewed† 1 A B C† E
+Mortier de 60 mle 35 5PP no OBA† IR[2+]† 5PP no OBA† IR† 2† A B V
+Mortier de 81 mle 27/31 NT QSU s8 NT QSU s8 3† A B D V
+Fusil Antichar Boys 1PP 1PP 4† B
+Canon AC de 25 SA-L mle 34 NT QSU NT QSU 5† B P
+Canon AC de 47 SA mle 37 APX NT QSU APCR only†[1] NT QSU APCR only†[1] 6†[1] B G† P V
+Canon de 75 AC mle 97/35 h-d HE7 LF [NT] s6 ST no shield h-d HE7 LF [NT] s6 ST no shield 7 E
+Canon de 37 mle 16 TR 5PP (3PP dm) crewed† 5PP (3PP dm) crewed† 8†[1] A C†
+Canon de 65 M mle 06 NT QSU no Gunshield h-d NT QSU no Gunshield h-d 9† A P
+Canon de 75 M mle 28 NT QSU h-d AP5 s6 NT QSU h-d AP5 s6 10† A P
+Canon de 75 mle 1897 NT QSU s8 NT QSU s8 11† B P
+Canon de 105 M mle 28 NT h-d NT h-d 12† A P
+Canon de 105 C mle 35 B NT NT 13 E F†
+Canon de 105 L mle 13 S NT NT 14† P
+Canon de 105 L mle 36 S NT NT 15 E F†
+Canon de 155 C mle 17 S NT s8 NT s8 16† n/a
+Canon de 155 GPF NT RFNM no IF NT RFNM no IF 17† n/a
+Mitr. de 13.2 CAJ mle 30 T 2 TK DR†[1] Towing NA†[1] T 2 TK DR†[1] Towing NA†[1] 18†[1] B G† V
+Mitr. de 20 CA mle 39 O T LF [NT, 20†, 2 ROF, B11] T LF [NT, 20†, 2 ROF, B11] 19† n/a
+Canon Auto. de 25 CA mle 38 T T 20†[1] G†
+Canon de 75 CA mle 32 T NM T NM 21† n/a