Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileVEC.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileVEC.java	(revision 33663)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/EdigeoFileVEC.java	(revision 33664)
@@ -16,4 +16,6 @@
 import java.util.stream.Stream;
 
+import org.openstreetmap.josm.actions.CreateMultipolygonAction;
+import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -314,4 +316,8 @@
             }
         }
+
+        boolean isClosed() {
+            return nPoints >= 4 && points.get(0).equals(points.get(nPoints - 1));
+        }
     }
 
@@ -557,9 +563,11 @@
 
     private static <T extends OsmPrimitive> T addPrimitiveAndTags(DataSet ds, ObjectBlock obj, T osm) {
-        for (int i = 0; i < obj.nAttributes; i++) {
-            osm.put(obj.attributeDefs.get(i).identifier, obj.attributeValues.get(i));
-        }
-        if (osm.getDataSet() == null) {
-            ds.addPrimitive(osm);
+        if (osm != null) {
+            for (int i = 0; i < obj.nAttributes; i++) {
+                osm.put(obj.attributeDefs.get(i).identifier, obj.attributeValues.get(i));
+            }
+            if (osm.getDataSet() == null) {
+                ds.addPrimitive(osm);
+            }
         }
         return osm;
@@ -660,17 +668,43 @@
 
     private static OsmPrimitive faceToOsmPrimitive(DataSet ds, Projection proj, FaceBlock face) {
-        List<ArcBlock> leftArcs = extract(ArcBlock.class, face.getConstructionRelations(), RelationKind.HAS_FOR_LEFT_FACE);
-        List<ArcBlock> rightArcs = extract(ArcBlock.class, face.getConstructionRelations(), RelationKind.HAS_FOR_RIGHT_FACE);
-        assert leftArcs.size() >= 1 || rightArcs.size() >= 1;
-        if ((leftArcs.size() == 1 && rightArcs.isEmpty()) || (leftArcs.isEmpty() && rightArcs.size() == 1)) {
-            Way w = new Way();
-            ArcBlock ab = (leftArcs.isEmpty() ? rightArcs : leftArcs).get(0);
-            for (EastNorth en : ab.points) {
-                w.addNode(getNodeAt(ds, proj, en));
-            }
-            return w;
+        List<ArcBlock> allArcs = new ArrayList<>();
+        allArcs.addAll(extract(ArcBlock.class, face.getConstructionRelations(), RelationKind.HAS_FOR_LEFT_FACE));
+        allArcs.addAll(extract(ArcBlock.class, face.getConstructionRelations(), RelationKind.HAS_FOR_RIGHT_FACE));
+        assert allArcs.size() >= 1;
+        if (allArcs.size() == 1) {
+            ArcBlock ab = allArcs.get(0);
+            assert ab.isClosed();
+            return arcToWay(ds, proj, ab);
         } else {
-            // TODO
-            return new Way();
+            List<Way> ways = allArcs.stream().map(ab -> arcToWay(ds, proj, ab)).filter(w -> w != null).collect(Collectors.toList());
+            Pair<SequenceCommand, Relation> cmd = CreateMultipolygonAction.createMultipolygonCommand(ways, null);
+            if (cmd != null) {
+                cmd.a.executeCommand();
+                return cmd.b;
+            } else {
+                ways.forEach(w -> ds.removePrimitive(w.getPrimitiveId()));
+                return null;
+            }
+        }
+    }
+
+    private static Way arcToWay(DataSet ds, Projection proj, ArcBlock ab) {
+        Way way = new Way();
+        for (int i = 0; i < ab.nPoints; i++) {
+            Node n = getNodeAt(ds, proj, ab.points.get(i));
+            if (i == 0 || !n.equals(way.lastNode())) {
+                way.addNode(n);
+            }
+        }
+        if (way.getNodesCount() < 2) {
+            return null;
+        }
+        List<Way> existingWays = ds.searchWays(way.getBBox()).stream().filter(
+                w -> w.hasEqualSemanticAttributes(way)).collect(Collectors.toList());
+        if (existingWays.isEmpty()) {
+            ds.addPrimitive(way);
+            return way;
+        } else {
+            return existingWays.get(0);
         }
     }
Index: /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/pci/EdigeoPciReader.java
===================================================================
--- /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/pci/EdigeoPciReader.java	(revision 33663)
+++ /applications/editors/josm/plugins/cadastre-fr/src/org/openstreetmap/josm/plugins/fr/cadastre/edigeo/pci/EdigeoPciReader.java	(revision 33664)
@@ -60,5 +60,5 @@
                 p.remove(t);
             }
-            p.put("name", sb.toString().replaceAll("   ", " ").replaceAll("  ", " "));
+            p.put("name", sb.toString().replaceAll("    ", " ").replaceAll("   ", " ").replaceAll("  ", " "));
         }, "TEX_id");
 
